{"ok":true,"site":{"host":"glyph-motion.slate-app.online","url":"https://glyph-motion.slate-app.online/?scene=glyph-hero-scene","type":"live","desc":"Glyph Motion Studio for WebMCP — direct motion in natural language, keep every keyframe under your control.","tools":[{"name":"get_scene","kind":"answer","impl":"imperative","description":"Read the open Glyph Motion Studio composition: available bundled scenes, scene elements, the current declarative GSAP timeline (steps, targets, timing, eases), the monotonic sceneRevision you must echo back in mutations, reduced-motion policy, staged preview, save state, limits, and the last render diagnostics. Read-only. Call this first, and again after any human edit or REVISION_CONFLICT.","title":"Get scene","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?scene=glyph-hero-scene"},{"name":"switch_scene","kind":"act","impl":"imperative","description":"Switch the visible editor to one of the bundled scenes listed by get_scene. Revision-checked. Refuses when the current scene has an unapplied preview or unsaved changes unless discardCurrentChanges:true is supplied; use that flag only when the user explicitly approved abandoning the current work. Loads the target scene's local saved project when present, otherwise its bundled baseline. Never deletes a saved project.","title":"Switch scene","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false},"inputSchema":{"type":"object","properties":{"sceneId":{"type":"string","enum":["glyph-hero-scene","motion-playground-scene","space-mission-scene","orbit-scene"],"description":"Bundled scene id returned in get_scene.availableScenes"},"baseRevision":{"type":"integer","minimum":0,"description":"sceneRevision from get_scene"},"discardCurrentChanges":{"type":"boolean","description":"Explicitly abandon the current unapplied preview or unsaved edits. Omit or false when the current scene is clean."}},"required":["sceneId","baseRevision"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?scene=glyph-hero-scene"},{"name":"inspect_animation_targets","kind":"answer","impl":"imperative","description":"Discover what can be animated: every semantic target (id / role / group) in the scene with its label, role, group, primitive type, owning element, approximate bounds (for spatial ordering and stagger decisions), and supported tween types. Read-only. Use the returned target objects verbatim in preview_timeline_patch. Optional filters: scopeToId, role, group.","title":"Inspect animation targets","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"scopeToId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Only targets inside this scene element"},"role":{"type":"string","enum":["primary","secondary","accent","utility"]},"group":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Only members of this group id"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?scene=glyph-hero-scene"},{"name":"inspect_vector_scene","kind":"answer","impl":"imperative","description":"Read editable vector layers node-by-node plus the safe bundled asset catalog. Returns geometry, styling, semantic roles, groups and pivots as structured data—never raw SVG. Call before preview_scene_patch and again after applying a composition change.","title":"Inspect vector scene","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?scene=glyph-hero-scene"},{"name":"preview_scene_patch","kind":"act","impl":"imperative","description":"Create or revise the vector composition through typed operations: add a vector layer, add validated primitives/text, insert bundled assets, update or duplicate nodes, assign semantic groups and pivots, transform layers, remove items, or restyle the scene. Stages an ephemeral visible preview only; the committed scene remains unchanged. Requires baseRevision from get_scene.","title":"Preview vector scene patch","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"inputSchema":{"type":"object","properties":{"baseRevision":{"type":"integer","minimum":0,"description":"sceneRevision from get_scene"},"intent":{"type":"string","maxLength":200,"description":"One short user-facing sentence describing the composition goal"},"operations":{"type":"array","minItems":1,"maxItems":32,"items":{"description":"One reversible composition operation.","oneOf":[{"type":"object","properties":{"op":{"const":"add_vector_layer"},"element":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"name":{"type":"string","maxLength":80},"position":{"type":"object","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG x coordinate"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG y coordinate"}},"required":["x","y"],"additionalProperties":false},"scale":{"type":"number","minimum":0.01,"maximum":10,"description":""},"rotation":{"type":"number","minimum":-1080,"maximum":1080,"description":"Degrees"},"opacity":{"type":"number","minimum":0,"maximum":1,"description":""},"order":{"type":"integer","minimum":-100,"maximum":100},"visible":{"type":"boolean"},"locked":{"type":"boolean"},"width":{"type":"number","minimum":1,"maximum":2000,"description":"Local SVG width"},"height":{"type":"number","minimum":1,"maximum":2000,"description":"Local SVG height"}},"required":["id"],"additionalProperties":false}},"required":["op","element"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"add_asset"},"element":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"name":{"type":"string","maxLength":80},"position":{"type":"object","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG x coordinate"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG y coordinate"}},"required":["x","y"],"additionalProperties":false},"scale":{"type":"number","minimum":0.01,"maximum":10,"description":""},"rotation":{"type":"number","minimum":-1080,"maximum":1080,"description":"Degrees"},"opacity":{"type":"number","minimum":0,"maximum":1,"description":""},"order":{"type":"integer","minimum":-100,"maximum":100},"visible":{"type":"boolean"},"locked":{"type":"boolean"},"artworkKey":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Bundled key returned by inspect_vector_scene"}},"required":["id","artworkKey"],"additionalProperties":false}},"required":["op","element"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"add_node"},"elementId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"node":{"type":"object","description":"A validated vector primitive. Coordinates are local to the owning vector layer; optional pivot is returned to animation-target inspection.","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Stable semantic node id"},"name":{"type":"string","maxLength":80},"label":{"type":"string","maxLength":80,"description":"Agent-facing description; mention the hinge when the node rotates"},"primitive":{"type":"string","enum":["circle","rect","ellipse","line","polygon","polyline","path","text"]},"role":{"type":"string","enum":["primary","secondary","accent","utility"]},"group":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"position":{"type":"object","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG x coordinate"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG y coordinate"}},"required":["x","y"],"additionalProperties":false},"scale":{"type":"number","minimum":0.01,"maximum":10,"description":"Static node scale"},"rotation":{"type":"number","minimum":-1080,"maximum":1080,"description":"Static rotation in degrees"},"opacity":{"type":"number","minimum":0,"maximum":1,"description":""},"fill":{"type":"string","pattern":"^(none|(#[0-9a-fA-F]{3,8}|rgba?\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*(,\\s*(0|1|0?\\.\\d+)\\s*)?\\)))$","description":"none, hex, rgb(), or rgba()"},"stroke":{"type":"string","pattern":"^(none|(#[0-9a-fA-F]{3,8}|rgba?\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*(,\\s*(0|1|0?\\.\\d+)\\s*)?\\)))$","description":"none, hex, rgb(), or rgba()"},"strokeWidth":{"type":"number","minimum":0,"maximum":60,"description":""},"pivot":{"type":"object","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG x coordinate"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG y coordinate"}},"required":["x","y"],"additionalProperties":false,"description":"Exact local SVG-coordinate hinge or rotation centre"},"cx":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"cy":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"radius":{"type":"number","minimum":0.1,"maximum":2000,"description":""},"x":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"width":{"type":"number","minimum":0.1,"maximum":2000,"description":""},"height":{"type":"number","minimum":0.1,"maximum":2000,"description":""},"rx":{"type":"number","minimum":0,"maximum":2000,"description":""},"ry":{"type":"number","minimum":0,"maximum":2000,"description":""},"x1":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"y1":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"x2":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"y2":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"points":{"type":"array","minItems":2,"maxItems":64,"items":{"type":"object","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG x coordinate"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG y coordinate"}},"required":["x","y"],"additionalProperties":false}},"d":{"type":"string","maxLength":4000,"description":"Plain SVG path data only; no markup, CSS, URLs, or scripts"},"text":{"type":"string","maxLength":120},"fontSize":{"type":"number","minimum":6,"maximum":240,"description":""},"fontWeight":{"type":"integer","minimum":100,"maximum":900},"textAnchor":{"type":"string","enum":["start","middle","end"]}},"required":["id","primitive"],"oneOf":[{"properties":{"primitive":{"const":"circle"}},"required":["cx","cy","radius"]},{"properties":{"primitive":{"const":"rect"}},"required":["x","y","width","height"]},{"properties":{"primitive":{"const":"ellipse"}},"required":["cx","cy","rx","ry"]},{"properties":{"primitive":{"const":"line"}},"required":["x1","y1","x2","y2"]},{"properties":{"primitive":{"const":"polygon"}},"required":["points"]},{"properties":{"primitive":{"const":"polyline"}},"required":["points"]},{"properties":{"primitive":{"const":"path"}},"required":["d"]},{"properties":{"primitive":{"const":"text"}},"required":["x","y","text"]}],"additionalProperties":false}},"required":["op","elementId","node"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"update_node"},"elementId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"nodeId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"changes":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"label":{"type":"string","maxLength":80,"description":"Agent-facing description; mention the hinge when the node rotates"},"role":{"type":"string","enum":["primary","secondary","accent","utility"]},"group":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"position":{"type":"object","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG x coordinate"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG y coordinate"}},"required":["x","y"],"additionalProperties":false},"scale":{"type":"number","minimum":0.01,"maximum":10,"description":"Static node scale"},"rotation":{"type":"number","minimum":-1080,"maximum":1080,"description":"Static rotation in degrees"},"opacity":{"type":"number","minimum":0,"maximum":1,"description":""},"fill":{"type":"string","pattern":"^(none|(#[0-9a-fA-F]{3,8}|rgba?\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*(,\\s*(0|1|0?\\.\\d+)\\s*)?\\)))$","description":"none, hex, rgb(), or rgba()"},"stroke":{"type":"string","pattern":"^(none|(#[0-9a-fA-F]{3,8}|rgba?\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*(,\\s*(0|1|0?\\.\\d+)\\s*)?\\)))$","description":"none, hex, rgb(), or rgba()"},"strokeWidth":{"type":"number","minimum":0,"maximum":60,"description":""},"pivot":{"type":"object","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG x coordinate"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG y coordinate"}},"required":["x","y"],"additionalProperties":false,"description":"Exact local SVG-coordinate hinge or rotation centre"},"cx":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"cy":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"radius":{"type":"number","minimum":0.1,"maximum":2000,"description":""},"x":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"width":{"type":"number","minimum":0.1,"maximum":2000,"description":""},"height":{"type":"number","minimum":0.1,"maximum":2000,"description":""},"rx":{"type":"number","minimum":0,"maximum":2000,"description":""},"ry":{"type":"number","minimum":0,"maximum":2000,"description":""},"x1":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"y1":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"x2":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"y2":{"type":"number","minimum":-2000,"maximum":2000,"description":""},"points":{"type":"array","minItems":2,"maxItems":64,"items":{"type":"object","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG x coordinate"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG y coordinate"}},"required":["x","y"],"additionalProperties":false}},"d":{"type":"string","maxLength":4000,"description":"Plain SVG path data only; no markup, CSS, URLs, or scripts"},"text":{"type":"string","maxLength":120},"fontSize":{"type":"number","minimum":6,"maximum":240,"description":""},"fontWeight":{"type":"integer","minimum":100,"maximum":900},"textAnchor":{"type":"string","enum":["start","middle","end"]}},"minProperties":1,"additionalProperties":false}},"required":["op","elementId","nodeId","changes"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"duplicate_node"},"elementId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"nodeId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"newId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"name":{"type":"string","maxLength":80},"label":{"type":"string","maxLength":80},"offset":{"type":"object","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG x coordinate"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG y coordinate"}},"required":["x","y"],"additionalProperties":false}},"required":["op","elementId","nodeId","newId"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"remove_node"},"elementId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"nodeId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["op","elementId","nodeId"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"set_semantics"},"elementId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"nodeIds":{"type":"array","minItems":1,"maxItems":60,"items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"role":{"type":"string","enum":["primary","secondary","accent","utility"]},"group":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["op","elementId","nodeIds"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"update_element"},"elementId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"changes":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"position":{"type":"object","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG x coordinate"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"SVG y coordinate"}},"required":["x","y"],"additionalProperties":false},"scale":{"type":"number","minimum":0.01,"maximum":10,"description":""},"rotation":{"type":"number","minimum":-1080,"maximum":1080,"description":"Degrees"},"opacity":{"type":"number","minimum":0,"maximum":1,"description":""},"order":{"type":"integer","minimum":-100,"maximum":100},"visible":{"type":"boolean"},"locked":{"type":"boolean"}},"minProperties":1,"additionalProperties":false}},"required":["op","elementId","changes"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"remove_element"},"elementId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["op","elementId"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"set_scene"},"name":{"type":"string","maxLength":80},"backgroundColor":{"type":"string","pattern":"^(#[0-9a-fA-F]{3,8}|rgba?\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*(,\\s*(0|1|0?\\.\\d+)\\s*)?\\))$","description":"Hex, rgb(), or rgba()"}},"required":["op"],"additionalProperties":false}]}}},"required":["baseRevision","operations"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?scene=glyph-hero-scene"},{"name":"apply_scene_patch","kind":"act","impl":"imperative","description":"Accept an unexpired composition preview into the editable scene. The preview is single-use and revision-bound. Adds a full-scene undo checkpoint but does not persist locally; inspect the resulting animation targets before constructing a timeline, and call save_scene only when the user asks.","title":"Apply vector scene patch","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"inputSchema":{"type":"object","properties":{"previewId":{"type":"string","description":"previewId returned by preview_scene_patch"},"baseRevision":{"type":"integer","minimum":0,"description":"The revision the composition preview was staged against"}},"required":["previewId","baseRevision"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?scene=glyph-hero-scene"},{"name":"preview_timeline_patch","kind":"act","impl":"imperative","description":"Validate a set of timeline operations, stage them as an ephemeral preview, render it on the visible canvas (autoplays unless reduced motion is on), and return diagnostics. Does NOT change the committed scene — the user judges the motion first. Requires baseRevision from get_scene (REVISION_CONFLICT if the scene moved). Prefer small targeted patches (update_step) over rebuilding everything. Do not stack multiple from tweens on the same target property: update the existing entrance or use fromTo for later motion. Limits: 24 steps, 12s total, 8s per tween. Then call apply_timeline_patch with the returned previewId to keep it.","title":"Preview timeline patch","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"inputSchema":{"type":"object","properties":{"baseRevision":{"type":"integer","minimum":0,"description":"sceneRevision from get_scene"},"intent":{"type":"string","maxLength":200,"description":"One short user-facing sentence describing the creative goal (shown in the activity log)"},"operations":{"type":"array","minItems":1,"maxItems":32,"items":{"description":"One domain operation on the timeline.","oneOf":[{"type":"object","properties":{"op":{"const":"add_step"},"step":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Unique, stable, human-readable id, e.g. \"symbol-enter\""},"label":{"type":"string","maxLength":80},"target":{"type":"object","description":"Semantic target. type \"id\" = one element by its id; \"group\" = every member of a semantic group (e.g. \"accents\"); \"role\" = every element with that role. No CSS selectors.","properties":{"type":{"type":"string","enum":["id","role","group"]},"value":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Element id, group id, or one of: primary, secondary, accent, utility"},"scopeToId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Scene element id the target lives in. Optional when the scene has one element."}},"required":["type","value"],"additionalProperties":false},"tweenType":{"type":"string","enum":["from","to","fromTo","set","drawSVG"],"description":"\"from\" is the usual choice for entrances."},"props":{"type":"object","description":"Animated values. For \"from\": the starting values (animates TO the natural state). For \"to\": the end values. For \"fromTo\": end values here plus starting values in fromProps.","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"Horizontal offset in SVG units"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"Vertical offset in SVG units"},"scale":{"type":"number","minimum":0,"maximum":10,"description":"Uniform scale (1 = natural size)"},"scaleX":{"type":"number","minimum":0,"maximum":10,"description":""},"scaleY":{"type":"number","minimum":0,"maximum":10,"description":""},"rotation":{"type":"number","minimum":-1080,"maximum":1080,"description":"Degrees"},"skewX":{"type":"number","minimum":-89,"maximum":89,"description":""},"skewY":{"type":"number","minimum":-89,"maximum":89,"description":""},"opacity":{"type":"number","minimum":0,"maximum":1,"description":""},"strokeWidth":{"type":"number","minimum":0,"maximum":60,"description":""},"transformOrigin":{"type":"string","description":"e.g. \"50% 50%\", \"center\", \"left top\""},"svgOrigin":{"type":"string","description":"Absolute SVG-coordinate pivot, e.g. \"130 130\" (use for orbit/rotation around a point)"},"fill":{"type":"string","description":"Hex or rgb() colour"},"stroke":{"type":"string","description":"Hex or rgb() colour"},"drawSVG":{"type":"string","description":"For drawSVG steps: start value, e.g. \"0%\" or \"50% 50%\""},"fromProps":{"type":"object","description":"Starting values (fromTo only)","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"Horizontal offset in SVG units"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"Vertical offset in SVG units"},"scale":{"type":"number","minimum":0,"maximum":10,"description":"Uniform scale (1 = natural size)"},"scaleX":{"type":"number","minimum":0,"maximum":10,"description":""},"scaleY":{"type":"number","minimum":0,"maximum":10,"description":""},"rotation":{"type":"number","minimum":-1080,"maximum":1080,"description":"Degrees"},"skewX":{"type":"number","minimum":-89,"maximum":89,"description":""},"skewY":{"type":"number","minimum":-89,"maximum":89,"description":""},"opacity":{"type":"number","minimum":0,"maximum":1,"description":""},"strokeWidth":{"type":"number","minimum":0,"maximum":60,"description":""},"transformOrigin":{"type":"string","description":"e.g. \"50% 50%\", \"center\", \"left top\""},"svgOrigin":{"type":"string","description":"Absolute SVG-coordinate pivot, e.g. \"130 130\" (use for orbit/rotation around a point)"},"fill":{"type":"string","description":"Hex or rgb() colour"},"stroke":{"type":"string","description":"Hex or rgb() colour"},"drawSVG":{"type":"string","description":"For drawSVG steps: start value, e.g. \"0%\" or \"50% 50%\""}},"additionalProperties":false}},"additionalProperties":false},"duration":{"type":"number","minimum":0,"maximum":8,"description":"Seconds per target"},"position":{"description":"Start time: absolute seconds (number), or relative string: \"<\" (with previous step), \">\" (after previous), \"+=0.2\"/\"-=0.2\" (relative to timeline end), \"<0.15\" (0.15s after previous start). Pattern ^([<>])?([+-]=)?(\\d+(\\.\\d+)?)?$","oneOf":[{"type":"number","minimum":0,"maximum":12},{"type":"string","pattern":"^([<>])?([+-]=)?(\\d+(\\.\\d+)?)?$"}]},"ease":{"type":"string","pattern":"^(none|linear|power[1-4]|sine|expo|circ|quad|cubic|quart|quint|back|elastic|bounce)(\\.(in|out|inOut))?(\\(\\s*-?\\d+(\\.\\d+)?(\\s*,\\s*-?\\d+(\\.\\d+)?)?\\s*\\))?$","description":"GSAP ease name: power1-4.out|in|inOut, sine, expo, circ, back.out(1.4), elastic.out(1,0.4), bounce.out, none"},"stagger":{"description":"Seconds between each target when the target matches several elements, or a config object.","oneOf":[{"type":"number","minimum":0,"maximum":4},{"type":"object","properties":{"amount":{"type":"number","minimum":0,"maximum":4,"description":"Total seconds spread across all targets"},"from":{"description":"\"start\" | \"center\" | \"end\" | \"random\" | index","oneOf":[{"type":"string","enum":["start","center","end","random"]},{"type":"number","minimum":0}]},"ease":{"type":"string","pattern":"^(none|linear|power[1-4]|sine|expo|circ|quad|cubic|quart|quint|back|elastic|bounce)(\\.(in|out|inOut))?(\\(\\s*-?\\d+(\\.\\d+)?(\\s*,\\s*-?\\d+(\\.\\d+)?)?\\s*\\))?$"},"sortBy":{"type":"string","enum":["dom-order","x-position","y-position","distance-from-center"],"description":"Spatial order for the stagger (e.g. distance-from-center to guide the eye inward)"}},"required":["amount"],"additionalProperties":false}]},"critical":{"type":"boolean","description":"If true, an unresolved target rejects the whole preview"}},"required":["id","target","tweenType","props","duration","position"],"additionalProperties":false},"index":{"type":"integer","minimum":0,"description":"Insert position (default: append)"}},"required":["op","step"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"update_step"},"stepId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"changes":{"type":"object","description":"Only the fields to change. props are shallow-merged; set a prop to null to remove it. stagger: null removes the stagger.","properties":{"label":{"type":"string","maxLength":80},"target":{"type":"object","description":"Semantic target. type \"id\" = one element by its id; \"group\" = every member of a semantic group (e.g. \"accents\"); \"role\" = every element with that role. No CSS selectors.","properties":{"type":{"type":"string","enum":["id","role","group"]},"value":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Element id, group id, or one of: primary, secondary, accent, utility"},"scopeToId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Scene element id the target lives in. Optional when the scene has one element."}},"required":["type","value"],"additionalProperties":false},"tweenType":{"type":"string","enum":["from","to","fromTo","set","drawSVG"],"description":"\"from\" is the usual choice for entrances."},"props":{"type":"object","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"Horizontal offset in SVG units"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"Vertical offset in SVG units"},"scale":{"type":"number","minimum":0,"maximum":10,"description":"Uniform scale (1 = natural size)"},"scaleX":{"type":"number","minimum":0,"maximum":10,"description":""},"scaleY":{"type":"number","minimum":0,"maximum":10,"description":""},"rotation":{"type":"number","minimum":-1080,"maximum":1080,"description":"Degrees"},"skewX":{"type":"number","minimum":-89,"maximum":89,"description":""},"skewY":{"type":"number","minimum":-89,"maximum":89,"description":""},"opacity":{"type":"number","minimum":0,"maximum":1,"description":""},"strokeWidth":{"type":"number","minimum":0,"maximum":60,"description":""},"transformOrigin":{"type":"string","description":"e.g. \"50% 50%\", \"center\", \"left top\""},"svgOrigin":{"type":"string","description":"Absolute SVG-coordinate pivot, e.g. \"130 130\" (use for orbit/rotation around a point)"},"fill":{"type":"string","description":"Hex or rgb() colour"},"stroke":{"type":"string","description":"Hex or rgb() colour"},"drawSVG":{"type":"string","description":"For drawSVG steps: start value, e.g. \"0%\" or \"50% 50%\""},"fromProps":{"type":"object","description":"Starting values (fromTo only)","properties":{"x":{"type":"number","minimum":-2000,"maximum":2000,"description":"Horizontal offset in SVG units"},"y":{"type":"number","minimum":-2000,"maximum":2000,"description":"Vertical offset in SVG units"},"scale":{"type":"number","minimum":0,"maximum":10,"description":"Uniform scale (1 = natural size)"},"scaleX":{"type":"number","minimum":0,"maximum":10,"description":""},"scaleY":{"type":"number","minimum":0,"maximum":10,"description":""},"rotation":{"type":"number","minimum":-1080,"maximum":1080,"description":"Degrees"},"skewX":{"type":"number","minimum":-89,"maximum":89,"description":""},"skewY":{"type":"number","minimum":-89,"maximum":89,"description":""},"opacity":{"type":"number","minimum":0,"maximum":1,"description":""},"strokeWidth":{"type":"number","minimum":0,"maximum":60,"description":""},"transformOrigin":{"type":"string","description":"e.g. \"50% 50%\", \"center\", \"left top\""},"svgOrigin":{"type":"string","description":"Absolute SVG-coordinate pivot, e.g. \"130 130\" (use for orbit/rotation around a point)"},"fill":{"type":"string","description":"Hex or rgb() colour"},"stroke":{"type":"string","description":"Hex or rgb() colour"},"drawSVG":{"type":"string","description":"For drawSVG steps: start value, e.g. \"0%\" or \"50% 50%\""}},"additionalProperties":false}},"additionalProperties":false},"duration":{"type":"number","minimum":0,"maximum":8,"description":"Seconds per target"},"position":{"description":"Start time: absolute seconds (number), or relative string: \"<\" (with previous step), \">\" (after previous), \"+=0.2\"/\"-=0.2\" (relative to timeline end), \"<0.15\" (0.15s after previous start). Pattern ^([<>])?([+-]=)?(\\d+(\\.\\d+)?)?$","oneOf":[{"type":"number","minimum":0,"maximum":12},{"type":"string","pattern":"^([<>])?([+-]=)?(\\d+(\\.\\d+)?)?$"}]},"ease":{"type":"string","pattern":"^(none|linear|power[1-4]|sine|expo|circ|quad|cubic|quart|quint|back|elastic|bounce)(\\.(in|out|inOut))?(\\(\\s*-?\\d+(\\.\\d+)?(\\s*,\\s*-?\\d+(\\.\\d+)?)?\\s*\\))?$","description":"GSAP ease name: power1-4.out|in|inOut, sine, expo, circ, back.out(1.4), elastic.out(1,0.4), bounce.out, none"},"stagger":{"oneOf":[{"type":"null"},{"type":"number","minimum":0,"maximum":4},{"type":"object","properties":{"amount":{"type":"number","minimum":0,"maximum":4,"description":"Total seconds spread across all targets"},"from":{"description":"\"start\" | \"center\" | \"end\" | \"random\" | index","oneOf":[{"type":"string","enum":["start","center","end","random"]},{"type":"number","minimum":0}]},"ease":{"type":"string","pattern":"^(none|linear|power[1-4]|sine|expo|circ|quad|cubic|quart|quint|back|elastic|bounce)(\\.(in|out|inOut))?(\\(\\s*-?\\d+(\\.\\d+)?(\\s*,\\s*-?\\d+(\\.\\d+)?)?\\s*\\))?$"},"sortBy":{"type":"string","enum":["dom-order","x-position","y-position","distance-from-center"],"description":"Spatial order for the stagger (e.g. distance-from-center to guide the eye inward)"}},"required":["amount"],"additionalProperties":false}]},"critical":{"type":"boolean","description":"If true, an unresolved target rejects the whole preview"}},"additionalProperties":false}},"required":["op","stepId","changes"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"remove_step"},"stepId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["op","stepId"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"reorder_steps"},"stepIds":{"type":"array","items":{"type":"string"},"description":"Every existing step id, in the new order"}},"required":["op","stepIds"],"additionalProperties":false},{"type":"object","properties":{"op":{"const":"set_timeline"},"totalDuration":{"type":"number","minimum":0.1,"maximum":12,"description":"Declared timeline length in seconds (the track extends automatically if steps run longer)"},"defaults":{"type":"object","properties":{"ease":{"type":"string","pattern":"^(none|linear|power[1-4]|sine|expo|circ|quad|cubic|quart|quint|back|elastic|bounce)(\\.(in|out|inOut))?(\\(\\s*-?\\d+(\\.\\d+)?(\\s*,\\s*-?\\d+(\\.\\d+)?)?\\s*\\))?$"},"duration":{"type":"number","minimum":0.01,"maximum":8}},"additionalProperties":false}},"required":["op"],"additionalProperties":false}]}},"autoplay":{"type":"boolean","description":"Play the preview immediately (default true)"}},"required":["baseRevision","operations"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?scene=glyph-hero-scene"},{"name":"apply_timeline_patch","kind":"act","impl":"imperative","description":"Accept a staged preview into the editable scene. The preview must be unexpired, still staged, and bound to the current revision (pass the same baseRevision). Adds an undo checkpoint, rebuilds and replays the timeline, and returns the new sceneRevision. The change is NOT yet persisted — call save_scene when the user asks to save.","title":"Apply timeline patch","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"inputSchema":{"type":"object","properties":{"previewId":{"type":"string","description":"previewId returned by preview_timeline_patch"},"baseRevision":{"type":"integer","minimum":0,"description":"The revision the preview was staged against"}},"required":["previewId","baseRevision"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?scene=glyph-hero-scene"},{"name":"undo_last_timeline_change","kind":"act","impl":"imperative","description":"Revert the most recently applied timeline or composition change in this page session (agent or human). Discards any staged preview first and restores the exact previous scene. Returns the restored revision. Refuses with NOTHING_TO_UNDO when history is empty.","title":"Undo last applied change","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?scene=glyph-hero-scene"},{"name":"save_scene","kind":"act","impl":"imperative","description":"Persist the current committed scene to the user's local browser storage. Explicit and revision-checked: pass sceneRevision from get_scene (or the revision returned by apply); REVISION_CONFLICT if the scene changed since. Fails while a preview is staged but not applied. Only call when the user asks to save.","title":"Save scene","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"sceneRevision":{"type":"integer","minimum":0},"name":{"type":"string","maxLength":80,"description":"Optional new project name"}},"required":["sceneRevision"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/?scene=glyph-hero-scene"}],"category":"Media & Personal","favicon":"/favicons/glyph-motion.slate-app.online.png","apiSurface":"spec","toolCount":10}}