# Yaze WASM JavaScript API Reference > **Note**: For a general debugging walkthrough, see the [WASM Debugging Guide](wasm-debugging-guide.md). ## Overview The yaze WASM build exposes a comprehensive set of JavaScript APIs for programmatic control and data access. These APIs are organized into six main namespaces: - **`window.yaze.control`** - Editor control and manipulation - **`window.yaze.editor`** - Query current editor state - **`window.yaze.data`** - Read-only access to ROM data - **`window.yaze.gui`** - GUI automation and interaction - **`window.yaze.agent`** - AI agent integration (chat, proposals, configuration) - **`window.yazeDebug`** - Debug utilities and diagnostics - **`window.aiTools`** - High-level AI assistant tools (Gemini Antigravity) ## API Version - Version: 2.5.0 - Last Updated: 2025-11-27 - Capabilities: `['palette', 'arena', 'graphics', 'timeline', 'pixel-inspector', 'rom', 'overworld', 'emulator', 'editor', 'control', 'data', 'gui', 'agent', 'loading-progress', 'ai-tools', 'async-editor-switch', 'card-groups', 'tree-sidebar', 'properties-panel']` ## Build Requirements The WASM module must be built with these Emscripten flags for full API access: ``` -s MODULARIZE=1 -s EXPORT_NAME='createYazeModule' -s EXPORTED_RUNTIME_METHODS=['FS','ccall','cwrap','lengthBytesUTF8','stringToUTF8','UTF8ToString','getValue','setValue'] -s INITIAL_MEMORY=268435456 # 256MB initial heap -s ALLOW_MEMORY_GROWTH=1 # Dynamic heap growth -s MAXIMUM_MEMORY=1073741824 # 1GB max -s STACK_SIZE=8388608 # 8MB stack ``` The dev server must set COOP/COEP headers for SharedArrayBuffer support. Use `./scripts/serve-wasm.sh` which handles this automatically. ### Memory Configuration The WASM build uses optimized memory settings to reduce heap resize operations during ROM loading: - **Initial Memory**: 256MB - Reduces heap resizing during overworld map loading (~200MB required) - **Maximum Memory**: 1GB - Prevents runaway allocations - **Stack Size**: 8MB - Handles recursive operations during asset decompression ## Quick Start ### Check if API is Ready ```javascript // All control APIs share the same ready state if (window.yaze.control.isReady()) { // APIs are available } ``` ### Basic Example ```javascript // Switch to Dungeon editor window.yaze.control.switchEditor('Dungeon'); // Get current editor state const snapshot = window.yaze.editor.getSnapshot(); console.log('Active editor:', snapshot.editor_type); // Get room tile data const roomData = window.yaze.data.getRoomTiles(0); console.log('Room dimensions:', roomData.width, 'x', roomData.height); // Get available layouts const layouts = window.yaze.control.getAvailableLayouts(); console.log('Available layouts:', layouts); ``` --- ## window.yaze.control - Editor Control API Provides programmatic control over the editor UI, ROM operations, and session management. ### Utility #### isReady() ```javascript const ready = window.yaze.control.isReady() // Returns: boolean ``` Checks if the control API is initialized and ready for use. ### Editor Control #### switchEditor(editorName) ```javascript window.yaze.control.switchEditor('Dungeon') window.yaze.control.switchEditor('Overworld') window.yaze.control.switchEditor('Graphics') ``` **Parameters:** - `editorName` (string): Name of editor to switch to - Valid values: `"Overworld"`, `"Dungeon"`, `"Graphics"`, `"Palette"`, `"Sprite"`, `"Music"`, `"Message"`, `"Screen"`, `"Assembly"`, `"Hex"`, `"Agent"`, `"Settings"` **Returns:** ```json { "success": true, "editor": "Dungeon" } ``` #### getCurrentEditor() ```javascript const editor = window.yaze.control.getCurrentEditor() ``` **Returns:** ```json { "name": "Dungeon", "type": 1, "active": true } ``` #### getAvailableEditors() ```javascript const editors = window.yaze.control.getAvailableEditors() ``` **Returns:** ```json [ {"name": "Overworld", "type": 0}, {"name": "Dungeon", "type": 1}, {"name": "Graphics", "type": 2} ] ``` ### Card Control Cards are dockable panels within each editor. #### openCard(cardId) ```javascript window.yaze.control.openCard('dungeon.room_selector') ``` **Parameters:** - `cardId` (string): Card identifier **Returns:** ```json { "success": true, "card_id": "dungeon.room_selector", "visible": true } ``` #### closeCard(cardId) ```javascript window.yaze.control.closeCard('dungeon.room_selector') ``` **Returns:** ```json { "success": true, "card_id": "dungeon.room_selector", "visible": false } ``` #### toggleCard(cardId) ```javascript window.yaze.control.toggleCard('dungeon.room_selector') ``` #### getVisibleCards() ```javascript const cards = window.yaze.control.getVisibleCards() ``` #### getAvailableCards() ```javascript const cards = window.yaze.control.getAvailableCards() ``` #### getCardsInCategory(category) ```javascript const cards = window.yaze.control.getCardsInCategory('Dungeon') ``` ### Layout Control #### setCardLayout(layoutName) ```javascript window.yaze.control.setCardLayout('dungeon_default') ``` **Parameters:** - `layoutName` (string): Name of layout preset **Returns:** ```json { "success": true, "layout": "dungeon_default" } ``` #### getAvailableLayouts() ```javascript const layouts = window.yaze.control.getAvailableLayouts() ``` **Returns:** ```json [ "overworld_default", "dungeon_default", "graphics_default", "debug_default", "minimal", "all_cards" ] ``` #### saveCurrentLayout(layoutName) ```javascript window.yaze.control.saveCurrentLayout('my_custom_layout') ``` ### Menu/UI Actions #### triggerMenuAction(actionPath) ```javascript window.yaze.control.triggerMenuAction('File.Save') ``` **Parameters:** - `actionPath` (string): Menu path (format: `"Menu.Action"`) #### getAvailableMenuActions() ```javascript const actions = window.yaze.control.getAvailableMenuActions() ``` ### Session Control #### getSessionInfo() ```javascript const info = window.yaze.control.getSessionInfo() ``` **Returns:** ```json { "session_index": 0, "session_count": 1, "rom_loaded": true, "rom_filename": "zelda3.sfc", "rom_title": "THE LEGEND OF ZELDA", "current_editor": "Dungeon" } ``` #### createSession() ```javascript const result = window.yaze.control.createSession() ``` #### switchSession(sessionIndex) ```javascript window.yaze.control.switchSession(0) ``` ### ROM Control #### getRomStatus() ```javascript const status = window.yaze.control.getRomStatus() ``` **Returns:** ```json { "loaded": true, "filename": "zelda3.sfc", "title": "THE LEGEND OF ZELDA", "size": 1048576, "dirty": false } ``` #### readRomBytes(address, count) ```javascript const bytes = window.yaze.control.readRomBytes(0x10000, 32) ``` **Parameters:** - `address` (number): ROM address to read from - `count` (number, optional): Number of bytes (default: 16, max: 256) #### writeRomBytes(address, bytes) ```javascript window.yaze.control.writeRomBytes(0x10000, [0x00, 0x01, 0x02, 0x03]) ``` **Parameters:** - `address` (number): ROM address to write to - `bytes` (array): Array of byte values (0-255) #### saveRom() ```javascript const result = window.yaze.control.saveRom() ``` --- ## window.yaze.editor - Editor State API Query current editor state. ### getSnapshot() ```javascript const snapshot = window.yaze.editor.getSnapshot() ``` Get comprehensive snapshot of current editor state. ### getCurrentRoom() ```javascript const room = window.yaze.editor.getCurrentRoom() ``` Get current dungeon room (only in Dungeon editor). ### getCurrentMap() ```javascript const map = window.yaze.editor.getCurrentMap() ``` Get current overworld map (only in Overworld editor). ### getSelection() ```javascript const selection = window.yaze.editor.getSelection() ``` Get current selection in active editor. --- ## window.yaze.data - Read-only Data API Access ROM data without modifying it. ### Dungeon Data #### getRoomTiles(roomId) ```javascript const tiles = window.yaze.data.getRoomTiles(0) ``` Get tile data for a dungeon room. **Parameters:** - `roomId` (number): Room ID (0-295) #### getRoomObjects(roomId) ```javascript const objects = window.yaze.data.getRoomObjects(0) ``` Get tile objects in a dungeon room. #### getRoomProperties(roomId) ```javascript const props = window.yaze.data.getRoomProperties(0) ``` Get properties for a dungeon room. ### Overworld Data #### getMapTiles(mapId) ```javascript const tiles = window.yaze.data.getMapTiles(0) ``` Get tile data for an overworld map. **Parameters:** - `mapId` (number): Map ID (0-159) #### getMapEntities(mapId) ```javascript const entities = window.yaze.data.getMapEntities(0) ``` Get entities (entrances, exits, items, sprites) on a map. #### getMapProperties(mapId) ```javascript const props = window.yaze.data.getMapProperties(0) ``` Get properties for an overworld map. ### Palette Data #### getPalette(groupName, paletteId) ```javascript const palette = window.yaze.data.getPalette('ow_main', 0) ``` Get palette colors. **Parameters:** - `groupName` (string): Palette group name - `paletteId` (number): Palette ID within group #### getPaletteGroups() ```javascript const groups = window.yaze.data.getPaletteGroups() ``` Get list of available palette groups. --- ## window.yaze.gui - GUI Automation API For LLM agents to interact with the ImGui UI. ### UI Discovery #### discover() ```javascript const elements = window.yaze.gui.discover() ``` Get complete UI element tree for discovery and automation. #### getElementBounds(elementId) ```javascript const bounds = window.yaze.gui.getElementBounds('dungeon_room_selector') ``` Get precise bounds for a specific UI element. #### waitForElement(elementId, timeoutMs) ```javascript const bounds = await window.yaze.gui.waitForElement('dungeon_room_selector', 5000) ``` Wait for an element to appear. ### Interaction #### click(target) ```javascript window.yaze.gui.click('dungeon_room_selector') // OR window.yaze.gui.click({x: 100, y: 200}) ``` Simulate a click at coordinates or on an element by ID. #### doubleClick(target) ```javascript window.yaze.gui.doubleClick('dungeon_room_selector') ``` Simulate a double-click. #### drag(from, to, steps) ```javascript window.yaze.gui.drag({x: 0, y: 0}, {x: 100, y: 100}, 10) ``` Simulate a drag operation. #### pressKey(key, modifiers) ```javascript window.yaze.gui.pressKey('Enter', {ctrl: true}) ``` Send a keyboard event to the canvas. #### type(text, delayMs) ```javascript await window.yaze.gui.type('Hello World', 50) ``` Type a string of text. #### scroll(deltaX, deltaY) ```javascript window.yaze.gui.scroll(0, 100) ``` Scroll the canvas. ### Canvas & State #### takeScreenshot(format, quality) ```javascript const dataUrl = window.yaze.gui.takeScreenshot('png', 0.92) ``` Take a screenshot of the canvas. #### getCanvasInfo() ```javascript const info = window.yaze.gui.getCanvasInfo() ``` Get canvas dimensions and position. #### updateCanvasState() ```javascript const state = window.yaze.gui.updateCanvasState() ``` Update canvas data-* attributes with current editor state. #### startAutoUpdate(intervalMs) ```javascript window.yaze.gui.startAutoUpdate(500) ``` Start automatic canvas state updates. #### stopAutoUpdate() ```javascript window.yaze.gui.stopAutoUpdate() ``` Stop automatic canvas state updates. ### Card Management #### getAvailableCards() ```javascript const cards = window.yaze.gui.getAvailableCards() ``` Get all available cards with their metadata. #### showCard(cardId) ```javascript window.yaze.gui.showCard('dungeon.room_selector') ``` Show a specific card. #### hideCard(cardId) ```javascript window.yaze.gui.hideCard('dungeon.room_selector') ``` Hide a specific card. ### Selection #### getSelection() ```javascript const selection = window.yaze.gui.getSelection() ``` Get the current selection in the active editor. #### setSelection(ids) ```javascript window.yaze.gui.setSelection(['obj_1', 'obj_2']) ``` Set selection programmatically. --- ## window.yaze.agent - AI Agent Integration API Provides programmatic control over the AI agent system from JavaScript. Enables browser-based AI agents to interact with the built-in chat, manage proposals, and configure AI providers. ### Utility #### isReady() ```javascript const ready = window.yaze.agent.isReady() // Returns: boolean ``` Checks if the agent system is initialized and ready for use. Requires ROM to be loaded. ### Chat Operations #### sendMessage(message) ```javascript const result = window.yaze.agent.sendMessage("Help me analyze dungeon room 0") ``` Send a message to the AI agent chat. **Parameters:** - `message` (string): User message to send **Returns:** ```json { "success": true, "status": "queued", "message": "Help me analyze dungeon room 0" } ``` #### getChatHistory() ```javascript const history = window.yaze.agent.getChatHistory() ``` Get the chat message history. **Returns:** ```json [ {"role": "user", "content": "Hello"}, {"role": "assistant", "content": "Hi! How can I help?"} ] ``` ### Configuration #### getConfig() ```javascript const config = window.yaze.agent.getConfig() ``` Get current agent configuration. **Returns:** ```json { "provider": "mock", "model": "", "ollama_host": "http://localhost:11434", "verbose": false, "show_reasoning": true, "max_tool_iterations": 4 } ``` #### setConfig(config) ```javascript window.yaze.agent.setConfig({ provider: "ollama", model: "llama3", ollama_host: "http://localhost:11434", verbose: true }) ``` Update agent configuration. **Parameters:** - `config` (object): Configuration object with optional fields: - `provider`: AI provider ID ("mock", "ollama", "gemini") - `model`: Model name/ID - `ollama_host`: Ollama server URL - `verbose`: Enable verbose logging - `show_reasoning`: Show AI reasoning in responses - `max_tool_iterations`: Max tool call iterations **Returns:** ```json { "success": true } ``` #### getProviders() ```javascript const providers = window.yaze.agent.getProviders() ``` Get list of available AI providers. **Returns:** ```json [ { "id": "mock", "name": "Mock Provider", "description": "Testing provider that echoes messages" }, { "id": "ollama", "name": "Ollama", "description": "Local Ollama server", "requires_host": true }, { "id": "gemini", "name": "Google Gemini", "description": "Google's Gemini API", "requires_api_key": true } ] ``` ### Proposal Management #### getProposals() ```javascript const proposals = window.yaze.agent.getProposals() ``` Get list of pending/recent code proposals. **Returns:** ```json [ { "id": "proposal-123", "status": "pending", "summary": "Modify room palette" } ] ``` #### acceptProposal(proposalId) ```javascript window.yaze.agent.acceptProposal("proposal-123") ``` Accept a proposal and apply its changes. #### rejectProposal(proposalId) ```javascript window.yaze.agent.rejectProposal("proposal-123") ``` Reject a proposal. --- ## window.yazeDebug - Debug Utilities Low-level debugging tools for the WASM environment. ### dumpAll() ```javascript window.yazeDebug.dumpAll() ``` Dump full application state to console. ### graphics.getDiagnostics() ```javascript window.yazeDebug.graphics.getDiagnostics() ``` Get graphics subsystem diagnostics. ### memory.getUsage() ```javascript window.yazeDebug.memory.getUsage() ``` Get current memory usage statistics. --- ## window.aiTools - High-Level Assistant Tools Helper functions for the Gemini Antigravity agent. ### getAppState() ```javascript window.aiTools.getAppState() ``` Get high-level application state summary. ### getEditorState() ```javascript window.aiTools.getEditorState() ``` Get detailed state of the active editor. ### getVisibleCards() ```javascript window.aiTools.getVisibleCards() ``` List currently visible UI cards. ### getAvailableCards() ```javascript window.aiTools.getAvailableCards() ``` List all available UI cards. ### showCard(cardId) ```javascript window.aiTools.showCard(cardId) ``` Show a card (wrapper for `window.yaze.control.openCard`). ### hideCard(cardId) ```javascript window.aiTools.hideCard(cardId) ``` Hide a card. ### navigateTo(target) ```javascript window.aiTools.navigateTo(target) ``` Navigate to a specific editor or view. ### getRoomData(roomId) ```javascript window.aiTools.getRoomData(roomId) ``` Get dungeon room data. ### getMapData(mapId) ```javascript window.aiTools.getMapData(mapId) ``` Get overworld map data. ### dumpAPIReference() ```javascript window.aiTools.dumpAPIReference() ``` Dump this API reference to the console.