CueFrame
Server Details
Compose, edit and render video with your AI agent. Turn footage into finished edits with content-aware reframing, word-timed captions and motion graphics. Hosted MCP with OAuth sign-in; cloud processing uses credits.
- Status
- Healthy
- Uptime
- 8.9% over 61 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cueframe-ai/cueframe-mcp
- GitHub Stars
- 0
TDQS
Scored across 72 tools
The server has several clusters of overlapping tools: cancel_compose, cancel_export, cancel_job, and cancel_render all cancel async jobs with near-identical semantics; preview_clip, preview_frame, and preview_component differ subtly; list_catalog and list_render_fonts both involve fonts/components. Descriptions are extremely long and buried in implementation details, making it hard to quickly distinguish intent.
Most tool names follow a consistent snake_case verb_noun pattern (create_project, list_media, get_brief, update_component, delete_webhook). There are a few deviations like 'compose', 'consult', 'resume', 'repin_component', and 'new_composition' that are less predictable, but overall the convention is readable and consistent.
72 tools is very high for a single MCP server and forces the agent into cognitive overload. The tool surface mixes CRUD, async job management, billing, component authoring, and preview utilities, suggesting a scope that has grown too broad to be a coherent set.
The surface covers CRUD for projects, briefs, compositions, media, webhooks, critics, and components, plus async job management and billing. It is extensive, though some areas like account settings or team management are absent, and the density of overlapping cancellation/preview tools hints at incomplete consolidation rather than missing capability.
Available Tools
72 toolsapply_compositionApply CompositionAInspect
Atomically apply an array of CompositionOps to a project composition. All ops succeed or none do (transactional). Call describe_composition_ops without type for the compact operation list, then with a type for its exact JSON Schema. For negotiated component execution, read get_composition with componentExecutionVersions=["3","4"] and includeDependencies="true", then send componentExecutionVersions:[3,4] and that exact expectedBrandIdentity. A changed brand refuses the command; never refresh the witness to conceal a conflict. Explicit builtinSources selectors attach only the approved exact source pins referenced by the final composition. The additive concurrency envelope requires an endpoint confirmed to enforce guardedCompositionV1; unsupported hosted endpoints refuse it with unsupported_concurrency. Obtain dependency expectations from the observed composition; never rebuild a stale basis from current state. Pass if_match for optimistic-concurrency control (409 stale_etag on mismatch) and dry_run: true to validate the batch without persisting. Ops land on the project's ACTIVE composition unless you pass composition_id (mutually exclusive with session_id), which targets a specific one — that is how you author a second composition minted with new_composition and run an A/B. Use this to seed a composition (add media clips) or make targeted edits (set a crop intent, reorder clips, set the format). CAPTIONS FOR EDITED TIMELINES: after saving all clip edits, call again with {type:"captions.fromComposition", trackId} to build captions from every audible clip on that track, honoring trims, exclusions and placement. Clips must have duration matching playable source duration divided by playbackRate; unsupported timing fails explicitly. Re-run it after later timeline edits; captions do not update automatically. {type:"captions.fromTranscript", mediaId, window?} instead replaces all captions from one media transcript, rebased to zero; it does not follow a montage. Style with {type:"setCaptionStyle", style}; or set explicit words with {type:"setCaptions", segments, style?} (e.g. translations or your own VO timings). Brand is NOT set here — it lives on the project (create_project / update_project with brandKitId — or PATCH /projects/:id over REST). CARDS: a {kind:"card", html, tokens} clip projects each tokens KEY x to the CSS custom property --cf-x, so the html must read it as var(--cf-x) — write tokens:{"plate":"#0af"} + background:var(--cf-plate). Do NOT put dashes in the key: "--plate" becomes --cf---plate and your var(--plate) then resolves to NOTHING, which CSS silently degrades to a transparent background and black text. Responses carry warnings[] when a card reads a var nothing defines. SCENE SHOTS: for a 3D product shot — a tilted page screenshot, a lit laptop/phone showing a real screenshot, two-colour type, a colour-field backdrop, focus/grain/vignette and a camera move — use {type:"scene.add", clipId, newTrack|trackId, startTime, duration, scene, assets} and revise it with {type:"scene.update", clipId, scene?, assets?, startTime?, duration?}. You author a scene SPEC, never wrapper TSX; the server registers the component for you. There is NO built-in scene primitive in list_catalog — READ cueframe://scene-shot first for the JSON schema, the canonical V2 world-objects recipe with nested groups, slabs, pages, phones, laptops, world/screen text, admitted surfaces, camera motion, lighting, and the current resource limits.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /projects/:id/composition/apply body — a batch of CompositionOps. | |
| projectId | Yes | projectId (path). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring only the safety profile, the description carries the rest: transactionality, dry_run validation, if_match/409 stale_etag semantics, unsupported_concurrency refusal, brand-change refusal, caption regeneration requirements after timeline edits, and the warnings[] return signal. This is far richer behavioral context than the annotations provide. (Minor tension: the ops include clip.remove/removeTrack deletions while destructiveHint is false, but the edits are described as undoable, so this is not a hard contradiction.)
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the body is an unstructured wall that sprawls through captions, cards and scene shots in a single block. Substantial portions (SCENE SHOTS schema, CARDS var() mechanics, caption op variants) restate what the nested op and scene schemas already document in full, so many sentences do not earn their place at the tool-description level.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description partially compensates by disclosing return signals (warnings[], dry_run returns {valid, errors}) and the failure modes (stale_etag, unsupported_concurrency, brand refusal, caption errors). It does not describe the success response shape or the resulting etag, which a mutation of this complexity would ideally include.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds operational meaning: composition_id vs session_id mutual exclusivity and the A/B authoring workflow, if_match's OCC role, dry_run's behavior, and the concurrency envelope's endpoint requirement. These semantics go beyond field definitions, though many are also restated in the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific verb and resource ('Atomically apply an array of CompositionOps to a project composition') plus the transactional contract ('All ops succeed or none do'). It distinguishes itself from siblings by pointing at describe_composition_ops for the op list and get_composition for reading, so an agent can place it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('seed a composition' vs 'make targeted edits'), names the alternative sources (describe_composition_ops, get_composition), and states prerequisites and contingencies (componentExecutionVersions negotiation, brand refusal, guarded concurrency requiring an enforcing endpoint). Exclusions and alternatives are covered in detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_templateApply TemplateAInspect
Insert a resolved builtin component package into an existing project. Pass template as the selected builtin id and body with projectId, the resolved documentSha256, insert:{startTime,idPrefix}, parameter values and explicit media bindings. Read get_composition first and retain expectedRevision, commandId, componentExecutionVersions:[3,4] and expectedBrandIdentity as required by the contract. Insertion preserves existing timeline content and package source offsets. Select pinned samples explicitly with media:{slot:{sample:true}}, or bind real media IDs. Missing required media is refused; samples are never selected implicitly. A stale revision, pin or brand refuses; do not silently refresh the witness. For ordinary templates, this operation retains its existing apply behavior.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| template | Yes | template (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| etag | No | |
| version | No | |
| projectId | No | |
| versionId | No | |
| components | No | |
| templateId | No | |
| compositionId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already declaring the non-idempotent, non-destructive write profile, the description adds substantial context: it preserves existing timeline content and package source offsets, refuses missing required media, never selects samples implicitly, and refuses (rather than silently refreshing) on stale revision/pin/brand. These are exactly the operational behaviors an agent needs before mutating a project.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with purpose, then parameters, then refusal semantics, and most sentences carry real information. The closing line ("For ordinary templates, this operation retains its existing apply behavior") is vague filler and the prose is dense/choppy, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be explained, and the description covers prerequisites, the parameter contract, and failure modes — a lot for a complex nested tool. It still leans on undefined references ("the contract", "the witness"), leaving minor ambiguity about the revision/pin protocol.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% and the body is a deep nested object, so the description must compensate. It does: it explains that template is the selected builtin id, enumerates body fields (projectId, documentSha256, insert:{startTime,idPrefix}, values, media bindings), and clarifies the media convention media:{slot:{sample:true}} vs real media IDs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Insert a resolved builtin component package into an existing project." This is far more precise than the name alone and implicitly separates it from apply_composition and start_template. It stops short of naming a sibling explicitly, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear precondition — "Read get_composition first and retain expectedRevision, commandId, componentExecutionVersions:[3,4] and expectedBrandIdentity" — which tells the agent how to prepare the call. However, it never states when to prefer this over apply_composition/start_template or when not to use it, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_composeCancel ComposeAIdempotentInspect
Cancel an in-flight compose job (stop a runaway/mis-priced ensemble). Needs projectId + composeJobId (from compose). The director cancel is confirmed before the row flips; any linked charge is released. No-op-reject (422) if already terminal.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | projectId (path). | |
| composeJobId | Yes | composeJobId (path). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing side effects: the cancel is confirmed before the row flips, any linked charge is released, and a terminal job yields a 422 no-op-reject. The 422-on-terminal behavior sits consistently with idempotentHint=true (no state change on repeat). Auth/permission requirements and the response shape are still unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler; the action and scope come first, then prerequisites, then side effects and error semantics. Every clause carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-param mutation with no output schema, it covers prerequisites, side effects, and failure semantics adequately. It omits permission/precondition requirements and confirms only implicitly that no data is destroyed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the schema descriptions are near-empty ('projectId (path).'), so the description carries real weight by naming both required params and telling the agent that composeJobId originates from the compose tool. It adds no format or validity detail beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('Cancel an in-flight compose job') and immediately disambiguates it from the cluster of cancel_* siblings with the parenthetical use case 'stop a runaway/mis-priced ensemble'. An agent can distinguish it from cancel_job, cancel_render and cancel_export without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the trigger context ('runaway/mis-priced ensemble') and where the required ids come from ('from compose'), which is real routing guidance. It stops short of explicitly naming the alternative cancel tools for other job types, so an agent must infer that renders/exports go elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_exportCancel ExportAIdempotentInspect
Cancel an in-flight NLE export (fcpxml/premiere). Needs projectId + exportId (from the export enqueue). No-op-reject (422) if already terminal.
| Name | Required | Description | Default |
|---|---|---|---|
| exportId | Yes | exportId (path). | |
| projectId | Yes | projectId (path). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the description earns credit for adding the 422 no-op-reject on terminal exports and the source of the exportId. It could say more about what happens to partial output artifacts or whether the cancel is reversible, but the error semantics are a genuine addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses, front-loaded with the action and scope, followed by required inputs and then the failure mode. No filler, no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param mutation with no output schema but full annotations, the description covers scope, prerequisites, and the terminal-state error. Minor gaps remain around post-cancel state or partial-artifact cleanup, but nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented as path params, so the baseline is 3. The description adds only the provenance hint ('from the export enqueue'); no format or validation detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (cancel) plus a precisely bounded resource: an in-flight NLE export limited to fcpxml/premiere. The parenthetical scoping distinguishes it from the cluster of nearby cancel_* siblings (cancel_compose, cancel_render, cancel_job) well enough for an agent to pick correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives prerequisites (projectId + exportId, with exportId sourced 'from the export enqueue') and a state condition ('in-flight', 422 if already terminal), which tells the agent when the call is valid. It stops short of explicitly contrasting itself with cancel_render/cancel_compose/cancel_job, so the alternative-selection guidance is inferential rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_jobCancel JobAIdempotentInspect
Cancel a running async job (verify / preview / brand-kit-extract) returned by an enqueue call — abort a mis-priced job instead of waiting out its TTL. For box-backed jobs the warm box is reaped best-effort; cancel never meters. No-op-reject (422) if already terminal.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | jobId (path). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds meaningful behavior beyond annotations: the 422 no-op-reject on already-terminal jobs, best-effort box reaping, and 'cancel never meters' (no billing impact). This is rich context that isn't derivable from the annotations. Annotations already cover idempotency and non-destructiveness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the core action and scope. The parenthetical job-type list and the TTL/metering details are useful, though the sentence is somewhat packed. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param mutation tool with no output schema, the description covers the why, the scope, the billing behavior, and the terminal-state edge case. It omits auth/permission requirements and the response shape, but is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (jobId is documented). The description adds that the jobId is the one 'returned by an enqueue call', giving provenance, but no format details. Baseline 3 is appropriate when the schema carries the parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Cancel a running async job') and enumerates the job types it applies to (verify / preview / brand-kit-extract). It distinguishes itself from siblings like cancel_compose/cancel_render/cancel_export by targeting the generic async job returned from an enqueue call, and from wait_job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear motivating scenario ('abort a mis-priced job instead of waiting out its TTL'), which implicitly contrasts with wait_job. However it doesn't explicitly name wait_job as the alternative or state when not to cancel (e.g., terminal jobs), leaving some inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_renderCancel RenderAIdempotentInspect
Cancel an in-flight render (stop a runaway/queued job). Needs projectId + renderId (from create_render). No-op if already terminal.
| Name | Required | Description | Default |
|---|---|---|---|
| renderId | Yes | renderId (path). | |
| projectId | Yes | projectId (path). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and idempotentHint=true; the description reinforces this by stating it is a no-op on terminal renders, which is meaningful behavioral context beyond the annotation. It doesn't state permission or auth requirements, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and scope, then prerequisites, then the no-op caveat. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but for a simple 2-param cancellation the description covers the action, inputs, and terminal-state behavior, and annotations carry the safety profile. Only auth/permission context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in-schema, so the baseline is 3. The description adds only the provenance note that renderId comes from create_render, with no format or path syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Cancel' on a specific resource 'in-flight render', with a parenthetical that scopes what counts (runaway/queued job). The name 'cancel_render' is clearly distinguished from siblings like cancel_compose, cancel_export, and cancel_job by resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Needs projectId + renderId (from create_render)' tells the agent the prerequisite producer of the identifiers, and 'No-op if already terminal' tells it when the call is pointless. It does not explicitly contrast with cancel_job or retry_render, but the resource-specific naming makes the routing clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
composeComposeAInspect
Start an async Director compose job: it authors an ensemble of full composition candidates, verifies each, and saves the winner to the project. Body must set EXACTLY ONE source (mutually exclusive): briefId — author FROM a persisted Brief (the PLANNED path: create_brief first; every Brief field is honored or the compose is refused loudly naming the field); fromComposition: true — author from the project's CURRENT composition (the GENERAL path: seed it with apply_composition first — your media clips are the intent, and any graphics you authored are CARRIED VERBATIM as locked clips the Director authors around, never re-authors or drops); or suggestionId — author from an AI clip suggestion (the CLIPPING path, paired with suggest_briefs). Returns { composeJobId, status, streamUrl }. Then call wait_job(kind="compose", id=composeJobId, projectId=...) to block until the winner is selected.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /projects/:id/compose body. | |
| projectId | Yes | projectId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | queued = normal; failed = startup failed and the job is already terminal (the SSE stream will emit a single `job_failed` frame and close). |
| projectId | No | |
| streamUrl | No | Relative SSE endpoint to stream this job's events (per compose-api-contract.md). |
| composeJobId | No | Opaque compose job id; pass to the SSE stream URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false and destructiveHint=false; the description adds meaningful behavior beyond that — async job semantics, loud refusal when a Brief field cannot be honored, graphics carried verbatim rather than re-authored, and clientNonce-driven dedup. The one gap is that 'saves the winner to the project' doesn't state what happens to any existing composition, which matters for a non-readonly mutation with destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation and outcome, then the source-selection rule, then the return and the follow-up call — a sensible information order. It is long and dense, and some of the briefId parenthetical restates the schema description, but almost every clause carries a decision an agent must make.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an async, nested-body, multi-path tool this covers the source selection, the prerequisites for each path, the refusal behavior, and the required follow-up job-wait — everything an agent needs to call it correctly. The output-shape sentence is redundant given the output schema exists, but it is not a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds a constraint the schema does not encode at all: the source fields are a mutually exclusive choice where EXACTLY ONE must be set. It also labels each path's intent (PLANNED/GENERAL/CLIPPING), which is semantic value beyond the raw field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (start an async Director compose job) and immediately scopes what the job does: author candidates, verify each, save the winner. It also distinguishes the three source paths by name (briefId / fromComposition / suggestionId) so an agent can tell this apart from create_brief, suggest_briefs, apply_composition and create_render without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites per path — 'create_brief first' for the PLANNED path, 'seed it with apply_composition first' for the GENERAL path — and names the pairing tool for the CLIPPING path (suggest_briefs). It also names the immediate follow-up call, wait_job(kind="compose", id=composeJobId, projectId=...), which is exactly the routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consultConsultAInspect
Ask the Director for editing advice on the project's CURRENT composition — it NEVER writes your composition (you stay the decider). Async: returns a consultJobId; then wait_job(kind="consult", id=consultJobId, projectId=...) surfaces the advisory envelope (assessment / proposals / principles / plan). body.mode: 'advise' = the planner agent (fast, ~30s-2min) returns a plan (framing/cuts/captions/graphics intents) as GUIDANCE you re-author from — no grounded scores, nothing to adopt; 'amend' (default) = the full author→judge→refine loop (minutes) returns a graded assessment + a fix candidate you ADOPT via select_candidate with its candidateIndex. ('explore' is coming soon → use amend.) body.intent = your goal in plain English; optional body.focus (editorial|spatial|brand|caption); body.ifMatch binds to your current etag. Use advise for a fast directional nudge, amend for a grounded, adoptable fix.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /projects/:id/consult body. | |
| projectId | Yes | projectId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | queued = normal; failed = startup failed and the job is already terminal. |
| projectId | No | |
| streamUrl | No | Relative SSE endpoint to stream this job's events. |
| consultJobId | No | Opaque consult job id; poll it for the advisory result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses async job behavior (returns consultJobId, poll via wait_job), mode-dependent latency (~30s-2min vs minutes), that amend yields an adoptable candidateIndex while advise yields only guidance, and the ifMatch/409 binding rule. This is well beyond the annotations, which only flag non-read-only/non-idempotent. Minor gap: no explicit statement of whether the consult job itself mutates server state, which matters given readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core constraint, and every clause carries actionable information about modes, polling, and adoption. It is dense and long, with some redundancy against the schema's own mode description, and the 'explore' handling slightly duplicates the schema entry, but it stays on-task.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex async tool with nested body, enums, and an output schema present, the description covers the full lifecycle an agent needs: invoke, poll with the right job kind, and consume/adopt the result. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real operational meaning: amend is the default, what each mode returns and how to consume it, and that ifMatch binds proposals and must be applied before other edits or a 409 results. The focus/intent semantics largely mirror the schema, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope ('Ask the Director for editing advice on the project's CURRENT composition') and immediately bounds it ('it NEVER writes your composition'), which separates it cleanly from write siblings like apply_composition and select_candidate. An agent can tell what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit mode selection rules ('Use advise for a fast directional nudge, amend for a grounded, adoptable fix') and even handles a not-yet-shipped mode ('explore is coming soon → use amend'). It further routes the downstream step to wait_job and select_candidate, so the when/when-not is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_brand_kitCreate Brand KitAInspect
Create or UPSERT a brand kit (re-POSTing the same kitId updates it in place — this is also the brand-kit UPDATE path). Sets fonts/colors/logo. This is brand step 0 of the workflow: author the kit, then bind it to a PROJECT so colors/fonts/motion theme the output AUTOMATICALLY — pass its kitId as brandKitId to create_project, or attach it to an existing project via update_project (PATCH /projects/:id over REST). Without a bound kit, create_render produces UNBRANDED output. Tenant-scoped (no project arg).
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /brand-kits body. Org/user are server-resolved; never accepted from the body. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| logo | No | |
| name | No | |
| audio | No | |
| fonts | No | |
| intro | No | |
| outro | No | |
| colors | No | |
| motifs | No | |
| motion | No | |
| sizing | No | |
| density | No | |
| spacing | No | |
| tagline | No | |
| captions | No | |
| createdAt | No | |
| updatedAt | No | |
| watermark | No | |
| description | No | |
| extraColors | No | |
| inspiration | No | |
| styleRubric | No | |
| exemplarKeys | No | |
| contactSheetKey | No | |
| voiceGuidelines | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, openWorld=false), and the description adds real context beyond them: upsert-in-place semantics, tenant scoping with no project arg, and the downstream binding consequence. The only friction is that 're-POSTing the same kitId updates it in place' reads as idempotent behavior while idempotentHint=false suggests repeated calls may have side effects; it is a mild tension rather than a hard contradiction, and no permission/auth requirements are stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb+resource and the upsert/update duality, then the workflow and binding path, so the important routing info comes first. It is dense with parentheticals and REST asides, but nearly every clause carries actionable meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the description supplies the workflow, upsert behavior, and tenant scoping needed to select and call the tool correctly. The remaining gap is partial-update semantics (replace vs merge on re-POST) and auth expectations, which are left unstated for a large mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% on a single deeply nested body object, so the schema already carries the field semantics and the baseline is 3. The description only adds a high-level 'fonts/colors/logo' summary, and notably omits whether a re-POST replaces or merges the rest of the kit, which matters for an upsert.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('Create or UPSERT a brand kit') and immediately defines its scope ('Sets fonts/colors/logo', 'Tenant-scoped'). The parenthetical that re-POSTing the same kitId is 'also the brand-kit UPDATE path' tells an agent this single tool owns both create and update, distinguishing it from any assumed sibling updater.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit workflow position ('brand step 0'), the exact downstream alternatives for binding ('pass its kitId as brandKitId to create_project, or attach it to an existing project via update_project'), and the consequence of skipping that step ('create_render produces UNBRANDED output'). This is genuine when-and-how guidance rather than restated purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_briefCreate BriefAInspect
Persist the video's INTENT as a Brief — the Director's rich input contract (spec: the storyboard skill's output lands here). Fields: goal (required), audience, platform, format, durationSec, tone, cta, locale (output language — all on-screen copy + captions), hook, caption, beats[] (each with an editorial intent and optional MOMENT PINNING {mediaId, startSec, endSec} — honored to-the-frame or refused), mustIncludes, captions {styleId, emphasisPhrases} (the big-serif emphasis treatment), motionStyle, seededGraphics (your authored overlay/component/card clips, carried VERBATIM as locked clips — never re-authored), exclusions (hard negatives: graphic kinds the Director must NEVER author + 'no-transitions'), gates {holdAt, autoApprove}. Then compose it: compose with {briefId}. The response carries the QUOTE (compose + estimated render) — relay it to your human BEFORE composing.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| cta | No | |
| goal | No | What the video must accomplish. |
| hook | No | |
| kind | No | authored = create_brief; clip = minted by suggest_briefs from an AI clip suggestion. |
| name | No | |
| tone | No | |
| audio | No | |
| beats | No | |
| gates | No | |
| quote | No | |
| format | No | |
| locale | No | Output language (BCP-47 tag, e.g. 'es-419'): ALL on-screen copy + captions. |
| caption | No | |
| audience | No | |
| captions | No | |
| platform | No | |
| createdAt | No | |
| projectId | No | |
| updatedAt | No | |
| exclusions | No | |
| references | No | |
| durationSec | No | Target output duration. HONOR-OR-REFUSE: compose validates it against the beat-source window (±1.5s) and refuses a brief it cannot honor. |
| motionStyle | No | |
| mustIncludes | No | |
| seededGraphics | No | Client-authored graphic clips the Director must carry VERBATIM: seeded into the design loop's base composition as LOCKED clips (never re-authored, never discarded). |
| sourceSuggestionId | No | kind:'clip' provenance — the suggestion this Brief was minted from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it is a non-idempotent, non-destructive write. The description adds substantial context beyond that: honor-or-refuse semantics for moment pinning and duration, seededGraphics carried verbatim as locked clips, exclusions as hard negatives, and the default gate behavior with the 60min checkpoint timeout. It omits some details (e.g. auth/permissions) but is well above the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the compose follow-up, which is good. But the field enumeration is a dense run-on list packed into three sentences across two paragraphs, forcing the reader to parse a long comma-separated inventory. It is informative but not cleanly structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the brief (nested beats, graphics, seededGraphics, gates) and that an output schema exists (so return value detail is not needed), the description covers the essential semantics: the compose step, the quote-relay requirement, verbatim lock behavior, and gate defaults. It is largely complete, though it could spell out when to prefer update_brief over create_brief.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema itself carries very rich inline descriptions (coverage reads 0% only because top-level nesting is a single 'body'), the prose adds high-level meaning by enumerating the brief fields (goal, audience, beats[], captions, motionStyle, seededGraphics, exclusions, gates) and clarifying contested semantics like durationSec honor-or-refuse, locale meaning 'ALL on-screen copy + captions', and emphasisPhrases applied to captions. This meaningfully aids an agent above what the raw schema communicates at a glance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Persist) and resource (a Brief) and immediately distinguishes it from siblings by naming it the Director's input contract whose spec is the storyboard skill's output. The follow-up ('Then compose it: compose with {briefId}') situates it precisely in the flow versus update_brief, get_brief, and compose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the post-write step (compose with {briefId}) and that the response quote must be relayed before composing, which implies when to call. But it never explicitly says when to use create_brief versus update_brief on an existing brief, nor prerequisites (project existence). Implied usage only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_checkoutCreate CheckoutAInspect
Top up the CURRENT org's credit wallet. Body { plan: "credit_pack_10"|"credit_pack_30"|"credit_pack_100" } → returns { url }: a hosted Stripe checkout page to open in a browser and confirm payment. There are no subscription tiers — a pack is a one-off top-up, and it is also the only thing that raises the generation (premium_credits) allowance. Always a URL — an existing saved card is NEVER charged silently; the human confirms on Stripe. The org is resolved from your key, never the body. Requires the billing:write scope. Only send a user here when get_account shows the relevant balance at or near zero. Discover the packs with list_plans.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | Hosted Stripe checkout URL to open in a browser to complete payment. Always present on success — an existing saved card is never charged without confirming here. |
| plan | No | |
| interval | No | |
| productId | No | Resolved billing catalog product id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: the return shape (a hosted Stripe URL), the guarantee that a saved card is never silently charged, that the human confirms on Stripe, that the org comes from the key and not the body, and the required billing:write scope. The non-destructive/one-off nature aligns with destructiveHint=false and is reinforced rather than merely repeated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return value, then constraints, then when-to-use. Dense and mostly waste-free, though the multiple mid-sentence clauses and emphatic caps make it slightly heavier than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description needn't detail returns, yet it summarizes { url } anyway plus auth scope, org resolution and eligibility criteria. Complete enough that an agent can select and invoke it correctly on the first try; the only loose end is the unmentioned `interval` field, which is a schema inconsistency more than a description omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate: it enumerates the three plan values and explains that the org is never passed in the body. However it is silent on the schema's `interval` field, which it arguably contradicts by declaring 'no subscription tiers' — a real gap in parameter coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource up front: 'Top up the CURRENT org's credit wallet.' An agent can tell this apart from billing siblings like list_plans (discovery) and get_account (balance check) without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Only send a user here when get_account shows the relevant balance at or near zero') and explicit routing to the discovery alternative ('Discover the packs with list_plans'). The when-not condition is inferable from that same sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_componentCreate ComponentAInspect
Create and store a custom component for the tenant: a native scene that arranges its declared images and videos as tiles in 3D space. Returns the ComponentResponse (id + metadata) you can then reference from a composition. No project arg — components are tenant-scoped. SOURCE CONTRACT (version 4; the server instructions' Component Contract has the full rules and an example): send the complete source object {version:4, componentId, template, manifest, definition}. template is one sub-composition: a root holding , and one inline script ending in __cfScene.mount({ root: document.getElementById('root'), component, variables: __hyperframes.getVariables() }). data-composition-variables is the definition's projection (scalar inputSchema properties, then manifest slots). The manifest is {version:4, runtime:'hyperframes', hfContract:1, kind:'scene', assets, graphics:{api:'webgl2',…}, alphaPolicy}; slots are image or video. The source is admitted before it is stored: template lint, determinism (no timers, Date, network or CSS animation) and the declaration are checked, and a refusal names the rule. A version-3 source is retired and refused as component_source_retired. Place it with execution {version:4, componentId, sourceVersionId, params, seed, assets:{ slot: mediaId }} and placement {version:3, kind:'clip'}; slots never travel in params.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /components body. Org/user are server-resolved; never accepted from the body. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The entry's id: a `primitiveId` for a built-in, a `componentId` for an installed component. |
| kind | No | RENDER kind (component | transition | scene). NOT the ClipSource variant — see `placement` for how to author it on the timeline. |
| mood | No | Vibe/tone tags (e.g. 'cinematic', 'minimal'). Filter to match the edit's mood. |
| name | No | |
| tags | No | Free-text search keywords. |
| tier | No | Quality/applicability RANKING (a preference, not a flag). Prefer 'recommended'; reach for 'niche' only when its specific use-case is exactly the beat. |
| format | No | |
| intent | No | Selection signal: a verb naming what this primitive accomplishes (e.g. 'product-trailer'). Match it to the beat you are authoring. |
| origin | No | |
| source | No | 'default' = built-in primitive (place by primitiveId); 'installed' = org-authored component (place by componentId). |
| tokens | No | |
| useCase | No | The edit ROLE(s) this primitive fills — the dimension to filter by for a beat (e.g. 'intro', 'title-over-footage', 'grade'). |
| useWhen | No | When to use this — AND when not to. The negative guidance is load-bearing; read it before picking. |
| version | No | The ENTRY's version: a semver string ('0.0.0' until an authored component is versioned). Distinct from `manifest.version`, which is the runtime contract version (4 native, 2 retired TSX). |
| category | No | |
| examples | No | Usage examples, as authored. A built-in primitive projects {name, mood?, params?, description?}; an authored component's examples are whatever it wrote, which is why the item is open. One shape for both directions: what you write here is what you read back. |
| manifest | No | |
| warnings | No | Non-blocking save-time advisories — the create/update SUCCEEDED. Currently: a `fontFamily` string literal referencing a NON-vendored font (a bare CSS generic like 'serif', or an unknown named family like 'Arial') whose LIVE-lane pixels vary by render host — re-author with a vendored family or 'Georgia'. Omitted when there is nothing to flag; only present on the create/update responses. |
| avoidWith | No | Authoring guidance: ids of primitives that CONFLICT with this one — do not place together. |
| fixedCopy | No | On-screen strings this primitive BAKES — the read-side counterpart to propSchema. These literals render REGARDLESS of params (no param can change them); fork the source via get_component_source to edit them. Use this to see at author time what fixed copy (someone-else's marketing text, faux-code, faux-data) will appear before you render. |
| pairsWith | No | Authoring guidance: ids of primitives that COMPOSE well with this one in the same edit. |
| placement | No | |
| textParam | No | The param field that carries this primitive's primary text; null = no single text slot. |
| propSchema | No | |
| description | No | |
| ejectedFrom | No | |
| propDefaults | No | |
| subtextParam | No | The param field for secondary text (subtitle/byline); null = none. |
| brandBindings | No | Params that can follow the project brand kit. Each {param, brandToken} says: set `param` to `brandToken` (a `$brand:` ref, e.g. '$brand:colors.accent') to track the brand instead of a literal. See the list response's `brandTokens` for the full ref vocabulary. Omitted when nothing is brand-bound. |
| durationInFrames | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it is a non-idempotent, non-destructive write. The description goes well beyond that: the source is admitted before storage via template lint, determinism checks (no timers, Date, network, CSS animation) and declaration validation, refusals name the offending rule, a version-3 source is refused as component_source_retired, and the return is the ComponentResponse (id + metadata).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose before the contract detail, and the SOURCE CONTRACT sentence is a useful signpost. It is dense and reads as a wall of clauses rather than discrete steps, but nearly every sentence carries contract information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deeply nested write tool with an output schema, the description covers the essentials: input shape, validation/refusal behavior, versioning rules, and downstream placement. Return values needn't be spelled out given the output schema. Minor gaps remain around the non-source body fields, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Overall schema coverage is high, so the baseline is 3, but the description earns extra by explaining the source object shape ({version:4, componentId, template, manifest, definition}), what the template sub-composition must contain, that manifest slots are image or video, and that data-composition-variables is the definition's projection. It stops short of covering the other optional body fields (origin, tokens, examples, propSchema, ejectedFrom).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (create and store a custom component) and immediately narrows it to what the artifact is: a tenant-scoped native scene that tiles declared images/videos in 3D space. This is distinguishable at a glance from siblings like update_component, get_component_source and preview_component.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real usage context: components are tenant-scoped (no project arg), the result is referenced from a composition, and placement later goes through execution/placement objects with slots kept out of params. However, it never states when to prefer create_component over update_component or how it relates to resolve_builtin_component / repin_component, so routing between siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectCreate ProjectAInspect
Create a new project — the unit you compose and render into. compose / apply_composition / create_render / the preview family all require a projectId; this mints one. Pass name (required) plus optionally a format (aspectRatio/fps/resolution) and brandKitId. brandKitId binds a brand kit to the PROJECT (pass the kitId from create_brand_kit): colors/fonts/motion theme every render of this project automatically (omit it and the output is unbranded). Bind or change it later via update_project (PATCH /projects/:id over REST). Returns the ProjectResponse (id + metadata).
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /projects body. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| format | No | |
| webUrl | No | A browser URL that opens THIS project, or null when CueFrame exposes no web view for a project. Null today: the console serves account surfaces (keys, usage, billing) and has no per-project page, so there is no link to give. Do NOT synthesise one — a guessed console path 404s. Show the user rendered output (create_render → outputUrl) or a preview still instead. This field becoming non-null is the signal that a real project view exists. |
| createdAt | No | |
| brandKitId | No | |
| lastRender | No | Most recent render for a project, if any. |
| composition | No | Summary of a project's stored composition. |
| description | No | |
| activeCompositionId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (non-destructive, non-idempotent create), the description discloses meaningful behavior: brandKitId binds a kit that themes every render, omitting it yields unbranded output, and the tool returns the ProjectResponse. It doesn't state that repeated calls create duplicate projects (the idempotentHint=false implication), but the added brand semantics and return shape are real disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then why it's needed, then parameters, then the brand binding, then the return shape. Dense but each sentence carries information; only mildly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description supplies the missing context an agent needs (purpose, callers, brand binding, return). The only gap is that width, height, and description params are not mentioned, though the schema documents them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantic value: brandKitId's effect (colors/fonts/motion across renders, sourced from create_brand_kit) and the format sub-fields (aspectRatio/fps/resolution). It omits width/height/description, which the schema covers, so it modestly exceeds baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (create a project) and defines what a project is ('the unit you compose and render into'), then names the consuming siblings (compose, apply_composition, create_render, preview family) that require a projectId. An agent can distinguish this from create_brand_kit, create_render, or list_projects without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains why/when to call it (any tool needing a projectId requires one to be minted first) and points to update_project for rebinding or changing the brand kit later. There is no explicit 'when not to use' or preconditions, but the motivating context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_renderCreate RenderAInspect
Queue an MP4 render of a project's composition. Returns { id (renderId), status, warnings? } — warnings[] carries non-fatal advisories (omitted when none). The render themes from the project's brand kit (bind one via create_project / update_project with brandKitId — or PATCH /projects/:id over REST; without one the output is unbranded). Then call wait_job(kind="render", id=renderId, projectId=...) to block until the file is ready and get the download URL, or register a webhook (create_webhook on render.completed — status rides the payload).
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /projects/:id/renders body. | |
| projectId | Yes | projectId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| error | No | Human-readable failure message. Pair with `errorCode` for a stable, machine-readable code an agent runner can branch on. |
| status | No | |
| listUsd | No | A2 money stamp: the metered event's LIST price (USD), stamped at the success terminal (exports for deliverable renders, compose_capture for A8 previews). A plan allowance may zero the actual invoice line — this is the list price, never a Stripe charge. Absent while running, on failure, and for x402 orgs (on-chain receipts). Mirrors the get_usage ledger. |
| category | No | Failure taxonomy when status is `error`; null otherwise. `authoring` = deterministic defect in YOUR composition/request — fix it, retrying is futile; `transient` = temporary pipeline/infra failure — safe to retry_render; `internal` = unexpected server fault — retry once then escalate. Mirrors the render.failed webhook's `category`. |
| progress | No | Non-terminal render progress; phase is one of the worker's emitted stages. |
| warnings | No | Non-fatal advisories surfaced at render-CREATE (omitted when none, and on GET — create-time only). |
| createdAt | No | |
| errorCode | No | Stable, machine-readable error code (e.g. `render_pipeline_unavailable`, `render_route_missing`, `render_pipeline_failed`). Null when status is not `error` or unavailable for an older render. |
| outputUrl | No | |
| retryable | No | Whether re-attempting the SAME render can succeed (status `error`); null otherwise. true → call retry_render. false → deterministic (category authoring/internal); fix the composition first — retry_render alone reproduces it. Mirrors the render.failed webhook's `retryable`. |
| updatedAt | No | ISO-8601 timestamp of the render's most recent progress update. Compute staleness = now − updatedAt to distinguish a wedged render from a slow one and decide whether to wait, cancel, or retry. |
| errorDetails | No | Structured failure context — `{ targetUrl?, upstreamStatus?, upstreamCode?, attemptedAt? }`. Surfaced so agent runners can distinguish operator-config issues from upstream-down vs route-missing without parsing `error`. |
| outputExpiresAt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=false, destructive=false. The description adds genuine context beyond that: renders are queued asynchronously, output themes from the project's brand kit, and without a bound kit the output is unbranded. It doesn't state whether duplicate submits are deduplicated (relevant given idempotentHint=false), so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then returns shape, then brand-kit dependency, then next steps — a sensible order. It is somewhat dense, packing REST PATCH and webhook-payload asides that are useful but tangential, keeping it just short of optimal tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity async tool with a nested body and an output schema, the description covers the full lifecycle: submission, return shape/warnings, brand-kit dependency, and how to retrieve the finished file. Nothing an agent needs to call it correctly is missing, and return details are already carried by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema by explaining that brandKitId is a project-level binding and can alternatively be set via REST PATCH /projects/:id. It also implies the compositionId default ('the project's active composition'), which the schema already documents, so the net gain is modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Queue') and resource ('an MP4 render of a project's composition'), making the async render action unambiguous and distinguishable from sibling preview_* and compose tools. An agent can identify exactly what this produces without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly routes the agent to the follow-up path: wait_job(kind='render', ...) for blocking or create_webhook on render.completed for push. It also explains brandKitId binding via create_project/update_project. However, it never contrasts this tool against sibling alternatives like preview_clip or apply_template, leaving the choice of render-vs-preview implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_uploadCreate UploadAInspect
Ingest a LOCAL file — bytes you hold, when there is no public URL to hand import_media (prefer import_media whenever the bytes already sit at an https URL). TWO steps: (1) this tool reserves a media item and returns { id, uploadUrl, expiresAt } — a short-lived PUT URL. PUT the raw file bytes to uploadUrl over HTTPS with your declared Content-Type (≤ ~5 GB per PUT). (2) call finalize_upload({ mediaItemId: id }) to start processing. Body: filename, contentType (allowed enum), size (bytes). Thereafter it is async exactly like import_media: poll list_media for processingStatus, or register a webhook (create_webhook on media.completed). Use the returned id with get_media_context, suggest_briefs, or as a composition source.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /media upload initiation body. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| expiresAt | No | |
| uploadUrl | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as a non-readonly, non-idempotent, non-destructive, closed-world mutation, and the description substantially enriches that: it discloses the two-step reserve-then-PUT protocol, the short-lived uploadUrl with expiresAt, the ~5 GB per-PUT cap, the HTTPS PUT requirement, and the async follow-on via list_media polling or create_webhook. This is exactly the extra behavioral context annotations alone cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The routing decision and the two-step protocol are front-loaded, and each sentence does work (purpose, steps, async follow-on). It is dense and slightly long, but there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description helpfully narrates the return shape ({ id, uploadUrl, expiresAt }) and the required follow-up call, and it fully covers the async processing path for a fairly complex multi-step mutation. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), but the description adds genuine value beyond it: it enumerates the body fields (filename, contentType allowed enum, size in bytes) and clarifies the ~5 GB per-PUT transfer limit that differs from the schema's 10 GiB total-size maximum. It stops short of documenting the optional projectId, so not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (ingest a LOCAL file / create upload) and immediately distinguishes itself from the sibling import_media by the condition that selects each. An agent can tell this apart from import_media, prepare_media, and finalize_upload without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool ('no public URL to hand import_media') and when not ('prefer import_media whenever the bytes already sit at an https URL'). It also names the mandatory follow-up (finalize_upload) and downstream consumers, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_webhookCreate WebhookAInspect
Register a webhook so long-running jobs notify you instead of blocking on wait_job — the right pattern for fan-out/async agents. Pass url + events — ONE terminal event per job kind with status INSIDE the payload (render.completed, compose.completed, media.completed, suggest.completed) plus checkpoint.ready (a held compose paused for review). DELIVERY: a POST { event, timestamp, projectId?, data } with Standard-Webhooks headers (webhook-id, webhook-timestamp, webhook-signature: v1,); the secret (whsec_) is returned ONCE — verify the RAW body with new Webhook(secret).verify(rawBody, headers). ACTIVATION is synchronous: CueFrame POSTs a signed webhook.verify challenge and your endpoint must reply 2xx echoing data.token — otherwise it returns status:"pending" and receives NO events (recover with verify_webhook, no delete/recreate). Read the cueframe://webhook-events resource (or GET /webhooks/events) for the full contract + every event's data shape BEFORE building your receiver.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /webhooks body. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| url | No | |
| events | No | |
| secret | No | Standard Webhooks signing secret, format `whsec_<base64>`. Returned ONCE at create; rotate = delete + recreate. Every delivery carries `webhook-id`, `webhook-timestamp` (unix seconds), and `webhook-signature: v1,<base64>` (HMAC-SHA256 over `{id}.{timestamp}.{rawBody}`). Verify with any Standard-Webhooks library (`standardwebhooks` / `svix`): `new Webhook(secret).verify(rawBody, headers)`. |
| status | No | active = ownership verified + receiving events; pending = challenge not echoed, inactive. |
| enabled | No | |
| settleMs | No | |
| verification | No | Present ONLY when ownership verification did not complete (status:"pending"). CueFrame POSTs a signed `webhook.verify` challenge whose `data.token` your endpoint must echo in a 2xx to activate; `reason` is one of token_not_echoed | non_2xx_<code> | unreachable | ssrf_blocked. A pending webhook receives no events — fix the receiver and POST /webhooks/:id/verify (no delete/recreate needed). See GET /webhooks/events for the full contract. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover safety hints (not read-only, open-world, non-idempotent). The description goes far beyond: the secret is returned ONCE, activation is synchronous via a signed challenge that must be echoed, failure yields status:'pending' with no events, and the exact POST payload/headers/verification flow are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the core routing decision comes first, then delivery, activation, and recovery in order. It is long, but nearly every sentence encodes a distinct operational fact, with only minor compression possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex async tool with a nested schema and an output schema, the description covers the full lifecycle: registration, delivery contract, secret handling, synchronous activation, failure state, and recovery, plus a pointer to the resource/endpoint for the full event contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: events are a single terminal event per job kind with status in the payload, and checkpoint.ready means a held compose paused for review. It does not explain settleMs or several enum values, keeping it at 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Register a webhook') and immediately positions it against a named sibling ('instead of blocking on wait_job'). An agent can distinguish it from wait_job, verify_webhook, and delete_webhook without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('the right pattern for fan-out/async agents', long-running jobs) and when not to (blocking on wait_job). It also names the recovery alternative for a failed activation ('recover with verify_webhook, no delete/recreate'), removing the most likely mistake.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_briefDelete BriefADestructiveIdempotentInspect
Delete a brief. Compose jobs already run from it are unaffected (they snapshot).
| Name | Required | Description | Default |
|---|---|---|---|
| briefId | Yes | briefId (path). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds genuinely new context beyond those flags: that compose jobs already run are unaffected because they snapshot. That is exactly the downstream-impact information an agent needs before deleting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, the destructive action front-loaded and the caveat immediately after. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive delete with no output schema, the annotations plus the snapshot caveat cover what an agent needs to call it safely. It could say more about irreversibility or permission requirements, but the essential information is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single briefId parameter, so the schema documents it fully. The description adds no additional meaning about the parameter, making the baseline of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb and resource ('Delete a brief') clearly enough that an agent distinguishes it from get_brief, update_brief, or delete_composition. It does not explicitly differentiate itself from the other delete_* siblings, but the resource noun carries the meaning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence describes side effects, not usage. There is no statement of when to delete vs. update or archive a brief, and no prerequisites or warnings about irreversibility.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_compositionDelete CompositionADestructiveIdempotentInspect
Delete a composition (and its version history) from a project. REFUSES the ACTIVE composition (409) — make another one active first, or delete the project. Use list_compositions to see which is active.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | projectId (path). | |
| compositionId | Yes | compositionId (path). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description goes beyond them by disclosing the cascade (version history is destroyed), the specific refusal behavior with status code 409, and the required precondition. That is high-value behavioral context the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: the action with its destruction scope is front-loaded, the failure mode follows, and the remedy/discovery tool closes it. No filler, and the constraint is placed where an agent will read it before calling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive two-param delete with full annotation coverage and no output schema, nothing essential is missing: what is deleted, what else is destroyed, the blocking condition, its status code, and how to resolve it are all stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (projectId, compositionId) are documented in the schema. The description hints at project scoping but adds no syntax, format, or ID-source detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Delete) + resource (composition) + scope ('and its version history') plus a project-level scoping phrase. It distinguishes itself from the many sibling deletes (delete_project, delete_brief, delete_media) and the composition-family tools by naming the exact object and the cascade.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the blocking condition (REFUSES the ACTIVE composition, 409) and gives two remedies ('make another one active first, or delete the project'), plus a pointer to list_compositions to discover which is active. This is exactly the when/when-not/alternative structure.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_criticDelete CriticADestructiveIdempotentInspect
Delete a registered critic by its criticId. It stops running in the Director gates and score_composition immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| criticId | Yes | criticId (path). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuine domain context beyond that: the critic stops running in Director gates and score_composition immediately, which tells the agent the blast radius of the deletion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loading the verb+resource+key before the consequence. Nothing is wasted and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive delete whose annotations already cover safety, the description supplies the impact context (Director gates, score_composition), which is the main thing an agent needs. Missing only recovery/permission notes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents criticId. The description only restates that the critic is identified by criticId and adds no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (registered critic) plus the identifying key (criticId). It is clearly distinguishable from siblings like register_critic and list_critics without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the deletion effect, and there is no direct alternative sibling for removing a critic, but the description never states prerequisites, when-not to use it, or how to recover from an accidental delete. Adequate but with clear gaps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_mediaDelete MediaADestructiveIdempotentInspect
Permanently delete a media item from your library (cleanup). Irreversible. Compositions referencing it will fail to render — only delete media no composition still needs.
| Name | Required | Description | Default |
|---|---|---|---|
| mediaItemId | Yes | mediaItemId (path). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds value beyond them by disclosing the concrete consequence: compositions referencing the item will fail to render, plus explicit irreversibility. It does not mention auth/permission requirements or behavior on repeated deletion, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, no filler, with the destructive nature stated first and the risk condition second. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no output schema and full annotation coverage, the description supplies the two things an agent most needs: irreversibility and downstream render impact. It omits how to obtain or verify a mediaItemId and behavior on re-deletion of an already-deleted item.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single mediaItemId parameter, so the schema carries the burden. The description adds no meaning (no format, source, or retrieval hint for the ID), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Permanently delete a media item from your library') with the scope modifier 'permanently' front-loaded. It is trivially distinguishable from the other delete_* siblings (delete_brief, delete_composition, delete_project, delete_webhook) because the resource is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition ('only delete media no composition still needs') and implies the cleanup context, which tells the agent when this is appropriate. It does not name an explicit alternative (e.g., a detach/replace tool) or a precondition check step, so it stops short of full when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_projectDelete ProjectADestructiveIdempotentInspect
Permanently delete a project you created (cleanup). Removes its composition and render history. Irreversible — only call on a project you own and no longer need.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | projectId (path). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the bar is lower, but the description still adds real value beyond them: it discloses the cascade ('Removes its composition and render history') and the ownership prerequisite. The one gap is that 'irreversible' largely restates destructiveHint, and idempotentHint is not explicitly acknowledged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses, front-loaded with the action and followed by the two facts that matter most (cascade scope, ownership/irreversibility). No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with annotations covering the safety profile and no output schema, the description supplies everything needed: the target, the side effects, and the precondition. Nothing an agent must know before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, so the schema already documents projectId fully and the baseline is 3. The description adds only the implicit constraint that the project must be one the caller created, with no format or identifier details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete a project') plus scope ('cleanup', ownership). It is trivially distinguishable from the other delete_* siblings because the resource (project) is explicit, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition for use ('only call on a project you own and no longer need'), which functions as a when-to-use constraint. It stops short of naming an explicit alternative or exclusion (e.g., detach vs. delete), so it is strong context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_webhookDelete WebhookADestructiveIdempotentInspect
Delete a webhook subscription (stop receiving its deliveries). Irreversible — the signing secret is invalidated.
| Name | Required | Description | Default |
|---|---|---|---|
| webhookId | Yes | webhookId (path). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, so the safety profile is covered; the description adds real value by naming the concrete side effect — the signing secret is invalidated and the action is irreversible. It stops short of stating what happens to in-flight/queued deliveries or auth requirements, but that is a minor gap given the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short clauses with the irreversible consequence front-loaded immediately after the action. Zero filler and nothing to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description supplies the action, the effect, and the irreversibility warning — enough to call it safely. Only marginal items (behavior on an already-deleted webhook, permission requirements) are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One required parameter with 100% schema description coverage, so the schema already carries the parameter burden. The description adds no format, sourcing, or lookup guidance for webhookId, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('delete a webhook subscription') with a clarifying parenthetical that states the observable effect ('stop receiving its deliveries'). That effect wording makes it easy to tell apart from update_webhook and verify_webhook without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The stated effect implies when the tool is appropriate, but there is no explicit when-to-use, no prerequisite (e.g., confirming the webhook exists), and no routing to alternatives such as update_webhook for partial disablement. Usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
derive_compositionDerive CompositionAInspect
Derive a reframed SIBLING composition for a different aspect ratio (the agent-native Auto-Reframe / Magic-Resize). Pass projectId + body { fromCompositionId, targetFormat: { aspectRatio, fps?, resolution? } }. CueFrame copies the source composition's authored intent and content-aware-reframes every clip for the new aspect (point/face/active-speaker focus), then saves a new independent composition in the same project. Returns { compositionId } — render it with create_render, or refine it with apply_composition. Use this to make 9:16 + 1:1 + 4:5 cuts from one 16:9 edit. (To only change resolution within the SAME aspect, pass create_render.format instead — that is a scale-only export override, not a new composition.)
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Derive a reframed sibling composition for a new aspect (Auto-Reframe / Magic-Resize, agent-native). | |
| projectId | Yes | projectId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| compositionId | No | The new sibling composition's id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state it is not read-only, not idempotent, not destructive. The description goes well beyond that: it explains the reframing behavior (point/face/active-speaker focus), that the source's authored intent is copied, that a NEW INDEPENDENT composition is saved in the same project (source untouched), and what is returned. It also routes the agent onward to create_render or apply_composition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and payload before the supporting detail, and the trailing parenthetical carries genuinely useful disambiguation rather than filler. It is dense and slightly long, but each clause (behavior, return value, follow-up tools, exclusion) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested-body mutation tool, the description covers invocation shape, side effects on the source, reframing behavior, and the return value, and an output schema exists for the return contract. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description still adds value by spelling out the body shape (fromCompositionId + targetFormat with aspectRatio/fps/resolution) and by clarifying the semantic distinction between targetFormat here and create_render.format, which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Derive') and a precise resource ('a reframed SIBLING composition for a different aspect ratio'), and explicitly names the feature (Auto-Reframe / Magic-Resize). It clearly differentiates itself from create_render and apply_composition, both of which appear as siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit positive use case ('make 9:16 + 1:1 + 4:5 cuts from one 16:9 edit') and an explicit exclusion with the correct alternative ('to only change resolution within the SAME aspect, pass create_render.format instead'). When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_composition_opsDescribe Composition OperationsARead-onlyIdempotentInspect
Discover the exact CompositionOp vocabulary accepted by apply_composition. Omit type for a compact list of operation names and descriptions; pass type for only that operation's JSON Schema. Read this before authoring edits or captions.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Exact CompositionOp type, such as captions.fromComposition. Omit for the operation list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered structurally. The description adds genuinely new behavioral context: the two response modes triggered by presence/absence of the type argument, plus an emphatic 'exact' vocabulary hint that matters when authoring calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, no filler. The purpose is front-loaded, the branch behavior follows, and the 'read before authoring' call to action closes it. Every sentence carries information an agent acts on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description compensates by describing the return shape in both modes (name/description list vs. JSON Schema for one op). For a single-optional-parameter read tool, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description goes further by explaining what happens in each branch (omit -> compact list of names and descriptions; pass type -> only that operation's JSON Schema) and by echoing a concrete example value (captions.fromComposition). That is meaningful semantics beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Discover the exact CompositionOp vocabulary accepted by apply_composition.' Crucially, it names the sibling that consumes this vocabulary (apply_composition), so an agent can immediately distinguish this introspection tool from the mutation tools around it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context ('Read this before authoring edits or captions') and the routing rule to apply_composition. It does not state any when-not condition or exclusion, but for an introspection helper with a single obvious consumer, the guidance is effectively complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_brand_kitExtract Brand KitAIdempotentInspect
Queue brand-token extraction from a website URL — ASYNC: returns a jobId immediately; then wait_job(kind="brand_kit_extract", id=jobId) for the tokens (colors/fonts/title/description, fetched + regex-parsed from the site's HTML/CSS — NOT a screenshot/vision pass). It does NOT persist — review the tokens, then call create_brand_kit to save a kit. A blocked (private/SSRF), non-2xx, non-HTML, or slow (>20s) URL degrades to EMPTY token arrays (a succeeded job) rather than erroring — JS-rendered SPAs typically extract empty; author the kit manually from the compiled CSS in that case.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /brand-kits/extract body — the website URL to extract brand tokens from. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Job family, e.g. `verify` | `preview` | `brand_kit_extract`. |
| jobId | No | Poll GET /v1/jobs/{jobId} / wait_job until terminal. |
| jobKey | No | Deterministic identity of the work (content hash of every input the result depends on). Re-enqueueing the same key returns the same job while it runs; a failed key revives as a fresh attempt. |
| status | No | running on a fresh/deduped enqueue; succeeded when an identical request already completed. Cancelled is part of the shared status vocabulary; identical cancelled work revives to running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety/idempotency profile, and the description adds substantial behavior the annotations cannot express: async jobId handoff, the 20s timeout, SSRF/private-URL blocking, non-2xx and non-HTML handling, and the critical non-obvious trait that failures degrade to EMPTY token arrays as a succeeded job rather than erroring. This is exactly the kind of disclosure that prevents an agent from misreading an empty result as a bug.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the ASYNC contract, and essentially every clause carries operational information (jobId, wait_job kind, degradation behavior, fallback). It is dense with nested parentheticals and em-dashes in a single paragraph, which slightly impairs scanability, but there is no filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for an async, single-parameter, output-schema-backed tool: the description supplies the job lifecycle, the wait_job continuation, the persistence gap and its remedy, plus failure semantics that the output schema alone would not disambiguate. Nothing an agent needs to call or correctly interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single url parameter, so the baseline is 3, but the description adds real semantic constraints beyond 'format: uri': the URL must serve server-rendered HTML/CSS, and JS-rendered SPAs will typically yield empty output. That materially changes how an agent should pick and interpret the value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('queue brand-token extraction from a website URL') and immediately scopes what is produced (colors/fonts/title/description) and how (HTML/CSS regex parse, not vision). It also names the two sibling touchpoints, wait_job and create_brand_kit, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing ('returns a jobId immediately; then wait_job(kind="brand_kit_extract", id=jobId)'), an explicit exclusion ('NOT a screenshot/vision pass'), a persistence boundary ('does NOT persist — review the tokens, then call create_brand_kit'), and a fallback path for JS-rendered SPAs. When-to-use, when-not-to-use, and the alternative are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finalize_uploadFinalize UploadAInspect
Finalize a direct upload once you have PUT the bytes to the uploadUrl from create_upload. Confirms the bytes landed and starts ingest: image/asset become ready immediately (status "complete"); audio/video enter processing (status "processing"). Returns { id, status, processingPhase }. 400 if no bytes were uploaded (PUT first) or the item is not yours. Then call wait_job(kind="media", id=mediaItemId), or use a media.completed webhook.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /media/:id/finalize body — optional declared audioRole. | |
| mediaItemId | Yes | mediaItemId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| status | No | |
| processingPhase | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare only the generic safety profile (not read-only, not destructive, not idempotent); the description adds behavior they don't capture — state transitions (image/asset -> 'complete' immediately, audio/video -> 'processing'), the exact 400 failure modes (no bytes PUT, item not owned), and the returned shape. This is meaningful disclosure beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and its precondition, then the behavioral outcome, then the error cases, then the next step. Every sentence carries distinct operational information; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a pipeline-mutating tool with rich annotations and an output schema, the description covers everything an agent needs: prerequisite, state effects, failure conditions, and the correct follow-up call. It even restates the return shape, which already exists as an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents both mediaItemId and the optional audioRole enum with rich semantic detail. The description adds no parameter-level meaning of its own, so the baseline of 3 for a fully-covered schema applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Finalize a direct upload') and pins its place in the pipeline relative to create_upload. It also names its difference from sibling flows (asset/image vs. audio/video handling), so an agent can distinguish it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the explicit precondition ('once you have PUT the bytes to the uploadUrl from create_upload') and names the follow-up alternatives ('call wait_job(kind="media", id=mediaItemId), or use a media.completed webhook'). It also names when it fails, so the agent knows what NOT to do out of order.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_mediaGenerate MediaAInspect
Generate one first-class Library media item from a prompt. Choose generator: text-to-video | text-to-image | image-to-video | text-to-music | text-to-speech | text-to-sfx | auto. Put supported presentation controls in body.style and first/last/image references in body.refs. Returns { id, status:"generating", estimateUsd? }; returns 402 if the estimate exceeds the per-call ceiling. Async — call wait_job(kind="media", id=mediaItemId) or use a webhook (media.completed — status rides the payload). Use the returned id like any other media item.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /media/generate body. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| status | No | |
| estimateUsd | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the async lifecycle, the exact success payload ({ id, status:"generating", estimateUsd? }), the 402 cost-ceiling failure mode, and the webhook event name. Annotations (readOnly=false, idempotent=false, destructive=false, openWorld=false) are consistent with, and supplemented by, this operational detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then generator list, parameter placement, return/error contract, and async handling in that order. Dense but every clause carries information; the generator enumeration is slightly list-heavy but justified by the enum's importance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an async, nested-body, cost-sensitive generation tool, the description covers input shape, success and failure returns, completion paths, and downstream usage of the id. Nothing needed to invoke or follow up on the call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the style sub-schema already documents aspect/durationSec/voice/speed/stability, so the description largely reinforces rather than adds. It does however clarify field placement (presentation controls in body.style, frame/image references in body.refs) and enumerates the generator values, which is useful orientation at the top level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generate one first-class Library media item from a prompt') and enumerates the generator modes, which cleanly separates it from sibling tools like import_media, prepare_media, and extract_media. An agent can tell what this produces and how it differs from adjacent media tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear routing guidance for the generator choice and, importantly, two completion paths (wait_job(kind="media", id=mediaItemId) or the media.completed webhook). It does not explicitly contrast when to use this versus import_media or prepare_media, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountGet AccountARead-onlyInspect
ORIENT FIRST — show THIS key's account before you spend a metered call: the org it is bound to, the current plan, a per-feature entitlements map, and per-call cost ceilings. READ balance, NOT included. CueFrame is credit-funded: rendering (entitlements.exports), generation (generate), preview stills (compose_capture), the judge (compose_verify) and the Director (compose) have NO separate per-plan allowance — they all spend one shared wallet, named in fundedBy (credits; generation is metered in provider-cost units against that wallet). Each balance restates that ONE wallet in that feature's own unit at creditCost credits per unit, so they are alternative ways to spend the same money, not four budgets. Each entitlement also carries listUsdPerUnit: the dollar quote for ONE unit before you call (0 = a plan grant that draws no credits, e.g. resource_import — stock search + import are free; null = not quotable up front). Check the requested cost against the balance. For generation, also check generationLimit: free accounts have a separate provider-cost cap even with a positive wallet. A billing_required error with reason free_generation_cap requires a credit-pack purchase through normal checkout. included:false means the plan genuinely lacks the feature. Every new org starts with a free credit grant, so an account with an empty usage history can still render, generate, preview and score. costCeilings.generateMediaUsdPerCall is the generate_media per-call USD cap. No args — identity is resolved from your key (never echoed from input).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | No | The customer's current base plan/tier. null = unknown (billing not configured, or no active plan resolvable yet). |
| orgId | No | The org this API key is bound to — resolved server-side from the Authorization credential, NEVER from the request body/query. |
| surfaces | No | The browser URLs that actually exist, so an agent asked to "show me" can hand the user a real link instead of guessing one from an id. A null means the surface is not built, not that it is hidden from this key. |
| displayName | No | Org/customer display name from the billing record; null when not set or unknown. |
| costCeilings | No | Discoverable per-call cost ceilings so an agent can price/right-size a request before a guaranteed 402. |
| entitlements | No | Per-feature entitlements keyed by featureId. Covers the billing-gated capabilities: `exports` gates create_render AND generate_media output; `compose` gates compose; `brand_kits` gates create_brand_kit; `resource_import` gates import_resource (a boolean grant: `listUsdPerUnit` 0 — stock search and import cost no credits for a keyed caller); plus ai_tokens/storage/compose_verify/compose_capture/etc. Read `listUsdPerUnit` for what one unit costs before you spend it. Most capabilities are CREDIT-FUNDED — `included` is true and the real limit is `balance`, drawn from the shared wallet named in `fundedBy` (`credits` — generation included; a free org is additionally bounded by a generation cap). So read `balance`, not `included`, to decide whether you can afford a call; `included:false` means the plan genuinely lacks the feature. Check BEFORE a metered call to avoid a mid-workflow 402 billing_required (whose error `details.featureId` names the gating feature). |
| generationLimit | No | Separate lifetime generation cap before a credit-pack purchase. Wallet balance is still shared; generation must also fit this remaining provider-cost allowance. null means unknown. |
| billingConfigured | No | false = billing is not configured in this environment, so plan/entitlement values are best-effort and may be null (unknown), not authoritative. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint/openWorldHint available, the description carries the full behavioral burden and does so richly: it explains the shared-wallet funding model, that balance values are alternative restatements of one pool rather than separate budgets, that null/0 listUsdPerUnit mean distinct things, and the free_generation_cap failure mode. This is well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening 'ORIENT FIRST' cue is well front-loaded, but the bulk is a dense, jargon-heavy single paragraph mixing billing, entitlement and error semantics. Much of the field-by-field billing lecture could be trimmed or deferred to the output schema, so it is over-sized for a no-arg read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description supplies the interpretation key (balance vs included, fundedBy, creditCost, costCeilings) an agent needs to act on the response. Nothing required to call or make sense of this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters gives a baseline of 4, and the description adds a useful note — 'No args — identity is resolved from your key (never echoed from input)' — clarifying that the key is the implicit input. No further parameter detail is possible, so this is the ceiling of useful value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource up front — 'show THIS key's account' — and enumerates exactly what it returns (org binding, plan, entitlements map, per-call cost ceilings). It is clearly distinguishable from siblings like get_usage or list_plans.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'ORIENT FIRST — show THIS key's account before you spend a metered call' gives explicit when-to-use guidance framed by a cost constraint. It goes further by telling the agent what to inspect (balance, generationLimit, listUsdPerUnit) and how to react to a billing_required error.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_briefGet BriefBRead-onlyInspect
Read a brief by id — the persisted intent plus its current quote (compose + estimated render).
| Name | Required | Description | Default |
|---|---|---|---|
| briefId | Yes | briefId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| cta | No | |
| goal | No | What the video must accomplish. |
| hook | No | |
| kind | No | authored = create_brief; clip = minted by suggest_briefs from an AI clip suggestion. |
| name | No | |
| tone | No | |
| audio | No | |
| beats | No | |
| gates | No | |
| quote | No | |
| format | No | |
| locale | No | Output language (BCP-47 tag, e.g. 'es-419'): ALL on-screen copy + captions. |
| caption | No | |
| audience | No | |
| captions | No | |
| platform | No | |
| createdAt | No | |
| projectId | No | |
| updatedAt | No | |
| exclusions | No | |
| references | No | |
| durationSec | No | Target output duration. HONOR-OR-REFUSE: compose validates it against the beat-source window (±1.5s) and refuses a brief it cannot honor. |
| motionStyle | No | |
| mustIncludes | No | |
| seededGraphics | No | Client-authored graphic clips the Director must carry VERBATIM: seeded into the design loop's base composition as LOCKED clips (never re-authored, never discarded). |
| sourceSuggestionId | No | kind:'clip' provenance — the suggestion this Brief was minted from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered and the description does not contradict it. The description adds that a brief carries a 'current quote (compose + estimated render)', which is mild extra insight into returned content. It does not, however, disclose staleness, freshness, or error behavior for a missing id, so it remains a moderate contribution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the operation front-loaded and no wasted words. It is efficient, though the parenthetical gloss is a small extra that could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-by-id tool with an output schema and annotations covering safety, the description supplies enough to call it correctly. It notes the primary content (intent + quote) without needing to restate return values the output schema already defines.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter, so the schema already documents briefId. The phrase 'by id' merely reinforces the schema without adding format, sourcing, or validity details. Baseline 3 is appropriate when the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Read) plus resource (brief) with a scoping qualifier ('by id'), which naturally distinguishes it from list_briefs and the create/update/delete_brief siblings. It also adds a useful gloss on what a brief contains (persisted intent + current quote). Siblings beyond the by-id/list distinction are not named explicitly, so it stays just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description is purely descriptive and gives no when-to-use condition, prerequisites, or alternatives. It never tells the agent when to reach for this over list_briefs or get_composition, or when the embedded quote is what's actually needed. Consistent with the calibration where a lack of when-to-use language earns a 2.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_checkpointGet CheckpointARead-onlyInspect
Read a checkpoint packet — the durable approval unit a held compose pauses at (wait_job reports awaiting_input with {checkpointId, stage, version}). Carries the stage artifact, presigned storyboard stills (REVIEW THE EVIDENCE, not raw JSON), critic verdicts, the money triple {thisStepUsd, jobSpendSoFarUsd, estimatedJourneyTotalUsd} to relay to your human, and the recorded decision once resolved. When the Brief's gates set reviewMode:'hosted' the packet also carries reviewUrl — a browser review page where your human decides directly (relay THAT link instead of raw stills; you learn the decision via checkpoint webhooks / wait_job). Answer an awaiting packet with resume(checkpointId, ...).
| Name | Required | Description | Default |
|---|---|---|---|
| checkpointId | Yes | checkpointId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| kind | No | |
| quote | No | |
| stage | No | |
| status | No | |
| briefId | No | |
| version | No | |
| artifact | No | The stage artifact under review: the locked ComposePlan at content; the composition wire shape at layout/motion; the judged composition snapshot on kind:'score'. |
| decision | No | The recorded decision {decision, comments?, globalNote?, decidedAt} once resolved. |
| createdAt | No | |
| projectId | No | |
| reviewUrl | No | Hosted review-page URL (present when reviewMode is 'hosted') — a human decides from this link, no account or agent session; the recorded decision rides the SAME resume rail, and the agent learns of it via checkpoint webhooks / wait_job. |
| stillUrls | No | Presigned storyboard/eval stills — the packet's visual evidence (may be GC'd by the retention sweep after the job goes terminal; the decision record is immortal). |
| updatedAt | No | |
| reviewMode | No | How this packet is decided (from the Brief's gates). 'hosted' = the review PAGE captures the decision; absent/'agent' = the decision flows back through the driving agent. |
| composeJobId | No | |
| revisionCycle | No | Revise cycles this gate has consumed. The brief quote states the included count (revisionCyclesIncluded); beyond it, resume(revise) is refused with a typed error. |
| criticVerdicts | No | Per-criterion scores + critique from the design loop / judge, incl. lock_violation entries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, and the description adds substantial context beyond that: the contents of the packet (stage artifact, presigned stills, critic verdicts, money triple, reviewUrl) and the instruction to relay evidence rather than raw JSON. It stops short of describing pagination, expiry, or error behavior for an unresolvable checkpointId.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core definition and organised around what the packet contains and how to act on it. It is dense but a single long paragraph; the trailing webhook/wait_job clause restates how the decision is learned and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, yet the description's account of packet contents is what drives the agent's downstream behaviour (relaying the money triple and reviewUrl). Combined with the resume hand-off, the definition is complete enough to invoke and act on correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is only one parameter whose schema description ('checkpointId (path).') is thin. The description compensates by explaining where checkpointId originates — the wait_job awaiting_input payload — which is meaning the schema itself does not carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read a checkpoint packet') and defines what a checkpoint is — 'the durable approval unit a held compose pauses at' — which separates it cleanly from list_checkpoints and wait_job in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger condition ('when wait_job reports awaiting_input with {checkpointId, stage, version}') and the follow-up action ('Answer an awaiting packet with resume(checkpointId, ...)'). It also distinguishes hosted vs non-hosted review flows, leaving no ambiguity about when to call this versus its alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_component_sourceGet Component SourceARead-onlyInspect
Read an exact component source as complete JSON. Supply sourceVersionId from the selected catalog card to read that immutable revision, retaining sourceSnapshot with its complete versioned definition, manifest and template beside its exact pin and schema metadata. For an explicitly selected builtin, also supply builtinCollection:'native'|'curated-definitions' and its exact sourceVersionId; without builtinCollection resolution is scoped to the authenticated org. An unavailable exact pin refuses; never retry a head or another scope. To fork, keep the version-4 snapshot whole, change its componentId (the template root's data-composition-id too) and template, and send it to create_component. Builtins always require an exact collection and pin; ID-only builtin reads are refused. Declared slots are bound per placement in execution.assets, never caller params.
| Name | Required | Description | Default |
|---|---|---|---|
| componentId | Yes | componentId (path). | |
| sourceVersionId | No | ||
| builtinCollection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| origin | No | |
| source | No | |
| tokens | No | |
| examples | No | Usage examples, as authored. A built-in primitive projects {name, mood?, params?, description?}; an authored component's examples are whatever it wrote, which is why the item is open. One shape for both directions: what you write here is what you read back. |
| manifest | No | |
| tsxSource | No | |
| propSchema | No | |
| description | No | |
| ejectedFrom | No | |
| metadataStatus | No | Historical source-only reads omit unavailable discovery name/description instead of borrowing current metadata. |
| sourceSnapshot | No | Canonical immutable source snapshot (version 4 template, or a retired version 3 TSX module); source remains provenance. |
| sourceVersionId | No | Exact immutable source pin; distinct from bundle revisions. |
| durationInFrames | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: unavailable exact pins are refused, retrying a head or another scope is forbidden, builtins always require exact collection plus pin, ID-only builtin reads are refused, and slots are bound per placement in execution.assets rather than caller params. These are precisely the failure and scoping behaviors an agent needs and none of them are derivable from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and pin requirement are front-loaded, but the middle sentence is an overstuffed clause stack ('retaining sourceSnapshot with its complete versioned definition, manifest and template beside its exact pin and schema metadata') that largely restates return-value content the output schema already covers. The fork procedure is useful, but the same content could be stated in considerably fewer words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read tool with an output schema and no nested objects, the definition covers everything an agent needs: when the pin is required, how builtins differ, what refusal means, what the snapshot contains, and how to reuse it for a fork. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (componentId is described as '(path)', sourceVersionId and builtinCollection are undocumented), so the description must compensate and largely does: it explains what sourceVersionId pins, what the builtinCollection enum values select, and the org-scoping that applies when builtinCollection is omitted. The componentId parameter itself still has no added meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read an exact component source as complete JSON' pinned to an immutable revision via sourceVersionId. It implicitly distinguishes itself from preview_component and resolve_builtin_component by requiring an exact pin and refusing ID-only builtin reads, but it never names those siblings directly, so the differentiation is inferential rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete selection conditions: supply sourceVersionId from the selected catalog card, and for an explicitly selected builtin also supply builtinCollection. It also states the negative case (without builtinCollection resolution is org-scoped) and redirects forking work to create_component, but it does not compare this tool against resolve_builtin_component or preview_component as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_compositionGet CompositionARead-onlyInspect
READ BACK a composition as JSON — the edit itself: tracks, clips, card HTML, reframe segments, captions, markers, format. This is what create_render encodes, so it is also what you hand to validate_composition (which needs a full inline composition body), what you diff after an edit, and what you archive/share so someone else can re-render the SAME video. Read-only and free. Authoring stays op-based (apply_composition) — do not round-trip this object back as a write. A composition too large to fit one MCP result degrades to a STRUCTURAL SUMMARY (every track and clip still listed; card html and caption words elided as lengths) with a header saying so — read it over REST if you need the verbatim body. Defaults to the project's ACTIVE composition; pass compositionId to read a specific one (the same id apply_composition takes as composition_id, and preview_frame / create_render take as compositionId) so an A/B variant can be read back, not just written. Pass includeDependencies="true" on a v1 guarded endpoint to read composition_id, revision and dependency tokens. With componentExecutionVersions=["3","4"], this envelope also returns expectedBrandIdentity from the persisted project authority; carry it unchanged into the matching negotiated write. Preserve those observed tokens when authoring; never refresh the basis to hide a conflict.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | projectId (path). | |
| compositionId | No | Read a SPECIFIC composition instead of the project's active one. Omit it and the active composition is returned. Pairs with `composition_id` on the apply op: an edit you can make to a second composition is one you can read back. | |
| includeDependencies | No | Return the immutable composition identity, project revision and shared v1 dependency expectations alongside the composition. | |
| componentExecutionVersions | No | The component execution versions this reader accepts, one parameter per version: 3, or 3 and 4 (native placements). Absent readers accept only the historical protocol. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, yet the description adds real context: 'free', the oversize-degradation behavior to a STRUCTURAL SUMMARY with a header, the REST fallback, and the dependency/brand-identity tokens returned on guarded endpoints. Minor redundancy ('Read-only') with readOnlyHint, but the degradation contract and token guidance are genuine behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause, and most sentences carry distinct, actionable information. The token-preservation advisory ('never refresh the basis to hide a conflict') is useful but skews toward authoring guidance on a read tool, and the paragraph is dense enough that a reader must parse heavily."
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description rightly carries the return-value burden: it enumerates the composition's contents and describes the degraded summary shape and its header. Given four parameters and the cross-tool identity mapping, an agent has enough to call it and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by tying compositionId to the same identity used as composition_id on apply and compositionId on preview_frame/create_render, and by explaining the v1 guarded-endpoint semantics of includeDependencies and the expectedBrandIdentity returned with componentExecutionVersions. That is meaningful incremental semantics, though partly duplicative of the already-decent schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('READ BACK a composition as JSON') and enumerates exactly what that object contains (tracks, clips, card HTML, reframe segments, captions, markers, format). It explicitly positions itself against siblings — the object create_render encodes, the body validate_composition needs, and the thing that is NOT the op-based write path (apply_composition). An agent can distinguish it from list_compositions, apply_composition, and validate_composition without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States concrete use cases (feed validate_composition, diff after an edit, archive/share for re-render) and an explicit exclusion — 'Authoring stays op-based (apply_composition) — do not round-trip this object back as a write.' It also names the alternative reader path (REST) for oversized reads. When-to-use, when-not-to-use, and alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_media_contextGet Media ContextARead-onlyInspect
Fetch bounded authoring context for a media item: dimensions/thumbnail, compact face roster, transcript counts/sample, temporal grids, and fact readiness. The full transcript body is deliberately elided so this read cannot overflow MCP; follow with get_transcript for exact paginated word timings.
| Name | Required | Description | Default |
|---|---|---|---|
| mediaItemId | Yes | mediaItemId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| faces | No | |
| facts | No | Derived facts about this source (subject tracks, mattes): what has been computed, its status, and what it was billed. Same shape as GET /media/{id}/facts. |
| width | No | |
| height | No | |
| offers | No | Enhancements this source does not have yet, with a server quote. Same shape as GET /media/{id}/facts. Mattes are quoted per-window via POST /media/{id}/matte, never here. |
| mediaId | No | |
| beatGrid | No | The MUSIC-role rhythm grid (audio-substrate MVP). Present only for a music bed that carries a computed beat grid; null otherwise. For a music-driven film, cut on these beats (transition midpoints on beats, risers resolving on downbeats). |
| envelope | No | Envelope evidence (audio-substrate P0). `envelopeClass` is always present when an envelope exists (the SFX pack carries it); the numeric probe stats are present only when an audio probe has run. Null when no envelope is stored. |
| wordGrid | No | The VO-role rhythm grid: word onsets surfaced from the transcript (pure exposure). Present only when a transcript exists; null otherwise. For a VO-driven (narration) film, cut every beat boundary to the voice — the film-spine rule. |
| audioRole | No | DECLARED audio role of this asset (audio-substrate P0): 'vo' (narration), 'music' (bed that ducks under speech), 'sfx' (one-shot hit), 'ambience' (a bed that HOLDS under VO — never ducks). Author the clip source's `audioRole` from this. Null for footage/images or an undeclared audio asset. |
| thumbnail | No | Presigned processing thumbnail (~1 week) — the footage at a glance. For stills at chosen timestamps, use preview_frame with a one-clip composition over this media. |
| transcript | No | |
| durationSec | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds meaningful context beyond that: the response is 'bounded,' the full transcript body is 'deliberately elided,' and this is to prevent MCP overflow. That explains why the read is scoped as it is, which the annotations alone do not convey. It omits return format/pagination details, but those are covered by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the verb and resource, then the enumeration of returned facets. The list is somewhat long but each item earns its place by clarifying the bounded scope. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not detail return values, yet it still summarizes them to aid selection, and it names the follow-up tool for full transaction access. For a single-param read tool, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required mediaItemId parameter with 100% schema description coverage, so the schema already carries parameter meaning and the description adds nothing param-specific. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) and resource (bounded authoring context for a media item), then enumerates the returned facets (dimensions/thumbnail, face roster, transcript counts/sample, temporal grids, fact readiness). This lets an agent distinguish it from siblings like get_media_facts and get_transcript without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to the alternative: 'follow with get_transcript for exact paginated word timings,' giving the condition that selects the sibling. It lacks an explicit when-not-to-use statement, but the sequencing guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_media_factsGet Media FactsARead-onlyIdempotentInspect
Read prepared subject tracks and behind-subject mattes for one media item. For an exact readiness check, pass kind + startSec + endSec together using the same SOURCE window sent to prepare_media; exact.state is pending | ready | failed | available | unavailable. If subjectTrack was prepared without intent, omit all three filters and check the whole-source subjectTrack in facts instead. Wait for the required fact to be ready before preview_frame / score_composition.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Resolve one exact editor prerequisite. Requires startSec and endSec; the response includes the server-selected `exact` result. | |
| endSec | No | Source-out of the clip's trim, in seconds. Must be sent WITH startSec. | |
| startSec | No | Source-in of the clip's trim, in seconds. Must be sent WITH endSec — one without the other is a 400, never a silent whole-source default. | |
| mediaItemId | Yes | mediaItemId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| exact | No | The server-selected fact or offer for one exact source window. Present when kind, startSec, and endSec are supplied; clients consume this instead of recreating the fact hash. |
| facts | No | |
| offers | No | What is NOT yet present and could be bought. A `matte` offer appears ONLY when the request carried `startSec`+`endSec` (the clip's SOURCE window) — a matte's price is a function of its duration, so there is no honest whole-source matte quote. `transcript` is never offered: it is produced by the ingest pipeline, not bought here. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and closed-world, so safety is handled. The description extends this with the readiness lifecycle (pending | ready | failed | available | unavailable) and the requirement to wait before downstream calls, which is genuine behavioral context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the exact-check recipe, then the fallback, then the sequencing caveat. Every sentence carries procedural information, though the jargon density (SOURCE window, prepared without intent) slows comprehension slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the description still surfaces the exact.state enum, which helps interpret results. Combined with the annotation coverage, an agent has enough to call and use the tool correctly, with only the exact response shape left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds coupling semantics the schema does not: the three filters must be sent together and anchored to the same SOURCE window as prepare_media, and the paired-omission case is a valid whole-source query rather than an error.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reading prepared subject tracks and behind-subject mattes for one media item. It is clearly distinguishable from read siblings like get_media_context and get_composition, though it never names an alternative tool directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditions: pass kind + startSec + endSec together for an exact readiness check using the same SOURCE window sent to prepare_media, or omit all three filters for a whole-source check when subjectTrack was prepared without intent. It also adds a sequencing rule (wait for the fact to be ready before preview_frame / score_composition).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileGet ProfileARead-onlyInspect
The org's legible taste in ONE read: brand kits, registered critics (the machine-checkable standard both the Director's gates and score_composition enforce), their reference media (presigned thumbnails), and the recent checkpoint-decision log. Read this BEFORE composing for an org you haven't worked with — it is the house style.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| critics | No | Registered critics — run in the Director's gates AND score_composition. |
| brandKits | No | The org's brand kits (bind one to a project via update_project). `audio` carries the brand sound kit when set. |
| references | No | The union of critic reference media — the org's visual standard, with provenance. |
| recentDecisions | No | The last recorded checkpoint decisions — the raw taste log phase 2 will distill. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, so the description earns credit for added context: it discloses the bundled payload (brand kits, critics, presigned thumbnails, decision log) and that the critics are a machine-checkable standard enforced by Director gates and score_composition. 'Presigned thumbnails' usefully signals links may be ephemeral, though no auth or rate-limit detail is given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the returned contents and closing with the usage trigger. The 'legible taste' / 'house style' metaphors add flavor without much payload, keeping it just short of maximally efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, and a zero-param read tool requires little more. The description covers purpose, payload, and the pre-compose usage condition adequately; only minor behavioral detail (auth, link lifetime) is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline there is nothing for the description to add here. It correctly describes an implicit org scope with no parameter-level gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (the org's profile) and enumerates exactly what comes back: brand kits, critics, reference media, and a checkpoint-decision log. It is distinguishable from neighbors like get_account or get_brief, though the 'legible taste in ONE read' framing is flowery and only clarified by the enumeration that follows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use trigger: 'Read this BEFORE composing for an org you haven't worked with.' It does not name an alternative tool or when NOT to use it, but the precondition is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transcriptGet TranscriptARead-onlyInspect
Read exact source-time transcript words in bounded utterance pages. Word start/end values are seconds from the source media start. Pass limit (20 recommended), then pagination.nextCursor as after; the formatter omits the unbounded fullText duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Zero-based utterance cursor returned as pagination.nextCursor. | |
| limit | No | Utterances per page. | |
| before | No | Zero-based utterance cursor for a backward page. Do not combine with after. | |
| mediaItemId | Yes | mediaItemId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| fullText | No | |
| language | No | |
| pagination | No | Cursor pagination metadata. |
| utterances | No | |
| mediaItemId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real context beyond that: word start/end are seconds from source media start, and the formatter omits the unbounded fullText duplicate. These are non-obvious behavioral details not derivable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, with the core read semantics front-loaded ahead of the time-unit note and pagination mechanics. Every clause carries information; there is no filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary. Given a read-only, 4-param, output-schema-backed tool, the description covers time semantics, paging flow, and formatter behavior adequately; only cross-tool routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema, establishing a baseline of 3. The description reinforces the limit/after paging flow and recommends limit=20, but adds no syntax or constraint detail beyond what the schema carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Read exact source-time transcript words') and scopes it to 'bounded utterance pages.' That is clear enough for an agent to identify the tool, though there is no sibling transcript tool to differentiate against, so no contrastive routing is offered.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives operational usage (pass limit at 20, then pagination.nextCursor as after), which is genuinely helpful for driving the tool, but never states when this tool is appropriate versus alternatives (e.g., get_media_context or get_media_facts for transcript-adjacent data). Usage is implied rather than framed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageGet UsageARead-onlyInspect
The A2 usage ledger: every metered billing event newest-first with attribution — featureId, amount, the project/job that produced it, and the event's LIST price in USD (a plan allowance may zero it on the invoice). Answer "what did project X cost this period?" with a query instead of summing your own quotes. Filter by projectId, jobId, and/or a [from, to) epoch-ms window. Requires the billing:read scope.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Period end, epoch milliseconds, EXCLUSIVE. | |
| from | No | Period start, epoch milliseconds, INCLUSIVE. | |
| after | No | Opaque cursor from the previous page's `pagination.nextCursor`. Forward-only. | |
| jobId | No | Only events produced by this job — how to answer "did my failed render post a charge?" for one run. | |
| limit | No | Page size (1..100), default 20. Out-of-range or unparseable clamps into the range. | |
| projectId | No | Only events attributed to this project. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No | Cursor pagination metadata. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint=false, so this description earns credit for adding real context: newest-first ordering, that the amount is the event's LIST price which a plan allowance may zero on the invoice, and the billing:read scope requirement. It does not discuss paging behavior beyond the cursor schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the ledger definition, then the usage motivation, then the filter and scope facts. Dense but each clause carries information; the parentheticals are load-bearing rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers ordering, attribution fields, price interpretation, filtering, auth, and pagination entry point. What remains unstated (paging loop behavior, empty-result semantics) is minor for a read-only list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description adds meaning on top: it frames projectId/jobId/[from,to) as the filter set and motivates jobId with the "did my failed render post a charge?" use case. It restates rather than extends the from/to inclusivity semantics already documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (the A2 usage ledger of metered billing events) with a clear scope (newest-first, attributed) and enumerates the fields returned. No sibling tool covers billing/usage, and the description makes the ledger's identity unmistakable without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete usage scenario ("what did project X cost this period?") and the intended method — query rather than summing quotes — plus the billing:read scope prerequisite and the filter axes. It stops short of naming when NOT to use it or a sibling alternative, but there is no competing billing tool to route against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_mediaImport MediaAInspect
Import a media item into your library from a public URL — the agent-friendly ingest path (single call, no upload protocol). Pass url (https) + filename (+ optional contentType). Returns { id, status:"importing" }. Processing is async: call wait_job(kind="media", id=mediaItemId), or register a webhook (create_webhook on media.completed — status: complete|failed rides the payload). Use the returned id with get_media_context, suggest_briefs, or as a composition source.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /media/import body. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-idempotent, non-destructive, open-world write; the description adds substantial context beyond them — the return shape {id, status:"importing"}, that processing is async, the exact polling/webhook completion path, and the webhook payload semantics (status: complete|failed). This is exactly the behavioral detail a mutating async tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then parameters, then return/async follow-ups; every clause carries signal (return shape, async path, webhook). Slightly dense with parenthetical em-dashes, but no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, return values need not be explained, yet the description still helpfully states {id, status:"importing"}. With async behavior, follow-up calls, and webhook semantics all covered, an agent has everything needed to invoke and chain this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description correctly notes url must be https and identifies the key fields, but it labels contentType as 'optional' while the schema marks it required (required: ["url","filename","contentType"]) — a material inconsistency that could lead an agent to omit a required field. It also omits the size/audioRole fields, which the schema itself documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Import a media item into your library') and immediately scopes it against the sibling upload path ('single call, no upload protocol'), distinguishing it from create_upload/finalize_upload/prepare_media. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames itself as the 'agent-friendly ingest path' vs. the upload protocol alternative, and names concrete follow-ups: wait_job(kind="media", id=...), create_webhook on media.completed, and downstream consumers (get_media_context, suggest_briefs, composition source). When-to-use and next-step routing are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_resourceImport ResourceAInspect
Import a stock candidate (candidateId from search_resources) into a project as an ORG-OWNED media item — provider/externalId/license provenance preserved, bytes deduped across orgs. Pass projectId + candidateId. Returns { id, status:"importing"|"ready" }; processing is async — call wait_job(kind="media", id=mediaItemId), then use the returned id as a composition source. Gated on the resource_import plan feature (402 billing_required if your plan lacks it). COST: 0 credits — search and import are both free for a keyed caller (get_account → entitlements.resource_import.listUsdPerUnit is 0); imported bytes count toward the storage gauge. 422 candidate_mismatch if the candidate expired — re-run search_resources.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /resources/import body — stock candidate lane { projectId, candidateId } OR curated pack lane { kind:"sfx-pack"|"music-pack", id }. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses async processing with the { id, status:"importing"|"ready" } shape, plan gating (402 billing_required), zero credit cost with the entitlements path, storage-gauge effect, provenance preservation, cross-org byte dedup, and the 422 candidate_mismatch failure mode. This is exactly the behavioral context annotations like readOnly/destructive cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and result before layering on async, gating, cost, and error detail, so each clause carries operational information. It is dense and long, but no sentence is pure filler; slightly tighter grouping of the error/cost notes would help.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with an output schema, it still supplies everything an agent needs to call it correctly: inputs, async follow-up via wait_job, downstream usage as a composition source, entitlement gating, cost, and recovery on failure. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the structured fields already document the body, giving a baseline of 3. The description still adds meaning by identifying candidateId's source (search_resources), the projectId pairing, and the dedup/provenance semantics of the import; it only omits the curated pack lane that the schema body description mentions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (import) and resource (a stock candidate keyed by candidateId from search_resources) and the exact resulting object (an ORG-OWNED media item in a project). This clearly separates it from siblings like import_media, select_candidate, and search_resources without the agent needing to open a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete workflow context: pull candidateId from search_resources, pass projectId + candidateId, then poll wait_job(kind="media"), and re-run search_resources on 422 candidate_mismatch. It does not explicitly state when to prefer import_media or select_candidate instead, so it is strong but not a full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_briefsList BriefsARead-onlyInspect
List briefs. DEFAULT shows human-authored briefs only; kind:"clip" shows the machine-minted clip briefs (suggest_briefs output), kind:"all" shows everything. Each carries its quote.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Which briefs to list. `authored` (default) = human-authored only; `clip` = the machine-minted clip briefs from suggest_briefs; `all` = both. | |
| after | No | Opaque cursor from the previous page's `pagination.nextCursor`. Forward-only. | |
| limit | No | Page size (1..100), default 20. Out-of-range or unparseable clamps into the range. | |
| projectId | No | Scope to one project. Omit for every brief in the org. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No | Cursor pagination metadata. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds only the default-filtering behavior and 'each carries its quote', but the filtering rule is already spelled out in the kind parameter's schema description, so little new behavioral context is added.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with the default behavior front-loaded and the mode variants enumerated compactly. Nothing is wasted, though the quoted enum values make it slightly dense to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, 100% schema coverage, and safety annotations, the description only needs to orient the agent, and it does so adequately by explaining the default-vs-variant list behavior. No critical aspect of calling this read-only list tool is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so kind, after, limit, and projectId are all fully documented in the schema, including default and clamping behavior. The description restates only the kind semantics and says nothing about pagination or projectId scoping, so it adds no meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List briefs') and immediately clarifies what subset of briefs is returned and the three modes available. It does not explicitly contrast with get_brief or suggest_briefs, but the kind semantics make the scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent what the default returns and when to reach for kind:"clip" vs kind:"all", which is genuine selection guidance among modes. It stops short of stating when to prefer a sibling like get_brief for a single record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_catalogList CatalogARead-onlyInspect
Use projection:'component-library' for the unified source-free library page, returned as complete JSON with exact scoped definition/preset/recipe cards and pagination. Choose origin:'builtin' for the maintained builtins or origin:'library' for the authenticated serving home; use libraryKind, category, q, limit and after to filter/page. Preserve each card identity.scope and identity.revision, its source/definition pin or exact recipe document identity; same names/IDs in different scopes remain distinct. Resolve the selected exact source with sourceVersionId (plus builtinCollection for an explicitly selected builtin), never a latest-head or another-home lookup. Presets identify their exact presetVersionId, definition pin and historical document witness; recipes identify their complete exact document and member source pins. This projection contains no source bodies or legacy thumbnail substitution. Omit projection for the historical catalog protocol below. DISCOVER WHAT TO BUILD WITH — list the component catalog: the built-in primitive catalog plus your org-installed components. Desktop also includes bundled kind:'component-package' entries: these are complete reusable authored packages; insert them with the desktop apply_template tool using placement.template and explicit insert.startTime/idPrefix, media bindings and parameter values. Do not pass their ids to clip.add, get_component_source, or cueframe://component resources. Their draft status does not certify visual review or licensing. For hosted builtin preset/recipe cards, call resolve_builtin_component with the exact collection, id and revision, then apply_template with template: and body:{projectId,documentSha256,insert:{startTime,idPrefix},...}. Hosted tool request fields live under body; desktop tool shapes may differ. The agent-safe default page is 20 entries; use pagination.nextCursor as after, or narrow with category, kind, tier, useCase, mood, q, or intent. Results are recommended-tier-first when filtered. Primitive/installed entries carry the exact placement hint for apply_composition and fixedCopy warnings; use get_component_source to fork a primitive when baked copy must change. Read cueframe://component/{id} for the full primitive/installed prop schema. SCENE SHOTS ARE NOT LISTED HERE: there is no built-in scene primitive, so do not look for one — author a shot with the scene.add op (see cueframe://scene-shot). The wrapper it registers then appears here as an ordinary INSTALLED component under these same rules.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Free-text match across id/name/description/intent/useWhen/tags/mood. Recommend-orders results. | |
| kind | No | Filter by render kind (component|transition|scene). | |
| mood | No | Filter to entries whose mood tags include this value (e.g. cinematic, minimal). | |
| tier | No | Filter by curation tier (recommended|standard|niche). | |
| after | No | Opaque cursor from a previous page's nextCursor (forward-only). | |
| limit | No | Page size (1..100). Omit to return the whole filtered catalog in one page. | |
| intent | No | Alias of `q` framed as recommend-by-intent (e.g. intent=intro). Recommend-orders results. | |
| origin | No | With component-library projection, builtin selects immutable builtin cards; library selects the authenticated org's exact serving datastore. | |
| useCase | No | Filter to entries whose useCase includes this edit role (e.g. intro, title-over-footage, grade). | |
| category | No | Filter to one category bucket (text|effects|transitions|layouts|backgrounds|ui-blocks|scenes). | |
| projection | No | ||
| libraryKind | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=false, and the description adds substantial context beyond that: 'no source bodies or legacy thumbnail substitution,' the draft-status disclaimer about visual review/licensing, default page size of 20 with forward-only cursor pagination, and recommended-tier-first ordering. This is far richer than the safety-only annotation profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is bloated, cramming two protocols, identity-pinning rules, package-handling, scene-shot exclusions, and tool routing into one dense block. The core purpose appears mid-way rather than up front, and the caps-lock 'DISCOVER WHAT TO BUILD WITH' framing is gimmicky. It is not appropriately sized or front-loaded for a list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns, and it does describe card shape (identity.scope/revision, preset/recipe identities) and pagination via nextCursor. For a 12-parameter, zero-required tool with two modes, the coverage is broad and mostly sufficient, though the two divergent protocols make it hard to tell which fields apply when.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema already documents nearly every parameter and the baseline is 3. The description mostly enumerates filter params (category, kind, tier, useCase, mood, q, intent) that the schema already covers, and it references sourceVersionId and builtinCollection, which do not appear in the input schema at all. It adds little parameter meaning beyond the structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource and scope: 'DISCOVER WHAT TO BUILD WITH — list the component catalog: the built-in primitive catalog plus your org-installed components.' It also distinguishes itself from siblings by explicitly saying not to pass package ids to clip.add, get_component_source, or cueframe://component resources. The primary statement of purpose is buried mid-description behind two projection-mode sentences, which weakens the front-loaded clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use routing: origin:'builtin' vs origin:'library', when to call resolve_builtin_component then apply_template, and when to use get_component_source to fork a primitive. It also names an exclusion — scene shots are not listed here and should be authored with scene.add instead. Alternatives and conditions are spelled out, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_checkpointsList CheckpointsARead-onlyInspect
List checkpoint packets newest-first (filter with composeJobId for one run's v1→vN gate history, or projectId). The version stack with per-version status + decisions IS the review history — nothing is deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Opaque cursor from the previous page's `pagination.nextCursor`. Forward-only. | |
| limit | No | Page size (1..100), default 20. Out-of-range or unparseable clamps into the range. | |
| projectId | No | Scope to everything reviewable in one project. | |
| composeJobId | No | Scope to ONE compose run — its v1→vN gate history with per-version status and decisions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No | Cursor pagination metadata. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavioral context beyond that: results are newest-first, the version stack with per-version status and decisions constitutes the retained review history, and nothing is deleted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with the primary action and ordering front-loaded, and parenthetical scoping kept brief. The em-dash aside on review history is dense but earns its place by clarifying retention.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full schema coverage, and annotations carrying the safety profile, the description supplies the remaining essentials: ordering, scoping intent, and retention behavior. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents after, limit, projectId, and composeJobId including cursor semantics and clamping. The description slightly enriches composeJobId/projectId intent but adds no syntax or format detail beyond the schema — the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List checkpoint packets') plus a result ordering ('newest-first'), and the scoping parameters make clear this is a collection query rather than a single fetch. An agent can distinguish it from the sibling get_checkpoint without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the two meaningful use contexts: composeJobId for a single run's v1→vN gate history, projectId for everything reviewable in a project. It never explicitly contrasts with get_checkpoint or states when listing is unnecessary, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_compositionsList CompositionsARead-onlyInspect
List every composition (video) in a project, with its format and which one is active. Use a returned compositionId with create_render(compositionId=...) to render a specific video, or apply_composition to edit it.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | projectId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description goes further by disclosing the workflow role (supplying compositionIds for create_render/apply_composition) and what data distinguishes entries (format, active flag). It does not cover pagination or auth, but the added chaining context is meaningful given the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core purpose front-loaded and the chaining guidance second; no filler, no redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema defining return shape and full annotation coverage, the description supplies everything needed to call it correctly and route its output. Nothing an agent requires is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single required projectId, so the schema already carries parameter meaning. The description adds nothing about the parameter's format or source, matching the baseline of 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (compositions/videos), scopes it to a project, and clarifies terminology via '(video)'. It contrasts naturally with the singular get_composition sibling by specifying 'every composition in a project' plus format and active status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names concrete alternatives for downstream steps: use the returned compositionId with create_render for rendering or apply_composition for editing. This gives clear chaining context, though it never states when this tool should be avoided in favor of get_composition or other lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_criticsList CriticsARead-onlyInspect
List registered critics: criticId, label, tier (rules|rubric|evaluator), phase, floor, referenceMediaIds. Rubric text / rules / evaluator URLs are write-only — never echoed. Manage with register_critic (upsert) / delete_critic.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| critics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds a genuinely useful behavioral fact beyond that: rubric text, rules, and evaluator URLs are write-only and never echoed in output, which prevents the agent from expecting those fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact clauses, front-loaded with the list verb and field set, followed by the write-only caveat and the management routing. Every clause carries information; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not strictly required, yet the description still summarizes key fields and the crucial write-only caveat. Combined with the sibling routing, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero input parameters, so the baseline is 4. The description instead documents output fields (tier enum, phase, floor, referenceMediaIds), which is useful though technically beyond input semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List registered critics") and enumerates the returned fields (criticId, label, tier, phase, floor, referenceMediaIds). It is clearly distinguishable from the sibling management tools register_critic and delete_critic, which are named directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description routes write operations to register_critic (upsert) and delete_critic, giving the agent clear context for the read/write split. It does not state an explicit when-to-use trigger for listing itself, but for a zero-arg list tool the implied usage is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mediaList MediaARead-onlyInspect
List the media in your CueFrame library. Filter a real library with kind (video|audio|image|gif|asset|source|stock), source (upload|generated|import-url|stock), or tag — so you find YOUR footage, not e2e debris. Returns media item IDs and metadata; use an ID with get_media_context, suggest_briefs, or as a composition source.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Filter to items carrying this EXACT tag (not a prefix or substring match). | |
| kind | No | Filter to one media kind. | |
| after | No | Opaque cursor from the previous page's `pagination.nextCursor`. Forward-only. | |
| limit | No | Page size (1..100), default 20. Out-of-range or unparseable clamps into the range. | |
| source | No | Filter by how the item entered the library. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No | Cursor pagination metadata. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that: it declares the return shape (IDs + metadata) and the concrete downstream tools that consume an ID. Pagination behavior is left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and resource, then filters, then return/downstream payoff. Nothing redundant and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description isn't obligated to explain returns, yet it still names the ID/metadata payload and its consumers. Combined with full schema coverage and clear annotations, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five params (kind, source, tag, after, limit) are already documented, including the exact-tag semantics and cursor clamps. The description only restates kind/source/tag without adding syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) and resource (media in your CueFrame library), with scope made concrete via the 'YOUR footage, not e2e debris' framing. It doesn't name the nearby listing/search siblings (list_catalog, search_resources) it could be confused with, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context for use: filter by kind/source/tag to find your own footage, and the returned ID feeds get_media_context, suggest_briefs, or composition sources. Downstream routing is well covered, but no explicit statement of when to prefer this over list_catalog/search_resources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_plansList PlansARead-onlyInspect
List the plan catalog (tiers, intervals, product ids, prices) BEFORE a checkout, so create_checkout requests a real {plan, interval} instead of guessing an id. No args — reads the platform catalog.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| plans | No | Every purchasable {tier, interval} and its product id. |
| billingConfigured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety and reach profile is covered. The description adds 'No args — reads the platform catalog,' but that is largely a restatement of the empty schema and the readOnly hint, and it says nothing about catalog stability or size. Adequate but not additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero waste: the verb and payload come first, then the usage trigger and its rationale. Nothing is repeated or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the annotations cover the safety profile; the description supplies the pre-checkout context that is the only real complexity here. It is nearly complete, with the only omission being any disambiguation from the sibling list_catalog.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to document and the baseline is 4. The description's 'No args' note correctly reinforces the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (List) and resource (the plan catalog), and enumerates the payload contents (tiers, intervals, product ids, prices), so an agent knows exactly what comes back. It does not differentiate itself from the similarly named sibling list_catalog, which is the one gap keeping this from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call it ('BEFORE a checkout') and wires that to the concrete downstream consumer, create_checkout, explaining the consequence: requesting a real {plan, interval} instead of guessing an id. That is a named trigger plus a named alternative-to-avoid, exactly what this dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList ProjectsBRead-onlyInspect
List your projects — re-orient in an existing workspace instead of minting duplicates (steady-state entry, A9). Each row carries the id every other tool needs.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Opaque cursor from the previous page's `pagination.nextCursor`. Forward-only. | |
| limit | No | Page size (1..100), default 20. Out-of-range or unparseable clamps into the range. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No | Cursor pagination metadata. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds one behavioral hint — 'Each row carries the id every other tool needs' — but says nothing about ordering, pagination behavior, or result volume beyond what the schema and output schema already provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences and front-loaded, which is good, but the parenthetical '(steady-state entry, A9)' is internal shorthand that spends tokens without informing an agent. Roughly half the text earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema, a declared output schema, and annotations covering the safety profile, the description only needed to orient the agent — which it does by positioning the call as the steady-state entry point and noting the id payload. Nothing essential is missing, though naming the read-only, non-mutating nature explicitly would have rounded it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so 'after' (opaque forward-only cursor) and 'limit' (1..100, default 20, clamping) are already fully documented in the schema. The description contributes nothing parameter-specific, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opener 'List your projects' is a clear verb+resource, and 're-orient in an existing workspace instead of minting duplicates' implicitly distinguishes it from create_project. The internal jargon '(steady-state entry, A9)' adds no meaning for an agent and slightly muddies an otherwise clean statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gestures at when to reach for this tool ('re-orient in an existing workspace instead of minting duplicates'), which is useful context, but it never names an alternative sibling (create_project, list_briefs, list_compositions) or states an explicit when-not condition. Usage remains inferable rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_render_fontsList Render FontsARead-onlyInspect
The fonts the RENDERER can actually draw — read this BEFORE authoring type, not after a refusal. Per family: the exact family name authoring accepts, the weight RANGES a shipped file declares (a static face has min===max; a variable face gives its axis range), the caption default weights, and whether the bytes are bundled or an aliased metric-compatible stand-in. Anything listed here passes validation by construction: it is derived from the same table the font gate refuses by. Two facts worth reading off it — every family's styles is ["normal"], because NO bundled family ships an italic FILE (a real italic comes only from a brand-kit font asset), and a weight outside every range is REFUSED, never synthesised. Contrast search_fonts, which searches the GOOGLE catalog and will happily return families the renderer cannot draw. manifestVersion identifies this exact face table; record it beside a composition to state what a font choice was validated against. Covers the bundled set only — a brand kit's sealed faces are per-org and per-render. No args, read-only, free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| families | No | |
| manifestVersion | No | Identifies this exact face table. Derived from the table's own content, so it moves when and only when the admitted set moves. Record it beside a composition to state which face table a font choice was validated against. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover read-only/open-world status, but the description adds real substance beyond them: results pass validation by construction (same table the font gate refuses by), every family's styles is ['normal'] because no bundled italic files ship, out-of-range weights are refused rather than synthesised, and the bundled-only scope excludes brand-kit faces. These are non-obvious behavioral facts an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the search_fonts contrast are front-loaded, and the setup guidance precedes the field explanations. It is dense and largely earns its length, though the prose is heavier than strictly necessary for a no-arg list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still frames what the result means operationally (validation-by-construction, manifestVersion as a provenance record, brand-kit exclusion). Combined with the usage routing, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline is 4. The description instead describes the returned fields (family name, weight ranges with static min===max semantics, caption defaults, bundled vs aliased bytes), which is useful but belongs to output rather than parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('the fonts the RENDERER can actually draw') and immediately contrasts it with the sibling search_fonts, which returns Google-catalog families the renderer cannot draw. An agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to read it 'BEFORE authoring type, not after a refusal', and names the alternative (search_fonts) plus the condition that separates them. When-to-use and when-not-to-use are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
new_compositionNew CompositionAInspect
Create a NEW composition (a new video) inside a project — a project is a workspace that holds many videos. Returns { compositionId, format, etag }. Pass an optional name and format (aspectRatio/fps/resolution); format defaults to the project's compositionFormat. The first composition becomes the project's active default. To author it, seed with apply_composition then compose({ fromComposition: true }) — your authored graphics ride as locked clips, carried verbatim; to render a specific one, pass its compositionId to create_render. (For a reframed sibling in another aspect, use derive_composition.)
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /projects/:id/compositions body — create a new video (composition) in the project. `format` defaults to the project's compositionFormat when omitted. | |
| projectId | Yes | projectId (path). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: the return shape ({ compositionId, format, etag }), that format defaults to the project's compositionFormat, that the first composition becomes the project's active default (a side effect), and that authored graphics ride as locked clips carried verbatim. It does not cover permission/auth requirements, but annotations already carry the mutation/idempotency profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then returns, then defaults, then the authoring/render workflow, then sibling routing — good ordering. It is dense with stacked parentheticals, which costs some readability, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter create tool with no output schema, the description supplies the return shape, the default behavior, the side effect, and the correct follow-up calls. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description earns above it by explaining the default-fill semantics of format ('defaults to the project's compositionFormat'), which the schema itself does not state. It maps the format sub-fields (aspectRatio/fps/resolution) but adds no detail on the platform field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a NEW composition') and immediately defines the domain term ('a new video ... inside a project — a project is a workspace that holds many videos'). It also names the sibling it is not (derive_composition for reframed siblings), so an agent can distinguish it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit downstream routing: author with apply_composition + compose({fromComposition: true}), render via create_render with the compositionId, and use derive_composition for a different aspect ratio. Both the 'use this when' and the 'use sibling instead when' cases are stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_mediaPrepare MediaAIdempotentInspect
Prepare the perception artifact an authored edit needs BEFORE sighted review. Pass body.kind="subjectTrack" for face/active-speaker reframing, or body.kind="matte" for a true zPlane:"behind-subject" graphic. Pass body.intent {startSec,endSec} using SOURCE time (the media trim, not timeline time); it is required for mattes and strongly recommended for subject tracks so the prepared fact exactly matches the clip and quote. This is the supported product path — never accept a preview that silently flattens depth or ignores speaker tracking. Returns a fact receipt; with intent, poll get_media_facts using the same kind/window until exact.state is ready; without intent, omit all three filters and find the whole-source subjectTrack in facts until status is ready (failed is terminal). Existing pending/ready facts are reused without another charge.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /media/:id/facts body. | |
| mediaItemId | Yes | mediaItemId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| factId | No | |
| status | No | |
| quotedUsd | No | |
| alreadyExisted | No | True when this exact fact was already pending or ready. Nothing was dispatched and nothing will be charged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, idempotentHint=true) only reveal that this is a non-destructive write. The description adds substantial context: it returns a fact receipt, requires polling get_media_facts, that 'failed is terminal', and that existing pending/ready facts are reused without another charge. That cost and async-state detail goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, and the dense sentences each carry operational information. However it is one long run-on paragraph, and the polling/status instructions at the end are cramped, making it harder to scan than an ideally structured definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex async tool with nested body, an output schema, and a cost model, the description covers the full lifecycle: what each kind does, the required/recommended intent, the receipt return, and how to poll until ready. Nothing an agent needs to invoke and follow up correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents kind and intent. The description nonetheless reinforces the critical semantic that intent is SOURCE time (media trim, not timeline time), which disambiguates a genuinely confusing coordinate space beyond the raw schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource — preparing a perception artifact (subjectTrack or matte) for an authored edit before sighted review. It clearly enumerates the two artifact kinds and their outcomes, so an agent can distinguish the operation. It doesn't explicitly name sibling tools it competes with, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit selection criteria: use kind=subjectTrack for face/active-speaker reframing, kind=matte for a behind-subject graphic. It states when intent is required (mattes) versus recommended (subject tracks), and explicitly routes the agent away from the wrong path with 'never accept a preview that silently flattens depth'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_cardPreview CardARead-onlyIdempotentInspect
Render ONE authored card on its own and SEE it, before placing it in a composition. Pass the same html (+ optional tokens) you would put in a {kind:"card"} clip; you get the still back as an image. Use this while writing a card — it is the fast loop for catching type that overflows the frame, a headline that collides with a logo, or tokens that did not resolve. Sized to the format you name, so what you see is what that aspect ratio will show. To judge MOTION rather than layout, shell the card with a motion preset and use preview_clip.
| Name | Required | Description | Default |
|---|---|---|---|
| html | Yes | The card markup, exactly as it would appear in a {kind:"card"} clip source. | |
| tokens | No | Token substitutions the html references (e.g. brand colours, fonts). Same shape as the clip source `tokens`. | |
| projectId | Yes | projectId (path) — the card is rendered inline; nothing is persisted to the project. | |
| aspectRatio | No | Frame to size the card into. Default 9:16 — a card that fits 16:9 often overflows vertical. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. Beyond that the description discloses the return form ('you get the still back as an image') and that output is sized to the named format so the preview matches the real aspect ratio — useful behavior not encoded elsewhere, though it does not discuss cost or latency of a render.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the usage loop, then the alternative. Four sentences, each carrying distinct information (what, when, what you see, when to use something else) with no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers the return value (a still image), the failure modes it is meant to catch, and the relationship to composition clips. For a 4-parameter read-only preview tool, nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real meaning on top: it tells the agent to pass the SAME html and tokens as a {kind:"card"} clip (a semantic link to composition authoring), and notes the aspect ratio sizes the frame with 9:16 as the safer default for vertical cards.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — render ONE authored card standalone and get the still back as an image — and explicitly scopes it against siblings by naming preview_clip for motion. An agent can distinguish it from preview_clip, preview_component and preview_frame from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when: 'Use this while writing a card — it is the fast loop for catching overflow, collisions, or unresolved tokens.' It also gives the when-not with the alternative named: 'To judge MOTION rather than layout, shell the card with a motion preset and use preview_clip.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_clipPreview ClipAInspect
Render a scoped, cheap MOTION preview — ONLY body.fromSec→body.toSec of the composition (max 60s) at preview quality (capped resolution, lighter encode) through the real render pipeline. THE way to judge motion — a cut, a transition, a component's animation — at full fidelity BEFORE paying for a full render (a still cannot show motion; a full render costs the export). ASYNC: returns a render job; wait_job(kind="render", id=renderId) or a render.completed webhook for the URL. Meters the capture feature, never an exports credit.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /projects/:id/preview-clip body. | |
| projectId | Yes | projectId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| error | No | Human-readable failure message. Pair with `errorCode` for a stable, machine-readable code an agent runner can branch on. |
| status | No | |
| listUsd | No | A2 money stamp: the metered event's LIST price (USD), stamped at the success terminal (exports for deliverable renders, compose_capture for A8 previews). A plan allowance may zero the actual invoice line — this is the list price, never a Stripe charge. Absent while running, on failure, and for x402 orgs (on-chain receipts). Mirrors the get_usage ledger. |
| category | No | Failure taxonomy when status is `error`; null otherwise. `authoring` = deterministic defect in YOUR composition/request — fix it, retrying is futile; `transient` = temporary pipeline/infra failure — safe to retry_render; `internal` = unexpected server fault — retry once then escalate. Mirrors the render.failed webhook's `category`. |
| progress | No | Non-terminal render progress; phase is one of the worker's emitted stages. |
| warnings | No | Non-fatal advisories surfaced at render-CREATE (omitted when none, and on GET — create-time only). |
| createdAt | No | |
| errorCode | No | Stable, machine-readable error code (e.g. `render_pipeline_unavailable`, `render_route_missing`, `render_pipeline_failed`). Null when status is not `error` or unavailable for an older render. |
| outputUrl | No | |
| retryable | No | Whether re-attempting the SAME render can succeed (status `error`); null otherwise. true → call retry_render. false → deterministic (category authoring/internal); fix the composition first — retry_render alone reproduces it. Mirrors the render.failed webhook's `retryable`. |
| updatedAt | No | ISO-8601 timestamp of the render's most recent progress update. Compute staleness = now − updatedAt to distinguish a wedged render from a slow one and decide whether to wait, cancel, or retry. |
| errorDetails | No | Structured failure context — `{ targetUrl?, upstreamStatus?, upstreamCode?, attemptedAt? }`. Surfaced so agent runners can distinguish operator-config issues from upstream-down vs route-missing without parsing `error`. |
| outputExpiresAt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare only the generic profile (not read-only, not idempotent); the description supplies what they cannot: it is ASYNC and returns a render job, with two completion paths (wait_job(kind="render", id=renderId) or a render.completed webhook), and it meters the capture feature rather than an exports credit. That is exactly the extra context annotations leave out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core scope, then the motivation, then the async contract and billing — a good information order and no filler sentences. The heavy capitalization and em-dash stacking make it denser to parse than necessary, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need no explanation, and the description still fills the remaining gaps: duration cap, async completion mechanism, and which quota is consumed. For a mutating, job-returning tool with a nested body this is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, and the description maps the parameters to their domain role (body.fromSec→body.toSec as a window) while adding a constraint the schema does not encode: the 60s maximum duration. It does not explain compositionId's default/override behavior, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (render a motion preview) with explicit scope: only body.fromSec→body.toSec, max 60s, at capped preview quality through the real render pipeline. It distinguishes itself from sibling tools by name and effect — a still (preview_frame) cannot show motion, a full render (create_render/export) costs an export credit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'THE way to judge motion — a cut, a transition, a component's animation — at full fidelity BEFORE paying for a full render', with the alternatives (still, full render) named and their costs stated. An agent knows exactly when to pick this over the frame/still and full-render paths.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_componentPreview ComponentAIdempotentInspect
Queue a typed preview artifact for ONE org-installed component — ASYNC: returns a jobId immediately; then wait_job(kind="preview", id=jobId). The preview and production compositor consume the same content-addressed component bundle and verified artifact contract. body.componentId selects the component; pass body.params to render it with props (the mount's params); declared manifest slots are bound separately and reach the scene's assets, never params. Admission/runtime/capability failures land on the job terminal with sanitized author-fixable messages. Idempotent per immutable render key.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| projectId | Yes | projectId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Job family, e.g. `verify` | `preview` | `brand_kit_extract`. |
| jobId | No | Poll GET /v1/jobs/{jobId} / wait_job until terminal. |
| jobKey | No | Deterministic identity of the work (content hash of every input the result depends on). Re-enqueueing the same key returns the same job while it runs; a failed key revives as a fresh attempt. |
| status | No | running on a fresh/deduped enqueue; succeeded when an identical request already completed. Cancelled is part of the shared status vocabulary; identical cancelled work revives to running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true), and the description adds real behavioral context: async job semantics, that failures 'land on the job terminal with sanitized author-fixable messages,' and idempotency 'per immutable render key.' It stops short of auth/rate-limit or timing details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and async contract, and every sentence carries non-obvious information (slot binding, failure terminal, idempotency). It is dense and slightly long, but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description does cover input semantics, async flow, failure modes, and idempotency. It is complete for a job-queueing tool, with only sibling differentiation left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 50% schema coverage, the description compensates by explaining `body.componentId` selects the component, `body.params` renders props, and manifest slots bind to `assets` and 'never params' — a distinction the schema does not make. It does not cover the numeric fps/width/height/durationInFrames params, which the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Queue a typed preview artifact') and resource ('ONE org-installed component'), and its 'preview ... component' framing distinguishes it from sibling preview tools like preview_card, preview_clip, and preview_frame.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes the async workflow — 'returns a jobId immediately; then wait_job(kind="preview", id=jobId)' — so the agent knows the required follow-up call. It does not, however, name when to prefer it over the sibling preview_* tools or state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_framePreview FrameAIdempotentInspect
Queue durable still-frame evidence for layout/copy judgment. Returns immediately with {jobId, kind:'preview_frame', status}; then call wait_job(kind="preview_frame", id=jobId) to receive every presigned frame as an image. The immutable snapshot records geometry, layers, warnings, and whether the target was persisted, inline, or session scratch. A still cannot prove motion — use preview_clip or preview_component for animation.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| projectId | Yes | projectId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Job family, e.g. `verify` | `preview` | `brand_kit_extract`. |
| jobId | No | Poll GET /v1/jobs/{jobId} / wait_job until terminal. |
| jobKey | No | Deterministic identity of the work (content hash of every input the result depends on). Re-enqueueing the same key returns the same job while it runs; a failed key revives as a fresh attempt. |
| status | No | running on a fresh/deduped enqueue; succeeded when an identical request already completed. Cancelled is part of the shared status vocabulary; identical cancelled work revives to running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (which only say non-destructive, idempotent, non-open-world), the description discloses that the call is asynchronous and returns immediately with a job handle, that the snapshot is immutable, and what the snapshot records (geometry, layers, warnings, persistence source). This is exactly the behavioral context the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the return contract, the snapshot semantics, and finally the sibling exclusion. Every sentence is load-bearing, though the snapshot-contents sentence is dense enough that it borders on over-packing for a short description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the async handoff, the follow-up tool, and the alternative tools, and an output schema exists so return-value detail need not be duplicated here. Nothing an agent needs to invoke this correctly and consume the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds no per-parameter guidance — nothing about timestamps batching, scale, image format, or composition selection — so the schema's own rich field descriptions do all the work. The only implied mapping is the 'persisted, inline, or session scratch' phrase touching on composition/session_id semantics. With ~50% declared coverage, this is an unambitious but adequate baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('queue durable still-frame evidence') plus the intent ('for layout/copy judgment'), and explicitly separates itself from preview_clip/preview_component for animation. An agent can route between the three preview tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('layout/copy judgment'), an explicit when-not ('A still cannot prove motion'), and names the correct alternatives (preview_clip, preview_component). It also tells the agent the required follow-up call (wait_job with kind/id), so the workflow is not left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_criticRegister CriticAIdempotentInspect
Register a custom eval into the compose critic panel — the critic contract is { rubric (or rules/evaluator), referenceMediaIds?, floor }. Three tiers: rules (declarative constraints — keep-out regions, required elements, max overlays, brand colors), rubric (a text criterion scored by the judge as an extra column), or evaluator (your HTTPS webhook — CueFrame POSTs the composition+stills+facts, you return { score, critique }). referenceMediaIds (≤6 org media ids) attach YOUR reference frames as the standard — the judge scores candidates for consistency with them, so "indistinguishable from mine" is a machine check. Lane scope: rules + rubric critics run in BOTH lanes (the Director's gates AND standalone score_composition); evaluator webhooks run in the Director lane only. Use phase 'static' (the default) — 'temporal' (final-render evaluation) is accepted but not yet wired, so a temporal critic produces no verdicts today. A low client score drives a refine like a built-in criterion. You see your eval output + our scores, never our rubric. Re-registering the same criticId upserts (list_critics / delete_critic manage the set). Evaluator tier returns a signing secret ONCE.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Register a custom compose critic. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| tier | No | |
| secret | No | evaluator tier: Standard-Webhooks signing secret, returned ONCE. |
| criticId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the write/idempotent/safety profile, but the description adds real behavior: re-registration upserts, low client score drives a refine, the client sees its output+our scores but never our rubric, and the evaluator tier returns a signing secret only ONCE. These are non-obvious operational facts beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and contract before tier details; every clause carries information. It is dense and long, requiring careful reading, but there is little redundancy given the genuine complexity of three tiers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description still covers tier differences, lane scope, phase caveats, upsert behavior, secret delivery, and visibility limits. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so baseline is 3, but the description meaningfully enriches semantics: it explains the critic contract shape (rubric/rules/evaluator), what referenceMediaIds actually do ('indistinguishable from mine' as a machine check, ≤6 ids), floor's refine-routing behavior, and what the evaluator webhook receives and returns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Register a custom eval into the compose critic panel') and immediately distinguishes the three tiers it can create. Names sibling managers (list_critics / delete_critic), so an agent can place it precisely in the toolset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use routing: rules vs rubric vs evaluator, plus lane scope (rules+rubric in both lanes, evaluator Director-lane only). It also warns when NOT to use a feature ('temporal' is accepted but not wired, produces no verdicts today) and points to alternatives for managing the set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repin_componentRepin ComponentAInspect
Move clips that pin a retired TSX (version 3) component to its native (version 4) successor: the successorSourceVersionId that get_composition's needsUpgrade (or a component_source_retired refusal) names. Pass projectId and, in body, optional clip_ids (omit them to move every clip that has a successor) and composition_id (the active composition when omitted). Saved inputs are kept. The answer lists moved and withoutSuccessor; rebuild the latter as native components (create_component, then apply_composition at the same timing and placement).
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| projectId | Yes | projectId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| etag | No | |
| moved | No | |
| withoutSuccessor | No | Clips pinning a retired TSX source no curated release shipped: rebuild them as native components. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the mutation/safety profile (readOnlyHint=false, destructiveHint=false), so the bar is lower. The description adds real value beyond that: saved inputs are kept, and an empty/omitted clip_ids moves every eligible clip. It does not address idempotency or failure/partial-move semantics, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and the successor identifier before moving into parameters and the follow-up workflow. Dense with colon-heavy clauses, but each sentence carries actionable content rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation with a nested body and an output schema, the description covers the trigger, parameter behavior, preserved state, and the downstream remediation workflow. An agent has everything needed to call it and handle both moved and withoutSuccessor outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, and the description compensates by explaining both body parameters: clip_ids (omit to move every clip with a successor) and composition_id (the active composition when omitted). projectId is left to the schema's '(path)' note. This meaningfully fills the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: moving clips that pin a retired TSX (v3) component to its native (v4) successor. It names the exact sibling signals (get_composition's needsUpgrade, component_source_retired refusal) that identify this task, so an agent can distinguish it from update_component, create_component, and apply_composition immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the trigger condition (needsUpgrade / component_source_retired refusal) and the follow-up path for the withoutSuccessor results (create_component then apply_composition at the same timing and placement). The when-to-use, what-to-do-with-output, and sibling handoffs are all spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_builtin_componentResolve Builtin ComponentARead-onlyInspect
Resolve a selected builtin component-library card using its exact collection, id and revision. Returns the canonical pinned document and source snapshots for a preset or recipe, or the exact source for a definition. Preserve documentSha256 and all identities; a missing revision refuses without falling back to another version or scope. Resolve before apply_template; do not invent wrapper source or reconstruct a package from a thumbnail.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| revision | Yes | ||
| collection | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| card | No | |
| preset | No | |
| source | No | |
| sources | No | |
| document | No | |
| documentText | No | |
| documentSha256 | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: it discloses the two return shapes, the requirement to preserve documentSha256 and all identities, and the strict no-fallback refusal on a missing revision. That last point is the key operational behavior an agent would otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then outputs, then the identity/refusal constraints, then routing to apply_template. Every sentence carries information, though the clause 'do not invent wrapper source or reconstruct a package from a thumbnail' is dense and could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-required-param read tool with an output schema and both annotations present, the description covers purpose, ordering relative to apply_template, failure behavior, and identity preservation. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden. It names all three parameters and stresses 'exact' plus the no-fallback semantic for revision, but it never explains what collection scopes over or how id/collection are obtained (e.g., from a catalog card), and the sha256 pattern only exists in the schema. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (resolve) plus resource (builtin component-library card) and the exact inputs used to do it, then distinguishes the two output shapes: 'canonical pinned document and source snapshots for a preset or recipe' versus 'the exact source for a definition'. This is clearly separable from siblings like preview_component, get_component_source, and repin_component.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing ('Resolve before apply_template') plus two anti-patterns ('do not invent wrapper source or reconstruct a package from a thumbnail') and a failure rule (a missing revision refuses rather than falling back to another version or scope). The agent knows both when to call this and what not to do instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resumeResumeAInspect
Answer the checkpoint packet wait_job reported as awaiting_input (its {checkpointId} — read the packet FIRST with get_checkpoint and relay the stills + money triple to your human). ONE body.decision per gate: 'approve' (proceed; comments allowed — they record as taste without gating), 'revise' (the director revises per your body.comments [{anchor: {beatId}|{timecodeMs}, verdict: 'approve'|'revise'|'lock', note}] and/or body.edits, then RE-PRESENTS this same gate as a new packet — in-job, no new charge; the brief quote states the included revision cycles, beyond them revise is refused 402), or 'abandon' (end the run — the only terminal refusal). 'lock' freezes an element contractually: the director touching it surfaces as a lock_violation verdict on the next packet. On approve/revise the Director rehydrates its warm box and continues; then wait_job again.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /checkpoints/:id/resume body — the A1 review grammar. | |
| checkpointId | Yes | checkpointId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety profile (readOnly false, destructive false, idempotent false); the description adds substantial behavioral context they cannot carry — the included revision cycle, the 402 refusal beyond the brief quote, in-job re-presentation with no new charge, lock_violation surfacing, and abandon as the only terminal refusal. This is well beyond annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the packet-first prerequisite are front-loaded, and nearly every clause carries operational information. It is dense and heavily parenthetical, which costs some readability, but there is little filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-branch mutation gate with an output schema present, the description covers the full decision lifecycle, the refusal mode, and the next tool to call, so an agent needs nothing else to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description nonetheless adds consequence-level meaning to the decision enum (approve records comments as taste without gating, revise re-presents the same gate in-job, abandon terminates) and to lock semantics that go beyond the schema's own text. The remaining schema-documented fields (edits, comments anchors) are adequately covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — 'Answer the checkpoint packet wait_job reported as awaiting_input' — and immediately distinguishes itself from siblings get_checkpoint (read the packet) and wait_job (the source that signals awaiting_input). An agent can identify this as the resume-the-gate tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use (a packet reported awaiting_input), a prerequisite workflow (read the packet FIRST with get_checkpoint, relay stills + money triple to the human), and explicit follow-up ('then wait_job again'). The revise/lock/abandon branches are each given the condition that selects them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retry_renderRetry RenderAInspect
Re-render an existing render job's FROZEN composition snapshot — it inherits that job's exact composition/intent/priority and queues a fresh renderJob; it does NOT re-read the project's current composition. So it only helps a TRANSIENT failure (the failed render's retryable:true / category:"transient" — a flaky pipeline/infra fault): re-attempting the same snapshot may succeed. For a DETERMINISTIC failure (retryable:false / category:"authoring" — a bad param, an unresolvable media/brand ref), retry_render reproduces the SAME failure: FIX the composition first via apply_composition, then create_render (a retry alone is futile). Check retryable on getRender / wait_job to pick the path. Returns the new render; then wait_job(kind="render", id=).
| Name | Required | Description | Default |
|---|---|---|---|
| renderId | Yes | renderId (path). | |
| projectId | Yes | projectId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| error | No | Human-readable failure message. Pair with `errorCode` for a stable, machine-readable code an agent runner can branch on. |
| status | No | |
| listUsd | No | A2 money stamp: the metered event's LIST price (USD), stamped at the success terminal (exports for deliverable renders, compose_capture for A8 previews). A plan allowance may zero the actual invoice line — this is the list price, never a Stripe charge. Absent while running, on failure, and for x402 orgs (on-chain receipts). Mirrors the get_usage ledger. |
| category | No | Failure taxonomy when status is `error`; null otherwise. `authoring` = deterministic defect in YOUR composition/request — fix it, retrying is futile; `transient` = temporary pipeline/infra failure — safe to retry_render; `internal` = unexpected server fault — retry once then escalate. Mirrors the render.failed webhook's `category`. |
| progress | No | Non-terminal render progress; phase is one of the worker's emitted stages. |
| warnings | No | Non-fatal advisories surfaced at render-CREATE (omitted when none, and on GET — create-time only). |
| createdAt | No | |
| errorCode | No | Stable, machine-readable error code (e.g. `render_pipeline_unavailable`, `render_route_missing`, `render_pipeline_failed`). Null when status is not `error` or unavailable for an older render. |
| outputUrl | No | |
| retryable | No | Whether re-attempting the SAME render can succeed (status `error`); null otherwise. true → call retry_render. false → deterministic (category authoring/internal); fix the composition first — retry_render alone reproduces it. Mirrors the render.failed webhook's `retryable`. |
| updatedAt | No | ISO-8601 timestamp of the render's most recent progress update. Compute staleness = now − updatedAt to distinguish a wedged render from a slow one and decide whether to wait, cancel, or retry. |
| errorDetails | No | Structured failure context — `{ targetUrl?, upstreamStatus?, upstreamCode?, attemptedAt? }`. Surfaced so agent runners can distinguish operator-config issues from upstream-down vs route-missing without parsing `error`. |
| outputExpiresAt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), and the description goes well beyond them: it discloses the frozen-snapshot inheritance, that a fresh renderJob is queued, the failure-category model, and the follow-up wait_job(kind="render", id=<new id>) call. This is exactly the behavioral context an agent needs to avoid a futile retry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded — the core frozen-snapshot behavior and the transient/deterministic fork come first. Length is justified by the routing complexity, though the parallel parenthetical restatements of the failure categories are slightly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation isn't required, yet the description still closes the loop by noting it returns the new render and that wait_job should follow. Combined with the annotations, an agent has everything needed to invoke and sequence it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both params are simple path identifiers, so the schema already documents them. The description adds only implied context (renderId refers to a failed render whose retryable flag should be inspected) but no format or syntax detail. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and immediately pins down the semantics that distinguish it: it re-renders a FROZEN snapshot and explicitly does NOT re-read the project's current composition. This cleanly separates it from create_render (fresh composition) and apply_composition (mutates composition).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it (transient failure: retryable:true / category:transient) and when not to (deterministic failure: retryable:false / category:authoring), and names the correct alternative path in that case (fix via apply_composition, then create_render). It even tells the agent how to decide — check `retryable` on getRender / wait_job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_compositionScore CompositionAIdempotentInspect
Queue the durable server-side judge — it snapshots the exact authored target, samples eval beats, captures frames asynchronously, and grades editorial/spatial/brand/caption. Then wait_job(kind="verify", id=jobId) for per-criterion scores, weighted composite, worst-first critique, and checkpointId. body.composition is optional (absent ⇒ ACTIVE). Fix the lowest criterion via apply_composition and re-score. Idempotent per immutable snapshot; compose_verify bills only on the guarded success terminal.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| projectId | Yes | projectId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | Job family, e.g. `verify` | `preview` | `brand_kit_extract`. |
| jobId | No | Poll GET /v1/jobs/{jobId} / wait_job until terminal. |
| jobKey | No | Deterministic identity of the work (content hash of every input the result depends on). Re-enqueueing the same key returns the same job while it runs; a failed key revives as a fresh attempt. |
| status | No | running on a fresh/deduped enqueue; succeeded when an identical request already completed. Cancelled is part of the shared status vocabulary; identical cancelled work revives to running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that this is an asynchronous queued job, that it is idempotent per immutable snapshot, and that billing only fires on the guarded success terminal. It also notes the snapshot/isolation semantics (judging the authored target) and the 404-not-fallthrough behavior for stale ids, which are non-obvious operational traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose first, then the polling/fix loop, then idempotency and billing caveats. Every clause carries information, though the packed sentence structure requires careful parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested-body, async, write-capable tool with an output schema and annotations, the description supplies the missing operational context: the job/polling model, the returned artifact set, idempotency, and billing trigger. Nothing needed to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 50%, the description does add meaning for body.composition (optional, absent ⇒ ACTIVE), but that is largely restated in the schema itself. It does not clarify the session_id vs compositionId precedence or the purpose of brandContext/editorialIntent, leaving part of the coverage gap unaddressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource ('Queue the durable server-side judge') and immediately specifies the graded dimensions (editorial/spatial/brand/caption) and the target snapshot. An agent can distinguish it from apply_composition, compose, and validate_composition without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear workflow: queue here, then poll wait_job(kind="verify", id=jobId), then fix the lowest criterion via apply_composition and re-score. It does not, however, explicitly state when to prefer this over siblings like validate_composition or compose_verify, so the routing is implied rather than enumerated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_fontsSearch FontsARead-onlyInspect
Search web font families by name/style — returns family names to use in composition/component params. Pass query (+ optional perPage ≤50). Read-only + free; surfaces the Google Fonts catalog (family + category + variants + css2 stylesheet URL). IMPORTANT: this searches the GOOGLE catalog, not what the render can actually draw. Only the faces vendored into the render page are guaranteed to rasterize; naming any other family gets you the generic fallback (Liberation Sans) with no error. Call list_render_fonts for the set you may actually choose from, WITH the admitted weights per family — treat that, not this catalog, as the list. An empty result set here means no match, or the upstream catalog was unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /fonts/search body. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, openWorld, idempotent=false, destructive=false), and the description adds substantial context beyond them: free/read-only, catalog contents (family + category + variants + css2 URL), the silent fallback to Liberation Sans with no error, and the ambiguity of an empty result. This is information an agent cannot get from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and usage, with the critical fallback caveat marked IMPORTANT. It is dense and nearly every sentence carries operational value, though the parenthetical detail about catalog fields slows the read slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be spelled out, yet the description still characterizes the shape (family/category/variants/css2 URL) and, crucially, warns about the misleading nature of results. Complete for this tool's complexity and its high-stakes naming trap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the keys are already constrained (query minLength 1/maxLength 200, perPage ≤50), so the description's 'Pass query (+ optional perPage ≤50)' largely restates the schema. Baseline 3 for full schema coverage; no additional format or query-syntax semantics are added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Search web font families by name/style') with an explicit statement of what it returns and how the result is used. It also distinguishes itself from the sibling list_render_fonts by declaring that this is the Google catalog, not the selectable render set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use list_render_fonts for the set you may actually choose from, and treat that, not this catalog, as the list. It also explains why (non-vendored faces silently fall back) and what an empty result means, covering when-not and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_resourcesSearch ResourcesARead-onlyInspect
Search licensed stock media to compose with across video, photo, sound effects, and GIFs. Pass query for ONE search, or queries[] (≤10) to run them all in a SINGLE call — strongly prefer the batch when you know several things you need. A batch returns results[], one per query in order, each with its own candidates; a query that fails carries an error and never discards the others. Optional kind [default video], provider pin, and limit ≤50 apply to every query in the batch. Returns ranked candidates, each with an opaque candidateId + attribution (author, assetUrl) + license, and a preview URL in the text. FREE + rate-limited + cached — reach for this before generate_media when real footage beats synthesis. TO SEE the candidates rather than read about them, pass limit ≥2: thumbnails/audio are attached only when you asked for options to compare. Import a chosen candidate into a project with import_resource. Candidate handles expire; re-search to refresh one.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /resources/search body — one `query`, or a batch of `queries[]`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | |
| results | No | |
| provider | No | |
| candidates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly/openWorld/non-destructive), and the description layers on non-obvious behavior: free, rate-limited, cached; per-query error isolation in a batch; candidate handles that expire and must be refreshed; and the limit ≥2 threshold that controls whether preview media is attached. This is materially beyond what annotations or schema convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and batch-vs-single decision, then layered with progressively finer constraints; each sentence carries distinct information. It is on the long side for a search tool, but no sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description still flags the important shape details (candidates, candidateId, attribution, license, preview URL, ordered results[]). Combined with the annotations and rich schema, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: the query-vs-queries[] alternation and batch result ordering, the kind default (video) which the schema does not declare, and the limit ≥2 preview rule. The only untouched fields are minWidth/minHeight/durationSec, which the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (search licensed stock media) and enumerates the scopes it covers (video, photo, sound effects, GIFs). It explicitly contrasts itself with siblings generate_media and import_resource, so an agent can route to it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing: 'reach for this before generate_media when real footage beats synthesis', and directs follow-up to import_resource. It also states a strong preference for the batch form ('strongly prefer the batch when you know several things you need'), which is actionable guidance rather than description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_candidateSelect CandidateAInspect
Select one candidate from a finished compose/consult ensemble as the project's saved composition (whole-candidate replace). Body REQUIRES both fields: { candidateIndex, selectStrategy: "agent-authoritative" } — candidateIndex from wait_job(kind="consult") proposals (mode=amend) or the compose winner report; selectStrategy is required and API keys must use 'agent-authoritative' (editor-merge/editor-replace need an editor-session token and 403 on an API key). After selecting, render with create_render.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | POST /projects/:id/compose/jobs/:jobId/select body. | |
| projectId | Yes | projectId (path). | |
| composeJobId | Yes | composeJobId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mergeResult | No | |
| newCompositionEtag | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare a non-read-only, non-idempotent mutation, but the description goes further by disclosing the replacement semantics, the auth requirement (API keys must use 'agent-authoritative'), and the failure mode (403 for editor strategies on an API key). These are behavioral facts the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, then requirements, sources, constraints and the next step follow in logical order with no filler sentences. It is a dense single block with minor redundancy between 'REQUIRES both fields' and 'selectStrategy is required', which keeps it short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not cover return values, and it does not. For a mutation tool it supplies everything an agent needs: prerequisites, required body fields, credential constraints, error behavior, and the recommended follow-up call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: where candidateIndex comes from and how selectStrategy interacts with the caller's credential type. Some content ('Body REQUIRES both fields') restates the schema's required array, slightly diluting the value-add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (select) and resource (one candidate from a finished compose/consult ensemble) and pins down the exact effect: a 'whole-candidate replace' of the project's saved composition. That scope statement implicitly separates it from siblings like apply_composition and derive_composition without the agent needing to open multiple schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit preconditions (the ensemble must be finished), the provenance of candidateIndex (wait_job(kind="consult") proposals under mode=amend, or the compose winner report), and the follow-up action (render with create_render). It also states an exclusion: editor-merge/editor-replace are unusable on an API key because they need an editor-session token.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_templateStart from TemplateBIdempotentInspect
Create a new project from a catalog or org template. The server prepares media and verified mattes before the project is ready. Pass the returned jobId to wait_job(kind="template").
| Name | Required | Description | Default |
|---|---|---|---|
| media | No | ||
| preset | No | ||
| values | No | ||
| template | Yes | ||
| brandKitId | No | ||
| projectName | Yes | ||
| idempotencyKey | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it non-read-only but idempotent and non-destructive. The description adds real behavioral context beyond that: the call is asynchronous, the server does preparatory work (media and verified mattes) before the project is usable, and a jobId must be polled via wait_job. It does not mention auth requirements or what happens on retry with the same idempotencyKey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and followed by the async lifecycle and the next-step call. Every sentence carries information; no filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, nested-object, no-output-schema mutation, the description covers the async flow but leaves the entire parameter surface undocumented and never routes the agent away from apply_template or create_project. Adequate for the job lifecycle, inadequate for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 7 parameters, including nested structures (media with three mutually exclusive shapes, values, brandKitId, preset, idempotencyKey), and the description explains none of them. An agent gets no guidance on template identifier format, the media variants, or how idempotencyKey interacts with the idempotentHint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new project from a catalog or org template'), which is clearly distinguishable from create_project (blank project) and apply_template (applies a template to an existing project). It does not explicitly name those siblings, so an agent still has to infer the boundary, but the template-sourced framing is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete follow-up routing ('Pass the returned jobId to wait_job(kind="template")'), which is genuinely useful workflow guidance. However, it never states when to prefer this over apply_template or create_project, so the primary selection decision is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_briefsSuggest BriefsAInspect
Run AI clip-suggestion analysis on a long-form media item — the CLIPPING path (find the best short-form moments). Returns { status, alreadyRunning? }; then wait_job(kind="suggestions", id=mediaItemId) — its terminal lists each suggestion WITH its briefId. When the media belongs to a PROJECT, each finalized suggestion is promoted to a kind-'clip' BRIEF (its window pinned as a beat) — list_briefs {kind:"clip"} shows them and compose({ briefId }) runs the flagship path from one. Project-less media: pass the suggestion id to compose({ suggestionId }) directly. Clipping is a vertical, NOT the general path.
| Name | Required | Description | Default |
|---|---|---|---|
| mediaItemId | Yes | mediaItemId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| alreadyRunning | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it is not read-only, not idempotent, and not destructive, but the description adds the key async behavior the annotations cannot: it returns {status, alreadyRunning?} and must be followed by wait_job(kind="suggestions"). It also discloses the side effect that finalized suggestions get promoted to kind-'clip' briefs for project media, which is important behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and scope in the first sentence, then proceeds through the workflow chain. It is dense but each sentence (async follow-up, brief promotion, compose routing) earns its place given the multi-step flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed, yet the description still explains the {status, alreadyRunning?} shape. Combined with the wait_job follow-up and the compose routing for both project and project-less media, the agent has everything needed to invoke and chain it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter with 100% schema description coverage, so the schema already carries the parameter meaning. The description references mediaItemId only obliquely via wait_job(id=mediaItemId), adding no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (run AI clip-suggestion analysis on a long-form media item) and immediately names its domain ('the CLIPPING path') to distinguish it from the general path. An agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (long-form media, finding best short-form moments) and when not ('Clipping is a vertical, NOT the general path'). It also routes the agent to alternatives: compose({briefId}) for project media and compose({suggestionId}) for project-less media.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_briefUpdate BriefADestructiveInspect
Edit a brief (partial). REFUSED with 409 while an ACTIVE compose job references it — finish, resume, or abandon the job first (the Director never has its input edited mid-run). Edits apply to the NEXT compose.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| briefId | Yes | briefId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| cta | No | |
| goal | No | What the video must accomplish. |
| hook | No | |
| kind | No | authored = create_brief; clip = minted by suggest_briefs from an AI clip suggestion. |
| name | No | |
| tone | No | |
| audio | No | |
| beats | No | |
| gates | No | |
| quote | No | |
| format | No | |
| locale | No | Output language (BCP-47 tag, e.g. 'es-419'): ALL on-screen copy + captions. |
| caption | No | |
| audience | No | |
| captions | No | |
| platform | No | |
| createdAt | No | |
| projectId | No | |
| updatedAt | No | |
| exclusions | No | |
| references | No | |
| durationSec | No | Target output duration. HONOR-OR-REFUSE: compose validates it against the beat-source window (±1.5s) and refuses a brief it cannot honor. |
| motionStyle | No | |
| mustIncludes | No | |
| seededGraphics | No | Client-authored graphic clips the Director must carry VERBATIM: seeded into the design loop's base composition as LOCKED clips (never re-authored, never discarded). |
| sourceSuggestionId | No | kind:'clip' provenance — the suggestion this Brief was minted from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, idempotentHint=false), the description discloses a concurrency guard with a specific status code, the reason for it (the Director never has its input edited mid-run), and the timing of effect. This is exactly the extra context the safety annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the constraint, then the effect. No filler; every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the annotations carry the safety profile. The description covers the critical refusal condition and next-compose semantics, leaving only the exact merge behavior of the partial body unspecified — a minor gap for a 2-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% and the description names no parameter directly, but '(partial)' conveys that the body is a partial merge rather than a full replacement, which is real semantic value for the body object. briefId and the mechanics of the merge remain undocumented in the description, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Edit a brief') and adds the meaningful qualifier '(partial)' that signals merge semantics. It does not explicitly distinguish itself from siblings like create_brief, delete_brief, or get_brief, so it lands just short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the blocking condition explicitly (409 while an ACTIVE compose job references the brief) and routes the agent to concrete alternatives ('finish, resume, or abandon the job first'). It also clarifies the temporal effect ('Edits apply to the NEXT compose'). Only the broader when-to-use vs create_brief/delete_brief is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_componentUpdate ComponentADestructiveIdempotentInspect
Update an authored component's complete version-4 source/metadata IN PLACE (same id) — the correct verb for the author→preview→fix loop (preview_component returns the admission or runtime error; fix the template here and re-preview, instead of creating a new component each iteration). Pass componentId + the changed fields as body. Same source contract as create_component: {version:4, componentId, template, manifest, definition}, admitted before the write; the template finds its root with document.getElementById('root'), and declared slots arrive in the scene's assets, never params. PLACED CLIPS: every placed clip renders the exact version it pins, so an update moves placed clips ONLY when you name a project — put projectId (and optionally compositionId; default the project's active composition) in body, and that composition's placements move to the new version in the same write. The answer carries repinned (what moved) and placementsPinnedToPrevious (placements across the org still rendering the previous version). Without projectId nothing placed moves: previews and renders of an existing clip keep the old version. For one placement, register the source WITHOUT projectId, read its immutable sourceVersionId, then use apply_composition clip.update to change only the selected clip source and exact pin under observed concurrency expectations. Explicit-project update_component admits and repins all matching placements in that composition; use it only when that broader edit is requested.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | PUT /components/:id body: every writable field, all optional; an omitted field is carried forward. Org/user are server-resolved; never accepted from the body. | |
| componentId | Yes | componentId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The entry's id: a `primitiveId` for a built-in, a `componentId` for an installed component. |
| kind | No | RENDER kind (component | transition | scene). NOT the ClipSource variant — see `placement` for how to author it on the timeline. |
| mood | No | Vibe/tone tags (e.g. 'cinematic', 'minimal'). Filter to match the edit's mood. |
| name | No | |
| tags | No | Free-text search keywords. |
| tier | No | Quality/applicability RANKING (a preference, not a flag). Prefer 'recommended'; reach for 'niche' only when its specific use-case is exactly the beat. |
| format | No | |
| intent | No | Selection signal: a verb naming what this primitive accomplishes (e.g. 'product-trailer'). Match it to the beat you are authoring. |
| origin | No | |
| source | No | 'default' = built-in primitive (place by primitiveId); 'installed' = org-authored component (place by componentId). |
| tokens | No | |
| useCase | No | The edit ROLE(s) this primitive fills — the dimension to filter by for a beat (e.g. 'intro', 'title-over-footage', 'grade'). |
| useWhen | No | When to use this — AND when not to. The negative guidance is load-bearing; read it before picking. |
| version | No | The ENTRY's version: a semver string ('0.0.0' until an authored component is versioned). Distinct from `manifest.version`, which is the runtime contract version (4 native, 2 retired TSX). |
| category | No | |
| examples | No | Usage examples, as authored. A built-in primitive projects {name, mood?, params?, description?}; an authored component's examples are whatever it wrote, which is why the item is open. One shape for both directions: what you write here is what you read back. |
| manifest | No | |
| repinned | No | Present when the update named `projectId`: the composition whose placements moved to the new version. |
| warnings | No | Non-blocking save-time advisories — the create/update SUCCEEDED. Currently: a `fontFamily` string literal referencing a NON-vendored font (a bare CSS generic like 'serif', or an unknown named family like 'Arial') whose LIVE-lane pixels vary by render host — re-author with a vendored family or 'Georgia'. Omitted when there is nothing to flag; only present on the create/update responses. |
| avoidWith | No | Authoring guidance: ids of primitives that CONFLICT with this one — do not place together. |
| fixedCopy | No | On-screen strings this primitive BAKES — the read-side counterpart to propSchema. These literals render REGARDLESS of params (no param can change them); fork the source via get_component_source to edit them. Use this to see at author time what fixed copy (someone-else's marketing text, faux-code, faux-data) will appear before you render. |
| pairsWith | No | Authoring guidance: ids of primitives that COMPOSE well with this one in the same edit. |
| placement | No | |
| textParam | No | The param field that carries this primitive's primary text; null = no single text slot. |
| propSchema | No | |
| description | No | |
| ejectedFrom | No | |
| propDefaults | No | |
| subtextParam | No | The param field for secondary text (subtitle/byline); null = none. |
| brandBindings | No | Params that can follow the project brand kit. Each {param, brandToken} says: set `param` to `brandToken` (a `$brand:` ref, e.g. '$brand:colors.accent') to track the brand instead of a literal. See the list response's `brandTokens` for the full ref vocabulary. Omitted when nothing is brand-bound. |
| durationInFrames | No | |
| placementsPinnedToPrevious | No | Placements across the org that still pin the previous version and will keep rendering it. Name `projectId` (and `compositionId`) on the update to move a composition's placements with it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive=true and idempotent=true, but the description goes far beyond them: it discloses that placements move ONLY when projectId is named, the exact source contract admitted before write, the return fields (`repinned`, `placementsPinnedToPrevious`), and that previews/renders of existing clips keep the old version otherwise. This is rich behavioral disclosure of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the loop context before drilling into placement mechanics, so the most important sentence comes first. It is dense and slightly sprawling as a single paragraph, but almost every sentence carries non-redundant routing or behavior information given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive in-place mutation with a deeply nested schema and many siblings, the description covers the loop, the placement-repin decision, the single-clip alternative, and the concurrency expectations. Although an output schema exists (so return values are documented), the mention of `repinned`/`placementsPinnedToPrevious` adds useful caller-facing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: it tells the caller to pass componentId plus changed fields as `body`, and explains projectId/compositionId semantics (which placements repin, default to the active composition) that the schema's short property descriptions do not fully convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+scope: 'Update an authored component's complete version-4 source/metadata IN PLACE (same id)'. It explicitly distinguishes itself from siblings by naming preview_component, create_component, and apply_composition clip.update, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (the author→preview→fix loop, instead of creating a new component each iteration), when-not (without projectId nothing placed moves), and a named alternative for the single-placement case (register without projectId, then apply_composition clip.update). Conditions that select each path are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_projectUpdate ProjectADestructiveInspect
Update a project's mutable fields (e.g. name, format, brandKitId). Pass projectId + the changed fields as body. Setting brandKitId binds/changes the project brand kit so every render of this project themes from it. Returns the updated ProjectResponse.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | PATCH /projects/:id body. | |
| projectId | Yes | projectId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| format | No | |
| webUrl | No | A browser URL that opens THIS project, or null when CueFrame exposes no web view for a project. Null today: the console serves account surfaces (keys, usage, billing) and has no per-project page, so there is no link to give. Do NOT synthesise one — a guessed console path 404s. Show the user rendered output (create_render → outputUrl) or a preview still instead. This field becoming non-null is the signal that a real project view exists. |
| createdAt | No | |
| brandKitId | No | |
| lastRender | No | Most recent render for a project, if any. |
| composition | No | Summary of a project's stored composition. |
| description | No | |
| activeCompositionId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (destructiveHint=true, idempotentHint=false, readOnlyHint=false), so the bar is lower, and the description adds real value by explaining the brandKitId side effect: binding it re-themes every future render of the project. That is non-obvious behavior beyond the annotations and schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: purpose and fields first, invocation second, side effect and return value last. No padding or redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety, a full output schema handling returns, and 100% schema coverage, the description is nearly complete; the only untold detail is the nested `format` sub-fields (fps/resolution/aspectRatio), which the schema carries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning by clarifying how `body` should be used (only the changed fields) and by explaining the semantic effect of brandKitId rather than merely restating its type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) + resource (project) and enumerates the mutable fields (name, format, brandKitId), which cleanly separates it from update_brief and update_component. It also names the return type (ProjectResponse), so an agent knows exactly what the call does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives invocation mechanics ('Pass projectId + the changed fields as `body`') but never says when to reach for this versus siblings like update_brief, update_component, or create_project, nor any preconditions. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_webhookUpdate WebhookADestructiveInspect
Update a webhook subscription (its url or event list). Pass webhookId + changed fields as body. The signing secret is NOT rotated here.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | PATCH /webhooks/:id body. | |
| webhookId | Yes | webhookId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| url | No | |
| events | No | |
| enabled | No | |
| settleMs | No | |
| createdAt | No | |
| lastFailedAt | No | |
| lastDeliveredAt | No | |
| verificationStatus | No | pending = callback URL has not echoed the ownership challenge (receives no events); verified = ownership proven. |
| consecutiveFailures | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=false and openWorld=true, so the safety profile is covered. The description adds a genuinely useful behavioral fact not present in structured data (no signing-secret rotation), but does not explain why the call is flagged destructive (e.g. whether events replaces the whole list).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the purpose and with zero padding. The middle sentence largely repeats what the schema already shows, which is the only mild inefficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and annotations cover the risk profile. The remaining gap is whether an events list replaces or merges with existing subscriptions, which matters for a mutation tool marked destructive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents webhookId and every body field. The description only restates the envelope ("webhookId + changed fields as body") and implies partial-update semantics, and it omits the enabled and settleMs fields the schema actually accepts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update a webhook subscription") and names the mutable facets (url, event list). It is clearly distinct from create_webhook/delete_webhook by naming, though it never explicitly contrasts them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear condition for use (modifying an existing subscription) plus a useful exclusion: the signing secret is not rotated here, which steers the agent away from expecting rotation from this call. It does not name the alternative tool that would handle secret changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_compositionValidate CompositionARead-onlyInspect
Dry-run a full Composition object against the SAME pure, DB-free authoring guards saveComposition enforces, WITHOUT persisting it (no project needed). Checks: wire shape (Zod), primitive membership (unknown_primitive / custom_missing_sourcecode), required-param shape (invalid_primitive_params), clip↔track family (clip_source_track_mismatch), and reframe coverage (reframe_coverage_gap). Always returns ONE shape — 200 { valid, errors, quote } — for BOTH malformed wire shapes and deep-invariant failures (so branch on valid, not on HTTP status); errors[] lists every problem at once as a sanitized envelope { code, stage, category, retryable, message, fix } you can fix before composing/rendering. The quote triple states the render price to finish from a valid composition — relay it to your human BEFORE create_render. valid:true means save-safe EXCEPT for the three genuinely DB-bound checks that can only run at save/render, because this tool takes no project: trim-bounds (needs the media duration), image/asset-on-a-video-track (needs the media kind), and componentId resolution (needs the installed components of YOUR org — a {kind:'component', componentId, props} clip naming a component you have not created, or naming a CATALOG PRIMITIVE, passes here and is refused at save with component_source_unavailable). Pass the Composition as body.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| quote | No | The A2 money triple for the commodity lane: validate is free; estimatedJourneyTotalUsd is the render price to finish from a valid composition — relay it BEFORE create_render. |
| valid | No | |
| errors | No | |
| contract | No | The contract this verdict was computed against (the kernel version the deployment runs). If it differs between two calls, the validator changed, not your composition. |
| warnings | No | Non-blocking render-fidelity warnings detected before enqueue, including unavailable font families. |
| advisories | No | Deterministic, render-free QUALITY floors (the SAME named defects the Director's in-loop verify and score_composition surface: static-hold, caption-spine, sfx-density, sfx-speech-collision, bed-coverage, audio-role). NON-blocking — they never flip `valid` (an editorially-weak composition still renders); fix them for quality, not to save. Empty when the composition is clean or the wire shape failed (they need a parsed composition). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it specifies that the response is ALWAYS a single 200 shape { valid, errors, quote } for both malformed wire shapes and deep-invariant failures, documents the errors[] envelope fields { code, stage, category, retryable, message, fix }, and names the exact DB-bound checks that cannot run here plus the component_source_unavailable failure mode. With annotations only covering safety hints, this is exceptional disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the non-persistence guarantee, then layers return shape, then limitations. Every clause carries real information, but the dense parenthetical stacking makes it a heavy read; slightly trimmed it would be a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity validation tool with an output schema, it covers what is checked, what is returned, how to branch on the result, and the exact classes of failure it CANNOT catch. An agent has everything needed to call it and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, `body`, and the description adds little beyond 'Pass the Composition as `body`' — no per-field semantics. Schema description coverage is 0% at the property level, so the description neither compensates nor misleads; the enormous self-documenting nested schema carries the structural burden. Minimum-viable 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Dry-run a full Composition object against the SAME pure, DB-free authoring guards saveComposition enforces, WITHOUT persisting it (no project needed).' This distinguishes it from saveComposition and from apply/new_composition siblings, and an agent can tell what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong context: fixes should happen 'before composing/rendering' and the quote must be relayed 'BEFORE create_render', and it warns to branch on `valid` not HTTP status. It clearly states the boundary condition (valid:true is save-safe EXCEPT for three DB-bound checks). It stops short of naming an explicit alternative tool the way the calibration HIGH example does, so a 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_webhookVerify WebhookAIdempotentInspect
Re-run ownership verification on a PENDING webhook — one whose endpoint did not echo the challenge at create time (check its verification.reason: token_not_echoed / non_2xx_ / unreachable / ssrf_blocked). After you fix the receiver to reply 2xx echoing data.token, call this to re-send the signed webhook.verify challenge and flip it active IN PLACE (id + secret preserved — no delete/recreate). Returns { id, status:"active"|"pending", verification? }. An already-active webhook returns active unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| webhookId | Yes | webhookId (path). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| status | No | active = ownership verified + receiving events; pending = challenge not echoed. |
| verification | No | Present only when the re-challenge did not verify; `reason` names why (see WebhookCreateResponse.verification). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnly=false, idempotent=true, destructive=false. The description goes well beyond them: it discloses the side effect (re-sends the signed webhook.verify challenge), the state transition (flips pending → active IN PLACE), and crucially that id and secret are preserved rather than regenerated, which is the main thing an agent would otherwise have to guess about a mutating verification call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the precondition before the action and the state effect. The return-shape note is short and the already-active edge case is stated in the same sentence, so nothing reads as padding despite the high information density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A mutating, idempotent webhook tool with one required param and a full output schema. The description covers the precondition, the fix-and-retry workflow, the in-place semantics, the preserved credentials, and the no-op case — everything an agent needs to call it correctly at the right moment.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter, webhookId, and schema description coverage is 100%, so the schema already documents it. The description does not add format or sourcing guidance for the id (it references data.token and verification.reason, but those are webhook fields, not this tool's parameter). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('re-run ownership verification on a PENDING webhook') and immediately distinguishes it from create_webhook/update_webhook by scoping it to webhooks stuck in a pending state. The parenthetical reason codes (token_not_echoed / non_2xx_<code> / unreachable / ssrf_blocked) pin down exactly which objects qualify, so an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('one whose endpoint did not echo the challenge at create time') and an explicit trigger for the call ('After you fix the receiver to reply 2xx echoing data.token, call this'). It also rules out the delete/recreate alternative ('id + secret preserved — no delete/recreate') and documents the no-op case ('already-active webhook returns active unchanged').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_jobWait for JobARead-onlyIdempotentInspect
Wait for a long-running job and return the resolved result — a bounded long-poll. Includes template preparation (kind="template", id=jobId), media import, render, compose, consult, suggestions and preview. If still running, call wait_job again with the same arguments; work continues server-side.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | kind="media": mediaItemId returned by import/generate/finalize/import_resource. kind="render": renderId. kind="compose": composeJobId. kind="consult": consultJobId. kind="suggestions": mediaItemId. Generic kinds use the jobId from the enqueue receipt. | |
| kind | Yes | What to wait on, including template preparation (kind="template"). | |
| projectId | No | Required when kind="render", "compose", or "consult". | |
| timeoutMs | No | Maximum wait in ms (default 30 min for render/compose, 5 min for suggestions). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, not open-world), so credit goes to the added behavior: it discloses the bounded long-poll semantics, server-side continuation, and the re-poll contract. It stops short of describing what is actually returned when the deadline is hit (partial result vs. status marker), leaving a small behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, with the core purpose front-loaded in the first clause. Slightly redundant enumeration of job kinds overlaps with the schema enum, but nothing is padded or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only wait tool with full schema coverage and annotations carrying the safety profile, the description supplies the crucial long-poll/re-poll contract. With no output schema, the phrase 'the resolved result' is a little thin on return shape, but it is otherwise sufficient to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds only a sliver beyond the schema by clarifying that template jobs take kind="template" with id=jobId (the schema's id text lists the other kinds explicitly). That is marginal added value, not a re-documentation of all four parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Wait for a long-running job and return the resolved result') and pins down the mechanism ('a bounded long-poll'). The enumeration of covered job kinds (template, media import, render, compose, consult, suggestions, preview) sharpens the scope and clearly separates it from the many cancel_*/retry_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit operational guidance: if the job is still running, re-invoke with the same arguments because work continues server-side. This is a clear usage pattern, but it never names an alternative (e.g., cancel_job) or states when-not to use this tool, so it stops short of the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
17 tool updates
- Changed
apply_composition15 fields changed- changed
Input schema / $defs / __schema0 / anyOfPrevious value: -[ - { - "type": "null" - }, - { - "type": "boolean" - }, - { - "type": "number" - }, - { - "type": "string" - }, - { - "items": { - "$ref": "#/$defs/__schema0" - }, - "type": "array" - }, - { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + }, + { + "items": { + "$ref": "#/$defs/__schema0" + }, + "type": "array" + }, + { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } +] - changed
Input schema / $defs / __schema1 / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - }, - { - "items": { - "$ref": "#/$defs/__schema1" - }, - "type": "array" - }, - { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "children": { + "items": { + "$ref": "#/$defs/__schema1" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "id": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", + "type": "string" + }, + "kind": { + "const": "group", + "type": "string" + }, + "opacity": { + "default": 1, + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "transform": { + "additionalProperties": false, + "default": { + "position": [ + 0, + 0, + 0 + ], + "rotation": [ + 0, + 0, + 0 + ], + "scale": 1 + }, + "properties": { + "position": { + "default": [ + 0, + 0, + 0 + ], + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "rotation": { + "default": [ + 0, + 0, + 0 + ], + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "scale": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "kind", + "id", + "children" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "id": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", + "type": "string" + }, + "kind": { + "const": "laptop", + "type": "string" + }, + "materials": { + "items": { + "additionalProperties": false, + "properties": { + "anisotropy": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "anisotropyRotation": { + "type": "number" + }, + "clearcoat": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "clearcoatRoughness": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "ior": { + "maximum": 2.333, + "minimum": 1, + "type": "number" + }, + "metalness": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "reflectivity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "role": { + "maxLength": 64, + "minLength": 1, + "type": "string" + }, + "roughness": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "type": { + "enum": [ + "physical", + "unlit" + ], + "type": "string" + } + }, + "required": [ + "role", + "type" + ], + "type": "object" + }, + "maxItems": 16, + "type": "array" + }, + "opacity": { + "default": 1, + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "openAngle": { + "maximum": 3.141592653589793, + "minimum": 0, + "type": "number" + }, + "surfaces": { + "additionalProperties": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assetSlot": { + "description": "Image asset slot name bound by the clip assets map; never a URL.", + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", + "type": "string" + }, + "source": { + "const": "image", + "type": "string" + } + }, + "required": [ + "source", + "assetSlot" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "source": { + "const": "color", + "type": "string" + } + }, + "required": [ + "source", + "color" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bakeScale": { + "anyOf": [ + { + "const": 2, + "type": "number" + }, + { + "const": 3, + "type": "number" + } + ], + "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." + }, + "captureFrame": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "component": { + "additionalProperties": false, + "properties": { + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 1, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId" + ], + "type": "object" + }, + "layout": { + "additionalProperties": false, + "properties": { + "height": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "width": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "width", + "height" + ], + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema2" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "source": { + "const": "component", + "type": "string" + } + }, + "required": [ + "source", + "component", + "captureFrame", + "layout" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "endFrame": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "mediaId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "source": { + "const": "video", + "type": "string" + }, + "startFrame": { + "default": 0, + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "source", + "mediaId" + ], + "type": "object" + } + ] + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "transform": { + "additionalProperties": false, + "default": { + "position": [ + 0, + 0, + 0 + ], + "rotation": [ + 0, + 0, + 0 + ], + "scale": 1 + }, + "properties": { + "position": { + "default": [ + 0, + 0, + 0 + ], + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "rotation": { + "default": [ + 0, + 0, + 0 + ], + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "scale": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "width": { + "maximum": 4000, + "minimum": 200, + "type": "number" + } + }, + "required": [ + "kind", + "id", + "width", + "openAngle" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "id": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", + "type": "string" + }, + "kind": { + "const": "phone", + "type": "string" + }, + "materials": { + "items": { + "additionalProperties": false, + "properties": { + "anisotropy": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "anisotropyRotation": { + "type": "number" + }, + "clearcoat": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "clearcoatRoughness": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "ior": { + "maximum": 2.333, + "minimum": 1, + "type": "number" + }, + "metalness": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "reflectivity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "role": { + "maxLength": 64, + "minLength": 1, + "type": "string" + }, + "roughness": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "type": { + "enum": [ + "physical", + "unlit" + ], + "type": "string" + } + }, + "required": [ + "role", + "type" + ], + "type": "object" + }, + "maxItems": 16, + "type": "array" + }, + "opacity": { + "default": 1, + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "surfaces": { + "additionalProperties": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assetSlot": { + "description": "Image asset slot name bound by the clip assets map; never a URL.", + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", + "type": "string" + }, + "source": { + "const": "image", + "type": "string" + } + }, + "required": [ + "source", + "assetSlot" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "source": { + "const": "color", + "type": "string" + } + }, + "required": [ + "source", + "color" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bakeScale": { + "anyOf": [ + { + "const": 2, + "type": "number" + }, + { + "const": 3, + "type": "number" + } + ], + "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." + }, + "captureFrame": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "component": { + "additionalProperties": false, + "properties": { + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 1, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId" + ], + "type": "object" + }, + "layout": { + "additionalProperties": false, + "properties": { + "height": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "width": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "width", + "height" + ], + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema2" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "source": { + "const": "component", + "type": "string" + } + }, + "required": [ + "source", + "component", + "captureFrame", + "layout" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "endFrame": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "mediaId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "source": { + "const": "video", + "type": "string" + }, + "startFrame": { + "default": 0, + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "source", + "mediaId" + ], + "type": "object" + } + ] + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "transform": { + "additionalProperties": false, + "default": { + "position": [ + 0, + 0, + 0 + ], + "rotation": [ + 0, + 0, + 0 + ], + "scale": 1 + }, + "properties": { + "position": { + "default": [ + 0, + 0, + 0 + ], + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "rotation": { + "default": [ + 0, + 0, + 0 + ], + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "scale": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "width": { + "maximum": 2000, + "minimum": 80, + "type": "number" + } + }, + "required": [ + "kind", + "id", + "width" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "cornerRadius": { + "default": 32, + "minimum": 0, + "type": "number" + }, + "edgeRadius": { + "default": 15, + "minimum": 0, + "type": "number" + }, + "finish": { + "default": "satin", + "enum": [ + "satin", + "brushed" + ], + "type": "string" + }, + "height": { + "maximum": 8000, + "minimum": 40, + "type": "number" + }, + "id": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", + "type": "string" + }, + "kind": { + "const": "slab", + "type": "string" + }, + "materials": { + "items": { + "additionalProperties": false, + "properties": { + "anisotropy": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "anisotropyRotation": { + "type": "number" + }, + "clearcoat": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "clearcoatRoughness": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "ior": { + "maximum": 2.333, + "minimum": 1, + "type": "number" + }, + "metalness": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "reflectivity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "role": { + "maxLength": 64, + "minLength": 1, + "type": "string" + }, + "roughness": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "type": { + "enum": [ + "physical", + "unlit" + ], + "type": "string" + } + }, + "required": [ + "role", + "type" + ], + "type": "object" + }, + "maxItems": 16, + "type": "array" + }, + "opacity": { + "default": 1, + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "surfaces": { + "additionalProperties": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assetSlot": { + "description": "Image asset slot name bound by the clip assets map; never a URL.", + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", + "type": "string" + }, + "source": { + "const": "image", + "type": "string" + } + }, + "required": [ + "source", + "assetSlot" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "source": { + "const": "color", + "type": "string" + } + }, + "required": [ + "source", + "color" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bakeScale": { + "anyOf": [ + { + "const": 2, + "type": "number" + }, + { + "const": 3, + "type": "number" + } + ], + "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." + }, + "captureFrame": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "component": { + "additionalProperties": false, + "properties": { + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 1, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId" + ], + "type": "object" + }, + "layout": { + "additionalProperties": false, + "properties": { + "height": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "width": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "width", + "height" + ], + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema2" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "source": { + "const": "component", + "type": "string" + } + }, + "required": [ + "source", + "component", + "captureFrame", + "layout" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "endFrame": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "mediaId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "source": { + "const": "video", + "type": "string" + }, + "startFrame": { + "default": 0, + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "source", + "mediaId" + ], + "type": "object" + } + ] + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "thickness": { + "default": 32, + "maximum": 200, + "minimum": 4, + "type": "number" + }, + "transform": { + "additionalProperties": false, + "default": { + "position": [ + 0, + 0, + 0 + ], + "rotation": [ + 0, + 0, + 0 + ], + "scale": 1 + }, + "properties": { + "position": { + "default": [ + 0, + 0, + 0 + ], + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "rotation": { + "default": [ + 0, + 0, + 0 + ], + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "scale": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "width": { + "maximum": 8000, + "minimum": 40, + "type": "number" + } + }, + "required": [ + "kind", + "id", + "width", + "height" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "backface": { + "default": "hidden", + "enum": [ + "hidden", + "visible" + ], + "type": "string" + }, + "depthWrite": { + "default": true, + "type": "boolean" + }, + "fit": { + "default": "contain", + "enum": [ + "contain", + "cover" + ], + "type": "string" + }, + "height": { + "maximum": 8000, + "minimum": 40, + "type": "number" + }, + "id": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", + "type": "string" + }, + "kind": { + "const": "page", + "type": "string" + }, + "materials": { + "items": { + "additionalProperties": false, + "properties": { + "anisotropy": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "anisotropyRotation": { + "type": "number" + }, + "clearcoat": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "clearcoatRoughness": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "ior": { + "maximum": 2.333, + "minimum": 1, + "type": "number" + }, + "metalness": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "reflectivity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "role": { + "maxLength": 64, + "minLength": 1, + "type": "string" + }, + "roughness": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "type": { + "enum": [ + "physical", + "unlit" + ], + "type": "string" + } + }, + "required": [ + "role", + "type" + ], + "type": "object" + }, + "maxItems": 16, + "type": "array" + }, + "opacity": { + "default": 1, + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "surfaces": { + "additionalProperties": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assetSlot": { + "description": "Image asset slot name bound by the clip assets map; never a URL.", + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", + "type": "string" + }, + "source": { + "const": "image", + "type": "string" + } + }, + "required": [ + "source", + "assetSlot" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "source": { + "const": "color", + "type": "string" + } + }, + "required": [ + "source", + "color" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bakeScale": { + "anyOf": [ + { + "const": 2, + "type": "number" + }, + { + "const": 3, + "type": "number" + } + ], + "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." + }, + "captureFrame": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "component": { + "additionalProperties": false, + "properties": { + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 1, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId" + ], + "type": "object" + }, + "layout": { + "additionalProperties": false, + "properties": { + "height": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "width": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "width", + "height" + ], + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema2" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "source": { + "const": "component", + "type": "string" + } + }, + "required": [ + "source", + "component", + "captureFrame", + "layout" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "endFrame": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "mediaId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "source": { + "const": "video", + "type": "string" + }, + "startFrame": { + "default": 0, + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "source", + "mediaId" + ], + "type": "object" + } + ] + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "transform": { + "additionalProperties": false, + "default": { + "position": [ + 0, + 0, + 0 + ], + "rotation": [ + 0, + 0, + 0 + ], + "scale": 1 + }, + "properties": { + "position": { + "default": [ + 0, + 0, + 0 + ], + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "rotation": { + "default": [ + 0, + 0, + 0 + ], + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "scale": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "transparency": { + "default": "straight", + "enum": [ + "straight", + "premultiplied", + "opaque" + ], + "type": "string" + }, + "width": { + "maximum": 8000, + "minimum": 40, + "type": "number" + } + }, + "required": [ + "kind", + "id", + "width", + "height", + "surfaces" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "align": { + "default": "center", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "fontFamily": { + "anyOf": [ + { + "maxLength": 128, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", + "type": "string" + }, + { + "enum": [ + "$brand:fonts.heading", + "$brand:fonts.body", + "$brand:fonts.caption" + ], + "type": "string" + } + ] + }, + "fontSize": { + "maximum": 800, + "minimum": 8, + "type": "number" + }, + "fontStyle": { + "enum": [ + "normal", + "italic" + ], + "type": "string" + }, + "fontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "id": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", + "type": "string" + }, + "kind": { + "const": "text", + "type": "string" + }, + "letterSpacing": { + "default": 0, + "maximum": 40, + "minimum": -20, + "type": "number" + }, + "lineHeight": { + "default": 1.2, + "maximum": 3, + "minimum": 0.6, + "type": "number" + }, + "lines": { + "items": { + "additionalProperties": false, + "properties": { + "runs": { + "items": { + "additionalProperties": false, + "properties": { + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "emphasis": { + "type": "boolean" + }, + "text": { + "maxLength": 512, + "minLength": 1, + "pattern": "^[^\\r\\n]+$", + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "runs" + ], + "type": "object" + }, + "maxItems": 24, + "minItems": 1, + "type": "array" + }, + "maxWidth": { + "exclusiveMinimum": 0, + "type": "number" + }, + "opacity": { + "default": 1, + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "space": { + "const": "world", + "type": "string" + }, + "transform": { + "additionalProperties": false, + "default": { + "position": [ + 0, + 0, + 0 + ], + "rotation": [ + 0, + 0, + 0 + ], + "scale": 1 + }, + "properties": { + "position": { + "default": [ + 0, + 0, + 0 + ], + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "rotation": { + "default": [ + 0, + 0, + 0 + ], + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "scale": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "id", + "kind", + "lines", + "fontFamily", + "fontWeight", + "fontStyle", + "fontSize", + "color", + "space" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "align": { + "default": "center", + "enum": [ + "left", + "center", + "right" + ], + "type": "string" + }, + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "fontFamily": { + "anyOf": [ + { + "maxLength": 128, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", + "type": "string" + }, + { + "enum": [ + "$brand:fonts.heading", + "$brand:fonts.body", + "$brand:fonts.caption" + ], + "type": "string" + } + ] + }, + "fontSize": { + "maximum": 800, + "minimum": 8, + "type": "number" + }, + "fontStyle": { + "enum": [ + "normal", + "italic" + ], + "type": "string" + }, + "fontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "id": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", + "type": "string" + }, + "kind": { + "const": "text", + "type": "string" + }, + "letterSpacing": { + "default": 0, + "maximum": 40, + "minimum": -20, + "type": "number" + }, + "lineHeight": { + "default": 1.2, + "maximum": 3, + "minimum": 0.6, + "type": "number" + }, + "lines": { + "items": { + "additionalProperties": false, + "properties": { + "runs": { + "items": { + "additionalProperties": false, + "properties": { + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "emphasis": { + "type": "boolean" + }, + "text": { + "maxLength": 512, + "minLength": 1, + "pattern": "^[^\\r\\n]+$", + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "runs" + ], + "type": "object" + }, + "maxItems": 24, + "minItems": 1, + "type": "array" + }, + "maxWidth": { + "exclusiveMinimum": 0, + "type": "number" + }, + "opacity": { + "default": 1, + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "rotation": { + "default": 0, + "type": "number" + }, + "scale": { + "default": 1, + "exclusiveMinimum": 0, + "type": "number" + }, + "space": { + "const": "screen", + "type": "string" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "id", + "kind", + "lines", + "fontFamily", + "fontWeight", + "fontStyle", + "fontSize", + "color", + "space", + "x", + "y" + ], + "type": "object" + } +] - added
Input schema / $defs / __schema2Added value: +{ + "anyOf": [ + { + "type": "null" + }, + { + "type": "boolean" + }, + { + "type": "number" + }, + { + "type": "string" + }, + { + "items": { + "$ref": "#/$defs/__schema2" + }, + "type": "array" + }, + { + "additionalProperties": { + "$ref": "#/$defs/__schema2" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + ] +} - added
Input schema / properties / body / properties / builtinSources / items / properties / sourceVersion / anyOfAdded value: +[ + { + "const": 3, + "type": "number" + }, + { + "const": 4, + "type": "number" + } +] - removed
Input schema / properties / body / properties / builtinSources / items / properties / sourceVersion / constRemoved value: -3 - removed
Input schema / properties / body / properties / builtinSources / items / properties / sourceVersion / typeRemoved value: -"number" - added
Input schema / properties / body / properties / componentExecutionVersions / anyOfAdded value: +[ + { + "items": false, + "maxItems": 1, + "minItems": 1, + "prefixItems": [ + { + "const": 3, + "type": "number" + } + ], + "type": "array" + }, + { + "items": false, + "maxItems": 2, + "minItems": 2, + "prefixItems": [ + { + "const": 3, + "type": "number" + }, + { + "const": 4, + "type": "number" + } + ], + "type": "array" + } +] - removed
Input schema / properties / body / properties / componentExecutionVersions / itemsRemoved value: -{ - "const": 3, - "type": "number" -} - removed
Input schema / properties / body / properties / componentExecutionVersions / maxItemsRemoved value: -1 - removed
Input schema / properties / body / properties / componentExecutionVersions / minItemsRemoved value: -1 - removed
Input schema / properties / body / properties / componentExecutionVersions / typeRemoved value: -"array" - removed
Input schema / properties / body / properties / concurrency / anyOfRemoved value: -[ - { - "additionalProperties": false, - "properties": { - "expectedRevision": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "mode": { - "const": "exact", - "type": "string" - } - }, - "required": [ - "mode", - "expectedRevision" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "basis": { - "items": { - "additionalProperties": false, - "properties": { - "key": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "token": { - "maxLength": 65536, - "type": "string" - } - }, - "required": [ - "key", - "token" - ], - "type": "object" - }, - "maxItems": 2048, - "type": "array" - }, - "compositionId": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "mode": { - "const": "guarded", - "type": "string" - }, - "observedRevision": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "mode", - "observedRevision", - "basis" - ], - "type": "object" - } -] - added
Input schema / properties / body / properties / concurrency / oneOfAdded value: +[ + { + "additionalProperties": false, + "properties": { + "expectedRevision": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "mode": { + "const": "exact", + "type": "string" + } + }, + "required": [ + "mode", + "expectedRevision" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "basis": { + "items": { + "additionalProperties": false, + "properties": { + "key": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "token": { + "maxLength": 65536, + "type": "string" + } + }, + "required": [ + "key", + "token" + ], + "type": "object" + }, + "maxItems": 2048, + "type": "array" + }, + "compositionId": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "mode": { + "const": "guarded", + "type": "string" + }, + "observedRevision": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "mode", + "observedRevision", + "basis" + ], + "type": "object" + } +] - removed
Input schema / properties / body / properties / ops / items / anyOfRemoved value: -[ - { - "additionalProperties": false, - "description": "Author a scene shot and place it on a dedicated overlay track. The host validates the scene, generates and registers an immutable wrapper component source, and emits the ordinary track/clip operations carrying `props.componentRef` — you edit a scene SPEC, never wrapper TSX or a source hash. Registration and the composition update are ONE undoable edit; a failure publishes nothing and leaves no clip pointing at an unresolved source. Pass EXACTLY ONE of `trackId` (an existing dedicated scene track) or `newTrack: true` (mint one). That track holds scene-shot clips and gaps only — no generic component/primitive/media clips in v1 — and existing generic overlay tracks are unaffected. Scene clips use front zPlane and full-frame placement: outer per-clip `region`, `position`, `scale`, `rotation`, `fit`, `effects`, `animate`, `params.transition`, `params.sequenceGroup` and internal fadeIn/fadeOut are REFUSED with a path, because the shot's own layer transforms are the single transform owner. TEXT: `space: \"screen\"` text is composed above the world result, stays fixed in the frame and stays sharp through focus; `space: \"world\"` text is rasterized into the 3D scene, moves with the camera and is occluded by geometry. Screenshots and world text are UNLIT and colour-managed so product UI colours are not tinted by the studio lighting, while device bodies are lit and cast shadows; an unlit surface still occludes. SCOPE GAP (pre-existing, neither closed nor changed by scene shots): global wrap effects — composition-level grades and camera effects — do not reach front-overlay clips, so they do not affect a scene shot. Author the look INSIDE the shot (`post.grain`, `post.vignette`, `post.focus`, `backdrop`, `environment`) instead. DISCOVERY: there is no built-in scene primitive to look up in list_catalog; the wrapper this operation registers appears afterwards as an ordinary INSTALLED component under the existing catalog rules. ASSETS: `assets` binds each slot name a layer references to a media id in the same project, and the slot's declared KIND decides what it admits — an image slot takes PNG, JPEG or WebP, a video slot MP4 or WebM. Binding the wrong kind is refused with the slot's path.", - "properties": { - "assets": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "clipId": { - "type": "string" - }, - "duration": { - "exclusiveMinimum": 0, - "type": "number" - }, - "newTrack": { - "type": "boolean" - }, - "newTrackId": { - "type": "string" - }, - "scene": { - "additionalProperties": false, - "description": "A version-2 scene shot: a self-contained 3D world-object shot that scene.add / scene.update materializes into an ordinary component clip. The shot owns its layers, camera, lighting, backdrop and normalized local animation; the composition owns start, duration, ordering, cuts and transitions. Coordinates are REFERENCE PIXELS: origin at frame centre, +X right, +Y down, +Z toward the viewer. referenceSize must have the SAME aspect ratio as the composition format; mismatch fails instead of cropping. At equal aspect ratio the shot scales uniformly by outputWidth/referenceWidth. A segment's easing belongs to the keyframe it ARRIVES at; the first keyframe has no easing. Authoring limits: 32 layers, 4 devices, 16 distinct image slots, 256 keyframes per channel, 2048 keyframes per shot. Version 2 supports nested groups, procedural slab/page/phone/laptop objects, screen- and world-space text, admitted image/component/video surfaces, fixed photographic and generated studio environments, transparent/solid/linear/radial backdrops, constraints, focus, grain and vignette. Raw HTML, custom shader props, imported GLB models, arbitrary external HDR environments, skeletal animation and physics are refused with an exact field path.", - "properties": { - "animation": { - "default": [], - "items": { - "additionalProperties": false, - "properties": { - "keyframes": { - "items": { - "additionalProperties": false, - "properties": { - "at": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "easing": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "linear", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "hold", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "bezier", - "type": "string" - }, - "x1": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "x2": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y1": { - "maximum": 5, - "minimum": -4, - "type": "number" - }, - "y2": { - "maximum": 5, - "minimum": -4, - "type": "number" - } - }, - "required": [ - "kind", - "x1", - "y1", - "x2", - "y2" - ], - "type": "object" - } - ] - }, - "value": { - "type": "number" - } - }, - "required": [ - "at", - "value" - ], - "type": "object" - }, - "maxItems": 256, - "minItems": 1, - "type": "array" - }, - "property": { - "enum": [ - "positionX", - "positionY", - "positionZ", - "rotationX", - "rotationY", - "rotationZ", - "fov", - "scale", - "opacity", - "openAngle", - "x", - "y", - "rotation", - "intensity", - "distance", - "range", - "maxBlur" - ], - "type": "string" - }, - "target": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "camera", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "layer", - "type": "string" - }, - "layerId": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - } - }, - "required": [ - "kind", - "layerId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "environment", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "focus", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - } - ] - } - }, - "required": [ - "target", - "property", - "keyframes" - ], - "type": "object" - }, - "type": "array" - }, - "backdrop": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "transparent", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "kind": { - "const": "solid", - "type": "string" - } - }, - "required": [ - "kind", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "angle": { - "default": 0, - "type": "number" - }, - "kind": { - "const": "linear", - "type": "string" - }, - "stops": { - "items": { - "additionalProperties": false, - "properties": { - "at": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - } - }, - "required": [ - "at", - "color" - ], - "type": "object" - }, - "maxItems": 8, - "minItems": 2, - "type": "array" - } - }, - "required": [ - "kind", - "stops" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "at": { - "default": [ - 0.5, - 0.5 - ], - "items": false, - "maxItems": 2, - "minItems": 2, - "prefixItems": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "maximum": 1, - "minimum": 0, - "type": "number" - } - ], - "type": "array" - }, - "kind": { - "const": "radial", - "type": "string" - }, - "stops": { - "items": { - "additionalProperties": false, - "properties": { - "at": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - } - }, - "required": [ - "at", - "color" - ], - "type": "object" - }, - "maxItems": 8, - "minItems": 2, - "type": "array" - } - }, - "required": [ - "kind", - "stops" - ], - "type": "object" - } - ], - "default": { - "kind": "transparent" - } - }, - "camera": { - "additionalProperties": false, - "properties": { - "fov": { - "maximum": 1.3962634015954636, - "minimum": 0.3141592653589793, - "type": "number" - }, - "position": { - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - } - }, - "type": "object" - }, - "constraints": { - "default": [], - "items": { - "additionalProperties": false, - "properties": { - "gap": { - "exclusiveMinimum": 0, - "type": "number" - }, - "kind": { - "const": "minSeparation", - "type": "string" - }, - "objects": { - "items": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "minItems": 2, - "type": "array" - } - }, - "required": [ - "kind", - "objects", - "gap" - ], - "type": "object" - }, - "type": "array" - }, - "environment": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "floorY": { - "default": -420, - "type": "number" - }, - "intensity": { - "default": 1, - "minimum": 0, - "type": "number" - }, - "kind": { - "const": "studio", - "type": "string" - }, - "lightingProfile": { - "default": "studio", - "enum": [ - "studio", - "studio-edge" - ], - "type": "string" - }, - "preset": { - "default": "soft", - "enum": [ - "soft", - "key", - "rim" - ], - "type": "string" - }, - "shadowOpacity": { - "default": 0.5, - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "photographic-studio-v1", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - } - ], - "default": { - "floorY": -420, - "intensity": 1, - "lightingProfile": "studio", - "preset": "soft", - "shadowOpacity": 0.5 - } - }, - "layers": { - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "children": { - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "children": { - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "children": { - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "children": { - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "laptop", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "openAngle": { - "maximum": 3.141592653589793, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 4000, - "minimum": 200, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "openAngle" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "phone", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 2000, - "minimum": 80, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "cornerRadius": { - "default": 32, - "minimum": 0, - "type": "number" - }, - "edgeRadius": { - "default": 15, - "minimum": 0, - "type": "number" - }, - "finish": { - "default": "satin", - "enum": [ - "satin", - "brushed" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "slab", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "thickness": { - "default": 32, - "maximum": 200, - "minimum": 4, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "backface": { - "default": "hidden", - "enum": [ - "hidden", - "visible" - ], - "type": "string" - }, - "depthWrite": { - "default": true, - "type": "boolean" - }, - "fit": { - "default": "contain", - "enum": [ - "contain", - "cover" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "page", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "transparency": { - "default": "straight", - "enum": [ - "straight", - "premultiplied", - "opaque" - ], - "type": "string" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height", - "surfaces" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "space": { - "const": "world", - "type": "string" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "rotation": { - "default": 0, - "type": "number" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - }, - "space": { - "const": "screen", - "type": "string" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space", - "x", - "y" - ], - "type": "object" - } - ] - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "group", - "type": "string" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "kind", - "id", - "children" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "laptop", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "openAngle": { - "maximum": 3.141592653589793, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 4000, - "minimum": 200, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "openAngle" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "phone", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 2000, - "minimum": 80, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "cornerRadius": { - "default": 32, - "minimum": 0, - "type": "number" - }, - "edgeRadius": { - "default": 15, - "minimum": 0, - "type": "number" - }, - "finish": { - "default": "satin", - "enum": [ - "satin", - "brushed" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "slab", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "thickness": { - "default": 32, - "maximum": 200, - "minimum": 4, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "backface": { - "default": "hidden", - "enum": [ - "hidden", - "visible" - ], - "type": "string" - }, - "depthWrite": { - "default": true, - "type": "boolean" - }, - "fit": { - "default": "contain", - "enum": [ - "contain", - "cover" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "page", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "transparency": { - "default": "straight", - "enum": [ - "straight", - "premultiplied", - "opaque" - ], - "type": "string" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height", - "surfaces" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "space": { - "const": "world", - "type": "string" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "rotation": { - "default": 0, - "type": "number" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - }, - "space": { - "const": "screen", - "type": "string" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space", - "x", - "y" - ], - "type": "object" - } - ] - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "group", - "type": "string" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "kind", - "id", - "children" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "laptop", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "openAngle": { - "maximum": 3.141592653589793, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 4000, - "minimum": 200, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "openAngle" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "phone", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 2000, - "minimum": 80, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "cornerRadius": { - "default": 32, - "minimum": 0, - "type": "number" - }, - "edgeRadius": { - "default": 15, - "minimum": 0, - "type": "number" - }, - "finish": { - "default": "satin", - "enum": [ - "satin", - "brushed" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "slab", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "thickness": { - "default": 32, - "maximum": 200, - "minimum": 4, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "backface": { - "default": "hidden", - "enum": [ - "hidden", - "visible" - ], - "type": "string" - }, - "depthWrite": { - "default": true, - "type": "boolean" - }, - "fit": { - "default": "contain", - "enum": [ - "contain", - "cover" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "page", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "transparency": { - "default": "straight", - "enum": [ - "straight", - "premultiplied", - "opaque" - ], - "type": "string" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height", - "surfaces" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "space": { - "const": "world", - "type": "string" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "rotation": { - "default": 0, - "type": "number" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - }, - "space": { - "const": "screen", - "type": "string" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space", - "x", - "y" - ], - "type": "object" - } - ] - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "group", - "type": "string" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "kind", - "id", - "children" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "laptop", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "openAngle": { - "maximum": 3.141592653589793, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 4000, - "minimum": 200, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "openAngle" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "phone", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 2000, - "minimum": 80, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "cornerRadius": { - "default": 32, - "minimum": 0, - "type": "number" - }, - "edgeRadius": { - "default": 15, - "minimum": 0, - "type": "number" - }, - "finish": { - "default": "satin", - "enum": [ - "satin", - "brushed" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "slab", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "thickness": { - "default": 32, - "maximum": 200, - "minimum": 4, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "backface": { - "default": "hidden", - "enum": [ - "hidden", - "visible" - ], - "type": "string" - }, - "depthWrite": { - "default": true, - "type": "boolean" - }, - "fit": { - "default": "contain", - "enum": [ - "contain", - "cover" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "page", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "transparency": { - "default": "straight", - "enum": [ - "straight", - "premultiplied", - "opaque" - ], - "type": "string" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height", - "surfaces" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "space": { - "const": "world", - "type": "string" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "rotation": { - "default": 0, - "type": "number" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - }, - "space": { - "const": "screen", - "type": "string" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space", - "x", - "y" - ], - "type": "object" - } - ] - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "group", - "type": "string" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "kind", - "id", - "children" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "laptop", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "openAngle": { - "maximum": 3.141592653589793, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 4000, - "minimum": 200, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "openAngle" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "phone", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 2000, - "minimum": 80, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "cornerRadius": { - "default": 32, - "minimum": 0, - "type": "number" - }, - "edgeRadius": { - "default": 15, - "minimum": 0, - "type": "number" - }, - "finish": { - "default": "satin", - "enum": [ - "satin", - "brushed" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "slab", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "thickness": { - "default": 32, - "maximum": 200, - "minimum": 4, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "backface": { - "default": "hidden", - "enum": [ - "hidden", - "visible" - ], - "type": "string" - }, - "depthWrite": { - "default": true, - "type": "boolean" - }, - "fit": { - "default": "contain", - "enum": [ - "contain", - "cover" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "page", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "transparency": { - "default": "straight", - "enum": [ - "straight", - "premultiplied", - "opaque" - ], - "type": "string" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height", - "surfaces" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "space": { - "const": "world", - "type": "string" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "rotation": { - "default": 0, - "type": "number" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - }, - "space": { - "const": "screen", - "type": "string" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space", - "x", - "y" - ], - "type": "object" - } - ] - }, - "minItems": 1, - "type": "array" - }, - "post": { - "additionalProperties": false, - "default": { - "focus": null, - "grain": 0, - "vignette": 0 - }, - "properties": { - "focus": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "distance": { - "exclusiveMinimum": 0, - "type": "number" - }, - "maxBlur": { - "maximum": 64, - "minimum": 0, - "type": "number" - }, - "range": { - "exclusiveMinimum": 0, - "type": "number" - } - }, - "required": [ - "distance", - "range", - "maxBlur" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "default": null - }, - "grain": { - "default": 0, - "maximum": 0.5, - "minimum": 0, - "type": "number" - }, - "vignette": { - "default": 0, - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "referenceSize": { - "additionalProperties": false, - "properties": { - "height": { - "maximum": 8192, - "minimum": 16, - "type": "integer" - }, - "width": { - "maximum": 8192, - "minimum": 16, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "version": { - "const": 2, - "type": "number" - } - }, - "required": [ - "version", - "referenceSize", - "layers" - ], - "type": "object" - }, - "startTime": { - "minimum": 0, - "type": "number" - }, - "trackId": { - "type": "string" - }, - "transitionIn": { - "additionalProperties": false, - "description": "Inter-scene transition.", - "properties": { - "duration": { - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "cut", - "fade", - "dissolve", - "wipe" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "type": { - "const": "scene.add", - "type": "string" - } - }, - "required": [ - "type", - "clipId", - "startTime", - "duration", - "scene", - "assets" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Revise a scene shot in place by clip id. Send a replacement `scene` and/or `assets`; timing changes use the ordinary clip timing fields (`startTime`, `duration`, `transitionIn`). Omitted fields keep their persisted values and the MERGED result is re-validated as a whole, so a partial edit cannot leave the shot invalid. Changing only values or asset IDs updates props and bindings and REUSES the pinned source; changing the referenced SLOT SET regenerates the wrapper manifest and registers a new immutable source version atomically. Undo restores the source reference, spec, bindings and timing together. Topology, asset bindings, text content, font properties, device kind and colours are STATIC within a shot's animation — change them here (a revised spec) rather than trying to animate them. This is not a source trim or slip: a shortened or extended clip resamples the SAME normalized animation over its new duration, and trim/slip requests on generated animation are rejected rather than reinterpreted as media trims. In one batch, `scene.update` may target a shot added by an earlier `scene.add`. ASSETS: `assets` binds each slot name a layer references to a media id in the same project, and the slot's declared KIND decides what it admits — an image slot takes PNG, JPEG or WebP, a video slot MP4 or WebM. Binding the wrong kind is refused with the slot's path.", - "properties": { - "assets": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "clipId": { - "type": "string" - }, - "duration": { - "exclusiveMinimum": 0, - "type": "number" - }, - "scene": { - "additionalProperties": false, - "description": "A version-2 scene shot: a self-contained 3D world-object shot that scene.add / scene.update materializes into an ordinary component clip. The shot owns its layers, camera, lighting, backdrop and normalized local animation; the composition owns start, duration, ordering, cuts and transitions. Coordinates are REFERENCE PIXELS: origin at frame centre, +X right, +Y down, +Z toward the viewer. referenceSize must have the SAME aspect ratio as the composition format; mismatch fails instead of cropping. At equal aspect ratio the shot scales uniformly by outputWidth/referenceWidth. A segment's easing belongs to the keyframe it ARRIVES at; the first keyframe has no easing. Authoring limits: 32 layers, 4 devices, 16 distinct image slots, 256 keyframes per channel, 2048 keyframes per shot. Version 2 supports nested groups, procedural slab/page/phone/laptop objects, screen- and world-space text, admitted image/component/video surfaces, fixed photographic and generated studio environments, transparent/solid/linear/radial backdrops, constraints, focus, grain and vignette. Raw HTML, custom shader props, imported GLB models, arbitrary external HDR environments, skeletal animation and physics are refused with an exact field path.", - "properties": { - "animation": { - "default": [], - "items": { - "additionalProperties": false, - "properties": { - "keyframes": { - "items": { - "additionalProperties": false, - "properties": { - "at": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "easing": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "linear", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "hold", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "bezier", - "type": "string" - }, - "x1": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "x2": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y1": { - "maximum": 5, - "minimum": -4, - "type": "number" - }, - "y2": { - "maximum": 5, - "minimum": -4, - "type": "number" - } - }, - "required": [ - "kind", - "x1", - "y1", - "x2", - "y2" - ], - "type": "object" - } - ] - }, - "value": { - "type": "number" - } - }, - "required": [ - "at", - "value" - ], - "type": "object" - }, - "maxItems": 256, - "minItems": 1, - "type": "array" - }, - "property": { - "enum": [ - "positionX", - "positionY", - "positionZ", - "rotationX", - "rotationY", - "rotationZ", - "fov", - "scale", - "opacity", - "openAngle", - "x", - "y", - "rotation", - "intensity", - "distance", - "range", - "maxBlur" - ], - "type": "string" - }, - "target": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "camera", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "layer", - "type": "string" - }, - "layerId": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - } - }, - "required": [ - "kind", - "layerId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "environment", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "focus", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - } - ] - } - }, - "required": [ - "target", - "property", - "keyframes" - ], - "type": "object" - }, - "type": "array" - }, - "backdrop": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "transparent", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "kind": { - "const": "solid", - "type": "string" - } - }, - "required": [ - "kind", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "angle": { - "default": 0, - "type": "number" - }, - "kind": { - "const": "linear", - "type": "string" - }, - "stops": { - "items": { - "additionalProperties": false, - "properties": { - "at": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - } - }, - "required": [ - "at", - "color" - ], - "type": "object" - }, - "maxItems": 8, - "minItems": 2, - "type": "array" - } - }, - "required": [ - "kind", - "stops" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "at": { - "default": [ - 0.5, - 0.5 - ], - "items": false, - "maxItems": 2, - "minItems": 2, - "prefixItems": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "maximum": 1, - "minimum": 0, - "type": "number" - } - ], - "type": "array" - }, - "kind": { - "const": "radial", - "type": "string" - }, - "stops": { - "items": { - "additionalProperties": false, - "properties": { - "at": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - } - }, - "required": [ - "at", - "color" - ], - "type": "object" - }, - "maxItems": 8, - "minItems": 2, - "type": "array" - } - }, - "required": [ - "kind", - "stops" - ], - "type": "object" - } - ], - "default": { - "kind": "transparent" - } - }, - "camera": { - "additionalProperties": false, - "properties": { - "fov": { - "maximum": 1.3962634015954636, - "minimum": 0.3141592653589793, - "type": "number" - }, - "position": { - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - } - }, - "type": "object" - }, - "constraints": { - "default": [], - "items": { - "additionalProperties": false, - "properties": { - "gap": { - "exclusiveMinimum": 0, - "type": "number" - }, - "kind": { - "const": "minSeparation", - "type": "string" - }, - "objects": { - "items": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "minItems": 2, - "type": "array" - } - }, - "required": [ - "kind", - "objects", - "gap" - ], - "type": "object" - }, - "type": "array" - }, - "environment": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "floorY": { - "default": -420, - "type": "number" - }, - "intensity": { - "default": 1, - "minimum": 0, - "type": "number" - }, - "kind": { - "const": "studio", - "type": "string" - }, - "lightingProfile": { - "default": "studio", - "enum": [ - "studio", - "studio-edge" - ], - "type": "string" - }, - "preset": { - "default": "soft", - "enum": [ - "soft", - "key", - "rim" - ], - "type": "string" - }, - "shadowOpacity": { - "default": 0.5, - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "photographic-studio-v1", - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - } - ], - "default": { - "floorY": -420, - "intensity": 1, - "lightingProfile": "studio", - "preset": "soft", - "shadowOpacity": 0.5 - } - }, - "layers": { - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "children": { - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "children": { - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "children": { - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "children": { - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "laptop", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "openAngle": { - "maximum": 3.141592653589793, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 4000, - "minimum": 200, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "openAngle" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "phone", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 2000, - "minimum": 80, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "cornerRadius": { - "default": 32, - "minimum": 0, - "type": "number" - }, - "edgeRadius": { - "default": 15, - "minimum": 0, - "type": "number" - }, - "finish": { - "default": "satin", - "enum": [ - "satin", - "brushed" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "slab", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "thickness": { - "default": 32, - "maximum": 200, - "minimum": 4, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "backface": { - "default": "hidden", - "enum": [ - "hidden", - "visible" - ], - "type": "string" - }, - "depthWrite": { - "default": true, - "type": "boolean" - }, - "fit": { - "default": "contain", - "enum": [ - "contain", - "cover" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "page", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "transparency": { - "default": "straight", - "enum": [ - "straight", - "premultiplied", - "opaque" - ], - "type": "string" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height", - "surfaces" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "space": { - "const": "world", - "type": "string" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "rotation": { - "default": 0, - "type": "number" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - }, - "space": { - "const": "screen", - "type": "string" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space", - "x", - "y" - ], - "type": "object" - } - ] - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "group", - "type": "string" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "kind", - "id", - "children" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "laptop", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "openAngle": { - "maximum": 3.141592653589793, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 4000, - "minimum": 200, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "openAngle" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "phone", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 2000, - "minimum": 80, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "cornerRadius": { - "default": 32, - "minimum": 0, - "type": "number" - }, - "edgeRadius": { - "default": 15, - "minimum": 0, - "type": "number" - }, - "finish": { - "default": "satin", - "enum": [ - "satin", - "brushed" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "slab", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "thickness": { - "default": 32, - "maximum": 200, - "minimum": 4, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "backface": { - "default": "hidden", - "enum": [ - "hidden", - "visible" - ], - "type": "string" - }, - "depthWrite": { - "default": true, - "type": "boolean" - }, - "fit": { - "default": "contain", - "enum": [ - "contain", - "cover" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "page", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "transparency": { - "default": "straight", - "enum": [ - "straight", - "premultiplied", - "opaque" - ], - "type": "string" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height", - "surfaces" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "space": { - "const": "world", - "type": "string" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "rotation": { - "default": 0, - "type": "number" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - }, - "space": { - "const": "screen", - "type": "string" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space", - "x", - "y" - ], - "type": "object" - } - ] - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "group", - "type": "string" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "kind", - "id", - "children" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "laptop", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "openAngle": { - "maximum": 3.141592653589793, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 4000, - "minimum": 200, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "openAngle" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "phone", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 2000, - "minimum": 80, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "cornerRadius": { - "default": 32, - "minimum": 0, - "type": "number" - }, - "edgeRadius": { - "default": 15, - "minimum": 0, - "type": "number" - }, - "finish": { - "default": "satin", - "enum": [ - "satin", - "brushed" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "slab", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "thickness": { - "default": 32, - "maximum": 200, - "minimum": 4, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "backface": { - "default": "hidden", - "enum": [ - "hidden", - "visible" - ], - "type": "string" - }, - "depthWrite": { - "default": true, - "type": "boolean" - }, - "fit": { - "default": "contain", - "enum": [ - "contain", - "cover" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "page", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "transparency": { - "default": "straight", - "enum": [ - "straight", - "premultiplied", - "opaque" - ], - "type": "string" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height", - "surfaces" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "space": { - "const": "world", - "type": "string" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "rotation": { - "default": 0, - "type": "number" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - }, - "space": { - "const": "screen", - "type": "string" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space", - "x", - "y" - ], - "type": "object" - } - ] - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "group", - "type": "string" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "kind", - "id", - "children" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "laptop", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "openAngle": { - "maximum": 3.141592653589793, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 4000, - "minimum": 200, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "openAngle" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "phone", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 2000, - "minimum": 80, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "cornerRadius": { - "default": 32, - "minimum": 0, - "type": "number" - }, - "edgeRadius": { - "default": 15, - "minimum": 0, - "type": "number" - }, - "finish": { - "default": "satin", - "enum": [ - "satin", - "brushed" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "slab", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "thickness": { - "default": 32, - "maximum": 200, - "minimum": 4, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "backface": { - "default": "hidden", - "enum": [ - "hidden", - "visible" - ], - "type": "string" - }, - "depthWrite": { - "default": true, - "type": "boolean" - }, - "fit": { - "default": "contain", - "enum": [ - "contain", - "cover" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "page", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "transparency": { - "default": "straight", - "enum": [ - "straight", - "premultiplied", - "opaque" - ], - "type": "string" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height", - "surfaces" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "space": { - "const": "world", - "type": "string" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "rotation": { - "default": 0, - "type": "number" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - }, - "space": { - "const": "screen", - "type": "string" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space", - "x", - "y" - ], - "type": "object" - } - ] - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "group", - "type": "string" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "kind", - "id", - "children" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "laptop", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "openAngle": { - "maximum": 3.141592653589793, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 4000, - "minimum": 200, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "openAngle" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "phone", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 2000, - "minimum": 80, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "cornerRadius": { - "default": 32, - "minimum": 0, - "type": "number" - }, - "edgeRadius": { - "default": 15, - "minimum": 0, - "type": "number" - }, - "finish": { - "default": "satin", - "enum": [ - "satin", - "brushed" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "slab", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "thickness": { - "default": 32, - "maximum": 200, - "minimum": 4, - "type": "number" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "backface": { - "default": "hidden", - "enum": [ - "hidden", - "visible" - ], - "type": "string" - }, - "depthWrite": { - "default": true, - "type": "boolean" - }, - "fit": { - "default": "contain", - "enum": [ - "contain", - "cover" - ], - "type": "string" - }, - "height": { - "maximum": 8000, - "minimum": 40, - "type": "number" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "page", - "type": "string" - }, - "materials": { - "items": { - "additionalProperties": false, - "properties": { - "anisotropy": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "anisotropyRotation": { - "type": "number" - }, - "clearcoat": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "clearcoatRoughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "ior": { - "maximum": 2.333, - "minimum": 1, - "type": "number" - }, - "metalness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reflectivity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "role": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "roughness": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "physical", - "unlit" - ], - "type": "string" - } - }, - "required": [ - "role", - "type" - ], - "type": "object" - }, - "maxItems": 16, - "type": "array" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "surfaces": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "assetSlot": { - "description": "Image asset slot name bound by the clip assets map; never a URL.", - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z_][A-Za-z0-9_-]*$", - "type": "string" - }, - "source": { - "const": "image", - "type": "string" - } - }, - "required": [ - "source", - "assetSlot" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "source": { - "const": "color", - "type": "string" - } - }, - "required": [ - "source", - "color" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bakeScale": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - } - ], - "description": "Optional authored scale. Preparation defaults omission to 2 and may auto-raise it to 3." - }, - "captureFrame": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "additionalProperties": false, - "properties": { - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId" - ], - "type": "object" - }, - "layout": { - "additionalProperties": false, - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "source": { - "const": "component", - "type": "string" - } - }, - "required": [ - "source", - "component", - "captureFrame", - "layout" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "endFrame": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "mediaId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "source": { - "const": "video", - "type": "string" - }, - "startFrame": { - "default": 0, - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "source", - "mediaId" - ], - "type": "object" - } - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "transparency": { - "default": "straight", - "enum": [ - "straight", - "premultiplied", - "opaque" - ], - "type": "string" - }, - "width": { - "maximum": 8000, - "minimum": 40, - "type": "number" - } - }, - "required": [ - "kind", - "id", - "width", - "height", - "surfaces" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "space": { - "const": "world", - "type": "string" - }, - "transform": { - "additionalProperties": false, - "default": { - "position": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], - "scale": 1 - }, - "properties": { - "position": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "rotation": { - "default": [ - 0, - 0, - 0 - ], - "items": false, - "maxItems": 3, - "minItems": 3, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "align": { - "default": "center", - "enum": [ - "left", - "center", - "right" - ], - "type": "string" - }, - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "fontFamily": { - "anyOf": [ - { - "maxLength": 128, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9 _.\\-]*$", - "type": "string" - }, - { - "enum": [ - "$brand:fonts.heading", - "$brand:fonts.body", - "$brand:fonts.caption" - ], - "type": "string" - } - ] - }, - "fontSize": { - "maximum": 800, - "minimum": 8, - "type": "number" - }, - "fontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "id": { - "maxLength": 64, - "minLength": 1, - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", - "type": "string" - }, - "kind": { - "const": "text", - "type": "string" - }, - "letterSpacing": { - "default": 0, - "maximum": 40, - "minimum": -20, - "type": "number" - }, - "lineHeight": { - "default": 1.2, - "maximum": 3, - "minimum": 0.6, - "type": "number" - }, - "lines": { - "items": { - "additionalProperties": false, - "properties": { - "runs": { - "items": { - "additionalProperties": false, - "properties": { - "color": { - "anyOf": [ - { - "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", - "type": "string" - }, - { - "enum": [ - "$brand:colors.background", - "$brand:colors.surface", - "$brand:colors.text", - "$brand:colors.textMuted", - "$brand:colors.accent", - "$brand:colors.accentStrong", - "$brand:colors.accentSoft", - "$brand:colors.success", - "$brand:colors.warning", - "$brand:colors.danger" - ], - "type": "string" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "text": { - "maxLength": 512, - "minLength": 1, - "pattern": "^[^\\r\\n]+$", - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "runs" - ], - "type": "object" - }, - "maxItems": 24, - "minItems": 1, - "type": "array" - }, - "maxWidth": { - "exclusiveMinimum": 0, - "type": "number" - }, - "opacity": { - "default": 1, - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "rotation": { - "default": 0, - "type": "number" - }, - "scale": { - "default": 1, - "exclusiveMinimum": 0, - "type": "number" - }, - "space": { - "const": "screen", - "type": "string" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "id", - "kind", - "lines", - "fontFamily", - "fontWeight", - "fontStyle", - "fontSize", - "color", - "space", - "x", - "y" - ], - "type": "object" - } - ] - }, - "minItems": 1, - "type": "array" - }, - "post": { - "additionalProperties": false, - "default": { - "focus": null, - "grain": 0, - "vignette": 0 - }, - "properties": { - "focus": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "distance": { - "exclusiveMinimum": 0, - "type": "number" - }, - "maxBlur": { - "maximum": 64, - "minimum": 0, - "type": "number" - }, - "range": { - "exclusiveMinimum": 0, - "type": "number" - } - }, - "required": [ - "distance", - "range", - "maxBlur" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "default": null - }, - "grain": { - "default": 0, - "maximum": 0.5, - "minimum": 0, - "type": "number" - }, - "vignette": { - "default": 0, - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "referenceSize": { - "additionalProperties": false, - "properties": { - "height": { - "maximum": 8192, - "minimum": 16, - "type": "integer" - }, - "width": { - "maximum": 8192, - "minimum": 16, - "type": "integer" - } - }, - "required": [ - "width", - "height" - ], - "type": "object" - }, - "version": { - "const": 2, - "type": "number" - } - }, - "required": [ - "version", - "referenceSize", - "layers" - ], - "type": "object" - }, - "startTime": { - "minimum": 0, - "type": "number" - }, - "transitionIn": { - "additionalProperties": false, - "description": "Inter-scene transition.", - "properties": { - "duration": { - "minimum": 0, - "type": "number" - }, - "type": { - "enum": [ - "cut", - "fade", - "dissolve", - "wipe" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "type": { - "const": "scene.update", - "type": "string" - } - }, - "required": [ - "type", - "clipId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Add a clip to the timeline. The clip self-routes to a track by FAMILY (`clip.kind`, else derived from `source.kind`, else the target track) — a `media` clip MUST carry `kind` (video|audio|image) or a `trackId`, else it is rejected as ambiguous. `trackId` targets an existing SAME-family track; `newTrack:true` (with optional pinned `newTrackId`) creates a fresh track of that family.", - "properties": { - "clip": { - "additionalProperties": false, - "properties": { - "animate": { - "additionalProperties": { - "items": { - "additionalProperties": false, - "properties": { - "easing": { - "anyOf": [ - { - "enum": [ - "linear", - "ease", - "easeIn", - "easeOut", - "easeInOut" - ], - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "cubicBezier": { - "items": false, - "maxItems": 4, - "minItems": 4, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - } - }, - "required": [ - "cubicBezier" - ], - "type": "object" - } - ] - }, - "time": { - "minimum": 0, - "type": "number" - }, - "value": { - "type": "number" - } - }, - "required": [ - "time", - "value" - ], - "type": "object" - }, - "minItems": 2, - "type": "array" - }, - "description": "Keyframe channels, clip-relative seconds. Each channel's values use the SAME unit as the scalar it animates: `opacity` 0 to 1, `scale` a multiplier (>0), `rotation` degrees, `position.x`/`position.y` a FRACTION of the frame like `position` (0.5 = centre; NOT pixels), `volume` 0 to 4.", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "captionVisibility": { - "description": "Video media clip only. Hide native captions while this clip is topmost and covers the lower picture, or when an opaque, effect-free clip has an explicitly full-frame region, even with fit:contain. Caption words and timings remain stored and resume when another visible clip takes over.", - "enum": [ - "visible", - "hidden" - ], - "type": "string" - }, - "duration": { - "description": "Clip duration (seconds).", - "exclusiveMinimum": 0, - "type": "number" - }, - "effects": { - "items": { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "type": "string" - }, - "window": { - "additionalProperties": false, - "properties": { - "duration": { - "exclusiveMinimum": 0, - "type": "number" - }, - "startTime": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "startTime", - "duration" - ], - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - }, - "fit": { - "enum": [ - "cover", - "contain" - ], - "type": "string" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "kind": { - "enum": [ - "video", - "audio", - "image", - "overlay", - "effect" - ], - "type": "string" - }, - "linkGroupId": { - "minLength": 1, - "type": "string" - }, - "opacity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "position": { - "additionalProperties": false, - "description": "Clip CENTRE as a fraction of the frame: {x:0.5,y:0.5} is dead centre, 0 to 1 is inside the frame, and a little overshoot (down to -1, up to 2) is how an entrance starts off-canvas. NOT pixels: the renderer maps x to `left: x*100%`, so `x: 180` sits 180 frame-widths away and draws nothing.", - "properties": { - "x": { - "maximum": 2, - "minimum": -1, - "type": "number" - }, - "y": { - "maximum": 2, - "minimum": -1, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "region": { - "additionalProperties": false, - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - "rotation": { - "type": "number" - }, - "scale": { - "exclusiveMinimum": 0, - "type": "number" - }, - "source": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "properties": { - "clipId": { - "minLength": 1, - "type": "string" - }, - "offsetMs": { - "type": "number" - } - }, - "required": [ - "clipId", - "offsetMs" - ], - "type": "object" - }, - "audioRole": { - "enum": [ - "sfx", - "music", - "vo", - "ambience" - ], - "type": "string" - }, - "duck": { - "additionalProperties": false, - "properties": { - "attackMs": { - "minimum": 0, - "type": "number" - }, - "duckDb": { - "maximum": 0, - "type": "number" - }, - "releaseMs": { - "minimum": 0, - "type": "number" - }, - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "endMs": { - "type": "number" - }, - "startMs": { - "type": "number" - } - }, - "required": [ - "startMs", - "endMs" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "duckDb", - "attackMs", - "releaseMs" - ], - "type": "object" - }, - "excludedRanges": { - "items": { - "additionalProperties": false, - "properties": { - "end": { - "minimum": 0, - "type": "number" - }, - "reason": { - "type": "string" - }, - "start": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "start", - "end" - ], - "type": "object" - }, - "type": "array" - }, - "fadeInMs": { - "minimum": 0, - "type": "number" - }, - "fadeOutMs": { - "minimum": 0, - "type": "number" - }, - "kenBurns": { - "enum": [ - "in", - "out", - "pan-l", - "pan-r", - "none" - ], - "type": "string" - }, - "kind": { - "const": "media", - "type": "string" - }, - "loop": { - "type": "boolean" - }, - "mediaId": { - "minLength": 1, - "type": "string" - }, - "muted": { - "type": "boolean" - }, - "playbackRate": { - "exclusiveMinimum": 0, - "type": "number" - }, - "reframe": { - "additionalProperties": false, - "properties": { - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "bias": { - "additionalProperties": false, - "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", - "properties": { - "x": { - "description": "Horizontal nudge, source-normalized (+ = right).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "y": { - "description": "Vertical nudge, source-normalized (+ = down).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "ease": { - "additionalProperties": false, - "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", - "properties": { - "in": { - "description": "Ease-IN ramp DURATION in seconds at the segment START.", - "minimum": 0, - "type": "number" - }, - "out": { - "description": "Ease-OUT ramp DURATION in seconds at the segment END.", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "in", - "out" - ], - "type": "object" - }, - "endSec": { - "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", - "exclusiveMinimum": 0, - "type": "number" - }, - "focus": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "frame-center", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "point", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "mode", - "x", - "y" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "faceId": { - "minLength": 1, - "type": "string" - }, - "mode": { - "const": "face", - "type": "string" - }, - "shotScale": { - "enum": [ - "close", - "standard", - "wide" - ], - "type": "string" - } - }, - "required": [ - "mode", - "faceId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "all-faces", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "active-speaker", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - } - ], - "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight." - }, - "intent": { - "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", - "type": "string" - }, - "startSec": { - "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", - "minimum": 0, - "type": "number" - }, - "zoom": { - "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale` — a face-tracked shot is sized EITHER by the editorial scale (shotScale, which the bake calibrates to the detected face) OR by an explicit zoom, never both. A segment carrying both is REJECTED: shotScale wins at bake time and the zoom would be silently discarded.", - "maximum": 1, - "minimum": 0.1, - "type": "number" - } - }, - "required": [ - "startSec", - "endSec", - "focus" - ], - "type": "object" - }, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "segments" - ], - "type": "object" - }, - "sync": { - "enum": [ - "video", - "independent" - ], - "type": "string" - }, - "trim": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Source trim end (seconds).", - "minimum": 0, - "type": "number" - }, - "start": { - "description": "Source trim start (seconds).", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "start", - "end" - ], - "type": "object" - }, - "volume": { - "maximum": 4, - "minimum": 0, - "type": "number" - }, - "volumeDb": { - "type": "number" - } - }, - "required": [ - "kind", - "mediaId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "componentId": { - "minLength": 1, - "type": "string" - }, - "execution": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "kind": { - "const": "component", - "type": "string" - }, - "placement": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "clip", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "content-slots", - "type": "string" - }, - "slots": { - "additionalProperties": { - "additionalProperties": false, - "properties": { - "ownership": { - "enum": [ - "reference", - "exclusive" - ], - "type": "string" - }, - "targetClipIds": { - "items": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "targetClipIds", - "ownership" - ], - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "kind", - "slots" - ], - "type": "object" - } - ] - }, - "props": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "kind", - "componentId", - "props", - "execution", - "placement" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "properties": { - "space": { - "const": "scene", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "space", - "x", - "y" - ], - "type": "object" - }, - "kind": { - "const": "overlay", - "type": "string" - }, - "parallax": { - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "pattern": "^(?!custom$)", - "type": "string" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "kind", - "primitiveId", - "params" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "kind": { - "const": "effect", - "type": "string" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "type": "string" - }, - "targetTrackIds": { - "items": { - "minLength": 1, - "type": "string" - }, - "minItems": 1, - "type": "array" - }, - "wrapperOrder": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "html": { - "description": "Your card's HTML — rendered VERBATIM as the graphic (shell motion via applyMotionPreset in a FOLLOWING call). CANVAS CONTRACT: the card renders in a viewport equal to the composition format's pixel frame (1080×1920 at 9:16 fhd); the root is NOT auto-pinned — declare explicit width/height matching the frame (box-sizing:border-box) and anchor content with flex/grid; position:absolute;inset:0 on the root does NOT fill the frame; for edge-to-edge backgrounds add an inner absolutely-positioned layer with generous negative inset. Overlay compositing applies a ~92% safe-area inset — keep critical copy away from the extreme edges. FONTS: name a family from GET /v1/fonts (list_render_fonts) — the renderer loads those faces for the card and waits for them, so `font-family: Inter` draws Inter. `@import` and remote font files are REFUSED: the card renders with no network. A family that is not on that list has no bytes behind it and the browser falls back, so end any stack with a generic (`Inter, sans-serif`) rather than relying on a system face being present.", - "minLength": 1, - "type": "string" - }, - "kind": { - "const": "card", - "type": "string" - }, - "tokens": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "zPlane": { - "const": "front", - "type": "string" - } - }, - "required": [ - "kind", - "html" - ], - "type": "object" - } - ] - }, - "startTime": { - "description": "Timeline start (seconds).", - "minimum": 0, - "type": "number" - }, - "transitionIn": { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "duration": { - "exclusiveMinimum": 0, - "type": "number" - }, - "fromClipId": { - "minLength": 1, - "type": "string" - }, - "handlePolicy": { - "const": "outgoing-overrun-at-cut-v1", - "type": "string" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "toClipId": { - "minLength": 1, - "type": "string" - }, - "type": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "type", - "duration" - ], - "type": "object" - } - }, - "required": [ - "id", - "startTime", - "duration", - "source" - ], - "type": "object" - }, - "newTrack": { - "type": "boolean" - }, - "newTrackId": { - "type": "string" - }, - "trackId": { - "type": "string" - }, - "type": { - "const": "clip.add", - "type": "string" - } - }, - "required": [ - "type", - "clip" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Remove a clip by id (located across every track).", - "properties": { - "clipId": { - "type": "string" - }, - "type": { - "const": "clip.remove", - "type": "string" - } - }, - "required": [ - "type", - "clipId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Patch an existing clip by id (cross-family). The patch is a partial TimelineClip. NOTE: `source` is REPLACED wholesale — the patch merges at the top level only, so a partial `source` WIPES the source fields you omit. Patch the whole source object when changing it. (To change reframe/excluded ranges, prefer setCropIntents / addExcludedRange, not a source patch.)", - "properties": { - "clipId": { - "type": "string" - }, - "patch": { - "additionalProperties": false, - "properties": { - "animate": { - "additionalProperties": { - "items": { - "additionalProperties": false, - "properties": { - "easing": { - "anyOf": [ - { - "enum": [ - "linear", - "ease", - "easeIn", - "easeOut", - "easeInOut" - ], - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "cubicBezier": { - "items": false, - "maxItems": 4, - "minItems": 4, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - } - }, - "required": [ - "cubicBezier" - ], - "type": "object" - } - ] - }, - "time": { - "minimum": 0, - "type": "number" - }, - "value": { - "type": "number" - } - }, - "required": [ - "time", - "value" - ], - "type": "object" - }, - "minItems": 2, - "type": "array" - }, - "description": "Keyframe channels, clip-relative seconds. Each channel's values use the SAME unit as the scalar it animates: `opacity` 0 to 1, `scale` a multiplier (>0), `rotation` degrees, `position.x`/`position.y` a FRACTION of the frame like `position` (0.5 = centre; NOT pixels), `volume` 0 to 4.", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "captionVisibility": { - "description": "Video media clip only. Hide native captions while this clip is topmost and covers the lower picture, or when an opaque, effect-free clip has an explicitly full-frame region, even with fit:contain. Caption words and timings remain stored and resume when another visible clip takes over.", - "enum": [ - "visible", - "hidden" - ], - "type": "string" - }, - "duration": { - "description": "Clip duration (seconds).", - "exclusiveMinimum": 0, - "type": "number" - }, - "effects": { - "items": { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "type": "string" - }, - "window": { - "additionalProperties": false, - "properties": { - "duration": { - "exclusiveMinimum": 0, - "type": "number" - }, - "startTime": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "startTime", - "duration" - ], - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - }, - "fit": { - "enum": [ - "cover", - "contain" - ], - "type": "string" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "kind": { - "enum": [ - "video", - "audio", - "image", - "overlay", - "effect" - ], - "type": "string" - }, - "linkGroupId": { - "minLength": 1, - "type": "string" - }, - "opacity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "position": { - "additionalProperties": false, - "description": "Clip CENTRE as a fraction of the frame: {x:0.5,y:0.5} is dead centre, 0 to 1 is inside the frame, and a little overshoot (down to -1, up to 2) is how an entrance starts off-canvas. NOT pixels: the renderer maps x to `left: x*100%`, so `x: 180` sits 180 frame-widths away and draws nothing.", - "properties": { - "x": { - "maximum": 2, - "minimum": -1, - "type": "number" - }, - "y": { - "maximum": 2, - "minimum": -1, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "region": { - "additionalProperties": false, - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - "rotation": { - "type": "number" - }, - "scale": { - "exclusiveMinimum": 0, - "type": "number" - }, - "source": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "properties": { - "clipId": { - "minLength": 1, - "type": "string" - }, - "offsetMs": { - "type": "number" - } - }, - "required": [ - "clipId", - "offsetMs" - ], - "type": "object" - }, - "audioRole": { - "enum": [ - "sfx", - "music", - "vo", - "ambience" - ], - "type": "string" - }, - "duck": { - "additionalProperties": false, - "properties": { - "attackMs": { - "minimum": 0, - "type": "number" - }, - "duckDb": { - "maximum": 0, - "type": "number" - }, - "releaseMs": { - "minimum": 0, - "type": "number" - }, - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "endMs": { - "type": "number" - }, - "startMs": { - "type": "number" - } - }, - "required": [ - "startMs", - "endMs" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "duckDb", - "attackMs", - "releaseMs" - ], - "type": "object" - }, - "excludedRanges": { - "items": { - "additionalProperties": false, - "properties": { - "end": { - "minimum": 0, - "type": "number" - }, - "reason": { - "type": "string" - }, - "start": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "start", - "end" - ], - "type": "object" - }, - "type": "array" - }, - "fadeInMs": { - "minimum": 0, - "type": "number" - }, - "fadeOutMs": { - "minimum": 0, - "type": "number" - }, - "kenBurns": { - "enum": [ - "in", - "out", - "pan-l", - "pan-r", - "none" - ], - "type": "string" - }, - "kind": { - "const": "media", - "type": "string" - }, - "loop": { - "type": "boolean" - }, - "mediaId": { - "minLength": 1, - "type": "string" - }, - "muted": { - "type": "boolean" - }, - "playbackRate": { - "exclusiveMinimum": 0, - "type": "number" - }, - "reframe": { - "additionalProperties": false, - "properties": { - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "bias": { - "additionalProperties": false, - "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", - "properties": { - "x": { - "description": "Horizontal nudge, source-normalized (+ = right).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "y": { - "description": "Vertical nudge, source-normalized (+ = down).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "ease": { - "additionalProperties": false, - "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", - "properties": { - "in": { - "description": "Ease-IN ramp DURATION in seconds at the segment START.", - "minimum": 0, - "type": "number" - }, - "out": { - "description": "Ease-OUT ramp DURATION in seconds at the segment END.", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "in", - "out" - ], - "type": "object" - }, - "endSec": { - "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", - "exclusiveMinimum": 0, - "type": "number" - }, - "focus": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "frame-center", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "point", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "mode", - "x", - "y" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "faceId": { - "minLength": 1, - "type": "string" - }, - "mode": { - "const": "face", - "type": "string" - }, - "shotScale": { - "enum": [ - "close", - "standard", - "wide" - ], - "type": "string" - } - }, - "required": [ - "mode", - "faceId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "all-faces", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "active-speaker", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - } - ], - "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight." - }, - "intent": { - "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", - "type": "string" - }, - "startSec": { - "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", - "minimum": 0, - "type": "number" - }, - "zoom": { - "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale` — a face-tracked shot is sized EITHER by the editorial scale (shotScale, which the bake calibrates to the detected face) OR by an explicit zoom, never both. A segment carrying both is REJECTED: shotScale wins at bake time and the zoom would be silently discarded.", - "maximum": 1, - "minimum": 0.1, - "type": "number" - } - }, - "required": [ - "startSec", - "endSec", - "focus" - ], - "type": "object" - }, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "segments" - ], - "type": "object" - }, - "sync": { - "enum": [ - "video", - "independent" - ], - "type": "string" - }, - "trim": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Source trim end (seconds).", - "minimum": 0, - "type": "number" - }, - "start": { - "description": "Source trim start (seconds).", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "start", - "end" - ], - "type": "object" - }, - "volume": { - "maximum": 4, - "minimum": 0, - "type": "number" - }, - "volumeDb": { - "type": "number" - } - }, - "required": [ - "kind", - "mediaId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "componentId": { - "minLength": 1, - "type": "string" - }, - "execution": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "kind": { - "const": "component", - "type": "string" - }, - "placement": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "clip", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "content-slots", - "type": "string" - }, - "slots": { - "additionalProperties": { - "additionalProperties": false, - "properties": { - "ownership": { - "enum": [ - "reference", - "exclusive" - ], - "type": "string" - }, - "targetClipIds": { - "items": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "targetClipIds", - "ownership" - ], - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "kind", - "slots" - ], - "type": "object" - } - ] - }, - "props": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "kind", - "componentId", - "props", - "execution", - "placement" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "properties": { - "space": { - "const": "scene", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "space", - "x", - "y" - ], - "type": "object" - }, - "kind": { - "const": "overlay", - "type": "string" - }, - "parallax": { - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "pattern": "^(?!custom$)", - "type": "string" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "kind", - "primitiveId", - "params" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "kind": { - "const": "effect", - "type": "string" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "type": "string" - }, - "targetTrackIds": { - "items": { - "minLength": 1, - "type": "string" - }, - "minItems": 1, - "type": "array" - }, - "wrapperOrder": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "html": { - "description": "Your card's HTML — rendered VERBATIM as the graphic (shell motion via applyMotionPreset in a FOLLOWING call). CANVAS CONTRACT: the card renders in a viewport equal to the composition format's pixel frame (1080×1920 at 9:16 fhd); the root is NOT auto-pinned — declare explicit width/height matching the frame (box-sizing:border-box) and anchor content with flex/grid; position:absolute;inset:0 on the root does NOT fill the frame; for edge-to-edge backgrounds add an inner absolutely-positioned layer with generous negative inset. Overlay compositing applies a ~92% safe-area inset — keep critical copy away from the extreme edges. FONTS: name a family from GET /v1/fonts (list_render_fonts) — the renderer loads those faces for the card and waits for them, so `font-family: Inter` draws Inter. `@import` and remote font files are REFUSED: the card renders with no network. A family that is not on that list has no bytes behind it and the browser falls back, so end any stack with a generic (`Inter, sans-serif`) rather than relying on a system face being present.", - "minLength": 1, - "type": "string" - }, - "kind": { - "const": "card", - "type": "string" - }, - "tokens": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "zPlane": { - "const": "front", - "type": "string" - } - }, - "required": [ - "kind", - "html" - ], - "type": "object" - } - ] - }, - "startTime": { - "description": "Timeline start (seconds).", - "minimum": 0, - "type": "number" - }, - "transitionIn": { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "duration": { - "exclusiveMinimum": 0, - "type": "number" - }, - "fromClipId": { - "minLength": 1, - "type": "string" - }, - "handlePolicy": { - "const": "outgoing-overrun-at-cut-v1", - "type": "string" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "toClipId": { - "minLength": 1, - "type": "string" - }, - "type": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "type", - "duration" - ], - "type": "object" - } - }, - "type": "object" - }, - "type": { - "const": "clip.update", - "type": "string" - } - }, - "required": [ - "type", - "clipId", - "patch" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Remove EVERY clip sourced from a given mediaId (e.g. after deleting that media).", - "properties": { - "mediaId": { - "type": "string" - }, - "type": { - "const": "removeClipsByMediaId", - "type": "string" - } - }, - "required": [ - "type", - "mediaId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Replace the overlay channel wholesale with the given clips (bulk set, not a merge).", - "properties": { - "clips": { - "items": { - "additionalProperties": false, - "properties": { - "animate": { - "additionalProperties": { - "items": { - "additionalProperties": false, - "properties": { - "easing": { - "anyOf": [ - { - "enum": [ - "linear", - "ease", - "easeIn", - "easeOut", - "easeInOut" - ], - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "cubicBezier": { - "items": false, - "maxItems": 4, - "minItems": 4, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - } - }, - "required": [ - "cubicBezier" - ], - "type": "object" - } - ] - }, - "time": { - "minimum": 0, - "type": "number" - }, - "value": { - "type": "number" - } - }, - "required": [ - "time", - "value" - ], - "type": "object" - }, - "minItems": 2, - "type": "array" - }, - "description": "Keyframe channels, clip-relative seconds. Each channel's values use the SAME unit as the scalar it animates: `opacity` 0 to 1, `scale` a multiplier (>0), `rotation` degrees, `position.x`/`position.y` a FRACTION of the frame like `position` (0.5 = centre; NOT pixels), `volume` 0 to 4.", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "captionVisibility": { - "description": "Video media clip only. Hide native captions while this clip is topmost and covers the lower picture, or when an opaque, effect-free clip has an explicitly full-frame region, even with fit:contain. Caption words and timings remain stored and resume when another visible clip takes over.", - "enum": [ - "visible", - "hidden" - ], - "type": "string" - }, - "duration": { - "description": "Clip duration (seconds).", - "exclusiveMinimum": 0, - "type": "number" - }, - "effects": { - "items": { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "type": "string" - }, - "window": { - "additionalProperties": false, - "properties": { - "duration": { - "exclusiveMinimum": 0, - "type": "number" - }, - "startTime": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "startTime", - "duration" - ], - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - }, - "fit": { - "enum": [ - "cover", - "contain" - ], - "type": "string" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "kind": { - "enum": [ - "video", - "audio", - "image", - "overlay", - "effect" - ], - "type": "string" - }, - "linkGroupId": { - "minLength": 1, - "type": "string" - }, - "opacity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "position": { - "additionalProperties": false, - "description": "Clip CENTRE as a fraction of the frame: {x:0.5,y:0.5} is dead centre, 0 to 1 is inside the frame, and a little overshoot (down to -1, up to 2) is how an entrance starts off-canvas. NOT pixels: the renderer maps x to `left: x*100%`, so `x: 180` sits 180 frame-widths away and draws nothing.", - "properties": { - "x": { - "maximum": 2, - "minimum": -1, - "type": "number" - }, - "y": { - "maximum": 2, - "minimum": -1, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "region": { - "additionalProperties": false, - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - "rotation": { - "type": "number" - }, - "scale": { - "exclusiveMinimum": 0, - "type": "number" - }, - "source": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "properties": { - "clipId": { - "minLength": 1, - "type": "string" - }, - "offsetMs": { - "type": "number" - } - }, - "required": [ - "clipId", - "offsetMs" - ], - "type": "object" - }, - "audioRole": { - "enum": [ - "sfx", - "music", - "vo", - "ambience" - ], - "type": "string" - }, - "duck": { - "additionalProperties": false, - "properties": { - "attackMs": { - "minimum": 0, - "type": "number" - }, - "duckDb": { - "maximum": 0, - "type": "number" - }, - "releaseMs": { - "minimum": 0, - "type": "number" - }, - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "endMs": { - "type": "number" - }, - "startMs": { - "type": "number" - } - }, - "required": [ - "startMs", - "endMs" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "duckDb", - "attackMs", - "releaseMs" - ], - "type": "object" - }, - "excludedRanges": { - "items": { - "additionalProperties": false, - "properties": { - "end": { - "minimum": 0, - "type": "number" - }, - "reason": { - "type": "string" - }, - "start": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "start", - "end" - ], - "type": "object" - }, - "type": "array" - }, - "fadeInMs": { - "minimum": 0, - "type": "number" - }, - "fadeOutMs": { - "minimum": 0, - "type": "number" - }, - "kenBurns": { - "enum": [ - "in", - "out", - "pan-l", - "pan-r", - "none" - ], - "type": "string" - }, - "kind": { - "const": "media", - "type": "string" - }, - "loop": { - "type": "boolean" - }, - "mediaId": { - "minLength": 1, - "type": "string" - }, - "muted": { - "type": "boolean" - }, - "playbackRate": { - "exclusiveMinimum": 0, - "type": "number" - }, - "reframe": { - "additionalProperties": false, - "properties": { - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "bias": { - "additionalProperties": false, - "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", - "properties": { - "x": { - "description": "Horizontal nudge, source-normalized (+ = right).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "y": { - "description": "Vertical nudge, source-normalized (+ = down).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "ease": { - "additionalProperties": false, - "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", - "properties": { - "in": { - "description": "Ease-IN ramp DURATION in seconds at the segment START.", - "minimum": 0, - "type": "number" - }, - "out": { - "description": "Ease-OUT ramp DURATION in seconds at the segment END.", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "in", - "out" - ], - "type": "object" - }, - "endSec": { - "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", - "exclusiveMinimum": 0, - "type": "number" - }, - "focus": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "frame-center", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "point", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "mode", - "x", - "y" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "faceId": { - "minLength": 1, - "type": "string" - }, - "mode": { - "const": "face", - "type": "string" - }, - "shotScale": { - "enum": [ - "close", - "standard", - "wide" - ], - "type": "string" - } - }, - "required": [ - "mode", - "faceId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "all-faces", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "active-speaker", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - } - ], - "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight." - }, - "intent": { - "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", - "type": "string" - }, - "startSec": { - "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", - "minimum": 0, - "type": "number" - }, - "zoom": { - "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale` — a face-tracked shot is sized EITHER by the editorial scale (shotScale, which the bake calibrates to the detected face) OR by an explicit zoom, never both. A segment carrying both is REJECTED: shotScale wins at bake time and the zoom would be silently discarded.", - "maximum": 1, - "minimum": 0.1, - "type": "number" - } - }, - "required": [ - "startSec", - "endSec", - "focus" - ], - "type": "object" - }, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "segments" - ], - "type": "object" - }, - "sync": { - "enum": [ - "video", - "independent" - ], - "type": "string" - }, - "trim": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Source trim end (seconds).", - "minimum": 0, - "type": "number" - }, - "start": { - "description": "Source trim start (seconds).", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "start", - "end" - ], - "type": "object" - }, - "volume": { - "maximum": 4, - "minimum": 0, - "type": "number" - }, - "volumeDb": { - "type": "number" - } - }, - "required": [ - "kind", - "mediaId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "componentId": { - "minLength": 1, - "type": "string" - }, - "execution": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "kind": { - "const": "component", - "type": "string" - }, - "placement": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "clip", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "content-slots", - "type": "string" - }, - "slots": { - "additionalProperties": { - "additionalProperties": false, - "properties": { - "ownership": { - "enum": [ - "reference", - "exclusive" - ], - "type": "string" - }, - "targetClipIds": { - "items": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "targetClipIds", - "ownership" - ], - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "kind", - "slots" - ], - "type": "object" - } - ] - }, - "props": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "kind", - "componentId", - "props", - "execution", - "placement" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "properties": { - "space": { - "const": "scene", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "space", - "x", - "y" - ], - "type": "object" - }, - "kind": { - "const": "overlay", - "type": "string" - }, - "parallax": { - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "pattern": "^(?!custom$)", - "type": "string" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "kind", - "primitiveId", - "params" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "kind": { - "const": "effect", - "type": "string" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "type": "string" - }, - "targetTrackIds": { - "items": { - "minLength": 1, - "type": "string" - }, - "minItems": 1, - "type": "array" - }, - "wrapperOrder": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "html": { - "description": "Your card's HTML — rendered VERBATIM as the graphic (shell motion via applyMotionPreset in a FOLLOWING call). CANVAS CONTRACT: the card renders in a viewport equal to the composition format's pixel frame (1080×1920 at 9:16 fhd); the root is NOT auto-pinned — declare explicit width/height matching the frame (box-sizing:border-box) and anchor content with flex/grid; position:absolute;inset:0 on the root does NOT fill the frame; for edge-to-edge backgrounds add an inner absolutely-positioned layer with generous negative inset. Overlay compositing applies a ~92% safe-area inset — keep critical copy away from the extreme edges. FONTS: name a family from GET /v1/fonts (list_render_fonts) — the renderer loads those faces for the card and waits for them, so `font-family: Inter` draws Inter. `@import` and remote font files are REFUSED: the card renders with no network. A family that is not on that list has no bytes behind it and the browser falls back, so end any stack with a generic (`Inter, sans-serif`) rather than relying on a system face being present.", - "minLength": 1, - "type": "string" - }, - "kind": { - "const": "card", - "type": "string" - }, - "tokens": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "zPlane": { - "const": "front", - "type": "string" - } - }, - "required": [ - "kind", - "html" - ], - "type": "object" - } - ] - }, - "startTime": { - "description": "Timeline start (seconds).", - "minimum": 0, - "type": "number" - }, - "transitionIn": { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "duration": { - "exclusiveMinimum": 0, - "type": "number" - }, - "fromClipId": { - "minLength": 1, - "type": "string" - }, - "handlePolicy": { - "const": "outgoing-overrun-at-cut-v1", - "type": "string" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "toClipId": { - "minLength": 1, - "type": "string" - }, - "type": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "type", - "duration" - ], - "type": "object" - } - }, - "required": [ - "id", - "startTime", - "duration", - "source" - ], - "type": "object" - }, - "type": "array" - }, - "type": { - "const": "loadOverlays", - "type": "string" - } - }, - "required": [ - "type", - "clips" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Add a timeline marker (a named time point/range; carry extensions in `metadata`).", - "properties": { - "marker": { - "additionalProperties": false, - "properties": { - "endTime": { - "minimum": 0, - "type": "number" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "kind": { - "minLength": 1, - "type": "string" - }, - "metadata": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "name": { - "type": "string" - }, - "startTime": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "id", - "startTime", - "kind" - ], - "type": "object" - }, - "type": { - "const": "addMarker", - "type": "string" - } - }, - "required": [ - "type", - "marker" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Remove a marker by id.", - "properties": { - "markerId": { - "type": "string" - }, - "type": { - "const": "removeMarker", - "type": "string" - } - }, - "required": [ - "type", - "markerId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Patch a marker's fields by id (partial merge).", - "properties": { - "markerId": { - "type": "string" - }, - "type": { - "const": "updateMarker", - "type": "string" - }, - "updates": { - "additionalProperties": false, - "properties": { - "endTime": { - "minimum": 0, - "type": "number" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "kind": { - "minLength": 1, - "type": "string" - }, - "metadata": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "name": { - "type": "string" - }, - "startTime": { - "minimum": 0, - "type": "number" - } - }, - "type": "object" - } - }, - "required": [ - "type", - "markerId", - "updates" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Set (or CLEAR, with `segments: null`) the camera/reframe channel on a MEDIA clip — the time-aligned source→output viewport (focus, zoom, ease, bias). This is the PREFERRED way to author reframing; do NOT reframe via a whole-source `clip.update` patch. Segments tile the clip's duration.", - "properties": { - "clipId": { - "type": "string" - }, - "segments": { - "anyOf": [ - { - "items": { - "additionalProperties": false, - "properties": { - "bias": { - "additionalProperties": false, - "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", - "properties": { - "x": { - "description": "Horizontal nudge, source-normalized (+ = right).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "y": { - "description": "Vertical nudge, source-normalized (+ = down).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "ease": { - "additionalProperties": false, - "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", - "properties": { - "in": { - "description": "Ease-IN ramp DURATION in seconds at the segment START.", - "minimum": 0, - "type": "number" - }, - "out": { - "description": "Ease-OUT ramp DURATION in seconds at the segment END.", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "in", - "out" - ], - "type": "object" - }, - "endSec": { - "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", - "exclusiveMinimum": 0, - "type": "number" - }, - "focus": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "frame-center", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "point", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "mode", - "x", - "y" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "faceId": { - "minLength": 1, - "type": "string" - }, - "mode": { - "const": "face", - "type": "string" - }, - "shotScale": { - "enum": [ - "close", - "standard", - "wide" - ], - "type": "string" - } - }, - "required": [ - "mode", - "faceId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "all-faces", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "active-speaker", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - } - ], - "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight." - }, - "intent": { - "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", - "type": "string" - }, - "startSec": { - "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", - "minimum": 0, - "type": "number" - }, - "zoom": { - "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale` — a face-tracked shot is sized EITHER by the editorial scale (shotScale, which the bake calibrates to the detected face) OR by an explicit zoom, never both. A segment carrying both is REJECTED: shotScale wins at bake time and the zoom would be silently discarded.", - "maximum": 1, - "minimum": 0.1, - "type": "number" - } - }, - "required": [ - "startSec", - "endSec", - "focus" - ], - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "type": { - "const": "setCropIntents", - "type": "string" - } - }, - "required": [ - "type", - "clipId", - "segments" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Set (or CLEAR, with `effects: []`) a clip's EFFECT channel — the registered effect primitives stacked onto that clip, each `{ primitiveId, params? }`. WHOLESALE: the array REPLACES the clip's current effects, so send the full stack (read the clip first to add one). This is the ONLY way to change effects on an existing clip — do NOT reach for a `clip.update` patch, whose top-level merge is the source-clobbering footgun documented above.", - "properties": { - "clipId": { - "type": "string" - }, - "effects": { - "items": { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "type": "string" - }, - "window": { - "additionalProperties": false, - "properties": { - "duration": { - "exclusiveMinimum": 0, - "type": "number" - }, - "startTime": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "startTime", - "duration" - ], - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - }, - "type": { - "const": "setEffects", - "type": "string" - } - }, - "required": [ - "type", - "clipId", - "effects" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Merge style overrides (font/color/position/emphasis) onto the composition's caption layer. Partial — omitted fields keep their current value; creates the caption container if absent.", - "properties": { - "style": { - "additionalProperties": false, - "properties": { - "annotationColor": { - "type": "string" - }, - "annotationStrokeWidth": { - "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", - "maximum": 12, - "minimum": 0.5, - "type": "number" - }, - "annotationTexture": { - "description": "Native annotation stroke finish; default clean.", - "enum": [ - "clean", - "pencil" - ], - "type": "string" - }, - "backgroundColor": { - "type": "string" - }, - "color": { - "minLength": 1, - "type": "string" - }, - "emphasisColor": { - "type": "string" - }, - "emphasisFontFamily": { - "type": "string" - }, - "emphasisFontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "emphasisFontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "emphasisGradient": { - "type": "string" - }, - "emphasisLetterSpacing": { - "type": "number" - }, - "emphasisPlate": { - "type": "boolean" - }, - "emphasisPlateAltColor": { - "type": "string" - }, - "emphasisPlateAltTextColor": { - "type": "string" - }, - "emphasisPlateColor": { - "type": "string" - }, - "emphasisPlatePadX": { - "type": "number" - }, - "emphasisPlatePadY": { - "type": "number" - }, - "emphasisPlateRadius": { - "minimum": 0, - "type": "number" - }, - "emphasisPlateReveal": { - "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", - "type": "boolean" - }, - "emphasisPlateTextColor": { - "type": "string" - }, - "emphasisScale": { - "exclusiveMinimum": 0, - "type": "number" - }, - "emphasisTextTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "entrance": { - "enum": [ - "none", - "fade", - "word-pop", - "stagger-up" - ], - "type": "string" - }, - "entranceMs": { - "minimum": 0, - "type": "number" - }, - "entranceStaggerMs": { - "minimum": 0, - "type": "number" - }, - "exitMs": { - "minimum": 0, - "type": "number" - }, - "fontFamily": { - "minLength": 1, - "type": "string" - }, - "fontSize": { - "description": "Font size as % of composition height (1-15, default 5). NOT px.", - "maximum": 15, - "minimum": 1, - "type": "number" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "highlightColor": { - "minLength": 1, - "type": "string" - }, - "letterSpacing": { - "description": "Base caption glyph spacing in pixels.", - "maximum": 20, - "minimum": -5, - "type": "number" - }, - "lineGapEm": { - "description": "Gap between caption lines as a multiple of base font size; default 0.25.", - "maximum": 2, - "minimum": 0, - "type": "number" - }, - "maxWidthPercent": { - "exclusiveMinimum": 0, - "maximum": 100, - "type": "number" - }, - "plate": { - "enum": [ - "glass", - "solid", - "none" - ], - "type": "string" - }, - "position": { - "enum": [ - "top", - "center", - "bottom" - ], - "type": "string" - }, - "region": { - "additionalProperties": false, - "description": "Optional caption layout box {x,y,w,h} in normalized output-frame coordinates. Overrides position; text starts at its top edge and wraps/pages within its width and height.", - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - "textTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "wordGapEm": { - "description": "Gap between caption runs as a multiple of base font size; default 0.35.", - "maximum": 2, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "type": { - "const": "setCaptionStyle", - "type": "string" - } - }, - "required": [ - "type", - "style" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Replace native caption placements without changing transcript words or timings. Each layout references a half-open word-index range in one saved segment; a one-word range is valid. region places that group independently, optional bounded scale/rotation/style changes its look, and holdThroughWordIndex keeps it visible through a later saved word in the same segment. All words in a placed range occupy one page; rendering refuses a range that cannot fit its box, so enlarge region or split the range. The box reserves horizontal space of 1.6 font sizes and vertical space of 0.8 font sizes for padding, with at most three lines. Unreferenced words keep the default caption layout. Word ranges must not overlap. Reapply after caption regeneration or timeline cuts.", - "properties": { - "layouts": { - "items": { - "additionalProperties": false, - "properties": { - "holdThroughWordIndex": { - "description": "Inclusive saved-word index in this segment. The layout stays visible until that word ends.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "region": { - "additionalProperties": false, - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - "rotation": { - "maximum": 45, - "minimum": -45, - "type": "number" - }, - "scale": { - "maximum": 4, - "minimum": 0.25, - "type": "number" - }, - "segmentIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "style": { - "additionalProperties": false, - "properties": { - "annotationColor": { - "type": "string" - }, - "annotationStrokeWidth": { - "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", - "maximum": 12, - "minimum": 0.5, - "type": "number" - }, - "annotationTexture": { - "description": "Native annotation stroke finish; default clean.", - "enum": [ - "clean", - "pencil" - ], - "type": "string" - }, - "backgroundColor": { - "type": "string" - }, - "color": { - "minLength": 1, - "type": "string" - }, - "emphasisColor": { - "type": "string" - }, - "emphasisFontFamily": { - "type": "string" - }, - "emphasisFontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "emphasisFontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "emphasisLetterSpacing": { - "type": "number" - }, - "emphasisPlate": { - "type": "boolean" - }, - "emphasisPlateAltColor": { - "type": "string" - }, - "emphasisPlateAltTextColor": { - "type": "string" - }, - "emphasisPlateColor": { - "type": "string" - }, - "emphasisPlatePadX": { - "type": "number" - }, - "emphasisPlatePadY": { - "type": "number" - }, - "emphasisPlateRadius": { - "minimum": 0, - "type": "number" - }, - "emphasisPlateReveal": { - "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", - "type": "boolean" - }, - "emphasisPlateTextColor": { - "type": "string" - }, - "emphasisScale": { - "exclusiveMinimum": 0, - "type": "number" - }, - "emphasisTextTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "entrance": { - "enum": [ - "none", - "fade", - "word-pop", - "stagger-up" - ], - "type": "string" - }, - "entranceMs": { - "minimum": 0, - "type": "number" - }, - "entranceStaggerMs": { - "minimum": 0, - "type": "number" - }, - "exitMs": { - "minimum": 0, - "type": "number" - }, - "fontFamily": { - "minLength": 1, - "type": "string" - }, - "fontSize": { - "description": "Font size as % of composition height (1-15, default 5). NOT px.", - "maximum": 15, - "minimum": 1, - "type": "number" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "highlightColor": { - "minLength": 1, - "type": "string" - }, - "letterSpacing": { - "description": "Base caption glyph spacing in pixels.", - "maximum": 20, - "minimum": -5, - "type": "number" - }, - "lineGapEm": { - "description": "Gap between caption lines as a multiple of base font size; default 0.25.", - "maximum": 2, - "minimum": 0, - "type": "number" - }, - "plate": { - "enum": [ - "glass", - "solid", - "none" - ], - "type": "string" - }, - "textTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "wordGapEm": { - "description": "Gap between caption runs as a multiple of base font size; default 0.35.", - "maximum": 2, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "wordEndIndex": { - "description": "Exclusive word index in the saved caption segment.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "wordMarks": { - "items": { - "additionalProperties": false, - "properties": { - "annotate": { - "anyOf": [ - { - "enum": [ - "circle", - "underline" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "wordIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "wordIndex" - ], - "type": "object" - }, - "type": "array" - }, - "wordStartIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "segmentIndex", - "wordStartIndex", - "wordEndIndex", - "region" - ], - "type": "object" - }, - "type": "array" - }, - "type": { - "const": "setCaptionLayouts", - "type": "string" - } - }, - "required": [ - "type", - "layouts" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Set the caption compositing plane. Use `behind-subject` to place captions behind the segmented foreground subject; use `front` for conventional captions above all video layers.", - "properties": { - "type": { - "const": "setCaptionDepth", - "type": "string" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "type", - "zPlane" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Replace the caption SEGMENTS wholesale — author the word-timed caption layer directly (each segment = one sentence/page of `words` with timeline-ms `startMs`/`endMs`, optional `emphasis`). This is how a client with its OWN word timings (e.g. a generated VO take) gets word-synced captions without a source transcript; the compose lane's transcript slice writes the same layer. `style`, when given, merges with setCaptionStyle semantics; an omitted style keeps the existing one. Renderer paginates within a segment and never pools words across two — keep segments sentence-bounded.", - "properties": { - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "words": { - "items": { - "additionalProperties": false, - "properties": { - "annotate": { - "enum": [ - "circle", - "underline" - ], - "type": "string" - }, - "emphasis": { - "type": "boolean" - }, - "endMs": { - "description": "Word end on the composition timeline, in milliseconds.", - "minimum": 0, - "type": "number" - }, - "startMs": { - "description": "Word start on the composition timeline, in milliseconds.", - "minimum": 0, - "type": "number" - }, - "text": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "startMs", - "endMs" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "words" - ], - "type": "object" - }, - "type": "array" - }, - "style": { - "additionalProperties": false, - "properties": { - "annotationColor": { - "type": "string" - }, - "annotationStrokeWidth": { - "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", - "maximum": 12, - "minimum": 0.5, - "type": "number" - }, - "annotationTexture": { - "description": "Native annotation stroke finish; default clean.", - "enum": [ - "clean", - "pencil" - ], - "type": "string" - }, - "backgroundColor": { - "type": "string" - }, - "color": { - "minLength": 1, - "type": "string" - }, - "emphasisColor": { - "type": "string" - }, - "emphasisFontFamily": { - "type": "string" - }, - "emphasisFontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "emphasisFontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "emphasisGradient": { - "type": "string" - }, - "emphasisLetterSpacing": { - "type": "number" - }, - "emphasisPlate": { - "type": "boolean" - }, - "emphasisPlateAltColor": { - "type": "string" - }, - "emphasisPlateAltTextColor": { - "type": "string" - }, - "emphasisPlateColor": { - "type": "string" - }, - "emphasisPlatePadX": { - "type": "number" - }, - "emphasisPlatePadY": { - "type": "number" - }, - "emphasisPlateRadius": { - "minimum": 0, - "type": "number" - }, - "emphasisPlateReveal": { - "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", - "type": "boolean" - }, - "emphasisPlateTextColor": { - "type": "string" - }, - "emphasisScale": { - "exclusiveMinimum": 0, - "type": "number" - }, - "emphasisTextTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "entrance": { - "enum": [ - "none", - "fade", - "word-pop", - "stagger-up" - ], - "type": "string" - }, - "entranceMs": { - "minimum": 0, - "type": "number" - }, - "entranceStaggerMs": { - "minimum": 0, - "type": "number" - }, - "exitMs": { - "minimum": 0, - "type": "number" - }, - "fontFamily": { - "minLength": 1, - "type": "string" - }, - "fontSize": { - "description": "Font size as % of composition height (1-15, default 5). NOT px.", - "maximum": 15, - "minimum": 1, - "type": "number" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "highlightColor": { - "minLength": 1, - "type": "string" - }, - "letterSpacing": { - "description": "Base caption glyph spacing in pixels.", - "maximum": 20, - "minimum": -5, - "type": "number" - }, - "lineGapEm": { - "description": "Gap between caption lines as a multiple of base font size; default 0.25.", - "maximum": 2, - "minimum": 0, - "type": "number" - }, - "maxWidthPercent": { - "exclusiveMinimum": 0, - "maximum": 100, - "type": "number" - }, - "plate": { - "enum": [ - "glass", - "solid", - "none" - ], - "type": "string" - }, - "position": { - "enum": [ - "top", - "center", - "bottom" - ], - "type": "string" - }, - "region": { - "additionalProperties": false, - "description": "Optional caption layout box {x,y,w,h} in normalized output-frame coordinates. Overrides position; text starts at its top edge and wraps/pages within its width and height.", - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - "textTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "wordGapEm": { - "description": "Gap between caption runs as a multiple of base font size; default 0.35.", - "maximum": 2, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "type": { - "const": "setCaptions", - "type": "string" - } - }, - "required": [ - "type", - "segments" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Attach caption CONTENT from the media's cached transcript — no pasting words. ROUTE-MATERIALIZED like applyMotionPreset/materializeGrid: the server slices the word-timed transcript to `window` (source seconds; absent = the whole media), rebases times, sentence-splits into segments, and applies it as `setCaptions`. 422 media_no_transcript when the media has no transcript or no words in the window. For your OWN word timings use setCaptions directly. For edited multi-clip timelines, use captions.fromComposition after saving the edits; that operation projects all selected track clips, trims, exclusions, and placements.", - "properties": { - "mediaId": { - "minLength": 1, - "type": "string" - }, - "type": { - "const": "captions.fromTranscript", - "type": "string" - }, - "window": { - "additionalProperties": false, - "properties": { - "endSec": { - "exclusiveMinimum": 0, - "type": "number" - }, - "startSec": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "startSec", - "endSec" - ], - "type": "object" - } - }, - "required": [ - "type", - "mediaId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Snapshot word-timed captions from the SAVED edits on one explicit enabled video or audio track. The host reads each source media transcript, projects words through clip trim, excluded ranges and placement, then replaces the caption segments. This is route-materialized to setCaptions; call it AFTER persisting clip edits and call it again when those edits change. The existing caption style and depth are preserved. Missing transcripts, unsupported clips, inconsistent clip durations, and overlapping audible clips fail loud. Playback rate scales source word times and playable duration on both audio and video tracks.", - "properties": { - "trackId": { - "minLength": 1, - "type": "string" - }, - "type": { - "const": "captions.fromComposition", - "type": "string" - } - }, - "required": [ - "type", - "trackId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Shell a STATIC `card` clip with a frame-driven MOTION preset — the public card-shelling op (the layout renders VERBATIM; only the container animates in/out). The server wraps the card in the chosen `preset` (fade-up / slide-in-left / slide-in-right / scale-pop / stagger-reveal), transpiles it, mints it as a LIVE component, and swaps the clip source to that component (the bakeless live lane — no box). `params` tunes timing (`enterMs`/`exitMs`, `staggerMs` for stagger-reveal). The target must be a static card (components already carry motion; library overlays already move); re-run overwrites idempotently ONLY while the target is still a card (an uncompilable shell); once shelled, the clip is a COMPONENT — to change its motion, remove and re-add the card, then re-shell. Honored under `dry_run` (validates preset + target without transpiling or persisting). ORDERING: the preset resolves its target against the PERSISTED composition — a card added in the SAME batch is not yet visible to it. Persist the clip.add batch first, then shell in a following call.", - "properties": { - "clipId": { - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "enterMs": { - "type": "number" - }, - "exitMs": { - "type": "number" - }, - "staggerMs": { - "type": "number" - } - }, - "type": "object" - }, - "preset": { - "type": "string" - }, - "type": { - "const": "applyMotionPreset", - "type": "string" - } - }, - "required": [ - "type", - "clipId", - "preset" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Materialize a clip's SOURCE-media temporal GRID as timeline markers — the rhythm authority you cut to. `grid:\"beat\"` reads a MUSIC bed's beat map (get_media_context.beatGrid), `grid:\"word\"` the VO word onsets (wordGrid); each grid point is projected from media time to TIMELINE time through the clip's placement (startTime, trim, playbackRate, excludedRanges) and written as a `kind:\"beat\"|\"word\"` marker (`metadata.sourceClipId` set). Points outside the clip's visible window are skipped. Re-running REPLACES the prior markers from the same clip+grid (idempotent). Land cuts and transition MIDPOINTS on the markers (a 0.5s transition starts 0.25s before its marker). `maxMarkers` (default 500, ceiling 2000) — exceeding it fails loud with the count. `grid:\"shot\"` is not yet exposed (shot_grid_unavailable). The target must be a media clip; absent evidence fails loud (grid_unavailable) naming how to get it (declare audioRole:\"music\" at ingest / transcribe).", - "properties": { - "clipId": { - "type": "string" - }, - "grid": { - "enum": [ - "beat", - "word", - "shot" - ], - "type": "string" - }, - "maxMarkers": { - "exclusiveMinimum": 0, - "maximum": 2000, - "type": "integer" - }, - "type": { - "const": "materializeGrid", - "type": "string" - } - }, - "required": [ - "type", - "clipId", - "grid" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Set the output format — `aspectRatio` (16:9|9:16|1:1|4:5) plus optional `fps` and `resolution`. Merges: an omitted field keeps the current value.", - "properties": { - "format": { - "additionalProperties": false, - "properties": { - "aspectRatio": { - "enum": [ - "16:9", - "9:16", - "1:1", - "4:5" - ], - "type": "string" - }, - "fps": { - "anyOf": [ - { - "const": 24, - "type": "number" - }, - { - "const": 25, - "type": "number" - }, - { - "const": 30, - "type": "number" - }, - { - "const": 60, - "type": "number" - } - ] - }, - "resolution": { - "enum": [ - "hd", - "fhd", - "4k" - ], - "type": "string" - } - }, - "required": [ - "aspectRatio" - ], - "type": "object" - }, - "type": { - "const": "setFormat", - "type": "string" - } - }, - "required": [ - "type", - "format" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Add an EMPTY track of a given family (video|audio|image|overlay|effect). Optional pinned `id`. The new track is appended, so it starts at the BACK: index 0 is the top layer and higher indices are further back (see `reorderTracks`). Track order only ranks clips on the same plane — every overlay draws above the video lane unless its `zPlane` is `behind-subject`, whatever its track index.", - "properties": { - "id": { - "type": "string" - }, - "kind": { - "enum": [ - "video", - "audio", - "image", - "overlay", - "effect" - ], - "type": "string" - }, - "name": { - "type": "string" - }, - "type": { - "const": "addTrack", - "type": "string" - } - }, - "required": [ - "type", - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Remove a track AND all its clips by id.", - "properties": { - "trackId": { - "type": "string" - }, - "type": { - "const": "removeTrack", - "type": "string" - } - }, - "required": [ - "type", - "trackId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Patch a track's `name` / `enabled` by id.", - "properties": { - "trackId": { - "type": "string" - }, - "type": { - "const": "updateTrack", - "type": "string" - }, - "updates": { - "additionalProperties": false, - "properties": { - "enabled": { - "type": "boolean" - }, - "name": { - "type": "string" - } - }, - "type": "object" - } - }, - "required": [ - "type", - "trackId", - "updates" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Move a track from one index to another. ORDER: index 0 is the TOP layer, not the bottom — moving a backdrop to index 0 puts it in FRONT of everything and hides the composition. Higher index = further back. PRECEDENCE: track order decides compositing only among clips on the same plane. Overlays are composited in a lane ABOVE the video lane whatever their track index; the one exception is `zPlane:\"behind-subject\"`, which moves the overlay inside its host clip, behind the segmented foreground. So if reordering tracks does not change what you see, the plane split already decided it.", - "properties": { - "fromIndex": { - "type": "number" - }, - "toIndex": { - "type": "number" - }, - "type": { - "const": "reorderTracks", - "type": "string" - } - }, - "required": [ - "type", - "fromIndex", - "toIndex" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Move a clip to another SAME-family track, optionally at a new `newStartTime`.", - "properties": { - "clipId": { - "type": "string" - }, - "newStartTime": { - "type": "number" - }, - "targetTrackId": { - "type": "string" - }, - "type": { - "const": "moveClipToTrack", - "type": "string" - } - }, - "required": [ - "type", - "clipId", - "targetTrackId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Duplicate a clip by id. Pin `newClipId` to make the copy's id deterministic (required for a clean undo/inverse).", - "properties": { - "clipId": { - "type": "string" - }, - "newClipId": { - "type": "string" - }, - "type": { - "const": "duplicateClip", - "type": "string" - } - }, - "required": [ - "type", - "clipId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Server-authoritative: delete the [start,end] time window (seconds) and ripple every downstream clip/marker/caption earlier to close the gap.", - "properties": { - "end": { - "type": "number" - }, - "start": { - "type": "number" - }, - "type": { - "const": "cutAndRipple", - "type": "string" - } - }, - "required": [ - "type", - "start", - "end" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Server-authoritative: shift everything at/after `time` (seconds) by `amount` seconds (+ opens a gap, − closes one).", - "properties": { - "amount": { - "type": "number" - }, - "time": { - "type": "number" - }, - "type": { - "const": "ripple", - "type": "string" - } - }, - "required": [ - "type", - "time", - "amount" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Server-authoritative: exclude a [sourceStart,sourceEnd] span (seconds) of a clip's SOURCE (an internal trim) and ripple downstream — the preferred way to drop a sub-range vs a source patch.", - "properties": { - "clipId": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "sourceEnd": { - "type": "number" - }, - "sourceStart": { - "type": "number" - }, - "type": { - "const": "addExcludedRange", - "type": "string" - } - }, - "required": [ - "type", - "clipId", - "sourceStart", - "sourceEnd" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Server-authoritative: remove a clip's previously-added excluded range by index (re-includes that span, ripples downstream).", - "properties": { - "clipId": { - "type": "string" - }, - "rangeIdx": { - "type": "number" - }, - "type": { - "const": "removeExcludedRange", - "type": "string" - } - }, - "required": [ - "type", - "clipId", - "rangeIdx" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Atomically repin explicit version3 invocations using complete before/after execution references and an exact composition etag. Persistence must canonically admit scoped source hashes, destination input schemas and every resulting target context before applying, including replay/undo. Never infer a latest head, downgrade versions or accept an admitted flag.", - "properties": { - "changes": { - "items": { - "additionalProperties": false, - "properties": { - "after": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "before": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema1" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "placementId": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "placementId", - "before", - "after" - ], - "type": "object" - }, - "maxItems": 512, - "minItems": 1, - "type": "array" - }, - "componentId": { - "minLength": 1, - "type": "string" - }, - "expectedCompositionEtag": { - "minLength": 1, - "type": "string" - }, - "from": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "to": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "type": { - "const": "component.repin-v3", - "type": "string" - } - }, - "required": [ - "type", - "componentId", - "from", - "to", - "expectedCompositionEtag", - "changes" - ], - "type": "object" - } -] - added
Input schema / properties / body / properties / ops / items / oneOfAdded value: +[ + { + "additionalProperties": false, + "description": "Add a clip to the timeline. The clip self-routes to a track by FAMILY (`clip.kind`, else derived from `source.kind`, else the target track) — a `media` clip MUST carry `kind` (video|audio|image) or a `trackId`, else it is rejected as ambiguous. `trackId` targets an existing SAME-family track; `newTrack:true` (with optional pinned `newTrackId`) creates a fresh track of that family.", + "properties": { + "clip": { + "additionalProperties": false, + "properties": { + "automation": { + "additionalProperties": false, + "properties": { + "lanes": { + "items": { + "additionalProperties": false, + "properties": { + "points": { + "items": { + "additionalProperties": false, + "properties": { + "t": { + "type": "number" + }, + "v": { + "type": "number" + } + }, + "required": [ + "t", + "v" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + }, + "target": { + "const": "volume", + "type": "string" + } + }, + "required": [ + "target", + "points" + ], + "type": "object" + }, + "type": "array" + }, + "version": { + "const": 1, + "type": "number" + } + }, + "required": [ + "version", + "lanes" + ], + "type": "object" + }, + "captionVisibility": { + "description": "Video media clip only. Hide native captions while this clip is topmost and covers the lower picture, or when an opaque, effect-free clip has an explicitly full-frame region, even with fit:contain. Caption words and timings remain stored and resume when another visible clip takes over.", + "enum": [ + "visible", + "hidden" + ], + "type": "string" + }, + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "effects": { + "items": { + "additionalProperties": false, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "id": { + "minLength": 1, + "type": "string" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "type": "string" + }, + "window": { + "additionalProperties": false, + "properties": { + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "startTime": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "startTime", + "duration" + ], + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + "fit": { + "enum": [ + "cover", + "contain" + ], + "type": "string" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "kind": { + "enum": [ + "video", + "audio", + "image", + "overlay", + "effect" + ], + "type": "string" + }, + "legacyKeyframes": { + "additionalProperties": false, + "properties": { + "channels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "needsUpgrade": { + "const": true, + "type": "boolean" + }, + "record": {} + }, + "required": [ + "needsUpgrade", + "channels", + "record" + ], + "type": "object" + }, + "linkGroupId": { + "minLength": 1, + "type": "string" + }, + "opacity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "position": { + "additionalProperties": {}, + "description": "Clip CENTRE as a fraction of the frame: {x:0.5,y:0.5} is dead centre, 0 to 1 is inside the frame, and a little overshoot (down to -1, up to 2) is how an entrance starts off-canvas. NOT pixels: the renderer maps x to `left: x*100%`, so `x: 180` sits 180 frame-widths away and draws nothing.", + "properties": { + "x": { + "maximum": 2, + "minimum": -1, + "type": "number" + }, + "y": { + "maximum": 2, + "minimum": -1, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "region": { + "additionalProperties": {}, + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + "rotation": { + "type": "number" + }, + "scale": { + "exclusiveMinimum": 0, + "type": "number" + }, + "source": { + "oneOf": [ + { + "additionalProperties": {}, + "properties": { + "anchor": { + "additionalProperties": {}, + "properties": { + "clipId": { + "minLength": 1, + "type": "string" + }, + "offsetMs": { + "type": "number" + } + }, + "required": [ + "clipId", + "offsetMs" + ], + "type": "object" + }, + "audioRole": { + "enum": [ + "sfx", + "music", + "vo", + "ambience" + ], + "type": "string" + }, + "duck": { + "additionalProperties": {}, + "properties": { + "attackMs": { + "minimum": 0, + "type": "number" + }, + "duckDb": { + "maximum": 0, + "type": "number" + }, + "releaseMs": { + "minimum": 0, + "type": "number" + }, + "windows": { + "items": { + "additionalProperties": {}, + "properties": { + "endMs": { + "type": "number" + }, + "startMs": { + "type": "number" + } + }, + "required": [ + "startMs", + "endMs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "duckDb", + "attackMs", + "releaseMs" + ], + "type": "object" + }, + "excludedRanges": { + "items": { + "additionalProperties": {}, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "reason": { + "type": "string" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, + "type": "array" + }, + "fadeInMs": { + "minimum": 0, + "type": "number" + }, + "fadeOutMs": { + "minimum": 0, + "type": "number" + }, + "kenBurns": { + "enum": [ + "in", + "out", + "pan-l", + "pan-r", + "none" + ], + "type": "string" + }, + "kind": { + "const": "media", + "type": "string" + }, + "loop": { + "type": "boolean" + }, + "mediaId": { + "type": "string" + }, + "muted": { + "type": "boolean" + }, + "playbackRate": { + "exclusiveMinimum": 0, + "type": "number" + }, + "reframe": { + "additionalProperties": {}, + "properties": { + "segments": { + "items": { + "additionalProperties": {}, + "properties": { + "bias": { + "additionalProperties": {}, + "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", + "properties": { + "x": { + "description": "Horizontal nudge, source-normalized (+ = right).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "y": { + "description": "Vertical nudge, source-normalized (+ = down).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "ease": { + "additionalProperties": {}, + "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", + "properties": { + "in": { + "description": "Ease-IN ramp DURATION in seconds at the segment START.", + "minimum": 0, + "type": "number" + }, + "out": { + "description": "Ease-OUT ramp DURATION in seconds at the segment END.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "in", + "out" + ], + "type": "object" + }, + "endSec": { + "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", + "exclusiveMinimum": 0, + "type": "number" + }, + "focus": { + "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight.", + "oneOf": [ + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "frame-center", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "point", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "mode", + "x", + "y" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "faceId": { + "minLength": 1, + "type": "string" + }, + "mode": { + "const": "face", + "type": "string" + }, + "shotScale": { + "enum": [ + "close", + "standard", + "wide" + ], + "type": "string" + } + }, + "required": [ + "mode", + "faceId" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "all-faces", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "active-speaker", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + } + ] + }, + "intent": { + "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", + "type": "string" + }, + "startSec": { + "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", + "minimum": 0, + "type": "number" + }, + "zoom": { + "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale`: a face-tracked shot is sized EITHER by the editorial scale (shotScale, calibrated to the detected face) OR by an explicit zoom — never both.", + "maximum": 1, + "minimum": 0.1, + "type": "number" + } + }, + "required": [ + "startSec", + "endSec", + "focus" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "segments" + ], + "type": "object" + }, + "sync": { + "enum": [ + "video", + "independent" + ], + "type": "string" + }, + "trim": { + "additionalProperties": {}, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, + "volume": { + "maximum": 4, + "minimum": 0, + "type": "number" + }, + "volumeDb": { + "type": "number" + } + }, + "required": [ + "kind", + "mediaId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "componentId": { + "minLength": 1, + "type": "string" + }, + "execution": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "kind": { + "const": "component", + "type": "string" + }, + "placement": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "clip", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "content-slots", + "type": "string" + }, + "slots": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "ownership": { + "enum": [ + "reference", + "exclusive" + ], + "type": "string" + }, + "targetClipIds": { + "items": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targetClipIds", + "ownership" + ], + "type": "object" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "kind", + "slots" + ], + "type": "object" + } + ] + }, + "props": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "retired": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "kind", + "componentId", + "props" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "anchor": { + "additionalProperties": {}, + "properties": { + "space": { + "const": "scene", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "space", + "x", + "y" + ], + "type": "object" + }, + "kind": { + "const": "overlay", + "type": "string" + }, + "parallax": { + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "pattern": "^(?!custom$)", + "type": "string" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "kind", + "primitiveId", + "params" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "kind": { + "const": "effect", + "type": "string" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "type": "string" + }, + "targetTrackIds": { + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "wrapperOrder": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "html": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "card", + "type": "string" + }, + "tokens": { + "additionalProperties": { + "type": "string" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "zPlane": { + "const": "front", + "type": "string" + } + }, + "required": [ + "kind", + "html" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "compositionId": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "composition", + "type": "string" + }, + "trim": { + "additionalProperties": {}, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + } + }, + "required": [ + "kind", + "compositionId" + ], + "type": "object" + } + ] + }, + "startTime": { + "minimum": 0, + "type": "number" + }, + "transitionIn": { + "additionalProperties": {}, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "fromClipId": { + "minLength": 1, + "type": "string" + }, + "handlePolicy": { + "const": "outgoing-overrun-at-cut-v1", + "type": "string" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "toClipId": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "type", + "duration" + ], + "type": "object" + }, + "tweens": { + "items": { + "additionalProperties": false, + "properties": { + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "keyframes": { + "additionalProperties": false, + "properties": { + "easeEach": { + "const": "none", + "type": "string" + }, + "format": { + "const": "percentage", + "type": "string" + }, + "keyframes": { + "items": { + "additionalProperties": false, + "properties": { + "ease": { + "type": "string" + }, + "percentage": { + "type": "number" + }, + "properties": { + "additionalProperties": { + "type": "number" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "percentage", + "properties" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "format", + "easeEach", + "keyframes" + ], + "type": "object" + }, + "position": { + "type": "number" + }, + "propertyGroup": { + "enum": [ + "visual", + "scale", + "rotation", + "position" + ], + "type": "string" + } + }, + "required": [ + "id", + "propertyGroup", + "position", + "duration", + "keyframes" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "id", + "startTime", + "duration", + "source" + ], + "type": "object" + }, + "newTrack": { + "type": "boolean" + }, + "newTrackId": { + "type": "string" + }, + "trackId": { + "type": "string" + }, + "type": { + "const": "clip.add", + "type": "string" + } + }, + "required": [ + "type", + "clip" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Remove a clip by id (located across every track).", + "properties": { + "clipId": { + "type": "string" + }, + "type": { + "const": "clip.remove", + "type": "string" + } + }, + "required": [ + "type", + "clipId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Set (or CLEAR, with `keyframes: null`) ONE keyframed channel of a clip: `opacity`, `scale`, `rotation`, `position.x`, `position.y` or `volume`, with at least two keyframes `{time, value, ease?}` in any order. `time` is seconds from the clip's own start (0 to its duration); `value` uses the property's own unit, as its scalar: opacity 0-1, scale a multiplier, rotation degrees, position.x/position.y a FRACTION of the frame (0.5 = centre, never px), volume 0-4. Each keyframe's optional `ease` shapes the segment ARRIVING at it, in HyperFrames' vocabulary: `none` (linear, the default), named eases such as `power2.out`, `back.out`, `expo.inOut`, `spring-gentle`, `hold`, or `custom(M0,0 Cx1,y1 x2,y2 1,1)` (a cubic, x in [0,1]). Before its first keyframe a channel holds its first value, after its last it holds the last; a channel OVERRIDES the clip's scalar (`opacity`, `scale`, `rotation`, `position`). The op REPLACES that property's keyframes; other channels are untouched. Volume keyframes are linear and only for a video or audio media clip. Trims and splits keep every keyframe on its content. Keyframes are stored as HyperFrames tweens (`tweens`) and automation (`automation`) on the clip; author them with this op, not `clip.update`.", + "properties": { + "clipId": { + "minLength": 1, + "type": "string" + }, + "keyframes": { + "anyOf": [ + { + "items": { + "additionalProperties": false, + "properties": { + "ease": { + "type": "string" + }, + "time": { + "minimum": 0, + "type": "number" + }, + "value": { + "type": "number" + } + }, + "required": [ + "time", + "value" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "property": { + "enum": [ + "opacity", + "scale", + "rotation", + "position.x", + "position.y", + "volume" + ], + "type": "string" + }, + "type": { + "const": "clip.setKeyframes", + "type": "string" + } + }, + "required": [ + "type", + "clipId", + "property", + "keyframes" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Patch an existing clip by id (cross-family). The patch is a partial TimelineClip. NOTE: `source` is REPLACED wholesale — the patch merges at the top level only, so a partial `source` WIPES the source fields you omit. Patch the whole source object when changing it. (To change reframe/excluded ranges, prefer setCropIntents / addExcludedRange, not a source patch.)", + "properties": { + "clipId": { + "type": "string" + }, + "patch": { + "additionalProperties": false, + "properties": { + "automation": { + "additionalProperties": false, + "properties": { + "lanes": { + "items": { + "additionalProperties": false, + "properties": { + "points": { + "items": { + "additionalProperties": false, + "properties": { + "t": { + "type": "number" + }, + "v": { + "type": "number" + } + }, + "required": [ + "t", + "v" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + }, + "target": { + "const": "volume", + "type": "string" + } + }, + "required": [ + "target", + "points" + ], + "type": "object" + }, + "type": "array" + }, + "version": { + "const": 1, + "type": "number" + } + }, + "required": [ + "version", + "lanes" + ], + "type": "object" + }, + "captionVisibility": { + "description": "Video media clip only. Hide native captions while this clip is topmost and covers the lower picture, or when an opaque, effect-free clip has an explicitly full-frame region, even with fit:contain. Caption words and timings remain stored and resume when another visible clip takes over.", + "enum": [ + "visible", + "hidden" + ], + "type": "string" + }, + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "effects": { + "items": { + "additionalProperties": false, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "id": { + "minLength": 1, + "type": "string" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "type": "string" + }, + "window": { + "additionalProperties": false, + "properties": { + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "startTime": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "startTime", + "duration" + ], + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + "fit": { + "enum": [ + "cover", + "contain" + ], + "type": "string" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "kind": { + "enum": [ + "video", + "audio", + "image", + "overlay", + "effect" + ], + "type": "string" + }, + "legacyKeyframes": { + "additionalProperties": false, + "properties": { + "channels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "needsUpgrade": { + "const": true, + "type": "boolean" + }, + "record": {} + }, + "required": [ + "needsUpgrade", + "channels", + "record" + ], + "type": "object" + }, + "linkGroupId": { + "minLength": 1, + "type": "string" + }, + "opacity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "position": { + "additionalProperties": {}, + "description": "Clip CENTRE as a fraction of the frame: {x:0.5,y:0.5} is dead centre, 0 to 1 is inside the frame, and a little overshoot (down to -1, up to 2) is how an entrance starts off-canvas. NOT pixels: the renderer maps x to `left: x*100%`, so `x: 180` sits 180 frame-widths away and draws nothing.", + "properties": { + "x": { + "maximum": 2, + "minimum": -1, + "type": "number" + }, + "y": { + "maximum": 2, + "minimum": -1, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "region": { + "additionalProperties": {}, + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + "rotation": { + "type": "number" + }, + "scale": { + "exclusiveMinimum": 0, + "type": "number" + }, + "source": { + "oneOf": [ + { + "additionalProperties": {}, + "properties": { + "anchor": { + "additionalProperties": {}, + "properties": { + "clipId": { + "minLength": 1, + "type": "string" + }, + "offsetMs": { + "type": "number" + } + }, + "required": [ + "clipId", + "offsetMs" + ], + "type": "object" + }, + "audioRole": { + "enum": [ + "sfx", + "music", + "vo", + "ambience" + ], + "type": "string" + }, + "duck": { + "additionalProperties": {}, + "properties": { + "attackMs": { + "minimum": 0, + "type": "number" + }, + "duckDb": { + "maximum": 0, + "type": "number" + }, + "releaseMs": { + "minimum": 0, + "type": "number" + }, + "windows": { + "items": { + "additionalProperties": {}, + "properties": { + "endMs": { + "type": "number" + }, + "startMs": { + "type": "number" + } + }, + "required": [ + "startMs", + "endMs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "duckDb", + "attackMs", + "releaseMs" + ], + "type": "object" + }, + "excludedRanges": { + "items": { + "additionalProperties": {}, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "reason": { + "type": "string" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, + "type": "array" + }, + "fadeInMs": { + "minimum": 0, + "type": "number" + }, + "fadeOutMs": { + "minimum": 0, + "type": "number" + }, + "kenBurns": { + "enum": [ + "in", + "out", + "pan-l", + "pan-r", + "none" + ], + "type": "string" + }, + "kind": { + "const": "media", + "type": "string" + }, + "loop": { + "type": "boolean" + }, + "mediaId": { + "type": "string" + }, + "muted": { + "type": "boolean" + }, + "playbackRate": { + "exclusiveMinimum": 0, + "type": "number" + }, + "reframe": { + "additionalProperties": {}, + "properties": { + "segments": { + "items": { + "additionalProperties": {}, + "properties": { + "bias": { + "additionalProperties": {}, + "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", + "properties": { + "x": { + "description": "Horizontal nudge, source-normalized (+ = right).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "y": { + "description": "Vertical nudge, source-normalized (+ = down).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "ease": { + "additionalProperties": {}, + "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", + "properties": { + "in": { + "description": "Ease-IN ramp DURATION in seconds at the segment START.", + "minimum": 0, + "type": "number" + }, + "out": { + "description": "Ease-OUT ramp DURATION in seconds at the segment END.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "in", + "out" + ], + "type": "object" + }, + "endSec": { + "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", + "exclusiveMinimum": 0, + "type": "number" + }, + "focus": { + "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight.", + "oneOf": [ + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "frame-center", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "point", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "mode", + "x", + "y" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "faceId": { + "minLength": 1, + "type": "string" + }, + "mode": { + "const": "face", + "type": "string" + }, + "shotScale": { + "enum": [ + "close", + "standard", + "wide" + ], + "type": "string" + } + }, + "required": [ + "mode", + "faceId" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "all-faces", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "active-speaker", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + } + ] + }, + "intent": { + "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", + "type": "string" + }, + "startSec": { + "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", + "minimum": 0, + "type": "number" + }, + "zoom": { + "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale`: a face-tracked shot is sized EITHER by the editorial scale (shotScale, calibrated to the detected face) OR by an explicit zoom — never both.", + "maximum": 1, + "minimum": 0.1, + "type": "number" + } + }, + "required": [ + "startSec", + "endSec", + "focus" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "segments" + ], + "type": "object" + }, + "sync": { + "enum": [ + "video", + "independent" + ], + "type": "string" + }, + "trim": { + "additionalProperties": {}, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, + "volume": { + "maximum": 4, + "minimum": 0, + "type": "number" + }, + "volumeDb": { + "type": "number" + } + }, + "required": [ + "kind", + "mediaId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "componentId": { + "minLength": 1, + "type": "string" + }, + "execution": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "kind": { + "const": "component", + "type": "string" + }, + "placement": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "clip", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "content-slots", + "type": "string" + }, + "slots": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "ownership": { + "enum": [ + "reference", + "exclusive" + ], + "type": "string" + }, + "targetClipIds": { + "items": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targetClipIds", + "ownership" + ], + "type": "object" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "kind", + "slots" + ], + "type": "object" + } + ] + }, + "props": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "retired": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "kind", + "componentId", + "props" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "anchor": { + "additionalProperties": {}, + "properties": { + "space": { + "const": "scene", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "space", + "x", + "y" + ], + "type": "object" + }, + "kind": { + "const": "overlay", + "type": "string" + }, + "parallax": { + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "pattern": "^(?!custom$)", + "type": "string" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "kind", + "primitiveId", + "params" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "kind": { + "const": "effect", + "type": "string" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "type": "string" + }, + "targetTrackIds": { + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "wrapperOrder": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "html": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "card", + "type": "string" + }, + "tokens": { + "additionalProperties": { + "type": "string" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "zPlane": { + "const": "front", + "type": "string" + } + }, + "required": [ + "kind", + "html" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "compositionId": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "composition", + "type": "string" + }, + "trim": { + "additionalProperties": {}, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + } + }, + "required": [ + "kind", + "compositionId" + ], + "type": "object" + } + ] + }, + "startTime": { + "minimum": 0, + "type": "number" + }, + "transitionIn": { + "additionalProperties": {}, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "fromClipId": { + "minLength": 1, + "type": "string" + }, + "handlePolicy": { + "const": "outgoing-overrun-at-cut-v1", + "type": "string" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "toClipId": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "type", + "duration" + ], + "type": "object" + }, + "tweens": { + "items": { + "additionalProperties": false, + "properties": { + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "keyframes": { + "additionalProperties": false, + "properties": { + "easeEach": { + "const": "none", + "type": "string" + }, + "format": { + "const": "percentage", + "type": "string" + }, + "keyframes": { + "items": { + "additionalProperties": false, + "properties": { + "ease": { + "type": "string" + }, + "percentage": { + "type": "number" + }, + "properties": { + "additionalProperties": { + "type": "number" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "percentage", + "properties" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "format", + "easeEach", + "keyframes" + ], + "type": "object" + }, + "position": { + "type": "number" + }, + "propertyGroup": { + "enum": [ + "visual", + "scale", + "rotation", + "position" + ], + "type": "string" + } + }, + "required": [ + "id", + "propertyGroup", + "position", + "duration", + "keyframes" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": { + "const": "clip.update", + "type": "string" + } + }, + "required": [ + "type", + "clipId", + "patch" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Remove EVERY clip sourced from a given mediaId (e.g. after deleting that media).", + "properties": { + "mediaId": { + "type": "string" + }, + "type": { + "const": "removeClipsByMediaId", + "type": "string" + } + }, + "required": [ + "type", + "mediaId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Replace the overlay channel wholesale with the given clips (bulk set, not a merge).", + "properties": { + "clips": { + "items": { + "additionalProperties": false, + "properties": { + "automation": { + "additionalProperties": false, + "properties": { + "lanes": { + "items": { + "additionalProperties": false, + "properties": { + "points": { + "items": { + "additionalProperties": false, + "properties": { + "t": { + "type": "number" + }, + "v": { + "type": "number" + } + }, + "required": [ + "t", + "v" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + }, + "target": { + "const": "volume", + "type": "string" + } + }, + "required": [ + "target", + "points" + ], + "type": "object" + }, + "type": "array" + }, + "version": { + "const": 1, + "type": "number" + } + }, + "required": [ + "version", + "lanes" + ], + "type": "object" + }, + "captionVisibility": { + "description": "Video media clip only. Hide native captions while this clip is topmost and covers the lower picture, or when an opaque, effect-free clip has an explicitly full-frame region, even with fit:contain. Caption words and timings remain stored and resume when another visible clip takes over.", + "enum": [ + "visible", + "hidden" + ], + "type": "string" + }, + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "effects": { + "items": { + "additionalProperties": false, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "id": { + "minLength": 1, + "type": "string" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "type": "string" + }, + "window": { + "additionalProperties": false, + "properties": { + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "startTime": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "startTime", + "duration" + ], + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + "fit": { + "enum": [ + "cover", + "contain" + ], + "type": "string" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "kind": { + "enum": [ + "video", + "audio", + "image", + "overlay", + "effect" + ], + "type": "string" + }, + "legacyKeyframes": { + "additionalProperties": false, + "properties": { + "channels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "needsUpgrade": { + "const": true, + "type": "boolean" + }, + "record": {} + }, + "required": [ + "needsUpgrade", + "channels", + "record" + ], + "type": "object" + }, + "linkGroupId": { + "minLength": 1, + "type": "string" + }, + "opacity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "position": { + "additionalProperties": {}, + "description": "Clip CENTRE as a fraction of the frame: {x:0.5,y:0.5} is dead centre, 0 to 1 is inside the frame, and a little overshoot (down to -1, up to 2) is how an entrance starts off-canvas. NOT pixels: the renderer maps x to `left: x*100%`, so `x: 180` sits 180 frame-widths away and draws nothing.", + "properties": { + "x": { + "maximum": 2, + "minimum": -1, + "type": "number" + }, + "y": { + "maximum": 2, + "minimum": -1, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "region": { + "additionalProperties": {}, + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + "rotation": { + "type": "number" + }, + "scale": { + "exclusiveMinimum": 0, + "type": "number" + }, + "source": { + "oneOf": [ + { + "additionalProperties": {}, + "properties": { + "anchor": { + "additionalProperties": {}, + "properties": { + "clipId": { + "minLength": 1, + "type": "string" + }, + "offsetMs": { + "type": "number" + } + }, + "required": [ + "clipId", + "offsetMs" + ], + "type": "object" + }, + "audioRole": { + "enum": [ + "sfx", + "music", + "vo", + "ambience" + ], + "type": "string" + }, + "duck": { + "additionalProperties": {}, + "properties": { + "attackMs": { + "minimum": 0, + "type": "number" + }, + "duckDb": { + "maximum": 0, + "type": "number" + }, + "releaseMs": { + "minimum": 0, + "type": "number" + }, + "windows": { + "items": { + "additionalProperties": {}, + "properties": { + "endMs": { + "type": "number" + }, + "startMs": { + "type": "number" + } + }, + "required": [ + "startMs", + "endMs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "duckDb", + "attackMs", + "releaseMs" + ], + "type": "object" + }, + "excludedRanges": { + "items": { + "additionalProperties": {}, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "reason": { + "type": "string" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, + "type": "array" + }, + "fadeInMs": { + "minimum": 0, + "type": "number" + }, + "fadeOutMs": { + "minimum": 0, + "type": "number" + }, + "kenBurns": { + "enum": [ + "in", + "out", + "pan-l", + "pan-r", + "none" + ], + "type": "string" + }, + "kind": { + "const": "media", + "type": "string" + }, + "loop": { + "type": "boolean" + }, + "mediaId": { + "type": "string" + }, + "muted": { + "type": "boolean" + }, + "playbackRate": { + "exclusiveMinimum": 0, + "type": "number" + }, + "reframe": { + "additionalProperties": {}, + "properties": { + "segments": { + "items": { + "additionalProperties": {}, + "properties": { + "bias": { + "additionalProperties": {}, + "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", + "properties": { + "x": { + "description": "Horizontal nudge, source-normalized (+ = right).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "y": { + "description": "Vertical nudge, source-normalized (+ = down).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "ease": { + "additionalProperties": {}, + "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", + "properties": { + "in": { + "description": "Ease-IN ramp DURATION in seconds at the segment START.", + "minimum": 0, + "type": "number" + }, + "out": { + "description": "Ease-OUT ramp DURATION in seconds at the segment END.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "in", + "out" + ], + "type": "object" + }, + "endSec": { + "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", + "exclusiveMinimum": 0, + "type": "number" + }, + "focus": { + "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight.", + "oneOf": [ + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "frame-center", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "point", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "mode", + "x", + "y" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "faceId": { + "minLength": 1, + "type": "string" + }, + "mode": { + "const": "face", + "type": "string" + }, + "shotScale": { + "enum": [ + "close", + "standard", + "wide" + ], + "type": "string" + } + }, + "required": [ + "mode", + "faceId" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "all-faces", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "active-speaker", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + } + ] + }, + "intent": { + "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", + "type": "string" + }, + "startSec": { + "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", + "minimum": 0, + "type": "number" + }, + "zoom": { + "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale`: a face-tracked shot is sized EITHER by the editorial scale (shotScale, calibrated to the detected face) OR by an explicit zoom — never both.", + "maximum": 1, + "minimum": 0.1, + "type": "number" + } + }, + "required": [ + "startSec", + "endSec", + "focus" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "segments" + ], + "type": "object" + }, + "sync": { + "enum": [ + "video", + "independent" + ], + "type": "string" + }, + "trim": { + "additionalProperties": {}, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, + "volume": { + "maximum": 4, + "minimum": 0, + "type": "number" + }, + "volumeDb": { + "type": "number" + } + }, + "required": [ + "kind", + "mediaId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "componentId": { + "minLength": 1, + "type": "string" + }, + "execution": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "kind": { + "const": "component", + "type": "string" + }, + "placement": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "clip", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "content-slots", + "type": "string" + }, + "slots": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "ownership": { + "enum": [ + "reference", + "exclusive" + ], + "type": "string" + }, + "targetClipIds": { + "items": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targetClipIds", + "ownership" + ], + "type": "object" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "kind", + "slots" + ], + "type": "object" + } + ] + }, + "props": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "retired": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "kind", + "componentId", + "props" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "anchor": { + "additionalProperties": {}, + "properties": { + "space": { + "const": "scene", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "space", + "x", + "y" + ], + "type": "object" + }, + "kind": { + "const": "overlay", + "type": "string" + }, + "parallax": { + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "pattern": "^(?!custom$)", + "type": "string" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "kind", + "primitiveId", + "params" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "kind": { + "const": "effect", + "type": "string" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "type": "string" + }, + "targetTrackIds": { + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "wrapperOrder": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "html": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "card", + "type": "string" + }, + "tokens": { + "additionalProperties": { + "type": "string" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "zPlane": { + "const": "front", + "type": "string" + } + }, + "required": [ + "kind", + "html" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "compositionId": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "composition", + "type": "string" + }, + "trim": { + "additionalProperties": {}, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + } + }, + "required": [ + "kind", + "compositionId" + ], + "type": "object" + } + ] + }, + "startTime": { + "minimum": 0, + "type": "number" + }, + "transitionIn": { + "additionalProperties": {}, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "fromClipId": { + "minLength": 1, + "type": "string" + }, + "handlePolicy": { + "const": "outgoing-overrun-at-cut-v1", + "type": "string" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "toClipId": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "type", + "duration" + ], + "type": "object" + }, + "tweens": { + "items": { + "additionalProperties": false, + "properties": { + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "keyframes": { + "additionalProperties": false, + "properties": { + "easeEach": { + "const": "none", + "type": "string" + }, + "format": { + "const": "percentage", + "type": "string" + }, + "keyframes": { + "items": { + "additionalProperties": false, + "properties": { + "ease": { + "type": "string" + }, + "percentage": { + "type": "number" + }, + "properties": { + "additionalProperties": { + "type": "number" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "percentage", + "properties" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "format", + "easeEach", + "keyframes" + ], + "type": "object" + }, + "position": { + "type": "number" + }, + "propertyGroup": { + "enum": [ + "visual", + "scale", + "rotation", + "position" + ], + "type": "string" + } + }, + "required": [ + "id", + "propertyGroup", + "position", + "duration", + "keyframes" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "id", + "startTime", + "duration", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "type": { + "const": "loadOverlays", + "type": "string" + } + }, + "required": [ + "type", + "clips" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Add a timeline marker (a named time point/range; carry extensions in `metadata`).", + "properties": { + "marker": { + "additionalProperties": false, + "properties": { + "endTime": { + "minimum": 0, + "type": "number" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "kind": { + "minLength": 1, + "type": "string" + }, + "metadata": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "startTime": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "id", + "startTime", + "kind" + ], + "type": "object" + }, + "type": { + "const": "addMarker", + "type": "string" + } + }, + "required": [ + "type", + "marker" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Remove a marker by id.", + "properties": { + "markerId": { + "type": "string" + }, + "type": { + "const": "removeMarker", + "type": "string" + } + }, + "required": [ + "type", + "markerId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Patch a marker's fields by id (partial merge).", + "properties": { + "markerId": { + "type": "string" + }, + "type": { + "const": "updateMarker", + "type": "string" + }, + "updates": { + "additionalProperties": false, + "properties": { + "endTime": { + "minimum": 0, + "type": "number" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "kind": { + "minLength": 1, + "type": "string" + }, + "metadata": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "startTime": { + "minimum": 0, + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "type", + "markerId", + "updates" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Set (or CLEAR, with `segments: null`) the camera/reframe channel on a MEDIA clip — the time-aligned source→output viewport (focus, zoom, ease, bias). This is the PREFERRED way to author reframing; do NOT reframe via a whole-source `clip.update` patch. Segments tile the clip's duration.", + "properties": { + "clipId": { + "type": "string" + }, + "segments": { + "anyOf": [ + { + "items": { + "additionalProperties": {}, + "properties": { + "bias": { + "additionalProperties": {}, + "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", + "properties": { + "x": { + "description": "Horizontal nudge, source-normalized (+ = right).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "y": { + "description": "Vertical nudge, source-normalized (+ = down).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "ease": { + "additionalProperties": {}, + "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", + "properties": { + "in": { + "description": "Ease-IN ramp DURATION in seconds at the segment START.", + "minimum": 0, + "type": "number" + }, + "out": { + "description": "Ease-OUT ramp DURATION in seconds at the segment END.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "in", + "out" + ], + "type": "object" + }, + "endSec": { + "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", + "exclusiveMinimum": 0, + "type": "number" + }, + "focus": { + "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight.", + "oneOf": [ + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "frame-center", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "point", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "mode", + "x", + "y" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "faceId": { + "minLength": 1, + "type": "string" + }, + "mode": { + "const": "face", + "type": "string" + }, + "shotScale": { + "enum": [ + "close", + "standard", + "wide" + ], + "type": "string" + } + }, + "required": [ + "mode", + "faceId" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "all-faces", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "active-speaker", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + } + ] + }, + "intent": { + "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", + "type": "string" + }, + "startSec": { + "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", + "minimum": 0, + "type": "number" + }, + "zoom": { + "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale`: a face-tracked shot is sized EITHER by the editorial scale (shotScale, calibrated to the detected face) OR by an explicit zoom — never both.", + "maximum": 1, + "minimum": 0.1, + "type": "number" + } + }, + "required": [ + "startSec", + "endSec", + "focus" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "type": { + "const": "setCropIntents", + "type": "string" + } + }, + "required": [ + "type", + "clipId", + "segments" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Set (or CLEAR, with `effects: []`) a clip's EFFECT channel — the pinned component clip wrappers stacked onto that clip, each `{id, component, window}`: a unique `id`, the wrapper component's execution pin as `component`, and `window: {startTime, duration}` in seconds. The built-in primitive effects were removed: a stored one reads, and save and render refuse it (`effect_retired`), so clear it with `effects: []`. WHOLESALE: the array REPLACES the clip's current effects, so send the full stack (read the clip first to add one). This is the ONLY way to change effects on an existing clip — do NOT reach for a `clip.update` patch, whose top-level merge is the source-clobbering footgun documented above.", + "properties": { + "clipId": { + "type": "string" + }, + "effects": { + "items": { + "additionalProperties": false, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "id": { + "minLength": 1, + "type": "string" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "type": "string" + }, + "window": { + "additionalProperties": false, + "properties": { + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "startTime": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "startTime", + "duration" + ], + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + "type": { + "const": "setEffects", + "type": "string" + } + }, + "required": [ + "type", + "clipId", + "effects" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Merge style overrides (font/color/position/emphasis) onto the composition's caption layer. Partial — omitted fields keep their current value; creates the caption container if absent.", + "properties": { + "style": { + "additionalProperties": {}, + "properties": { + "annotationColor": { + "type": "string" + }, + "annotationStrokeWidth": { + "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", + "maximum": 12, + "minimum": 0.5, + "type": "number" + }, + "annotationTexture": { + "description": "Native annotation stroke finish; default clean.", + "enum": [ + "clean", + "pencil" + ], + "type": "string" + }, + "backgroundColor": { + "type": "string" + }, + "color": { + "minLength": 1, + "type": "string" + }, + "emphasisColor": { + "type": "string" + }, + "emphasisFontFamily": { + "type": "string" + }, + "emphasisFontStyle": { + "enum": [ + "normal", + "italic" + ], + "type": "string" + }, + "emphasisFontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "emphasisGradient": { + "type": "string" + }, + "emphasisLetterSpacing": { + "type": "number" + }, + "emphasisPlate": { + "type": "boolean" + }, + "emphasisPlateAltColor": { + "type": "string" + }, + "emphasisPlateAltTextColor": { + "type": "string" + }, + "emphasisPlateColor": { + "type": "string" + }, + "emphasisPlatePadX": { + "type": "number" + }, + "emphasisPlatePadY": { + "type": "number" + }, + "emphasisPlateRadius": { + "minimum": 0, + "type": "number" + }, + "emphasisPlateReveal": { + "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", + "type": "boolean" + }, + "emphasisPlateTextColor": { + "type": "string" + }, + "emphasisScale": { + "exclusiveMinimum": 0, + "type": "number" + }, + "emphasisTextTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "entrance": { + "enum": [ + "none", + "fade", + "word-pop", + "stagger-up" + ], + "type": "string" + }, + "entranceMs": { + "minimum": 0, + "type": "number" + }, + "entranceStaggerMs": { + "minimum": 0, + "type": "number" + }, + "exitMs": { + "minimum": 0, + "type": "number" + }, + "fontFamily": { + "minLength": 1, + "type": "string" + }, + "fontSize": { + "description": "Font size as % of composition height (1-15, default 5). NOT px.", + "maximum": 15, + "minimum": 1, + "type": "number" + }, + "fontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "highlightColor": { + "minLength": 1, + "type": "string" + }, + "letterSpacing": { + "description": "Base caption glyph spacing in pixels.", + "maximum": 20, + "minimum": -5, + "type": "number" + }, + "lineGapEm": { + "description": "Gap between caption lines as a multiple of base font size; default 0.25.", + "maximum": 2, + "minimum": 0, + "type": "number" + }, + "maxWidthPercent": { + "exclusiveMinimum": 0, + "maximum": 100, + "type": "number" + }, + "plate": { + "enum": [ + "glass", + "solid", + "none" + ], + "type": "string" + }, + "position": { + "enum": [ + "top", + "center", + "bottom" + ], + "type": "string" + }, + "region": { + "additionalProperties": {}, + "description": "Optional caption layout box {x,y,w,h} in normalized output-frame coordinates. Overrides position; text starts at its top edge and wraps/pages within its width and height.", + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + "textTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "wordGapEm": { + "description": "Gap between caption runs as a multiple of base font size; default 0.35.", + "maximum": 2, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "type": { + "const": "setCaptionStyle", + "type": "string" + } + }, + "required": [ + "type", + "style" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Set the caption compositing plane. Use `behind-subject` to place captions behind the segmented foreground subject; use `front` for conventional captions above all video layers.", + "properties": { + "type": { + "const": "setCaptionDepth", + "type": "string" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "type", + "zPlane" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Replace the caption SEGMENTS wholesale — author the word-timed caption layer directly (each segment = one sentence/page of `words` with timeline-ms `startMs`/`endMs`, optional `emphasis`). This is how a client with its OWN word timings (e.g. a generated VO take) gets word-synced captions without a source transcript; the compose lane's transcript slice writes the same layer. `style`, when given, merges with setCaptionStyle semantics; an omitted style keeps the existing one. Renderer paginates within a segment and never pools words across two — keep segments sentence-bounded.", + "properties": { + "segments": { + "items": { + "additionalProperties": {}, + "properties": { + "words": { + "items": { + "additionalProperties": {}, + "properties": { + "annotate": { + "enum": [ + "circle", + "underline" + ], + "type": "string" + }, + "emphasis": { + "type": "boolean" + }, + "endMs": { + "description": "Word end on the composition timeline, in milliseconds.", + "minimum": 0, + "type": "number" + }, + "startMs": { + "description": "Word start on the composition timeline, in milliseconds.", + "minimum": 0, + "type": "number" + }, + "text": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "startMs", + "endMs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "words" + ], + "type": "object" + }, + "type": "array" + }, + "style": { + "additionalProperties": {}, + "properties": { + "annotationColor": { + "type": "string" + }, + "annotationStrokeWidth": { + "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", + "maximum": 12, + "minimum": 0.5, + "type": "number" + }, + "annotationTexture": { + "description": "Native annotation stroke finish; default clean.", + "enum": [ + "clean", + "pencil" + ], + "type": "string" + }, + "backgroundColor": { + "type": "string" + }, + "color": { + "minLength": 1, + "type": "string" + }, + "emphasisColor": { + "type": "string" + }, + "emphasisFontFamily": { + "type": "string" + }, + "emphasisFontStyle": { + "enum": [ + "normal", + "italic" + ], + "type": "string" + }, + "emphasisFontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "emphasisGradient": { + "type": "string" + }, + "emphasisLetterSpacing": { + "type": "number" + }, + "emphasisPlate": { + "type": "boolean" + }, + "emphasisPlateAltColor": { + "type": "string" + }, + "emphasisPlateAltTextColor": { + "type": "string" + }, + "emphasisPlateColor": { + "type": "string" + }, + "emphasisPlatePadX": { + "type": "number" + }, + "emphasisPlatePadY": { + "type": "number" + }, + "emphasisPlateRadius": { + "minimum": 0, + "type": "number" + }, + "emphasisPlateReveal": { + "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", + "type": "boolean" + }, + "emphasisPlateTextColor": { + "type": "string" + }, + "emphasisScale": { + "exclusiveMinimum": 0, + "type": "number" + }, + "emphasisTextTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "entrance": { + "enum": [ + "none", + "fade", + "word-pop", + "stagger-up" + ], + "type": "string" + }, + "entranceMs": { + "minimum": 0, + "type": "number" + }, + "entranceStaggerMs": { + "minimum": 0, + "type": "number" + }, + "exitMs": { + "minimum": 0, + "type": "number" + }, + "fontFamily": { + "minLength": 1, + "type": "string" + }, + "fontSize": { + "description": "Font size as % of composition height (1-15, default 5). NOT px.", + "maximum": 15, + "minimum": 1, + "type": "number" + }, + "fontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "highlightColor": { + "minLength": 1, + "type": "string" + }, + "letterSpacing": { + "description": "Base caption glyph spacing in pixels.", + "maximum": 20, + "minimum": -5, + "type": "number" + }, + "lineGapEm": { + "description": "Gap between caption lines as a multiple of base font size; default 0.25.", + "maximum": 2, + "minimum": 0, + "type": "number" + }, + "maxWidthPercent": { + "exclusiveMinimum": 0, + "maximum": 100, + "type": "number" + }, + "plate": { + "enum": [ + "glass", + "solid", + "none" + ], + "type": "string" + }, + "position": { + "enum": [ + "top", + "center", + "bottom" + ], + "type": "string" + }, + "region": { + "additionalProperties": {}, + "description": "Optional caption layout box {x,y,w,h} in normalized output-frame coordinates. Overrides position; text starts at its top edge and wraps/pages within its width and height.", + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + "textTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "wordGapEm": { + "description": "Gap between caption runs as a multiple of base font size; default 0.35.", + "maximum": 2, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "type": { + "const": "setCaptions", + "type": "string" + } + }, + "required": [ + "type", + "segments" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Replace native caption placements without changing transcript words or timings. Each layout references a half-open word-index range in one saved segment; a one-word range is valid. region places that group independently, optional bounded scale/rotation/style changes its look, and holdThroughWordIndex keeps it visible through a later saved word in the same segment. All words in a placed range occupy one page; rendering refuses a range that cannot fit its box, so enlarge region or split the range. The box reserves horizontal space of 1.6 font sizes and vertical space of 0.8 font sizes for padding, with at most three lines. Unreferenced words keep the default caption layout. Word ranges must not overlap. Reapply after caption regeneration or timeline cuts.", + "properties": { + "layouts": { + "items": { + "additionalProperties": false, + "properties": { + "holdThroughWordIndex": { + "description": "Inclusive saved-word index in this segment. The layout stays visible until that word ends.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "region": { + "additionalProperties": {}, + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + "rotation": { + "maximum": 45, + "minimum": -45, + "type": "number" + }, + "scale": { + "maximum": 4, + "minimum": 0.25, + "type": "number" + }, + "segmentIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "style": { + "additionalProperties": false, + "properties": { + "annotationColor": { + "type": "string" + }, + "annotationStrokeWidth": { + "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", + "maximum": 12, + "minimum": 0.5, + "type": "number" + }, + "annotationTexture": { + "description": "Native annotation stroke finish; default clean.", + "enum": [ + "clean", + "pencil" + ], + "type": "string" + }, + "backgroundColor": { + "type": "string" + }, + "color": { + "minLength": 1, + "type": "string" + }, + "emphasisColor": { + "type": "string" + }, + "emphasisFontFamily": { + "type": "string" + }, + "emphasisFontStyle": { + "enum": [ + "normal", + "italic" + ], + "type": "string" + }, + "emphasisFontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "emphasisLetterSpacing": { + "type": "number" + }, + "emphasisPlate": { + "type": "boolean" + }, + "emphasisPlateAltColor": { + "type": "string" + }, + "emphasisPlateAltTextColor": { + "type": "string" + }, + "emphasisPlateColor": { + "type": "string" + }, + "emphasisPlatePadX": { + "type": "number" + }, + "emphasisPlatePadY": { + "type": "number" + }, + "emphasisPlateRadius": { + "minimum": 0, + "type": "number" + }, + "emphasisPlateReveal": { + "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", + "type": "boolean" + }, + "emphasisPlateTextColor": { + "type": "string" + }, + "emphasisScale": { + "exclusiveMinimum": 0, + "type": "number" + }, + "emphasisTextTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "entrance": { + "enum": [ + "none", + "fade", + "word-pop", + "stagger-up" + ], + "type": "string" + }, + "entranceMs": { + "minimum": 0, + "type": "number" + }, + "entranceStaggerMs": { + "minimum": 0, + "type": "number" + }, + "exitMs": { + "minimum": 0, + "type": "number" + }, + "fontFamily": { + "minLength": 1, + "type": "string" + }, + "fontSize": { + "description": "Font size as % of composition height (1-15, default 5). NOT px.", + "maximum": 15, + "minimum": 1, + "type": "number" + }, + "fontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "highlightColor": { + "minLength": 1, + "type": "string" + }, + "letterSpacing": { + "description": "Base caption glyph spacing in pixels.", + "maximum": 20, + "minimum": -5, + "type": "number" + }, + "lineGapEm": { + "description": "Gap between caption lines as a multiple of base font size; default 0.25.", + "maximum": 2, + "minimum": 0, + "type": "number" + }, + "plate": { + "enum": [ + "glass", + "solid", + "none" + ], + "type": "string" + }, + "textTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "wordGapEm": { + "description": "Gap between caption runs as a multiple of base font size; default 0.35.", + "maximum": 2, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "wordEndIndex": { + "description": "Exclusive word index in the saved caption segment.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "wordMarks": { + "items": { + "additionalProperties": false, + "properties": { + "annotate": { + "anyOf": [ + { + "enum": [ + "circle", + "underline" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "emphasis": { + "type": "boolean" + }, + "wordIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "wordIndex" + ], + "type": "object" + }, + "type": "array" + }, + "wordStartIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "segmentIndex", + "wordStartIndex", + "wordEndIndex", + "region" + ], + "type": "object" + }, + "type": "array" + }, + "type": { + "const": "setCaptionLayouts", + "type": "string" + } + }, + "required": [ + "type", + "layouts" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Author a scene shot and place it on a dedicated overlay track. The host validates the scene, generates and registers an immutable wrapper component source, and emits the ordinary track/clip operations carrying `props.componentRef` — you edit a scene SPEC, never wrapper TSX or a source hash. Registration and the composition update are ONE undoable edit; a failure publishes nothing and leaves no clip pointing at an unresolved source. Pass EXACTLY ONE of `trackId` (an existing dedicated scene track) or `newTrack: true` (mint one). That track holds scene-shot clips and gaps only — no generic component/primitive/media clips in v1 — and existing generic overlay tracks are unaffected. Scene clips use front zPlane and full-frame placement: outer per-clip `region`, `position`, `scale`, `rotation`, `fit`, `effects`, keyframes (`tweens`/`automation`), `params.transition`, `params.sequenceGroup` and internal fadeIn/fadeOut are REFUSED with a path, because the shot's own layer transforms are the single transform owner. TEXT: `space: \"screen\"` text is composed above the world result, stays fixed in the frame and stays sharp through focus; `space: \"world\"` text is rasterized into the 3D scene, moves with the camera and is occluded by geometry. Screenshots and world text are UNLIT and colour-managed so product UI colours are not tinted by the studio lighting, while device bodies are lit and cast shadows; an unlit surface still occludes. SCOPE GAP (pre-existing, neither closed nor changed by scene shots): global wrap effects — composition-level grades and camera effects — do not reach front-overlay clips, so they do not affect a scene shot. Author the look INSIDE the shot (`post.grain`, `post.vignette`, `post.focus`, `backdrop`, `environment`) instead. DISCOVERY: there is no built-in scene primitive to look up in list_catalog; the wrapper this operation registers appears afterwards as an ordinary INSTALLED component under the existing catalog rules. ASSETS: `assets` binds each slot name a layer references to a media id in the same project, and the slot's declared KIND decides what it admits — an image slot takes PNG, JPEG or WebP, a video slot MP4 or WebM. Binding the wrong kind is refused with the slot's path.", + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "clipId": { + "minLength": 1, + "type": "string" + }, + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "newTrack": { + "type": "boolean" + }, + "newTrackId": { + "minLength": 1, + "type": "string" + }, + "scene": { + "additionalProperties": false, + "description": "A version-2 scene shot: a self-contained 3D world-object shot that scene.add / scene.update materializes into an ordinary component clip. The shot owns its layers, camera, lighting, backdrop and normalized local animation; the composition owns start, duration, ordering, cuts and transitions. Coordinates are REFERENCE PIXELS: origin at frame centre, +X right, +Y down, +Z toward the viewer. referenceSize must have the SAME aspect ratio as the composition format; mismatch fails instead of cropping. At equal aspect ratio the shot scales uniformly by outputWidth/referenceWidth. A segment's easing belongs to the keyframe it ARRIVES at; the first keyframe has no easing. Authoring limits: 32 layers, 4 devices, 16 distinct image slots, 256 keyframes per channel, 2048 keyframes per shot. Version 2 supports nested groups, procedural slab/page/phone/laptop objects, screen- and world-space text, admitted image/component/video surfaces, fixed photographic and generated studio environments, transparent/solid/linear/radial backdrops, constraints, focus, grain and vignette. Raw HTML, custom shader props, imported GLB models, arbitrary external HDR environments, skeletal animation and physics are refused with an exact field path.", + "properties": { + "animation": { + "default": [], + "items": { + "additionalProperties": false, + "properties": { + "keyframes": { + "items": { + "additionalProperties": false, + "properties": { + "at": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "easing": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "linear", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "hold", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "bezier", + "type": "string" + }, + "x1": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "x2": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y1": { + "maximum": 5, + "minimum": -4, + "type": "number" + }, + "y2": { + "maximum": 5, + "minimum": -4, + "type": "number" + } + }, + "required": [ + "kind", + "x1", + "y1", + "x2", + "y2" + ], + "type": "object" + } + ] + }, + "value": { + "type": "number" + } + }, + "required": [ + "at", + "value" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "property": { + "enum": [ + "positionX", + "positionY", + "positionZ", + "rotationX", + "rotationY", + "rotationZ", + "fov", + "scale", + "opacity", + "openAngle", + "x", + "y", + "rotation", + "intensity", + "distance", + "range", + "maxBlur" + ], + "type": "string" + }, + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "camera", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "layer", + "type": "string" + }, + "layerId": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", + "type": "string" + } + }, + "required": [ + "kind", + "layerId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "environment", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "focus", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "target", + "property", + "keyframes" + ], + "type": "object" + }, + "type": "array" + }, + "backdrop": { + "default": { + "kind": "transparent" + }, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "transparent", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "kind": { + "const": "solid", + "type": "string" + } + }, + "required": [ + "kind", + "color" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "angle": { + "default": 0, + "type": "number" + }, + "kind": { + "const": "linear", + "type": "string" + }, + "stops": { + "items": { + "additionalProperties": false, + "properties": { + "at": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + } + }, + "required": [ + "at", + "color" + ], + "type": "object" + }, + "maxItems": 8, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "kind", + "stops" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "at": { + "default": [ + 0.5, + 0.5 + ], + "items": false, + "maxItems": 2, + "minItems": 2, + "prefixItems": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "maximum": 1, + "minimum": 0, + "type": "number" + } + ], + "type": "array" + }, + "kind": { + "const": "radial", + "type": "string" + }, + "stops": { + "items": { + "additionalProperties": false, + "properties": { + "at": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + } + }, + "required": [ + "at", + "color" + ], + "type": "object" + }, + "maxItems": 8, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "kind", + "stops" + ], + "type": "object" + } + ] + }, + "camera": { + "additionalProperties": false, + "properties": { + "fov": { + "maximum": 1.3962634015954636, + "minimum": 0.3141592653589793, + "type": "number" + }, + "position": { + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "rotation": { + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + } + }, + "type": "object" + }, + "constraints": { + "default": [], + "items": { + "additionalProperties": false, + "properties": { + "gap": { + "exclusiveMinimum": 0, + "type": "number" + }, + "kind": { + "const": "minSeparation", + "type": "string" + }, + "objects": { + "items": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", + "type": "string" + }, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "kind", + "objects", + "gap" + ], + "type": "object" + }, + "type": "array" + }, + "environment": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "floorY": { + "default": -420, + "type": "number" + }, + "intensity": { + "default": 1, + "minimum": 0, + "type": "number" + }, + "kind": { + "const": "studio", + "type": "string" + }, + "lightingProfile": { + "default": "studio", + "enum": [ + "studio", + "studio-edge" + ], + "type": "string" + }, + "preset": { + "default": "soft", + "enum": [ + "soft", + "key", + "rim" + ], + "type": "string" + }, + "shadowOpacity": { + "default": 0.5, + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "photographic-studio-v1", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ], + "default": { + "floorY": -420, + "intensity": 1, + "lightingProfile": "studio", + "preset": "soft", + "shadowOpacity": 0.5 + } + }, + "layers": { + "items": { + "$ref": "#/$defs/__schema1" + }, + "minItems": 1, + "type": "array" + }, + "post": { + "additionalProperties": false, + "default": { + "focus": null, + "grain": 0, + "vignette": 0 + }, + "properties": { + "focus": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "distance": { + "exclusiveMinimum": 0, + "type": "number" + }, + "maxBlur": { + "maximum": 64, + "minimum": 0, + "type": "number" + }, + "range": { + "exclusiveMinimum": 0, + "type": "number" + } + }, + "required": [ + "distance", + "range", + "maxBlur" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "default": null + }, + "grain": { + "default": 0, + "maximum": 0.5, + "minimum": 0, + "type": "number" + }, + "vignette": { + "default": 0, + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "referenceSize": { + "additionalProperties": false, + "properties": { + "height": { + "maximum": 8192, + "minimum": 16, + "type": "integer" + }, + "width": { + "maximum": 8192, + "minimum": 16, + "type": "integer" + } + }, + "required": [ + "width", + "height" + ], + "type": "object" + }, + "version": { + "const": 2, + "type": "number" + } + }, + "required": [ + "version", + "referenceSize", + "layers" + ], + "type": "object" + }, + "startTime": { + "minimum": 0, + "type": "number" + }, + "trackId": { + "minLength": 1, + "type": "string" + }, + "transitionIn": { + "additionalProperties": {}, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "fromClipId": { + "minLength": 1, + "type": "string" + }, + "handlePolicy": { + "const": "outgoing-overrun-at-cut-v1", + "type": "string" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "toClipId": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "type", + "duration" + ], + "type": "object" + }, + "type": { + "const": "scene.add", + "type": "string" + } + }, + "required": [ + "type", + "clipId", + "startTime", + "duration", + "scene", + "assets" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Revise a scene shot in place by clip id. Send a replacement `scene` and/or `assets`; timing changes use the ordinary clip timing fields (`startTime`, `duration`, `transitionIn`). Omitted fields keep their persisted values and the MERGED result is re-validated as a whole, so a partial edit cannot leave the shot invalid. Changing only values or asset IDs updates props and bindings and REUSES the pinned source; changing the referenced SLOT SET regenerates the wrapper manifest and registers a new immutable source version atomically. Undo restores the source reference, spec, bindings and timing together. Topology, asset bindings, text content, font properties, device kind and colours are STATIC within a shot's animation — change them here (a revised spec) rather than trying to animate them. This is not a source trim or slip: a shortened or extended clip resamples the SAME normalized animation over its new duration, and trim/slip requests on generated animation are rejected rather than reinterpreted as media trims. In one batch, `scene.update` may target a shot added by an earlier `scene.add`. ASSETS: `assets` binds each slot name a layer references to a media id in the same project, and the slot's declared KIND decides what it admits — an image slot takes PNG, JPEG or WebP, a video slot MP4 or WebM. Binding the wrong kind is refused with the slot's path.", + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "clipId": { + "minLength": 1, + "type": "string" + }, + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "scene": { + "additionalProperties": false, + "description": "A version-2 scene shot: a self-contained 3D world-object shot that scene.add / scene.update materializes into an ordinary component clip. The shot owns its layers, camera, lighting, backdrop and normalized local animation; the composition owns start, duration, ordering, cuts and transitions. Coordinates are REFERENCE PIXELS: origin at frame centre, +X right, +Y down, +Z toward the viewer. referenceSize must have the SAME aspect ratio as the composition format; mismatch fails instead of cropping. At equal aspect ratio the shot scales uniformly by outputWidth/referenceWidth. A segment's easing belongs to the keyframe it ARRIVES at; the first keyframe has no easing. Authoring limits: 32 layers, 4 devices, 16 distinct image slots, 256 keyframes per channel, 2048 keyframes per shot. Version 2 supports nested groups, procedural slab/page/phone/laptop objects, screen- and world-space text, admitted image/component/video surfaces, fixed photographic and generated studio environments, transparent/solid/linear/radial backdrops, constraints, focus, grain and vignette. Raw HTML, custom shader props, imported GLB models, arbitrary external HDR environments, skeletal animation and physics are refused with an exact field path.", + "properties": { + "animation": { + "default": [], + "items": { + "additionalProperties": false, + "properties": { + "keyframes": { + "items": { + "additionalProperties": false, + "properties": { + "at": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "easing": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "linear", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "hold", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "bezier", + "type": "string" + }, + "x1": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "x2": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y1": { + "maximum": 5, + "minimum": -4, + "type": "number" + }, + "y2": { + "maximum": 5, + "minimum": -4, + "type": "number" + } + }, + "required": [ + "kind", + "x1", + "y1", + "x2", + "y2" + ], + "type": "object" + } + ] + }, + "value": { + "type": "number" + } + }, + "required": [ + "at", + "value" + ], + "type": "object" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "property": { + "enum": [ + "positionX", + "positionY", + "positionZ", + "rotationX", + "rotationY", + "rotationZ", + "fov", + "scale", + "opacity", + "openAngle", + "x", + "y", + "rotation", + "intensity", + "distance", + "range", + "maxBlur" + ], + "type": "string" + }, + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "camera", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "layer", + "type": "string" + }, + "layerId": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", + "type": "string" + } + }, + "required": [ + "kind", + "layerId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "environment", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "focus", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "target", + "property", + "keyframes" + ], + "type": "object" + }, + "type": "array" + }, + "backdrop": { + "default": { + "kind": "transparent" + }, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "transparent", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + }, + "kind": { + "const": "solid", + "type": "string" + } + }, + "required": [ + "kind", + "color" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "angle": { + "default": 0, + "type": "number" + }, + "kind": { + "const": "linear", + "type": "string" + }, + "stops": { + "items": { + "additionalProperties": false, + "properties": { + "at": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + } + }, + "required": [ + "at", + "color" + ], + "type": "object" + }, + "maxItems": 8, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "kind", + "stops" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "at": { + "default": [ + 0.5, + 0.5 + ], + "items": false, + "maxItems": 2, + "minItems": 2, + "prefixItems": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "maximum": 1, + "minimum": 0, + "type": "number" + } + ], + "type": "array" + }, + "kind": { + "const": "radial", + "type": "string" + }, + "stops": { + "items": { + "additionalProperties": false, + "properties": { + "at": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "color": { + "anyOf": [ + { + "pattern": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$", + "type": "string" + }, + { + "enum": [ + "$brand:colors.background", + "$brand:colors.surface", + "$brand:colors.text", + "$brand:colors.textMuted", + "$brand:colors.accent", + "$brand:colors.accentStrong", + "$brand:colors.accentSoft", + "$brand:colors.success", + "$brand:colors.warning", + "$brand:colors.danger" + ], + "type": "string" + } + ] + } + }, + "required": [ + "at", + "color" + ], + "type": "object" + }, + "maxItems": 8, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "kind", + "stops" + ], + "type": "object" + } + ] + }, + "camera": { + "additionalProperties": false, + "properties": { + "fov": { + "maximum": 1.3962634015954636, + "minimum": 0.3141592653589793, + "type": "number" + }, + "position": { + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + }, + "rotation": { + "items": false, + "maxItems": 3, + "minItems": 3, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + }, + { + "type": "number" + } + ], + "type": "array" + } + }, + "type": "object" + }, + "constraints": { + "default": [], + "items": { + "additionalProperties": false, + "properties": { + "gap": { + "exclusiveMinimum": 0, + "type": "number" + }, + "kind": { + "const": "minSeparation", + "type": "string" + }, + "objects": { + "items": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$", + "type": "string" + }, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "kind", + "objects", + "gap" + ], + "type": "object" + }, + "type": "array" + }, + "environment": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "floorY": { + "default": -420, + "type": "number" + }, + "intensity": { + "default": 1, + "minimum": 0, + "type": "number" + }, + "kind": { + "const": "studio", + "type": "string" + }, + "lightingProfile": { + "default": "studio", + "enum": [ + "studio", + "studio-edge" + ], + "type": "string" + }, + "preset": { + "default": "soft", + "enum": [ + "soft", + "key", + "rim" + ], + "type": "string" + }, + "shadowOpacity": { + "default": 0.5, + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "photographic-studio-v1", + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ], + "default": { + "floorY": -420, + "intensity": 1, + "lightingProfile": "studio", + "preset": "soft", + "shadowOpacity": 0.5 + } + }, + "layers": { + "items": { + "$ref": "#/$defs/__schema1" + }, + "minItems": 1, + "type": "array" + }, + "post": { + "additionalProperties": false, + "default": { + "focus": null, + "grain": 0, + "vignette": 0 + }, + "properties": { + "focus": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "distance": { + "exclusiveMinimum": 0, + "type": "number" + }, + "maxBlur": { + "maximum": 64, + "minimum": 0, + "type": "number" + }, + "range": { + "exclusiveMinimum": 0, + "type": "number" + } + }, + "required": [ + "distance", + "range", + "maxBlur" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "default": null + }, + "grain": { + "default": 0, + "maximum": 0.5, + "minimum": 0, + "type": "number" + }, + "vignette": { + "default": 0, + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "referenceSize": { + "additionalProperties": false, + "properties": { + "height": { + "maximum": 8192, + "minimum": 16, + "type": "integer" + }, + "width": { + "maximum": 8192, + "minimum": 16, + "type": "integer" + } + }, + "required": [ + "width", + "height" + ], + "type": "object" + }, + "version": { + "const": 2, + "type": "number" + } + }, + "required": [ + "version", + "referenceSize", + "layers" + ], + "type": "object" + }, + "startTime": { + "minimum": 0, + "type": "number" + }, + "transitionIn": { + "additionalProperties": {}, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "fromClipId": { + "minLength": 1, + "type": "string" + }, + "handlePolicy": { + "const": "outgoing-overrun-at-cut-v1", + "type": "string" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "toClipId": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "type", + "duration" + ], + "type": "object" + }, + "type": { + "const": "scene.update", + "type": "string" + } + }, + "required": [ + "type", + "clipId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Materialize a clip's SOURCE-media temporal GRID as timeline markers — the rhythm authority you cut to. `grid:\"beat\"` reads a MUSIC bed's beat map (get_media_context.beatGrid), `grid:\"word\"` the VO word onsets (wordGrid); each grid point is projected from media time to TIMELINE time through the clip's placement (startTime, trim, playbackRate, excludedRanges) and written as a `kind:\"beat\"|\"word\"` marker (`metadata.sourceClipId` set). Points outside the clip's visible window are skipped. Re-running REPLACES the prior markers from the same clip+grid (idempotent). Land cuts and transition MIDPOINTS on the markers (a 0.5s transition starts 0.25s before its marker). `maxMarkers` (default 500, ceiling 2000) — exceeding it fails loud with the count. `grid:\"shot\"` is not yet exposed (shot_grid_unavailable). The target must be a media clip; absent evidence fails loud (grid_unavailable) naming how to get it (declare audioRole:\"music\" at ingest / transcribe).", + "properties": { + "clipId": { + "type": "string" + }, + "grid": { + "enum": [ + "beat", + "word", + "shot" + ], + "type": "string" + }, + "maxMarkers": { + "exclusiveMinimum": 0, + "maximum": 2000, + "type": "integer" + }, + "type": { + "const": "materializeGrid", + "type": "string" + } + }, + "required": [ + "type", + "clipId", + "grid" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Attach caption CONTENT from the media's cached transcript — no pasting words. ROUTE-MATERIALIZED like materializeGrid: the server slices the word-timed transcript to `window` (source seconds; absent = the whole media), rebases times, sentence-splits into segments, and applies it as `setCaptions`. 422 media_no_transcript when the media has no transcript or no words in the window. For your OWN word timings use setCaptions directly. For edited multi-clip timelines, use captions.fromComposition after saving the edits; that operation projects all selected track clips, trims, exclusions, and placements.", + "properties": { + "mediaId": { + "minLength": 1, + "type": "string" + }, + "type": { + "const": "captions.fromTranscript", + "type": "string" + }, + "window": { + "additionalProperties": false, + "properties": { + "endSec": { + "exclusiveMinimum": 0, + "type": "number" + }, + "startSec": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "startSec", + "endSec" + ], + "type": "object" + } + }, + "required": [ + "type", + "mediaId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Snapshot word-timed captions from the SAVED edits on one explicit enabled video or audio track. The host reads each source media transcript, projects words through clip trim, excluded ranges and placement, then replaces the caption segments. This is route-materialized to setCaptions; call it AFTER persisting clip edits and call it again when those edits change. The existing caption style and depth are preserved. Missing transcripts, unsupported clips, inconsistent clip durations, and overlapping audible clips fail loud. Playback rate scales source word times and playable duration on both audio and video tracks.", + "properties": { + "trackId": { + "minLength": 1, + "type": "string" + }, + "type": { + "const": "captions.fromComposition", + "type": "string" + } + }, + "required": [ + "type", + "trackId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Set the output format — `aspectRatio` (16:9|9:16|1:1|4:5) plus optional `fps` and `resolution`. Merges: an omitted field keeps the current value.", + "properties": { + "format": { + "additionalProperties": {}, + "properties": { + "aspectRatio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:5" + ], + "type": "string" + }, + "fps": { + "anyOf": [ + { + "const": 24, + "type": "number" + }, + { + "const": 25, + "type": "number" + }, + { + "const": 30, + "type": "number" + }, + { + "const": 60, + "type": "number" + } + ] + }, + "resolution": { + "enum": [ + "hd", + "fhd", + "4k" + ], + "type": "string" + } + }, + "required": [ + "aspectRatio" + ], + "type": "object" + }, + "type": { + "const": "setFormat", + "type": "string" + } + }, + "required": [ + "type", + "format" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Add an EMPTY track of a given family (video|audio|image|overlay|effect). Optional pinned `id`. The new track is appended, so it starts at the BACK: index 0 is the top layer and higher indices are further back (see `reorderTracks`). Track order only ranks clips on the same plane — every overlay draws above the video lane unless its `zPlane` is `behind-subject`, whatever its track index.", + "properties": { + "id": { + "type": "string" + }, + "kind": { + "enum": [ + "video", + "audio", + "image", + "overlay", + "effect" + ], + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "const": "addTrack", + "type": "string" + } + }, + "required": [ + "type", + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Remove a track AND all its clips by id.", + "properties": { + "trackId": { + "type": "string" + }, + "type": { + "const": "removeTrack", + "type": "string" + } + }, + "required": [ + "type", + "trackId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Patch a track's `name` / `enabled` by id. Track volume is retired: set each clip's own volume.", + "properties": { + "trackId": { + "type": "string" + }, + "type": { + "const": "updateTrack", + "type": "string" + }, + "updates": { + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "volume": { + "maximum": 4, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "type", + "trackId", + "updates" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Move a track from one index to another. ORDER: index 0 is the TOP layer, not the bottom — moving a backdrop to index 0 puts it in FRONT of everything and hides the composition. Higher index = further back. PRECEDENCE: track order decides compositing only among clips on the same plane. Overlays are composited in a lane ABOVE the video lane whatever their track index; the one exception is `zPlane:\"behind-subject\"`, which moves the overlay inside its host clip, behind the segmented foreground. So if reordering tracks does not change what you see, the plane split already decided it.", + "properties": { + "fromIndex": { + "type": "number" + }, + "toIndex": { + "type": "number" + }, + "type": { + "const": "reorderTracks", + "type": "string" + } + }, + "required": [ + "type", + "fromIndex", + "toIndex" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Move a clip to another SAME-family track, optionally at a new `newStartTime`.", + "properties": { + "clipId": { + "type": "string" + }, + "newStartTime": { + "type": "number" + }, + "targetTrackId": { + "type": "string" + }, + "type": { + "const": "moveClipToTrack", + "type": "string" + } + }, + "required": [ + "type", + "clipId", + "targetTrackId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Duplicate a clip by id. Pin `newClipId` to make the copy's id deterministic (required for a clean undo/inverse).", + "properties": { + "clipId": { + "type": "string" + }, + "newClipId": { + "type": "string" + }, + "type": { + "const": "duplicateClip", + "type": "string" + } + }, + "required": [ + "type", + "clipId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Server-authoritative: delete the [start,end] time window (seconds) and ripple every downstream clip/marker/caption earlier to close the gap.", + "properties": { + "end": { + "type": "number" + }, + "start": { + "type": "number" + }, + "type": { + "const": "cutAndRipple", + "type": "string" + } + }, + "required": [ + "type", + "start", + "end" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Server-authoritative: shift everything at/after `time` (seconds) by `amount` seconds (+ opens a gap, − closes one).", + "properties": { + "amount": { + "type": "number" + }, + "time": { + "type": "number" + }, + "type": { + "const": "ripple", + "type": "string" + } + }, + "required": [ + "type", + "time", + "amount" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Server-authoritative: exclude a [sourceStart,sourceEnd] span (seconds) of a clip's SOURCE (an internal trim) and ripple downstream — the preferred way to drop a sub-range vs a source patch.", + "properties": { + "clipId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "sourceEnd": { + "type": "number" + }, + "sourceStart": { + "type": "number" + }, + "type": { + "const": "addExcludedRange", + "type": "string" + } + }, + "required": [ + "type", + "clipId", + "sourceStart", + "sourceEnd" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Server-authoritative: remove a clip's previously-added excluded range by index (re-includes that span, ripples downstream).", + "properties": { + "clipId": { + "type": "string" + }, + "rangeIdx": { + "type": "number" + }, + "type": { + "const": "removeExcludedRange", + "type": "string" + } + }, + "required": [ + "type", + "clipId", + "rangeIdx" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Atomically repin explicit version3 invocations using complete before/after execution references and an exact composition etag. Persistence must canonically admit scoped source hashes, destination input schemas and every resulting target context before applying, including replay/undo. Never infer a latest head, downgrade versions or accept an admitted flag.", + "properties": { + "changes": { + "items": { + "additionalProperties": false, + "properties": { + "after": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "before": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "placementId": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "placementId", + "before", + "after" + ], + "type": "object" + }, + "maxItems": 512, + "minItems": 1, + "type": "array" + }, + "componentId": { + "minLength": 1, + "type": "string" + }, + "expectedCompositionEtag": { + "minLength": 1, + "type": "string" + }, + "from": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "to": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "type": { + "const": "component.repin-v3", + "type": "string" + } + }, + "required": [ + "type", + "componentId", + "from", + "to", + "expectedCompositionEtag", + "changes" + ], + "type": "object" + } +]
- Changed
apply_template5 fields changed- added
Input schema / properties / body / properties / componentExecutionVersions / anyOfAdded value: +[ + { + "items": false, + "maxItems": 1, + "minItems": 1, + "prefixItems": [ + { + "const": 3, + "type": "number" + } + ], + "type": "array" + }, + { + "items": false, + "maxItems": 2, + "minItems": 2, + "prefixItems": [ + { + "const": 3, + "type": "number" + }, + { + "const": 4, + "type": "number" + } + ], + "type": "array" + } +] - removed
Input schema / properties / body / properties / componentExecutionVersions / itemsRemoved value: -{ - "const": 3, - "type": "number" -} - removed
Input schema / properties / body / properties / componentExecutionVersions / maxItemsRemoved value: -1 - removed
Input schema / properties / body / properties / componentExecutionVersions / minItemsRemoved value: -1 - removed
Input schema / properties / body / properties / componentExecutionVersions / typeRemoved value: -"array"
- Changed
compose1 field changed- added
Input schema / properties / body / properties / format / properties / platformAdded value: +{ + "type": "string" +}
- Changed
create_brief20 fields changed- removed
Input schema / properties / body / properties / format / descriptionRemoved value: -"Output-format spec per §Format." - added
Input schema / properties / body / properties / format / properties / platformAdded value: +{ + "type": "string" +} - removed
Input schema / properties / body / properties / seededGraphics / items / properties / animateRemoved value: -{ - "additionalProperties": { - "items": { - "additionalProperties": false, - "properties": { - "easing": { - "anyOf": [ - { - "enum": [ - "linear", - "ease", - "easeIn", - "easeOut", - "easeInOut" - ], - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "cubicBezier": { - "items": false, - "maxItems": 4, - "minItems": 4, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - } - }, - "required": [ - "cubicBezier" - ], - "type": "object" - } - ] - }, - "time": { - "minimum": 0, - "type": "number" - }, - "value": { - "type": "number" - } - }, - "required": [ - "time", - "value" - ], - "type": "object" - }, - "minItems": 2, - "type": "array" - }, - "description": "Keyframe channels, clip-relative seconds. Each channel's values use the SAME unit as the scalar it animates: `opacity` 0 to 1, `scale` a multiplier (>0), `rotation` degrees, `position.x`/`position.y` a FRACTION of the frame like `position` (0.5 = centre; NOT pixels), `volume` 0 to 4.", - "propertyNames": { - "type": "string" - }, - "type": "object" -} - added
Input schema / properties / body / properties / seededGraphics / items / properties / automationAdded value: +{ + "additionalProperties": false, + "properties": { + "lanes": { + "items": { + "additionalProperties": false, + "properties": { + "points": { + "items": { + "additionalProperties": false, + "properties": { + "t": { + "type": "number" + }, + "v": { + "type": "number" + } + }, + "required": [ + "t", + "v" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + }, + "target": { + "const": "volume", + "type": "string" + } + }, + "required": [ + "target", + "points" + ], + "type": "object" + }, + "type": "array" + }, + "version": { + "const": 1, + "type": "number" + } + }, + "required": [ + "version", + "lanes" + ], + "type": "object" +} - removed
Input schema / properties / body / properties / seededGraphics / items / properties / duration / descriptionRemoved value: -"Clip duration (seconds)." - removed
Input schema / properties / body / properties / seededGraphics / items / properties / effects / items / properties / component / additionalPropertiesRemoved value: -false - added
Input schema / properties / body / properties / seededGraphics / items / properties / effects / items / properties / component / anyOfAdded value: +[ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } +] - removed
Input schema / properties / body / properties / seededGraphics / items / properties / effects / items / properties / component / propertiesRemoved value: -{ - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } -} - removed
Input schema / properties / body / properties / seededGraphics / items / properties / effects / items / properties / component / requiredRemoved value: -[ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" -] - removed
Input schema / properties / body / properties / seededGraphics / items / properties / effects / items / properties / component / typeRemoved value: -"object" - added
Input schema / properties / body / properties / seededGraphics / items / properties / legacyKeyframesAdded value: +{ + "additionalProperties": false, + "properties": { + "channels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "needsUpgrade": { + "const": true, + "type": "boolean" + }, + "record": {} + }, + "required": [ + "needsUpgrade", + "channels", + "record" + ], + "type": "object" +} - changed
Input schema / properties / body / properties / seededGraphics / items / properties / source / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "properties": { - "clipId": { - "minLength": 1, - "type": "string" - }, - "offsetMs": { - "type": "number" - } - }, - "required": [ - "clipId", - "offsetMs" - ], - "type": "object" - }, - "audioRole": { - "enum": [ - "sfx", - "music", - "vo", - "ambience" - ], - "type": "string" - }, - "duck": { - "additionalProperties": false, - "properties": { - "attackMs": { - "minimum": 0, - "type": "number" - }, - "duckDb": { - "maximum": 0, - "type": "number" - }, - "releaseMs": { - "minimum": 0, - "type": "number" - }, - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "endMs": { - "type": "number" - }, - "startMs": { - "type": "number" - } - }, - "required": [ - "startMs", - "endMs" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "duckDb", - "attackMs", - "releaseMs" - ], - "type": "object" - }, - "excludedRanges": { - "items": { - "additionalProperties": false, - "properties": { - "end": { - "minimum": 0, - "type": "number" - }, - "reason": { - "type": "string" - }, - "start": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "start", - "end" - ], - "type": "object" - }, - "type": "array" - }, - "fadeInMs": { - "minimum": 0, - "type": "number" - }, - "fadeOutMs": { - "minimum": 0, - "type": "number" - }, - "kenBurns": { - "enum": [ - "in", - "out", - "pan-l", - "pan-r", - "none" - ], - "type": "string" - }, - "kind": { - "const": "media", - "type": "string" - }, - "loop": { - "type": "boolean" - }, - "mediaId": { - "minLength": 1, - "type": "string" - }, - "muted": { - "type": "boolean" - }, - "playbackRate": { - "exclusiveMinimum": 0, - "type": "number" - }, - "reframe": { - "additionalProperties": false, - "properties": { - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "bias": { - "additionalProperties": false, - "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", - "properties": { - "x": { - "description": "Horizontal nudge, source-normalized (+ = right).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "y": { - "description": "Vertical nudge, source-normalized (+ = down).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "ease": { - "additionalProperties": false, - "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", - "properties": { - "in": { - "description": "Ease-IN ramp DURATION in seconds at the segment START.", - "minimum": 0, - "type": "number" - }, - "out": { - "description": "Ease-OUT ramp DURATION in seconds at the segment END.", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "in", - "out" - ], - "type": "object" - }, - "endSec": { - "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", - "exclusiveMinimum": 0, - "type": "number" - }, - "focus": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "frame-center", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "point", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "mode", - "x", - "y" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "faceId": { - "minLength": 1, - "type": "string" - }, - "mode": { - "const": "face", - "type": "string" - }, - "shotScale": { - "enum": [ - "close", - "standard", - "wide" - ], - "type": "string" - } - }, - "required": [ - "mode", - "faceId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "all-faces", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "active-speaker", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - } - ], - "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight." - }, - "intent": { - "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", - "type": "string" - }, - "startSec": { - "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", - "minimum": 0, - "type": "number" - }, - "zoom": { - "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale` — a face-tracked shot is sized EITHER by the editorial scale (shotScale, which the bake calibrates to the detected face) OR by an explicit zoom, never both. A segment carrying both is REJECTED: shotScale wins at bake time and the zoom would be silently discarded.", - "maximum": 1, - "minimum": 0.1, - "type": "number" - } - }, - "required": [ - "startSec", - "endSec", - "focus" - ], - "type": "object" - }, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "segments" - ], - "type": "object" - }, - "sync": { - "enum": [ - "video", - "independent" - ], - "type": "string" - }, - "trim": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Source trim end (seconds).", - "minimum": 0, - "type": "number" - }, - "start": { - "description": "Source trim start (seconds).", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "start", - "end" - ], - "type": "object" - }, - "volume": { - "maximum": 4, - "minimum": 0, - "type": "number" - }, - "volumeDb": { - "type": "number" - } - }, - "required": [ - "kind", - "mediaId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "componentId": { - "minLength": 1, - "type": "string" - }, - "execution": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "kind": { - "const": "component", - "type": "string" - }, - "placement": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "clip", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "content-slots", - "type": "string" - }, - "slots": { - "additionalProperties": { - "additionalProperties": false, - "properties": { - "ownership": { - "enum": [ - "reference", - "exclusive" - ], - "type": "string" - }, - "targetClipIds": { - "items": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "targetClipIds", - "ownership" - ], - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "kind", - "slots" - ], - "type": "object" - } - ] - }, - "props": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "kind", - "componentId", - "props", - "execution", - "placement" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "properties": { - "space": { - "const": "scene", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "space", - "x", - "y" - ], - "type": "object" - }, - "kind": { - "const": "overlay", - "type": "string" - }, - "parallax": { - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "pattern": "^(?!custom$)", - "type": "string" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "kind", - "primitiveId", - "params" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "kind": { - "const": "effect", - "type": "string" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "type": "string" - }, - "targetTrackIds": { - "items": { - "minLength": 1, - "type": "string" - }, - "minItems": 1, - "type": "array" - }, - "wrapperOrder": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "html": { - "description": "Your card's HTML — rendered VERBATIM as the graphic (shell motion via applyMotionPreset in a FOLLOWING call). CANVAS CONTRACT: the card renders in a viewport equal to the composition format's pixel frame (1080×1920 at 9:16 fhd); the root is NOT auto-pinned — declare explicit width/height matching the frame (box-sizing:border-box) and anchor content with flex/grid; position:absolute;inset:0 on the root does NOT fill the frame; for edge-to-edge backgrounds add an inner absolutely-positioned layer with generous negative inset. Overlay compositing applies a ~92% safe-area inset — keep critical copy away from the extreme edges. FONTS: name a family from GET /v1/fonts (list_render_fonts) — the renderer loads those faces for the card and waits for them, so `font-family: Inter` draws Inter. `@import` and remote font files are REFUSED: the card renders with no network. A family that is not on that list has no bytes behind it and the browser falls back, so end any stack with a generic (`Inter, sans-serif`) rather than relying on a system face being present.", - "minLength": 1, - "type": "string" - }, - "kind": { - "const": "card", - "type": "string" - }, - "tokens": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "zPlane": { - "const": "front", - "type": "string" - } - }, - "required": [ - "kind", - "html" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "anchor": { + "additionalProperties": false, + "properties": { + "clipId": { + "minLength": 1, + "type": "string" + }, + "offsetMs": { + "type": "number" + } + }, + "required": [ + "clipId", + "offsetMs" + ], + "type": "object" + }, + "audioRole": { + "enum": [ + "sfx", + "music", + "vo", + "ambience" + ], + "type": "string" + }, + "duck": { + "additionalProperties": false, + "properties": { + "attackMs": { + "minimum": 0, + "type": "number" + }, + "duckDb": { + "maximum": 0, + "type": "number" + }, + "releaseMs": { + "minimum": 0, + "type": "number" + }, + "windows": { + "items": { + "additionalProperties": false, + "properties": { + "endMs": { + "type": "number" + }, + "startMs": { + "type": "number" + } + }, + "required": [ + "startMs", + "endMs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "duckDb", + "attackMs", + "releaseMs" + ], + "type": "object" + }, + "excludedRanges": { + "items": { + "additionalProperties": false, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "reason": { + "type": "string" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, + "type": "array" + }, + "fadeInMs": { + "minimum": 0, + "type": "number" + }, + "fadeOutMs": { + "minimum": 0, + "type": "number" + }, + "kenBurns": { + "enum": [ + "in", + "out", + "pan-l", + "pan-r", + "none" + ], + "type": "string" + }, + "kind": { + "const": "media", + "type": "string" + }, + "loop": { + "type": "boolean" + }, + "mediaId": { + "type": "string" + }, + "muted": { + "type": "boolean" + }, + "playbackRate": { + "exclusiveMinimum": 0, + "type": "number" + }, + "reframe": { + "additionalProperties": false, + "properties": { + "segments": { + "items": { + "additionalProperties": false, + "properties": { + "bias": { + "additionalProperties": false, + "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", + "properties": { + "x": { + "description": "Horizontal nudge, source-normalized (+ = right).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "y": { + "description": "Vertical nudge, source-normalized (+ = down).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "ease": { + "additionalProperties": false, + "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", + "properties": { + "in": { + "description": "Ease-IN ramp DURATION in seconds at the segment START.", + "minimum": 0, + "type": "number" + }, + "out": { + "description": "Ease-OUT ramp DURATION in seconds at the segment END.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "in", + "out" + ], + "type": "object" + }, + "endSec": { + "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", + "exclusiveMinimum": 0, + "type": "number" + }, + "focus": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "frame-center", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "point", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "mode", + "x", + "y" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "faceId": { + "minLength": 1, + "type": "string" + }, + "mode": { + "const": "face", + "type": "string" + }, + "shotScale": { + "enum": [ + "close", + "standard", + "wide" + ], + "type": "string" + } + }, + "required": [ + "mode", + "faceId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "all-faces", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "active-speaker", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + } + ], + "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight." + }, + "intent": { + "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", + "type": "string" + }, + "startSec": { + "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", + "minimum": 0, + "type": "number" + }, + "zoom": { + "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale`: a face-tracked shot is sized EITHER by the editorial scale (shotScale, calibrated to the detected face) OR by an explicit zoom — never both.", + "maximum": 1, + "minimum": 0.1, + "type": "number" + } + }, + "required": [ + "startSec", + "endSec", + "focus" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "segments" + ], + "type": "object" + }, + "sync": { + "enum": [ + "video", + "independent" + ], + "type": "string" + }, + "trim": { + "additionalProperties": false, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, + "volume": { + "maximum": 4, + "minimum": 0, + "type": "number" + }, + "volumeDb": { + "type": "number" + } + }, + "required": [ + "kind", + "mediaId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "componentId": { + "minLength": 1, + "type": "string" + }, + "execution": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "kind": { + "const": "component", + "type": "string" + }, + "placement": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "clip", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "content-slots", + "type": "string" + }, + "slots": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "ownership": { + "enum": [ + "reference", + "exclusive" + ], + "type": "string" + }, + "targetClipIds": { + "items": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targetClipIds", + "ownership" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "kind", + "slots" + ], + "type": "object" + } + ] + }, + "props": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "retired": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "kind", + "componentId", + "props" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "anchor": { + "additionalProperties": false, + "properties": { + "space": { + "const": "scene", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "space", + "x", + "y" + ], + "type": "object" + }, + "kind": { + "const": "overlay", + "type": "string" + }, + "parallax": { + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "params": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "pattern": "^(?!custom$)", + "type": "string" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "kind", + "primitiveId", + "params" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "component": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "kind": { + "const": "effect", + "type": "string" + }, + "params": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "type": "string" + }, + "targetTrackIds": { + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "wrapperOrder": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "html": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "card", + "type": "string" + }, + "tokens": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "zPlane": { + "const": "front", + "type": "string" + } + }, + "required": [ + "kind", + "html" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "compositionId": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "composition", + "type": "string" + }, + "trim": { + "additionalProperties": false, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + } + }, + "required": [ + "kind", + "compositionId" + ], + "type": "object" + } +] - removed
Input schema / properties / body / properties / seededGraphics / items / properties / startTime / descriptionRemoved value: -"Timeline start (seconds)." - removed
Input schema / properties / body / properties / seededGraphics / items / properties / transitionIn / properties / component / additionalPropertiesRemoved value: -false - added
Input schema / properties / body / properties / seededGraphics / items / properties / transitionIn / properties / component / anyOfAdded value: +[ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } +] - removed
Input schema / properties / body / properties / seededGraphics / items / properties / transitionIn / properties / component / propertiesRemoved value: -{ - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } -} - removed
Input schema / properties / body / properties / seededGraphics / items / properties / transitionIn / properties / component / requiredRemoved value: -[ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" -] - removed
Input schema / properties / body / properties / seededGraphics / items / properties / transitionIn / properties / component / typeRemoved value: -"object" - added
Input schema / properties / body / properties / seededGraphics / items / properties / tweensAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "keyframes": { + "additionalProperties": false, + "properties": { + "easeEach": { + "const": "none", + "type": "string" + }, + "format": { + "const": "percentage", + "type": "string" + }, + "keyframes": { + "items": { + "additionalProperties": false, + "properties": { + "ease": { + "type": "string" + }, + "percentage": { + "type": "number" + }, + "properties": { + "additionalProperties": { + "type": "number" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "percentage", + "properties" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "format", + "easeEach", + "keyframes" + ], + "type": "object" + }, + "position": { + "type": "number" + }, + "propertyGroup": { + "enum": [ + "visual", + "scale", + "rotation", + "position" + ], + "type": "string" + } + }, + "required": [ + "id", + "propertyGroup", + "position", + "duration", + "keyframes" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / properties / format / descriptionRemoved value: -"Output-format spec per §Format."
- Changed
create_component14 fields changed- added
Input schema / properties / body / properties / source / properties / manifest / properties / hfContractAdded value: +{ + "const": 1, + "type": "number" +} - added
Input schema / properties / body / properties / source / properties / manifest / properties / kindAdded value: +{ + "const": "scene", + "type": "string" +} - added
Input schema / properties / body / properties / source / properties / manifest / properties / runtimeAdded value: +{ + "const": "hyperframes", + "type": "string" +} - changed
Input schema / properties / body / properties / source / properties / manifest / properties / version / constPrevious value: -2New value: +4 - removed
Input schema / properties / body / properties / source / properties / manifest / properties / visualMediaRemoved value: -{ - "additionalProperties": false, - "properties": { - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version" - ], - "type": "object" -} - changed
Input schema / properties / body / properties / source / properties / manifest / requiredPrevious value: -[ - "version", - "assets", - "graphics", - "alphaPolicy" -]New value: +[ + "version", + "runtime", + "hfContract", + "kind", + "assets", + "graphics", + "alphaPolicy" +] - added
Input schema / properties / body / properties / source / properties / templateAdded value: +{ + "maxLength": 2000000, + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / body / properties / source / properties / tsxSourceRemoved value: -{ - "maxLength": 8000000, - "minLength": 1, - "type": "string" -} - changed
Input schema / properties / body / properties / source / properties / version / constPrevious value: -3New value: +4 - changed
Input schema / properties / body / properties / source / requiredPrevious value: -[ - "version", - "componentId", - "tsxSource", - "manifest", - "definition" -]New value: +[ + "version", + "componentId", + "template", + "manifest", + "definition" +] - removed
Output schema / properties / manifest / additionalPropertiesRemoved value: -{} - removed
Output schema / properties / manifest / propertiesRemoved value: -{} - removed
Output schema / properties / manifest / typeRemoved value: -"object" - changed
Output schema / properties / version / descriptionPrevious value: -"The ENTRY's version: a semver string ('0.0.0' until an authored component is versioned). Distinct from `manifest.version`, which is the runtime contract version and is always the literal 2."New value: +"The ENTRY's version: a semver string ('0.0.0' until an authored component is versioned). Distinct from `manifest.version`, which is the runtime contract version (4 native, 2 retired TSX)."
- Changed
create_project2 fields changed- removed
Input schema / properties / body / properties / format / descriptionRemoved value: -"Output-format spec per §Format." - added
Input schema / properties / body / properties / format / properties / platformAdded value: +{ + "type": "string" +}
- Changed
create_render2 fields changed- removed
Input schema / properties / body / properties / format / descriptionRemoved value: -"Output-format spec per §Format." - added
Input schema / properties / body / properties / format / properties / platformAdded value: +{ + "type": "string" +}
- Changed
derive_composition1 field changed- added
Input schema / properties / body / properties / targetFormat / properties / platformAdded value: +{ + "type": "string" +}
- Changed
get_brief1 field changed- removed
Output schema / properties / format / descriptionRemoved value: -"Output-format spec per §Format."
- Changed
get_component_source7 fields changed- removed
Output schema / properties / manifest / additionalPropertiesRemoved value: -{} - removed
Output schema / properties / manifest / propertiesRemoved value: -{} - removed
Output schema / properties / manifest / typeRemoved value: -"object" - removed
Output schema / properties / sourceSnapshot / additionalPropertiesRemoved value: -{} - changed
Output schema / properties / sourceSnapshot / descriptionPrevious value: -"Canonical immutable v3 source snapshot; source remains provenance."New value: +"Canonical immutable source snapshot (version 4 template, or a retired version 3 TSX module); source remains provenance." - removed
Output schema / properties / sourceSnapshot / propertiesRemoved value: -{} - removed
Output schema / properties / sourceSnapshot / typeRemoved value: -"object"
- Changed
get_composition4 fields changed- added
Input schema / properties / componentExecutionVersions / anyOfAdded value: +[ + { + "const": "3", + "type": "string" + }, + { + "items": false, + "maxItems": 2, + "minItems": 2, + "prefixItems": [ + { + "const": "3", + "type": "string" + }, + { + "const": "4", + "type": "string" + } + ], + "type": "array" + } +] - removed
Input schema / properties / componentExecutionVersions / constRemoved value: -"3" - changed
Input schema / properties / componentExecutionVersions / descriptionPrevious value: -"Explicit accepted saved component execution protocol. Absent readers accept only the historical protocol."New value: +"The component execution versions this reader accepts, one parameter per version: 3, or 3 and 4 (native placements). Absent readers accept only the historical protocol." - removed
Input schema / properties / componentExecutionVersions / typeRemoved value: -"string"
- Changed
new_composition2 fields changed- removed
Input schema / properties / body / properties / format / descriptionRemoved value: -"Output-format spec per §Format." - added
Input schema / properties / body / properties / format / properties / platformAdded value: +{ + "type": "string" +}
- Added
repin_component - Changed
update_brief20 fields changed- removed
Input schema / properties / body / properties / format / descriptionRemoved value: -"Output-format spec per §Format." - added
Input schema / properties / body / properties / format / properties / platformAdded value: +{ + "type": "string" +} - removed
Input schema / properties / body / properties / seededGraphics / items / properties / animateRemoved value: -{ - "additionalProperties": { - "items": { - "additionalProperties": false, - "properties": { - "easing": { - "anyOf": [ - { - "enum": [ - "linear", - "ease", - "easeIn", - "easeOut", - "easeInOut" - ], - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "cubicBezier": { - "items": false, - "maxItems": 4, - "minItems": 4, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - } - }, - "required": [ - "cubicBezier" - ], - "type": "object" - } - ] - }, - "time": { - "minimum": 0, - "type": "number" - }, - "value": { - "type": "number" - } - }, - "required": [ - "time", - "value" - ], - "type": "object" - }, - "minItems": 2, - "type": "array" - }, - "description": "Keyframe channels, clip-relative seconds. Each channel's values use the SAME unit as the scalar it animates: `opacity` 0 to 1, `scale` a multiplier (>0), `rotation` degrees, `position.x`/`position.y` a FRACTION of the frame like `position` (0.5 = centre; NOT pixels), `volume` 0 to 4.", - "propertyNames": { - "type": "string" - }, - "type": "object" -} - added
Input schema / properties / body / properties / seededGraphics / items / properties / automationAdded value: +{ + "additionalProperties": false, + "properties": { + "lanes": { + "items": { + "additionalProperties": false, + "properties": { + "points": { + "items": { + "additionalProperties": false, + "properties": { + "t": { + "type": "number" + }, + "v": { + "type": "number" + } + }, + "required": [ + "t", + "v" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + }, + "target": { + "const": "volume", + "type": "string" + } + }, + "required": [ + "target", + "points" + ], + "type": "object" + }, + "type": "array" + }, + "version": { + "const": 1, + "type": "number" + } + }, + "required": [ + "version", + "lanes" + ], + "type": "object" +} - removed
Input schema / properties / body / properties / seededGraphics / items / properties / duration / descriptionRemoved value: -"Clip duration (seconds)." - removed
Input schema / properties / body / properties / seededGraphics / items / properties / effects / items / properties / component / additionalPropertiesRemoved value: -false - added
Input schema / properties / body / properties / seededGraphics / items / properties / effects / items / properties / component / anyOfAdded value: +[ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } +] - removed
Input schema / properties / body / properties / seededGraphics / items / properties / effects / items / properties / component / propertiesRemoved value: -{ - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } -} - removed
Input schema / properties / body / properties / seededGraphics / items / properties / effects / items / properties / component / requiredRemoved value: -[ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" -] - removed
Input schema / properties / body / properties / seededGraphics / items / properties / effects / items / properties / component / typeRemoved value: -"object" - added
Input schema / properties / body / properties / seededGraphics / items / properties / legacyKeyframesAdded value: +{ + "additionalProperties": false, + "properties": { + "channels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "needsUpgrade": { + "const": true, + "type": "boolean" + }, + "record": {} + }, + "required": [ + "needsUpgrade", + "channels", + "record" + ], + "type": "object" +} - changed
Input schema / properties / body / properties / seededGraphics / items / properties / source / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "properties": { - "clipId": { - "minLength": 1, - "type": "string" - }, - "offsetMs": { - "type": "number" - } - }, - "required": [ - "clipId", - "offsetMs" - ], - "type": "object" - }, - "audioRole": { - "enum": [ - "sfx", - "music", - "vo", - "ambience" - ], - "type": "string" - }, - "duck": { - "additionalProperties": false, - "properties": { - "attackMs": { - "minimum": 0, - "type": "number" - }, - "duckDb": { - "maximum": 0, - "type": "number" - }, - "releaseMs": { - "minimum": 0, - "type": "number" - }, - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "endMs": { - "type": "number" - }, - "startMs": { - "type": "number" - } - }, - "required": [ - "startMs", - "endMs" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "duckDb", - "attackMs", - "releaseMs" - ], - "type": "object" - }, - "excludedRanges": { - "items": { - "additionalProperties": false, - "properties": { - "end": { - "minimum": 0, - "type": "number" - }, - "reason": { - "type": "string" - }, - "start": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "start", - "end" - ], - "type": "object" - }, - "type": "array" - }, - "fadeInMs": { - "minimum": 0, - "type": "number" - }, - "fadeOutMs": { - "minimum": 0, - "type": "number" - }, - "kenBurns": { - "enum": [ - "in", - "out", - "pan-l", - "pan-r", - "none" - ], - "type": "string" - }, - "kind": { - "const": "media", - "type": "string" - }, - "loop": { - "type": "boolean" - }, - "mediaId": { - "minLength": 1, - "type": "string" - }, - "muted": { - "type": "boolean" - }, - "playbackRate": { - "exclusiveMinimum": 0, - "type": "number" - }, - "reframe": { - "additionalProperties": false, - "properties": { - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "bias": { - "additionalProperties": false, - "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", - "properties": { - "x": { - "description": "Horizontal nudge, source-normalized (+ = right).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "y": { - "description": "Vertical nudge, source-normalized (+ = down).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "ease": { - "additionalProperties": false, - "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", - "properties": { - "in": { - "description": "Ease-IN ramp DURATION in seconds at the segment START.", - "minimum": 0, - "type": "number" - }, - "out": { - "description": "Ease-OUT ramp DURATION in seconds at the segment END.", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "in", - "out" - ], - "type": "object" - }, - "endSec": { - "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", - "exclusiveMinimum": 0, - "type": "number" - }, - "focus": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "frame-center", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "point", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "mode", - "x", - "y" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "faceId": { - "minLength": 1, - "type": "string" - }, - "mode": { - "const": "face", - "type": "string" - }, - "shotScale": { - "enum": [ - "close", - "standard", - "wide" - ], - "type": "string" - } - }, - "required": [ - "mode", - "faceId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "all-faces", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "active-speaker", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - } - ], - "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight." - }, - "intent": { - "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", - "type": "string" - }, - "startSec": { - "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", - "minimum": 0, - "type": "number" - }, - "zoom": { - "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale` — a face-tracked shot is sized EITHER by the editorial scale (shotScale, which the bake calibrates to the detected face) OR by an explicit zoom, never both. A segment carrying both is REJECTED: shotScale wins at bake time and the zoom would be silently discarded.", - "maximum": 1, - "minimum": 0.1, - "type": "number" - } - }, - "required": [ - "startSec", - "endSec", - "focus" - ], - "type": "object" - }, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "segments" - ], - "type": "object" - }, - "sync": { - "enum": [ - "video", - "independent" - ], - "type": "string" - }, - "trim": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Source trim end (seconds).", - "minimum": 0, - "type": "number" - }, - "start": { - "description": "Source trim start (seconds).", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "start", - "end" - ], - "type": "object" - }, - "volume": { - "maximum": 4, - "minimum": 0, - "type": "number" - }, - "volumeDb": { - "type": "number" - } - }, - "required": [ - "kind", - "mediaId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "componentId": { - "minLength": 1, - "type": "string" - }, - "execution": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "kind": { - "const": "component", - "type": "string" - }, - "placement": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "clip", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "content-slots", - "type": "string" - }, - "slots": { - "additionalProperties": { - "additionalProperties": false, - "properties": { - "ownership": { - "enum": [ - "reference", - "exclusive" - ], - "type": "string" - }, - "targetClipIds": { - "items": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "targetClipIds", - "ownership" - ], - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "kind", - "slots" - ], - "type": "object" - } - ] - }, - "props": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "kind", - "componentId", - "props", - "execution", - "placement" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "properties": { - "space": { - "const": "scene", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "space", - "x", - "y" - ], - "type": "object" - }, - "kind": { - "const": "overlay", - "type": "string" - }, - "parallax": { - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "pattern": "^(?!custom$)", - "type": "string" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "kind", - "primitiveId", - "params" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "kind": { - "const": "effect", - "type": "string" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "type": "string" - }, - "targetTrackIds": { - "items": { - "minLength": 1, - "type": "string" - }, - "minItems": 1, - "type": "array" - }, - "wrapperOrder": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "html": { - "description": "Your card's HTML — rendered VERBATIM as the graphic (shell motion via applyMotionPreset in a FOLLOWING call). CANVAS CONTRACT: the card renders in a viewport equal to the composition format's pixel frame (1080×1920 at 9:16 fhd); the root is NOT auto-pinned — declare explicit width/height matching the frame (box-sizing:border-box) and anchor content with flex/grid; position:absolute;inset:0 on the root does NOT fill the frame; for edge-to-edge backgrounds add an inner absolutely-positioned layer with generous negative inset. Overlay compositing applies a ~92% safe-area inset — keep critical copy away from the extreme edges. FONTS: name a family from GET /v1/fonts (list_render_fonts) — the renderer loads those faces for the card and waits for them, so `font-family: Inter` draws Inter. `@import` and remote font files are REFUSED: the card renders with no network. A family that is not on that list has no bytes behind it and the browser falls back, so end any stack with a generic (`Inter, sans-serif`) rather than relying on a system face being present.", - "minLength": 1, - "type": "string" - }, - "kind": { - "const": "card", - "type": "string" - }, - "tokens": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "zPlane": { - "const": "front", - "type": "string" - } - }, - "required": [ - "kind", - "html" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "anchor": { + "additionalProperties": false, + "properties": { + "clipId": { + "minLength": 1, + "type": "string" + }, + "offsetMs": { + "type": "number" + } + }, + "required": [ + "clipId", + "offsetMs" + ], + "type": "object" + }, + "audioRole": { + "enum": [ + "sfx", + "music", + "vo", + "ambience" + ], + "type": "string" + }, + "duck": { + "additionalProperties": false, + "properties": { + "attackMs": { + "minimum": 0, + "type": "number" + }, + "duckDb": { + "maximum": 0, + "type": "number" + }, + "releaseMs": { + "minimum": 0, + "type": "number" + }, + "windows": { + "items": { + "additionalProperties": false, + "properties": { + "endMs": { + "type": "number" + }, + "startMs": { + "type": "number" + } + }, + "required": [ + "startMs", + "endMs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "duckDb", + "attackMs", + "releaseMs" + ], + "type": "object" + }, + "excludedRanges": { + "items": { + "additionalProperties": false, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "reason": { + "type": "string" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, + "type": "array" + }, + "fadeInMs": { + "minimum": 0, + "type": "number" + }, + "fadeOutMs": { + "minimum": 0, + "type": "number" + }, + "kenBurns": { + "enum": [ + "in", + "out", + "pan-l", + "pan-r", + "none" + ], + "type": "string" + }, + "kind": { + "const": "media", + "type": "string" + }, + "loop": { + "type": "boolean" + }, + "mediaId": { + "type": "string" + }, + "muted": { + "type": "boolean" + }, + "playbackRate": { + "exclusiveMinimum": 0, + "type": "number" + }, + "reframe": { + "additionalProperties": false, + "properties": { + "segments": { + "items": { + "additionalProperties": false, + "properties": { + "bias": { + "additionalProperties": false, + "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", + "properties": { + "x": { + "description": "Horizontal nudge, source-normalized (+ = right).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "y": { + "description": "Vertical nudge, source-normalized (+ = down).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "ease": { + "additionalProperties": false, + "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", + "properties": { + "in": { + "description": "Ease-IN ramp DURATION in seconds at the segment START.", + "minimum": 0, + "type": "number" + }, + "out": { + "description": "Ease-OUT ramp DURATION in seconds at the segment END.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "in", + "out" + ], + "type": "object" + }, + "endSec": { + "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", + "exclusiveMinimum": 0, + "type": "number" + }, + "focus": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "frame-center", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "point", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "mode", + "x", + "y" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "faceId": { + "minLength": 1, + "type": "string" + }, + "mode": { + "const": "face", + "type": "string" + }, + "shotScale": { + "enum": [ + "close", + "standard", + "wide" + ], + "type": "string" + } + }, + "required": [ + "mode", + "faceId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "all-faces", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "mode": { + "const": "active-speaker", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + } + ], + "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight." + }, + "intent": { + "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", + "type": "string" + }, + "startSec": { + "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", + "minimum": 0, + "type": "number" + }, + "zoom": { + "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale`: a face-tracked shot is sized EITHER by the editorial scale (shotScale, calibrated to the detected face) OR by an explicit zoom — never both.", + "maximum": 1, + "minimum": 0.1, + "type": "number" + } + }, + "required": [ + "startSec", + "endSec", + "focus" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "segments" + ], + "type": "object" + }, + "sync": { + "enum": [ + "video", + "independent" + ], + "type": "string" + }, + "trim": { + "additionalProperties": false, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, + "volume": { + "maximum": 4, + "minimum": 0, + "type": "number" + }, + "volumeDb": { + "type": "number" + } + }, + "required": [ + "kind", + "mediaId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "componentId": { + "minLength": 1, + "type": "string" + }, + "execution": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "kind": { + "const": "component", + "type": "string" + }, + "placement": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "clip", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "content-slots", + "type": "string" + }, + "slots": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "ownership": { + "enum": [ + "reference", + "exclusive" + ], + "type": "string" + }, + "targetClipIds": { + "items": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targetClipIds", + "ownership" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "kind", + "slots" + ], + "type": "object" + } + ] + }, + "props": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "retired": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "kind", + "componentId", + "props" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "anchor": { + "additionalProperties": false, + "properties": { + "space": { + "const": "scene", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "space", + "x", + "y" + ], + "type": "object" + }, + "kind": { + "const": "overlay", + "type": "string" + }, + "parallax": { + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "params": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "pattern": "^(?!custom$)", + "type": "string" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "kind", + "primitiveId", + "params" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "component": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "kind": { + "const": "effect", + "type": "string" + }, + "params": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "type": "string" + }, + "targetTrackIds": { + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "wrapperOrder": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "html": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "card", + "type": "string" + }, + "tokens": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "zPlane": { + "const": "front", + "type": "string" + } + }, + "required": [ + "kind", + "html" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "compositionId": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "composition", + "type": "string" + }, + "trim": { + "additionalProperties": false, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + } + }, + "required": [ + "kind", + "compositionId" + ], + "type": "object" + } +] - removed
Input schema / properties / body / properties / seededGraphics / items / properties / startTime / descriptionRemoved value: -"Timeline start (seconds)." - removed
Input schema / properties / body / properties / seededGraphics / items / properties / transitionIn / properties / component / additionalPropertiesRemoved value: -false - added
Input schema / properties / body / properties / seededGraphics / items / properties / transitionIn / properties / component / anyOfAdded value: +[ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } +] - removed
Input schema / properties / body / properties / seededGraphics / items / properties / transitionIn / properties / component / propertiesRemoved value: -{ - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } -} - removed
Input schema / properties / body / properties / seededGraphics / items / properties / transitionIn / properties / component / requiredRemoved value: -[ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" -] - removed
Input schema / properties / body / properties / seededGraphics / items / properties / transitionIn / properties / component / typeRemoved value: -"object" - added
Input schema / properties / body / properties / seededGraphics / items / properties / tweensAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "keyframes": { + "additionalProperties": false, + "properties": { + "easeEach": { + "const": "none", + "type": "string" + }, + "format": { + "const": "percentage", + "type": "string" + }, + "keyframes": { + "items": { + "additionalProperties": false, + "properties": { + "ease": { + "type": "string" + }, + "percentage": { + "type": "number" + }, + "properties": { + "additionalProperties": { + "type": "number" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "percentage", + "properties" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "format", + "easeEach", + "keyframes" + ], + "type": "object" + }, + "position": { + "type": "number" + }, + "propertyGroup": { + "enum": [ + "visual", + "scale", + "rotation", + "position" + ], + "type": "string" + } + }, + "required": [ + "id", + "propertyGroup", + "position", + "duration", + "keyframes" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / properties / format / descriptionRemoved value: -"Output-format spec per §Format."
- Changed
update_component14 fields changed- added
Input schema / properties / body / properties / source / properties / manifest / properties / hfContractAdded value: +{ + "const": 1, + "type": "number" +} - added
Input schema / properties / body / properties / source / properties / manifest / properties / kindAdded value: +{ + "const": "scene", + "type": "string" +} - added
Input schema / properties / body / properties / source / properties / manifest / properties / runtimeAdded value: +{ + "const": "hyperframes", + "type": "string" +} - changed
Input schema / properties / body / properties / source / properties / manifest / properties / version / constPrevious value: -2New value: +4 - removed
Input schema / properties / body / properties / source / properties / manifest / properties / visualMediaRemoved value: -{ - "additionalProperties": false, - "properties": { - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version" - ], - "type": "object" -} - changed
Input schema / properties / body / properties / source / properties / manifest / requiredPrevious value: -[ - "version", - "assets", - "graphics", - "alphaPolicy" -]New value: +[ + "version", + "runtime", + "hfContract", + "kind", + "assets", + "graphics", + "alphaPolicy" +] - added
Input schema / properties / body / properties / source / properties / templateAdded value: +{ + "maxLength": 2000000, + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / body / properties / source / properties / tsxSourceRemoved value: -{ - "maxLength": 8000000, - "minLength": 1, - "type": "string" -} - changed
Input schema / properties / body / properties / source / properties / version / constPrevious value: -3New value: +4 - changed
Input schema / properties / body / properties / source / requiredPrevious value: -[ - "version", - "componentId", - "tsxSource", - "manifest", - "definition" -]New value: +[ + "version", + "componentId", + "template", + "manifest", + "definition" +] - removed
Output schema / properties / manifest / additionalPropertiesRemoved value: -{} - removed
Output schema / properties / manifest / propertiesRemoved value: -{} - removed
Output schema / properties / manifest / typeRemoved value: -"object" - changed
Output schema / properties / version / descriptionPrevious value: -"The ENTRY's version: a semver string ('0.0.0' until an authored component is versioned). Distinct from `manifest.version`, which is the runtime contract version and is always the literal 2."New value: +"The ENTRY's version: a semver string ('0.0.0' until an authored component is versioned). Distinct from `manifest.version`, which is the runtime contract version (4 native, 2 retired TSX)."
- Changed
update_project2 fields changed- removed
Input schema / properties / body / properties / format / descriptionRemoved value: -"Output-format spec per §Format." - added
Input schema / properties / body / properties / format / properties / platformAdded value: +{ + "type": "string" +}
- Changed
validate_composition13 fields changed- changed
Input schema / $defs / __schema0 / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - }, - { - "items": { - "$ref": "#/$defs/__schema0" - }, - "type": "array" - }, - { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + }, + { + "items": { + "$ref": "#/$defs/__schema0" + }, + "type": "array" + }, + { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } +] - removed
Input schema / properties / body / descriptionRemoved value: -"Canonical composition wire shape (multi-track; carries reframe, captions, markers)." - changed
Input schema / properties / body / properties / accessibility / additionalPropertiesPrevious value: -falseNew value: +{} - added
Input schema / properties / body / properties / aclAdded value: +{ + "additionalProperties": {}, + "properties": { + "public": { + "type": "boolean" + }, + "readerOrgIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "writerOrgIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "readOnly": true, + "type": "object" +} - removed
Input schema / properties / body / properties / captions / anyOfRemoved value: -[ - { - "additionalProperties": false, - "properties": { - "from": { - "additionalProperties": false, - "properties": { - "clipId": { - "type": "string" - } - }, - "required": [ - "clipId" - ], - "type": "object" - }, - "layouts": { - "items": { - "additionalProperties": false, - "properties": { - "holdThroughWordIndex": { - "description": "Inclusive saved-word index in this segment. The layout stays visible until that word ends.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "region": { - "additionalProperties": false, - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - "rotation": { - "maximum": 45, - "minimum": -45, - "type": "number" - }, - "scale": { - "maximum": 4, - "minimum": 0.25, - "type": "number" - }, - "segmentIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "style": { - "additionalProperties": false, - "properties": { - "annotationColor": { - "type": "string" - }, - "annotationStrokeWidth": { - "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", - "maximum": 12, - "minimum": 0.5, - "type": "number" - }, - "annotationTexture": { - "description": "Native annotation stroke finish; default clean.", - "enum": [ - "clean", - "pencil" - ], - "type": "string" - }, - "backgroundColor": { - "type": "string" - }, - "color": { - "minLength": 1, - "type": "string" - }, - "emphasisColor": { - "type": "string" - }, - "emphasisFontFamily": { - "type": "string" - }, - "emphasisFontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "emphasisFontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "emphasisLetterSpacing": { - "type": "number" - }, - "emphasisPlate": { - "type": "boolean" - }, - "emphasisPlateAltColor": { - "type": "string" - }, - "emphasisPlateAltTextColor": { - "type": "string" - }, - "emphasisPlateColor": { - "type": "string" - }, - "emphasisPlatePadX": { - "type": "number" - }, - "emphasisPlatePadY": { - "type": "number" - }, - "emphasisPlateRadius": { - "minimum": 0, - "type": "number" - }, - "emphasisPlateReveal": { - "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", - "type": "boolean" - }, - "emphasisPlateTextColor": { - "type": "string" - }, - "emphasisScale": { - "exclusiveMinimum": 0, - "type": "number" - }, - "emphasisTextTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "entrance": { - "enum": [ - "none", - "fade", - "word-pop", - "stagger-up" - ], - "type": "string" - }, - "entranceMs": { - "minimum": 0, - "type": "number" - }, - "entranceStaggerMs": { - "minimum": 0, - "type": "number" - }, - "exitMs": { - "minimum": 0, - "type": "number" - }, - "fontFamily": { - "minLength": 1, - "type": "string" - }, - "fontSize": { - "description": "Font size as % of composition height (1-15, default 5). NOT px.", - "maximum": 15, - "minimum": 1, - "type": "number" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "highlightColor": { - "minLength": 1, - "type": "string" - }, - "letterSpacing": { - "description": "Base caption glyph spacing in pixels.", - "maximum": 20, - "minimum": -5, - "type": "number" - }, - "lineGapEm": { - "description": "Gap between caption lines as a multiple of base font size; default 0.25.", - "maximum": 2, - "minimum": 0, - "type": "number" - }, - "plate": { - "enum": [ - "glass", - "solid", - "none" - ], - "type": "string" - }, - "textTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "wordGapEm": { - "description": "Gap between caption runs as a multiple of base font size; default 0.35.", - "maximum": 2, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "wordEndIndex": { - "description": "Exclusive word index in the saved caption segment.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "wordMarks": { - "items": { - "additionalProperties": false, - "properties": { - "annotate": { - "anyOf": [ - { - "enum": [ - "circle", - "underline" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "wordIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "wordIndex" - ], - "type": "object" - }, - "type": "array" - }, - "wordSignature": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "wordStartIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "segmentIndex", - "wordStartIndex", - "wordEndIndex", - "region", - "wordSignature" - ], - "type": "object" - }, - "type": "array" - }, - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "words": { - "items": { - "additionalProperties": false, - "properties": { - "annotate": { - "enum": [ - "circle", - "underline" - ], - "type": "string" - }, - "emphasis": { - "type": "boolean" - }, - "endMs": { - "description": "Word end on the composition timeline, in milliseconds.", - "minimum": 0, - "type": "number" - }, - "startMs": { - "description": "Word start on the composition timeline, in milliseconds.", - "minimum": 0, - "type": "number" - }, - "text": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "startMs", - "endMs" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "words" - ], - "type": "object" - }, - "type": "array" - }, - "source": { - "const": "derived", - "type": "string" - }, - "style": { - "additionalProperties": false, - "properties": { - "annotationColor": { - "type": "string" - }, - "annotationStrokeWidth": { - "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", - "maximum": 12, - "minimum": 0.5, - "type": "number" - }, - "annotationTexture": { - "description": "Native annotation stroke finish; default clean.", - "enum": [ - "clean", - "pencil" - ], - "type": "string" - }, - "backgroundColor": { - "type": "string" - }, - "color": { - "minLength": 1, - "type": "string" - }, - "emphasisColor": { - "type": "string" - }, - "emphasisFontFamily": { - "type": "string" - }, - "emphasisFontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "emphasisFontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "emphasisGradient": { - "type": "string" - }, - "emphasisLetterSpacing": { - "type": "number" - }, - "emphasisPlate": { - "type": "boolean" - }, - "emphasisPlateAltColor": { - "type": "string" - }, - "emphasisPlateAltTextColor": { - "type": "string" - }, - "emphasisPlateColor": { - "type": "string" - }, - "emphasisPlatePadX": { - "type": "number" - }, - "emphasisPlatePadY": { - "type": "number" - }, - "emphasisPlateRadius": { - "minimum": 0, - "type": "number" - }, - "emphasisPlateReveal": { - "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", - "type": "boolean" - }, - "emphasisPlateTextColor": { - "type": "string" - }, - "emphasisScale": { - "exclusiveMinimum": 0, - "type": "number" - }, - "emphasisTextTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "entrance": { - "enum": [ - "none", - "fade", - "word-pop", - "stagger-up" - ], - "type": "string" - }, - "entranceMs": { - "minimum": 0, - "type": "number" - }, - "entranceStaggerMs": { - "minimum": 0, - "type": "number" - }, - "exitMs": { - "minimum": 0, - "type": "number" - }, - "fontFamily": { - "minLength": 1, - "type": "string" - }, - "fontSize": { - "description": "Font size as % of composition height (1-15, default 5). NOT px.", - "maximum": 15, - "minimum": 1, - "type": "number" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "highlightColor": { - "minLength": 1, - "type": "string" - }, - "letterSpacing": { - "description": "Base caption glyph spacing in pixels.", - "maximum": 20, - "minimum": -5, - "type": "number" - }, - "lineGapEm": { - "description": "Gap between caption lines as a multiple of base font size; default 0.25.", - "maximum": 2, - "minimum": 0, - "type": "number" - }, - "maxWidthPercent": { - "exclusiveMinimum": 0, - "maximum": 100, - "type": "number" - }, - "plate": { - "enum": [ - "glass", - "solid", - "none" - ], - "type": "string" - }, - "position": { - "enum": [ - "top", - "center", - "bottom" - ], - "type": "string" - }, - "region": { - "additionalProperties": false, - "description": "Optional caption layout box {x,y,w,h} in normalized output-frame coordinates. Overrides position; text starts at its top edge and wraps/pages within its width and height.", - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - "textTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "wordGapEm": { - "description": "Gap between caption runs as a multiple of base font size; default 0.35.", - "maximum": 2, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "source", - "from", - "segments" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "layouts": { - "items": { - "additionalProperties": false, - "properties": { - "holdThroughWordIndex": { - "description": "Inclusive saved-word index in this segment. The layout stays visible until that word ends.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "region": { - "additionalProperties": false, - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - "rotation": { - "maximum": 45, - "minimum": -45, - "type": "number" - }, - "scale": { - "maximum": 4, - "minimum": 0.25, - "type": "number" - }, - "segmentIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "style": { - "additionalProperties": false, - "properties": { - "annotationColor": { - "type": "string" - }, - "annotationStrokeWidth": { - "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", - "maximum": 12, - "minimum": 0.5, - "type": "number" - }, - "annotationTexture": { - "description": "Native annotation stroke finish; default clean.", - "enum": [ - "clean", - "pencil" - ], - "type": "string" - }, - "backgroundColor": { - "type": "string" - }, - "color": { - "minLength": 1, - "type": "string" - }, - "emphasisColor": { - "type": "string" - }, - "emphasisFontFamily": { - "type": "string" - }, - "emphasisFontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "emphasisFontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "emphasisLetterSpacing": { - "type": "number" - }, - "emphasisPlate": { - "type": "boolean" - }, - "emphasisPlateAltColor": { - "type": "string" - }, - "emphasisPlateAltTextColor": { - "type": "string" - }, - "emphasisPlateColor": { - "type": "string" - }, - "emphasisPlatePadX": { - "type": "number" - }, - "emphasisPlatePadY": { - "type": "number" - }, - "emphasisPlateRadius": { - "minimum": 0, - "type": "number" - }, - "emphasisPlateReveal": { - "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", - "type": "boolean" - }, - "emphasisPlateTextColor": { - "type": "string" - }, - "emphasisScale": { - "exclusiveMinimum": 0, - "type": "number" - }, - "emphasisTextTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "entrance": { - "enum": [ - "none", - "fade", - "word-pop", - "stagger-up" - ], - "type": "string" - }, - "entranceMs": { - "minimum": 0, - "type": "number" - }, - "entranceStaggerMs": { - "minimum": 0, - "type": "number" - }, - "exitMs": { - "minimum": 0, - "type": "number" - }, - "fontFamily": { - "minLength": 1, - "type": "string" - }, - "fontSize": { - "description": "Font size as % of composition height (1-15, default 5). NOT px.", - "maximum": 15, - "minimum": 1, - "type": "number" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "highlightColor": { - "minLength": 1, - "type": "string" - }, - "letterSpacing": { - "description": "Base caption glyph spacing in pixels.", - "maximum": 20, - "minimum": -5, - "type": "number" - }, - "lineGapEm": { - "description": "Gap between caption lines as a multiple of base font size; default 0.25.", - "maximum": 2, - "minimum": 0, - "type": "number" - }, - "plate": { - "enum": [ - "glass", - "solid", - "none" - ], - "type": "string" - }, - "textTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "wordGapEm": { - "description": "Gap between caption runs as a multiple of base font size; default 0.35.", - "maximum": 2, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "wordEndIndex": { - "description": "Exclusive word index in the saved caption segment.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "wordMarks": { - "items": { - "additionalProperties": false, - "properties": { - "annotate": { - "anyOf": [ - { - "enum": [ - "circle", - "underline" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "emphasis": { - "type": "boolean" - }, - "wordIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "wordIndex" - ], - "type": "object" - }, - "type": "array" - }, - "wordSignature": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "wordStartIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "segmentIndex", - "wordStartIndex", - "wordEndIndex", - "region", - "wordSignature" - ], - "type": "object" - }, - "type": "array" - }, - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "words": { - "items": { - "additionalProperties": false, - "properties": { - "annotate": { - "enum": [ - "circle", - "underline" - ], - "type": "string" - }, - "emphasis": { - "type": "boolean" - }, - "endMs": { - "description": "Word end on the composition timeline, in milliseconds.", - "minimum": 0, - "type": "number" - }, - "startMs": { - "description": "Word start on the composition timeline, in milliseconds.", - "minimum": 0, - "type": "number" - }, - "text": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text", - "startMs", - "endMs" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "words" - ], - "type": "object" - }, - "type": "array" - }, - "source": { - "const": "authored", - "type": "string" - }, - "style": { - "additionalProperties": false, - "properties": { - "annotationColor": { - "type": "string" - }, - "annotationStrokeWidth": { - "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", - "maximum": 12, - "minimum": 0.5, - "type": "number" - }, - "annotationTexture": { - "description": "Native annotation stroke finish; default clean.", - "enum": [ - "clean", - "pencil" - ], - "type": "string" - }, - "backgroundColor": { - "type": "string" - }, - "color": { - "minLength": 1, - "type": "string" - }, - "emphasisColor": { - "type": "string" - }, - "emphasisFontFamily": { - "type": "string" - }, - "emphasisFontStyle": { - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "emphasisFontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "emphasisGradient": { - "type": "string" - }, - "emphasisLetterSpacing": { - "type": "number" - }, - "emphasisPlate": { - "type": "boolean" - }, - "emphasisPlateAltColor": { - "type": "string" - }, - "emphasisPlateAltTextColor": { - "type": "string" - }, - "emphasisPlateColor": { - "type": "string" - }, - "emphasisPlatePadX": { - "type": "number" - }, - "emphasisPlatePadY": { - "type": "number" - }, - "emphasisPlateRadius": { - "minimum": 0, - "type": "number" - }, - "emphasisPlateReveal": { - "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", - "type": "boolean" - }, - "emphasisPlateTextColor": { - "type": "string" - }, - "emphasisScale": { - "exclusiveMinimum": 0, - "type": "number" - }, - "emphasisTextTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "entrance": { - "enum": [ - "none", - "fade", - "word-pop", - "stagger-up" - ], - "type": "string" - }, - "entranceMs": { - "minimum": 0, - "type": "number" - }, - "entranceStaggerMs": { - "minimum": 0, - "type": "number" - }, - "exitMs": { - "minimum": 0, - "type": "number" - }, - "fontFamily": { - "minLength": 1, - "type": "string" - }, - "fontSize": { - "description": "Font size as % of composition height (1-15, default 5). NOT px.", - "maximum": 15, - "minimum": 1, - "type": "number" - }, - "fontWeight": { - "maximum": 900, - "minimum": 100, - "type": "integer" - }, - "highlightColor": { - "minLength": 1, - "type": "string" - }, - "letterSpacing": { - "description": "Base caption glyph spacing in pixels.", - "maximum": 20, - "minimum": -5, - "type": "number" - }, - "lineGapEm": { - "description": "Gap between caption lines as a multiple of base font size; default 0.25.", - "maximum": 2, - "minimum": 0, - "type": "number" - }, - "maxWidthPercent": { - "exclusiveMinimum": 0, - "maximum": 100, - "type": "number" - }, - "plate": { - "enum": [ - "glass", - "solid", - "none" - ], - "type": "string" - }, - "position": { - "enum": [ - "top", - "center", - "bottom" - ], - "type": "string" - }, - "region": { - "additionalProperties": false, - "description": "Optional caption layout box {x,y,w,h} in normalized output-frame coordinates. Overrides position; text starts at its top edge and wraps/pages within its width and height.", - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - "textTransform": { - "enum": [ - "none", - "uppercase", - "capitalize" - ], - "type": "string" - }, - "wordGapEm": { - "description": "Gap between caption runs as a multiple of base font size; default 0.35.", - "maximum": 2, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "source", - "segments" - ], - "type": "object" - } -] - added
Input schema / properties / body / properties / captions / oneOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "from": { + "additionalProperties": {}, + "properties": { + "clipId": { + "type": "string" + } + }, + "required": [ + "clipId" + ], + "type": "object" + }, + "layouts": { + "items": { + "additionalProperties": false, + "properties": { + "holdThroughWordIndex": { + "description": "Inclusive saved-word index in this segment. The layout stays visible until that word ends.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "region": { + "additionalProperties": {}, + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + "rotation": { + "maximum": 45, + "minimum": -45, + "type": "number" + }, + "scale": { + "maximum": 4, + "minimum": 0.25, + "type": "number" + }, + "segmentIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "style": { + "additionalProperties": false, + "properties": { + "annotationColor": { + "type": "string" + }, + "annotationStrokeWidth": { + "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", + "maximum": 12, + "minimum": 0.5, + "type": "number" + }, + "annotationTexture": { + "description": "Native annotation stroke finish; default clean.", + "enum": [ + "clean", + "pencil" + ], + "type": "string" + }, + "backgroundColor": { + "type": "string" + }, + "color": { + "minLength": 1, + "type": "string" + }, + "emphasisColor": { + "type": "string" + }, + "emphasisFontFamily": { + "type": "string" + }, + "emphasisFontStyle": { + "enum": [ + "normal", + "italic" + ], + "type": "string" + }, + "emphasisFontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "emphasisLetterSpacing": { + "type": "number" + }, + "emphasisPlate": { + "type": "boolean" + }, + "emphasisPlateAltColor": { + "type": "string" + }, + "emphasisPlateAltTextColor": { + "type": "string" + }, + "emphasisPlateColor": { + "type": "string" + }, + "emphasisPlatePadX": { + "type": "number" + }, + "emphasisPlatePadY": { + "type": "number" + }, + "emphasisPlateRadius": { + "minimum": 0, + "type": "number" + }, + "emphasisPlateReveal": { + "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", + "type": "boolean" + }, + "emphasisPlateTextColor": { + "type": "string" + }, + "emphasisScale": { + "exclusiveMinimum": 0, + "type": "number" + }, + "emphasisTextTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "entrance": { + "enum": [ + "none", + "fade", + "word-pop", + "stagger-up" + ], + "type": "string" + }, + "entranceMs": { + "minimum": 0, + "type": "number" + }, + "entranceStaggerMs": { + "minimum": 0, + "type": "number" + }, + "exitMs": { + "minimum": 0, + "type": "number" + }, + "fontFamily": { + "minLength": 1, + "type": "string" + }, + "fontSize": { + "description": "Font size as % of composition height (1-15, default 5). NOT px.", + "maximum": 15, + "minimum": 1, + "type": "number" + }, + "fontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "highlightColor": { + "minLength": 1, + "type": "string" + }, + "letterSpacing": { + "description": "Base caption glyph spacing in pixels.", + "maximum": 20, + "minimum": -5, + "type": "number" + }, + "lineGapEm": { + "description": "Gap between caption lines as a multiple of base font size; default 0.25.", + "maximum": 2, + "minimum": 0, + "type": "number" + }, + "plate": { + "enum": [ + "glass", + "solid", + "none" + ], + "type": "string" + }, + "textTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "wordGapEm": { + "description": "Gap between caption runs as a multiple of base font size; default 0.35.", + "maximum": 2, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "wordEndIndex": { + "description": "Exclusive word index in the saved caption segment.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "wordMarks": { + "items": { + "additionalProperties": false, + "properties": { + "annotate": { + "anyOf": [ + { + "enum": [ + "circle", + "underline" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "emphasis": { + "type": "boolean" + }, + "wordIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "wordIndex" + ], + "type": "object" + }, + "type": "array" + }, + "wordSignature": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "wordStartIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "segmentIndex", + "wordStartIndex", + "wordEndIndex", + "region", + "wordSignature" + ], + "type": "object" + }, + "type": "array" + }, + "segments": { + "items": { + "additionalProperties": {}, + "properties": { + "words": { + "items": { + "additionalProperties": {}, + "properties": { + "annotate": { + "enum": [ + "circle", + "underline" + ], + "type": "string" + }, + "emphasis": { + "type": "boolean" + }, + "endMs": { + "description": "Word end on the composition timeline, in milliseconds.", + "minimum": 0, + "type": "number" + }, + "startMs": { + "description": "Word start on the composition timeline, in milliseconds.", + "minimum": 0, + "type": "number" + }, + "text": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "startMs", + "endMs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "words" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "const": "derived", + "type": "string" + }, + "style": { + "additionalProperties": {}, + "properties": { + "annotationColor": { + "type": "string" + }, + "annotationStrokeWidth": { + "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", + "maximum": 12, + "minimum": 0.5, + "type": "number" + }, + "annotationTexture": { + "description": "Native annotation stroke finish; default clean.", + "enum": [ + "clean", + "pencil" + ], + "type": "string" + }, + "backgroundColor": { + "type": "string" + }, + "color": { + "minLength": 1, + "type": "string" + }, + "emphasisColor": { + "type": "string" + }, + "emphasisFontFamily": { + "type": "string" + }, + "emphasisFontStyle": { + "enum": [ + "normal", + "italic" + ], + "type": "string" + }, + "emphasisFontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "emphasisGradient": { + "type": "string" + }, + "emphasisLetterSpacing": { + "type": "number" + }, + "emphasisPlate": { + "type": "boolean" + }, + "emphasisPlateAltColor": { + "type": "string" + }, + "emphasisPlateAltTextColor": { + "type": "string" + }, + "emphasisPlateColor": { + "type": "string" + }, + "emphasisPlatePadX": { + "type": "number" + }, + "emphasisPlatePadY": { + "type": "number" + }, + "emphasisPlateRadius": { + "minimum": 0, + "type": "number" + }, + "emphasisPlateReveal": { + "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", + "type": "boolean" + }, + "emphasisPlateTextColor": { + "type": "string" + }, + "emphasisScale": { + "exclusiveMinimum": 0, + "type": "number" + }, + "emphasisTextTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "entrance": { + "enum": [ + "none", + "fade", + "word-pop", + "stagger-up" + ], + "type": "string" + }, + "entranceMs": { + "minimum": 0, + "type": "number" + }, + "entranceStaggerMs": { + "minimum": 0, + "type": "number" + }, + "exitMs": { + "minimum": 0, + "type": "number" + }, + "fontFamily": { + "minLength": 1, + "type": "string" + }, + "fontSize": { + "description": "Font size as % of composition height (1-15, default 5). NOT px.", + "maximum": 15, + "minimum": 1, + "type": "number" + }, + "fontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "highlightColor": { + "minLength": 1, + "type": "string" + }, + "letterSpacing": { + "description": "Base caption glyph spacing in pixels.", + "maximum": 20, + "minimum": -5, + "type": "number" + }, + "lineGapEm": { + "description": "Gap between caption lines as a multiple of base font size; default 0.25.", + "maximum": 2, + "minimum": 0, + "type": "number" + }, + "maxWidthPercent": { + "exclusiveMinimum": 0, + "maximum": 100, + "type": "number" + }, + "plate": { + "enum": [ + "glass", + "solid", + "none" + ], + "type": "string" + }, + "position": { + "enum": [ + "top", + "center", + "bottom" + ], + "type": "string" + }, + "region": { + "additionalProperties": {}, + "description": "Optional caption layout box {x,y,w,h} in normalized output-frame coordinates. Overrides position; text starts at its top edge and wraps/pages within its width and height.", + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + "textTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "wordGapEm": { + "description": "Gap between caption runs as a multiple of base font size; default 0.35.", + "maximum": 2, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "source", + "from", + "segments" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "layouts": { + "items": { + "additionalProperties": false, + "properties": { + "holdThroughWordIndex": { + "description": "Inclusive saved-word index in this segment. The layout stays visible until that word ends.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "region": { + "additionalProperties": {}, + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + "rotation": { + "maximum": 45, + "minimum": -45, + "type": "number" + }, + "scale": { + "maximum": 4, + "minimum": 0.25, + "type": "number" + }, + "segmentIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "style": { + "additionalProperties": false, + "properties": { + "annotationColor": { + "type": "string" + }, + "annotationStrokeWidth": { + "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", + "maximum": 12, + "minimum": 0.5, + "type": "number" + }, + "annotationTexture": { + "description": "Native annotation stroke finish; default clean.", + "enum": [ + "clean", + "pencil" + ], + "type": "string" + }, + "backgroundColor": { + "type": "string" + }, + "color": { + "minLength": 1, + "type": "string" + }, + "emphasisColor": { + "type": "string" + }, + "emphasisFontFamily": { + "type": "string" + }, + "emphasisFontStyle": { + "enum": [ + "normal", + "italic" + ], + "type": "string" + }, + "emphasisFontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "emphasisLetterSpacing": { + "type": "number" + }, + "emphasisPlate": { + "type": "boolean" + }, + "emphasisPlateAltColor": { + "type": "string" + }, + "emphasisPlateAltTextColor": { + "type": "string" + }, + "emphasisPlateColor": { + "type": "string" + }, + "emphasisPlatePadX": { + "type": "number" + }, + "emphasisPlatePadY": { + "type": "number" + }, + "emphasisPlateRadius": { + "minimum": 0, + "type": "number" + }, + "emphasisPlateReveal": { + "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", + "type": "boolean" + }, + "emphasisPlateTextColor": { + "type": "string" + }, + "emphasisScale": { + "exclusiveMinimum": 0, + "type": "number" + }, + "emphasisTextTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "entrance": { + "enum": [ + "none", + "fade", + "word-pop", + "stagger-up" + ], + "type": "string" + }, + "entranceMs": { + "minimum": 0, + "type": "number" + }, + "entranceStaggerMs": { + "minimum": 0, + "type": "number" + }, + "exitMs": { + "minimum": 0, + "type": "number" + }, + "fontFamily": { + "minLength": 1, + "type": "string" + }, + "fontSize": { + "description": "Font size as % of composition height (1-15, default 5). NOT px.", + "maximum": 15, + "minimum": 1, + "type": "number" + }, + "fontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "highlightColor": { + "minLength": 1, + "type": "string" + }, + "letterSpacing": { + "description": "Base caption glyph spacing in pixels.", + "maximum": 20, + "minimum": -5, + "type": "number" + }, + "lineGapEm": { + "description": "Gap between caption lines as a multiple of base font size; default 0.25.", + "maximum": 2, + "minimum": 0, + "type": "number" + }, + "plate": { + "enum": [ + "glass", + "solid", + "none" + ], + "type": "string" + }, + "textTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "wordGapEm": { + "description": "Gap between caption runs as a multiple of base font size; default 0.35.", + "maximum": 2, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "wordEndIndex": { + "description": "Exclusive word index in the saved caption segment.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "wordMarks": { + "items": { + "additionalProperties": false, + "properties": { + "annotate": { + "anyOf": [ + { + "enum": [ + "circle", + "underline" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "emphasis": { + "type": "boolean" + }, + "wordIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "wordIndex" + ], + "type": "object" + }, + "type": "array" + }, + "wordSignature": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "wordStartIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "segmentIndex", + "wordStartIndex", + "wordEndIndex", + "region", + "wordSignature" + ], + "type": "object" + }, + "type": "array" + }, + "segments": { + "items": { + "additionalProperties": {}, + "properties": { + "words": { + "items": { + "additionalProperties": {}, + "properties": { + "annotate": { + "enum": [ + "circle", + "underline" + ], + "type": "string" + }, + "emphasis": { + "type": "boolean" + }, + "endMs": { + "description": "Word end on the composition timeline, in milliseconds.", + "minimum": 0, + "type": "number" + }, + "startMs": { + "description": "Word start on the composition timeline, in milliseconds.", + "minimum": 0, + "type": "number" + }, + "text": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "startMs", + "endMs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "words" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "const": "authored", + "type": "string" + }, + "style": { + "additionalProperties": {}, + "properties": { + "annotationColor": { + "type": "string" + }, + "annotationStrokeWidth": { + "description": "Annotation stroke width in its 100×100 SVG coordinate system; default 4.", + "maximum": 12, + "minimum": 0.5, + "type": "number" + }, + "annotationTexture": { + "description": "Native annotation stroke finish; default clean.", + "enum": [ + "clean", + "pencil" + ], + "type": "string" + }, + "backgroundColor": { + "type": "string" + }, + "color": { + "minLength": 1, + "type": "string" + }, + "emphasisColor": { + "type": "string" + }, + "emphasisFontFamily": { + "type": "string" + }, + "emphasisFontStyle": { + "enum": [ + "normal", + "italic" + ], + "type": "string" + }, + "emphasisFontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "emphasisGradient": { + "type": "string" + }, + "emphasisLetterSpacing": { + "type": "number" + }, + "emphasisPlate": { + "type": "boolean" + }, + "emphasisPlateAltColor": { + "type": "string" + }, + "emphasisPlateAltTextColor": { + "type": "string" + }, + "emphasisPlateColor": { + "type": "string" + }, + "emphasisPlatePadX": { + "type": "number" + }, + "emphasisPlatePadY": { + "type": "number" + }, + "emphasisPlateRadius": { + "minimum": 0, + "type": "number" + }, + "emphasisPlateReveal": { + "description": "Grow a shared emphasis plate as saved words appear while reserving its final layout width.", + "type": "boolean" + }, + "emphasisPlateTextColor": { + "type": "string" + }, + "emphasisScale": { + "exclusiveMinimum": 0, + "type": "number" + }, + "emphasisTextTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "entrance": { + "enum": [ + "none", + "fade", + "word-pop", + "stagger-up" + ], + "type": "string" + }, + "entranceMs": { + "minimum": 0, + "type": "number" + }, + "entranceStaggerMs": { + "minimum": 0, + "type": "number" + }, + "exitMs": { + "minimum": 0, + "type": "number" + }, + "fontFamily": { + "minLength": 1, + "type": "string" + }, + "fontSize": { + "description": "Font size as % of composition height (1-15, default 5). NOT px.", + "maximum": 15, + "minimum": 1, + "type": "number" + }, + "fontWeight": { + "maximum": 900, + "minimum": 100, + "type": "integer" + }, + "highlightColor": { + "minLength": 1, + "type": "string" + }, + "letterSpacing": { + "description": "Base caption glyph spacing in pixels.", + "maximum": 20, + "minimum": -5, + "type": "number" + }, + "lineGapEm": { + "description": "Gap between caption lines as a multiple of base font size; default 0.25.", + "maximum": 2, + "minimum": 0, + "type": "number" + }, + "maxWidthPercent": { + "exclusiveMinimum": 0, + "maximum": 100, + "type": "number" + }, + "plate": { + "enum": [ + "glass", + "solid", + "none" + ], + "type": "string" + }, + "position": { + "enum": [ + "top", + "center", + "bottom" + ], + "type": "string" + }, + "region": { + "additionalProperties": {}, + "description": "Optional caption layout box {x,y,w,h} in normalized output-frame coordinates. Overrides position; text starts at its top edge and wraps/pages within its width and height.", + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + "textTransform": { + "enum": [ + "none", + "uppercase", + "capitalize" + ], + "type": "string" + }, + "wordGapEm": { + "description": "Gap between caption runs as a multiple of base font size; default 0.35.", + "maximum": 2, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "source", + "segments" + ], + "type": "object" + } +] - changed
Input schema / properties / body / properties / format / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Input schema / properties / body / properties / license / additionalPropertiesPrevious value: -falseNew value: +{} - added
Input schema / properties / body / properties / licenseVerificationAdded value: +{ + "enum": [ + "attested", + "cueframe-verified", + "third-party-verified" + ], + "readOnly": true, + "type": "string" +} - added
Input schema / properties / body / properties / markers / items / properties / metadata / propertiesAdded value: +{} - added
Input schema / properties / body / properties / ownerOrgIdAdded value: +{ + "readOnly": true, + "type": "string" +} - added
Input schema / properties / body / properties / sourceSuggestionIdAdded value: +{ + "readOnly": true, + "type": "string" +} - changed
Input schema / properties / body / properties / tracks / items / properties / contents / items / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "animate": { - "additionalProperties": { - "items": { - "additionalProperties": false, - "properties": { - "easing": { - "anyOf": [ - { - "enum": [ - "linear", - "ease", - "easeIn", - "easeOut", - "easeInOut" - ], - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "cubicBezier": { - "items": false, - "maxItems": 4, - "minItems": 4, - "prefixItems": [ - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - }, - { - "type": "number" - } - ], - "type": "array" - } - }, - "required": [ - "cubicBezier" - ], - "type": "object" - } - ] - }, - "time": { - "minimum": 0, - "type": "number" - }, - "value": { - "type": "number" - } - }, - "required": [ - "time", - "value" - ], - "type": "object" - }, - "minItems": 2, - "type": "array" - }, - "description": "Keyframe channels, clip-relative seconds. Each channel's values use the SAME unit as the scalar it animates: `opacity` 0 to 1, `scale` a multiplier (>0), `rotation` degrees, `position.x`/`position.y` a FRACTION of the frame like `position` (0.5 = centre; NOT pixels), `volume` 0 to 4.", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "captionVisibility": { - "description": "Video media clip only. Hide native captions while this clip is topmost and covers the lower picture, or when an opaque, effect-free clip has an explicitly full-frame region, even with fit:contain. Caption words and timings remain stored and resume when another visible clip takes over.", - "enum": [ - "visible", - "hidden" - ], - "type": "string" - }, - "duration": { - "description": "Clip duration (seconds).", - "exclusiveMinimum": 0, - "type": "number" - }, - "effects": { - "items": { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "type": "string" - }, - "window": { - "additionalProperties": false, - "properties": { - "duration": { - "exclusiveMinimum": 0, - "type": "number" - }, - "startTime": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "startTime", - "duration" - ], - "type": "object" - } - }, - "type": "object" - }, - "type": "array" - }, - "fit": { - "enum": [ - "cover", - "contain" - ], - "type": "string" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "kind": { - "enum": [ - "video", - "audio", - "image", - "overlay", - "effect" - ], - "type": "string" - }, - "linkGroupId": { - "minLength": 1, - "type": "string" - }, - "opacity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "position": { - "additionalProperties": false, - "description": "Clip CENTRE as a fraction of the frame: {x:0.5,y:0.5} is dead centre, 0 to 1 is inside the frame, and a little overshoot (down to -1, up to 2) is how an entrance starts off-canvas. NOT pixels: the renderer maps x to `left: x*100%`, so `x: 180` sits 180 frame-widths away and draws nothing.", - "properties": { - "x": { - "maximum": 2, - "minimum": -1, - "type": "number" - }, - "y": { - "maximum": 2, - "minimum": -1, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "region": { - "additionalProperties": false, - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - "rotation": { - "type": "number" - }, - "scale": { - "exclusiveMinimum": 0, - "type": "number" - }, - "source": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "properties": { - "clipId": { - "minLength": 1, - "type": "string" - }, - "offsetMs": { - "type": "number" - } - }, - "required": [ - "clipId", - "offsetMs" - ], - "type": "object" - }, - "audioRole": { - "enum": [ - "sfx", - "music", - "vo", - "ambience" - ], - "type": "string" - }, - "duck": { - "additionalProperties": false, - "properties": { - "attackMs": { - "minimum": 0, - "type": "number" - }, - "duckDb": { - "maximum": 0, - "type": "number" - }, - "releaseMs": { - "minimum": 0, - "type": "number" - }, - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "endMs": { - "type": "number" - }, - "startMs": { - "type": "number" - } - }, - "required": [ - "startMs", - "endMs" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "duckDb", - "attackMs", - "releaseMs" - ], - "type": "object" - }, - "excludedRanges": { - "items": { - "additionalProperties": false, - "properties": { - "end": { - "minimum": 0, - "type": "number" - }, - "reason": { - "type": "string" - }, - "start": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "start", - "end" - ], - "type": "object" - }, - "type": "array" - }, - "fadeInMs": { - "minimum": 0, - "type": "number" - }, - "fadeOutMs": { - "minimum": 0, - "type": "number" - }, - "kenBurns": { - "enum": [ - "in", - "out", - "pan-l", - "pan-r", - "none" - ], - "type": "string" - }, - "kind": { - "const": "media", - "type": "string" - }, - "loop": { - "type": "boolean" - }, - "mediaId": { - "minLength": 1, - "type": "string" - }, - "muted": { - "type": "boolean" - }, - "playbackRate": { - "exclusiveMinimum": 0, - "type": "number" - }, - "reframe": { - "additionalProperties": false, - "properties": { - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "bias": { - "additionalProperties": false, - "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", - "properties": { - "x": { - "description": "Horizontal nudge, source-normalized (+ = right).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "y": { - "description": "Vertical nudge, source-normalized (+ = down).", - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "ease": { - "additionalProperties": false, - "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", - "properties": { - "in": { - "description": "Ease-IN ramp DURATION in seconds at the segment START.", - "minimum": 0, - "type": "number" - }, - "out": { - "description": "Ease-OUT ramp DURATION in seconds at the segment END.", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "in", - "out" - ], - "type": "object" - }, - "endSec": { - "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", - "exclusiveMinimum": 0, - "type": "number" - }, - "focus": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "frame-center", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "point", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "mode", - "x", - "y" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "faceId": { - "minLength": 1, - "type": "string" - }, - "mode": { - "const": "face", - "type": "string" - }, - "shotScale": { - "enum": [ - "close", - "standard", - "wide" - ], - "type": "string" - } - }, - "required": [ - "mode", - "faceId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "all-faces", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "mode": { - "const": "active-speaker", - "type": "string" - } - }, - "required": [ - "mode" - ], - "type": "object" - } - ], - "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight." - }, - "intent": { - "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", - "type": "string" - }, - "startSec": { - "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", - "minimum": 0, - "type": "number" - }, - "zoom": { - "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale` — a face-tracked shot is sized EITHER by the editorial scale (shotScale, which the bake calibrates to the detected face) OR by an explicit zoom, never both. A segment carrying both is REJECTED: shotScale wins at bake time and the zoom would be silently discarded.", - "maximum": 1, - "minimum": 0.1, - "type": "number" - } - }, - "required": [ - "startSec", - "endSec", - "focus" - ], - "type": "object" - }, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "segments" - ], - "type": "object" - }, - "sync": { - "enum": [ - "video", - "independent" - ], - "type": "string" - }, - "trim": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Source trim end (seconds).", - "minimum": 0, - "type": "number" - }, - "start": { - "description": "Source trim start (seconds).", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "start", - "end" - ], - "type": "object" - }, - "volume": { - "maximum": 4, - "minimum": 0, - "type": "number" - }, - "volumeDb": { - "type": "number" - } - }, - "required": [ - "kind", - "mediaId" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "componentId": { - "minLength": 1, - "type": "string" - }, - "execution": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "kind": { - "const": "component", - "type": "string" - }, - "placement": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "clip", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "content-slots", - "type": "string" - }, - "slots": { - "additionalProperties": { - "additionalProperties": false, - "properties": { - "ownership": { - "enum": [ - "reference", - "exclusive" - ], - "type": "string" - }, - "targetClipIds": { - "items": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "targetClipIds", - "ownership" - ], - "type": "object" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "kind", - "slots" - ], - "type": "object" - } - ] - }, - "props": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "kind", - "componentId", - "props", - "execution", - "placement" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "properties": { - "space": { - "const": "scene", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "space", - "x", - "y" - ], - "type": "object" - }, - "kind": { - "const": "overlay", - "type": "string" - }, - "parallax": { - "maximum": 0.3, - "minimum": -0.3, - "type": "number" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "pattern": "^(?!custom$)", - "type": "string" - }, - "zPlane": { - "enum": [ - "front", - "behind-subject" - ], - "type": "string" - } - }, - "required": [ - "kind", - "primitiveId", - "params" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "kind": { - "const": "effect", - "type": "string" - }, - "params": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "primitiveId": { - "minLength": 1, - "type": "string" - }, - "targetTrackIds": { - "items": { - "minLength": 1, - "type": "string" - }, - "minItems": 1, - "type": "array" - }, - "wrapperOrder": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "html": { - "description": "Your card's HTML — rendered VERBATIM as the graphic (shell motion via applyMotionPreset in a FOLLOWING call). CANVAS CONTRACT: the card renders in a viewport equal to the composition format's pixel frame (1080×1920 at 9:16 fhd); the root is NOT auto-pinned — declare explicit width/height matching the frame (box-sizing:border-box) and anchor content with flex/grid; position:absolute;inset:0 on the root does NOT fill the frame; for edge-to-edge backgrounds add an inner absolutely-positioned layer with generous negative inset. Overlay compositing applies a ~92% safe-area inset — keep critical copy away from the extreme edges. FONTS: name a family from GET /v1/fonts (list_render_fonts) — the renderer loads those faces for the card and waits for them, so `font-family: Inter` draws Inter. `@import` and remote font files are REFUSED: the card renders with no network. A family that is not on that list has no bytes behind it and the browser falls back, so end any stack with a generic (`Inter, sans-serif`) rather than relying on a system face being present.", - "minLength": 1, - "type": "string" - }, - "kind": { - "const": "card", - "type": "string" - }, - "tokens": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "zPlane": { - "const": "front", - "type": "string" - } - }, - "required": [ - "kind", - "html" - ], - "type": "object" - } - ] - }, - "startTime": { - "description": "Timeline start (seconds).", - "minimum": 0, - "type": "number" - }, - "transitionIn": { - "additionalProperties": false, - "properties": { - "component": { - "additionalProperties": false, - "properties": { - "assets": { - "additionalProperties": { - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "componentId": { - "maxLength": 256, - "minLength": 1, - "type": "string" - }, - "mediaBindings": { - "additionalProperties": { - "items": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "type": "array" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "params": { - "additionalProperties": { - "$ref": "#/$defs/__schema0" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "seed": { - "minLength": 1, - "type": "string" - }, - "sourceVersionId": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "version": { - "const": 3, - "type": "number" - } - }, - "required": [ - "version", - "componentId", - "sourceVersionId", - "params", - "seed" - ], - "type": "object" - }, - "duration": { - "exclusiveMinimum": 0, - "type": "number" - }, - "fromClipId": { - "minLength": 1, - "type": "string" - }, - "handlePolicy": { - "const": "outgoing-overrun-at-cut-v1", - "type": "string" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "toClipId": { - "minLength": 1, - "type": "string" - }, - "type": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "type", - "duration" - ], - "type": "object" - } - }, - "required": [ - "id", - "startTime", - "duration", - "source" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "duration": { - "description": "Gap duration (seconds).", - "exclusiveMinimum": 0, - "type": "number" - }, - "id": { - "minLength": 1, - "type": "string" - }, - "startTime": { - "description": "Timeline start (seconds).", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "id", - "startTime", - "duration" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "automation": { + "additionalProperties": false, + "properties": { + "lanes": { + "items": { + "additionalProperties": false, + "properties": { + "points": { + "items": { + "additionalProperties": false, + "properties": { + "t": { + "type": "number" + }, + "v": { + "type": "number" + } + }, + "required": [ + "t", + "v" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + }, + "target": { + "const": "volume", + "type": "string" + } + }, + "required": [ + "target", + "points" + ], + "type": "object" + }, + "type": "array" + }, + "version": { + "const": 1, + "type": "number" + } + }, + "required": [ + "version", + "lanes" + ], + "type": "object" + }, + "captionVisibility": { + "description": "Video media clip only. Hide native captions while this clip is topmost and covers the lower picture, or when an opaque, effect-free clip has an explicitly full-frame region, even with fit:contain. Caption words and timings remain stored and resume when another visible clip takes over.", + "enum": [ + "visible", + "hidden" + ], + "type": "string" + }, + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "effects": { + "items": { + "additionalProperties": false, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "id": { + "minLength": 1, + "type": "string" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "type": "string" + }, + "window": { + "additionalProperties": false, + "properties": { + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "startTime": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "startTime", + "duration" + ], + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + "fit": { + "enum": [ + "cover", + "contain" + ], + "type": "string" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "kind": { + "enum": [ + "video", + "audio", + "image", + "overlay", + "effect" + ], + "type": "string" + }, + "legacyKeyframes": { + "additionalProperties": false, + "properties": { + "channels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "needsUpgrade": { + "const": true, + "type": "boolean" + }, + "record": {} + }, + "required": [ + "needsUpgrade", + "channels", + "record" + ], + "type": "object" + }, + "linkGroupId": { + "minLength": 1, + "type": "string" + }, + "opacity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "position": { + "additionalProperties": {}, + "description": "Clip CENTRE as a fraction of the frame: {x:0.5,y:0.5} is dead centre, 0 to 1 is inside the frame, and a little overshoot (down to -1, up to 2) is how an entrance starts off-canvas. NOT pixels: the renderer maps x to `left: x*100%`, so `x: 180` sits 180 frame-widths away and draws nothing.", + "properties": { + "x": { + "maximum": 2, + "minimum": -1, + "type": "number" + }, + "y": { + "maximum": 2, + "minimum": -1, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "region": { + "additionalProperties": {}, + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + "rotation": { + "type": "number" + }, + "scale": { + "exclusiveMinimum": 0, + "type": "number" + }, + "source": { + "oneOf": [ + { + "additionalProperties": {}, + "properties": { + "anchor": { + "additionalProperties": {}, + "properties": { + "clipId": { + "minLength": 1, + "type": "string" + }, + "offsetMs": { + "type": "number" + } + }, + "required": [ + "clipId", + "offsetMs" + ], + "type": "object" + }, + "audioRole": { + "enum": [ + "sfx", + "music", + "vo", + "ambience" + ], + "type": "string" + }, + "duck": { + "additionalProperties": {}, + "properties": { + "attackMs": { + "minimum": 0, + "type": "number" + }, + "duckDb": { + "maximum": 0, + "type": "number" + }, + "releaseMs": { + "minimum": 0, + "type": "number" + }, + "windows": { + "items": { + "additionalProperties": {}, + "properties": { + "endMs": { + "type": "number" + }, + "startMs": { + "type": "number" + } + }, + "required": [ + "startMs", + "endMs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "duckDb", + "attackMs", + "releaseMs" + ], + "type": "object" + }, + "excludedRanges": { + "items": { + "additionalProperties": {}, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "reason": { + "type": "string" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, + "type": "array" + }, + "fadeInMs": { + "minimum": 0, + "type": "number" + }, + "fadeOutMs": { + "minimum": 0, + "type": "number" + }, + "kenBurns": { + "enum": [ + "in", + "out", + "pan-l", + "pan-r", + "none" + ], + "type": "string" + }, + "kind": { + "const": "media", + "type": "string" + }, + "loop": { + "type": "boolean" + }, + "mediaId": { + "type": "string" + }, + "muted": { + "type": "boolean" + }, + "playbackRate": { + "exclusiveMinimum": 0, + "type": "number" + }, + "reframe": { + "additionalProperties": {}, + "properties": { + "segments": { + "items": { + "additionalProperties": {}, + "properties": { + "bias": { + "additionalProperties": {}, + "description": "Optional FINE framing nudge off the focus center, source-normalized in [−0.3, 0.3]. A small correction (headroom, rule-of-thirds), NOT a reframe — use `focus`/`zoom` for the actual shot. Omit (treated as 0) to sit dead-center on the focus.", + "properties": { + "x": { + "description": "Horizontal nudge, source-normalized (+ = right).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "y": { + "description": "Vertical nudge, source-normalized (+ = down).", + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "ease": { + "additionalProperties": {}, + "description": "Zoom/center ramp DURATIONS in SECONDS at this segment's edges — NOT a unitless 0–1 curve. ~0.3–0.6s reads as a snappy push; >1s reads sluggish. Keep `in` + `out` ≤ the segment's duration (endSec − startSec): the two edges share the span, so to ramp across the WHOLE segment set one edge to the full duration and the other to 0. Omit for an instant cut to this framing.", + "properties": { + "in": { + "description": "Ease-IN ramp DURATION in seconds at the segment START.", + "minimum": 0, + "type": "number" + }, + "out": { + "description": "Ease-OUT ramp DURATION in seconds at the segment END.", + "minimum": 0, + "type": "number" + } + }, + "required": [ + "in", + "out" + ], + "type": "object" + }, + "endSec": { + "description": "Segment END in seconds, clip-relative. The span (endSec − startSec) is this segment's duration — the window `ease` ramps over.", + "exclusiveMinimum": 0, + "type": "number" + }, + "focus": { + "description": "WHO/WHAT the camera tracks this segment (the reframe center), selected by `mode`: `frame-center` = no tracking, hold the geometric center (static/graphic footage, or a pure zoom); `point` = lock to a fixed source-normalized {x,y} (a non-moving on-screen element); `face` = track a detected face by `faceId` (from get_media_context), with optional `shotScale` close|standard|wide for tightness; `all-faces` = frame the bounding box of every detected face (group/ensemble shots); `active-speaker` = follow whoever is speaking (diarized talking-head / podcast). Pick by what the beat is about; pair with `zoom` for how tight.", + "oneOf": [ + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "frame-center", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "point", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "mode", + "x", + "y" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "faceId": { + "minLength": 1, + "type": "string" + }, + "mode": { + "const": "face", + "type": "string" + }, + "shotScale": { + "enum": [ + "close", + "standard", + "wide" + ], + "type": "string" + } + }, + "required": [ + "mode", + "faceId" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "all-faces", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "mode": { + "const": "active-speaker", + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + } + ] + }, + "intent": { + "description": "Optional editorial LABEL for diff/log readability (e.g. 'speaker-tight', 'wide-context'). Cosmetic — NOT honored by the derive math and excluded from the variant cache key.", + "type": "string" + }, + "startSec": { + "description": "Segment START in seconds, clip-relative. Segments tile the clip's duration in order.", + "minimum": 0, + "type": "number" + }, + "zoom": { + "description": "How TIGHT the framing is — the fraction of the source the output viewport shows. <1 punches IN (a smaller source fraction, magnified to fill the frame); 1 = the full frame (no crop). ~0.6–0.8 is a moderate push-in, ~0.5 a tight close-up, 0.1 the maximum zoom. There is NO zoom-OUT past the full frame (max 1). Omit for the full frame. MUTUALLY EXCLUSIVE with `focus.shotScale`: a face-tracked shot is sized EITHER by the editorial scale (shotScale, calibrated to the detected face) OR by an explicit zoom — never both.", + "maximum": 1, + "minimum": 0.1, + "type": "number" + } + }, + "required": [ + "startSec", + "endSec", + "focus" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "segments" + ], + "type": "object" + }, + "sync": { + "enum": [ + "video", + "independent" + ], + "type": "string" + }, + "trim": { + "additionalProperties": {}, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, + "volume": { + "maximum": 4, + "minimum": 0, + "type": "number" + }, + "volumeDb": { + "type": "number" + } + }, + "required": [ + "kind", + "mediaId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "componentId": { + "minLength": 1, + "type": "string" + }, + "execution": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "kind": { + "const": "component", + "type": "string" + }, + "placement": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "clip", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "content-slots", + "type": "string" + }, + "slots": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "ownership": { + "enum": [ + "reference", + "exclusive" + ], + "type": "string" + }, + "targetClipIds": { + "items": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targetClipIds", + "ownership" + ], + "type": "object" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "kind", + "slots" + ], + "type": "object" + } + ] + }, + "props": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "retired": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "kind", + "componentId", + "props" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "anchor": { + "additionalProperties": {}, + "properties": { + "space": { + "const": "scene", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "space", + "x", + "y" + ], + "type": "object" + }, + "kind": { + "const": "overlay", + "type": "string" + }, + "parallax": { + "maximum": 0.3, + "minimum": -0.3, + "type": "number" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "pattern": "^(?!custom$)", + "type": "string" + }, + "zPlane": { + "enum": [ + "front", + "behind-subject" + ], + "type": "string" + } + }, + "required": [ + "kind", + "primitiveId", + "params" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "kind": { + "const": "effect", + "type": "string" + }, + "params": { + "additionalProperties": {}, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "primitiveId": { + "minLength": 1, + "type": "string" + }, + "targetTrackIds": { + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "wrapperOrder": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "html": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "card", + "type": "string" + }, + "tokens": { + "additionalProperties": { + "type": "string" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "zPlane": { + "const": "front", + "type": "string" + } + }, + "required": [ + "kind", + "html" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "compositionId": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "composition", + "type": "string" + }, + "trim": { + "additionalProperties": {}, + "properties": { + "end": { + "minimum": 0, + "type": "number" + }, + "start": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + } + }, + "required": [ + "kind", + "compositionId" + ], + "type": "object" + } + ] + }, + "startTime": { + "minimum": 0, + "type": "number" + }, + "transitionIn": { + "additionalProperties": {}, + "properties": { + "component": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 3, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "assets": { + "additionalProperties": { + "minLength": 1, + "type": "string" + }, + "properties": {}, + "propertyNames": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "componentId": { + "maxLength": 256, + "minLength": 1, + "type": "string" + }, + "mediaBindings": { + "additionalProperties": { + "items": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "properties": {}, + "propertyNames": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "params": { + "additionalProperties": { + "$ref": "#/$defs/__schema0" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "seed": { + "minLength": 1, + "type": "string" + }, + "sourceVersionId": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "version": { + "const": 4, + "type": "number" + } + }, + "required": [ + "version", + "componentId", + "sourceVersionId", + "params", + "seed" + ], + "type": "object" + } + ] + }, + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "fromClipId": { + "minLength": 1, + "type": "string" + }, + "handlePolicy": { + "const": "outgoing-overrun-at-cut-v1", + "type": "string" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "toClipId": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "type", + "duration" + ], + "type": "object" + }, + "tweens": { + "items": { + "additionalProperties": false, + "properties": { + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "keyframes": { + "additionalProperties": false, + "properties": { + "easeEach": { + "const": "none", + "type": "string" + }, + "format": { + "const": "percentage", + "type": "string" + }, + "keyframes": { + "items": { + "additionalProperties": false, + "properties": { + "ease": { + "type": "string" + }, + "percentage": { + "type": "number" + }, + "properties": { + "additionalProperties": { + "type": "number" + }, + "properties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "percentage", + "properties" + ], + "type": "object" + }, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "format", + "easeEach", + "keyframes" + ], + "type": "object" + }, + "position": { + "type": "number" + }, + "propertyGroup": { + "enum": [ + "visual", + "scale", + "rotation", + "position" + ], + "type": "string" + } + }, + "required": [ + "id", + "propertyGroup", + "position", + "duration", + "keyframes" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "id", + "startTime", + "duration", + "source" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "duration": { + "exclusiveMinimum": 0, + "type": "number" + }, + "id": { + "minLength": 1, + "type": "string" + }, + "startTime": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "id", + "startTime", + "duration" + ], + "type": "object" + } +]
71 tool updates
- First observed
apply_composition - First observed
apply_template - First observed
cancel_compose - First observed
cancel_export - First observed
cancel_job - First observed
cancel_render - First observed
compose - First observed
consult - First observed
create_brand_kit - First observed
create_brief - First observed
create_checkout - First observed
create_component - First observed
create_project - First observed
create_render - First observed
create_upload - First observed
create_webhook - First observed
delete_brief - First observed
delete_composition - First observed
delete_critic - First observed
delete_media - First observed
delete_project - First observed
delete_webhook - First observed
derive_composition - First observed
describe_composition_ops - First observed
extract_brand_kit - First observed
finalize_upload - First observed
generate_media - First observed
get_account - First observed
get_brief - First observed
get_checkpoint - First observed
get_component_source - First observed
get_composition - First observed
get_media_context - First observed
get_media_facts - First observed
get_profile - First observed
get_transcript - First observed
get_usage - First observed
import_media - First observed
import_resource - First observed
list_briefs - First observed
list_catalog - First observed
list_checkpoints - First observed
list_compositions - First observed
list_critics - First observed
list_media - First observed
list_plans - First observed
list_projects - First observed
list_render_fonts - First observed
new_composition - First observed
prepare_media - First observed
preview_card - First observed
preview_clip - First observed
preview_component - First observed
preview_frame - First observed
register_critic - First observed
resolve_builtin_component - First observed
resume - First observed
retry_render - First observed
score_composition - First observed
search_fonts - First observed
search_resources - First observed
select_candidate - First observed
start_template - First observed
suggest_briefs - First observed
update_brief - First observed
update_component - First observed
update_project - First observed
update_webhook - First observed
validate_composition - First observed
verify_webhook - First observed
wait_job
Publisher details
- Operator
- CueFrame, Inc. · Publisher source
- Operator website
- https://cueframe.ai · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://docs.cueframe.ai/docs · Publisher source
- Trust center
- Unknown
- Restrictions
- A CueFrame account and OAuth sign-in are required. Paid cloud processing uses credits; review the estimate before rendering. · Publisher source
Related MCP Connectors
AI video editor for agents and humans: timeline, captions, color, audio and generation as MCP tools.
Plan, compare, price, generate, and recover AI video from compatible MCP clients.
- CueFrameDeprecatedai.cueframe.api
Compose, edit and render video through CueFrame’s hosted x402 MCP endpoint: content-aware reframing, word-timed captions and motion graphics. Paid tool calls require an x402-capable client and wallet payment. For OAuth browser sign-in, use the CueFrame OAuth connector.
A video editor in your browser that your AI drives: cuts, captions, multicam, motion titles, export.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceAn agentic AI video editor for Claude. It enables editing real video through MCP: cutting, captioning, reframing, scoring, and exporting finished MP4s from actual footage.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to drive a desktop video editor through MCP, providing the same editing operations as the user — placing, trimming, rippling, grading, captioning, and exporting — on the actual project with local rendering.7GPL 3.0
- AlicenseNot gradedqualityAmaintenanceEnables AI agents and MCP clients to programmatically edit video projects on a local desktop editor, with 119 tools for multitrack editing, effects, captions, audio, and batch auto-editing, producing reviewable and reversible real timeline edits.AGPL 3.0
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to turn natural-language creative direction, transcripts, and source media into fully structured, editable video projects, then verify and render delivery files.2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.