What it does
mcp_log_window
Top-right floating "MCP" window (zui) that hosts the MCP tool-call
log. Wraps mcp_log_ui with its own screen lifecycle — registers via
ui.registerScreen, throttles repaints to every 100 ms, and exposes a
movable / resizable window pinned to the top-right by default.
Unlike system_tools, this window is a dedicated stand-alone screen
rather than a tab host, and uses a fixed screen_id (default
"mcp-log-window") so external ui.hideScreen callers keep working.
Exports
M.createState(opts: MountOpts?) -> McpLogWindowState— build the initial state table from mount opts. Useful for rehydration without going through the full mount flow.M.mount(opts: MountOpts?) -> McpLogWindowHandle— register the window, return a handle whoseupdate/onCallback/destroythe caller drives per frame.
Types:
MountOpts = { title: string?, width: number?, height: number?, screen_id: string? }McpLogWindowState = { title: string, width: number, height: number }McpLogWindowHandle = { state: McpLogWindowState, update: (dt) -> (), onCallback: (id, data) -> boolean, destroy: () -> () }
Usage
local McpLogWindow = require("@builtin::modules.engine.editor.mcp_log_window")
local handle = McpLogWindow.mount({ title = "Agent" })
-- In your component:
function update(dt) handle.update(dt) end
function onCallback(id, data) return handle.onCallback(id, data) end
function onDestroy() handle.destroy() end
Notes
- Repaints are throttled to
MIN_UPDATE_INTERVAL(100 ms) but flush immediately on user interaction so toolbar clicks feel responsive. - The hosting component owns the screen lifecycle (
destroycallsui.unregisterScreen); leaving a session without callingdestroyleaks a screen registration. - Window position defaults to the top-right via
getViewportSize, falling back to1600x900if the FFI binding is absent.
Discussion
Scoped to this part · feeds back into the world's score.
Sign in to post.sign in
No comments yet. Be the first.