此 MCP 可以做什么
Generates and manages 2D game characters, assets, animations, tilesets, UI packs, maps, and engine-ready exports for multiple game engines.
工具
输入模式
{'type': 'object', 'required': ['assetId', 'iterationId'], 'properties': {'pairs': {'type': 'array', 'items': {'type': 'object', 'required': ['from', 'to'], 'properties': {'to': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'description': 'End tile index, or null for prompt-driven motion.'}, 'from': {'type': 'integer', 'minimum': 0, 'description': 'Start tile index.'}}, 'additionalProperties': False}, 'description': 'Grid assets only — which tile transitions to animate. Omit for single-image assets.'}, 'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'assetId': {'type': 'string', 'description': 'Asset id or slug.'}, 'closeLoop': {'type': 'boolean', 'description': 'Single-image assets — reuse the start frame as the end frame so the clip loops.'}, 'motionHint': {'type': 'string', 'description': 'Extra motion guidance folded into the prompt.'}, 'videoModel': {'type': 'string', 'description': 'Override the video model.'}, 'iterationId': {'type': 'string', 'description': 'Revision (iteration) id to animate.'}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}, 'durationSeconds': {'type': 'number', 'maximum': 10, 'minimum': 2, 'description': 'Clip length, clamped server-side to 2-10s.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['jobId'], 'properties': {'jobId': {'type': 'string', 'description': 'Job waiting for an automatic pose decision.'}, 'choice': {'enum': ['generated', 'original'], 'type': 'string', 'description': 'Required for an imported-pose review. Technical-failure fallback defaults to original.'}, 'poseVersion': {'type': 'string', 'description': 'Exact poseReview.version shown to and approved by the user; required for an imported-pose review.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['jobId', 'frameIndices'], 'properties': {'jobId': {'type': 'string', 'description': 'Waiting job id from get_job.'}, 'poseScales': {'type': 'object', 'required': ['s', 'se', 'e', 'ne', 'n', 'nw', 'w', 'sw'], 'properties': {'e': {'type': 'integer', 'maximum': 115, 'minimum': 70}, 'n': {'type': 'integer', 'maximum': 115, 'minimum': 70}, 's': {'type': 'integer', 'maximum': 115, 'minimum': 70}, 'w': {'type': 'integer', 'maximum': 115, 'minimum': 70}, 'ne': {'type': 'integer', 'maximum': 115, 'minimum': 70}, 'nw': {'type': 'integer', 'maximum': 115, 'minimum': 70}, 'se': {'type': 'integer', 'maximum': 115, 'minimum': 70}, 'sw': {'type': 'integer', 'maximum': 115, 'minimum': 70}}, 'description': 'Approved percent scale for every compass direction (70–115). Omit to keep the review values.', 'additionalProperties': False}, 'frameIndices': {'type': 'object', 'required': ['s', 'se', 'e', 'ne', 'n', 'nw', 'w', 'sw'], 'properties': {'e': {'type': 'integer', 'minimum': 0}, 'n': {'type': 'integer', 'minimum': 0}, 's': {'type': 'integer', 'minimum': 0}, 'w': {'type': 'integer', 'minimum': 0}, 'ne': {'type': 'integer', 'minimum': 0}, 'nw': {'type': 'integer', 'minimum': 0}, 'se': {'type': 'integer', 'minimum': 0}, 'sw': {'type': 'integer', 'minimum': 0}}, 'description': 'Approved source-frame index for every compass direction.', 'additionalProperties': False}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['jobId'], 'properties': {'jobId': {'type': 'string', 'description': 'Job id to cancel.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['draftId', 'draftHash', 'requestId'], 'properties': {'draftId': {'type': 'string', 'format': 'uuid'}, 'draftHash': {'type': 'string'}, 'requestId': {'type': 'string', 'maxLength': 128, 'minLength': 8}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['assetId', 'iterationId', 'projection'], 'properties': {'assetId': {'type': 'string', 'description': 'Legacy texture asset id or slug.'}, 'projection': {'enum': ['platformer', 'topdown', 'isometric'], 'type': 'string', 'description': 'Map projection this Material will paint.'}, 'iterationId': {'type': 'string', 'description': 'Legacy texture revision to preserve and convert.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId', 'poseId'], 'properties': {'fps': {'type': 'integer', 'maximum': 60, 'minimum': 1, 'description': 'Playback fps.'}, 'newId': {'type': 'string', 'description': 'Slug for the new animation ([A-Za-z0-9_-]).'}, 'poseId': {'type': 'string', 'description': 'Pose id, or "__idle__" for the character\'s default image.'}, 'characterId': {'type': 'string', 'description': 'Character id.'}, 'displayName': {'type': 'string', 'maxLength': 120, 'description': 'Human-facing label.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId', 'assetType', 'prompt'], 'properties': {'name': {'type': 'string', 'description': 'Display name (defaults to the prompt).'}, 'slug': {'type': 'string', 'description': 'Stable handle used by every /assets/:id call ([a-z0-9-]). Auto-derived from the name when omitted.'}, 'style': {'type': 'string', 'description': "Override the project's art style for this asset only."}, 'bgType': {'enum': ['scene', 'distant_backdrop', 'depth_layer', 'foreground_overlay', 'parallax_far', 'parallax_mid', 'parallax_near', 'platform_scene', 'static_backdrop', 'scrolling_backdrop', 'ground_fill', 'overhead_map', 'functional_map', 'scrolling_floor', 'parallax_underlay', 'iso_ground', 'iso_scene', 'iso_far', 'iso_platform_surface', 'full_scene', 'room_stage', 'parallax_strip', 'platform_scene_front', 'vista_backdrop'], 'type': 'string', 'description': 'REQUIRED for assetType "background" — prefer scene (one opaque full scene), distant_backdrop (one opaque far vista), depth_layer (one scenery layer with transparent gaps), or foreground_overlay (transparent edge framing). All four support every camera. One image per call, no automatic parallax pack, collision/navigation or verified seamless repeat. Angled top-down and strict overhead stay distinct; atmospheric vistas need no forced isometric geometry. Preserve project style. Legacy values remain view-specific: platformer → parallax_far/parallax_mid/parallax_near/platform_scene/static_backdrop/scrolling_backdrop; topdown + topdown_overhead → ground_fill/overhead_map/functional_map/scrolling_floor/parallax_underlay; isometric → iso_ground/iso_scene/iso_far/iso_platform_surface; point_and_click → full_scene/room_stage/parallax_strip/platform_scene_front/vista_backdrop. A mismatch, or omitting it, is rejected with 400. Each sub-type runs a different tuned prompt, so this decides what KIND of image you get — a far parallax sky and a functional platform scene are not interchangeable. Ask the user which layer they want if their request does not make it obvious.'}, 'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'prompt': {'type': 'string', 'maxLength': 20000, 'minLength': 1, 'description': 'What to generate. Describe the subject, not the art style — style comes from the project.'}, 'gridCols': {'type': 'integer', 'maximum': 16, 'minimum': 1, 'description': 'Legacy compatibility only; the confirmed plan decides columns.'}, 'gridRows': {'type': 'integer', 'maximum': 16, 'minimum': 1, 'description': 'Legacy compatibility only. The confirmed semantic plan owns layout. Object Collection and Environment Kit never add items just to fill cells.'}, 'tileSize': {'enum': [64, 128, 256], 'type': 'number', 'description': 'TERRAIN only — output tile size in px (64, 128 or 256).'}, 'assetType': {'enum': ['static', 'tileset', 'staged', 'background', 'terrain', 'texture'], 'type': 'string', 'description': '`static` = Object (formerly Static Asset), four separately editable design alternatives by default (explicit one supported); each may also be animated; tileset = Object Collection, one coordinated set of independently editable items; staged = one subject in N progressive stages (the input animate_asset expects); background = scenery, never a game object; terrain = Environment Kit, individually placed props, surface details or connecting modules; texture = Terrain Material, brushable fill/surface donors (wire names unchanged; editor topology is deterministic).'}, 'planToken': {'type': 'string', 'description': 'REQUIRED when dryRun=false. Copy unchanged from the immediately preceding dry-run response.'}, 'projectId': {'type': 'string', 'description': 'REQUIRED. Owning project (create_project / list_projects). Supplies gameType + default style.'}, 'bgViewType': {'enum': ['platformer', 'topdown', 'topdown_overhead', 'isometric', 'point_and_click'], 'type': 'string', 'description': 'BACKGROUND only — which view the background is drawn for. Defaults to the project gameType.'}, 'imageModel': {'type': 'string', 'description': 'Override the image model for non-Material assets. Materials use the server-owned MATERIAL_IMAGE_PRIMARY provider route.'}, 'runtimeUse': {'enum': ['plain_image', 'particle_emitter', 'deformable_strip', 'repeat_fill', 'nine_slice', 'shader_effect', 'path_follow'], 'type': 'string', 'description': 'OBJECT only (`assetType: "static"`; formerly Static Asset). Material is locked to deterministic brush rendering server-side. Declares how the art is meant to be rendered — particle_emitter, deformable_strip, nine_slice or shader_effect — which changes the prompt AND the export metadata. Anything other than plain_image on a non-Object type is rejected. path_follow remains accepted for legacy clients but must not be used for new assets; path motion is configured per placement in the level editor. It can also be set later with set_asset_runtime_intent, for free.'}, 'aspectRatio': {'enum': ['16:9', '4:3', '1:1', '9:16', '21:9'], 'type': 'string', 'description': 'BACKGROUND only — OPTIONAL, and best left unset: the server applies the recommended ratio for the chosen sub-type (e.g. 21:9 for a parallax layer, 1:1 for a ground fill), which is what the web wizard preselects. Only pass a value if the user asked for a specific shape. 21:9 is the widest and 9:16 the tallest the image model accepts.'}, 'perspective': {'enum': ['orthogonal', 'isometric', 'platformer'], 'type': 'string', 'description': 'Environment Kit only — legacy three-value camera override. Omit to retain the project’s distinct side, angled top-down, overhead, isometric or adventure camera; request finer camera changes in the prompt.'}, 'textureKind': {'enum': ['fill', 'strip'], 'type': 'string', 'description': 'LEGACY compatibility only. New Materials derive platformer/topdown/isometric projection from the project gameType; this value does not change their donor contract.'}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}, 'targetTileSize': {'type': 'integer', 'maximum': 512, 'minimum': 16, 'description': 'Output tile side in px (16-512).'}, 'referenceAssetUrls': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 4, 'description': 'Up to 4 reference image URLs to condition the generation. URLs only — raw base64 is rejected on this surface.'}, 'backgroundResolution': {'enum': ['1K', '2K', '4K'], 'type': 'string', 'description': 'BACKGROUND only — output tier (default 2K). 4K costs more.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId', 'prompt'], 'properties': {'style': {'type': 'string', 'description': "Art-style override. Omit to inherit the project's style — usually correct, since a project should look consistent."}, 'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'prompt': {'type': 'string', 'maxLength': 20000, 'minLength': 1, 'description': 'What the character is, e.g. "a plague doctor with a lantern". Describe the subject, not the art style.'}, 'gameType': {'enum': ['platformer', 'topdown', 'topdown_overhead', 'isometric', 'point_and_click'], 'type': 'string', 'description': 'Character perspective override. Omit to inherit the project. Use topdown for Top-Down Angled and isometric projects; isometric is mapped to topdown. The stored value controls later animation behavior and 360-turn eligibility.'}, 'gridCols': {'type': 'number', 'const': 2, 'description': 'Legacy equivalent of the default four-variation mode: set to 2 together with gridRows:2; extraction follows complete silhouettes.'}, 'gridRows': {'type': 'number', 'const': 2, 'description': 'Legacy equivalent of the default four-variation mode: set to 2 together with gridCols:2. This is not cut geometry.'}, 'projectId': {'type': 'string', 'description': 'REQUIRED. The project the character belongs to — it supplies the default gameType and style.'}, 'imageModel': {'type': 'string', 'description': 'Override the image model. Omit unless the user asked for a specific one.'}, 'cameraAngle': {'type': 'number', 'maximum': 80, 'minimum': 30, 'description': 'Camera elevation in degrees — only meaningful for angled top-down projects.'}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}, 'characterImageSize': {'enum': ['2:3', '1:1', '3:2'], 'type': 'string', 'description': 'Aspect ratio of the generated image. Omit for the game-type default.'}, 'referenceAssetUrls': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}, 'description': 'URLs of existing images to steer the design. URLs only — base64 is rejected by the API.'}, 'generateFourVariations': {'type': 'boolean', 'description': 'Defaults to true, matching the dashboard: one image call produces four design variations for the cost of one. Set false only when the user explicitly requests a single character.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['name', 'gameType'], 'properties': {'name': {'type': 'string', 'description': 'Project name shown in the dashboard.'}, 'style': {'type': 'string', 'description': 'Optional art-style id applied as the default for generations in this project.'}, 'gameType': {'enum': ['platformer', 'topdown', 'topdown_overhead', 'isometric', 'point_and_click'], 'type': 'string', 'description': 'REQUIRED and permanent for everything in the project. platformer = side view with gravity; topdown = 4/8-direction overhead-ish (Zelda-like); topdown_overhead = straight down; isometric = 2:1 diamond; point_and_click = straight-on adventure scenes. Ask the user if it is not obvious — it changes every prompt downstream.'}, 'styleGuide': {'type': 'object', 'required': ['version', 'direction', 'palette', 'shapeLanguage', 'rendering', 'headingFont', 'bodyFont', 'camera', 'references', 'lockedColors'], 'properties': {'camera': {'enum': ['platformer', 'topdown', 'topdown_overhead', 'isometric', 'point_and_click'], 'type': 'string'}, 'palette': {'type': 'object', 'propertyNames': {'pattern': '^[a-zA-Z][a-zA-Z0-9_-]{0,39}$'}, 'additionalProperties': {'type': 'string', 'pattern': '^#[0-9a-fA-F]{6}$'}}, 'version': {'type': 'number', 'const': 1}, 'bodyFont': {'type': 'object', 'required': ['family', 'fontId', 'weight', 'size', 'lineHeight', 'color'], 'properties': {'size': {'type': 'number', 'maximum': 160, 'minimum': 8}, 'color': {'type': 'string', 'pattern': '^#[0-9a-fA-F]{6}$'}, 'family': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'fontId': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'sha256': {'type': 'string', 'pattern': '^[a-f0-9]{64}$'}, 'weight': {'type': 'integer', 'maximum': 900, 'minimum': 100}, 'version': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'lineHeight': {'type': 'number', 'maximum': 3, 'minimum': 1}}, 'additionalProperties': False}, 'direction': {'type': 'string', 'maxLength': 2000}, 'rendering': {'type': 'string', 'maxLength': 500}, 'references': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'target'], 'properties': {'key': {'type': 'string', 'maxLength': 1500, 'minLength': 1}, 'target': {'enum': ['overall_style', 'ui', 'world_indicators', 'characters', 'backgrounds'], 'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 12}, 'headingFont': {'type': 'object', 'required': ['family', 'fontId', 'weight', 'size', 'lineHeight', 'color'], 'properties': {'size': {'type': 'number', 'maximum': 160, 'minimum': 8}, 'color': {'type': 'string', 'pattern': '^#[0-9a-fA-F]{6}$'}, 'family': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'fontId': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'sha256': {'type': 'string', 'pattern': '^[a-f0-9]{64}$'}, 'weight': {'type': 'integer', 'maximum': 900, 'minimum': 100}, 'version': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'lineHeight': {'type': 'number', 'maximum': 3, 'minimum': 1}}, 'additionalProperties': False}, 'lockedColors': {'type': 'array', 'items': {'type': 'string', 'pattern': '^#[0-9a-fA-F]{6}$'}, 'maxItems': 24}, 'shapeLanguage': {'type': 'string', 'maxLength': 500}}, 'description': 'Reviewed palette, rendering and typography. Saved as active revision 1 for future generations; font IDs must belong to the available catalog. Omit to create without a guide.', 'additionalProperties': False}, 'description': {'type': 'string', 'description': 'Optional project description. Feeds the prompt context for later generations.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId', 'name', 'width', 'height', 'children'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'width': {'type': 'integer', 'maximum': 2048, 'minimum': 8}, 'height': {'type': 'integer', 'maximum': 2048, 'minimum': 8}, 'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'children': {'type': 'array', 'items': {'type': 'object', 'required': ['componentId', 'revisionId', 'bounds'], 'properties': {'bounds': {'type': 'object', 'required': ['x', 'y', 'width', 'height'], 'properties': {'x': {'type': 'number'}, 'y': {'type': 'number'}, 'width': {'type': 'number'}, 'height': {'type': 'number'}}, 'additionalProperties': False}, 'revisionId': {'type': 'string', 'format': 'uuid'}, 'componentId': {'type': 'string', 'format': 'uuid', 'description': 'Owned component ID within this pack.'}}, 'additionalProperties': False}, 'maxItems': 8, 'minItems': 1}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId', 'name'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'projectId': {'type': 'string'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId', 'animation'], 'properties': {'newId': {'type': 'string', 'description': 'Slug for the copy ([A-Za-z0-9_-], default "<source>_copy").'}, 'animation': {'type': 'string', 'description': 'Source animation slug.'}, 'characterId': {'type': 'string', 'description': 'Character id.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['mapId'], 'properties': {'mapId': {'type': 'string', 'description': 'Map id.'}, 'engine': {'enum': ['tiled', 'phaser', 'godot', 'unity', 'gamemaker', 'unreal'], 'type': 'string', 'description': 'Target engine (default tiled). Unreal is a beta Paper2D artwork importer; native verification and gameplay integration remain pending.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['assetId', 'iterationId'], 'properties': {'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'assetId': {'type': 'string', 'description': 'Legacy texture asset id or slug (not a Material with a material recipe).'}, 'iterationId': {'type': 'string', 'description': 'Revision (iteration) id to fix.'}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['assetId', 'iterationId', 'frameIndices'], 'properties': {'fps': {'type': 'integer', 'maximum': 30, 'minimum': 1, 'description': 'Playback fps (1-30, default 12).'}, 'name': {'type': 'string', 'maxLength': 60, 'description': 'Label for the animation (default "Frames").'}, 'assetId': {'type': 'string', 'description': 'Asset id or slug (must be a grid asset: tileset or staged).'}, 'iterationId': {'type': 'string', 'description': 'Revision (iteration) id whose tiles are the frames.'}, 'frameIndices': {'type': 'array', 'items': {'type': 'integer', 'minimum': 0}, 'maxItems': 120, 'minItems': 2, 'description': 'Tile indices in playback order, e.g. [0,1,2,3,2,1]. At least 2, at most 120. Repeats are allowed — that is how you hold or ping-pong a frame.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId', 'animations'], 'properties': {'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'animations': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 16, 'minItems': 1, 'description': 'Animation slugs to generate, e.g. ["walk_right","idle"]. REQUIRED — each one is a separate paid video call.'}, 'videoModel': {'type': 'string', 'description': 'Override the video model.'}, 'animPrompts': {'type': 'object', 'description': "Per-animation extra guidance, keyed by animation slug. Folded into that animation's composed prompt.", 'additionalProperties': {'type': 'string'}}, 'characterId': {'type': 'string', 'description': 'Character id.'}, 'customAnims': {'type': 'object', 'description': "Define animations that are NOT part of the game type's standard set, keyed by the new slug.", 'additionalProperties': {'type': 'object', 'required': ['prompt'], 'properties': {'loop': {'type': 'boolean', 'description': 'Should it loop seamlessly.'}, 'prompt': {'type': 'string', 'minLength': 1, 'description': 'What the motion is.'}, 'duration': {'type': 'number', 'maximum': 10, 'minimum': 2, 'description': 'USER-REQUESTED OVERRIDE ONLY. Omit for the 2s default, even for a looping animation.'}, 'keepDirection': {'type': 'boolean', 'description': 'Lock the facing direction of the start frame.'}, 'anchorToGround': {'type': 'boolean', 'description': 'Pin each output frame to its visible feet so game physics owns vertical movement.'}}, 'additionalProperties': False}}, 'mirrorAnims': {'type': 'object', 'description': 'FREE mirrored copies, keyed newName → sourceName (e.g. { "walk_left": "walk_right" }). The source must be in this call\'s animations list; its fresh frames are flipped in the same job at no extra cost.', 'additionalProperties': {'type': 'string', 'minLength': 1}}, 'animDurations': {'type': 'object', 'description': 'USER-REQUESTED OVERRIDES ONLY (2-10s). Omit this field by default: every animation, including walks and loops, defaults to 2s. Never choose a longer clip unless the user explicitly requested that duration. Longer clips cost more.', 'additionalProperties': {'type': 'number', 'maximum': 10, 'minimum': 2}}, 'targetFacings': {'type': 'object', 'description': 'Camera-relative facing per animation slug (n, ne, e, se, s, sw, w, nw). Omit for overhead; four_direction accepts only n/e/s/w. Use this for custom actions and any standard action whose slug does not itself encode the intended direction.', 'additionalProperties': {'enum': ['s', 'se', 'e', 'ne', 'n', 'nw', 'w', 'sw'], 'type': 'string'}}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}, 'poseLastFrameIds': {'type': 'object', 'description': 'Optional per-animation END anchor pose ids, keyed by animation slug. Resolve ids with list_character_poses and use only status:"done" poses. The same pose id may be used for both endpoints of a loop.', 'additionalProperties': {'type': 'string', 'minLength': 1}}, 'poseFirstFrameIds': {'type': 'object', 'description': 'Optional per-animation START anchor pose ids, keyed by animation slug. Resolve ids with list_character_poses and use only status:"done" poses. Omit an entry to let the server choose/generate its anchor.', 'additionalProperties': {'type': 'string', 'minLength': 1}}, 'animationDirectionMode': {'enum': ['overhead', 'four_direction', 'eight_direction'], 'type': 'string', 'description': 'Choose this BEFORE selecting animations for a topdown character and pass it on dry-run plus confirmation. Preselect get_character.animationDirection.mode when present (Luna suggestion; user may override). overhead uses one rotatable true-overhead sprite, base action names, and no 360; four_direction uses S/N/E/W animations; eight_direction also uses NE/SE/SW/NW. The confirmed choice is saved on the character.'}, 'animationPipelineAssignmentToken': {'type': 'string', 'description': "Opaque server proof returned by this tool's dry-run. Copy it verbatim into the confirmed dryRun:false call; never create or edit it. If the server reports ANIMATION_PIPELINE_ASSIGNMENT_EXPIRED, preview again."}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId'], 'properties': {'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'seedPoseId': {'type': 'string', 'description': 'Rotate a specific DONE pose instead of the character\'s default image. Lands as "turn_<poseId>".'}, 'characterId': {'type': 'string', 'description': 'Character id.'}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}, 'discardPendingResult': {'type': 'boolean', 'description': 'Support escape hatch only: true abandons a repeatedly expired/unusable failed provider result and previews/starts a new paid turn. Omit for normal free recovery.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId', 'name', 'poseDescription'], 'properties': {'name': {'type': 'string', 'minLength': 1, 'description': 'Short pose name, e.g. "casting".'}, 'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'imageModel': {'type': 'string', 'description': 'Override the image model.'}, 'characterId': {'type': 'string', 'description': 'Character id.'}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}, 'poseDescription': {'type': 'string', 'minLength': 1, 'description': 'What the character should be doing, e.g. "kneeling, shield raised".'}, 'referencePoseId': {'type': 'string', 'description': 'Seed from an existing DONE pose instead of the base image.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['description'], 'properties': {'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'nameHint': {'type': 'string', 'description': 'Optional working title. Explicit user choices win over inference.'}, 'styleHint': {'type': 'string', 'description': 'Optional locked art direction.'}, 'references': {'type': 'array', 'items': {'type': 'object', 'required': ['url', 'tag'], 'properties': {'tag': {'type': 'string', 'description': 'What this reference controls, such as palette, character, or environment.'}, 'url': {'type': 'string', 'description': 'Reference image URL.'}, 'name': {'type': 'string', 'description': 'Optional label.'}}, 'additionalProperties': False}, 'maxItems': 6}, 'description': {'type': 'string', 'minLength': 1, 'description': "The game vision in the user's own words: story, mechanics, setting, mood, and audience."}, 'gameTypeHint': {'enum': ['platformer', 'topdown', 'topdown_overhead', 'isometric', 'point_and_click'], 'type': 'string', 'description': 'Optional locked gameplay camera/type.'}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['name', 'gameType'], 'properties': {'name': {'type': 'string', 'minLength': 1, 'description': 'Working title of the game.'}, 'style': {'type': 'string', 'description': 'Art style, if the user already has one in mind.'}, 'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'gameType': {'enum': ['platformer', 'topdown', 'topdown_overhead', 'isometric', 'point_and_click'], 'type': 'string', 'description': 'The view the game is played in — the brief is written for it.'}, 'references': {'type': 'array', 'items': {'type': 'object', 'required': ['url', 'tag'], 'properties': {'tag': {'type': 'string', 'description': 'What this reference is for, e.g. "character", "palette", "environment".'}, 'url': {'type': 'string', 'description': 'Reference image URL.'}, 'name': {'type': 'string', 'description': 'Optional label.'}}, 'additionalProperties': False}, 'maxItems': 6, 'description': 'Up to 6 tagged reference images the model can look at.'}, 'description': {'type': 'string', 'description': "The idea in the user's own words: setting, mood, mechanics."}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId'], 'properties': {'quote': {'type': 'object', 'description': 'Unmodified signed quote returned by the dry-run. Required when dryRun is false.', 'additionalProperties': {}}, 'dryRun': {'type': 'boolean', 'default': True, 'description': 'Show the user estimatedCredits and ask whether to proceed, unless already authorized in this session. Prefer the client native question UI with Approve / Decline / Discuss choices; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or magic word. Then set false and supply the returned quote.'}, 'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'request': {'type': 'object', 'required': ['requestId', 'components'], 'properties': {'requestId': {'type': 'string', 'maxLength': 128, 'minLength': 8}, 'components': {'type': 'array', 'items': {'type': 'object', 'required': ['kind', 'role', 'name', 'description', 'quantity'], 'properties': {'kind': {'enum': ['icon', 'frame', 'panel', 'bar', 'control', 'indicator'], 'type': 'string'}, 'name': {'type': 'string'}, 'role': {'type': 'string'}, 'method': {'enum': ['recommended', 'illustrated', 'vector'], 'type': 'string', 'default': 'recommended'}, 'quantity': {'type': 'integer', 'maximum': 64, 'minimum': 1}, 'description': {'type': 'string'}, 'indicatorAttachment': {'enum': ['ground', 'actor', 'screen'], 'type': 'string', 'description': 'World indicators only. Ground follows the project camera; actor and screen remain flat. Omitted means ground.'}, 'requiredCapabilities': {'type': 'array', 'items': {'enum': ['artwork', 'hollow', 'fill', 'resize', 'text', 'states', 'projection'], 'type': 'string'}, 'default': ['artwork']}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 1}}, 'additionalProperties': False}, 'idempotencyKey': {'type': 'string', 'maxLength': 128, 'minLength': 8, 'description': 'Reuse the same key when retrying a confirmed request.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['assetId'], 'properties': {'assetId': {'type': 'string', 'description': 'Asset id or slug.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId'], 'properties': {'characterId': {'type': 'string', 'description': 'Character id.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId'], 'properties': {'characterId': {'type': 'string', 'description': 'Character id.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Max items to return (default 100, max 500).'}, 'apiKeyId': {'type': 'string', 'description': 'Filter ledger entries to one key (UUID).'}, 'includeLedger': {'type': 'boolean', 'description': 'Also return recent ledger entries.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['kind', 'entityId'], 'properties': {'kind': {'enum': ['character', 'asset'], 'type': 'string', 'description': 'Which entity table to read.'}, 'entityId': {'type': 'string', 'description': 'Character id, or asset id/slug.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['target', 'entityId', 'engine'], 'properties': {'size': {'enum': ['512', '256', '128', '64'], 'type': 'string', 'description': 'Phaser character exports only — narrow the zip to one downscale variant. Godot, Unity, GameMaker, Unreal and Sparrow XML use full-resolution source frames; omit size for them.'}, 'engine': {'enum': ['phaser', 'godot', 'unity', 'gamemaker', 'fnf', 'unreal', 'tiled'], 'type': 'string', 'description': 'Target engine. "fnf" is characters only and emits Sparrow PNG/XML plus character JSON. "tiled" is maps only; sprites have no Tiled emitter. "unreal" is beta Paper2D artwork/flipbook import, not automatic gameplay or native-engine certification.'}, 'target': {'enum': ['character', 'asset', 'map'], 'type': 'string', 'description': 'What to export.'}, 'entityId': {'type': 'string', 'description': 'Character id, asset id/slug, or map id.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['target', 'entityId'], 'properties': {'size': {'anyOf': [{'type': 'integer', 'maximum': 1024, 'minimum': 16}, {'type': 'string', 'const': 'full'}], 'description': 'Max thumbnail edge (default 256, cap 1024). "full" opts out of downscaling.'}, 'format': {'enum': ['thumbnails', 'sheet'], 'type': 'string', 'description': '"sheet" returns one labeled contact sheet.'}, 'pairId': {'type': 'string', 'description': 'Motion pair id — required when target=assetPair.'}, 'target': {'enum': ['character', 'assetPair'], 'type': 'string', 'description': 'Frames of a character animation, or of an asset motion pair.'}, 'indices': {'type': 'string', 'description': 'Comma-separated frame indices to subset, e.g. "0,4,8".'}, 'entityId': {'type': 'string', 'description': 'Character id (target=character) or asset id/slug (target=assetPair).'}, 'animation': {'type': 'string', 'description': 'Animation slug — required when target=character.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {'installedSkillVersion': {'type': 'string', 'pattern': '^(0|[1-9]\\d{0,5})\\.(0|[1-9]\\d{0,5})\\.(0|[1-9]\\d{0,5})$', 'description': 'Stable major.minor.patch version from the installed SpriteShip instructions; omit for unversioned or unknown copies.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['jobId'], 'properties': {'jobId': {'type': 'string', 'description': 'Job id.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['mapId'], 'properties': {'mapId': {'type': 'string', 'description': 'Map id.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['draftId'], 'properties': {'draftId': {'type': 'string', 'format': 'uuid'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'projectId': {'type': 'string', 'description': 'Project id.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId', 'jobId'], 'properties': {'jobId': {'type': 'string'}, 'projectId': {'type': 'string'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId', 'engine'], 'properties': {'engine': {'enum': ['phaser', 'godot', 'unity'], 'type': 'string'}, 'projectId': {'type': 'string'}, 'startMapId': {'type': 'string'}, 'playerCharacterId': {'type': 'string'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId', 'jobId'], 'properties': {'jobId': {'type': 'string'}, 'projectId': {'type': 'string'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'projectId': {'type': 'string'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId'], 'properties': {'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId', 'batchId'], 'properties': {'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'batchId': {'type': 'string', 'format': 'uuid'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId', 'batchId'], 'properties': {'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'batchId': {'type': 'string', 'format': 'uuid'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId'], 'properties': {'engine': {'enum': ['phaser', 'godot', 'unity', 'gamemaker', 'unreal', 'tiled'], 'type': 'string', 'default': 'phaser'}, 'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'artworkOnly': {'type': 'boolean', 'default': False}, 'componentIds': {'type': 'array', 'items': {'type': 'string', 'format': 'uuid', 'description': 'Owned component ID within this pack.'}}, 'sourceFormat': {'enum': ['svg', 'png'], 'type': 'string', 'default': 'png'}, 'sourceComponentId': {'type': 'string', 'format': 'uuid', 'description': 'Owned component ID within this pack.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId', 'name', 'kind', 'requestId', 'imageBase64'], 'properties': {'kind': {'enum': ['static', 'character'], 'type': 'string'}, 'name': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'confirmed': {'type': 'boolean'}, 'projectId': {'type': 'string'}, 'requestId': {'type': 'string', 'format': 'uuid'}, 'imageBase64': {'type': 'string'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'Case-insensitive substring filter on the name.'}, 'slug': {'type': 'string', 'description': 'Exact slug match (a slug is an identifier — no partial hits).'}, 'type': {'enum': ['static', 'tileset', 'staged', 'background', 'terrain', 'texture'], 'type': 'string', 'description': 'Filter by asset type. Use `static` for Object (formerly Static Asset).'}, 'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Max items to return (default 100, max 500).'}, 'projectId': {'type': 'string', 'description': 'Restrict to one project.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId'], 'properties': {'characterId': {'type': 'string', 'description': 'Character id.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'Case-insensitive substring filter on the name.'}, 'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Max items to return (default 100, max 500).'}, 'projectId': {'type': 'string', 'description': 'Restrict to one project.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['mapId'], 'properties': {'mapId': {'type': 'string'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Max items to return (default 100, max 500).'}, 'projectId': {'type': 'string', 'description': 'Restrict to one project.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Max items to return (default 100, max 500).'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {'projectId': {'type': 'string'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'mapId': {'type': 'string'}, 'projectId': {'type': 'string'}, 'assetOffset': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId'], 'properties': {'projectId': {'type': 'string'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['mapId'], 'properties': {'mapId': {'type': 'string'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId', 'animation'], 'properties': {'animation': {'type': 'string', 'description': 'Animation slug to flip in place.'}, 'characterId': {'type': 'string', 'description': 'Character id.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId', 'animation', 'phases'], 'properties': {'phases': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'startFrame', 'endFrame', 'loop'], 'properties': {'id': {'type': 'string', 'pattern': '^[a-zA-Z0-9_-]+$', 'maxLength': 64, 'minLength': 1, 'description': 'Slug for the new phase animation ([A-Za-z0-9_-]).'}, 'loop': {'type': 'boolean', 'description': 'Whether the phase loops (true for an airborne fall) or plays once.'}, 'role': {'type': 'string', 'maxLength': 32, 'description': 'Phase role from the proposal, e.g. "crouch" / "rise" / "fall" / "land".'}, 'label': {'type': 'string', 'maxLength': 120, 'description': 'Human-facing label.'}, 'endFrame': {'type': 'integer', 'minimum': 0, 'description': 'Last frame of the window (inclusive).'}, 'startFrame': {'type': 'integer', 'minimum': 0, 'description': 'First frame of the window (inclusive), indexing the FULL capture.'}}, 'additionalProperties': False}, 'maxItems': 6, 'minItems': 2, 'description': '2-6 phase windows. animations[<anim>].phaseProposal from get_character usually supplies these verbatim.'}, 'animation': {'type': 'string', 'description': 'Source animation slug (e.g. "jump").'}, 'characterId': {'type': 'string', 'description': 'Character id.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['entities'], 'properties': {'entities': {'type': 'array', 'items': {'type': 'object', 'required': ['kind', 'id'], 'properties': {'id': {'type': 'string', 'maxLength': 300, 'minLength': 1, 'description': 'Opaque entity id from the lock file.'}, 'kind': {'enum': ['character', 'asset', 'map', 'ui-pack'], 'type': 'string', 'description': 'Entity table represented by this lock entry.'}, 'engine': {'enum': ['phaser', 'godot', 'unity', 'gamemaker', 'fnf', 'unreal', 'tiled'], 'type': 'string', 'description': 'Export engine already used by this lock entry. Defaults to phaser; Sparrow XML supports characters; tiled supports maps and UI pack artwork.'}, 'version': {'anyOf': [{'type': 'string', 'maxLength': 300}, {'type': 'null'}], 'description': 'contentVersion for a character, map or the exact UI pack export; updatedAt for an asset.'}, 'snapshot': {'anyOf': [{'type': 'object', 'required': ['kind', 'name', 'frameSize', 'collisionBody', 'animations'], 'properties': {'kind': {'type': 'string', 'const': 'character'}, 'name': {'type': 'string', 'maxLength': 300}, 'frameSize': {'anyOf': [{'type': 'integer', 'exclusiveMinimum': 0}, {'type': 'null'}]}, 'animations': {'type': 'object', 'propertyNames': {'maxLength': 200}, 'additionalProperties': {'type': 'object', 'required': ['displayName', 'frameCount', 'fps', 'loop', 'collisionBody'], 'properties': {'fps': {'type': 'number', 'minimum': 0}, 'loop': {'type': 'boolean'}, 'frameCount': {'type': 'integer', 'minimum': 0}, 'displayName': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}]}, 'collisionBody': {'anyOf': [{'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number'}, 'cy': {'type': 'number'}, 'hh': {'type': 'number'}, 'hw': {'type': 'number'}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number'}, 'cx': {'type': 'number'}, 'cy': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number'}, 'y': {'type': 'number'}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'collisionBody': {'anyOf': [{'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number'}, 'cy': {'type': 'number'}, 'hh': {'type': 'number'}, 'hw': {'type': 'number'}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number'}, 'cx': {'type': 'number'}, 'cy': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number'}, 'y': {'type': 'number'}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, {'type': 'null'}]}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'name', 'slug', 'currentIterationId', 'iterationCount', 'hasAnimation', 'runtimeUse', 'tileRuntimeUses', 'animationPairs'], 'properties': {'kind': {'type': 'string', 'const': 'asset'}, 'name': {'type': 'string', 'maxLength': 300}, 'slug': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}]}, 'runtimeUse': {'type': 'string', 'maxLength': 100}, 'hasAnimation': {'type': 'boolean'}, 'animationPairs': {'type': 'object', 'propertyNames': {'maxLength': 200}, 'additionalProperties': {'type': 'object', 'required': ['label', 'frameCount', 'fps', 'iterationCount'], 'properties': {'fps': {'anyOf': [{'type': 'number', 'minimum': 0}, {'type': 'null'}]}, 'label': {'anyOf': [{'type': 'string', 'maxLength': 300}, {'type': 'null'}]}, 'frameCount': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}]}, 'iterationCount': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}}, 'iterationCount': {'type': 'integer', 'minimum': 0}, 'tileRuntimeUses': {'type': 'array', 'items': {'type': 'string', 'maxLength': 200}, 'maxItems': 256}, 'currentIterationId': {'anyOf': [{'type': 'string', 'maxLength': 300}, {'type': 'null'}]}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'name', 'widthPx', 'heightPx', 'gridSize', 'hasMapData'], 'properties': {'kind': {'type': 'string', 'const': 'map'}, 'name': {'type': 'string', 'maxLength': 300}, 'widthPx': {'type': 'integer', 'exclusiveMinimum': 0}, 'gridSize': {'type': 'integer', 'exclusiveMinimum': 0}, 'heightPx': {'type': 'integer', 'exclusiveMinimum': 0}, 'hasMapData': {'type': 'boolean'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'name', 'componentCount', 'components'], 'properties': {'kind': {'type': 'string', 'const': 'ui-pack'}, 'name': {'type': 'string', 'maxLength': 300}, 'components': {'type': 'object', 'propertyNames': {'maxLength': 200}, 'additionalProperties': {'type': 'object', 'required': ['name', 'revisionId', 'configurationHash', 'status'], 'properties': {'name': {'type': 'string', 'maxLength': 300}, 'status': {'type': 'string', 'maxLength': 200}, 'revisionId': {'anyOf': [{'type': 'string', 'maxLength': 300}, {'type': 'null'}]}, 'configurationHash': {'anyOf': [{'type': 'string', 'maxLength': 300}, {'type': 'null'}]}}, 'additionalProperties': False}}, 'componentCount': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}], 'description': 'Copy the prior snapshot from the lock file verbatim. Omit for a v1 lock entry.'}, 'artworkOnly': {'type': 'boolean', 'description': 'UI pack only: preserve the originally authorized recovery mode; never silently enable it.'}, 'componentIds': {'type': 'array', 'items': {'type': 'string', 'format': 'uuid'}, 'maxItems': 256, 'minItems': 1, 'description': 'UI pack only: preserve the original selected component IDs; omit for the whole pack.'}}, 'additionalProperties': False}, 'maxItems': 100, 'minItems': 1}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId', 'name', 'document'], 'properties': {'name': {'type': 'string'}, 'mapId': {'type': 'string'}, 'document': {'type': 'object', 'description': 'Complete map JSON conforming to map_authoring_schema.', 'additionalProperties': {}}, 'projectId': {'type': 'string'}, 'expectedRevision': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['expectedRevision', 'operations', 'mapId'], 'properties': {'mapId': {'type': 'string'}, 'operations': {'type': 'array', 'items': {'anyOf': [{'type': 'object', 'required': ['op', 'layerId', 'object'], 'properties': {'op': {'type': 'string', 'const': 'put-object'}, 'object': {'type': 'object', 'additionalProperties': {}}, 'layerId': {'type': 'string', 'maxLength': 160, 'minLength': 1}}, 'additionalProperties': False}, {'type': 'object', 'required': ['op', 'id', 'x', 'y'], 'properties': {'x': {'type': 'number'}, 'y': {'type': 'number'}, 'id': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'op': {'type': 'string', 'const': 'move-object'}, 'layerId': {'type': 'string', 'maxLength': 160, 'minLength': 1}}, 'additionalProperties': False}, {'type': 'object', 'required': ['op', 'id'], 'properties': {'id': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'op': {'type': 'string', 'const': 'remove-object'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['op', 'layer'], 'properties': {'op': {'type': 'string', 'const': 'put-layer'}, 'layer': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}, {'type': 'object', 'required': ['op', 'id'], 'properties': {'id': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'op': {'type': 'string', 'const': 'remove-layer'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['op', 'values'], 'properties': {'op': {'type': 'string', 'const': 'settings'}, 'values': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}, {'type': 'object', 'required': ['op', 'assemblyId', 'x', 'y', 'instanceId'], 'properties': {'x': {'type': 'number'}, 'y': {'type': 'number'}, 'op': {'type': 'string', 'const': 'instantiate-assembly'}, 'assemblyId': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'instanceId': {'type': 'string', 'pattern': '^[a-zA-Z0-9_-]{1,80}$'}}, 'additionalProperties': False}]}, 'maxItems': 200, 'minItems': 1}, 'expectedRevision': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['draftId'], 'properties': {'scale': {'type': 'number', 'maximum': 4, 'minimum': 0.01, 'description': 'Requested output pixels per world pixel; default 1. Capped to 2048 output pixels on the longest edge. Read returned scale for the effective value.'}, 'draftId': {'type': 'string', 'format': 'uuid'}, 'viewport': {'type': 'object', 'required': ['x', 'y', 'widthPx', 'heightPx'], 'properties': {'x': {'type': 'number', 'minimum': 0, 'description': 'Left edge in map world pixels.'}, 'y': {'type': 'number', 'minimum': 0, 'description': 'Top edge in map world pixels.'}, 'widthPx': {'type': 'number', 'maximum': 65536, 'description': 'Region width in world pixels; must fit inside the map.', 'exclusiveMinimum': 0}, 'heightPx': {'type': 'number', 'maximum': 65536, 'description': 'Region height in world pixels; must fit inside the map.', 'exclusiveMinimum': 0}}, 'description': 'Omit for the entire map. Use camera-sized regions to inspect terrain and placement detail.', 'additionalProperties': False}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId'], 'properties': {'animation': {'type': 'string', 'description': 'Animation slug to rebuild independently. Omit only to rebuild the whole character.'}, 'characterId': {'type': 'string', 'description': 'Character id.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId', 'batchId', 'sourceHash', 'crops'], 'properties': {'crops': {'type': 'array', 'items': {'type': 'object', 'required': ['index', 'bounds'], 'properties': {'index': {'type': 'integer', 'maximum': 7, 'minimum': 0}, 'bounds': {'type': 'object', 'required': ['x', 'y', 'width', 'height'], 'properties': {'x': {'type': 'integer', 'minimum': 0}, 'y': {'type': 'integer', 'minimum': 0}, 'width': {'type': 'integer', 'maximum': 2048, 'minimum': 1}, 'height': {'type': 'integer', 'maximum': 2048, 'minimum': 1}}, 'additionalProperties': False}}, 'additionalProperties': False}, 'maxItems': 8, 'minItems': 1}, 'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'batchId': {'type': 'string', 'format': 'uuid'}, 'sourceHash': {'type': 'string', 'pattern': '^[a-f0-9]{64}$'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['assetId', 'pairId'], 'properties': {'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'pairId': {'type': 'string', 'description': 'Motion pair id (from get_asset).'}, 'assetId': {'type': 'string', 'description': 'Asset id or slug.'}, 'videoModel': {'type': 'string', 'description': 'Override the video model.'}, 'motionPrompt': {'type': 'string', 'description': 'Replacement motion prompt for this take.'}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}, 'durationSeconds': {'type': 'number', 'maximum': 10, 'minimum': 2, 'description': "Informs the cost estimate only — the dispatched job uses the pair's own duration."}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId', 'animation'], 'properties': {'animation': {'type': 'string', 'description': 'Animation slug to re-matte in place.'}, 'characterId': {'type': 'string', 'description': 'Character id.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId', 'componentId', 'name', 'expectedName'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'componentId': {'type': 'string', 'format': 'uuid', 'description': 'Owned component ID within this pack.'}, 'expectedName': {'type': 'string', 'maxLength': 120, 'minLength': 1}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId', 'componentId', 'revisionId', 'imageBase64'], 'properties': {'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'revisionId': {'type': 'string', 'format': 'uuid'}, 'componentId': {'type': 'string', 'format': 'uuid', 'description': 'Owned component ID within this pack.'}, 'imageBase64': {'type': 'string', 'maxLength': 6000000, 'minLength': 1}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['assetId', 'iterationId'], 'properties': {'anchor': {'enum': ['top-left', 'top-middle', 'top-right', 'middle-left', 'center', 'middle-right', 'bottom-left', 'bottom-middle', 'bottom-right'], 'type': 'string', 'description': 'Where each sprite is placed inside its cell. "bottom-middle" is the default for sprites that stand on the ground.'}, 'assetId': {'type': 'string', 'description': 'Asset id or slug (staged, tileset, or manifest-backed terrain).'}, 'cellInset': {'type': 'integer', 'maximum': 32, 'minimum': 0, 'description': 'Legacy source sheets only: pixels shaved off every side of each cell to drop neighbouring bleed (0-32). Ignored for independent-item manifests. Pass 0 to clear.'}, 'cellOffsets': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'integer', 'description': 'Horizontal nudge in pixels.'}, 'y': {'type': 'integer', 'description': 'Vertical nudge in pixels.'}}, 'additionalProperties': False}, 'description': 'Per-cell pixel nudges, in tile-index order. Pass [] to clear all nudges.'}, 'iterationId': {'type': 'string', 'description': 'Collection revision (iteration) id to arrange.'}, 'fitItemIndices': {'type': 'array', 'items': {'type': 'integer', 'minimum': 0}, 'maxItems': 256, 'description': 'Independent-item manifests only: itemIndex values to fit to the shared cell while preserving aspect ratio. This is a one-shot operation; omitted items keep their saved size.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['mapId', 'revision', 'expectedRevision', 'requestId'], 'properties': {'mapId': {'type': 'string'}, 'revision': {'type': 'integer', 'minimum': 0}, 'requestId': {'type': 'string', 'maxLength': 128, 'minLength': 8}, 'expectedRevision': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId', 'poseId'], 'properties': {'poseId': {'type': 'string'}, 'characterId': {'type': 'string'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId', 'batchId'], 'properties': {'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'batchId': {'type': 'string', 'format': 'uuid'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['jobId'], 'properties': {'jobId': {'type': 'string', 'description': 'Id of a job whose status is "error" (from get_job).'}, 'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['kind', 'entityId', 'reason', 'requestId'], 'properties': {'kind': {'enum': ['asset_image', 'asset_animation', 'character_image', 'character_animation', 'character_pose'], 'type': 'string', 'description': 'Use character_pose with poseId for a completed generated pose with saved inputs, creating a new pose on the same character. Extracted/mirrored poses are excluded. Use character_animation for ordinary character animations and completed standalone or automatic setup 360 video turns. Setup requires a completed owned job with an approved review and retained padded input. Turn retries create a new standalone turn without replacing approved poses or rerunning dependent animations. Grid-sheet rotations and unidentifiable sources are excluded.'}, 'poseId': {'type': 'string'}, 'reason': {'enum': ['hallucinated', 'unusable', 'other'], 'type': 'string'}, 'entityId': {'type': 'string'}, 'confirmed': {'type': 'boolean', 'description': 'True only after the user approved using one quality retry.'}, 'requestId': {'type': 'string', 'format': 'uuid'}, 'revisionId': {'type': 'string'}, 'animationId': {'type': 'string'}, 'issueDetails': {'type': 'string', 'maxLength': 1000, 'minLength': 1, 'description': 'Required for reason=other. Describe the unusable result in up to 1000 characters; stored for support, not sent to AI or used to change the original prompt. Preserve on requestId replay.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['assetId'], 'properties': {'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'prompt': {'type': 'string', 'maxLength': 20000, 'description': 'What to change. Required unless templateId is given (terrain).'}, 'assetId': {'type': 'string', 'description': 'Asset id or slug.'}, 'planToken': {'type': 'string', 'description': 'REQUIRED when dryRun=false. Copy unchanged from the immediately preceding dry-run response.'}, 'imageModel': {'type': 'string', 'description': 'Override the image model.'}, 'templateId': {'enum': ['edges', 'grounds', 'props', 'slopes', 'textures', 'structures'], 'type': 'string', 'description': 'Environment Kit (`terrain`) only — legacy focused category pack, not a dashboard prompt-starter ID.'}, 'textureKind': {'enum': ['fill', 'strip'], 'type': 'string', 'description': "Texture only — 4-way seamless fill, or a directional left-right strip. Defaults to the asset's existing kind."}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}, 'sourceItemIndex': {'type': 'integer', 'minimum': 0, 'description': 'Collection item to seed a related collection. Preserves the source and creates one new asset per output.'}, 'sourceIterationId': {'type': 'string', 'description': 'Revise from a specific earlier revision instead of the current one.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId', 'componentId'], 'properties': {'quote': {'type': 'object', 'description': 'Unmodified signed quote returned by the dry-run. Required when dryRun is false.', 'additionalProperties': {}}, 'dryRun': {'type': 'boolean', 'default': True, 'description': 'Show the user estimatedCredits and ask whether to proceed, unless already authorized in this session. Prefer the client native question UI with Approve / Decline / Discuss choices; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or magic word. Then set false and supply the returned quote.'}, 'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'request': {'type': 'object', 'required': ['requestId', 'revisionId', 'prompt'], 'properties': {'prompt': {'type': 'string', 'maxLength': 2000, 'minLength': 1}, 'requestId': {'type': 'string', 'maxLength': 128, 'minLength': 8}, 'revisionId': {'type': 'string', 'format': 'uuid'}, 'referenceImageBase64': {'type': 'string', 'maxLength': 6000000}}, 'additionalProperties': False}, 'componentId': {'type': 'string', 'format': 'uuid', 'description': 'Owned component ID within this pack.'}, 'idempotencyKey': {'type': 'string', 'maxLength': 128, 'minLength': 8, 'description': 'Reuse the same key when retrying a confirmed request.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['scenario'], 'properties': {'mapId': {'type': 'string'}, 'draftId': {'type': 'string', 'format': 'uuid'}, 'scenario': {'anyOf': [{'type': 'object', 'required': ['id', 'name', 'kind', 'start', 'goal', 'body', 'expected'], 'properties': {'id': {'type': 'string', 'maxLength': 128, 'minLength': 1}, 'body': {'type': 'object', 'required': ['width', 'height'], 'properties': {'width': {'type': 'number', 'maximum': 16384, 'exclusiveMinimum': 0}, 'height': {'type': 'number', 'maximum': 16384, 'exclusiveMinimum': 0}}, 'additionalProperties': False}, 'goal': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1000000, 'minimum': -1000000}, 'y': {'type': 'number', 'maximum': 1000000, 'minimum': -1000000}, 'surfaceId': {'type': 'string', 'maxLength': 128, 'minLength': 1}}, 'additionalProperties': False}, 'kind': {'type': 'string', 'const': 'route'}, 'name': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'start': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1000000, 'minimum': -1000000}, 'y': {'type': 'number', 'maximum': 1000000, 'minimum': -1000000}, 'surfaceId': {'type': 'string', 'maxLength': 128, 'minLength': 1}}, 'additionalProperties': False}, 'cellSize': {'type': 'number', 'maximum': 128, 'minimum': 1}, 'expected': {'enum': ['reachable', 'blocked'], 'type': 'string'}, 'maxNodes': {'type': 'integer', 'maximum': 12000, 'minimum': 1}}, 'additionalProperties': False}, {'type': 'object', 'required': ['id', 'name', 'start', 'steps', 'hz', 'expect', 'kind', 'body'], 'properties': {'hz': {'enum': [30, 60, 120], 'type': 'number'}, 'id': {'type': 'string', 'maxLength': 128, 'minLength': 1}, 'body': {'type': 'object', 'required': ['radius', 'halfHeight'], 'properties': {'radius': {'type': 'number', 'maximum': 8192, 'exclusiveMinimum': 0}, 'halfHeight': {'type': 'number', 'maximum': 8192, 'exclusiveMinimum': 0}}, 'additionalProperties': False}, 'kind': {'type': 'string', 'const': 'surface-runner'}, 'name': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'start': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1000000, 'minimum': -1000000}, 'y': {'type': 'number', 'maximum': 1000000, 'minimum': -1000000}}, 'additionalProperties': False}, 'steps': {'type': 'array', 'items': {'type': 'object', 'required': ['frames', 'axis'], 'properties': {'axis': {'type': 'number', 'maximum': 1, 'minimum': -1}, 'jump': {'type': 'boolean'}, 'frames': {'type': 'integer', 'maximum': 3600, 'minimum': 1}, 'interact': {'type': 'boolean'}}, 'additionalProperties': False}, 'maxItems': 128, 'minItems': 1}, 'expect': {'type': 'object', 'properties': {'events': {'type': 'array', 'items': {'enum': ['land', 'jump', 'detach', 'connect', 'blocked', 'checkpoint', 'respawn', 'door', 'motion', 'custom'], 'type': 'string'}, 'maxItems': 10, 'minItems': 1}, 'region': {'type': 'object', 'required': ['x', 'y', 'width', 'height'], 'properties': {'x': {'type': 'number', 'maximum': 1000000, 'minimum': -1000000}, 'y': {'type': 'number', 'maximum': 1000000, 'minimum': -1000000}, 'width': {'type': 'number', 'maximum': 16384, 'exclusiveMinimum': 0}, 'height': {'type': 'number', 'maximum': 16384, 'exclusiveMinimum': 0}}, 'additionalProperties': False}, 'supportPathId': {'type': 'string', 'maxLength': 128, 'minLength': 1}}, 'additionalProperties': False}}, 'additionalProperties': False}, {'type': 'object', 'required': ['id', 'name', 'start', 'steps', 'hz', 'expect', 'kind', 'body', 'profile'], 'properties': {'hz': {'enum': [30, 60, 120], 'type': 'number'}, 'id': {'type': 'string', 'maxLength': 128, 'minLength': 1}, 'body': {'type': 'object', 'required': ['width', 'height'], 'properties': {'width': {'type': 'number', 'maximum': 16384, 'exclusiveMinimum': 0}, 'height': {'type': 'number', 'maximum': 16384, 'exclusiveMinimum': 0}}, 'additionalProperties': False}, 'kind': {'type': 'string', 'const': 'platformer'}, 'name': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'start': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1000000, 'minimum': -1000000}, 'y': {'type': 'number', 'maximum': 1000000, 'minimum': -1000000}}, 'additionalProperties': False}, 'steps': {'type': 'array', 'items': {'type': 'object', 'required': ['frames', 'axis'], 'properties': {'axis': {'type': 'number', 'maximum': 1, 'minimum': -1}, 'jump': {'type': 'boolean'}, 'frames': {'type': 'integer', 'maximum': 3600, 'minimum': 1}, 'interact': {'type': 'boolean'}}, 'additionalProperties': False}, 'maxItems': 128, 'minItems': 1}, 'expect': {'type': 'object', 'properties': {'events': {'type': 'array', 'items': {'enum': ['land', 'jump', 'detach', 'connect', 'blocked', 'checkpoint', 'respawn', 'door', 'motion', 'custom'], 'type': 'string'}, 'maxItems': 10, 'minItems': 1}, 'region': {'type': 'object', 'required': ['x', 'y', 'width', 'height'], 'properties': {'x': {'type': 'number', 'maximum': 1000000, 'minimum': -1000000}, 'y': {'type': 'number', 'maximum': 1000000, 'minimum': -1000000}, 'width': {'type': 'number', 'maximum': 16384, 'exclusiveMinimum': 0}, 'height': {'type': 'number', 'maximum': 16384, 'exclusiveMinimum': 0}}, 'additionalProperties': False}, 'supportPathId': {'type': 'string', 'maxLength': 128, 'minLength': 1}}, 'additionalProperties': False}, 'profile': {'type': 'object', 'required': ['speed', 'gravity', 'jumpSpeed'], 'properties': {'speed': {'type': 'number', 'maximum': 10000, 'exclusiveMinimum': 0}, 'gravity': {'type': 'number', 'maximum': 10000, 'exclusiveMinimum': 0}, 'airJumps': {'type': 'integer', 'maximum': 4, 'minimum': 0}, 'jumpSpeed': {'type': 'number', 'maximum': 10000, 'exclusiveMinimum': 0}}, 'additionalProperties': False}}, 'additionalProperties': False}]}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId', 'expectedRevision', 'guide'], 'properties': {'guide': {'type': 'object', 'additionalProperties': {}}, 'projectId': {'type': 'string'}, 'expectedRevision': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId', 'componentId', 'revisionId', 'configuration'], 'properties': {'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'revisionId': {'type': 'string', 'format': 'uuid'}, 'componentId': {'type': 'string', 'format': 'uuid', 'description': 'Owned component ID within this pack.'}, 'configuration': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId', 'styleGuide', 'expectedUpdatedAt'], 'properties': {'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'styleGuide': {'type': 'object', 'additionalProperties': {}}, 'expectedUpdatedAt': {'type': 'string', 'format': 'date-time'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['target', 'entityId', 'frames'], 'properties': {'frames': {'type': 'array', 'items': {'type': 'integer', 'minimum': 0}, 'description': 'Ordered frame indices to keep. Empty array resets to the full capture.'}, 'pairId': {'type': 'string', 'description': 'Motion pair id — required when target=assetPair.'}, 'target': {'enum': ['character', 'assetPair'], 'type': 'string', 'description': 'A character animation, or an asset motion pair.'}, 'entityId': {'type': 'string', 'description': 'Character id (target=character) or asset id/slug (target=assetPair).'}, 'animation': {'type': 'string', 'description': 'Animation slug — required when target=character.'}, 'compositing': {'type': 'object', 'required': ['scale', 'offsetX', 'offsetY'], 'properties': {'scale': {'type': 'number'}, 'offsetX': {'type': 'number'}, 'offsetY': {'type': 'number'}}, 'description': 'Characters only — apply scale/offset in the same rebuild.', 'additionalProperties': False}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['assetId', 'iterationId', 'collisionBody'], 'properties': {'assetId': {'type': 'string', 'description': 'Asset id or slug.'}, 'tileIndex': {'type': 'integer', 'minimum': 0, 'description': 'Target one collection tile (tileset/staged/terrain). Coordinates are normalized to its padded presentation cell, not the cropped item image. Omit for the asset-level default.'}, 'iterationId': {'type': 'string', 'description': 'Revision (iteration) id to stamp.'}, 'collisionBody': {'anyOf': [{'anyOf': [{'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, {'type': 'object', 'required': ['kind', 'bodies'], 'properties': {'kind': {'type': 'string', 'const': 'compound'}, 'bodies': {'type': 'array', 'items': {'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, 'maxItems': 16, 'minItems': 1}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind'], 'properties': {'kind': {'type': 'string', 'const': 'none'}}, 'additionalProperties': False}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}, {'type': 'null'}], 'description': 'Normalized asset shape, compound of 1..16 simple shapes, explicit none for passable scenery, or null to clear/inherit.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['assetId', 'iterationId', 'collisionRoles'], 'properties': {'assetId': {'type': 'string'}, 'tileIndex': {'type': 'integer', 'minimum': 0}, 'iterationId': {'type': 'string'}, 'collisionRoles': {'anyOf': [{'type': 'object', 'properties': {'hitbox': {'anyOf': [{'anyOf': [{'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, {'type': 'object', 'required': ['kind', 'bodies'], 'properties': {'kind': {'type': 'string', 'const': 'compound'}, 'bodies': {'type': 'array', 'items': {'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, 'maxItems': 16, 'minItems': 1}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind'], 'properties': {'kind': {'type': 'string', 'const': 'none'}}, 'additionalProperties': False}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}, {'type': 'null'}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}, 'hurtbox': {'anyOf': [{'anyOf': [{'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, {'type': 'object', 'required': ['kind', 'bodies'], 'properties': {'kind': {'type': 'string', 'const': 'compound'}, 'bodies': {'type': 'array', 'items': {'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, 'maxItems': 16, 'minItems': 1}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind'], 'properties': {'kind': {'type': 'string', 'const': 'none'}}, 'additionalProperties': False}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}, {'type': 'null'}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}, 'movement': {'anyOf': [{'anyOf': [{'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, {'type': 'object', 'required': ['kind', 'bodies'], 'properties': {'kind': {'type': 'string', 'const': 'compound'}, 'bodies': {'type': 'array', 'items': {'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, 'maxItems': 16, 'minItems': 1}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind'], 'properties': {'kind': {'type': 'string', 'const': 'none'}}, 'additionalProperties': False}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}, {'type': 'null'}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}}, 'additionalProperties': False}, {'type': 'null'}]}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['assetId', 'iterationId', 'runtimeUse'], 'properties': {'config': {'type': 'object', 'description': 'Intent-specific config. Validated and clamped server-side; unknown keys are dropped.', 'additionalProperties': {}}, 'assetId': {'type': 'string', 'description': 'Asset id or slug.'}, 'tileIndex': {'type': 'integer', 'minimum': 0, 'description': 'Target one tile (tileset/staged only).'}, 'runtimeUse': {'enum': ['plain_image', 'particle_emitter', 'deformable_strip', 'repeat_fill', 'nine_slice', 'shader_effect', 'path_follow'], 'type': 'string', 'description': 'The render intent. plain_image clears any previous intent. path_follow is legacy-only; new path motion is authored per placement in the level editor.'}, 'iterationId': {'type': 'string', 'description': 'Revision (iteration) id to stamp.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['characterId', 'collisionRoles'], 'properties': {'poseId': {'type': 'string'}, 'animation': {'type': 'string'}, 'characterId': {'type': 'string'}, 'collisionRoles': {'anyOf': [{'type': 'object', 'properties': {'hitbox': {'anyOf': [{'anyOf': [{'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, {'type': 'object', 'required': ['kind', 'bodies'], 'properties': {'kind': {'type': 'string', 'const': 'compound'}, 'bodies': {'type': 'array', 'items': {'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, 'maxItems': 16, 'minItems': 1}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind'], 'properties': {'kind': {'type': 'string', 'const': 'none'}}, 'additionalProperties': False}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}, {'type': 'null'}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}, 'hurtbox': {'anyOf': [{'anyOf': [{'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, {'type': 'object', 'required': ['kind', 'bodies'], 'properties': {'kind': {'type': 'string', 'const': 'compound'}, 'bodies': {'type': 'array', 'items': {'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, 'maxItems': 16, 'minItems': 1}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind'], 'properties': {'kind': {'type': 'string', 'const': 'none'}}, 'additionalProperties': False}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}, {'type': 'null'}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}, 'movement': {'anyOf': [{'anyOf': [{'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, {'type': 'object', 'required': ['kind', 'bodies'], 'properties': {'kind': {'type': 'string', 'const': 'compound'}, 'bodies': {'type': 'array', 'items': {'anyOf': [{'type': 'object', 'required': ['kind', 'cx', 'cy', 'hw', 'hh'], 'properties': {'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'hh': {'type': 'number', 'exclusiveMinimum': 0}, 'hw': {'type': 'number', 'exclusiveMinimum': 0}, 'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'rect'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'cx', 'cy', 'r'], 'properties': {'r': {'type': 'number', 'exclusiveMinimum': 0}, 'cx': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'cy': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'kind': {'type': 'string', 'const': 'circle'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind', 'points'], 'properties': {'rot': {'type': 'number'}, 'kind': {'type': 'string', 'const': 'polygon'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['x', 'y'], 'properties': {'x': {'type': 'number', 'maximum': 1, 'minimum': 0}, 'y': {'type': 'number', 'maximum': 1, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64, 'minItems': 3}}, 'additionalProperties': False}]}, 'maxItems': 16, 'minItems': 1}}, 'additionalProperties': False}, {'type': 'object', 'required': ['kind'], 'properties': {'kind': {'type': 'string', 'const': 'none'}}, 'additionalProperties': False}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}, {'type': 'null'}], 'description': 'Reusable asset collider. All child coordinates are fractions of the same sprite/cell; circle radius is a fraction of width. Compound children are separate solids, not a filled bounding box. None explicitly disables collision; null/omission follows endpoint inheritance rules.'}, 'hitboxFrames': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'required': ['from', 'to'], 'properties': {'to': {'type': 'integer', 'minimum': 0}, 'from': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 64}, {'type': 'null'}]}}, 'additionalProperties': False}, {'type': 'null'}]}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId', 'engine', 'startMapId', 'playerCharacterId', 'expectedVersion'], 'properties': {'engine': {'enum': ['phaser', 'godot', 'unity'], 'type': 'string'}, 'projectId': {'type': 'string'}, 'startMapId': {'type': 'string'}, 'expectedVersion': {'type': 'string', 'pattern': '^[a-f0-9]{64}$'}, 'playerCharacterId': {'type': 'string'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['assetId'], 'properties': {'pairs': {'type': 'array', 'items': {'type': 'object', 'required': ['from', 'to'], 'properties': {'to': {'anyOf': [{'type': 'integer', 'minimum': 0}, {'type': 'null'}], 'description': 'End stage index, or null for open-ended motion.'}, 'from': {'type': 'integer', 'minimum': 0, 'description': 'Start stage index.'}}, 'additionalProperties': False}, 'maxItems': 32, 'description': 'The stage transitions you plan to animate — context for the hint, nothing is generated from them.'}, 'dryRun': {'type': 'boolean', 'default': True, 'description': "DEFAULTS TO TRUE. While true this returns only a cost quote ({ estimatedCredits, balance, spendCapDaily, spentLast24h, capRemaining }) and executes nothing. Show the user estimatedCredits, then ask a normal confirmation question. Prefer the client's native question UI with Approve / Decline / Discuss choices when available; otherwise accept any unambiguous conversational approval. Never require a fixed phrase or ask the user to type a magic word. Only after approval, re-call with dryRun:false to actually spend."}, 'assetId': {'type': 'string', 'description': 'Object States asset id or slug.'}, 'idempotencyKey': {'type': 'string', 'minLength': 1, 'description': 'Optional Idempotency-Key for the real (dryRun:false) call. Omit and one is minted per call. Reuse the SAME value when retrying a call that failed with ENTITY_BUSY / 402 / 429 so the retry cannot double-dispatch.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['projectId', 'direction'], 'properties': {'direction': {'type': 'string', 'maxLength': 2000, 'minLength': 1}, 'projectId': {'type': 'string'}, 'previewText': {'type': 'string', 'maxLength': 2000}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'required': ['packId', 'componentId', 'revisionId'], 'properties': {'packId': {'type': 'string', 'format': 'uuid', 'description': 'Owned UI Pack ID.'}, 'revisionId': {'type': 'string', 'format': 'uuid'}, 'componentId': {'type': 'string', 'format': 'uuid', 'description': 'Owned component ID within this pack.'}}, 'additionalProperties': False}
输入模式
{'type': 'object', 'properties': {}, 'additionalProperties': False}
近期工具变更
类似的 MCP 服务器
GripForge
Generates, rigs, animates, analyzes, and packages game characters, weapons, armor, effects, environments, and engine-ready assets.
3DAssets.dev
Searches and delivers free CC0 GLB models and game asset packs, with licensing details, CDN links, scene layouts, and loader usag…
AXIS Avatar Foundry
Generates, repairs, rigs, validates, retargets, compares, and exports production-ready 3D avatars and meshes for game platforms.
Blixtworks
Offers pay-per-call utilities for text, image processing and analysis, data conversion, validation, web inspection, cryptography,…
Compose Preview Catalogs
Browses, renders, compares, audits, and edits Jetpack Compose preview catalogs and associated UI designs.
arch-tools-mcp
Provides general-purpose agent APIs for browser automation, web and PDF extraction, data conversion, email operations, fact check…
kernelcad
Authors, evaluates, reviews, simulates, edits, and exports parametric CAD assemblies and geometry from editable TypeScript-based …
floot
Creates, edits, previews, databases, and publishes full-stack web and mobile applications with hosted resources and deployment wo…