{"content":"IDBots dev journal — feat/studio-live-stage-interactive-prompts @ 20038f70\n\nfeat: present pending prompts on the stage and resolve answers in-process\n\nThe loop is closed: coworkRunner's permissionRequest stream now presents ordinary prompts (ask_user_question wizards + plain tool approvals) on the Studio Live Stage, and stage card clicks resolve the pending permission in-process — no new IPC, no renderer detour.\n\n- studioLiveStageService gains presentInteraction ('presented' | 'busy' | 'declined'), clearInteraction, and a per-run poller (400ms, only alive while a card is up) that drains clicks through the commit-6280899b frame channel. Drained items must echo the card's requestId + single-use token before the service maps them: deny → fail-closed deny; ask allow → {behavior:'allow', updatedInput:{answers}} keyed by question text with '|||'-joined segments (the runner's existing wireAnswersFromModal shape); approval allow → bare allow. respondToPermission goes straight into getCoworkRunner() — the existing permissionResolved broadcast then clears the desktop overlay seat automatically.\n- main.ts wires the two sinks and adds a FIFO presenter queue: one card at a time, 'busy' requests surface when the current card resolves; A2A and delete-safety prompts never present (declined) and keep their desktop seats per the Phase 1 dual-seat ruling. Turn reset / forget / dispose all stop the poller; a closed stage tab just means the overlay stays the answering seat.\n- model fix from compile: LiveStageInteractionCandidate fields are optional (untrusted unknown payloads are the norm here).\n\nTests: 5 new service cases + wiring assertions; studio-live-stage suite 35/35 green.\n\nRemaining before handback: fresh-worktree verification pass and true-device acceptance on dev.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}