Files
yaze/docs/internal/wasm/api_reference.md

926 lines
16 KiB
Markdown

# 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.