{"id":2,"jsonrpc":"2.0","result":{"tools":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Validate an actual native project identity, an external public-interface transfer and its reviewed exact-build acceptance matrix. Return a proposed editing snapshot only after all nonblocking host/editorial losses are acknowledged. Does not parse the proprietary format, execute the adapter, fetch media or modify files/sessions.","inputSchema":{"$defs":{"Asset":{"additionalProperties":false,"description":"External source media declared in a project with media.add; files are referenced, never copied.","properties":{"decode":{"anyOf":[{"description":"How an identity-bound original is decoded; the index is derived data kept outside the project. Abbreviated; cutbolt_schema {\"name\":\"source_decode\"} returns it.","properties":{"mode":{"description":"Variant tag; cutbolt_schema with select returns a variant's fields.","enum":["converted","direct"],"type":"string"}},"required":["mode"],"type":"object"},{"type":"null"}],"description":"Original source decoding: indexed directly or normalized with a saved conversion recipe; requires identity."},"duration":{"$ref":"#/$defs/Time","description":"Complete source duration in rational seconds; positive, and clip ranges must fit inside it."},"id":{"description":"Unique asset ID within the project, 1-128 bytes; clips refer to it as `asset_id`.","type":"string"},"identity":{"anyOf":[{"$ref":"#/$defs/Identity2"},{"type":"null"}],"description":"Original content identity set by media.bind or indexed media.add; required for relinking and proxies."},"metadata":{"$ref":"#/$defs/Metadata","description":"Searchable title, bin, tags and custom fields; omitted when empty."},"path":{"description":"Source file path: absolute, or relative normal components resolved under `input_root`.","type":"string"},"provenance":{"anyOf":[{"$ref":"#/$defs/Provenance"},{"type":"null"}],"description":"Original identity and, when materialized, the identity of its normalized conversion."},"proxy":{"anyOf":[{"$ref":"#/$defs/Binding2"},{"type":"null"}],"description":"Preview proxy attached with media.proxy.attach; omitted when none."}},"required":["id","path","duration"],"type":"object"},"Binding":{"additionalProperties":false,"description":"Maps one media reference in the interchange document to an identity-bound local asset.","properties":{"asset":{"$ref":"#/$defs/Asset","description":"Explicit local asset, including a bound content identity."},"target_url":{"description":"An exact logical reference from the interchange document; never fetched.","type":"string"}},"required":["target_url","asset"],"type":"object"},"Binding2":{"additionalProperties":false,"description":"Preview proxy bound to an asset, usually as returned by proxy.generate. Previews use it only when preview.proxy selects its scale.","properties":{"frames":{"description":"Proxy frame count; must equal the asset duration in 25 fps frames.","minimum":0,"type":"integer"},"identity":{"$ref":"#/$defs/Identity2","description":"Content identity of the proxy file."},"path":{"description":"Proxy file path: absolute, or relative normal components resolved under `input_root`.","type":"string"},"scale":{"description":"Dimension divisor 2, 4 or 8; project width and height must divide exactly.","minimum":0,"type":"integer"},"source_identity":{"$ref":"#/$defs/Identity2","description":"Identity of the full-quality source; must equal the asset's bound identity."}},"required":["path","identity","source_identity","scale","frames"],"type":"object"},"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"},"Identity2":{"additionalProperties":false,"description":"Content identity of a media file, checked before the file is used.","properties":{"bytes":{"description":"File size in bytes; positive.","minimum":0,"type":"integer"},"sha256":{"description":"SHA-256 of the file content as 64 lowercase hex characters.","type":"string"}},"required":["sha256","bytes"],"type":"object"},"Metadata":{"additionalProperties":false,"description":"Project-owned asset metadata for organizing and registry.search; at most 4096 UTF-8 bytes in total, no NUL characters. Media files are never tagged.","properties":{"bin":{"default":[],"description":"Bin path from outermost component, at most 8 nonblank components of up to 128 bytes; default empty.","items":{"type":"string"},"type":"array"},"fields":{"additionalProperties":{"type":"string"},"default":{},"description":"At most 32 custom name/value pairs; names nonblank and up to 128 bytes, values up to 1024 bytes.","type":"object"},"tags":{"default":[],"description":"At most 32 unique case-sensitive tags, each nonblank and up to 128 bytes; default empty.","items":{"type":"string"},"type":"array"},"title":{"default":"","description":"Display title, at most 1024 bytes; default empty.","type":"string"}},"type":"object"},"Provenance":{"additionalProperties":false,"description":"Content lineage; derived conversion files are rebuildable and originals remain authoritative.","properties":{"conversion":{"anyOf":[{"$ref":"#/$defs/Identity2"},{"type":"null"}],"description":"Complete normalized file identity once prepared; absent while only a recipe is saved."},"original":{"$ref":"#/$defs/Identity2","description":"Complete original media identity."}},"required":["original"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"acceptance":{"$ref":"#/$defs/Identity","description":"An explicitly reviewed, content-bound adapter/build acceptance manifest."},"acknowledged_losses":{"default":[],"description":"Unique IDs of nonblocking `host:` issues and editorial losses to accept; default none.","items":{"type":"string"},"type":"array"},"bindings":{"description":"Up to 1000 media bindings, as for interchange.import.","items":{"$ref":"#/$defs/Binding"},"type":"array"},"id":{"description":"ID of the proposed project.","type":"string"},"input_root":{"description":"Existing directory containing the three distinct `source`, `transfer` and `acceptance` files. Optional: defaults to the workspace.","type":"string"},"media_root":{"description":"Existing directory that every bound asset and proxy path must resolve inside. Optional: defaults to the workspace.","type":"string"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"source":{"$ref":"#/$defs/Identity","description":"The actual native project, never opened for writing by this engine."},"transfer":{"$ref":"#/$defs/Identity","description":"A transfer produced by the source application's public project interface."}},"required":["source","transfer","acceptance","id","bindings"],"type":"object"},"name":"cutbolt_native_import"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Validate identities and propose relative full-quality/proxy media paths under an explicit media root. Returns a snapshot and media.paths operations for saved-session preview/apply; does not copy media or write state.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"expected_revision":{"description":"Must equal the supplied project's revision.","minimum":0,"type":"integer"},"input_root":{"description":"Existing media root; proposed relative paths resolve inside it. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project whose media paths to make relative. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"}},"required":["project","expected_revision"],"type":"object"},"name":"cutbolt_project_portable"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Check the entire local editing history, revision links, snapshot/receipt checksums and stored diffs in one consistent read. Reports schema, heads and whether explicit migration is needed; does not migrate.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"store_root":{"description":"Existing local directory holding the session database (projects.sqlite3). Optional: defaults to .cutbolt/store in the workspace.","type":"string"}},"required":[],"type":"object"},"name":"cutbolt_session_check"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Explicitly migrate a checked version-1 editing store to version 2 in one transaction. Preserves snapshots, request receipts and undo/history; adds revision metadata checksums. Already-current stores return an unchanged result.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"store_root":{"description":"Existing local directory holding the session database (projects.sqlite3). Optional: defaults to .cutbolt/store in the workspace.","type":"string"}},"required":[],"type":"object"},"name":"cutbolt_session_migrate"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"description":"Write a consistent, checked copy of the complete local editing history to a new SQLite file under an explicit output root. Preserves live edits and media; rejects existing output. Maximum store size 256 MiB.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"output":{"description":"Unused `.sqlite3` path inside `output_root`.","type":"string"},"output_root":{"description":"Existing directory that must contain `output`. Optional: defaults to the workspace.","type":"string"},"store_root":{"description":"Existing session store directory to copy. Optional: defaults to .cutbolt/store in the workspace.","type":"string"}},"required":["output"],"type":"object"},"name":"cutbolt_session_backup"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"description":"Recover an identity-bound checked history backup into a root without an existing project database or journals. Preserves backup, revisions and request receipts; does not migrate or copy media. Existing stores are never replaced.","inputSchema":{"$defs":{"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory containing the backup. Optional: defaults to the workspace.","type":"string"},"source":{"$ref":"#/$defs/Identity","description":"Backup file identity (bytes, SHA-256); path absolute or relative, inside `input_root`; at most 256 MiB."},"store_root":{"description":"Existing directory with no projects.sqlite3 or journal, WAL or shared-memory sidecar. Optional: defaults to .cutbolt/store in the workspace.","type":"string"}},"required":["source"],"type":"object"},"name":"cutbolt_session_recover"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Inspect an identity-bound local OTIO editorial document using explicit local media bindings. Returns a proposed native snapshot only after every reported loss is acknowledged; unsupported structures block conversion. Does not fetch URLs, write files or modify saved sessions.","inputSchema":{"$defs":{"Asset":{"additionalProperties":false,"description":"External source media declared in a project with media.add; files are referenced, never copied.","properties":{"decode":{"anyOf":[{"description":"How an identity-bound original is decoded; the index is derived data kept outside the project. Abbreviated; cutbolt_schema {\"name\":\"source_decode\"} returns it.","properties":{"mode":{"description":"Variant tag; cutbolt_schema with select returns a variant's fields.","enum":["converted","direct"],"type":"string"}},"required":["mode"],"type":"object"},{"type":"null"}],"description":"Original source decoding: indexed directly or normalized with a saved conversion recipe; requires identity."},"duration":{"$ref":"#/$defs/Time","description":"Complete source duration in rational seconds; positive, and clip ranges must fit inside it."},"id":{"description":"Unique asset ID within the project, 1-128 bytes; clips refer to it as `asset_id`.","type":"string"},"identity":{"anyOf":[{"$ref":"#/$defs/Identity2"},{"type":"null"}],"description":"Original content identity set by media.bind or indexed media.add; required for relinking and proxies."},"metadata":{"$ref":"#/$defs/Metadata","description":"Searchable title, bin, tags and custom fields; omitted when empty."},"path":{"description":"Source file path: absolute, or relative normal components resolved under `input_root`.","type":"string"},"provenance":{"anyOf":[{"$ref":"#/$defs/Provenance"},{"type":"null"}],"description":"Original identity and, when materialized, the identity of its normalized conversion."},"proxy":{"anyOf":[{"$ref":"#/$defs/Binding2"},{"type":"null"}],"description":"Preview proxy attached with media.proxy.attach; omitted when none."}},"required":["id","path","duration"],"type":"object"},"Binding":{"additionalProperties":false,"description":"Maps one media reference in the interchange document to an identity-bound local asset.","properties":{"asset":{"$ref":"#/$defs/Asset","description":"Explicit local asset, including a bound content identity."},"target_url":{"description":"An exact logical reference from the interchange document; never fetched.","type":"string"}},"required":["target_url","asset"],"type":"object"},"Binding2":{"additionalProperties":false,"description":"Preview proxy bound to an asset, usually as returned by proxy.generate. Previews use it only when preview.proxy selects its scale.","properties":{"frames":{"description":"Proxy frame count; must equal the asset duration in 25 fps frames.","minimum":0,"type":"integer"},"identity":{"$ref":"#/$defs/Identity2","description":"Content identity of the proxy file."},"path":{"description":"Proxy file path: absolute, or relative normal components resolved under `input_root`.","type":"string"},"scale":{"description":"Dimension divisor 2, 4 or 8; project width and height must divide exactly.","minimum":0,"type":"integer"},"source_identity":{"$ref":"#/$defs/Identity2","description":"Identity of the full-quality source; must equal the asset's bound identity."}},"required":["path","identity","source_identity","scale","frames"],"type":"object"},"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"},"Identity2":{"additionalProperties":false,"description":"Content identity of a media file, checked before the file is used.","properties":{"bytes":{"description":"File size in bytes; positive.","minimum":0,"type":"integer"},"sha256":{"description":"SHA-256 of the file content as 64 lowercase hex characters.","type":"string"}},"required":["sha256","bytes"],"type":"object"},"Metadata":{"additionalProperties":false,"description":"Project-owned asset metadata for organizing and registry.search; at most 4096 UTF-8 bytes in total, no NUL characters. Media files are never tagged.","properties":{"bin":{"default":[],"description":"Bin path from outermost component, at most 8 nonblank components of up to 128 bytes; default empty.","items":{"type":"string"},"type":"array"},"fields":{"additionalProperties":{"type":"string"},"default":{},"description":"At most 32 custom name/value pairs; names nonblank and up to 128 bytes, values up to 1024 bytes.","type":"object"},"tags":{"default":[],"description":"At most 32 unique case-sensitive tags, each nonblank and up to 128 bytes; default empty.","items":{"type":"string"},"type":"array"},"title":{"default":"","description":"Display title, at most 1024 bytes; default empty.","type":"string"}},"type":"object"},"Provenance":{"additionalProperties":false,"description":"Content lineage; derived conversion files are rebuildable and originals remain authoritative.","properties":{"conversion":{"anyOf":[{"$ref":"#/$defs/Identity2"},{"type":"null"}],"description":"Complete normalized file identity once prepared; absent while only a recipe is saved."},"original":{"$ref":"#/$defs/Identity2","description":"Complete original media identity."}},"required":["original"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"acknowledged_losses":{"default":[],"description":"Unique IDs of reported nonblocking losses to accept; default none.","items":{"type":"string"},"type":"array"},"bindings":{"description":"Up to 1000 media bindings, one per distinct document reference; unused ones are ignored.","items":{"$ref":"#/$defs/Binding"},"type":"array"},"frame_rate":{"$ref":"#/$defs/Time","description":"Timeline frame rate in frames per second as a rational `{num, den}`."},"height":{"description":"Project canvas height in pixels.","minimum":0,"type":"integer"},"id":{"description":"ID of the proposed project.","type":"string"},"input_root":{"description":"Existing directory containing the source document. Optional: defaults to the workspace.","type":"string"},"media_root":{"description":"Existing directory that every bound asset and proxy path must resolve inside. Optional: defaults to the workspace.","type":"string"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"source":{"$ref":"#/$defs/Identity","description":"`.otio` file identity `{path, bytes, sha256}` relative to `input_root`; at most 4 MiB."},"width":{"description":"Project canvas width in pixels.","minimum":0,"type":"integer"}},"required":["source","id","width","height","frame_rate","bindings"],"type":"object"},"name":"cutbolt_interchange_import"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Inspect a flat native timeline for bounded OTIO export. Returns the proposed document and path-specific losses without writing. Requires identity-bound local sources.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to describe as OTIO. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"}},"required":["project"],"type":"object"},"name":"cutbolt_interchange_export_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"description":"Publish a new bounded OTIO editorial document under an explicit output root. Requires exact acknowledgements for reported losses, rejects unsupported structure and existing outputs, and preserves media and saved sessions.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"acknowledged_losses":{"default":[],"description":"Unique IDs of reported nonblocking losses to accept; default none.","items":{"type":"string"},"type":"array"},"input_root":{"description":"Directory containing every registered asset; each asset identity is checked. Optional: defaults to the workspace.","type":"string"},"output":{"description":"Path of the new `.otio` file; existing files are never replaced.","type":"string"},"output_root":{"description":"Existing directory that must contain `output`. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to export. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"}},"required":["project","output"],"type":"object"},"name":"cutbolt_interchange_export"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Inspect the owned local cache, entry identities, logical and physical sizes without generating media.","inputSchema":{"$defs":{"Kind3":{"description":"Cache family. Ordinary previews/probes keep their existing SQLite payload store.","oneOf":[{"const":"artifacts","description":"Existing small preview, probe and proxy cache (1 GiB maximum).","type":"string"},{"const":"conform","description":"File-backed verified conversions (1 TiB maximum); choose a separate cache root.","type":"string"}]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"cache_root":{"description":"Local cache directory used by cache.run. Optional: defaults to .cutbolt/cache in the workspace.","type":"string"},"kind":{"$ref":"#/$defs/Kind3","default":"artifacts","description":"Cache family: artifacts (default) or conform."}},"required":[],"type":"object"},"name":"cutbolt_cache_inspect"},{"annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Evict least-recently-used derived cache entries to explicit byte/count budgets; source media and exported files are not removed.","inputSchema":{"$defs":{"Kind3":{"description":"Cache family. Ordinary previews/probes keep their existing SQLite payload store.","oneOf":[{"const":"artifacts","description":"Existing small preview, probe and proxy cache (1 GiB maximum).","type":"string"},{"const":"conform","description":"File-backed verified conversions (1 TiB maximum); choose a separate cache root.","type":"string"}]},"Policy":{"additionalProperties":false,"description":"Cache budget; least-recently-used entries are evicted to fit. Artifact results can bypass storage; conform refuses oversize output.","properties":{"max_bytes":{"description":"Maximum payload bytes: artifacts up to 1 GiB, conform up to 1 TiB; index and decoded scratch are separate.","minimum":0,"type":"integer"},"max_entries":{"description":"Maximum number of entries, 0 to 4096.","minimum":0,"type":"integer"}},"required":["max_bytes","max_entries"],"type":"object"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"cache_root":{"description":"Local cache directory used by cache.run. Optional: defaults to .cutbolt/cache in the workspace.","type":"string"},"kind":{"$ref":"#/$defs/Kind3","default":"artifacts","description":"Cache family: artifacts (default) or conform."},"policy":{"$ref":"#/$defs/Policy","description":"Byte and entry budgets; least-recently-used derived entries are evicted until both are met."}},"required":["policy"],"type":"object"},"name":"cutbolt_cache_prune"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"description":"Write a contact sheet of exact timeline frames, laid out on a grid, to an unused PNG, and return it as an inline image so the edit can be seen. Uses the saved proxy selection.","inputSchema":{"$defs":{"Sheet":{"additionalProperties":false,"description":"Contact-sheet layout: frames are fitted and centered in tiles, filled row by row; the sheet is at most 8M pixels.","properties":{"background":{"description":"`[r, g, b]` fill (0-255) for gaps, letterboxing and unused cells.","items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"},"columns":{"description":"Cells per row, 1 to 8.","minimum":0,"type":"integer"},"gap":{"description":"Spacing between cells in pixels, 0 to 32.","minimum":0,"type":"integer"},"tile_height":{"description":"Cell height in pixels, 1 to 1080.","minimum":0,"type":"integer"},"tile_width":{"description":"Cell width in pixels, 1 to 1920.","minimum":0,"type":"integer"},"times":{"description":"1 to 64 rational timeline times in cell order; frame boundaries before the end, duplicates allowed.","items":{"$ref":"#/$defs/Time"},"type":"array"}},"required":["times","columns","tile_width","tile_height","gap","background"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"output":{"description":"Path of a new .png file inside output_root; existing files are never overwritten.","type":"string"},"output_root":{"description":"Existing directory; the output must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to read. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"spec":{"$ref":"#/$defs/Sheet","description":"Frame times and grid layout of the contact sheet."}},"required":["project","spec","output"],"type":"object"},"name":"cutbolt_preview_sheet"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Review the edit: write a sheet of the last frame before and first frame after each cut (16 per page, two cuts per row), return it as an inline image, and list each cut's time, clips and source times. Continue with `next`.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"detail":{"description":"summary, the default, shortens bulky parts (timing runs to one line per layer, lists to counts) and names them in the result's detail field; full returns everything.","enum":["summary","full"],"type":"string"},"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"limit":{"description":"Cuts on this sheet, 1-16; default 16.","format":"uint","minimum":0,"type":["integer","null"]},"output":{"description":"Path of a new .png file inside output_root; existing files are never overwritten.","type":"string"},"output_root":{"description":"Existing directory; the output must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project whose cuts to review. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"start":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"List cuts at or after this timeline time; default zero. Pass the previous result's `next` to continue."},"tile_width":{"description":"Cell width in pixels, 16-480; default 192. Cell height follows the project's aspect ratio.","minimum":0,"type":["integer","null"]}},"required":["project","output"],"type":"object"},"name":"cutbolt_preview_cuts"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Bring the whole mix to a loudness target such as -14 LKFS: measure the timeline's integrated loudness and peaks, then propose clip_audio operations that scale every audio clip's level (and gain curve) by one factor. When the peak ceiling (default -1 dBFS) would stop it short, it also proposes a master limiter (audio_dynamics) at the ceiling and raises the gain through it, up to max_limiting_db of reduction. The proposal is measured before it is returned (two renders of the mix), so result (loudness, sample and true peak, limiter reduction) is what applying it gives. Read-only; apply the operations with session.apply.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory that project media paths resolve against. Optional: defaults to the workspace.","type":"string"},"limiter":{"description":"Propose a master limiter when the ceiling would stop the gain short of the target; default true. False stops the gain at the ceiling.","type":["boolean","null"]},"max_limiting_db":{"description":"Most gain reduction the limiter may apply, 0 to 24 dB; default 12.","type":["number","null"]},"peak_ceiling_dbfs":{"description":"Highest allowed peak after the change, -20 to 0 dBFS; default -1. When the target would pass it, a master limiter at the ceiling is proposed (see limiter), keeping sample and true peak under it.","type":["number","null"]},"project":{"description":"Project whose mix to normalize; it needs placed tracks, and audio tracks with clips must be unlocked. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"target_lkfs":{"description":"Integrated loudness to reach, -40 to -5 LKFS; default -14, common for online video.","type":["number","null"]}},"required":["project"],"type":"object"},"name":"cutbolt_audio_normalize"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Jump cuts: find pauses in speech (the voice track, or a sequential timeline's program) and propose ripple deletions of each pause's middle, keeping some silence, across every track. Each cut is checked on a working copy; refused cuts are listed with the reason. Read-only; apply the operations with session.apply.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"edges":{"default":true,"description":"Also cut silence before the first and after the last speech, keeping `keep` next to the speech; default true.","type":"boolean"},"end":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Cut only pauses before this timeline time; default the end."},"input_root":{"description":"Existing directory that project media paths resolve against. Optional: defaults to the workspace.","type":"string"},"keep":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Silence kept on each side of a cut; twice it must be shorter than min_pause. Default 1/5."},"min_pause":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Shortest silence that counts as a pause, 0.2-10 s; default 3/4."},"project":{"description":"Project to tighten: placed tracks with a voice track, or a sequential timeline analysed whole. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"start":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Cut only pauses after this timeline time; default the start."},"threshold_db":{"description":"Mean power over 10 ms windows that counts as speech, -80 to 0 dBFS; default -45.","type":["integer","null"]},"voice_track_id":{"description":"Audio track whose speech sets the pauses; required for placed tracks, omitted for sequential timelines.","type":["string","null"]}},"required":["project"],"type":"object"},"name":"cutbolt_audio_tighten"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Match one camera's colour to another's: sample frames of a reference and a target shot, build a per-channel 1D LUT (levels: mean and spread; histogram: whole distributions), write it as a new .cube and return the media.conform recipe that bakes it into a new target asset, with channel statistics before and after.","inputSchema":{"$defs":{"Method":{"description":"How the target's channels are mapped onto the reference's.","oneOf":[{"const":"levels","description":"Match each channel's mean and standard deviation with a straight line: robust when the shots differ in content.","type":"string"},{"const":"histogram","description":"Match each channel's whole distribution by quantiles: closer when both shots show the same scene.","type":"string"}]},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]},"Transfer":{"description":"SDR transfer function of encoded RGB or YUV values: `srgb` (sRGB piecewise curve) or `bt709` (BT.709 OETF).","enum":["srgb","bt709"],"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory containing both files; the .cube output must also lie inside it. Optional: defaults to the workspace.","type":"string"},"method":{"anyOf":[{"$ref":"#/$defs/Method"},{"type":"null"}],"description":"`levels` (default) matches each channel's mean and spread; `histogram` matches whole distributions."},"output":{"description":"Path of a new .cube table inside output_root.","type":"string"},"output_root":{"description":"Existing directory; the output must lie inside it. Optional: defaults to the workspace.","type":"string"},"reference":{"description":"Shot whose colour to match: a video file, absolute or relative to input_root; prepared FFV1 RGB assets measure exactly.","type":"string"},"reference_times":{"description":"Reference times to sample, 1-64; default nine frames spread through the file.","items":{"$ref":"#/$defs/Time"},"type":["array","null"]},"target":{"description":"Shot to correct, in the same forms.","type":"string"},"target_times":{"description":"Target times to sample, 1-64; default nine frames spread through the file.","items":{"$ref":"#/$defs/Time"},"type":["array","null"]},"transfer":{"anyOf":[{"$ref":"#/$defs/Transfer"},{"type":"null"}],"description":"Encoded transfer of an RGB target asset, used as its declared and working transfer; default bt709."}},"required":["reference","target","output"],"type":"object"},"name":"cutbolt_color_match"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Find the beat of a music file for cutting to it: onsets (sudden rises in 10 ms loudness), the tempo in BPM (the metrical level nearest 120 BPM; other levels, such as half time, in tempo_alternatives), and a beat grid on the onsets, as exact file times and, with frame_rate, the nearest frame of each beat. Read-only.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"detail":{"description":"summary, the default, shortens bulky parts (timing runs to one line per layer, lists to counts) and names them in the result's detail field; full returns everything.","enum":["summary","full"],"type":"string"},"duration":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Length to analyse, at most one hour; default to the end."},"frame_rate":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Also give each listed beat's nearest frame start at this native rate, for placing cuts."},"input_root":{"description":"Existing directory that must contain `path`. Optional: defaults to the workspace.","type":"string"},"max_bpm":{"description":"Fastest tempo considered, 30-300 BPM and at least 1.5 times min_bpm; default 200.","minimum":0,"type":["integer","null"]},"min_bpm":{"description":"Slowest tempo considered, 30-300 BPM; default 60.","minimum":0,"type":["integer","null"]},"path":{"description":"Music to analyse: any file FFmpeg decodes with an audio stream.","type":"string"},"start":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"File time to start at, on the 48 kHz grid; default zero. Reported times are file times."}},"required":["path"],"type":"object"},"name":"cutbolt_audio_beats"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Lower music under speech: analyze the voice track alone in 10 ms windows and propose gain curves for the music track's clips (ramp down before speech, hold, ramp back up after), as clip_audio operations to apply with session.apply. Read-only; nothing is changed until the operations are applied.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"attack":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Ramp down before speech starts, on the 48 kHz grid, at most 10 s; default 0.25 s."},"bridge":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Pauses shorter than this stay ducked; default 1 s."},"duck_milli":{"description":"Music gain during speech, in milli-units of each clip's gain (1000 = unchanged), 0..1000; default 250, about -12 dB.","minimum":0,"type":["integer","null"]},"input_root":{"description":"Existing directory that project media paths resolve against. Optional: defaults to the workspace.","type":"string"},"music_track_id":{"description":"Audio track whose clips are lowered while speech plays.","type":"string"},"project":{"description":"Project whose music to lower under speech; it needs placed tracks. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"release":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Ramp back up after speech ends, on the 48 kHz grid, at most 10 s; default 0.6 s."},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"threshold_db":{"description":"Speech threshold in dBFS over 10 ms windows of the voice track, -80..0; default -45.","type":["integer","null"]},"voice_track_id":{"description":"Audio track carrying speech, such as dialogue; its audio alone is analyzed.","type":"string"}},"required":["project","voice_track_id","music_track_id"],"type":"object"},"name":"cutbolt_audio_duck"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"See a source file without adding it to a project: a sheet of frames at given times or spread evenly through it, from any format FFmpeg decodes, returned as an inline image with each cell's time.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"columns":{"description":"Cells per row, 1-8; default 4.","minimum":0,"type":["integer","null"]},"count":{"description":"Evenly spread frames, 1-64, when `times` is omitted; default 16.","minimum":0,"type":["integer","null"]},"input_root":{"description":"Existing directory that must contain `path`. Optional: defaults to the workspace.","type":"string"},"output":{"description":"Path of a new .png file inside output_root; existing files are never overwritten.","type":"string"},"output_root":{"description":"Existing directory; the output must lie inside it. Optional: defaults to the workspace.","type":"string"},"path":{"description":"Video file to sample; any format FFmpeg decodes, not only timeline sources.","type":"string"},"tile_width":{"description":"Cell width in pixels, 16-480; default 192. Cell height follows the source's aspect ratio.","minimum":0,"type":["integer","null"]},"times":{"description":"1-64 source times in rational seconds, in cell order; omit to spread `count` frames evenly.","items":{"$ref":"#/$defs/Time"},"type":["array","null"]}},"required":["path","output"],"type":"object"},"name":"cutbolt_media_sheet"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Log footage: find the shot boundaries of a source file and list each shot's start, end and cut score; with output, also write a sheet of each shot's middle frame, returned as an inline image.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory that must contain `path`. Optional: defaults to the workspace.","type":"string"},"minimum_frames":{"description":"Shortest shot in frames; closer cuts are ignored. Default 6.","minimum":0,"type":["integer","null"]},"output":{"description":"New .png for a sheet of each shot's middle frame (first 64 shots); omit for the list alone.","type":["string","null"]},"output_root":{"description":"Existing directory for the optional shot sheet. Optional: defaults to the workspace.","type":["string","null"]},"path":{"description":"Video file to analyze; any format FFmpeg decodes.","type":"string"},"threshold":{"description":"Cut threshold on the 0-255 mean absolute difference of 64x36 gray frames; default 20.","maximum":255,"minimum":0,"type":["integer","null"]},"tile_width":{"description":"Sheet cell width in pixels, 16-480; default 192.","minimum":0,"type":["integer","null"]}},"required":["path"],"type":"object"},"name":"cutbolt_media_shots"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Validate a content-bound local transcript and its source identity. Report exact absolute source word times and estimated boundaries without writing files or saved state.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"document":{"description":"Transcript document as returned by transcript.transcribe or transcript.correct. Abbreviated; cutbolt_schema {\"name\":\"transcript\"} returns it.","type":"object"},"input_root":{"description":"Existing directory containing the transcript's bound source media. Optional: defaults to the workspace.","type":"string"}},"required":["document"],"type":"object"},"name":"cutbolt_transcript_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Return a new transcript revision from explicit word text and timing corrections, preserving source and recognition provenance. Requires the expected document fingerprint; no files or saved state change.","inputSchema":{"$defs":{"Correction":{"additionalProperties":false,"description":"Caller-supplied word for transcript.correct; the result is marked `corrected` with no model confidence.","properties":{"end":{"$ref":"#/$defs/Time","description":"Absolute source end; after `start` and within the analysis range."},"id":{"description":"Word ID: an existing ID for `replace`, a fresh ID for `insert`.","type":"string"},"start":{"$ref":"#/$defs/Time","description":"Absolute source start, reduced rational seconds on the 48 kHz clock."},"text":{"description":"One whitespace-separated token with a letter or digit, at most 512 bytes.","type":"string"}},"required":["id","text","start","end"],"type":"object"},"Edit":{"description":"One word edit in a transcript.correct batch of 1-128, tagged by `op`.","oneOf":[{"additionalProperties":false,"description":"Replace the existing word that has the same ID.","properties":{"op":{"const":"replace","type":"string"},"word":{"$ref":"#/$defs/Correction","description":"Complete replacement word; its `id` selects the word."}},"required":["op","word"],"type":"object"},{"additionalProperties":false,"description":"Insert a new word.","properties":{"before_id":{"description":"ID of the existing word to insert before; null appends.","type":["string","null"]},"op":{"const":"insert","type":"string"},"word":{"$ref":"#/$defs/Correction","description":"New word with an unused ID."}},"required":["op","word"],"type":"object"},{"additionalProperties":false,"description":"Remove an existing word.","properties":{"id":{"description":"ID of the word to remove.","type":"string"},"op":{"const":"remove","type":"string"}},"required":["op","id"],"type":"object"}]},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"document":{"description":"Transcript document as returned by transcript.transcribe or transcript.correct. Abbreviated; cutbolt_schema {\"name\":\"transcript\"} returns it.","type":"object"},"edits":{"description":"Word text and timing corrections, applied in order.","items":{"$ref":"#/$defs/Edit"},"type":"array"},"expected_fingerprint":{"description":"Fingerprint of the supplied document as reported by transcript.inspect; a mismatch rejects the edit.","type":"string"},"input_root":{"description":"Existing directory containing the transcript's bound source media. Optional: defaults to the workspace.","type":"string"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"}},"required":["document","expected_fingerprint","edits"],"type":"object"},"name":"cutbolt_transcript_correct"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Plan selected-word cuts in a bound native media clip. Report clock rounding, estimated boundaries, collateral words and retained source spans. Returns a content-bound operation for session preview/apply; no files or saved state change.","inputSchema":{"$defs":{"Clock2":{"description":"Cut boundary clock: `video` (project frame rate) or `audio` (48 kHz samples).","enum":["video","audio"],"type":"string"},"EndPolicy":{"description":"Arrangement end after an interval edit: `keep` leaves the explicit end unchanged; `resize` adds an insert's duration, extends to an overwrite's end if later, or subtracts a ripple deletion's duration.","enum":["keep","resize"],"type":"string"},"Linked":{"description":"Linked-partner policy: `include` adds the linked partners of affected clips (whole partner tracks for interval edits); `reject_partial` fails unless the caller selects them.","enum":["include","reject_partial"],"type":"string"},"Policy2":{"description":"`reject` fails the plan; `allow_reported` proceeds and lists the affected word IDs in the result.","enum":["reject","allow_reported"],"type":"string"},"Rounding":{"description":"Boundary rounding: `strict` rejects word boundaries off the clock; `outward` widens each cut to the surrounding ticks.","enum":["strict","outward"],"type":"string"},"Spec":{"additionalProperties":false,"description":"Word-based cut request for transcript.plan, bound to one native media clip.","properties":{"clip_id":{"description":"ID of a concrete media clip (not a nested sequence) whose asset matches the transcript source identity and duration.","type":"string"},"clock":{"$ref":"#/$defs/Clock2","description":"Clock that cut boundaries must align to."},"collateral":{"$ref":"#/$defs/Policy2","description":"Policy for unselected words that rounding would cut."},"end_policy":{"$ref":"#/$defs/EndPolicy","description":"Whether the timeline end shrinks with the cut."},"estimates":{"$ref":"#/$defs/Policy2","description":"Policy for selected words whose origin is `estimated`."},"links":{"$ref":"#/$defs/Linked","description":"Linked-clip policy for the ripple delete."},"ranges":{"description":"1-128 word selections; overlapping or touching selections merge into one cut.","items":{"$ref":"#/$defs/WordRange"},"type":"array"},"rounding":{"$ref":"#/$defs/Rounding","description":"How boundaries that are off the clock are handled."},"track_ids":{"description":"Tracks to ripple-delete on; must include the bound clip's track.","items":{"type":"string"},"type":"array"},"transitions":{"$ref":"#/$defs/TransitionPolicy","description":"Handling of transitions touched by a cut."}},"required":["clip_id","track_ids","ranges","clock","rounding","estimates","collateral","links","end_policy","transitions"],"type":"object"},"TransitionPolicy":{"description":"Handling of transitions an interval edit touches: `reject_affected` fails; `remove_affected` removes each such transition entirely first.","enum":["reject_affected","remove_affected"],"type":"string"},"WordRange":{"additionalProperties":false,"description":"Inclusive selection of consecutive transcript words to cut.","properties":{"first_id":{"description":"ID of the first selected word.","type":"string"},"last_id":{"description":"ID of the last selected word; not before `first_id` in document order.","type":"string"}},"required":["first_id","last_id"],"type":"object"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"document":{"description":"Transcript document as returned by transcript.transcribe or transcript.correct. Abbreviated; cutbolt_schema {\"name\":\"transcript\"} returns it.","type":"object"},"expected_document_fingerprint":{"description":"Fingerprint of the supplied transcript as reported by transcript.inspect.","type":"string"},"expected_revision":{"description":"Must equal the supplied project's revision.","minimum":0,"type":"integer"},"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project containing the clip to cut. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"spec":{"$ref":"#/$defs/Spec","description":"The clip and the words to cut from it."}},"required":["project","document","expected_revision","expected_document_fingerprint","spec"],"type":"object"},"name":"cutbolt_transcript_plan"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"List active local capture endpoints and observed formats without starting capture or changing device settings.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{},"required":[],"type":"object"},"name":"cutbolt_audio_inputs"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Validate an explicit local input selection and recording duration without starting capture. Record through the blocking CLI/library audio.record command.","inputSchema":{"$defs":{"Input3":{"description":"Explicitly selected capture input, tagged by `type`; there is no default or fallback input.","oneOf":[{"additionalProperties":false,"description":"A capture endpoint listed by `audio.inputs`.","properties":{"id":{"description":"Endpoint ID returned by `audio.inputs`; 1..1024 bytes, no NUL.","type":"string"},"type":{"const":"endpoint","type":"string"}},"required":["type","id"],"type":"object"},{"additionalProperties":false,"description":"Windows process loopback of one live process and its descendants.","properties":{"pid":{"description":"Nonzero ID of the process to capture; it must stay alive until capture completes.","minimum":0,"type":"integer"},"type":{"const":"process","type":"string"}},"required":["type","pid"],"type":"object"}]},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"duration":{"$ref":"#/$defs/Time","description":"Recording length in rational seconds."},"input":{"$ref":"#/$defs/Input3","description":"Explicit capture endpoint or process selection, as listed by audio.inputs."}},"required":["input","duration"],"type":"object"},"name":"cutbolt_audio_record_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Inspect a bound recorded WAV and return validated native audio-track placement operations with an explicit latency shift. Apply through the existing saved-session workflow; this inspection writes no files or session state.","inputSchema":{"$defs":{"Collision":{"description":"Overlap policy on destination tracks: `reject` fails on any overlap with an existing clip; `replace_clips` removes each whole colliding clip together with its linked partners.","enum":["reject","replace_clips"],"type":"string"},"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"},"Shift":{"additionalProperties":false,"description":"Time offset given as a direction and a nonnegative magnitude.","properties":{"amount":{"$ref":"#/$defs/Time","description":"Offset size in rational seconds; zero is allowed. Resulting times must stay aligned to each track's clock."},"backward":{"description":"True moves earlier (subtracts `amount`); false moves later.","type":"boolean"}},"required":["backward","amount"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"asset_id":{"description":"New asset ID for the recording; 1..128 bytes, not blank.","type":"string"},"clip_id":{"description":"New clip ID for the placed take; 1..128 bytes, not blank.","type":"string"},"collision":{"$ref":"#/$defs/Collision","description":"Policy when the placed clip overlaps existing clips on the track."},"compensation":{"$ref":"#/$defs/Shift","description":"Exact latency correction added to `start` (sample-aligned); `backward: true` moves the take earlier."},"input_root":{"description":"Directory that must contain `source.path`. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to place into. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"sequence_id":{"description":"Child sequence that owns the track; null to use the project's top-level tracks.","type":["string","null"]},"source":{"$ref":"#/$defs/Identity","description":"Recorded WAV from the `audio.record` receipt: path, SHA-256 hex and byte count."},"start":{"$ref":"#/$defs/Time","description":"Uncompensated placement time, rational seconds on the 48 kHz grid."},"track_id":{"description":"ID of an existing audio track; 1..128 bytes.","type":"string"}},"required":["project","source","asset_id","clip_id","track_id","start","compensation","collision"],"type":"object"},"name":"cutbolt_audio_record_place"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Evaluate a bounded local PCM cleanup recipe using explicitly selected noise-only regions, optional DC removal and ordered effects. Reports noise profiles, unchanged sample timing, PCM identity and meters without writing. Run audio.repair.render through CLI/library to publish a new WAV.","inputSchema":{"$defs":{"Effect2":{"description":"One EQ or compression stage, tagged by `type`, for mix masters, buses and repair recipes. All values must be finite.","oneOf":[{"additionalProperties":false,"description":"Two-pole low-pass filter.","properties":{"frequency_hz":{"description":"Cutoff frequency in Hz, 20..20000.","type":"number"},"q":{"description":"Filter Q, 0.1..20.","type":"number"},"type":{"const":"low_pass","type":"string"}},"required":["type","frequency_hz","q"],"type":"object"},{"additionalProperties":false,"description":"Two-pole high-pass filter.","properties":{"frequency_hz":{"description":"Cutoff frequency in Hz, 20..20000.","type":"number"},"q":{"description":"Filter Q, 0.1..20.","type":"number"},"type":{"const":"high_pass","type":"string"}},"required":["type","frequency_hz","q"],"type":"object"},{"additionalProperties":false,"description":"Two-pole peaking EQ band.","properties":{"frequency_hz":{"description":"Center frequency in Hz, 20..20000.","type":"number"},"gain_db":{"description":"Band gain in dB, -24..24.","type":"number"},"q":{"description":"Filter Q, 0.1..20.","type":"number"},"type":{"const":"peaking","type":"string"}},"required":["type","frequency_hz","q","gain_db"],"type":"object"},{"additionalProperties":false,"description":"Hard-knee peak compressor; detection is linked across all channels.","properties":{"attack_ms":{"description":"Attack time in milliseconds, 0..1000; 0 applies the reduction immediately.","type":"number"},"makeup_db":{"description":"Makeup gain in dB applied after reduction, 0..24.","type":"number"},"ratio":{"description":"Compression ratio, 1..20.","type":"number"},"release_ms":{"description":"Release time in milliseconds, 0..5000.","type":"number"},"threshold_db":{"description":"Threshold in dBFS, -60..0.","type":"number"},"type":{"const":"compressor","type":"string"}},"required":["type","threshold_db","ratio","attack_ms","release_ms","makeup_db"],"type":"object"}]},"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"},"Noise":{"additionalProperties":false,"description":"Fixed-profile spectral noise suppression learned from declared noise-only regions.","properties":{"floor_milli":{"default":100,"description":"Minimum amplitude gain per bin, 0..1000 (1000 bypasses); default 100.","minimum":0,"type":"integer"},"regions":{"description":"1..8 non-overlapping regions inside the source, at most 10 seconds combined.","items":{"$ref":"#/$defs/Region"},"type":"array"},"strength_milli":{"default":1250,"description":"Noise-power subtraction scale, 0..3000 (1000 subtracts the estimate once; 0 bypasses); default 1250.","minimum":0,"type":"integer"}},"required":["regions"],"type":"object"},"Recipe2":{"additionalProperties":false,"description":"Dialogue-repair recipe (`pcm-dialogue-repair-v1`) for a 48 kHz mono or stereo PCM16 WAV; output keeps the selected sample count and layout.","properties":{"duration":{"$ref":"#/$defs/Time","description":"Output length, rational seconds on the 48 kHz grid; 1 sample to 60 seconds, inside the source."},"effects":{"description":"Ordered EQ/compression run after rounding, at most 8; default empty.","items":{"$ref":"#/$defs/Effect2"},"type":"array"},"id":{"description":"Recipe ID, 1..128 bytes, not blank.","type":"string"},"noise":{"anyOf":[{"$ref":"#/$defs/Noise"},{"type":"null"}],"description":"Optional spectral noise suppression; omit to skip it."},"remove_dc":{"default":false,"description":"Subtract each channel's mean over the output after suppression; default false.","type":"boolean"},"schema_version":{"description":"Recipe schema version; must be 1.","minimum":0,"type":"integer"},"source":{"$ref":"#/$defs/Identity","description":"Source WAV: path relative to `input_root`, lowercase SHA-256 hex and byte count, at most 64 MiB."},"source_in":{"$ref":"#/$defs/Time","description":"Start of the repaired range in the source, rational seconds on the 48 kHz grid."}},"required":["schema_version","id","source","source_in","duration"],"type":"object"},"Region":{"additionalProperties":false,"description":"Caller-declared noise-only interval of the original source, used to learn the noise profile.","properties":{"duration":{"$ref":"#/$defs/Time","description":"Length, rational seconds on the 48 kHz grid; at least 4096 samples."},"start":{"$ref":"#/$defs/Time","description":"Start in the original source (not the output), rational seconds on the 48 kHz grid."}},"required":["start","duration"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"recipe":{"$ref":"#/$defs/Recipe2","description":"Cleanup recipe: bound PCM source, output and noise-only ranges, and processing settings."}},"required":["recipe"],"type":"object"},"name":"cutbolt_audio_repair_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Measure declared camera patches and return editable motion compensation, cut-aware smoothing and explicit crop decisions without writing files.","inputSchema":{"$defs":{"Crop":{"description":"Border handling for the corrected image, tagged by `mode`.","oneOf":[{"additionalProperties":false,"description":"Keep zoom at 1000; moving edges may reveal the backdrop.","properties":{"mode":{"const":"preserve","type":"string"}},"required":["mode"],"type":"object"},{"additionalProperties":false,"description":"Use the smallest constant zoom that keeps the viewport inside every source frame.","properties":{"maximum_zoom_milli":{"description":"Largest accepted zoom, 1000..4000; if none fits, inspection fails with `STABILIZATION_CROP_LIMIT`.","minimum":0,"type":"integer"},"mode":{"const":"zoom","type":"string"}},"required":["mode","maximum_zoom_milli"],"type":"object"}]},"Model":{"description":"Camera motion model: `translation` fits shift only; `rigid` fits shift plus roll about the crop center.","enum":["translation","rigid"],"type":"string"},"Sampling2":{"description":"Source sampling filter: `nearest` (containing source pixel) or `bilinear` (four neighboring pixel centers).","enum":["nearest","bilinear"],"type":"string"},"Segment2":{"additionalProperties":false,"description":"Measurement segment beginning at a declared cut, with its own reference patches; smoothing never crosses segments.","properties":{"regions":{"description":"3..8 stationary background patches `[x, y, width, height]` in source-canvas pixels, sides 4..64, inside the canvas; centers must span a triangle of at least 64 square pixels.","items":{"items":{"minimum":0,"type":"integer"},"maxItems":4,"minItems":4,"type":"array"},"type":"array"},"start":{"$ref":"#/$defs/Time","description":"Layer-local start, frame-aligned rational seconds at 25 fps; increasing, the first is zero."}},"required":["start","regions"],"type":"object"},"Smoothing":{"description":"Target camera path within each segment, tagged by `mode`.","oneOf":[{"additionalProperties":false,"description":"Hold each segment's initial pose.","properties":{"mode":{"const":"lock","type":"string"}},"required":["mode"],"type":"object"},{"additionalProperties":false,"description":"Follow a triangular moving average of the measured path.","properties":{"mode":{"const":"smooth","type":"string"},"radius":{"description":"Half-window in frames, 1..32; truncated at segment boundaries.","maximum":255,"minimum":0,"type":"integer"}},"required":["mode","radius"],"type":"object"}]},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]},"Tracking":{"additionalProperties":false,"description":"Patch-tracking controls applied to every tracked patch.","properties":{"maximum_acceleration":{"description":"Maximum Euclidean change in step between frames in pixels, 1..64.","minimum":0,"type":"integer"},"maximum_frame_change_milli":{"description":"Maximum normalized mean absolute frame-to-frame change, 1..1000 milli.","maximum":65535,"minimum":0,"type":"integer"},"maximum_step":{"description":"Maximum Euclidean displacement between consecutive frames in pixels, 1..`search_radius`.","minimum":0,"type":"integer"},"minimum_correlation_milli":{"description":"Minimum normalized correlation of a match, 850..1000 milli.","maximum":65535,"minimum":0,"type":"integer"},"minimum_margin_milli":{"description":"Minimum score margin over the next distinct peak, 20..1000 milli.","maximum":65535,"minimum":0,"type":"integer"},"search_radius":{"description":"Search radius in pixels around the previous accepted integer location, 1..32.","minimum":0,"type":"integer"}},"required":["search_radius","maximum_step","maximum_acceleration","minimum_correlation_milli","minimum_margin_milli","maximum_frame_change_milli"],"type":"object"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"crop":{"$ref":"#/$defs/Crop","description":"Border handling."},"input_root":{"description":"Directory containing the scene's bound source files. Optional: defaults to the workspace.","type":"string"},"layer_id":{"description":"ID of an image layer with 2..128 active frames at 25 fps and no existing compensation.","type":"string"},"maximum_fit_error_milli":{"description":"Maximum RMS patch-center fit error per frame in millipixels, 1..2000.","minimum":0,"type":"integer"},"maximum_roll_mdeg":{"description":"Maximum measured roll relative to the segment's first frame in millidegrees, 0..15000.","minimum":0,"type":"integer"},"model":{"$ref":"#/$defs/Model","description":"Camera motion model."},"sampling":{"$ref":"#/$defs/Sampling2","description":"Sampler written to the returned spatial transform."},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"scene":{"description":"Complete scene containing the layer. Abbreviated; cutbolt_schema {\"name\":\"scene\"} returns it.","type":"object"},"segments":{"description":"1..16 measurement segments, each covering at least two frames.","items":{"$ref":"#/$defs/Segment2"},"type":"array"},"smoothing":{"$ref":"#/$defs/Smoothing","description":"Target camera path."},"strength_milli":{"description":"Blend from the measured path (0) to the target path (1000), 0..1000.","maximum":65535,"minimum":0,"type":"integer"},"tracking":{"$ref":"#/$defs/Tracking","description":"Patch-tracking controls."}},"required":["scene","layer_id","model","segments","tracking","maximum_fit_error_milli","maximum_roll_mdeg","smoothing","strength_milli","crop","sampling"],"type":"object"},"name":"cutbolt_stabilization_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Inspect explicit subject boxes or local tracking and return every constrained crop decision plus an editable scene without writing files or saved state.","inputSchema":{"$defs":{"BoxKey":{"additionalProperties":false,"description":"Keyframe of an authored subject box.","properties":{"interpolation":{"$ref":"#/$defs/Interpolation2","description":"Interpolation from this key to the next."},"rect":{"description":"Subject box `[x, y, width, height]` in source-canvas pixels; positive size, inside the canvas.","items":{"type":"integer"},"maxItems":4,"minItems":4,"type":"array"},"time":{"$ref":"#/$defs/Time","description":"Segment-local time, rational seconds; keys must lie within the segment."}},"required":["time","rect","interpolation"],"type":"object"},"Interpolation2":{"description":"Interpolation from a key to the next: `hold` keeps the value, `linear`, or quadratic `ease_in`, `ease_out`, `ease_in_out` without overshoot.","enum":["hold","linear","ease_in","ease_out","ease_in_out"],"type":"string"},"Sampling2":{"description":"Source sampling filter: `nearest` (containing source pixel) or `bilinear` (four neighboring pixel centers).","enum":["nearest","bilinear"],"type":"string"},"Segment3":{"additionalProperties":false,"description":"Subject segment covering frames from `start` to the next segment start or scene end.","properties":{"cut":{"description":"Reset crop smoothing and movement limits at `start`; the segment at time zero must set true.","type":"boolean"},"selection":{"$ref":"#/$defs/Selection","description":"How the subject boxes are obtained."},"start":{"$ref":"#/$defs/Time","description":"Scene time, frame-aligned rational seconds at 25 fps, before the scene end; unique, one must be zero."},"subject_id":{"description":"Subject label, 1..64 ASCII letters, digits, `_` or `-`.","type":"string"}},"required":["start","subject_id","cut","selection"],"type":"object"},"Selection":{"description":"How a segment's subject boxes are obtained, tagged by `mode`.","oneOf":[{"additionalProperties":false,"description":"Authored boxes interpolated over the segment.","properties":{"keys":{"description":"1..128 keys, including one at segment time zero.","items":{"$ref":"#/$defs/BoxKey"},"type":"array"},"mode":{"const":"manual","type":"string"}},"required":["mode","keys"],"type":"object"},{"additionalProperties":false,"description":"Translate a fixed focus box by a tracked patch's measured integer displacement; needs at least two frames.","properties":{"controls":{"$ref":"#/$defs/Tracking","description":"Patch-tracking controls."},"focus":{"description":"Subject box `[x, y, width, height]` at the segment start, in source-canvas pixels; with padding it must fit the canvas.","items":{"type":"integer"},"maxItems":4,"minItems":4,"type":"array"},"mode":{"const":"track","type":"string"},"region":{"description":"Reference patch `[x, y, width, height]` inside `focus`, sides 4..64 pixels.","items":{"minimum":0,"type":"integer"},"maxItems":4,"minItems":4,"type":"array"}},"required":["mode","focus","region","controls"],"type":"object"}]},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]},"Tracking":{"additionalProperties":false,"description":"Patch-tracking controls applied to every tracked patch.","properties":{"maximum_acceleration":{"description":"Maximum Euclidean change in step between frames in pixels, 1..64.","minimum":0,"type":"integer"},"maximum_frame_change_milli":{"description":"Maximum normalized mean absolute frame-to-frame change, 1..1000 milli.","maximum":65535,"minimum":0,"type":"integer"},"maximum_step":{"description":"Maximum Euclidean displacement between consecutive frames in pixels, 1..`search_radius`.","minimum":0,"type":"integer"},"minimum_correlation_milli":{"description":"Minimum normalized correlation of a match, 850..1000 milli.","maximum":65535,"minimum":0,"type":"integer"},"minimum_margin_milli":{"description":"Minimum score margin over the next distinct peak, 20..1000 milli.","maximum":65535,"minimum":0,"type":"integer"},"search_radius":{"description":"Search radius in pixels around the previous accepted integer location, 1..32.","minimum":0,"type":"integer"}},"required":["search_radius","maximum_step","maximum_acceleration","minimum_correlation_milli","minimum_margin_milli","maximum_frame_change_milli"],"type":"object"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Directory containing the scene's bound source files. Optional: defaults to the workspace.","type":"string"},"maximum_step":{"description":"Maximum crop-origin movement per frame `[x, y]` in source pixels, each 1..4096.","items":{"minimum":0,"type":"integer"},"maxItems":2,"minItems":2,"type":"array"},"output_size":{"description":"Logical output `[width, height]` in pixels, each 1..512.","items":{"minimum":0,"type":"integer"},"maxItems":2,"minItems":2,"type":"array"},"padding":{"description":"Margin added on every side of each subject box in source pixels, 0..4096.","minimum":0,"type":"integer"},"sampling":{"$ref":"#/$defs/Sampling2","description":"Sampler written to the returned spatial fit."},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"scene":{"description":"Scene with exactly one full-duration, untransformed image layer starting at zero; 1..128 frames at 25 fps. Abbreviated; cutbolt_schema {\"name\":\"scene\"} returns it.","type":"object"},"segments":{"description":"1..16 subject segments; input order does not matter.","items":{"$ref":"#/$defs/Segment3"},"type":"array"},"smoothing_radius":{"description":"Triangular smoothing half-window in frames, 0..16; 0 disables smoothing.","maximum":255,"minimum":0,"type":"integer"},"window":{"description":"Crop window `[width, height]` in source pixels; fits the canvas and has exactly the `output_size` aspect ratio.","items":{"minimum":0,"type":"integer"},"maxItems":2,"minItems":2,"type":"array"}},"required":["scene","window","output_size","padding","maximum_step","smoothing_radius","sampling","segments"],"type":"object"},"name":"cutbolt_reframe_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Measure a bounded source patch trajectory and return an editable masked scene; reject uncertain matches without writing files.","inputSchema":{"$defs":{"Curve":{"additionalProperties":false,"description":"Keyframed integer property on the owning layer or clip clock. Endpoint values hold outside the keys; samples round to nearest.","properties":{"keys":{"description":"1..128 keys in any order; equal times, including equivalent fractions, are rejected.","items":{"$ref":"#/$defs/Keyframe"},"type":"array"},"retime":{"anyOf":[{"$ref":"#/$defs/Retime"},{"type":"null"}],"description":"Optional delay, speed and direction for evaluating the keys; omit to use key times as authored."}},"required":["keys"],"type":"object"},"Feather":{"additionalProperties":false,"description":"Linear soft edge for a layer mask, with square corners.","properties":{"edge":{"$ref":"#/$defs/FeatherEdge","description":"Ramp placement relative to the rectangle edge."},"radius":{"description":"Ramp width in source pixels, 1..4096.","maximum":65535,"minimum":0,"type":"integer"}},"required":["radius","edge"],"type":"object"},"FeatherEdge":{"description":"Feather ramp placement: `inner` fades in inside the edge, `centered` straddles it, `outer` fades out beyond it.","enum":["inner","centered","outer"],"type":"string"},"Interpolation2":{"description":"Interpolation from a key to the next: `hold` keeps the value, `linear`, or quadratic `ease_in`, `ease_out`, `ease_in_out` without overshoot.","enum":["hold","linear","ease_in","ease_out","ease_in_out"],"type":"string"},"Keyframe":{"additionalProperties":false,"description":"One curve key.","properties":{"interpolation":{"$ref":"#/$defs/Interpolation2","description":"Interpolation toward the next key; unused on the last key."},"time":{"$ref":"#/$defs/Time","description":"Owner-clock rational seconds, 0..source duration for native clip effects or 0..layer duration for scenes; reduced denominator at most 1,000,000."},"value":{"description":"Integer property value within the animated property's range.","type":"integer"}},"required":["time","value","interpolation"],"type":"object"},"MaskAnimation":{"additionalProperties":false,"description":"Keyframe curves overriding mask rectangle components; declare at least one.","properties":{"height":{"anyOf":[{"$ref":"#/$defs/Curve"},{"type":"null"}],"description":"Curve for the height in source pixels, 0..32768."},"width":{"anyOf":[{"$ref":"#/$defs/Curve"},{"type":"null"}],"description":"Curve for the width in source pixels, 0..32768."},"x":{"anyOf":[{"$ref":"#/$defs/Curve"},{"type":"null"}],"description":"Curve for the left edge in source pixels, -32768..32768."},"y":{"anyOf":[{"$ref":"#/$defs/Curve"},{"type":"null"}],"description":"Curve for the top edge in source pixels, -32768..32768."}},"type":"object"},"Model2":{"description":"Tracking motion model; only `translation` (integer-pixel patch displacement) is supported.","enum":["translation"],"type":"string"},"RectMask":{"additionalProperties":false,"description":"Rectangle limiting layer opacity, in source-canvas pixels before crop and transform.","properties":{"animation":{"anyOf":[{"$ref":"#/$defs/MaskAnimation"},{"type":"null"}],"description":"Optional curves overriding rectangle components on the owning layer or clip clock (scene-local or native source time)."},"feather":{"anyOf":[{"$ref":"#/$defs/Feather"},{"type":"null"}],"description":"Optional soft edge; omit for a hard edge."},"inverted":{"default":false,"description":"Keep pixels outside the rectangle instead; default false.","type":"boolean"},"rect":{"description":"`[x, y, width, height]`; x/y -32768..32768, size 0..32768; may extend outside the canvas.","items":{"type":"integer"},"maxItems":4,"minItems":4,"type":"array"}},"required":["rect"],"type":"object"},"Retime":{"additionalProperties":false,"description":"Changes when and how fast a curve's keys play, without moving the layer or retiming source frames.","properties":{"rate":{"$ref":"#/$defs/Time","description":"Positive rational speed multiplier, 1/16..16; denominators reduce to at most 1,000,000."},"reverse":{"default":false,"description":"Play the keys from last to first; default false.","type":"boolean"},"start":{"$ref":"#/$defs/Time","description":"Owner-clock rational seconds, at most the source duration for native clips or layer duration for scenes; until then the first key holds (last when reversed)."}},"required":["start","rate"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Directory containing the scene's relative image paths. Optional: defaults to the workspace.","type":"string"},"layer_id":{"description":"ID of an image-frame layer with 2..=128 active frames at 25 fps; graphics and tilemap layers reject.","type":"string"},"mask":{"$ref":"#/$defs/RectMask","description":"Static rectangle mask (no `animation`), optionally feathered; returned with hold x/y curves following the patch."},"maximum_acceleration":{"description":"Maximum Euclidean change between consecutive steps in pixels, 1..=64.","minimum":0,"type":"integer"},"maximum_frame_change_milli":{"description":"Cut threshold: maximum mean absolute luminance change over the canvas, in thousandths of 255, 1..=1000.","maximum":65535,"minimum":0,"type":"integer"},"maximum_step":{"description":"Maximum Euclidean move between consecutive frames in pixels, 1..=`search_radius`.","minimum":0,"type":"integer"},"minimum_correlation_milli":{"description":"Minimum normalized correlation with the fixed initial patch, in thousandths, 850..=1000.","maximum":65535,"minimum":0,"type":"integer"},"minimum_margin_milli":{"description":"Minimum correlation lead over every other candidate, in thousandths, 20..=1000.","maximum":65535,"minimum":0,"type":"integer"},"model":{"$ref":"#/$defs/Model2","description":"Motion model."},"region":{"description":"Initial reference patch `[x, y, width, height]` in source canvas pixels before effects and transforms; width/height 4..=64, inside the canvas.","items":{"minimum":0,"type":"integer"},"maxItems":4,"minItems":4,"type":"array"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"scene":{"description":"Scene recipe containing the tracked layer; validated before and after analysis. Abbreviated; cutbolt_schema {\"name\":\"scene\"} returns it.","type":"object"},"search_radius":{"description":"Search distance in pixels around the previous accepted position, 1..=32.","minimum":0,"type":"integer"}},"required":["scene","layer_id","model","region","search_radius","maximum_step","maximum_acceleration","minimum_correlation_milli","minimum_margin_milli","maximum_frame_change_milli","mask"],"type":"object"},"name":"cutbolt_tracking_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Inspect identity-bound reference assets using declared timecode or bounded audio correlation windows. Report exact clock mapping, confidence, drift and source-preserving correction recipes. Read-only; run returned media.conform recipes explicitly to new outputs, then register their bound assets for multicam editing.","inputSchema":{"$defs":{"Method2":{"description":"How the clock mapping is obtained, tagged by `mode`.","oneOf":[{"additionalProperties":false,"description":"Estimate offset and constant drift by correlating audio in declared windows.","properties":{"candidate_channel":{"description":"Candidate source channel, 0 (left) or 1 (right).","maximum":255,"minimum":0,"type":"integer"},"maximum_drift_ppm":{"description":"Maximum accepted clock drift in parts per million, 0..5000.","minimum":0,"type":"integer"},"maximum_residual_samples":{"description":"Maximum disagreement of any window with the fitted linear clock, 0..16 samples.","minimum":0,"type":"integer"},"minimum_correlation_milli":{"description":"Minimum peak correlation per window, 500..1000 milli.","maximum":65535,"minimum":0,"type":"integer"},"minimum_margin_milli":{"description":"Minimum lead of the best peak over the next separated peak, 1..1000 milli.","maximum":65535,"minimum":0,"type":"integer"},"mode":{"const":"audio","type":"string"},"polarity":{"$ref":"#/$defs/Polarity","description":"Accepted correlation sign."},"reference_channel":{"description":"Reference source channel, 0 (left) or 1 (right).","maximum":255,"minimum":0,"type":"integer"},"windows":{"description":"3..8 windows; reference centers must be distinct and span at least one second.","items":{"$ref":"#/$defs/Window"},"type":"array"}},"required":["mode","windows","reference_channel","candidate_channel","polarity","minimum_correlation_milli","minimum_margin_milli","maximum_drift_ppm","maximum_residual_samples"],"type":"object"},{"additionalProperties":false,"description":"Align by declared equal-rate clock labels; drift is not measured.","properties":{"candidate":{"$ref":"#/$defs/Stamp","description":"Clock label in the candidate source."},"mode":{"const":"timecode","type":"string"},"reference":{"$ref":"#/$defs/Stamp","description":"Clock label in the reference source."}},"required":["mode","reference","candidate"],"type":"object"}]},"Polarity":{"description":"Accepted correlation sign: `same` requires positive correlation; `either` also accepts inverted polarity, which is reported but not corrected.","enum":["same","either"],"type":"string"},"Rounding2":{"description":"Mapped candidate start policy: `reject` requires an exactly sample-aligned start; `nearest_sample` rounds to the nearest 48 kHz sample, half ties upward.","enum":["reject","nearest_sample"],"type":"string"},"Stamp":{"additionalProperties":false,"description":"Declared 25 fps non-drop clock label at one position in a source.","properties":{"day":{"description":"Explicit day number, 0..1000000; midnight wrap is never inferred.","minimum":0,"type":"integer"},"label":{"description":"Clock label `HH:MM:SS:FF`: hours 0..23, minutes and seconds 0..59, frames 0..24.","type":"string"},"media_at":{"$ref":"#/$defs/Time","description":"In-source position the label names, frame-aligned rational seconds at 25 fps, inside the source."}},"required":["day","label","media_at"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]},"Window":{"additionalProperties":false,"description":"Audio search window pairing approximate positions of one distinctive event in both sources; the full search interval must fit each source.","properties":{"candidate_center":{"$ref":"#/$defs/Time","description":"Approximate matching position in the candidate source, rational seconds on the 48 kHz grid."},"length":{"$ref":"#/$defs/Time","description":"Correlation window length, an even 2048..8192 samples, as rational seconds."},"reference_center":{"$ref":"#/$defs/Time","description":"Window center in the reference source, rational seconds on the 48 kHz grid."},"search_radius":{"$ref":"#/$defs/Time","description":"Lag searched either side of `candidate_center`, 32..48000 samples, as rational seconds."}},"required":["reference_center","candidate_center","length","search_radius"],"type":"object"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"candidate_asset_id":{"description":"ID of the asset to align, with the same source profile.","type":"string"},"duration":{"$ref":"#/$defs/Time","description":"Interval length, frame-aligned at 25 fps, 1..1500 frames."},"id":{"description":"Alignment ID used to name the returned recipes; 1..100 bytes, not blank.","type":"string"},"input_root":{"description":"Directory containing both asset files. Optional: defaults to the workspace.","type":"string"},"method":{"$ref":"#/$defs/Method2","description":"Audio-correlation or declared-timecode method."},"project":{"description":"Project at 25 fps that contains both content-bound assets. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"reference_asset_id":{"description":"ID of the reference asset in `project.assets`; 25 fps video with 48 kHz stereo PCM16, at most 60 seconds.","type":"string"},"rounding":{"$ref":"#/$defs/Rounding2","description":"Rounding policy for the mapped candidate start."},"start":{"$ref":"#/$defs/Time","description":"Interval start on the reference clock, frame-aligned rational seconds at 25 fps."}},"required":["id","project","reference_asset_id","candidate_asset_id","start","duration","rounding","method"],"type":"object"},"name":"cutbolt_sync_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Inspect an identity-bound high-bit-depth/HDR conversion recipe, explicit color and display interpretation, tone policy and exact frame mapping. Read-only; hdr.conform writes a separate HDR intermediate or SDR editing asset through CLI/library calls.","inputSchema":{"$defs":{"Audio":{"description":"Audio policy: `resample` linearly resamples source audio (pitch follows speed); `mute` writes exact silence and is required for reverse or freeze.","enum":["resample","mute"],"type":"string"},"Depth":{"description":"Output sample depth: `rgb16` keeps HDR or wide gamut; `rgb8` requires SDR BT.709 output and returns a timeline asset.","enum":["rgb8","rgb16"],"type":"string"},"Display":{"additionalProperties":false,"description":"Declared display luminance used to interpret or encode values; not measured from content.","properties":{"black_millinits":{"description":"Black level in millinits (5 is 0.005 nit), 0 to 1000 and below the peak.","minimum":0,"type":"integer"},"peak_nits":{"description":"Peak luminance in nits, 48 to 10000; SDR at most 400, HLG 400 to 2000.","minimum":0,"type":"integer"}},"required":["peak_nits","black_millinits"],"type":"object"},"Encoding":{"additionalProperties":false,"description":"Declared transfer, primaries and display of a signal.","properties":{"display":{"$ref":"#/$defs/Display","description":"Declared display peak and black level."},"primaries":{"$ref":"#/$defs/Primaries","description":"Color primaries; PQ and HLG require `bt2020`."},"transfer":{"$ref":"#/$defs/Transfer2","description":"Transfer function of the encoded values."}},"required":["transfer","primaries","display"],"type":"object"},"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"},"Matrix2":{"description":"Source sample matrix: `rgb` (planar RGB, or bgr0 for SDR), `bt709` or `bt2020_ncl` (YUV444, non-constant luminance); a YUV matrix must match the declared primaries.","enum":["rgb","bt709","bt2020_ncl"],"type":"string"},"MissingTags":{"description":"Absent or unknown color tags: `reject` fails; `use_declared` assumes the declared values and reports them. Conflicting tags always fail.","enum":["reject","use_declared"],"type":"string"},"Output":{"additionalProperties":false,"description":"Target encoding and sample depth of an HDR conversion.","properties":{"depth":{"$ref":"#/$defs/Depth","description":"Output RGB sample depth."},"encoding":{"$ref":"#/$defs/Encoding","description":"Target transfer, primaries and display."}},"required":["encoding","depth"],"type":"object"},"Primaries":{"description":"Color primaries with D65 white: `bt709` or `bt2020`.","enum":["bt709","bt2020"],"type":"string"},"Range":{"description":"Code range: `full` (0-255 at 8 bits) or `limited` (luma 16-235, chroma 16-240 at 8 bits, scaled for higher depths).","enum":["full","limited"],"type":"string"},"Recipe3":{"additionalProperties":false,"description":"HDR conversion recipe for hdr.inspect and hdr.conform; writes a tagged 25 fps FFV1/PCM16 MKV. Every field is required.","properties":{"audio":{"$ref":"#/$defs/Audio","description":"Audio policy; reverse and freeze require `mute`."},"duration":{"$ref":"#/$defs/Time","description":"Output duration in rational seconds; whole 25 fps frames, 1 to 1500 frames."},"exposure_milliev":{"description":"Exposure gain on absolute light in milli-EV, -8000 to 8000 (1000 is one stop).","type":"integer"},"freeze":{"description":"Hold `source_in` for every frame; requires unit `rate`, `reverse: false` and `audio: mute`.","type":"boolean"},"height":{"description":"Output height in pixels; at most 2160 and 8M pixels in total.","minimum":0,"type":"integer"},"id":{"description":"Asset ID for the asset returned by RGB8 output (1-128 bytes, not blank).","type":"string"},"output":{"$ref":"#/$defs/Output","description":"Target encoding and depth."},"rate":{"$ref":"#/$defs/Time","description":"Constant speed factor from 1/16 to 16; must be 1 with `freeze`."},"reverse":{"description":"Play backwards from `source_in`; requires `audio: mute`.","type":"boolean"},"schema_version":{"description":"Recipe format version; must be 1.","minimum":0,"type":"integer"},"source":{"$ref":"#/$defs/Source3","description":"Source file and its declared interpretation."},"source_in":{"$ref":"#/$defs/Time","description":"Source position in rational seconds at output time zero; on a 48 kHz sample when `audio` is resample."},"tone":{"$ref":"#/$defs/Tone","description":"Tone-mapping policy; HDR to SDR needs `clip` or `reinhard`."},"width":{"description":"Output width in pixels; at most 4096 and 8M pixels in total.","minimum":0,"type":"integer"}},"required":["schema_version","id","source","output","source_in","duration","rate","reverse","freeze","width","height","exposure_milliev","tone","audio"],"type":"object"},"Source3":{"additionalProperties":false,"description":"Identity-bound HDR or high-bit-depth source (25 fps FFV1 with 48 kHz stereo PCM16 in MKV) and its declared interpretation.","properties":{"encoding":{"$ref":"#/$defs/Encoding","description":"Declared transfer, primaries and display of the source values."},"file":{"$ref":"#/$defs/Identity","description":"Source file identity; path relative to `input_root`."},"matrix":{"$ref":"#/$defs/Matrix2","description":"Sample matrix of the stored pixels."},"missing_tags":{"$ref":"#/$defs/MissingTags","description":"Policy for absent or unknown color tags."},"range":{"$ref":"#/$defs/Range","description":"Code range, scaled to the native bit depth."}},"required":["file","encoding","matrix","range","missing_tags"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]},"Tone":{"description":"Tone-mapping policy applied after exposure and gamut conversion, tagged by `mode`.","oneOf":[{"additionalProperties":false,"description":"Keep absolute light; not allowed for HDR to SDR conversion.","properties":{"mode":{"const":"preserve","type":"string"}},"required":["mode"],"type":"object"},{"additionalProperties":false,"description":"Divide by reference white, clamp to 1 and scale to the target peak; SDR output only.","properties":{"mode":{"const":"clip","type":"string"},"reference_white_nits":{"description":"Source luminance in nits mapped to the target display peak, 48 to 1000.","minimum":0,"type":"integer"}},"required":["mode","reference_white_nits"],"type":"object"},{"additionalProperties":false,"description":"Global extended Reinhard curve on max(R,G,B); SDR output only.","properties":{"mode":{"const":"reinhard","type":"string"},"reference_white_nits":{"description":"Luminance in nits that normalizes the curve input (x = max(R,G,B)/white), 48 to 1000.","minimum":0,"type":"integer"},"source_peak_nits":{"description":"Source luminance in nits mapped to the target display peak, from reference white to 10000.","minimum":0,"type":"integer"}},"required":["mode","reference_white_nits","source_peak_nits"],"type":"object"}]},"Transfer2":{"description":"Transfer function: `pq` and `hlg` (HDR, BT.2020 primaries required), `srgb` or `bt709` (SDR, relative to display peak).","enum":["pq","hlg","srgb","bt709"],"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"recipe":{"$ref":"#/$defs/Recipe3","description":"Conversion recipe: bound source, color and display interpretation, tone policy and frame mapping."}},"required":["recipe"],"type":"object"},"name":"cutbolt_hdr_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Read an identity-bound bounded .cube LUT, report its domains/interpolation and evaluate up to 256 sample colors. Read-only. Apply the LUT through media.conform with explicit SDR normalization.","inputSchema":{"$defs":{"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"},"Interpolation":{"description":"LUT sampling: `nearest` (1D or 3D), `linear` (1D only), `trilinear` or `tetrahedral` (3D only).","enum":["nearest","linear","trilinear","tetrahedral"],"type":"string"},"Transform":{"additionalProperties":false,"description":"Identity-bound .cube LUT (one 1D or 3D table) applied to encoded working-transfer RGB.","properties":{"file":{"$ref":"#/$defs/Identity","description":"Table file identity; `.cube` path relative to `input_root`, at most 8 MiB."},"interpolation":{"$ref":"#/$defs/Interpolation","description":"Sampling method; must suit the table's dimensionality."}},"required":["file","interpolation"],"type":"object"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"samples":{"default":[],"description":"Up to 256 RGB input colors to evaluate through the table; omit for none.","items":{"items":{"type":"number"},"maxItems":3,"minItems":3,"type":"array"},"type":"array"},"transform":{"$ref":"#/$defs/Transform","description":"Identity-bound .cube file and its interpolation."}},"required":["transform"],"type":"object"},"name":"cutbolt_lut_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Compute exact per-channel/luma histograms, waveform/parade and a chroma vectorscope for one full-quality timeline frame. Explicit color interpretation and missing-tag policy required; proxy selection is ignored. No files or saved state change.","inputSchema":{"$defs":{"MissingTags":{"description":"Absent or unknown color tags: `reject` fails; `use_declared` assumes the declared values and reports them. Conflicting tags always fail.","enum":["reject","use_declared"],"type":"string"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]},"Transfer":{"description":"SDR transfer function of encoded RGB or YUV values: `srgb` (sRGB piecewise curve) or `bt709` (BT.709 OETF).","enum":["srgb","bt709"],"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"columns":{"description":"Horizontal waveform bins, 1 to min(width, 256).","format":"uint","minimum":0,"type":"integer"},"input_root":{"description":"Existing directory that project media paths resolve against. Optional: defaults to the workspace.","type":"string"},"input_transfer":{"anyOf":[{"$ref":"#/$defs/Transfer"},{"type":"null"}],"description":"Declared transfer of the full-range RGB source values; omit to use the project's declared `transfer`."},"missing_tags":{"$ref":"#/$defs/MissingTags","description":"Policy for absent source color tags."},"project":{"description":"Project to sample; frames up to 8M pixels, originals used even if a proxy is selected. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"time":{"$ref":"#/$defs/Time","description":"Frame time in rational seconds; a frame boundary before the timeline end."}},"required":["project","time","missing_tags","columns"],"type":"object"},"name":"cutbolt_scopes_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Inspect an exact timeline range and full-quality sources for reference, lossless PNG movie/image-directory or H.264/AAC export. Lossless, H.264 and placed-track output use the project's native frame clock. PNG/H.264 video needs input_transfer unless the project declares its transfer with the project.transfer operation; sequence_first selects image numbering, h264 selects delivery controls and aac_bitrate selects audio rate. Returns timing, source identities and color/publication policy without writing. Run the export with job.start run export.run.","inputSchema":{"$defs":{"Compatibility":{"description":"H.264 stream profile: `baseline720p` (Constrained Baseline 3.1, or 3.2 above 30 fps at 720p, up to 1280x720), `main_hd` (Main 4.0, or 4.2 above 30 fps at 1080p, up to 1920x1080), `high_hd` (High, levels as Main). Dimensions must be even; no resizing.","enum":["baseline720p","main_hd","high_hd"],"type":"string"},"Gif":{"additionalProperties":false,"description":"GIF settings, only for the `gif` profile.","properties":{"plays":{"description":"Times the animation plays: omit or null to loop endlessly, 1 to play once, at most 65536.","minimum":0,"type":["integer","null"]},"timing":{"$ref":"#/$defs/GifTiming","default":"exact","description":"How frame times become whole-centisecond delays; omit for `exact`."}},"type":"object"},"GifTiming":{"description":"GIF frame timing: `exact` gives every frame the same whole number of centiseconds (4 at 25 fps,\n2 at 50 fps); `nearest_centisecond` starts each frame at its exact time rounded to the nearest\ncentisecond, for 24 and 30 fps and their 1000/1001 rates.","enum":["exact","nearest_centisecond"],"type":"string"},"H264":{"additionalProperties":false,"description":"Explicit H.264 encoder settings; omitting them selects high_hd with CRF 18, 12000000 bits/s maximum and a 24000000-bit buffer.","properties":{"compatibility":{"$ref":"#/$defs/Compatibility","description":"Stream profile and level, which bound dimensions and rates."},"rate_control":{"$ref":"#/$defs/RateControl","description":"Quality or two-pass bitrate control."}},"required":["compatibility","rate_control"],"type":"object"},"Profile":{"description":"Export profile: `reference` (FFV1/bgr0 and PCM16 `.mkv`, audio-only `.wav`), `h264_aac` (`.mp4` at the timeline's native rate, audio-only `.m4a`), `png_mov` (PNG RGB and optional PCM16 `.mov`), `png_sequence` (new `.frames` directory of numbered PNGs, manifest and optional WAV; Windows only), `gif` (animated `.gif`, video only, each frame's exact colors; a frame over 256 colors is refused).","enum":["reference","h264_aac","png_mov","png_sequence","gif"],"type":"string"},"Range2":{"additionalProperties":false,"description":"Half-open timeline interval to export; both values on project frame boundaries.","properties":{"duration":{"$ref":"#/$defs/Time","description":"Interval length in rational seconds; 1 to 180000 frames, ending inside the timeline."},"start":{"$ref":"#/$defs/Time","description":"Interval start in rational timeline seconds."}},"required":["start","duration"],"type":"object"},"RateControl":{"description":"H.264 rate control, tagged by `mode`. Maximum bitrate is 100000 to 12000000 bits/s (baseline720p) or 20000000; buffer is at least the maximum and at most 14000000 or 25000000 bits.","oneOf":[{"additionalProperties":false,"description":"Constant-quality encoding with a buffering cap.","properties":{"buffer_size":{"description":"Rate-control buffer in bits.","minimum":0,"type":"integer"},"crf":{"description":"Constant rate factor, 10 to 35; lower means higher quality and larger output.","maximum":255,"minimum":0,"type":"integer"},"maximum_bitrate":{"description":"Encoder maximum rate in bits/s.","minimum":0,"type":"integer"},"mode":{"const":"quality","type":"string"}},"required":["mode","crf","maximum_bitrate","buffer_size"],"type":"object"},{"additionalProperties":false,"description":"Two-pass encoding toward an average video bitrate.","properties":{"bitrate":{"description":"Target average video bitrate in bits/s, 100000 to `maximum_bitrate`.","minimum":0,"type":"integer"},"buffer_size":{"description":"Rate-control buffer in bits.","minimum":0,"type":"integer"},"maximum_bitrate":{"description":"Encoder maximum rate in bits/s.","minimum":0,"type":"integer"},"mode":{"const":"two_pass","type":"string"}},"required":["mode","bitrate","maximum_bitrate","buffer_size"],"type":"object"}]},"Streams":{"description":"Streams to write: `audio_video`, `video` or `audio` (48 kHz stereo); PNG profiles need video, and GIF takes `video` only.","enum":["audio_video","video","audio"],"type":"string"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]},"Transfer":{"description":"SDR transfer function of encoded RGB or YUV values: `srgb` (sRGB piecewise curve) or `bt709` (BT.709 OETF).","enum":["srgb","bt709"],"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"aac_bitrate":{"description":"AAC bitrate in bits/s, 192000, 256000 or 320000 (default); only for `h264_aac` with audio.","minimum":0,"type":["integer","null"]},"gif":{"anyOf":[{"$ref":"#/$defs/Gif"},{"type":"null"}],"description":"GIF settings, only for the `gif` profile: `plays` (omit to loop endlessly) and `timing` (omit for exact 25 or 50 fps delays)."},"h264":{"anyOf":[{"$ref":"#/$defs/H264"},{"type":"null"}],"description":"H.264 encoder settings, only for `h264_aac` with video; omit for High profile CRF 18."},"input_root":{"description":"Existing directory that project media paths resolve against. Optional: defaults to the workspace.","type":"string"},"input_transfer":{"anyOf":[{"$ref":"#/$defs/Transfer"},{"type":"null"}],"description":"Transfer of the timeline's encoded RGB values for H.264 and PNG video: for H.264, `srgb` converts to BT.709 transfer first and `bt709` passes values unchanged; PNG keeps values and tags the choice. Omit to use the project's declared `transfer`; reference, GIF and audio-only exports take none."},"output":{"description":"Unused output path inside `output_root`; extension must match the profile and streams.","type":"string"},"output_root":{"description":"Existing directory that must contain `output`. Optional: defaults to the workspace.","type":"string"},"profile":{"$ref":"#/$defs/Profile","description":"Output format profile."},"project":{"description":"Project to export; original media is always used. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"range":{"anyOf":[{"$ref":"#/$defs/Range2"},{"type":"null"}],"description":"Timeline interval to export; omit or null for the whole timeline."},"sequence_first":{"description":"First image number for `png_sequence` only (default 0); all numbers must fit six digits.","minimum":0,"type":["integer","null"]},"streams":{"$ref":"#/$defs/Streams","description":"Streams to include."}},"required":["project","output","profile","streams"],"type":"object"},"name":"cutbolt_export_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Return an independent editable scene effect chain from an original green/blue hard/soft chroma-key preset. Explicit strength and spill controls must be 0..1000. Copy effects into a layer, inspect the scene, then compile it. No files or saved state are changed.","inputSchema":{"$defs":{"Preset":{"description":"Chroma key preset: `green_soft`/`blue_soft` use thresholds 60/180, `green_hard`/`blue_hard` 100/100, keying and de-spilling pure green or blue.","enum":["green_soft","blue_soft","green_hard","blue_hard"],"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"name":{"$ref":"#/$defs/Preset","description":"Preset to return: green or blue screen, with a soft or hard edge."},"spill_milli":{"description":"Spill suppression strength from 0 to 1000.","maximum":65535,"minimum":0,"type":"integer"},"strength_milli":{"description":"Key strength from 0 to 1000, where 1000 removes the key color fully.","maximum":65535,"minimum":0,"type":"integer"}},"required":["name","strength_milli","spill_milli"],"type":"object"},"name":"cutbolt_effects_preset"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Import a bounded UTF-8 SRT or supported WebVTT file by source identity. Returns an editable caption document and exact timing/overlap inspection. Unsupported markup and settings fail explicitly; sources remain unchanged.","inputSchema":{"$defs":{"Format2":{"description":"Subtitle file format: `srt` (plain-text SRT profile) or `webvtt` (bounded WebVTT profile).","enum":["srt","webvtt"],"type":"string"},"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"},"Overlap":{"description":"Simultaneous-cue policy: `allow` keeps overlapping cues; `reject` fails validation if any cues overlap.","enum":["allow","reject"],"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"format":{"$ref":"#/$defs/Format2","description":"Format of the source file."},"id":{"description":"ID for the new caption document.","type":"string"},"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"overlap":{"$ref":"#/$defs/Overlap","description":"Whether cues may overlap in time (allow) or are rejected when they do (reject)."},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"source":{"$ref":"#/$defs/Identity","description":"Identity-bound subtitle file: path inside input_root, SHA-256 and byte count."}},"required":["source","format","id","overlap"],"type":"object"},"name":"cutbolt_captions_import"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Validate an immutable caption document and inspect exact cue timing, styles and simultaneous-cue count. No file or saved-state changes.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"document":{"description":"Caption document as returned by captions.import or captions.apply. Abbreviated; cutbolt_schema {\"name\":\"captions\"} returns it.","type":"object"}},"required":["document"],"type":"object"},"name":"cutbolt_captions_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Apply a revision-guarded atomic batch to a caller-owned caption snapshot. Add/replace/remove cues, shift exact times and edit styles/overlap policy. Returns a new document and cue diffs; does not save a session.","inputSchema":{"$defs":{"Align":{"description":"Horizontal alignment of each line's advance width inside the text box: `left`, `center` or `right`.","enum":["left","center","right"],"type":"string"},"CaptionOperation":{"description":"One caption edit for captions.apply, tagged by `op`; the final document must validate.","oneOf":[{"additionalProperties":false,"description":"Add a complete cue whose ID is not already used.","properties":{"cue":{"$ref":"#/$defs/Cue","description":"The new cue."},"op":{"const":"cue.add","type":"string"}},"required":["op","cue"],"type":"object"},{"additionalProperties":false,"description":"Replace the existing cue that has the same ID.","properties":{"cue":{"$ref":"#/$defs/Cue","description":"Complete replacement cue; its `id` selects the cue to replace."},"op":{"const":"cue.replace","type":"string"}},"required":["op","cue"],"type":"object"},{"additionalProperties":false,"description":"Remove an existing cue.","properties":{"cue_id":{"description":"ID of the cue to remove.","type":"string"},"op":{"const":"cue.remove","type":"string"}},"required":["op","cue_id"],"type":"object"},{"additionalProperties":false,"description":"Add or replace a style definition.","properties":{"op":{"const":"style.set","type":"string"},"style":{"$ref":"#/$defs/Style","description":"New style definition."},"style_id":{"description":"Style ID to add or replace.","type":"string"}},"required":["op","style_id","style"],"type":"object"},{"additionalProperties":false,"description":"Remove a style; no cue in the final document may still reference it.","properties":{"op":{"const":"style.remove","type":"string"},"style_id":{"description":"ID of an existing style.","type":"string"}},"required":["op","style_id"],"type":"object"},{"additionalProperties":false,"description":"Change the document's overlap policy.","properties":{"op":{"const":"overlap.set","type":"string"},"overlap":{"$ref":"#/$defs/Overlap","description":"New overlap policy."}},"required":["op","overlap"],"type":"object"},{"additionalProperties":false,"description":"Move existing cues by an exact time offset.","properties":{"backward":{"description":"True moves cues earlier; false moves them later.","type":"boolean"},"cue_ids":{"description":"1-4096 unique IDs of existing cues to move.","items":{"type":"string"},"type":"array"},"offset":{"$ref":"#/$defs/Time","description":"Nonnegative shift in rational seconds `{num, den}`."},"op":{"const":"cues.shift","type":"string"}},"required":["op","cue_ids","offset","backward"],"type":"object"}]},"Cue":{"additionalProperties":false,"description":"One timed caption over the half-open interval `[start, end)`.","properties":{"align":{"$ref":"#/$defs/Align","description":"Horizontal alignment of each line within the caption box."},"end":{"$ref":"#/$defs/Time","description":"Exclusive end in rational seconds; after `start` and at most 24 hours."},"id":{"description":"Unique cue ID: 1-64 ASCII letters, digits, `_` or `-`; not `STYLE`, `NOTE` or `REGION`.","type":"string"},"speaker":{"description":"Optional speaker metadata, 1-128 trimmed bytes without controls, `<`, `>` or `&`; never rendered.","type":["string","null"]},"start":{"$ref":"#/$defs/Time","description":"Inclusive start in rational seconds `{num, den}`; cues must be in nondecreasing start order."},"style":{"description":"ID of a style defined in the document's `styles`.","type":"string"},"text":{"description":"1-1024 Unicode scalars (at most 4096 bytes); LF between nonblank lines, no other control characters.","type":"string"}},"required":["id","start","end","text","style","align"],"type":"object"},"Overlap":{"description":"Simultaneous-cue policy: `allow` keeps overlapping cues; `reject` fails validation if any cues overlap.","enum":["allow","reject"],"type":"string"},"Style":{"additionalProperties":false,"description":"Caption style: a whole-cue text color.","properties":{"color":{"description":"Text color as `[r, g, b]`, each 0-255 (sRGB).","items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":"array"}},"required":["color"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"document":{"description":"Caption document as returned by captions.import or captions.apply. Abbreviated; cutbolt_schema {\"name\":\"captions\"} returns it.","type":"object"},"expected_revision":{"description":"Must equal the supplied document's revision.","minimum":0,"type":"integer"},"operations":{"anyOf":[{"description":"Caption edits applied in order as one atomic batch.","items":{"$ref":"#/$defs/CaptionOperation"},"type":"array"},{"additionalProperties":false,"properties":{"file":{"description":"Workspace JSON document path.","type":"string"},"select":{"description":"Optional dotted field or array-index path.","type":"string"}},"required":["file"],"type":"object"}],"description":"Atomic edits, inline or selected from a workspace JSON file."},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"}},"required":["document","expected_revision","operations"],"type":"object"},"name":"cutbolt_captions_apply"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Preview UTF-8 SRT or WebVTT text and per-cue loss reports without writing files. Export times must align to milliseconds; no implicit rounding.","inputSchema":{"$defs":{"Format2":{"description":"Subtitle file format: `srt` (plain-text SRT profile) or `webvtt` (bounded WebVTT profile).","enum":["srt","webvtt"],"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"document":{"description":"Caption document as returned by captions.import or captions.apply. Abbreviated; cutbolt_schema {\"name\":\"captions\"} returns it.","type":"object"},"format":{"$ref":"#/$defs/Format2","description":"Sidecar format to preview."}},"required":["document","format"],"type":"object"},"name":"cutbolt_captions_encode"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"description":"Write a new bounded SRT or WebVTT file under an explicit output root. Rejects existing output and lossy conversion unless allow_reported was explicitly selected after inspecting captions.encode.","inputSchema":{"$defs":{"Format2":{"description":"Subtitle file format: `srt` (plain-text SRT profile) or `webvtt` (bounded WebVTT profile).","enum":["srt","webvtt"],"type":"string"},"LossPolicy":{"description":"Export loss policy: `reject` refuses a format that drops cue fields; `allow_reported` permits the losses captions.encode reports.","enum":["reject","allow_reported"],"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"document":{"description":"Caption document as returned by captions.import or captions.apply. Abbreviated; cutbolt_schema {\"name\":\"captions\"} returns it.","type":"object"},"format":{"$ref":"#/$defs/Format2","description":"Sidecar format to write."},"loss_policy":{"$ref":"#/$defs/LossPolicy","description":"reject fails on any reported formatting loss; allow_reported accepts losses already reviewed with captions.encode."},"output":{"description":"Path of a new .srt or .vtt file (matching format) inside output_root; never overwritten.","type":"string"},"output_root":{"description":"Existing directory; the output must lie inside it. Optional: defaults to the workspace.","type":"string"}},"required":["document","format","loss_policy","output"],"type":"object"},"name":"cutbolt_captions_export"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Paper edit: turn transcript word selections (document, first and last word) into clip.append operations for a sequential timeline, in order, each covering its words' source plus optional padding, widened to whole frames so no word is clipped. The batch is checked to apply. Read-only; apply with session.apply, then promote to tracks for music and overlays.","inputSchema":{"$defs":{"Selection2":{"additionalProperties":false,"description":"A run of words to use, inclusive, from one transcript.","properties":{"document_id":{"description":"ID of one of the given transcripts.","type":"string"},"first_word_id":{"description":"First word of the run.","type":"string"},"last_word_id":{"description":"Last word of the run, at or after the first.","type":"string"}},"required":["document_id","first_word_id","last_word_id"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"clip_prefix":{"description":"Prefix for new clip IDs `<prefix><n>`; default `s`.","type":["string","null"]},"input_root":{"description":"Existing directory; used only to match absolute asset paths to transcript source paths. Optional: defaults to the workspace.","type":["string","null"]},"padding":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Extra source kept before the first and after the last word of each run, at most 2 s; default zero."},"project":{"description":"Sequential project to append to; its assets must include the transcripts' sources. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"selections":{"description":"Word runs to use, in timeline order, 1-500.","items":{"$ref":"#/$defs/Selection2"},"type":"array"},"transcripts":{"description":"Transcripts of the source media, as for timeline.outline.","items":{"description":"Content-bound transcript of one source range; returned by transcript.transcribe and edited by transcript.correct. Abbreviated; cutbolt_schema {\"name\":\"transcript\"} returns it.","type":"object"},"type":"array"}},"required":["project","transcripts","selections"],"type":"object"},"name":"cutbolt_transcript_assemble"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Remove filler words: find listed words (default um, uh, erm, er, ah, uhm, umm, hmm, mm) wherever the timeline speaks them, from transcripts of its sources, and propose ripple deletions that cut them out without entering the neighbouring words, across every track; consecutive fillers make one cut. Each cut is checked on a working copy. Read-only; apply the operations with session.apply.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"end":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Only fillers before this timeline time; default the end."},"input_root":{"description":"Existing directory; used only to match absolute asset paths to transcript source paths. Optional: defaults to the workspace.","type":["string","null"]},"lift":{"default":false,"description":"Silence the fillers on track_ids, moving nothing, instead of ripple-deleting them from every track (which also cuts music and picture).","type":"boolean"},"padding":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Extra time cut on each side of a filler, never into a neighbouring word, at most 1/4 s; default zero."},"project":{"description":"Project to clean up. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"start":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Only fillers after this timeline time; default the start."},"track_ids":{"description":"Audio tracks whose speech to search; default every enabled audio track. Not for sequential timelines.","items":{"type":"string"},"type":["array","null"]},"transcripts":{"description":"Transcripts of the project's source media, as for timeline.outline.","items":{"description":"Content-bound transcript of one source range; returned by transcript.transcribe and edited by transcript.correct. Abbreviated; cutbolt_schema {\"name\":\"transcript\"} returns it.","type":"object"},"type":"array"},"uncovered":{"default":false,"description":"Also cut the transcripts' uncovered sounds that read like a filler (AM, UH, ER, HMM), listed in the result either way. Review first: one can be a word recognition missed.","type":"boolean"},"words":{"description":"Words to remove, 1-64, matched on letters and digits ignoring case and punctuation; default um, uh, erm, er, ah, uhm, umm, hmm and mm.","items":{"type":"string"},"type":["array","null"]}},"required":["project","transcripts"],"type":"object"},"name":"cutbolt_transcript_fillers"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Draft captions for a timeline from transcripts of its sources: the whole words inside audible audio clips, at their timeline times, grouped into cues that break at pauses, sentence ends, a maximum duration and the line budget, with balanced lines and millisecond times ready for captions.export (SRT/WebVTT) or captions.scene. Read-only.","inputSchema":{"$defs":{"Align":{"description":"Horizontal alignment of each line's advance width inside the text box: `left`, `center` or `right`.","enum":["left","center","right"],"type":"string"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"align":{"anyOf":[{"$ref":"#/$defs/Align"},{"type":"null"}],"description":"Line alignment of every cue; default `center`."},"color":{"description":"Text color `[r, g, b]` of the document's one style, `default`; default white.","items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":["array","null"]},"end":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Caption words that start before this timeline time; default the timeline end."},"id":{"description":"Caption document ID: 1-64 ASCII letters, digits, `_` or `-`; default `captions`.","type":["string","null"]},"input_root":{"description":"Existing directory; used only to match absolute asset paths to transcript source paths. Optional: defaults to the workspace.","type":["string","null"]},"line_chars":{"description":"Longest line in characters (Unicode scalars), 10-80; default 42. A longer single word gets its own line.","format":"uint","minimum":0,"type":["integer","null"]},"lines":{"description":"Lines per cue, 1-3; default 2.","format":"uint","minimum":0,"type":["integer","null"]},"max_duration":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Longest cue from its first word's start to its last word's end, 1-10 s; default 6."},"min_duration":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Shortest display time, 0-5 s; default 1. A cue is held this long unless the next one starts first."},"pause":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Silence between words that starts a new cue, 0.1-5 s; default 1/2."},"project":{"description":"Project whose speech to caption. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"start":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Caption words that start at or after this timeline time; default zero."},"track_ids":{"description":"Audio tracks whose speech to caption; default every enabled audio track. Not for sequential timelines.","items":{"type":"string"},"type":["array","null"]},"transcripts":{"description":"Transcripts of the project's source media, as for timeline.outline; whole words inside audible audio clips become caption text at their timeline times.","items":{"description":"Content-bound transcript of one source range; returned by transcript.transcribe and edited by transcript.correct. Abbreviated; cutbolt_schema {\"name\":\"transcript\"} returns it.","type":"object"},"type":"array"}},"required":["project","transcripts"],"type":"object"},"name":"cutbolt_captions_draft"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Append caption layers to a supplied scene using explicit per-style fonts/boxes and exact frame-start sampling. Reports unsampled and out-of-window cues. Returns an editable scene and inspection; does not render or save it.","inputSchema":{"$defs":{"BaseDirection":{"description":"Paragraph base direction: `auto` (from the first strong character), `ltr` or `rtl`; embedded runs keep their own direction.","enum":["auto","ltr","rtl"],"type":"string"},"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"},"Input2":{"anyOf":[{"$ref":"#/$defs/Identity","description":"Bound external font file. Relative files stay inside input_root; absolute files must be installed fonts."},{"description":"Case-insensitive exact family or full name; ambiguous names require an explicit identity from fonts.find.","type":"string"}],"description":"An explicit font file identity, or an installed family/full name resolving to exactly one file."},"Layout2":{"additionalProperties":false,"description":"Text layout applied to every visible cue of one style in captions.scene.","properties":{"background":{"anyOf":[{"$ref":"#/$defs/TextBackground"},{"type":"null"}],"description":"Optional box behind each cue line for legibility over video; omit for none."},"fonts":{"description":"1-4 font identities or unambiguous installed family/full names in fallback order. Relative files stay under input_root; absolute identities from fonts.find read installed files in place.","items":{"$ref":"#/$defs/Input2"},"type":"array"},"letter_spacing":{"description":"Extra pixels between characters on the same line, 0-128.","maximum":65535,"minimum":0,"type":"integer"},"line_height":{"description":"Baseline-to-baseline distance in pixels, 1-2048.","maximum":65535,"minimum":0,"type":"integer"},"outline":{"anyOf":[{"$ref":"#/$defs/TextOutline"},{"type":"null"}],"description":"Optional outline around the glyphs; omit for none."},"overflow":{"$ref":"#/$defs/Overflow","description":"Behavior when text does not fit the box."},"rect":{"description":"Text box `[x, y, width, height]` in scene pixels; must lie inside the canvas.","items":{"type":"integer"},"maxItems":4,"minItems":4,"type":"array"},"size":{"description":"Font em size in pixels, 1-512.","maximum":65535,"minimum":0,"type":"integer"},"text_layout":{"anyOf":[{"$ref":"#/$defs/TextLayout"},{"type":"null"}],"description":"Optional Unicode text profile for shaping and mixed directions; omit for the scalar layout."},"valign":{"$ref":"#/$defs/VAlign","description":"Vertical alignment of each cue's lines in `rect`; `bottom` keeps one- and two-line cues on the same bottom line. Default `top`."},"wrap":{"$ref":"#/$defs/Wrap","description":"Line wrapping mode."}},"required":["fonts","size","rect","line_height","letter_spacing","wrap","overflow"],"type":"object"},"Overflow":{"description":"Text outside the box: `reject` fails with TEXT_OVERFLOW; `clip` discards and counts out-of-box coverage.","enum":["reject","clip"],"type":"string"},"Sampling4":{"description":"Caption sampling policy; only `sample_start`: output frame n shows caption time `offset + n/25`.","enum":["sample_start"],"type":"string"},"TextBackground":{"additionalProperties":false,"description":"Box behind each nonempty text line: the line's advance width by its `line_height` slot (from `baseline - size`), grown by `padding` on every side. Overlapping boxes are drawn once.","properties":{"color":{"description":"Straight-alpha RGBA box color as `[r, g, b, a]` bytes.","items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":4,"minItems":4,"type":"array"},"padding":{"description":"Pixels added on every side of each line box, 0..=256.","maximum":65535,"minimum":0,"type":"integer"}},"required":["color","padding"],"type":"object"},"TextLayout":{"description":"Optional text layout profile, tagged by `profile`.","oneOf":[{"additionalProperties":false,"description":"Unicode layout: grapheme font fallback, OpenType shaping, bidi and word wrapping.","properties":{"direction":{"$ref":"#/$defs/BaseDirection","default":"auto","description":"Paragraph base direction; default `auto`."},"language":{"default":"und","description":"ASCII language tag for shaping, such as `sr`; hyphen-separated 1..=8 character subtags, at most 63 characters. Default `und`.","type":"string"},"profile":{"const":"unicode_v1","type":"string"}},"required":["profile"],"type":"object"}]},"TextOutline":{"additionalProperties":false,"description":"Outline around glyphs, drawn under the fill: the text's alpha dilated by a disc of radius `width`.","properties":{"color":{"description":"Straight-alpha RGBA outline color as `[r, g, b, a]` bytes.","items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":4,"minItems":4,"type":"array"},"width":{"description":"Outline radius in pixels, 1..=8.","maximum":255,"minimum":0,"type":"integer"}},"required":["color","width"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]},"VAlign":{"description":"Vertical placement of the lines inside the text box, each line taking `line_height`: `top` puts the first baseline at the box top plus `size`; `middle` centers the lines (rounding up); `bottom` puts the last line's slot at the box bottom, leaving `line_height - size` below its baseline.","enum":["top","middle","bottom"],"type":"string"},"Wrap":{"description":"Line breaking: `none` (LF only), `character` (before a scalar or grapheme that would overflow the box) or `word` (Unicode line-break opportunities; requires `layout`).","enum":["none","character","word"],"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"detail":{"description":"summary, the default, shortens bulky parts (timing runs to one line per layer, lists to counts) and names them in the result's detail field; full returns everything.","enum":["summary","full"],"type":"string"},"document":{"description":"Caption document to sample; it is not changed. Abbreviated; cutbolt_schema {\"name\":\"captions\"} returns it.","type":"object"},"input_root":{"description":"Directory containing the base scene's media and the layout fonts. Optional: defaults to the workspace.","type":"string"},"layer_prefix":{"description":"Prefix for generated layer IDs `<prefix>-<cue_id>`: 1-32 ASCII letters, digits, `_` or `-`.","type":"string"},"layouts":{"additionalProperties":{"$ref":"#/$defs/Layout2"},"description":"Layout per style ID; keys must be defined styles, and every style with a sampled cue needs one.","type":"object"},"offset":{"$ref":"#/$defs/Time","description":"Caption time in rational seconds `{num, den}` shown at output frame 0; at most 24 hours."},"sampling":{"$ref":"#/$defs/Sampling4","description":"Frame sampling policy."},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"scene":{"description":"Base scene to extend; duration must be 1 frame to 120 seconds of whole frames at its frame_rate. Abbreviated; cutbolt_schema {\"name\":\"scene\"} returns it.","type":"object"},"scene_id":{"description":"ID of the returned scene.","type":"string"}},"required":["document","scene","scene_id","offset","layouts","sampling","layer_prefix"],"type":"object"},"name":"cutbolt_captions_scene"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Expand a built-in template_id from templates.list or an inline template using typed values. Optional project defaults its canvas, scale 1 and frame rate; built-in layouts fit the canvas. Validates bindings and font identities; returns an editable scene and inspection. No files or sessions change. Place the returned scene as a native clip source, or compile a standalone asset with job.start run scene.render and job.wait.","inputSchema":{"$defs":{"Curve":{"additionalProperties":false,"description":"Keyframed integer property on the owning layer or clip clock. Endpoint values hold outside the keys; samples round to nearest.","properties":{"keys":{"description":"1..128 keys in any order; equal times, including equivalent fractions, are rejected.","items":{"$ref":"#/$defs/Keyframe"},"type":"array"},"retime":{"anyOf":[{"$ref":"#/$defs/Retime"},{"type":"null"}],"description":"Optional delay, speed and direction for evaluating the keys; omit to use key times as authored."}},"required":["keys"],"type":"object"},"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"},"Input2":{"anyOf":[{"$ref":"#/$defs/Identity","description":"Bound external font file. Relative files stay inside input_root; absolute files must be installed fonts."},{"description":"Case-insensitive exact family or full name; ambiguous names require an explicit identity from fonts.find.","type":"string"}],"description":"An explicit font file identity, or an installed family/full name resolving to exactly one file."},"Interpolation2":{"description":"Interpolation from a key to the next: `hold` keeps the value, `linear`, or quadratic `ease_in`, `ease_out`, `ease_in_out` without overshoot.","enum":["hold","linear","ease_in","ease_out","ease_in_out"],"type":"string"},"Keyframe":{"additionalProperties":false,"description":"One curve key.","properties":{"interpolation":{"$ref":"#/$defs/Interpolation2","description":"Interpolation toward the next key; unused on the last key."},"time":{"$ref":"#/$defs/Time","description":"Owner-clock rational seconds, 0..source duration for native clip effects or 0..layer duration for scenes; reduced denominator at most 1,000,000."},"value":{"description":"Integer property value within the animated property's range.","type":"integer"}},"required":["time","value","interpolation"],"type":"object"},"ParameterValue":{"description":"Typed template parameter value as `{\"type\": ..., \"value\": ...}`; the type must match the parameter definition.","oneOf":[{"additionalProperties":false,"description":"Value for a `boolean` parameter.","properties":{"type":{"const":"boolean","type":"string"},"value":{"description":"Explicit true or false.","type":"boolean"}},"required":["type","value"],"type":"object"},{"additionalProperties":false,"description":"Value for a `text` parameter.","properties":{"type":{"const":"text","type":"string"},"value":{"description":"Nonempty string within the definition's `max_chars` and 4096 UTF-8 bytes.","type":"string"}},"required":["type","value"],"type":"object"},{"additionalProperties":false,"description":"Value for an `integer` parameter.","properties":{"type":{"const":"integer","type":"string"},"value":{"description":"Signed 32-bit integer within the definition's inclusive `min`..=`max`.","type":"integer"}},"required":["type","value"],"type":"object"},{"additionalProperties":false,"description":"Value for a `color` parameter.","properties":{"type":{"const":"color","type":"string"},"value":{"description":"Straight-alpha RGBA color as `[r, g, b, a]` bytes.","items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":4,"minItems":4,"type":"array"}},"required":["type","value"],"type":"object"},{"additionalProperties":false,"description":"Value for a `fonts` parameter.","properties":{"type":{"const":"fonts","type":"string"},"value":{"description":"Ordered external font identities or unambiguous installed family/full names, 1..=4.","items":{"$ref":"#/$defs/Input2"},"type":"array"}},"required":["type","value"],"type":"object"},{"additionalProperties":false,"description":"Value for a `curve` parameter.","properties":{"type":{"const":"curve","type":"string"},"value":{"$ref":"#/$defs/Curve","description":"Ordinary scene keyframe curve with 1..=128 keys."}},"required":["type","value"],"type":"object"},{"additionalProperties":false,"description":"Value for a `time` parameter.","properties":{"type":{"const":"time","type":"string"},"value":{"$ref":"#/$defs/Time","description":"Rational seconds `{num, den}`; frame alignment is checked in the resolved scene."}},"required":["type","value"],"type":"object"},{"additionalProperties":false,"description":"Value for a `rect` parameter.","properties":{"type":{"const":"rect","type":"string"},"value":{"description":"Rectangle `[x, y, width, height]` in pixels; x/y -32768..=32768, sizes 1..=4096.","items":{"type":"integer"},"maxItems":4,"minItems":4,"type":"array"}},"required":["type","value"],"type":"object"}]},"Retime":{"additionalProperties":false,"description":"Changes when and how fast a curve's keys play, without moving the layer or retiming source frames.","properties":{"rate":{"$ref":"#/$defs/Time","description":"Positive rational speed multiplier, 1/16..16; denominators reduce to at most 1,000,000."},"reverse":{"default":false,"description":"Play the keys from last to first; default false.","type":"boolean"},"start":{"$ref":"#/$defs/Time","description":"Owner-clock rational seconds, at most the source duration for native clips or layer duration for scenes; until then the first key holds (last when reversed)."}},"required":["start","rate"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"detail":{"description":"summary, the default, shortens bulky parts (timing runs to one line per layer, lists to counts) and names them in the result's detail field; full returns everything.","enum":["summary","full"],"type":"string"},"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"instance_id":{"description":"ID for the returned scene instance.","type":"string"},"project":{"anyOf":[{"description":"A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},{"type":"null"}],"description":"Optional target snapshot: defaults the output canvas, scale 1 and native frame rate. Built-in layouts fit it; inline layer coordinates remain authored."},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"template":{"anyOf":[{"description":"Reusable scene template for `graphics.instantiate`: a base scene plus typed parameters and bindings. Abbreviated; cutbolt_schema {\"name\":\"template\"} returns it.","type":"object"},{"type":"null"}],"description":"Inline template to expand; provide exactly one of template or template_id."},"template_id":{"description":"Original built-in ID from templates.list; alternative to an inline template.","type":["string","null"]},"values":{"additionalProperties":{"$ref":"#/$defs/ParameterValue"},"default":{},"description":"Values keyed by parameter ID; a parameter without a value uses its declared default.","type":"object"}},"required":["instance_id"],"type":"object"},"name":"cutbolt_graphics_instantiate"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"List original built-in graphics by ID and purpose, with typed parameters, defaults and output sizes. Optional template_id selects one. Use an ID with graphics.instantiate; supply external font identities or unambiguous installed names. No files or sessions change.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"template_id":{"description":"Optional exact built-in ID; omit to list the whole catalog with typed defaults and output sizes.","type":["string","null"]}},"required":[],"type":"object"},"name":"cutbolt_templates_list"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"List installed TrueType/OpenType files in OS font folders, with optional family/full-name substring and pagination. Returns content identities and rendering support; pass a usable entry's identity directly to scene or caption fonts. Exact family/full names also work when unambiguous. Files are read in place; output contains rasterized glyphs and font licensing remains the user's responsibility.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"family":{"description":"Case-insensitive substring of a family or full name; omit to list all discovered font files.","type":["string","null"]},"limit":{"default":32,"description":"Maximum files returned, 1..=128; default 32. Follow next_offset for another page.","format":"uint","minimum":0,"type":"integer"},"offset":{"default":0,"description":"Number of matching files to skip, in canonical path order; default zero.","format":"uint","minimum":0,"type":"integer"}},"required":[],"type":"object"},"name":"cutbolt_fonts_find"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Check proxy availability and identities. Preview selection is saved with preview.proxy through session.apply; final exports always use full-quality media.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to read. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"}},"required":["project"],"type":"object"},"name":"cutbolt_proxy_status"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Find an unambiguous proxy by bound content identity and return a proposal for session.apply. Does not move files or save edits. Generate proxies with job.start run proxy.generate.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"asset_id":{"description":"Asset whose proxy to find.","type":"string"},"candidates":{"description":"Candidate proxy paths inside input_root; exactly one must match the bound identity.","items":{"type":"string"},"type":"array"},"expected_revision":{"description":"Must equal the supplied project's revision.","minimum":0,"type":"integer"},"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to read. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"}},"required":["project","expected_revision","asset_id","candidates"],"type":"object"},"name":"cutbolt_proxy_relink"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Validate a supported source identity, codec/container and exact timestamp mapping into an editing asset at the declared native frame rate. Reports source clocks, frame selection/blend weights, audio pitch policy and explicit SDR display geometry (quarter turns, sample aspect and contain/cover/stretch). Convert with job.start run media.conform.","inputSchema":{"$defs":{"Alpha":{"description":"Source alpha association. `straight` declares color channels independent of coverage.\nPremultiplied sources are unsupported; omission is required for sources without alpha.","enum":["straight"],"type":"string"},"Audio":{"description":"Audio policy: `resample` linearly resamples source audio (pitch follows speed); `mute` writes exact silence and is required for reverse or freeze.","enum":["resample","mute"],"type":"string"},"AudioPitch":{"description":"Remap audio policy: `follow_speed` resamples so pitch follows speed (needs recipe `audio: resample`); `mute` gives silence (needs `audio: mute`; required for reverse or frozen segments).","enum":["follow_speed","mute"],"type":"string"},"Clock":{"description":"Explicit clock normalization: make the first presented video frame time zero, preserving\naudio's relative timestamp offset. Audio outside its decoded interval becomes silence.","enum":["first_video_frame"],"type":"string"},"Color":{"description":"Legacy video interpretation: `encoded_rgb` keeps MKV FFV1/bgr0 values as stored; `bt709_limited` converts tagged limited-range BT.709 H.264 yuv420p MP4/MOV to full-range RGB.","enum":["encoded_rgb","bt709_limited"],"type":"string"},"Decode":{"description":"Source video decode backend, tagged by `backend`; only source decoding moves to the GPU.","oneOf":[{"additionalProperties":false,"description":"Software decoding (the default when `decode` is omitted).","properties":{"backend":{"const":"cpu","type":"string"}},"required":["backend"],"type":"object"},{"additionalProperties":false,"description":"CUDA hardware decoding; supports progressive H.264 yuv420p at even sizes 128x128 to 1920x1080.","properties":{"backend":{"const":"cuda","type":"string"},"device":{"description":"Local CUDA device ordinal, 0 to 31.","minimum":0,"type":"integer"},"unavailable":{"$ref":"#/$defs/Unavailable","description":"Behavior when device initialization fails."}},"required":["backend","device","unavailable"],"type":"object"}]},"Fit":{"description":"Canvas fitting after source display rotation and sample aspect have been interpreted.","oneOf":[{"const":"contain","description":"Preserve display aspect and center the complete picture, padding uncovered pixels.","type":"string"},{"const":"cover","description":"Preserve display aspect and fill the canvas, cropping the center of the picture.","type":"string"},{"const":"stretch","description":"Fill the canvas independently on both axes after rotation.","type":"string"}]},"Geometry":{"additionalProperties":false,"description":"Explicitly normalize canonical quarter-turn display metadata and positive sample aspect.","properties":{"fit":{"$ref":"#/$defs/Fit","description":"Required canvas fit. Sampling is nearest top-left; centering leaves odd excess right/bottom."}},"required":["fit"],"type":"object"},"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"},"Input":{"additionalProperties":false,"description":"Declared SDR interpretation of a conform source (`source.sdr`); BT.709 primaries and D65 are implied.","properties":{"matrix":{"$ref":"#/$defs/Matrix","description":"Sample matrix; must match the stored pixel format."},"missing_tags":{"$ref":"#/$defs/MissingTags","description":"Policy for absent or unknown stream and frame color tags."},"range":{"$ref":"#/$defs/Range","description":"Code range of the stored samples; YUVJ formats require `full`."},"transfer":{"$ref":"#/$defs/Transfer","description":"Transfer function of the source values."}},"required":["matrix","range","transfer","missing_tags"],"type":"object"},"Interpolation":{"description":"LUT sampling: `nearest` (1D or 3D), `linear` (1D only), `trilinear` or `tetrahedral` (3D only).","enum":["nearest","linear","trilinear","tetrahedral"],"type":"string"},"Matrix":{"description":"Sample matrix: `rgb` for FFV1/bgr0 RGB, `bt709` for the declared YUV source formats in color.capabilities.","enum":["rgb","bt709"],"type":"string"},"MissingTags":{"description":"Absent or unknown color tags: `reject` fails; `use_declared` assumes the declared values and reports them. Conflicting tags always fail.","enum":["reject","use_declared"],"type":"string"},"Range":{"description":"Code range: `full` (0-255 at 8 bits) or `limited` (luma 16-235, chroma 16-240 at 8 bits, scaled for higher depths).","enum":["full","limited"],"type":"string"},"Recipe":{"additionalProperties":false,"description":"Media conversion recipe for media.conform: samples a source into a new FFV1/PCM16 editing asset at `frame_rate` (default 25 fps), or a WAV source into an audio-only WAV when `width` and `height` are omitted.","properties":{"audio":{"$ref":"#/$defs/Audio","description":"Audio policy; must agree with `remap.audio_pitch` when remapping."},"decode":{"anyOf":[{"$ref":"#/$defs/Decode"},{"type":"null"}],"description":"Source video decode backend; omit for CPU decoding."},"duration":{"$ref":"#/$defs/Time","description":"Output duration in rational seconds; whole frames at `frame_rate` and whole 48 kHz samples, 1 to 45000 frames (audio-only: whole samples, at most an hour)."},"frame_rate":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Output frame rate, one of 24, 25, 30, 50, 60, 24000/1001, 30000/1001 or 60000/1001; default 25. Use the source's own rate to keep every frame, which avoids judder."},"freeze":{"description":"Hold `source_in` for every frame; requires unit `rate`, `reverse: false` and `audio: mute`.","type":"boolean"},"height":{"description":"Output height in pixels; at most 2160 and 8M pixels in total.","minimum":0,"type":["integer","null"]},"id":{"description":"Asset ID for the returned asset (1-128 bytes, not blank).","type":"string"},"lut":{"anyOf":[{"$ref":"#/$defs/Transform"},{"type":"null"}],"description":"Optional .cube LUT applied after SDR normalization; requires `source.sdr`."},"rate":{"$ref":"#/$defs/Time","description":"Constant speed factor from 1/16 to 16; must be 1 with `freeze` or `remap`."},"remap":{"anyOf":[{"$ref":"#/$defs/Remap"},{"type":"null"}],"description":"Variable speed map replacing constant `rate`; omit for constant speed."},"reverse":{"description":"Play backwards from `source_in`; requires `audio: mute`.","type":"boolean"},"schema_version":{"description":"Recipe format version; must be 1.","minimum":0,"type":"integer"},"source":{"$ref":"#/$defs/Source","description":"Source file and color interpretation."},"source_in":{"$ref":"#/$defs/Time","description":"Source position in rational seconds at output time zero; on a source audio sample when resampling without remap."},"width":{"description":"Output width in pixels; at most 4096 and 8M pixels in total. Omit with `height` for an audio-only 48 kHz stereo WAV.","minimum":0,"type":["integer","null"]},"working_transfer":{"anyOf":[{"$ref":"#/$defs/Transfer"},{"type":"null"}],"description":"Output RGB transfer; required with `source.sdr` and omitted otherwise."}},"required":["schema_version","id","source","source_in","duration","rate","reverse","freeze","audio"],"type":"object"},"Remap":{"additionalProperties":false,"description":"Variable speed map for a conform recipe; needs recipe `rate` 1, `reverse` and `freeze` false.","properties":{"audio_pitch":{"$ref":"#/$defs/AudioPitch","description":"Audio policy; must match the recipe `audio` field."},"segments":{"description":"1 to 64 segments in playback order; durations must sum exactly to the recipe duration.","items":{"$ref":"#/$defs/Segment"},"type":"array"},"video_sampling":{"$ref":"#/$defs/Sampling","description":"How output frames are taken from the source timestamps around each mapped time."}},"required":["segments","video_sampling","audio_pitch"],"type":"object"},"Sampling":{"description":"Video frame choice at each mapped source time: `previous` takes the latest frame at or before it, `nearest` the closer neighbor (midpoint picks later), `linear` blends both neighbors.","enum":["previous","nearest","linear"],"type":"string"},"Segment":{"additionalProperties":false,"description":"One speed ramp whose speed changes linearly from `start_rate` to `end_rate` over its output duration.","properties":{"duration":{"$ref":"#/$defs/Time","description":"Output duration in rational seconds; positive and on the 48 kHz sample clock."},"end_rate":{"$ref":"#/$defs/Time","description":"Speed factor at segment end, rational 0 to 16."},"reverse":{"description":"Move backwards through the source during this segment; requires `audio_pitch: mute`.","type":"boolean"},"start_rate":{"$ref":"#/$defs/Time","description":"Speed factor at segment start, rational 0 to 16."}},"required":["duration","start_rate","end_rate","reverse"],"type":"object"},"Source":{"additionalProperties":false,"description":"Identity-bound conform source and its declared color interpretation.","properties":{"alpha":{"anyOf":[{"$ref":"#/$defs/Alpha"},{"type":"null"}],"description":"Required `straight` for native alpha with SDR normalization; omit for opaque sources."},"clock":{"anyOf":[{"$ref":"#/$defs/Clock"},{"type":"null"}],"description":"Optional `first_video_frame` origin and aligned/padded/trimmed audio; requires `sdr` video.\nOmit to retain strict zero-origin timestamps and existing audio interval checks."},"color":{"anyOf":[{"$ref":"#/$defs/Color"},{"type":"null"}],"description":"Legacy interpretation; null for audio-only WAV and when `sdr` is used (never both)."},"file":{"$ref":"#/$defs/Identity","description":"Source file identity; path relative to `input_root`, at most 16 GiB (MKV, MP4, MOV or WAV)."},"geometry":{"anyOf":[{"$ref":"#/$defs/Geometry"},{"type":"null"}],"description":"Explicit canvas fit after canonical display rotation and sample-aspect normalization.\nRequires `sdr`; omit to retain square pixels, no display transform and legacy resizing."},"sdr":{"anyOf":[{"$ref":"#/$defs/Input"},{"type":"null"}],"description":"Explicit SDR normalization; requires recipe `working_transfer`. Omit for the legacy path."}},"required":["file"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]},"Transfer":{"description":"SDR transfer function of encoded RGB or YUV values: `srgb` (sRGB piecewise curve) or `bt709` (BT.709 OETF).","enum":["srgb","bt709"],"type":"string"},"Transform":{"additionalProperties":false,"description":"Identity-bound .cube LUT (one 1D or 3D table) applied to encoded working-transfer RGB.","properties":{"file":{"$ref":"#/$defs/Identity","description":"Table file identity; `.cube` path relative to `input_root`, at most 8 MiB."},"interpolation":{"$ref":"#/$defs/Interpolation","description":"Sampling method; must suit the table's dimensionality."}},"required":["file","interpolation"],"type":"object"},"Unavailable":{"description":"Policy when the CUDA device fails to initialize: `error` returns DEVICE_UNAVAILABLE; `cpu` decodes in software and reports the reason.","enum":["error","cpu"],"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"recipe":{"$ref":"#/$defs/Recipe","description":"Conversion recipe: bound source, speed/reverse/freeze or remap, audio policy and optional color normalization."}},"required":["recipe"],"type":"object"},"name":"cutbolt_media_conform_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Validate and evaluate a bounded PCM mix: sample-aligned trims, gain/fade automation and multiple tracks, plus optional buses, explicit channel matrices, panning and named surround layouts. Reports output samples, PCM hash, layout, routing and clipping counts. Read-only; render a WAV with job.start run audio.render.","inputSchema":{"$defs":{"Channels2":{"description":"Clip channel policy: `duplicate_mono` copies mono input to both stereo channels; `preserve_stereo` keeps stereo input; `preserve_mono` keeps mono input and `preserve_layout` keeps the source's named layout (these two require mix routing).","enum":["duplicate_mono","preserve_stereo","preserve_mono","preserve_layout"],"type":"string"},"Clip2":{"additionalProperties":false,"description":"Cut of one PCM16 WAV placed on a mix track, with gain, linear fades and optional gain automation.","properties":{"channels":{"$ref":"#/$defs/Channels2","description":"Channel policy; must match the decoded source layout."},"duration":{"$ref":"#/$defs/Time","description":"Positive length, rational seconds on the 48 kHz grid; must fit both the source and the mix."},"fade_in":{"$ref":"#/$defs/Time","default":{"den":1,"num":0},"description":"Linear fade-in from the clip start, rational seconds on the 48 kHz grid, at most `duration`; default zero."},"fade_out":{"$ref":"#/$defs/Time","default":{"den":1,"num":0},"description":"Linear fade-out ending at the clip end, rational seconds on the 48 kHz grid, at most `duration`; default zero."},"file":{"$ref":"#/$defs/Identity","description":"Source WAV: path relative to `input_root`, lowercase SHA-256 hex and byte count (mono/stereo PCM16 at 24, 44.1 or 48 kHz)."},"gain_curve":{"anyOf":[{"$ref":"#/$defs/Curve"},{"type":"null"}],"description":"Optional gain automation in linear milli-units 0..4000 on a clip-local clock; replaces `gain_milli`."},"gain_milli":{"default":1000,"description":"Linear amplitude gain, 1000 = unity, 0..4000; default 1000. `gain_curve` replaces it when set.","minimum":0,"type":"integer"},"id":{"description":"Clip ID unique across every track of the mix; 1..128 bytes, not blank.","type":"string"},"mute":{"default":false,"description":"Silence the clip while still validating it; default false.","type":"boolean"},"source_in":{"$ref":"#/$defs/Time","description":"Cut start in the source, rational seconds aligned to the source's sample rate."},"start":{"$ref":"#/$defs/Time","description":"Placement in the mix, rational seconds on the 48 kHz sample grid."}},"required":["id","file","channels","start","source_in","duration"],"type":"object"},"Curve":{"additionalProperties":false,"description":"Keyframed integer property on the owning layer or clip clock. Endpoint values hold outside the keys; samples round to nearest.","properties":{"keys":{"description":"1..128 keys in any order; equal times, including equivalent fractions, are rejected.","items":{"$ref":"#/$defs/Keyframe"},"type":"array"},"retime":{"anyOf":[{"$ref":"#/$defs/Retime"},{"type":"null"}],"description":"Optional delay, speed and direction for evaluating the keys; omit to use key times as authored."}},"required":["keys"],"type":"object"},"Effect2":{"description":"One EQ or compression stage, tagged by `type`, for mix masters, buses and repair recipes. All values must be finite.","oneOf":[{"additionalProperties":false,"description":"Two-pole low-pass filter.","properties":{"frequency_hz":{"description":"Cutoff frequency in Hz, 20..20000.","type":"number"},"q":{"description":"Filter Q, 0.1..20.","type":"number"},"type":{"const":"low_pass","type":"string"}},"required":["type","frequency_hz","q"],"type":"object"},{"additionalProperties":false,"description":"Two-pole high-pass filter.","properties":{"frequency_hz":{"description":"Cutoff frequency in Hz, 20..20000.","type":"number"},"q":{"description":"Filter Q, 0.1..20.","type":"number"},"type":{"const":"high_pass","type":"string"}},"required":["type","frequency_hz","q"],"type":"object"},{"additionalProperties":false,"description":"Two-pole peaking EQ band.","properties":{"frequency_hz":{"description":"Center frequency in Hz, 20..20000.","type":"number"},"gain_db":{"description":"Band gain in dB, -24..24.","type":"number"},"q":{"description":"Filter Q, 0.1..20.","type":"number"},"type":{"const":"peaking","type":"string"}},"required":["type","frequency_hz","q","gain_db"],"type":"object"},{"additionalProperties":false,"description":"Hard-knee peak compressor; detection is linked across all channels.","properties":{"attack_ms":{"description":"Attack time in milliseconds, 0..1000; 0 applies the reduction immediately.","type":"number"},"makeup_db":{"description":"Makeup gain in dB applied after reduction, 0..24.","type":"number"},"ratio":{"description":"Compression ratio, 1..20.","type":"number"},"release_ms":{"description":"Release time in milliseconds, 0..5000.","type":"number"},"threshold_db":{"description":"Threshold in dBFS, -60..0.","type":"number"},"type":{"const":"compressor","type":"string"}},"required":["type","threshold_db","ratio","attack_ms","release_ms","makeup_db"],"type":"object"}]},"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"},"Interpolation2":{"description":"Interpolation from a key to the next: `hold` keeps the value, `linear`, or quadratic `ease_in`, `ease_out`, `ease_in_out` without overshoot.","enum":["hold","linear","ease_in","ease_out","ease_in_out"],"type":"string"},"Keyframe":{"additionalProperties":false,"description":"One curve key.","properties":{"interpolation":{"$ref":"#/$defs/Interpolation2","description":"Interpolation toward the next key; unused on the last key."},"time":{"$ref":"#/$defs/Time","description":"Owner-clock rational seconds, 0..source duration for native clip effects or 0..layer duration for scenes; reduced denominator at most 1,000,000."},"value":{"description":"Integer property value within the animated property's range.","type":"integer"}},"required":["time","value","interpolation"],"type":"object"},"Mix":{"additionalProperties":false,"description":"Sample-based PCM mix recipe (`pcm-mix-v1`) rendered as 48 kHz PCM16; stereo unless `routing` selects another layout.","properties":{"duration":{"$ref":"#/$defs/Time","description":"Output length, rational seconds on the 48 kHz grid; 1 sample to 60 seconds."},"effects":{"description":"Ordered master effects, at most 8, run after summation and before final PCM16 saturation; default empty.","items":{"$ref":"#/$defs/Effect2"},"type":"array"},"id":{"description":"Mix ID, 1..128 bytes, not blank.","type":"string"},"routing":{"anyOf":[{"description":"Optional mix routing graph with named layouts, buses and channel routes. Abbreviated; cutbolt_schema {\"name\":\"audio_routing\"} returns it.","type":"object"},{"type":"null"}],"description":"Optional bus and channel routing graph; omit for the plain stereo mix."},"schema_version":{"description":"Recipe schema version; must be 1.","minimum":0,"type":"integer"},"tracks":{"description":"Up to 16 tracks, with at most 128 clips and 8,000,000 summed clip samples in total.","items":{"$ref":"#/$defs/Track2"},"type":"array"}},"required":["schema_version","id","duration","tracks"],"type":"object"},"Retime":{"additionalProperties":false,"description":"Changes when and how fast a curve's keys play, without moving the layer or retiming source frames.","properties":{"rate":{"$ref":"#/$defs/Time","description":"Positive rational speed multiplier, 1/16..16; denominators reduce to at most 1,000,000."},"reverse":{"default":false,"description":"Play the keys from last to first; default false.","type":"boolean"},"start":{"$ref":"#/$defs/Time","description":"Owner-clock rational seconds, at most the source duration for native clips or layer duration for scenes; until then the first key holds (last when reversed)."}},"required":["start","rate"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]},"Track2":{"additionalProperties":false,"description":"Mix track; its gain and mute apply to every clip on it.","properties":{"clips":{"description":"Clips on this track; overlapping clips sum.","items":{"$ref":"#/$defs/Clip2"},"type":"array"},"gain_milli":{"default":1000,"description":"Linear gain multiplied into each clip, 1000 = unity, 0..4000; default 1000.","minimum":0,"type":"integer"},"id":{"description":"Track ID unique within the mix; 1..128 bytes, not blank.","type":"string"},"mute":{"default":false,"description":"Silence the whole track; default false.","type":"boolean"}},"required":["id","clips"],"type":"object"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"mix":{"$ref":"#/$defs/Mix","description":"PCM mix recipe: tracks, clips, gain and fades, optional routing and master effects."}},"required":["mix"],"type":"object"},"name":"cutbolt_audio_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Search project assets by text, bin prefix and exact tags. Stable ID order and pagination; content duplicates are reported without merging assets.","inputSchema":{"$defs":{"Query":{"additionalProperties":false,"description":"Asset filter for registry.search; every supplied filter must match, and results sort by asset ID.","properties":{"bin":{"default":[],"description":"Bin path prefix, at most 8 components; matches that bin and its descendants.","items":{"type":"string"},"type":"array"},"limit":{"default":50,"description":"Maximum results to return, 1-200; default 50.","format":"uint","minimum":0,"type":"integer"},"offset":{"default":0,"description":"Number of results to skip, 0-1000; default 0. Use the returned `next_offset` to page.","format":"uint","minimum":0,"type":"integer"},"tags":{"default":[],"description":"Tags every result must have (exact match), at most 32.","items":{"type":"string"},"type":"array"},"text":{"default":"","description":"Case-insensitive substring of ID, path, title, bin, tag or field name/value; at most 1024 bytes. Empty matches all.","type":"string"}},"type":"object"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"project":{"description":"Project to read. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"query":{"$ref":"#/$defs/Query","description":"Text, bin prefix, tag filters and pagination."}},"required":["project","query"],"type":"object"},"name":"cutbolt_registry_search"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Check local source availability and bound SHA-256 identities within an explicit input root. Read-only; reports missing, changed, unbound or unavailable media.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to read. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"}},"required":["project"],"type":"object"},"name":"cutbolt_registry_status"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Read and hash selected sources, returning an updated snapshot and media.bind operations. Persist operations with session.apply at the original expected revision. Does not save or modify sources.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"asset_ids":{"description":"1-1000 unique asset IDs to hash and bind.","items":{"type":"string"},"type":"array"},"expected_revision":{"description":"Must equal the supplied project's revision.","minimum":0,"type":"integer"},"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to read. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"}},"required":["project","expected_revision","asset_ids"],"type":"object"},"name":"cutbolt_registry_bind"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Match explicit candidate paths to a bound asset identity. Reject ambiguous or mismatching content. Returns an updated snapshot and operations for session.apply; does not save or move media.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"asset_id":{"description":"Bound asset to relink.","type":"string"},"candidates":{"description":"Candidate paths inside input_root; exactly one must match the bound identity.","items":{"type":"string"},"type":"array"},"expected_revision":{"description":"Must equal the supplied project's revision.","minimum":0,"type":"integer"},"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to read. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"}},"required":["project","expected_revision","asset_id","candidates"],"type":"object"},"name":"cutbolt_registry_relink"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Validate every numbered PNG identity and exact source window/repeat, alpha association, color interpretation and native output clock. Returns the explicit transparent or opaque compilation policy without writing. Compile with job.start run image.sequence.compile.","inputSchema":{"$defs":{"AlphaMode":{"description":"How PNG RGB relates to alpha: `straight` (default, ordinary PNG) or `premultiplied` (RGB already multiplied by alpha; no channel may exceed alpha).","enum":["straight","premultiplied"],"type":"string"},"Frame2":{"additionalProperties":false,"description":"One numbered PNG source image.","properties":{"image":{"$ref":"#/$defs/Identity","description":"PNG file identity; path relative to `input_root`."},"number":{"description":"Image number; must equal `first_number` plus this entry's index.","minimum":0,"type":"integer"}},"required":["number","image"],"type":"object"},"Identity":{"additionalProperties":false,"description":"A source file pinned by its SHA-256 and size; source files stay inside the input root, with an OS-font-folder exception only for font fields.","properties":{"bytes":{"default":0,"description":"Nonzero size in bytes, checked before use; read from the file when omitted.","minimum":0,"type":"integer"},"path":{"description":"Normal-component path relative to input_root. Only font fields additionally accept absolute installed-font paths returned by fonts.find; image/audio fields require relative paths.","type":"string"},"sha256":{"default":"","description":"Lowercase hex SHA-256 of the contents. When omitted, the file is hashed as the request runs.","type":"string"}},"required":["path"],"type":"object"},"Profile2":{"description":"Output profile: `rgba_ffv1` (straight RGBA FFV1 `.mkv`), `rgba_png_mov` (straight RGBA PNG `.mov`), `reference_rgb` (FFV1/bgr0 `.mkv` flattened over `background`; returns a timeline asset). All include silent 48 kHz stereo PCM16.","enum":["rgba_ffv1","rgba_png_mov","reference_rgb"],"type":"string"},"Recipe4":{"additionalProperties":false,"description":"Numbered PNG sequence recipe for image.sequence.inspect and image.sequence.compile.","properties":{"alpha_mode":{"$ref":"#/$defs/AlphaMode","description":"Whether source RGB is straight or premultiplied by alpha."},"background":{"description":"Opaque `[r, g, b]` background (0-255); required for `reference_rgb`, omitted otherwise.","items":{"maximum":255,"minimum":0,"type":"integer"},"maxItems":3,"minItems":3,"type":["array","null"]},"first_number":{"description":"Number of the first image; the last number must stay below 1000000.","minimum":0,"type":"integer"},"frame_rate":{"$ref":"#/$defs/Time","description":"Output frame rate as a rational; one of the supported native rates."},"frames":{"description":"Complete ordered source list, 1 to 1024 same-size PNGs; all are validated.","items":{"$ref":"#/$defs/Frame2"},"type":"array"},"id":{"description":"Asset ID for the asset returned by `reference_rgb` (1-128 bytes).","type":"string"},"input_transfer":{"$ref":"#/$defs/Transfer","description":"Declared transfer of the PNG RGB values; sRGB-tagged PNGs reject `bt709`."},"profile":{"$ref":"#/$defs/Profile2","description":"Output container, codec and alpha handling."},"repeat":{"description":"Times to play the window; at least 1, at most 180000 output frames in total.","minimum":0,"type":"integer"},"schema_version":{"description":"Recipe format version; must be 1.","minimum":0,"type":"integer"},"source_count":{"description":"Number of images in the selected window; at least 1 and within `frames`.","minimum":0,"type":"integer"},"source_start":{"description":"Index in `frames` of the first image in the half-open selected window.","minimum":0,"type":"integer"}},"required":["schema_version","id","first_number","frames","frame_rate","source_start","source_count","repeat","input_transfer","alpha_mode","profile"],"type":"object"},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]},"Transfer":{"description":"SDR transfer function of encoded RGB or YUV values: `srgb` (sRGB piecewise curve) or `bt709` (BT.709 OETF).","enum":["srgb","bt709"],"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"recipe":{"$ref":"#/$defs/Recipe4","description":"Numbered PNG recipe: frames, source window, repeat, rate, alpha and color interpretation."}},"required":["recipe"],"type":"object"},"name":"cutbolt_image_sequence_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Evaluate a bounded typed property graph at explicit rational times. Reports exact values and rounded position/opacity bindings, with property links, cycle/type checks and deterministic seeded operations. Reads no media, executes no source code and writes no files.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"scene":{"description":"Scene recipe whose `expressions` program is evaluated. Abbreviated; cutbolt_schema {\"name\":\"scene\"} returns it.","type":"object"},"times":{"description":"Scene times in rational seconds within 0..=duration; 1..=256 samples, at most 65536 node evaluations.","items":{"$ref":"#/$defs/Time"},"type":"array"}},"required":["scene","times"],"type":"object"},"name":"cutbolt_expression_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Validate a bounded pixel scene, source identities, exact frame timing, text, effects and WAV conversion. Also accepts form:short text/shape recipes with project-sized layout, hex colors and named easing, returning expanded_scene. Compile with job.start run scene.render, then job.wait.","inputSchema":{"$defs":{"SceneInput":{"anyOf":[{"description":"Bounded pixel scene of layers and audio, validated by scene.inspect and compiled by scene.render to a lossless asset at its frame_rate. Abbreviated; cutbolt_schema {\"name\":\"scene\"} returns it.","type":"object"},{"description":"A text/shape scene with explicit form marker, exact seconds and deterministic layout defaults. Abbreviated; cutbolt_schema {\"name\":\"scene_short\"} returns it.","type":"object"}],"description":"A complete ordinary scene or an explicitly marked shorthand recipe."}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"detail":{"description":"summary, the default, shortens bulky parts (timing runs to one line per layer, lists to counts) and names them in the result's detail field; full returns everything.","enum":["summary","full"],"type":"string"},"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"anyOf":[{"description":"A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},{"type":"null"}],"description":"Optional target for shorthand size/project and default frame rate; full scenes remain explicit."},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"scene":{"$ref":"#/$defs/SceneInput","description":"Scene to validate and sample."}},"required":["scene"],"type":"object"},"name":"cutbolt_scene_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"See a scene before compiling it: render the one frame shown at time (default 0) to a new PNG at the scene's output size, returned as an inline image; straight RGBA for a transparent scene. Use it to check titles, lower thirds and thumbnails, then compile with scene.render.","inputSchema":{"$defs":{"SceneInput":{"anyOf":[{"description":"Bounded pixel scene of layers and audio, validated by scene.inspect and compiled by scene.render to a lossless asset at its frame_rate. Abbreviated; cutbolt_schema {\"name\":\"scene\"} returns it.","type":"object"},{"description":"A text/shape scene with explicit form marker, exact seconds and deterministic layout defaults. Abbreviated; cutbolt_schema {\"name\":\"scene_short\"} returns it.","type":"object"}],"description":"A complete ordinary scene or an explicitly marked shorthand recipe."},"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory containing the scene's media and fonts. Optional: defaults to the workspace.","type":"string"},"output":{"description":"Path of a new .png file inside output_root; existing files are never overwritten.","type":"string"},"output_root":{"description":"Existing directory; the output must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"anyOf":[{"description":"A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},{"type":"null"}],"description":"Optional shorthand target canvas/clock, snapshot or saved reference."},"scene":{"$ref":"#/$defs/SceneInput","description":"Scene to show, as for scene.inspect and scene.render."},"time":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Scene time to show, in rational seconds; the frame on screen then. Default zero."}},"required":["scene","output"],"type":"object"},"name":"cutbolt_scene_still"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"description":"Export one exact frame from a reference project timeline to an unused PNG and return it as an inline image. Requires input/output roots and rational time on the project's supported native frame boundary. No source or existing output is overwritten.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"output":{"description":"Path of a new .png file inside output_root; existing files are never overwritten.","type":"string"},"output_root":{"description":"Existing directory; the output must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to preview; its saved proxy selection applies. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"time":{"$ref":"#/$defs/Time","description":"Timeline time in rational seconds; must fall on a frame boundary of the project rate."}},"required":["project","output","time"],"type":"object"},"name":"cutbolt_preview_frame"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Discover implemented editing operations, render profile, job limits and unsupported features. Local only.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"section":{"description":"One area to describe in full, such as `renderer`, `scenes` or `export`, or `all` for everything. Omit for a short summary that lists the areas.","type":["string","null"]}},"required":[],"type":"object"},"name":"cutbolt_capabilities"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Return the JSON Schema for one command's arguments, including CLI-only commands, or for a shared type that tool listings abbreviate: project, operation, scene, template, audio_routing, transcript or captions. Large schemas come back as an outline of variants and definitions; pass select (for example operation + clip.append, or scene + Layer) for one part with everything it references. Read-only.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"full":{"default":false,"description":"Return the whole schema even when it is large; it is otherwise outlined.","type":"boolean"},"name":{"description":"A command such as `scene.render` or its MCP tool name, or a shared type: `project`, `operation`, `scene`, `template`, `audio_routing`, `transcript` or `captions`.","type":"string"},"select":{"description":"One part to return: a variant tag such as `clip.append`, or a definition name such as `Layer`. Omit for the whole schema, or an outline of it when it is large.","type":["string","null"]}},"required":["name"],"type":"object"},"name":"cutbolt_schema"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Create an empty versioned project snapshot. Does not save it. Times/frame rates use exact {num,den} rational values.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"frame_rate":{"$ref":"#/$defs/Time","description":"Frame rate as a rational, for example {num:25,den:1} or {num:30000,den:1001}."},"height":{"description":"Frame height in pixels, 1-8192.","minimum":0,"type":"integer"},"id":{"description":"Project ID, 1-128 bytes.","type":"string"},"width":{"description":"Frame width in pixels, 1-8192.","minimum":0,"type":"integer"}},"required":["id","width","height","frame_rate"],"type":"object"},"name":"cutbolt_project_create"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Validate a supplied snapshot and return its revision and exact duration. No state changes.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"project":{"description":"Project to check. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"}},"required":["project"],"type":"object"},"name":"cutbolt_project_validate"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Transform a caller-owned snapshot with one atomic batch; returns a new snapshot. tracks.edit supports placed video/audio tracks, links, locks and explicit collisions. A clip scene saves a pinned recipe and streams its frames without compilation. clip_effects saves source-clock pixel effects, transform, opacity, mask and blend in schema 2, including nested clips; transparency reveals lower tracks. For saved edits and safe retries use session.apply instead.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"expected_revision":{"description":"Must equal the supplied project's revision.","minimum":0,"type":"integer"},"operations":{"anyOf":[{"description":"Editing operations applied in order as one atomic batch; any failure commits nothing.","items":{"description":"One edit in an atomic timeline.apply or session.apply batch, tagged by `op`; each must leave a valid project. The clip.* operations and timeline.ripple_delete edit the sequential `clips` list and are rejected once native tracks exist. Abbreviated; cutbolt_schema {\"name\":\"operation\"} returns it.","properties":{"op":{"description":"Variant tag; cutbolt_schema with select returns a variant's fields.","enum":["media.paths","transcript.cut","multicam.create","multicam.edit","sequence.create","sequence.edit","sequence.remove","tracks.edit","media.proxy.attach","media.proxy.detach","media.proxy.relink","preview.proxy","project.transfer","project.working_space","media.add","media.index","media.metadata","media.bind","media.relink","clip.append","clip.split","clip.trim","clip.remove","clip.move","clip.insert","clip.overwrite","timeline.ripple_delete","clip.slip","clip.roll","clip.slide"],"type":"string"}},"required":["op"],"type":"object"},"type":"array"},{"additionalProperties":false,"properties":{"file":{"description":"Workspace JSON document path.","type":"string"},"select":{"description":"Optional dotted field or array-index path.","type":"string"}},"required":["file"],"type":"object"}],"description":"Atomic edits, inline or selected from a workspace JSON file."},"project":{"description":"Project to transform; neither the input nor a saved revision is modified. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"}},"required":["project","expected_revision","operations"],"type":"object"},"name":"cutbolt_timeline_apply"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Start a saved project at revision 0, from id/width/height/frame_rate or from a full snapshot. store_root must be an existing local directory. Retry with the same request_id and arguments to retrieve the original receipt.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"frame_rate":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"New empty project frame rate, for example 25 or \"30000/1001\"."},"height":{"description":"New empty project frame height in pixels, 1-8192.","minimum":0,"type":["integer","null"]},"id":{"description":"New empty project ID, 1-128 bytes; use with width, height and frame_rate instead of `project`.","type":["string","null"]},"project":{"anyOf":[{"description":"Versioned project snapshot: canvas, frame rate, media and either a sequential clip list or native tracks. Returned by project.create and session.get; change it only through operations. Abbreviated; cutbolt_schema {\"name\":\"project\"} returns it.","type":"object"},{"type":"null"}],"description":"Valid snapshot saved as revision 0 of a new project; its own revision is ignored. Omit it to start an empty project from `id`, `width`, `height` and `frame_rate`."},"request_id":{"description":"Caller-chosen ID for this change, 1-128 bytes, unique within the project. Resend identical arguments with it to retry safely.","type":"string"},"store_root":{"description":"Existing local directory holding the session database (projects.sqlite3). Optional: defaults to .cutbolt/store in the workspace.","type":"string"},"width":{"description":"New empty project frame width in pixels, 1-8192.","minimum":0,"type":["integer","null"]}},"required":["request_id"],"type":"object"},"name":"cutbolt_session_create"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Read the saved head or a chosen immutable revision. Returns the full project. Get the head before editing; use a receipt revision for rendering.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"project_id":{"description":"ID of a project saved in store_root.","type":"string"},"revision":{"description":"Saved revision to read; omit for the current head.","minimum":0,"type":["integer","null"]},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"store_root":{"description":"Existing local directory holding the session database (projects.sqlite3). Optional: defaults to .cutbolt/store in the workspace.","type":"string"}},"required":["project_id"],"type":"object"},"name":"cutbolt_session_get"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Commit atomic edits against expected_revision. Retry request_id only with identical arguments. On REVISION_CONFLICT read and reconsider. Returns semantic changes. A clip scene saves a generated source or workspace recipe. project.working_space selects bits 8/16 and light encoded/linear; null restores the default.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"expected_revision":{"description":"Head revision this change was prepared against; a different head fails with REVISION_CONFLICT.","minimum":0,"type":"integer"},"operations":{"anyOf":[{"description":"Editing operations applied in order as one atomic batch; any failure commits nothing.","items":{"description":"One edit in an atomic timeline.apply or session.apply batch, tagged by `op`; each must leave a valid project. The clip.* operations and timeline.ripple_delete edit the sequential `clips` list and are rejected once native tracks exist. Abbreviated; cutbolt_schema {\"name\":\"operation\"} returns it.","properties":{"op":{"description":"Variant tag; cutbolt_schema with select returns a variant's fields.","enum":["media.paths","transcript.cut","multicam.create","multicam.edit","sequence.create","sequence.edit","sequence.remove","tracks.edit","media.proxy.attach","media.proxy.detach","media.proxy.relink","preview.proxy","project.transfer","project.working_space","media.add","media.index","media.metadata","media.bind","media.relink","clip.append","clip.split","clip.trim","clip.remove","clip.move","clip.insert","clip.overwrite","timeline.ripple_delete","clip.slip","clip.roll","clip.slide"],"type":"string"}},"required":["op"],"type":"object"},"type":"array"},{"additionalProperties":false,"properties":{"file":{"description":"Workspace JSON document path.","type":"string"},"select":{"description":"Optional dotted field or array-index path.","type":"string"}},"required":["file"],"type":"object"}],"description":"Atomic edits, inline or selected from a workspace JSON file."},"project_id":{"description":"ID of a project saved in store_root.","type":"string"},"request_id":{"description":"Caller-chosen ID for this change, 1-128 bytes, unique within the project. Resend identical arguments with it to retry safely.","type":"string"},"store_root":{"description":"Existing local directory holding the session database (projects.sqlite3). Optional: defaults to .cutbolt/store in the workspace.","type":"string"}},"required":["project_id","request_id","expected_revision","operations"],"type":"object"},"name":"cutbolt_session_apply"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Undo the latest applied state as a new revision, preserving history. Repeated undo walks backward. Retry with identical request_id/expected_revision.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"expected_revision":{"description":"Head revision this change was prepared against; a different head fails with REVISION_CONFLICT.","minimum":0,"type":"integer"},"project_id":{"description":"ID of a project saved in store_root.","type":"string"},"request_id":{"description":"Caller-chosen ID for this change, 1-128 bytes, unique within the project. Resend identical arguments with it to retry safely.","type":"string"},"store_root":{"description":"Existing local directory holding the session database (projects.sqlite3). Optional: defaults to .cutbolt/store in the workspace.","type":"string"}},"required":["project_id","request_id","expected_revision"],"type":"object"},"name":"cutbolt_session_undo"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Restore target_revision as a new undoable revision. Use history to choose a state. Reuse request_id only for an identical retry.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"expected_revision":{"description":"Head revision this change was prepared against; a different head fails with REVISION_CONFLICT.","minimum":0,"type":"integer"},"project_id":{"description":"ID of a project saved in store_root.","type":"string"},"request_id":{"description":"Caller-chosen ID for this change, 1-128 bytes, unique within the project. Resend identical arguments with it to retry safely.","type":"string"},"store_root":{"description":"Existing local directory holding the session database (projects.sqlite3). Optional: defaults to .cutbolt/store in the workspace.","type":"string"},"target_revision":{"description":"Saved revision whose state becomes the new head.","minimum":0,"type":"integer"}},"required":["project_id","request_id","expected_revision","target_revision"],"type":"object"},"name":"cutbolt_session_restore"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Inspect exact before/after clip placements, track layout, links and affected durations without saving. This is an edit diff, not a video image. Apply against the same revision or handle a conflict.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"expected_revision":{"description":"Head revision this change was prepared against; a different head fails with REVISION_CONFLICT.","minimum":0,"type":"integer"},"operations":{"anyOf":[{"description":"Editing operations applied in order as one atomic batch; any failure commits nothing.","items":{"description":"One edit in an atomic timeline.apply or session.apply batch, tagged by `op`; each must leave a valid project. The clip.* operations and timeline.ripple_delete edit the sequential `clips` list and are rejected once native tracks exist. Abbreviated; cutbolt_schema {\"name\":\"operation\"} returns it.","properties":{"op":{"description":"Variant tag; cutbolt_schema with select returns a variant's fields.","enum":["media.paths","transcript.cut","multicam.create","multicam.edit","sequence.create","sequence.edit","sequence.remove","tracks.edit","media.proxy.attach","media.proxy.detach","media.proxy.relink","preview.proxy","project.transfer","project.working_space","media.add","media.index","media.metadata","media.bind","media.relink","clip.append","clip.split","clip.trim","clip.remove","clip.move","clip.insert","clip.overwrite","timeline.ripple_delete","clip.slip","clip.roll","clip.slide"],"type":"string"}},"required":["op"],"type":"object"},"type":"array"},{"additionalProperties":false,"properties":{"file":{"description":"Workspace JSON document path.","type":"string"},"select":{"description":"Optional dotted field or array-index path.","type":"string"}},"required":["file"],"type":"object"}],"description":"Atomic edits, inline or selected from a workspace JSON file."},"project_id":{"description":"ID of a project saved in store_root.","type":"string"},"store_root":{"description":"Existing local directory holding the session database (projects.sqlite3). Optional: defaults to .cutbolt/store in the workspace.","type":"string"}},"required":["project_id","expected_revision","operations"],"type":"object"},"name":"cutbolt_session_preview"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Look up whether a request ID was committed, without resending its arguments. Returns the original receipt, or REQUEST_NOT_FOUND if it never took effect. Use after a lost response or restart before deciding to retry.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"project_id":{"description":"ID of a project saved in store_root.","type":"string"},"request_id":{"description":"Request ID of the change to look up.","type":"string"},"store_root":{"description":"Existing local directory holding the session database (projects.sqlite3). Optional: defaults to .cutbolt/store in the workspace.","type":"string"}},"required":["project_id","request_id"],"type":"object"},"name":"cutbolt_session_receipt"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Read newest-first revision summaries. limit defaults to 50 (1-200). Pass next_before_revision as before_revision for the next page; null means finished.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"before_revision":{"description":"Return entries older than this revision; pass the previous page's next_before_revision. Omit for the newest page.","minimum":0,"type":["integer","null"]},"limit":{"default":50,"description":"Maximum entries to return, 1-200; default 50.","maximum":65535,"minimum":0,"type":"integer"},"project_id":{"description":"ID of a project saved in store_root.","type":"string"},"store_root":{"description":"Existing local directory holding the session database (projects.sqlite3). Optional: defaults to .cutbolt/store in the workspace.","type":"string"}},"required":["project_id"],"type":"object"},"name":"cutbolt_session_history"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Submit an asynchronous local render (Windows or Linux). render contains a fixed snapshot and input/output roots/path, with optional retry.max_attempts (1..3 total). Retry applies only to transient tool failures and interruptions. Reuse request_id only with identical arguments. Returns a durable ticket; poll job.status.","inputSchema":{"$defs":{"RenderRequest":{"additionalProperties":false,"description":"Background reference render request queued by render.start.","properties":{"input_root":{"description":"Existing directory that project media paths resolve against. Optional: defaults to the workspace.","type":"string"},"output":{"description":"Unused `.mkv` path inside `output_root`, not reserved by another active job.","type":"string"},"output_root":{"description":"Existing directory that must contain `output`. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to render; the job pins its snapshot at submission. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"retry":{"anyOf":[{"$ref":"#/$defs/Retry"},{"type":"null"}],"description":"Attempt policy; omit for a single attempt."}},"required":["project","output"],"type":"object"},"Retry":{"additionalProperties":false,"description":"Retry policy for a queued render.","properties":{"max_attempts":{"description":"Total attempts including the first, 1 to 3. Only transient tool failure or interruption retries.","minimum":0,"type":"integer"}},"required":["max_attempts"],"type":"object"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"job_root":{"description":"Existing local directory holding the job queue (jobs.sqlite3). Optional: defaults to .cutbolt/jobs in the workspace.","type":"string"},"render":{"$ref":"#/$defs/RenderRequest","description":"Render to queue: project snapshot, roots, output path and optional retry policy."},"request_id":{"description":"Caller-chosen ID unique within job_root, 1-128 bytes. An identical resubmission returns the original ticket.","type":"string"}},"required":["request_id","render"],"type":"object"},"name":"cutbolt_render_start"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Read saved state, frame progress, attempt history and completion/error receipt. An exited worker triggers checked publication reconciliation or an opted-in retry within its saved limit. This can update internal job metadata but does not start a worker.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"detail":{"description":"summary, the default, shortens bulky parts (timing runs to one line per layer, lists to counts) and names them in the result's detail field; full returns everything.","enum":["summary","full"],"type":"string"},"job_id":{"description":"Job ID from the render.start ticket.","type":"string"},"job_root":{"description":"Job queue directory used with render.start. Optional: defaults to .cutbolt/jobs in the workspace.","type":"string"}},"required":["job_id"],"type":"object"},"name":"cutbolt_job_status"},{"annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Request cancellation of a queued/running job without deleting final output. Poll until cancelled or completed; publication can win a simultaneous cancellation. Safe to repeat for the same job.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"job_id":{"description":"Job ID from the render.start ticket.","type":"string"},"job_root":{"description":"Job queue directory used with render.start. Optional: defaults to .cutbolt/jobs in the workspace.","type":"string"}},"required":["job_id"],"type":"object"},"name":"cutbolt_job_cancel"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Reconcile saved publication and wake the queue worker to drain queued jobs, including explicitly opted-in interrupted retries within their saved attempt limit. Completed, cancelled and exhausted jobs are not rerun.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"job_root":{"description":"Job queue directory used with render.start. Optional: defaults to .cutbolt/jobs in the workspace.","type":"string"}},"required":[],"type":"object"},"name":"cutbolt_job_resume"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Queue a long-running command in the background and return a durable ticket: export.run (H.264/AAC or lossless delivery), export.review (a review folder for a rendered cut), captions.render (generated caption edits or a compiled overlay), graphics.place (save a generated graphic clip in one edit), media.transcribe (a whole file's speech into transcripts, or a known script aligned to it), media.prepare (any camera or phone file to a timeline asset, optionally for a project's rate and size), media.conform, scene.render, audio.render, audio.repair.render, hdr.conform, image.sequence.compile, proxy.generate, preview.range, cache.run or transcript.transcribe. Arguments are prepared and validated now. Follow with job.wait or job.status; the result holds the command's receipt. Independent jobs run at once, so queue several, then wait for them all with one job.wait job_ids; job.cancel stops one.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"arguments":{"additionalProperties":true,"description":"That command's arguments exactly as for a direct call, without `command`; cutbolt_schema with its name gives the schema.","type":"object"},"job_root":{"description":"Existing local directory holding the job queue (jobs.sqlite3). Optional: defaults to .cutbolt/jobs in the workspace.","type":"string"},"request_id":{"description":"Caller-chosen ID unique within job_root, 1-128 bytes. An identical resubmission returns the original ticket.","type":"string"},"run":{"description":"Command to run in the background: graphics.place, export.run, export.review, captions.render, media.prepare, media.transcribe, media.conform, scene.render, audio.render, audio.repair.render, hdr.conform, image.sequence.compile, proxy.generate, preview.range, cache.run or transcript.transcribe.","type":"string"}},"required":["request_id","run","arguments"],"type":"object"},"name":"cutbolt_job_start"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"description":"Wait up to timeout_seconds (default 30, at most 120) for a queued or running job to finish, then return its status, progress and result, with finished true or false. With job_ids, wait for several jobs in one call, until all (default) or any have finished: the result counts jobs by status and lists each job's receipt, error or progress. Receipts are summaries unless detail is full.","inputSchema":{"$defs":{"Until":{"description":"When a wait for several jobs returns: once `all` have finished, or as soon as `any` has.","enum":["all","any"],"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"detail":{"description":"summary, the default, shortens bulky parts (timing runs to one line per layer, lists to counts) and names them in the result's detail field; full returns everything.","enum":["summary","full"],"type":"string"},"job_id":{"description":"Job ID from the ticket; or give job_ids.","type":["string","null"]},"job_ids":{"description":"Several job IDs, up to 64, to wait for in one call. The result lists each job's status with its receipt, error or progress.","items":{"type":"string"},"type":["array","null"]},"job_root":{"description":"Job queue directory used with render.start or job.start. Optional: defaults to .cutbolt/jobs in the workspace.","type":"string"},"save_as":{"description":"Write the result to this new workspace .json file and return a summary; pass it on as {\"file\": path, \"select\": field}.","type":"string"},"timeout_seconds":{"description":"Longest wait in seconds, 1 to 120; default 30. The status is returned either way, with `finished`.","minimum":0,"type":["integer","null"]},"until":{"anyOf":[{"$ref":"#/$defs/Until"},{"type":"null"}],"description":"With job_ids: return once all of them have finished (default) or as soon as any has."}},"required":[],"type":"object"},"name":"cutbolt_job_wait"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Measure a timeline range's loudness without exporting: sample peak, RMS and BS.1770 integrated loudness (LKFS) of the mix of enabled audio tracks and, by default, of each enabled audio track alone. Use it to set clip gain_milli against a target such as -14 LKFS. With curve, also loudness per second and the silent and clipped runs, to find dead air, music that buries speech, or distortion. Read-only; at most 4 hours per call.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"curve":{"default":false,"description":"Add `over_time`: per-second short-term and loudest momentary LKFS, silent runs (-60 dBFS for 0.5 s or more) and clipped runs, with exact times; default false.","type":"boolean"},"duration":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Range length in rational seconds, at most 600; default to the timeline end."},"input_root":{"description":"Existing directory that project media paths resolve against. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to measure; its enabled audio is rendered exactly as an audio-only export would be. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"start":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"Range start in rational seconds on a frame boundary; default zero."},"tracks":{"default":true,"description":"Also meter each enabled audio track alone; default true. Each track costs one more audio pass.","type":"boolean"}},"required":["project"],"type":"object"},"name":"cutbolt_timeline_meters"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Find likely mistakes without rendering: flash frames, out-of-sync picture and sound, jump cuts, black or silent stretches, disabled-track clips, unused assets, missing or changed media (with input_root) and words cut by clip edges (with transcripts). Returns a text summary and findings; ok means no warnings or errors. Read-only.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory that project media paths resolve against; with it, missing and changed media are reported. Optional: defaults to the workspace.","type":["string","null"]},"jump_window":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"A cut between touching clips of one source that skips or repeats less than this is a jump cut; default 10 s."},"min_clip_frames":{"description":"Shorter picture clips are flash frames, 1-100 frames; default 3.","minimum":0,"type":["integer","null"]},"project":{"description":"Project to check. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"transcripts":{"default":[],"description":"Transcripts of the source media, as for timeline.outline; with them, words cut by clip edges are reported.","items":{"description":"Content-bound transcript of one source range; returned by transcript.transcribe and edited by transcript.correct. Abbreviated; cutbolt_schema {\"name\":\"transcript\"} returns it.","type":"object"},"type":"array"}},"required":["project"],"type":"object"},"name":"cutbolt_timeline_check"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Read a timeline as compact text, one line per clip (spans, ID, source, link, levels, picture-in-picture), plus transitions and black or silent stretches. With transcripts of the sources, each audio clip shows what is said, a cut word marked *. start and end page through long timelines. Read-only.","inputSchema":{"$defs":{"Time":{"additionalProperties":false,"description":"Exact seconds or rate: 2.5, \"30000/1001\" or {\"num\":5,\"den\":2}.","minimum":0,"pattern":"^[0-9]+([./][0-9]+)?$","properties":{"den":{"description":"Positive denominator.","minimum":1,"type":"integer"},"num":{"description":"Numerator.","minimum":0,"type":"integer"}},"required":["num","den"],"type":["object","integer","number","string"]}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"end":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"List clips that start before this timeline time; default the timeline end."},"input_root":{"description":"Existing directory; used only to match absolute asset paths to transcript source paths. Optional: defaults to the workspace.","type":["string","null"]},"project":{"description":"Project to outline. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"},"sequence_id":{"description":"Outline this child sequence instead of the project's timeline.","type":["string","null"]},"start":{"anyOf":[{"$ref":"#/$defs/Time"},{"type":"null"}],"description":"List clips that end after this timeline time; default zero."},"transcripts":{"default":[],"description":"Transcripts of source media, as returned by transcript.transcribe or transcript.correct, at most 256. Each is matched to the assets of its source (by content identity when the asset is bound, otherwise by path), and audio clips then show what is said in them.","items":{"description":"Content-bound transcript of one source range; returned by transcript.transcribe and edited by transcript.correct. Abbreviated; cutbolt_schema {\"name\":\"transcript\"} returns it.","type":"object"},"type":"array"},"words":{"description":"Transcript words shown per clip, 0-2048; default 12. Longer speech shows its first and last words and the word count; 0 shows only the count.","format":"uint","minimum":0,"type":["integer","null"]}},"required":["project"],"type":"object"},"name":"cutbolt_timeline_outline"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"List files and folders under input_root (the workspace by default), sorted, with sizes and paths relative to it, optionally recursive and filtered by extension; engine state folders are skipped. Read-only.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"dir":{"description":"Relative folder inside input_root to list; omit for input_root itself.","type":["string","null"]},"extensions":{"default":[],"description":"Only files with these extensions, such as `[\"mkv\", \"mp4\", \"wav\"]`; folders are then omitted.","items":{"type":"string"},"type":"array"},"input_root":{"description":"Existing directory to list; with a workspace it defaults to the workspace. Optional: defaults to the workspace.","type":"string"},"limit":{"description":"Most entries to return, 1-1000; default 200. `total` and `truncated` report the rest.","format":"uint","minimum":0,"type":["integer","null"]},"recursive":{"default":false,"description":"Also list files in every subfolder; default false.","type":"boolean"}},"required":[],"type":"object"},"name":"cutbolt_files_list"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Probe a local source inside an explicit input_root. Returns its content identity (path relative to input_root, SHA-256, bytes), stream metadata and `timeline`: whether the file can go on a timeline as it is, with its exact frame rate, frames, rational duration and a media.add-ready asset, or the reasons it cannot and, for video, a normalization recipe with estimated cache bytes. Add original video with media.add and input_root to save automatic preparation for queued exports. A source longer than media.conform's 45000 output frames gets a reason instead of a shortened recipe.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"path":{"description":"Path of the file to probe; it must lie inside input_root.","type":"string"}},"required":["path"],"type":"object"},"name":"cutbolt_media_inspect"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Validate the narrow reference media profile and inspect an export plan. Requires input/output roots and an unused .mkv output. May take time to decode source metadata.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"input_root":{"description":"Existing directory; every source file must lie inside it. Optional: defaults to the workspace.","type":"string"},"output":{"description":"Path of a new .mkv file inside output_root; existing files are never overwritten.","type":"string"},"output_root":{"description":"Existing directory; the output must lie inside it. Optional: defaults to the workspace.","type":"string"},"project":{"description":"Project to plan; give a saved `revision` for a stable render. A full snapshot (cutbolt_schema {\"name\":\"project\"}), or {\"project_id\", \"revision\"} to load a saved revision (default the head; store_root defaults to the workspace store).","type":"object"}},"required":["project","output"],"type":"object"},"name":"cutbolt_render_plan"}]}}
