From a4ccff382c465fd789a318a981526b0b883630da Mon Sep 17 00:00:00 2001 From: Nico Bailon Date: Mon, 12 Jan 2026 22:12:56 -0800 Subject: [PATCH] feat(tui): overlay positioning API with CSS-like values Add OverlayOptions for configurable positioning (anchor, margins, offsets, percentages). Add OverlayHandle for programmatic visibility control with hide/setHidden/isHidden. Add visible callback for responsive overlays. Extension API: ctx.ui.custom() now accepts overlayOptions and onHandle callback. Examples: overlay-qa-tests.ts (10 test commands), doom-overlay (DOOM at 35 FPS). --- packages/ai/src/models.generated.ts | 37 +-- packages/ai/test/.temp-images/small.png | Bin 0 -> 321 bytes packages/coding-agent/CHANGELOG.md | 4 +- .../examples/extensions/README.md | 3 +- .../extensions/doom-overlay/.gitignore | 2 + .../extensions/doom-overlay/README.md | 46 +++ .../extensions/doom-overlay/doom-component.ts | 133 ++++++++ .../extensions/doom-overlay/doom-engine.ts | 173 ++++++++++ .../extensions/doom-overlay/doom-keys.ts | 104 ++++++ .../extensions/doom-overlay/doom/build.sh | 152 +++++++++ .../doom-overlay/doom/build/doom.js | 21 ++ .../doom-overlay/doom/build/doom.wasm | Bin 0 -> 380169 bytes .../doom-overlay/doom/doomgeneric_pi.c | 72 +++++ .../examples/extensions/doom-overlay/index.ts | 74 +++++ .../extensions/doom-overlay/wad-finder.ts | 51 +++ .../examples/extensions/overlay-qa-tests.ts | 302 +++++++++++++++++- .../coding-agent/src/core/extensions/types.ts | 12 +- .../src/modes/interactive/interactive-mode.ts | 11 +- packages/tui/CHANGELOG.md | 6 +- packages/tui/src/index.ts | 2 + packages/tui/src/tui.ts | 228 +++++++++---- packages/tui/test/overlay-options.test.ts | 14 +- 22 files changed, 1344 insertions(+), 103 deletions(-) create mode 100644 packages/ai/test/.temp-images/small.png create mode 100644 packages/coding-agent/examples/extensions/doom-overlay/.gitignore create mode 100644 packages/coding-agent/examples/extensions/doom-overlay/README.md create mode 100644 packages/coding-agent/examples/extensions/doom-overlay/doom-component.ts create mode 100644 packages/coding-agent/examples/extensions/doom-overlay/doom-engine.ts create mode 100644 packages/coding-agent/examples/extensions/doom-overlay/doom-keys.ts create mode 100755 packages/coding-agent/examples/extensions/doom-overlay/doom/build.sh create mode 100644 packages/coding-agent/examples/extensions/doom-overlay/doom/build/doom.js create mode 100755 packages/coding-agent/examples/extensions/doom-overlay/doom/build/doom.wasm create mode 100644 packages/coding-agent/examples/extensions/doom-overlay/doom/doomgeneric_pi.c create mode 100644 packages/coding-agent/examples/extensions/doom-overlay/index.ts create mode 100644 packages/coding-agent/examples/extensions/doom-overlay/wad-finder.ts diff --git a/packages/ai/src/models.generated.ts b/packages/ai/src/models.generated.ts index cbe25fea..7da72774 100644 --- a/packages/ai/src/models.generated.ts +++ b/packages/ai/src/models.generated.ts @@ -3643,7 +3643,7 @@ export const MODELS = { cacheWrite: 18.75, }, contextWindow: 200000, - maxTokens: 4096, + maxTokens: 32000, } satisfies Model<"openai-completions">, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", @@ -3660,7 +3660,7 @@ export const MODELS = { cacheWrite: 6.25, }, contextWindow: 200000, - maxTokens: 32000, + maxTokens: 64000, } satisfies Model<"openai-completions">, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", @@ -3977,13 +3977,13 @@ export const MODELS = { reasoning: true, input: ["text"], cost: { - input: 0.39999999999999997, - output: 1.75, + input: 0.44999999999999996, + output: 2.1500000000000004, cacheRead: 0, cacheWrite: 0, }, - contextWindow: 163840, - maxTokens: 65536, + contextWindow: 131072, + maxTokens: 32768, } satisfies Model<"openai-completions">, "deepseek/deepseek-r1-distill-llama-70b": { id: "deepseek/deepseek-r1-distill-llama-70b", @@ -4359,23 +4359,6 @@ export const MODELS = { contextWindow: 256000, maxTokens: 128000, } satisfies Model<"openai-completions">, - "kwaipilot/kat-coder-pro:free": { - id: "kwaipilot/kat-coder-pro:free", - name: "Kwaipilot: KAT-Coder-Pro V1 (free)", - api: "openai-completions", - provider: "openrouter", - baseUrl: "https://openrouter.ai/api/v1", - reasoning: false, - input: ["text"], - cost: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, - }, - contextWindow: 256000, - maxTokens: 128000, - } satisfies Model<"openai-completions">, "meta-llama/llama-3-70b-instruct": { id: "meta-llama/llama-3-70b-instruct", name: "Meta: Llama 3 70B Instruct", @@ -4589,13 +4572,13 @@ export const MODELS = { reasoning: true, input: ["text"], cost: { - input: 0.28, - output: 1.2, - cacheRead: 0.14, + input: 0.27, + output: 1.12, + cacheRead: 0, cacheWrite: 0, }, contextWindow: 196608, - maxTokens: 4096, + maxTokens: 65536, } satisfies Model<"openai-completions">, "mistralai/codestral-2508": { id: "mistralai/codestral-2508", diff --git a/packages/ai/test/.temp-images/small.png b/packages/ai/test/.temp-images/small.png new file mode 100644 index 0000000000000000000000000000000000000000..91dd80f12a9fa62c3304a290c829829e6e01768c GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRBMrH;E1}`0UaRvqkg=CK)Uj~LMH3o);76yi2 z3=9knFBlj~4Hy_+B``2p&0t^Zr-eX{3U@!6Xb!C6W$ji#XHo2hhKLZ1Uh^LEVh{fsT1PRu~2_ijBfe!u*46GFl zjGBcz|1dBxsFt`!l%yncndurB>KYn{7?@faSXddDX&V?=85m@p zWOYN)kei>9nO2EggY=ZWAkS#PZ79jiO)V}-%q_sJ$ER_QDgy%pgQu&X%Q~loCIG+k BP_zI5 literal 0 HcmV?d00001 diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 918be50d..4a5903df 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -10,7 +10,9 @@ - Session naming: `/name ` command sets a display name shown in the session selector instead of the first message. Useful for distinguishing forked sessions. Extensions can use `pi.setSessionName()` and `pi.getSessionName()`. ([#650](https://github.com/badlogic/pi-mono/pull/650) by [@scutifer](https://github.com/scutifer)) - `ctx.ui.custom()` now accepts `overlayOptions` for overlay positioning and sizing (anchor, margins, offsets, percentages, absolute positioning) -- Extension example: `overlay-qa-tests.ts` for testing all overlay positioning scenarios +- `ctx.ui.custom()` now accepts `onHandle` callback to receive the `OverlayHandle` for controlling overlay visibility +- Extension example: `overlay-qa-tests.ts` with 10 commands for testing overlay positioning, animation, and toggle scenarios +- Extension example: `doom-overlay/` - DOOM game running as an overlay at 35 FPS (auto-downloads WAD on first run) - Extension example: `notify.ts` for desktop notifications via OSC 777 escape sequence ([#658](https://github.com/badlogic/pi-mono/pull/658) by [@ferologics](https://github.com/ferologics)) - Inline hint for queued messages showing the `Alt+Up` restore shortcut ([#657](https://github.com/badlogic/pi-mono/pull/657) by [@tmustier](https://github.com/tmustier)) - Page-up/down navigation in `/resume` session selector to jump by 5 items ([#662](https://github.com/badlogic/pi-mono/pull/662) by [@aliou](https://github.com/aliou)) diff --git a/packages/coding-agent/examples/extensions/README.md b/packages/coding-agent/examples/extensions/README.md index 9d61071e..a4dfb89c 100644 --- a/packages/coding-agent/examples/extensions/README.md +++ b/packages/coding-agent/examples/extensions/README.md @@ -50,7 +50,8 @@ cp permission-gate.ts ~/.pi/agent/extensions/ | `modal-editor.ts` | Custom vim-like modal editor via `ctx.ui.setEditorComponent()` | | `notify.ts` | Desktop notifications via OSC 777 when agent finishes (Ghostty, iTerm2, WezTerm) | | `overlay-test.ts` | Test overlay compositing with inline text inputs and edge cases | -| `overlay-qa-tests.ts` | Comprehensive overlay QA tests: anchors, margins, stacking, overflow protection | +| `overlay-qa-tests.ts` | Comprehensive overlay QA tests: anchors, margins, stacking, overflow, animation | +| `doom-overlay/` | DOOM game running as an overlay at 35 FPS (demonstrates real-time game rendering) | ### Git Integration diff --git a/packages/coding-agent/examples/extensions/doom-overlay/.gitignore b/packages/coding-agent/examples/extensions/doom-overlay/.gitignore new file mode 100644 index 00000000..e3edbd8c --- /dev/null +++ b/packages/coding-agent/examples/extensions/doom-overlay/.gitignore @@ -0,0 +1,2 @@ +# Auto-downloaded on first run +doom1.wad diff --git a/packages/coding-agent/examples/extensions/doom-overlay/README.md b/packages/coding-agent/examples/extensions/doom-overlay/README.md new file mode 100644 index 00000000..420bd80b --- /dev/null +++ b/packages/coding-agent/examples/extensions/doom-overlay/README.md @@ -0,0 +1,46 @@ +# DOOM Overlay Demo + +Play DOOM as an overlay in pi. Demonstrates that the overlay system can handle real-time game rendering at 35 FPS. + +## Usage + +```bash +pi --extension ./examples/extensions/doom-overlay +``` + +Then run: +``` +/doom-overlay +``` + +The shareware WAD file (~4MB) is auto-downloaded on first run. + +## Controls + +| Action | Keys | +|--------|------| +| Move | WASD or Arrow Keys | +| Run | Shift + WASD | +| Fire | F or Ctrl | +| Use/Open | Space | +| Weapons | 1-7 | +| Map | Tab | +| Menu | Escape | +| Pause/Quit | Q | + +## How It Works + +DOOM runs as WebAssembly compiled from [doomgeneric](https://github.com/ozkl/doomgeneric). Each frame is rendered using half-block characters (▀) with 24-bit color, where the top pixel is the foreground color and the bottom pixel is the background color. + +The overlay uses: +- `width: "90%"` - 90% of terminal width +- `maxHeight: "80%"` - Maximum 80% of terminal height +- `anchor: "center"` - Centered in terminal + +Height is calculated from width to maintain DOOM's 3.2:1 aspect ratio (accounting for half-block rendering). + +## Credits + +- [id Software](https://github.com/id-Software/DOOM) for the original DOOM +- [doomgeneric](https://github.com/ozkl/doomgeneric) for the portable DOOM implementation +- [pi-doom](https://github.com/badlogic/pi-doom) for the original pi integration diff --git a/packages/coding-agent/examples/extensions/doom-overlay/doom-component.ts b/packages/coding-agent/examples/extensions/doom-overlay/doom-component.ts new file mode 100644 index 00000000..2fd7ad9d --- /dev/null +++ b/packages/coding-agent/examples/extensions/doom-overlay/doom-component.ts @@ -0,0 +1,133 @@ +/** + * DOOM Component for overlay mode + * + * Renders DOOM frames using half-block characters (▀) with 24-bit color. + * Height is calculated from width to maintain DOOM's aspect ratio. + */ + +import type { Component } from "@mariozechner/pi-tui"; +import { isKeyRelease, type TUI } from "@mariozechner/pi-tui"; +import type { DoomEngine } from "./doom-engine.js"; +import { DoomKeys, mapKeyToDoom } from "./doom-keys.js"; + +function renderHalfBlock( + rgba: Uint8Array, + width: number, + height: number, + targetCols: number, + targetRows: number, +): string[] { + const lines: string[] = []; + const scaleX = width / targetCols; + const scaleY = height / (targetRows * 2); + + for (let row = 0; row < targetRows; row++) { + let line = ""; + const srcY1 = Math.floor(row * 2 * scaleY); + const srcY2 = Math.floor((row * 2 + 1) * scaleY); + + for (let col = 0; col < targetCols; col++) { + const srcX = Math.floor(col * scaleX); + const idx1 = (srcY1 * width + srcX) * 4; + const idx2 = (srcY2 * width + srcX) * 4; + const r1 = rgba[idx1] ?? 0, + g1 = rgba[idx1 + 1] ?? 0, + b1 = rgba[idx1 + 2] ?? 0; + const r2 = rgba[idx2] ?? 0, + g2 = rgba[idx2 + 1] ?? 0, + b2 = rgba[idx2 + 2] ?? 0; + line += `\x1b[38;2;${r1};${g1};${b1}m\x1b[48;2;${r2};${g2};${b2}m▀`; + } + line += "\x1b[0m"; + lines.push(line); + } + return lines; +} + +export class DoomOverlayComponent implements Component { + private engine: DoomEngine; + private tui: TUI; + private interval: ReturnType | null = null; + private onExit: () => void; + + // Opt-in to key release events for smooth movement + wantsKeyRelease = true; + + constructor(tui: TUI, engine: DoomEngine, onExit: () => void, resume = false) { + this.tui = tui; + this.engine = engine; + this.onExit = onExit; + + // Unpause if resuming + if (resume) { + this.engine.pushKey(true, DoomKeys.KEY_PAUSE); + this.engine.pushKey(false, DoomKeys.KEY_PAUSE); + } + + this.startGameLoop(); + } + + private startGameLoop(): void { + this.interval = setInterval(() => { + try { + this.engine.tick(); + // Force full re-render to prevent bleed artifacts at high frame rates + this.tui.requestRender(true); + } catch { + // WASM error (e.g., exit via DOOM menu) - treat as quit + this.dispose(); + this.onExit(); + } + }, 1000 / 35); + } + + handleInput(data: string): void { + // Q to pause and exit (but not on release) + if (!isKeyRelease(data) && (data === "q" || data === "Q")) { + // Send DOOM's pause key before exiting + this.engine.pushKey(true, DoomKeys.KEY_PAUSE); + this.engine.pushKey(false, DoomKeys.KEY_PAUSE); + this.dispose(); + this.onExit(); + return; + } + + const doomKeys = mapKeyToDoom(data); + if (doomKeys.length === 0) return; + + const released = isKeyRelease(data); + + for (const key of doomKeys) { + this.engine.pushKey(!released, key); + } + } + + render(width: number): string[] { + // DOOM renders at 640x400 (1.6:1 ratio) + // With half-block characters, each terminal row = 2 pixels + // So effective ratio is 640:200 = 3.2:1 (width:height in terminal cells) + // Add 1 row for footer + const ASPECT_RATIO = 3.2; + const MIN_HEIGHT = 10; + const height = Math.max(MIN_HEIGHT, Math.floor(width / ASPECT_RATIO)); + + const rgba = this.engine.getFrameRGBA(); + const lines = renderHalfBlock(rgba, this.engine.width, this.engine.height, width, height); + + // Footer + const footer = " DOOM | Q=Pause | WASD=Move | Shift+WASD=Run | Space=Use | F=Fire | 1-7=Weapons"; + const truncatedFooter = footer.length > width ? footer.slice(0, width) : footer; + lines.push(`\x1b[2m${truncatedFooter}\x1b[0m`); + + return lines; + } + + invalidate(): void {} + + dispose(): void { + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + } +} diff --git a/packages/coding-agent/examples/extensions/doom-overlay/doom-engine.ts b/packages/coding-agent/examples/extensions/doom-overlay/doom-engine.ts new file mode 100644 index 00000000..be14237c --- /dev/null +++ b/packages/coding-agent/examples/extensions/doom-overlay/doom-engine.ts @@ -0,0 +1,173 @@ +/** + * DOOM Engine - WebAssembly wrapper for doomgeneric + */ + +import { existsSync, readFileSync } from "node:fs"; +import { createRequire } from "node:module"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +export interface DoomModule { + _doomgeneric_Create: (argc: number, argv: number) => void; + _doomgeneric_Tick: () => void; + _DG_GetFrameBuffer: () => number; + _DG_GetScreenWidth: () => number; + _DG_GetScreenHeight: () => number; + _DG_PushKeyEvent: (pressed: number, key: number) => void; + _malloc: (size: number) => number; + _free: (ptr: number) => void; + HEAPU8: Uint8Array; + HEAPU32: Uint32Array; + FS_createDataFile: (parent: string, name: string, data: number[], canRead: boolean, canWrite: boolean) => void; + FS_createPath: (parent: string, path: string, canRead: boolean, canWrite: boolean) => string; + setValue: (ptr: number, value: number, type: string) => void; + getValue: (ptr: number, type: string) => number; +} + +export class DoomEngine { + private module: DoomModule | null = null; + private frameBufferPtr: number = 0; + private initialized = false; + private wadPath: string; + private _width = 640; + private _height = 400; + + constructor(wadPath: string) { + this.wadPath = wadPath; + } + + get width(): number { + return this._width; + } + + get height(): number { + return this._height; + } + + async init(): Promise { + // Locate WASM build + const __dirname = dirname(fileURLToPath(import.meta.url)); + const buildDir = join(__dirname, "doom", "build"); + const doomJsPath = join(buildDir, "doom.js"); + + if (!existsSync(doomJsPath)) { + throw new Error(`WASM not found at ${doomJsPath}. Run ./doom/build.sh first`); + } + + // Read WAD file + const wadData = readFileSync(this.wadPath); + const wadArray = Array.from(new Uint8Array(wadData)); + + // Load WASM module - eval to bypass jiti completely + const doomJsCode = readFileSync(doomJsPath, "utf-8"); + const moduleExports: { exports: unknown } = { exports: {} }; + const nativeRequire = createRequire(doomJsPath); + const moduleFunc = new Function("module", "exports", "__dirname", "__filename", "require", doomJsCode); + moduleFunc(moduleExports, moduleExports.exports, buildDir, doomJsPath, nativeRequire); + const createDoomModule = moduleExports.exports as (config: unknown) => Promise; + + const moduleConfig = { + locateFile: (path: string) => { + if (path.endsWith(".wasm")) { + return join(buildDir, path); + } + return path; + }, + print: () => {}, + printErr: () => {}, + preRun: [ + (module: DoomModule) => { + // Create /doom directory and add WAD + module.FS_createPath("/", "doom", true, true); + module.FS_createDataFile("/doom", "doom1.wad", wadArray, true, false); + }, + ], + }; + + this.module = await createDoomModule(moduleConfig); + if (!this.module) { + throw new Error("Failed to initialize DOOM module"); + } + + // Initialize DOOM + this.initDoom(); + + // Get framebuffer info + this.frameBufferPtr = this.module._DG_GetFrameBuffer(); + this._width = this.module._DG_GetScreenWidth(); + this._height = this.module._DG_GetScreenHeight(); + this.initialized = true; + } + + private initDoom(): void { + if (!this.module) return; + + const args = ["doom", "-iwad", "/doom/doom1.wad"]; + const argPtrs: number[] = []; + + for (const arg of args) { + const ptr = this.module._malloc(arg.length + 1); + for (let i = 0; i < arg.length; i++) { + this.module.setValue(ptr + i, arg.charCodeAt(i), "i8"); + } + this.module.setValue(ptr + arg.length, 0, "i8"); + argPtrs.push(ptr); + } + + const argvPtr = this.module._malloc(argPtrs.length * 4); + for (let i = 0; i < argPtrs.length; i++) { + this.module.setValue(argvPtr + i * 4, argPtrs[i]!, "i32"); + } + + this.module._doomgeneric_Create(args.length, argvPtr); + + for (const ptr of argPtrs) { + this.module._free(ptr); + } + this.module._free(argvPtr); + } + + /** + * Run one game tick + */ + tick(): void { + if (!this.module || !this.initialized) return; + this.module._doomgeneric_Tick(); + } + + /** + * Get current frame as RGBA pixel data + * DOOM outputs ARGB, we convert to RGBA + */ + getFrameRGBA(): Uint8Array { + if (!this.module || !this.initialized) { + return new Uint8Array(this._width * this._height * 4); + } + + const pixels = this._width * this._height; + const buffer = new Uint8Array(pixels * 4); + + for (let i = 0; i < pixels; i++) { + const argb = this.module.getValue(this.frameBufferPtr + i * 4, "i32"); + const offset = i * 4; + buffer[offset + 0] = (argb >> 16) & 0xff; // R + buffer[offset + 1] = (argb >> 8) & 0xff; // G + buffer[offset + 2] = argb & 0xff; // B + buffer[offset + 3] = 255; // A + } + + return buffer; + } + + /** + * Push a key event + */ + pushKey(pressed: boolean, key: number): void { + if (!this.module || !this.initialized) return; + this.module._DG_PushKeyEvent(pressed ? 1 : 0, key); + } + + isInitialized(): boolean { + return this.initialized; + } +} diff --git a/packages/coding-agent/examples/extensions/doom-overlay/doom-keys.ts b/packages/coding-agent/examples/extensions/doom-overlay/doom-keys.ts new file mode 100644 index 00000000..3a00eb28 --- /dev/null +++ b/packages/coding-agent/examples/extensions/doom-overlay/doom-keys.ts @@ -0,0 +1,104 @@ +/** + * DOOM key codes (from doomkeys.h) + */ +export const DoomKeys = { + KEY_RIGHTARROW: 0xae, + KEY_LEFTARROW: 0xac, + KEY_UPARROW: 0xad, + KEY_DOWNARROW: 0xaf, + KEY_STRAFE_L: 0xa0, + KEY_STRAFE_R: 0xa1, + KEY_USE: 0xa2, + KEY_FIRE: 0xa3, + KEY_ESCAPE: 27, + KEY_ENTER: 13, + KEY_TAB: 9, + KEY_F1: 0x80 + 0x3b, + KEY_F2: 0x80 + 0x3c, + KEY_F3: 0x80 + 0x3d, + KEY_F4: 0x80 + 0x3e, + KEY_F5: 0x80 + 0x3f, + KEY_F6: 0x80 + 0x40, + KEY_F7: 0x80 + 0x41, + KEY_F8: 0x80 + 0x42, + KEY_F9: 0x80 + 0x43, + KEY_F10: 0x80 + 0x44, + KEY_F11: 0x80 + 0x57, + KEY_F12: 0x80 + 0x58, + KEY_BACKSPACE: 127, + KEY_PAUSE: 0xff, + KEY_EQUALS: 0x3d, + KEY_MINUS: 0x2d, + KEY_RSHIFT: 0x80 + 0x36, + KEY_RCTRL: 0x80 + 0x1d, + KEY_RALT: 0x80 + 0x38, +} as const; + +import { Key, matchesKey, parseKey } from "@mariozechner/pi-tui"; + +/** + * Map terminal key input to DOOM key codes + * Supports both raw terminal input and Kitty protocol sequences + */ +export function mapKeyToDoom(data: string): number[] { + // Arrow keys + if (matchesKey(data, Key.up)) return [DoomKeys.KEY_UPARROW]; + if (matchesKey(data, Key.down)) return [DoomKeys.KEY_DOWNARROW]; + if (matchesKey(data, Key.right)) return [DoomKeys.KEY_RIGHTARROW]; + if (matchesKey(data, Key.left)) return [DoomKeys.KEY_LEFTARROW]; + + // WASD - check both raw char and Kitty sequences + if (data === "w" || matchesKey(data, "w")) return [DoomKeys.KEY_UPARROW]; + if (data === "W" || matchesKey(data, Key.shift("w"))) return [DoomKeys.KEY_UPARROW, DoomKeys.KEY_RSHIFT]; + if (data === "s" || matchesKey(data, "s")) return [DoomKeys.KEY_DOWNARROW]; + if (data === "S" || matchesKey(data, Key.shift("s"))) return [DoomKeys.KEY_DOWNARROW, DoomKeys.KEY_RSHIFT]; + if (data === "a" || matchesKey(data, "a")) return [DoomKeys.KEY_STRAFE_L]; + if (data === "A" || matchesKey(data, Key.shift("a"))) return [DoomKeys.KEY_STRAFE_L, DoomKeys.KEY_RSHIFT]; + if (data === "d" || matchesKey(data, "d")) return [DoomKeys.KEY_STRAFE_R]; + if (data === "D" || matchesKey(data, Key.shift("d"))) return [DoomKeys.KEY_STRAFE_R, DoomKeys.KEY_RSHIFT]; + + // Fire - F key + if (data === "f" || data === "F" || matchesKey(data, "f") || matchesKey(data, Key.shift("f"))) { + return [DoomKeys.KEY_FIRE]; + } + + // Use/Open + if (data === " " || matchesKey(data, Key.space)) return [DoomKeys.KEY_USE]; + + // Menu/UI keys + if (matchesKey(data, Key.enter)) return [DoomKeys.KEY_ENTER]; + if (matchesKey(data, Key.escape)) return [DoomKeys.KEY_ESCAPE]; + if (matchesKey(data, Key.tab)) return [DoomKeys.KEY_TAB]; + if (matchesKey(data, Key.backspace)) return [DoomKeys.KEY_BACKSPACE]; + + // Ctrl keys (except Ctrl+C) = fire (legacy support) + const parsed = parseKey(data); + if (parsed?.startsWith("ctrl+") && parsed !== "ctrl+c") { + return [DoomKeys.KEY_FIRE]; + } + if (data.length === 1 && data.charCodeAt(0) < 32 && data !== "\x03") { + return [DoomKeys.KEY_FIRE]; + } + + // Weapon selection (0-9) + if (data >= "0" && data <= "9") return [data.charCodeAt(0)]; + + // Plus/minus for screen size + if (data === "+" || data === "=") return [DoomKeys.KEY_EQUALS]; + if (data === "-") return [DoomKeys.KEY_MINUS]; + + // Y/N for prompts + if (data === "y" || data === "Y" || matchesKey(data, "y") || matchesKey(data, Key.shift("y"))) { + return ["y".charCodeAt(0)]; + } + if (data === "n" || data === "N" || matchesKey(data, "n") || matchesKey(data, Key.shift("n"))) { + return ["n".charCodeAt(0)]; + } + + // Other printable characters (for cheats) + if (data.length === 1 && data.charCodeAt(0) >= 32) { + return [data.toLowerCase().charCodeAt(0)]; + } + + return []; +} diff --git a/packages/coding-agent/examples/extensions/doom-overlay/doom/build.sh b/packages/coding-agent/examples/extensions/doom-overlay/doom/build.sh new file mode 100755 index 00000000..dd11122a --- /dev/null +++ b/packages/coding-agent/examples/extensions/doom-overlay/doom/build.sh @@ -0,0 +1,152 @@ +#!/bin/bash +# Build DOOM for pi-doom using doomgeneric and Emscripten + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +DOOM_DIR="$PROJECT_ROOT/doom" +BUILD_DIR="$PROJECT_ROOT/doom/build" + +echo "=== pi-doom Build Script ===" + +# Check for emcc +if ! command -v emcc &> /dev/null; then + echo "Error: Emscripten (emcc) not found!" + echo "" + echo "Install via Homebrew:" + echo " brew install emscripten" + echo "" + echo "Or manually:" + echo " git clone https://github.com/emscripten-core/emsdk.git ~/emsdk" + echo " cd ~/emsdk && ./emsdk install latest && ./emsdk activate latest" + echo " source ~/emsdk/emsdk_env.sh" + exit 1 +fi + +# Clone doomgeneric if not present +if [ ! -d "$DOOM_DIR/doomgeneric" ]; then + echo "Cloning doomgeneric..." + cd "$DOOM_DIR" + git clone https://github.com/ozkl/doomgeneric.git +fi + +# Create build directory +mkdir -p "$BUILD_DIR" + +# Copy our platform file +cp "$DOOM_DIR/doomgeneric_pi.c" "$DOOM_DIR/doomgeneric/doomgeneric/" + +echo "Compiling DOOM to WebAssembly..." +cd "$DOOM_DIR/doomgeneric/doomgeneric" + +# Resolution - 640x400 is doomgeneric default, good balance of speed/quality +RESX=${DOOM_RESX:-640} +RESY=${DOOM_RESY:-400} + +echo "Resolution: ${RESX}x${RESY}" + +# Compile with Emscripten (no sound) +emcc -O2 \ + -s WASM=1 \ + -s EXPORTED_FUNCTIONS="['_doomgeneric_Create','_doomgeneric_Tick','_DG_GetFrameBuffer','_DG_GetScreenWidth','_DG_GetScreenHeight','_DG_PushKeyEvent','_malloc','_free']" \ + -s EXPORTED_RUNTIME_METHODS="['ccall','cwrap','getValue','setValue','FS']" \ + -s ALLOW_MEMORY_GROWTH=1 \ + -s INITIAL_MEMORY=33554432 \ + -s MODULARIZE=1 \ + -s EXPORT_NAME="createDoomModule" \ + -s ENVIRONMENT='node' \ + -s FILESYSTEM=1 \ + -s FORCE_FILESYSTEM=1 \ + -s EXIT_RUNTIME=0 \ + -s NO_EXIT_RUNTIME=1 \ + -DDOOMGENERIC_RESX=$RESX \ + -DDOOMGENERIC_RESY=$RESY \ + -I. \ + am_map.c \ + d_event.c \ + d_items.c \ + d_iwad.c \ + d_loop.c \ + d_main.c \ + d_mode.c \ + d_net.c \ + doomdef.c \ + doomgeneric.c \ + doomgeneric_pi.c \ + doomstat.c \ + dstrings.c \ + f_finale.c \ + f_wipe.c \ + g_game.c \ + hu_lib.c \ + hu_stuff.c \ + i_cdmus.c \ + i_input.c \ + i_endoom.c \ + i_joystick.c \ + i_scale.c \ + i_sound.c \ + i_system.c \ + i_timer.c \ + i_video.c \ + icon.c \ + info.c \ + m_argv.c \ + m_bbox.c \ + m_cheat.c \ + m_config.c \ + m_controls.c \ + m_fixed.c \ + m_menu.c \ + m_misc.c \ + m_random.c \ + memio.c \ + p_ceilng.c \ + p_doors.c \ + p_enemy.c \ + p_floor.c \ + p_inter.c \ + p_lights.c \ + p_map.c \ + p_maputl.c \ + p_mobj.c \ + p_plats.c \ + p_pspr.c \ + p_saveg.c \ + p_setup.c \ + p_sight.c \ + p_spec.c \ + p_switch.c \ + p_telept.c \ + p_tick.c \ + p_user.c \ + r_bsp.c \ + r_data.c \ + r_draw.c \ + r_main.c \ + r_plane.c \ + r_segs.c \ + r_sky.c \ + r_things.c \ + s_sound.c \ + sha1.c \ + sounds.c \ + st_lib.c \ + st_stuff.c \ + statdump.c \ + tables.c \ + v_video.c \ + w_checksum.c \ + w_file.c \ + w_file_stdc.c \ + w_main.c \ + w_wad.c \ + wi_stuff.c \ + z_zone.c \ + dummy.c \ + -o "$BUILD_DIR/doom.js" + +echo "" +echo "Build complete!" +echo "Output: $BUILD_DIR/doom.js and $BUILD_DIR/doom.wasm" diff --git a/packages/coding-agent/examples/extensions/doom-overlay/doom/build/doom.js b/packages/coding-agent/examples/extensions/doom-overlay/doom/build/doom.js new file mode 100644 index 00000000..e2221dc2 --- /dev/null +++ b/packages/coding-agent/examples/extensions/doom-overlay/doom/build/doom.js @@ -0,0 +1,21 @@ +var createDoomModule = (() => { + var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; + if (typeof __filename != 'undefined') _scriptName = _scriptName || __filename; + return ( +async function(moduleArg = {}) { + var moduleRtn; + +var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=true;if(ENVIRONMENT_IS_NODE){}var moduleOverrides={...Module};var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;var runtimeInitialized=false;var isFileURI=filename=>filename.startsWith("file://");function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["__wasm_call_ctors"]();FS.ignorePermissions=false}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("doom.wasm")}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{env:wasmImports,wasi_snapshot_preview1:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["memory"];updateMemoryViews();removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{receiveInstance(mod,inst);resolve(mod.exports)})})}wasmBinaryFile??=findWasmBinary();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}catch(e){readyPromiseReject(e);return Promise.reject(e)}}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.unshift(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.unshift(cb);function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr];case"i8":return HEAP8[ptr];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP64[ptr>>3];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}var noExitRuntime=Module["noExitRuntime"]||true;function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr]=value;break;case"i8":HEAP8[ptr]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":HEAP64[ptr>>3]=BigInt(value);break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}}var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(ENVIRONMENT_IS_NODE){var nodeCrypto=require("crypto");return view=>nodeCrypto.randomFillSync(view)}return view=>crypto.getRandomValues(view)};var randomFill=view=>{(randomFill=initRandomFill())(view)};var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url).then(processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,readFiles:{},ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);setattr(arg,attr)},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var setattr=FS.checkOpExists(node.node_ops.setattr,63);setattr(node,{atime,mtime})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}if(Module["logReadFiles"]&&!(flags&1)){if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){HEAP32[buf+4>>2]=stats.bsize;HEAP32[buf+40>>2]=stats.bsize;HEAP32[buf+8>>2]=stats.blocks;HEAP32[buf+12>>2]=stats.bfree;HEAP32[buf+16>>2]=stats.bavail;HEAP32[buf+20>>2]=stats.files;HEAP32[buf+24>>2]=stats.ffree;HEAP32[buf+28>>2]=stats.fsid;HEAP32[buf+44>>2]=stats.flags;HEAP32[buf+36>>2]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();stream.flags|=arg;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __emscripten_system=command=>{if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=(ret,sig)=>ret<<8|sig;if(ret.status===null){var signalToNumber=sig=>{switch(sig){case"SIGHUP":return 1;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15;default:return 2}};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;return-52};var _emscripten_get_now=()=>performance.now();var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};var FS_createPath=FS.createPath;var FS_unlink=path=>FS.unlink(path);var FS_createLazyFile=FS.createLazyFile;var FS_createDevice=FS.createDevice;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack="";var wasmImports={__syscall_fcntl64:___syscall_fcntl64,__syscall_ioctl:___syscall_ioctl,__syscall_mkdirat:___syscall_mkdirat,__syscall_openat:___syscall_openat,__syscall_renameat:___syscall_renameat,__syscall_rmdir:___syscall_rmdir,__syscall_unlinkat:___syscall_unlinkat,_emscripten_system:__emscripten_system,emscripten_get_now:_emscripten_get_now,emscripten_resize_heap:_emscripten_resize_heap,exit:_exit,fd_close:_fd_close,fd_read:_fd_read,fd_seek:_fd_seek,fd_write:_fd_write};var wasmExports=await createWasm();var ___wasm_call_ctors=wasmExports["__wasm_call_ctors"];var _free=Module["_free"]=wasmExports["free"];var _malloc=Module["_malloc"]=wasmExports["malloc"];var _doomgeneric_Tick=Module["_doomgeneric_Tick"]=wasmExports["doomgeneric_Tick"];var _doomgeneric_Create=Module["_doomgeneric_Create"]=wasmExports["doomgeneric_Create"];var _DG_GetFrameBuffer=Module["_DG_GetFrameBuffer"]=wasmExports["DG_GetFrameBuffer"];var _DG_GetScreenWidth=Module["_DG_GetScreenWidth"]=wasmExports["DG_GetScreenWidth"];var _DG_GetScreenHeight=Module["_DG_GetScreenHeight"]=wasmExports["DG_GetScreenHeight"];var _DG_PushKeyEvent=Module["_DG_PushKeyEvent"]=wasmExports["DG_PushKeyEvent"];var __emscripten_stack_restore=wasmExports["_emscripten_stack_restore"];var __emscripten_stack_alloc=wasmExports["_emscripten_stack_alloc"];var _emscripten_stack_get_current=wasmExports["emscripten_stack_get_current"];Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["setValue"]=setValue;Module["getValue"]=getValue;Module["FS_createPreloadedFile"]=FS_createPreloadedFile;Module["FS_unlink"]=FS_unlink;Module["FS_createPath"]=FS_createPath;Module["FS_createDevice"]=FS_createDevice;Module["FS"]=FS;Module["FS_createDataFile"]=FS_createDataFile;Module["FS_createLazyFile"]=FS_createLazyFile;function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise; + + + return moduleRtn; +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') { + module.exports = createDoomModule; + // This default export looks redundant, but it allows TS to import this + // commonjs style module. + module.exports.default = createDoomModule; +} else if (typeof define === 'function' && define['amd']) + define([], () => createDoomModule); diff --git a/packages/coding-agent/examples/extensions/doom-overlay/doom/build/doom.wasm b/packages/coding-agent/examples/extensions/doom-overlay/doom/build/doom.wasm new file mode 100755 index 0000000000000000000000000000000000000000..fb99ae7cefd8fcc156edd27fe79b9498c64821a4 GIT binary patch literal 380169 zcmZQbEY4+QU|?W;%BYmUSkI8aRA0}Kz*x^%pTNM7z+7JsVljb95Qiawfw4Y;r5+*< zrWq1g>+9<3>OiXN>KW@2*g>-OAY)j;EQSP@`ntM$h6FY+7h-%}0$Y6zh!3)eu?D0B zYzb5iV|@a1JxC8zeI3|2U=<)sm}=@7YZ4$PGuFc`W2{eLssp)|xgMm01>_=-A$4_i zAgTHqh6JX%I>s8NHfDb2)Vwm5)QZd!1_lsQC^fe@xhS)sBsDKSJ+&l0FTb2Y2qYm8 zA75NqoSc}G6Q5s@nwMC@zyT5#Lh+nI)+V95__4r=`Rfr6#7}Q~)v}IVZn3m4OM55yh#g z*$l!Uw;{PXH#;S>D6s_MW+8-|OY?Fv^Ri(QNS-OmP01``U;-I~q`W9KFEKY27A8XR zNP$>fSzMBu3(+BlBwmzSoLQ9`pOKnaz`(?OnE4LblbxM`m4Shkm5~WVgY=F z3nM230|Of)0}~4q6AKFy6B7$B6B8Q~D=Q1gNi2-~j0_wM3~UTcEQ|~+3``7+7=VG1 zfr){Eot=S+iIs(gm6eH!m5G&=k%bNH9|l$?NZ^1%h>?|piIJI=jfI5`Y%c>NGcyAl zBO?z311BRtBNHnl4;vc;GY1C~0}}{d{3qjOD#5__n(=$pKRQO%o;{!^IGrUtPUCUDQ zN*GinQBrnEVsdtTQEG8Xeo-pJS!QueNr+d@G0Pw&{9>>+P}!1PT2urw_B=D^TqZ^a zM@H_Yj1n?(5=IhIdJ1(Knp)aAy8TQIOwCL!Ol?e!Ox;Wqn0lBdGW9YwG3{gA&v<~b zkExZZgQ=aVi)k`bC(|URos2sePclws+|D?KaVq09#_5dP7-ujpXI#O!hH)+9O2$=; zs~HzFE@52CxQKBb<9fyoj2jtuG0tS1#WA7^ zOgor%GwouMc*gXc=_%8HrUvFl<|bz6Y0R6LH#2Wz-oebnw4Il$a|Pc)W-A8AhCT_$ zhF%FXCI-hFy%LTM4J;t$m0k%@LIW{(^h!8tff#o{V%In|m>A5M7`U6585!%985|cd zW-BqMFeorMGMF(eW0t@aW{9A`MiXm$l=K1$e_TW!NjA)=-6-*6n{!A9?}Yoj#D5UHZN%HjiOuoH4X|!z50-ibMn}dXRs}{!rXmGK1vbYCV6(iWxfPf} zsyUQcyjbcLn81pdK#G_YSP+T|SsWZ0__-Yy+~!nZQ((?^+|kaa!NedC<|t4KN@`1P zb2_eIbYyVsxyh-^z#t7Wk_GB`6vf#f)hljuf)sE--G`z8B)Q(_0H2ZxyB zlG|XhRK*N|_0b~d}*brvN6%cDUAcio54PjPbc4R72VuTyQsK5a+M2SU#0Ty`snH=k( zDwMdT6?qi692v6}d6^v)7!+8FTv;3(8Tq-Pc5*S*gG3b=q?OnlISN@E6gU)EvlW4}GT>!UU~)Xbujzz8vy8_75(hz-mN zTEw{b3o>DD{wdpfJ(-TOpKh+c;iw5yU>fpL4ny(xXh8MM2W}o!aJrc zMLuv=;dNvw$x`CbU}8~ZSK!cKVo>B%U;_DDfm0w1#8zMz2vcO|W^zzq29<@JieTsS zfmHGh&wC9eP| zg)%yx0CP2&ILw(qL4E+rWiV%A0BHo(23d{=81g~QhejqwHfRJfgEE!^gFpi#sHRb5 z1SRSdFnj(p_<-WVk*UP-!c)#H$F{AY%|q9#gJ3r* zF@c<`!NlOf%fQX8zzhyf1xD_f%6j3XIuG zjM<<@fC8hJG$_az6d1igzEWVwR$_5v@BtTN99fFY%nptpIzi?uGC)mKWE606TmZIH zgNZ?qnE}q>5oBgiU{GMp1-Z6ILW7Bcml0G#LR|~0fL4I@DKRQAWP=QZDpFu@Wb)x< z;$h)-L{i|$>cPv%!_2L~;K<>{%fzj~?8IQs%%H#or4$(9HnRvaGQhPuHZbNpE?~@2 zVsL!%k~2$zS(6!*;uIJhAAq<_2<|J+EKu_ktQFLL0p~jw1y)dMXY~R{4ih+XxS1HZ z|8v1heiju50Z&B+$2X9WVFED}VBw?02nlm02Wb4UAcByzkRuRopt1)ZaG*f)0S6a6 z926L`9a+Eu$KuG5rNjmaHWnyFZ0NBef(sOSEC?>P(Bom`77&NWA}ciQKvPa`wju+Q z1I$;v433Nn%nD4PN{KN`fl&dRcD$rPEJwy{4{0S((}~ds)Udh&PAIOt432BMxIq|{ z;2E=&z*)ZmoThj|Mz=tjjvX*Y4~#JZ#+U+Q%z!cGfEli!iuM6GMwOTpSp8TWz&Q<) z?Hn0F4NGnXMn~pCP-$|Yi#yA416ZE|lNYEW-q6LZzzSj<0E>d$dIZio0cV|ovp`uA zI?>$GZLt@aR@xB+dL@AO)DX5#k zn5D!9k6CclCLpfB?#P&}#13iU35dhWCiHX%3g!FIP*z|T@PrzZ>&MH;&8@%!DT5bz zGji91vIRH`fs^SGNUMMi)SA#>VsK}vcRccx6V%m!wJQ|Z97S>*K`jqfM+R;sHdkIo zM+QYENDH1_g+YN$i2>AbV+5!02XjDG9VodgF!F&0Lz$UC^^XPG-4*)CG2Aa+3zPB+oJNuyH#wIEo9LV^Uy;sprTC6-N`g z*c?A}vN=uwyWg?85Ud4M8ZEfW?YMx^@y&Kd1$Kcc%#MtTOpYh6aYL%TGuOBs7hL5A zsk?BE+wnH2;o^7&CVS)>H`E6p1qYzQAV=H)`$53d1Jpi)j3a=0ypAuvbFeBfy7DqR zzWL4p@)@YLa*bQS(~%WawSwz%aA1Sl&Ww&sZY=eVcVK4mGJ;x;46F)_+`OzHCWj(; zeSxC*2jgh3{=K#hHHjT_u~r)vP8Z_us% z@SOu}tpccz53%wKJRp#*d~=Q45u#fGX5|aGl?+gSgBqiSEcK3m!0Aqr5foGco{s#W zpag{v3#$SPwH$(+E8o>%!6_`PGvp68EMp6Rm^D{f%0A~_Vd(s0`Fl#WeD6o`4MggFi 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

DH5HUAHgrii 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 literal 0 HcmV?d00001 diff --git a/packages/coding-agent/examples/extensions/doom-overlay/doom/doomgeneric_pi.c b/packages/coding-agent/examples/extensions/doom-overlay/doom/doomgeneric_pi.c new file mode 100644 index 00000000..bb442f45 --- /dev/null +++ b/packages/coding-agent/examples/extensions/doom-overlay/doom/doomgeneric_pi.c @@ -0,0 +1,72 @@ +/** + * pi-doom platform implementation for doomgeneric + * + * Minimal implementation - no sound, just framebuffer and input. + */ + +#include "doomgeneric.h" +#include "doomkeys.h" +#include +#include + +// Key event queue +#define KEY_QUEUE_SIZE 256 +static struct { + int pressed; + unsigned char key; +} key_queue[KEY_QUEUE_SIZE]; +static int key_queue_read = 0; +static int key_queue_write = 0; + +// Get the framebuffer pointer for JS to read +EMSCRIPTEN_KEEPALIVE +uint32_t *DG_GetFrameBuffer(void) { return DG_ScreenBuffer; } + +// Get framebuffer dimensions +EMSCRIPTEN_KEEPALIVE +int DG_GetScreenWidth(void) { return DOOMGENERIC_RESX; } + +EMSCRIPTEN_KEEPALIVE +int DG_GetScreenHeight(void) { return DOOMGENERIC_RESY; } + +// Push a key event from JavaScript +EMSCRIPTEN_KEEPALIVE +void DG_PushKeyEvent(int pressed, unsigned char key) { + int next_write = (key_queue_write + 1) % KEY_QUEUE_SIZE; + if (next_write != key_queue_read) { + key_queue[key_queue_write].pressed = pressed; + key_queue[key_queue_write].key = key; + key_queue_write = next_write; + } +} + +void DG_Init(void) { + // Nothing to initialize +} + +void DG_DrawFrame(void) { + // Frame is in DG_ScreenBuffer, JS reads via DG_GetFrameBuffer +} + +void DG_SleepMs(uint32_t ms) { + // No-op - JS handles timing + (void)ms; +} + +uint32_t DG_GetTicksMs(void) { + return (uint32_t)emscripten_get_now(); +} + +int DG_GetKey(int *pressed, unsigned char *key) { + if (key_queue_read != key_queue_write) { + *pressed = key_queue[key_queue_read].pressed; + *key = key_queue[key_queue_read].key; + key_queue_read = (key_queue_read + 1) % KEY_QUEUE_SIZE; + return 1; + } + return 0; +} + +void DG_SetWindowTitle(const char *title) { + (void)title; +} diff --git a/packages/coding-agent/examples/extensions/doom-overlay/index.ts b/packages/coding-agent/examples/extensions/doom-overlay/index.ts new file mode 100644 index 00000000..5ef08e6f --- /dev/null +++ b/packages/coding-agent/examples/extensions/doom-overlay/index.ts @@ -0,0 +1,74 @@ +/** + * DOOM Overlay Demo - Play DOOM as an overlay + * + * Usage: pi --extension ./examples/extensions/doom-overlay + * + * Commands: + * /doom-overlay - Play DOOM in an overlay (Q to pause/exit) + * + * This demonstrates that overlays can handle real-time game rendering at 35 FPS. + */ + +import type { ExtensionAPI } from "@mariozechner/pi-coding-agent"; +import { DoomOverlayComponent } from "./doom-component.js"; +import { DoomEngine } from "./doom-engine.js"; +import { ensureWadFile } from "./wad-finder.js"; + +// Persistent engine instance - survives between invocations +let activeEngine: DoomEngine | null = null; +let activeWadPath: string | null = null; + +export default function (pi: ExtensionAPI) { + pi.registerCommand("doom-overlay", { + description: "Play DOOM as an overlay. Q to pause and exit.", + + handler: async (args, ctx) => { + if (!ctx.hasUI) { + ctx.ui.notify("DOOM requires interactive mode", "error"); + return; + } + + // Auto-download WAD if not present + ctx.ui.notify("Loading DOOM...", "info"); + const wad = args?.trim() ? args.trim() : await ensureWadFile(); + + if (!wad) { + ctx.ui.notify("Failed to download DOOM WAD file. Check your internet connection.", "error"); + return; + } + + try { + // Reuse existing engine if same WAD, otherwise create new + let isResume = false; + if (activeEngine && activeWadPath === wad) { + ctx.ui.notify("Resuming DOOM...", "info"); + isResume = true; + } else { + ctx.ui.notify(`Loading DOOM from ${wad}...`, "info"); + activeEngine = new DoomEngine(wad); + await activeEngine.init(); + activeWadPath = wad; + } + + await ctx.ui.custom( + (tui, _theme, _keybindings, done) => { + return new DoomOverlayComponent(tui, activeEngine!, () => done(undefined), isResume); + }, + { + overlay: true, + overlayOptions: { + width: "75%", + maxHeight: "95%", + anchor: "center", + margin: { top: 1 }, + }, + }, + ); + } catch (error) { + ctx.ui.notify(`Failed to load DOOM: ${error}`, "error"); + activeEngine = null; + activeWadPath = null; + } + }, + }); +} diff --git a/packages/coding-agent/examples/extensions/doom-overlay/wad-finder.ts b/packages/coding-agent/examples/extensions/doom-overlay/wad-finder.ts new file mode 100644 index 00000000..002758d5 --- /dev/null +++ b/packages/coding-agent/examples/extensions/doom-overlay/wad-finder.ts @@ -0,0 +1,51 @@ +import { existsSync, writeFileSync } from "node:fs"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +// Get the bundled WAD path (relative to this module) +const __dirname = dirname(fileURLToPath(import.meta.url)); +const BUNDLED_WAD = join(__dirname, "doom1.wad"); +const WAD_URL = "https://distro.ibiblio.org/slitaz/sources/packages/d/doom1.wad"; + +const DEFAULT_WAD_PATHS = ["./doom1.wad", "./DOOM1.WAD", "~/doom1.wad", "~/.doom/doom1.wad"]; + +export function findWadFile(customPath?: string): string | null { + if (customPath) { + const resolved = resolve(customPath.replace(/^~/, process.env.HOME || "")); + if (existsSync(resolved)) return resolved; + return null; + } + + // Check bundled WAD first + if (existsSync(BUNDLED_WAD)) { + return BUNDLED_WAD; + } + + // Fall back to default paths + for (const p of DEFAULT_WAD_PATHS) { + const resolved = resolve(p.replace(/^~/, process.env.HOME || "")); + if (existsSync(resolved)) return resolved; + } + + return null; +} + +/** Download the shareware WAD if not present. Returns path or null on failure. */ +export async function ensureWadFile(): Promise { + // Check if already exists + const existing = findWadFile(); + if (existing) return existing; + + // Download to bundled location + try { + const response = await fetch(WAD_URL); + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + const buffer = await response.arrayBuffer(); + writeFileSync(BUNDLED_WAD, Buffer.from(buffer)); + return BUNDLED_WAD; + } catch { + return null; + } +} diff --git a/packages/coding-agent/examples/extensions/overlay-qa-tests.ts b/packages/coding-agent/examples/extensions/overlay-qa-tests.ts index 2771926a..cef44dc8 100644 --- a/packages/coding-agent/examples/extensions/overlay-qa-tests.ts +++ b/packages/coding-agent/examples/extensions/overlay-qa-tests.ts @@ -4,6 +4,7 @@ * Usage: pi --extension ./examples/extensions/overlay-qa-tests.ts * * Commands: + * /overlay-animation - Real-time animation demo (~30 FPS, proves DOOM-like rendering works) * /overlay-anchors - Cycle through all 9 anchor positions * /overlay-margins - Test margin and offset options * /overlay-stack - Test stacked overlays @@ -11,14 +12,30 @@ * /overlay-edge - Test overlay positioned at terminal edge * /overlay-percent - Test percentage-based positioning * /overlay-maxheight - Test maxHeight truncation + * /overlay-sidepanel - Responsive sidepanel (hides when terminal < 100 cols) + * /overlay-toggle - Toggle visibility demo (demonstrates OverlayHandle.setHidden) */ import type { ExtensionAPI, ExtensionCommandContext, Theme } from "@mariozechner/pi-coding-agent"; -import type { OverlayAnchor, OverlayOptions, TUI } from "@mariozechner/pi-tui"; +import type { OverlayAnchor, OverlayHandle, OverlayOptions, TUI } from "@mariozechner/pi-tui"; import { matchesKey, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui"; import { spawn } from "child_process"; +// Global handle for toggle demo (in real code, use a more elegant pattern) +let globalToggleHandle: OverlayHandle | null = null; + export default function (pi: ExtensionAPI) { + // Animation demo - proves overlays can handle real-time updates (like pi-doom would need) + pi.registerCommand("overlay-animation", { + description: "Test real-time animation in overlay (~30 FPS)", + handler: async (_args: string, ctx: ExtensionCommandContext) => { + await ctx.ui.custom((tui, theme, _kb, done) => new AnimationDemoComponent(tui, theme, done), { + overlay: true, + overlayOptions: { anchor: "center", width: 50, maxHeight: 20 }, + }); + }, + }); + // Test all 9 anchor positions pi.registerCommand("overlay-anchors", { description: "Cycle through all anchor positions", @@ -178,8 +195,8 @@ export default function (pi: ExtensionAPI) { overlay: true, overlayOptions: { width: 30, - rowPercent: config.row, - colPercent: config.col, + row: `${config.row}%`, + col: `${config.col}%`, }, }, ); @@ -203,6 +220,42 @@ export default function (pi: ExtensionAPI) { }); }, }); + + // Test responsive sidepanel - only shows when terminal is wide enough + pi.registerCommand("overlay-sidepanel", { + description: "Test responsive sidepanel (hides when terminal < 100 cols)", + handler: async (_args: string, ctx: ExtensionCommandContext) => { + await ctx.ui.custom((tui, theme, _kb, done) => new SidepanelComponent(tui, theme, done), { + overlay: true, + overlayOptions: { + anchor: "right-center", + width: "25%", + minWidth: 30, + margin: { right: 1 }, + // Only show when terminal is wide enough + visible: (termWidth) => termWidth >= 100, + }, + }); + }, + }); + + // Test toggle overlay - demonstrates OverlayHandle.setHidden() via onHandle callback + pi.registerCommand("overlay-toggle", { + description: "Test overlay toggle (press 't' to toggle visibility)", + handler: async (_args: string, ctx: ExtensionCommandContext) => { + await ctx.ui.custom((tui, theme, _kb, done) => new ToggleDemoComponent(tui, theme, done), { + overlay: true, + overlayOptions: { anchor: "center", width: 50 }, + // onHandle callback provides access to the OverlayHandle for visibility control + onHandle: (handle) => { + // Store handle globally so component can access it + // (In real code, you'd use a more elegant pattern like a store or event emitter) + globalToggleHandle = handle; + }, + }); + globalToggleHandle = null; + }, + }); } function sleep(ms: number): Promise { @@ -215,7 +268,7 @@ abstract class BaseOverlay { protected box(lines: string[], width: number, title?: string): string[] { const th = this.theme; - const innerW = width - 2; + const innerW = Math.max(1, width - 2); const result: string[] = []; const titleStr = title ? truncateToWidth(` ${title} `, innerW) : ""; @@ -331,7 +384,7 @@ class StackOverlayComponent extends BaseOverlay { // Use different colors for each overlay to show stacking const colors = ["error", "success", "accent"] as const; const color = colors[(this.num - 1) % colors.length]!; - const innerW = width - 2; + const innerW = Math.max(1, width - 2); const border = (char: string) => th.fg(color, char); const padLine = (s: string) => truncateToWidth(s, innerW, "...", true); const lines: string[] = []; @@ -443,7 +496,7 @@ class StreamingOverflowComponent extends BaseOverlay { render(width: number): string[] { const th = this.theme; - const innerW = width - 2; + const innerW = Math.max(1, width - 2); const padLine = (s: string) => truncateToWidth(s, innerW, "...", true); const border = (c: string) => th.fg("border", c); @@ -589,3 +642,240 @@ class MaxHeightTestComponent extends BaseOverlay { return this.box(contentLines, width, "MaxHeight Test"); } } + +// Responsive sidepanel - demonstrates percentage width and visibility callback +class SidepanelComponent extends BaseOverlay { + private items = ["Dashboard", "Messages", "Settings", "Help", "About"]; + private selectedIndex = 0; + + constructor( + private tui: TUI, + theme: Theme, + private done: () => void, + ) { + super(theme); + } + + handleInput(data: string): void { + if (matchesKey(data, "escape") || matchesKey(data, "ctrl+c")) { + this.done(); + } else if (matchesKey(data, "up")) { + this.selectedIndex = Math.max(0, this.selectedIndex - 1); + this.tui.requestRender(); + } else if (matchesKey(data, "down")) { + this.selectedIndex = Math.min(this.items.length - 1, this.selectedIndex + 1); + this.tui.requestRender(); + } else if (matchesKey(data, "return")) { + // Could trigger an action here + this.tui.requestRender(); + } + } + + render(width: number): string[] { + const th = this.theme; + const innerW = Math.max(1, width - 2); + const padLine = (s: string) => truncateToWidth(s, innerW, "...", true); + const border = (c: string) => th.fg("border", c); + const lines: string[] = []; + + // Header + lines.push(border(`╭${"─".repeat(innerW)}╮`)); + lines.push(border("│") + padLine(th.fg("accent", " Responsive Sidepanel")) + border("│")); + lines.push(border("├") + border("─".repeat(innerW)) + border("┤")); + + // Menu items + for (let i = 0; i < this.items.length; i++) { + const item = this.items[i]!; + const isSelected = i === this.selectedIndex; + const prefix = isSelected ? th.fg("accent", "→ ") : " "; + const text = isSelected ? th.fg("accent", item) : item; + lines.push(border("│") + padLine(`${prefix}${text}`) + border("│")); + } + + // Footer with responsive behavior info + lines.push(border("├") + border("─".repeat(innerW)) + border("┤")); + lines.push(border("│") + padLine(th.fg("warning", " ⚠ Resize terminal < 100 cols")) + border("│")); + lines.push(border("│") + padLine(th.fg("warning", " to see panel auto-hide")) + border("│")); + lines.push(border("│") + padLine(th.fg("dim", " Uses visible: (w) => w >= 100")) + border("│")); + lines.push(border("│") + padLine(th.fg("dim", " ↑↓ navigate | Esc close")) + border("│")); + lines.push(border(`╰${"─".repeat(innerW)}╯`)); + + return lines; + } +} + +// Animation demo - proves overlays can handle real-time updates like pi-doom +class AnimationDemoComponent extends BaseOverlay { + private frame = 0; + private interval: ReturnType | null = null; + private fps = 0; + private lastFpsUpdate = Date.now(); + private framesSinceLastFps = 0; + + constructor( + private tui: TUI, + theme: Theme, + private done: () => void, + ) { + super(theme); + this.startAnimation(); + } + + private startAnimation(): void { + // Run at ~30 FPS (same as DOOM target) + this.interval = setInterval(() => { + this.frame++; + this.framesSinceLastFps++; + + // Update FPS counter every second + const now = Date.now(); + if (now - this.lastFpsUpdate >= 1000) { + this.fps = this.framesSinceLastFps; + this.framesSinceLastFps = 0; + this.lastFpsUpdate = now; + } + + this.tui.requestRender(); + }, 1000 / 30); + } + + handleInput(data: string): void { + if (matchesKey(data, "escape") || matchesKey(data, "ctrl+c")) { + this.dispose(); + this.done(); + } + } + + render(width: number): string[] { + const th = this.theme; + const innerW = Math.max(1, width - 2); + const padLine = (s: string) => truncateToWidth(s, innerW, "...", true); + const border = (c: string) => th.fg("border", c); + + const lines: string[] = []; + lines.push(border(`╭${"─".repeat(innerW)}╮`)); + lines.push(border("│") + padLine(th.fg("accent", " Animation Demo (~30 FPS)")) + border("│")); + lines.push(border("│") + padLine(``) + border("│")); + lines.push(border("│") + padLine(` Frame: ${th.fg("accent", String(this.frame))}`) + border("│")); + lines.push(border("│") + padLine(` FPS: ${th.fg("success", String(this.fps))}`) + border("│")); + lines.push(border("│") + padLine(``) + border("│")); + + // Animated content - bouncing bar + const barWidth = Math.max(12, innerW - 4); // Ensure enough space for bar + const pos = Math.max(0, Math.floor(((Math.sin(this.frame / 10) + 1) * (barWidth - 10)) / 2)); + const bar = " ".repeat(pos) + th.fg("accent", "██████████") + " ".repeat(Math.max(0, barWidth - 10 - pos)); + lines.push(border("│") + padLine(` ${bar}`) + border("│")); + + // Spinning character + const spinChars = ["◐", "◓", "◑", "◒"]; + const spin = spinChars[this.frame % spinChars.length]; + lines.push(border("│") + padLine(` Spinner: ${th.fg("warning", spin!)}`) + border("│")); + + // Color cycling + const hue = (this.frame * 3) % 360; + const rgb = hslToRgb(hue / 360, 0.8, 0.5); + const colorBlock = `\x1b[48;2;${rgb[0]};${rgb[1]};${rgb[2]}m${" ".repeat(10)}\x1b[0m`; + lines.push(border("│") + padLine(` Color: ${colorBlock}`) + border("│")); + + lines.push(border("│") + padLine(``) + border("│")); + lines.push(border("│") + padLine(th.fg("dim", " This proves overlays can handle")) + border("│")); + lines.push(border("│") + padLine(th.fg("dim", " real-time game-like rendering.")) + border("│")); + lines.push(border("│") + padLine(th.fg("dim", " (pi-doom uses same approach)")) + border("│")); + lines.push(border("│") + padLine(``) + border("│")); + lines.push(border("│") + padLine(th.fg("dim", " Press Esc to close")) + border("│")); + lines.push(border(`╰${"─".repeat(innerW)}╯`)); + + return lines; + } + + dispose(): void { + if (this.interval) { + clearInterval(this.interval); + this.interval = null; + } + } +} + +// HSL to RGB helper for color cycling animation +function hslToRgb(h: number, s: number, l: number): [number, number, number] { + let r: number, g: number, b: number; + if (s === 0) { + r = g = b = l; + } else { + const hue2rgb = (p: number, q: number, t: number) => { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + const q = l < 0.5 ? l * (1 + s) : l + s - l * s; + const p = 2 * l - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; +} + +// Toggle demo - demonstrates OverlayHandle.setHidden() via onHandle callback +class ToggleDemoComponent extends BaseOverlay { + private toggleCount = 0; + private isToggling = false; + + constructor( + private tui: TUI, + theme: Theme, + private done: () => void, + ) { + super(theme); + } + + handleInput(data: string): void { + if (matchesKey(data, "escape") || matchesKey(data, "ctrl+c")) { + this.done(); + } else if (matchesKey(data, "t") && globalToggleHandle && !this.isToggling) { + // Demonstrate toggle by hiding for 1 second then showing again + // (In real usage, a global keybinding would control visibility) + this.isToggling = true; + this.toggleCount++; + globalToggleHandle.setHidden(true); + + // Auto-restore after 1 second to demonstrate the API + setTimeout(() => { + if (globalToggleHandle) { + globalToggleHandle.setHidden(false); + this.isToggling = false; + this.tui.requestRender(); + } + }, 1000); + } + } + + render(width: number): string[] { + const th = this.theme; + return this.box( + [ + "", + th.fg("accent", " Toggle Demo"), + "", + " This overlay demonstrates the", + " onHandle callback API.", + "", + ` Toggle count: ${th.fg("accent", String(this.toggleCount))}`, + "", + th.fg("dim", " Press 't' to hide for 1 second"), + th.fg("dim", " (demonstrates setHidden API)"), + "", + th.fg("dim", " In real usage, a global keybinding"), + th.fg("dim", " would toggle visibility externally."), + "", + th.fg("dim", " Press Esc to close"), + "", + ], + width, + "Toggle Demo", + ); + } +} diff --git a/packages/coding-agent/src/core/extensions/types.ts b/packages/coding-agent/src/core/extensions/types.ts index 517544ce..38debe33 100644 --- a/packages/coding-agent/src/core/extensions/types.ts +++ b/packages/coding-agent/src/core/extensions/types.ts @@ -15,7 +15,15 @@ import type { ThinkingLevel, } from "@mariozechner/pi-agent-core"; import type { ImageContent, Model, TextContent, ToolResultMessage } from "@mariozechner/pi-ai"; -import type { Component, EditorComponent, EditorTheme, KeyId, OverlayOptions, TUI } from "@mariozechner/pi-tui"; +import type { + Component, + EditorComponent, + EditorTheme, + KeyId, + OverlayHandle, + OverlayOptions, + TUI, +} from "@mariozechner/pi-tui"; import type { Static, TSchema } from "@sinclair/typebox"; import type { Theme } from "../../modes/interactive/theme/theme.js"; import type { BashResult } from "../bash-executor.js"; @@ -116,6 +124,8 @@ export interface ExtensionUIContext { overlay?: boolean; /** Overlay positioning/sizing options. Can be static or a function for dynamic updates. */ overlayOptions?: OverlayOptions | (() => OverlayOptions); + /** Called with the overlay handle after the overlay is shown. Use to control visibility. */ + onHandle?: (handle: OverlayHandle) => void; }, ): Promise; diff --git a/packages/coding-agent/src/modes/interactive/interactive-mode.ts b/packages/coding-agent/src/modes/interactive/interactive-mode.ts index 11f5740d..d49576fb 100644 --- a/packages/coding-agent/src/modes/interactive/interactive-mode.ts +++ b/packages/coding-agent/src/modes/interactive/interactive-mode.ts @@ -21,6 +21,7 @@ import type { EditorComponent, EditorTheme, KeyId, + OverlayHandle, OverlayOptions, SlashCommand, } from "@mariozechner/pi-tui"; @@ -1260,7 +1261,11 @@ export class InteractiveMode { keybindings: KeybindingsManager, done: (result: T) => void, ) => (Component & { dispose?(): void }) | Promise, - options?: { overlay?: boolean; overlayOptions?: OverlayOptions | (() => OverlayOptions) }, + options?: { + overlay?: boolean; + overlayOptions?: OverlayOptions | (() => OverlayOptions); + onHandle?: (handle: OverlayHandle) => void; + }, ): Promise { const savedText = this.editor.getText(); const isOverlay = options?.overlay ?? false; @@ -1309,7 +1314,9 @@ export class InteractiveMode { const w = (component as { width?: number }).width; return w ? { width: w } : undefined; }; - this.ui.showOverlay(component, resolveOptions()); + const handle = this.ui.showOverlay(component, resolveOptions()); + // Expose handle to caller for visibility control + options?.onHandle?.(handle); } else { this.editorContainer.clear(); this.editorContainer.addChild(component); diff --git a/packages/tui/CHANGELOG.md b/packages/tui/CHANGELOG.md index 44173e63..609eb1a4 100644 --- a/packages/tui/CHANGELOG.md +++ b/packages/tui/CHANGELOG.md @@ -6,8 +6,10 @@ - `SettingsListOptions` with `enableSearch` for fuzzy filtering in `SettingsList` ([#643](https://github.com/badlogic/pi-mono/pull/643) by [@ninlds](https://github.com/ninlds)) - `pageUp` and `pageDown` key support with `selectPageUp`/`selectPageDown` editor actions ([#662](https://github.com/badlogic/pi-mono/pull/662) by [@aliou](https://github.com/aliou)) -- `OverlayOptions` API for overlay positioning and sizing: `width`, `widthPercent`, `minWidth`, `maxHeight`, `maxHeightPercent`, `anchor`, `offsetX`, `offsetY`, `rowPercent`, `colPercent`, `row`, `col`, `margin` -- New exported types: `OverlayAnchor`, `OverlayMargin`, `OverlayOptions` +- `OverlayOptions` API for overlay positioning and sizing with CSS-like values: `width`, `maxHeight`, `row`, `col` accept numbers (absolute) or percentage strings (e.g., `"50%"`). Also supports `minWidth`, `anchor`, `offsetX`, `offsetY`, `margin`. +- `OverlayOptions.visible` callback for responsive overlays - receives terminal dimensions, return false to hide +- `showOverlay()` now returns `OverlayHandle` with `hide()`, `setHidden(boolean)`, `isHidden()` for programmatic visibility control +- New exported types: `OverlayAnchor`, `OverlayHandle`, `OverlayMargin`, `OverlayOptions`, `SizeValue` - `truncateToWidth()` now accepts optional `pad` parameter to pad result with spaces to exactly `maxWidth` ### Fixed diff --git a/packages/tui/src/index.ts b/packages/tui/src/index.ts index ba158353..4ee8de5e 100644 --- a/packages/tui/src/index.ts +++ b/packages/tui/src/index.ts @@ -76,8 +76,10 @@ export { type Component, Container, type OverlayAnchor, + type OverlayHandle, type OverlayMargin, type OverlayOptions, + type SizeValue, TUI, } from "./tui.js"; // Utilities diff --git a/packages/tui/src/tui.ts b/packages/tui/src/tui.ts index c9e42f4f..84d0f8f4 100644 --- a/packages/tui/src/tui.ts +++ b/packages/tui/src/tui.ts @@ -65,23 +65,33 @@ export interface OverlayMargin { left?: number; } +/** Value that can be absolute (number) or percentage (string like "50%") */ +export type SizeValue = number | `${number}%`; + +/** Parse a SizeValue into absolute value given a reference size */ +function parseSizeValue(value: SizeValue | undefined, referenceSize: number): number | undefined { + if (value === undefined) return undefined; + if (typeof value === "number") return value; + // Parse percentage string like "50%" + const match = value.match(/^(\d+(?:\.\d+)?)%$/); + if (match) { + return Math.floor((referenceSize * parseFloat(match[1])) / 100); + } + return undefined; +} + /** - * Options for overlay positioning and sizing + * Options for overlay positioning and sizing. + * Values can be absolute numbers or percentage strings (e.g., "50%"). */ export interface OverlayOptions { - // === Sizing (absolute) === - /** Fixed width in columns */ - width?: number; + // === Sizing === + /** Width in columns, or percentage of terminal width (e.g., "50%") */ + width?: SizeValue; /** Minimum width in columns */ minWidth?: number; - /** Maximum height in rows */ - maxHeight?: number; - - // === Sizing (relative to terminal) === - /** Width as percentage of terminal width (0-100) */ - widthPercent?: number; - /** Maximum height as percentage of terminal height (0-100) */ - maxHeightPercent?: number; + /** Maximum height in rows, or percentage of terminal height (e.g., "50%") */ + maxHeight?: SizeValue; // === Positioning - anchor-based === /** Anchor point for positioning (default: 'center') */ @@ -91,21 +101,35 @@ export interface OverlayOptions { /** Vertical offset from anchor position (positive = down) */ offsetY?: number; - // === Positioning - percentage-based (alternative to anchor) === - /** Vertical position as percentage (0 = top, 100 = bottom) */ - rowPercent?: number; - /** Horizontal position as percentage (0 = left, 100 = right) */ - colPercent?: number; - - // === Positioning - absolute (low-level) === - /** Absolute row position (overrides anchor/percent) */ - row?: number; - /** Absolute column position (overrides anchor/percent) */ - col?: number; + // === Positioning - percentage or absolute === + /** Row position: absolute number, or percentage (e.g., "25%" = 25% from top) */ + row?: SizeValue; + /** Column position: absolute number, or percentage (e.g., "50%" = centered horizontally) */ + col?: SizeValue; // === Margin from terminal edges === /** Margin from terminal edges. Number applies to all sides. */ margin?: OverlayMargin | number; + + // === Visibility === + /** + * Control overlay visibility based on terminal dimensions. + * If provided, overlay is only rendered when this returns true. + * Called each render cycle with current terminal dimensions. + */ + visible?: (termWidth: number, termHeight: number) => boolean; +} + +/** + * Handle returned by showOverlay for controlling the overlay + */ +export interface OverlayHandle { + /** Permanently remove the overlay (cannot be shown again) */ + hide(): void; + /** Temporarily hide or show the overlay */ + setHidden(hidden: boolean): void; + /** Check if overlay is temporarily hidden */ + isHidden(): boolean; } /** @@ -165,6 +189,7 @@ export class TUI extends Container { component: Component; options?: OverlayOptions; preFocus: Component | null; + hidden: boolean; }[] = []; constructor(terminal: Terminal) { @@ -176,25 +201,90 @@ export class TUI extends Container { this.focusedComponent = component; } - /** Show an overlay component with configurable positioning and sizing. */ - showOverlay(component: Component, options?: OverlayOptions): void { - this.overlayStack.push({ component, options, preFocus: this.focusedComponent }); - this.setFocus(component); + /** + * Show an overlay component with configurable positioning and sizing. + * Returns a handle to control the overlay's visibility. + */ + showOverlay(component: Component, options?: OverlayOptions): OverlayHandle { + const entry = { component, options, preFocus: this.focusedComponent, hidden: false }; + this.overlayStack.push(entry); + // Only focus if overlay is actually visible + if (this.isOverlayVisible(entry)) { + this.setFocus(component); + } this.terminal.hideCursor(); this.requestRender(); + + // Return handle for controlling this overlay + return { + hide: () => { + const index = this.overlayStack.indexOf(entry); + if (index !== -1) { + this.overlayStack.splice(index, 1); + // Restore focus if this overlay had focus + if (this.focusedComponent === component) { + const topVisible = this.getTopmostVisibleOverlay(); + this.setFocus(topVisible?.component ?? entry.preFocus); + } + if (this.overlayStack.length === 0) this.terminal.hideCursor(); + this.requestRender(); + } + }, + setHidden: (hidden: boolean) => { + if (entry.hidden === hidden) return; + entry.hidden = hidden; + // Update focus when hiding/showing + if (hidden) { + // If this overlay had focus, move focus to next visible or preFocus + if (this.focusedComponent === component) { + const topVisible = this.getTopmostVisibleOverlay(); + this.setFocus(topVisible?.component ?? entry.preFocus); + } + } else { + // Restore focus to this overlay when showing (if it's actually visible) + if (this.isOverlayVisible(entry)) { + this.setFocus(component); + } + } + this.requestRender(); + }, + isHidden: () => entry.hidden, + }; } /** Hide the topmost overlay and restore previous focus. */ hideOverlay(): void { const overlay = this.overlayStack.pop(); if (!overlay) return; - this.setFocus(overlay.preFocus); + // Find topmost visible overlay, or fall back to preFocus + const topVisible = this.getTopmostVisibleOverlay(); + this.setFocus(topVisible?.component ?? overlay.preFocus); if (this.overlayStack.length === 0) this.terminal.hideCursor(); this.requestRender(); } + /** Check if there are any visible overlays */ hasOverlay(): boolean { - return this.overlayStack.length > 0; + return this.overlayStack.some((o) => this.isOverlayVisible(o)); + } + + /** Check if an overlay entry is currently visible */ + private isOverlayVisible(entry: (typeof this.overlayStack)[number]): boolean { + if (entry.hidden) return false; + if (entry.options?.visible) { + return entry.options.visible(this.terminal.columns, this.terminal.rows); + } + return true; + } + + /** Find the topmost visible overlay, if any */ + private getTopmostVisibleOverlay(): (typeof this.overlayStack)[number] | undefined { + for (let i = this.overlayStack.length - 1; i >= 0; i--) { + if (this.isOverlayVisible(this.overlayStack[i])) { + return this.overlayStack[i]; + } + } + return undefined; } override invalidate(): void { @@ -269,6 +359,20 @@ export class TUI extends Container { return; } + // If focused component is an overlay, verify it's still visible + // (visibility can change due to terminal resize or visible() callback) + const focusedOverlay = this.overlayStack.find((o) => o.component === this.focusedComponent); + if (focusedOverlay && !this.isOverlayVisible(focusedOverlay)) { + // Focused overlay is no longer visible, redirect to topmost visible overlay + const topVisible = this.getTopmostVisibleOverlay(); + if (topVisible) { + this.setFocus(topVisible.component); + } else { + // No visible overlays, restore to preFocus + this.setFocus(focusedOverlay.preFocus); + } + } + // Pass input to focused component (including Ctrl+C) // The focused component can decide how to handle Ctrl+C if (this.focusedComponent?.handleInput) { @@ -354,14 +458,7 @@ export class TUI extends Container { const availHeight = Math.max(1, termHeight - marginTop - marginBottom); // === Resolve width === - let width: number; - if (opt.width !== undefined) { - width = opt.width; - } else if (opt.widthPercent !== undefined) { - width = Math.floor((termWidth * opt.widthPercent) / 100); - } else { - width = Math.min(80, availWidth); - } + let width = parseSizeValue(opt.width, termWidth) ?? Math.min(80, availWidth); // Apply minWidth if (opt.minWidth !== undefined) { width = Math.max(width, opt.minWidth); @@ -370,12 +467,7 @@ export class TUI extends Container { width = Math.max(1, Math.min(width, availWidth)); // === Resolve maxHeight === - let maxHeight: number | undefined; - if (opt.maxHeight !== undefined) { - maxHeight = opt.maxHeight; - } else if (opt.maxHeightPercent !== undefined) { - maxHeight = Math.floor((termHeight * opt.maxHeightPercent) / 100); - } + let maxHeight = parseSizeValue(opt.maxHeight, termHeight); // Clamp to available space if (maxHeight !== undefined) { maxHeight = Math.max(1, Math.min(maxHeight, availHeight)); @@ -388,13 +480,22 @@ export class TUI extends Container { let row: number; let col: number; - // Absolute positioning takes precedence if (opt.row !== undefined) { - row = opt.row; - } else if (opt.rowPercent !== undefined) { - // Percentage: 0 = top, 100 = bottom - const maxRow = Math.max(0, availHeight - effectiveHeight); - row = marginTop + Math.floor((maxRow * opt.rowPercent) / 100); + if (typeof opt.row === "string") { + // Percentage: 0% = top, 100% = bottom (overlay stays within bounds) + const match = opt.row.match(/^(\d+(?:\.\d+)?)%$/); + if (match) { + const maxRow = Math.max(0, availHeight - effectiveHeight); + const percent = parseFloat(match[1]) / 100; + row = marginTop + Math.floor(maxRow * percent); + } else { + // Invalid format, fall back to center + row = this.resolveAnchorRow("center", effectiveHeight, availHeight, marginTop); + } + } else { + // Absolute row position + row = opt.row; + } } else { // Anchor-based (default: center) const anchor = opt.anchor ?? "center"; @@ -402,11 +503,21 @@ export class TUI extends Container { } if (opt.col !== undefined) { - col = opt.col; - } else if (opt.colPercent !== undefined) { - // Percentage: 0 = left, 100 = right - const maxCol = Math.max(0, availWidth - width); - col = marginLeft + Math.floor((maxCol * opt.colPercent) / 100); + if (typeof opt.col === "string") { + // Percentage: 0% = left, 100% = right (overlay stays within bounds) + const match = opt.col.match(/^(\d+(?:\.\d+)?)%$/); + if (match) { + const maxCol = Math.max(0, availWidth - width); + const percent = parseFloat(match[1]) / 100; + col = marginLeft + Math.floor(maxCol * percent); + } else { + // Invalid format, fall back to center + col = this.resolveAnchorCol("center", width, availWidth, marginLeft); + } + } else { + // Absolute column position + col = opt.col; + } } else { // Anchor-based (default: center) const anchor = opt.anchor ?? "center"; @@ -463,11 +574,16 @@ export class TUI extends Container { if (this.overlayStack.length === 0) return lines; const result = [...lines]; - // Pre-render all overlays and calculate positions + // Pre-render all visible overlays and calculate positions const rendered: { overlayLines: string[]; row: number; col: number; w: number }[] = []; let minLinesNeeded = result.length; - for (const { component, options } of this.overlayStack) { + for (const entry of this.overlayStack) { + // Skip invisible overlays (hidden or visible() returns false) + if (!this.isOverlayVisible(entry)) continue; + + const { component, options } = entry; + // Get layout with height=0 first to determine width and maxHeight // (width and maxHeight don't depend on overlay height) const { width, maxHeight } = this.resolveOverlayLayout(options, 0, termWidth, termHeight); diff --git a/packages/tui/test/overlay-options.test.ts b/packages/tui/test/overlay-options.test.ts index b5dbc5c4..2a83f4b3 100644 --- a/packages/tui/test/overlay-options.test.ts +++ b/packages/tui/test/overlay-options.test.ts @@ -167,14 +167,14 @@ describe("TUI overlay options", () => { }); }); - describe("widthPercent", () => { + describe("width percentage", () => { it("should render overlay at percentage of terminal width", async () => { const terminal = new VirtualTerminal(100, 24); const tui = new TUI(terminal); const overlay = new StaticOverlay(["test"]); tui.addChild(new EmptyContent()); - tui.showOverlay(overlay, { widthPercent: 50 }); + tui.showOverlay(overlay, { width: "50%" }); tui.start(); await renderAndFlush(tui, terminal); @@ -188,7 +188,7 @@ describe("TUI overlay options", () => { const overlay = new StaticOverlay(["test"]); tui.addChild(new EmptyContent()); - tui.showOverlay(overlay, { widthPercent: 10, minWidth: 30 }); + tui.showOverlay(overlay, { width: "10%", minWidth: 30 }); tui.start(); await renderAndFlush(tui, terminal); @@ -344,7 +344,7 @@ describe("TUI overlay options", () => { tui.addChild(new EmptyContent()); // 50% should center both ways - tui.showOverlay(overlay, { width: 10, rowPercent: 50, colPercent: 50 }); + tui.showOverlay(overlay, { width: 10, row: "50%", col: "50%" }); tui.start(); await renderAndFlush(tui, terminal); @@ -368,7 +368,7 @@ describe("TUI overlay options", () => { const overlay = new StaticOverlay(["TOP"]); tui.addChild(new EmptyContent()); - tui.showOverlay(overlay, { width: 10, rowPercent: 0 }); + tui.showOverlay(overlay, { width: 10, row: "0%" }); tui.start(); await renderAndFlush(tui, terminal); @@ -383,7 +383,7 @@ describe("TUI overlay options", () => { const overlay = new StaticOverlay(["BOTTOM"]); tui.addChild(new EmptyContent()); - tui.showOverlay(overlay, { width: 10, rowPercent: 100 }); + tui.showOverlay(overlay, { width: 10, row: "100%" }); tui.start(); await renderAndFlush(tui, terminal); @@ -421,7 +421,7 @@ describe("TUI overlay options", () => { const overlay = new StaticOverlay(["L1", "L2", "L3", "L4", "L5", "L6", "L7", "L8", "L9", "L10"]); tui.addChild(new EmptyContent()); - tui.showOverlay(overlay, { maxHeightPercent: 50 }); + tui.showOverlay(overlay, { maxHeight: "50%" }); tui.start(); await renderAndFlush(tui, terminal);