← WebMCP Directory

Tool tree

glyph-motion.slate-app.online

Media & PersonalTools verified
Website
Glyph Motion Studio for WebMCP — direct motion in natural language, keep every keyframe under your control.
Explore capabilities
    get_sceneAnswer

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/?scene=glyph-hero-scene"
    }
    switch_sceneAction

    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.

    View tool JSON
    {
      "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.",
      "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
      },
      "page": "/?scene=glyph-hero-scene"
    }
    inspect_animation_targetsAnswer

    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.

    View tool JSON
    {
      "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.",
      "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
      },
      "page": "/?scene=glyph-hero-scene"
    }
    inspect_vector_sceneAnswer

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/?scene=glyph-hero-scene"
    }
    preview_scene_patchAction

    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.

    View tool JSON
    {
      "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.",
      "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
      },
      "page": "/?scene=glyph-hero-scene"
    }
    apply_scene_patchAction

    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.

    View tool JSON
    {
      "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.",
      "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
      },
      "page": "/?scene=glyph-hero-scene"
    }
    preview_timeline_patchAction

    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.

    View tool JSON
    {
      "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.",
      "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
      },
      "page": "/?scene=glyph-hero-scene"
    }
    apply_timeline_patchAction

    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.

    View tool JSON
    {
      "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.",
      "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
      },
      "page": "/?scene=glyph-hero-scene"
    }
    undo_last_timeline_changeAction

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/?scene=glyph-hero-scene"
    }
    save_sceneAction

    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.

    View tool JSON
    {
      "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.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "sceneRevision": {
            "type": "integer",
            "minimum": 0
          },
          "name": {
            "type": "string",
            "maxLength": 80,
            "description": "Optional new project name"
          }
        },
        "required": [
          "sceneRevision"
        ],
        "additionalProperties": false
      },
      "page": "/?scene=glyph-hero-scene"
    }