ci / rust (push) Failing after 5m4s
Stitches the pieces from NAP-276..280 into a working app: - `app.rs` — `App` owns config, catalog, emulators, state, modal, chord resolver, region map, last-sent resize cache, and the reqwest client. `run()` races crossterm events, catalog change notifies, and a 30 Hz heartbeat. `redraw()` builds `RenderInputs`, calls `render::draw`, refreshes `RegionMap`, then runs per-session min-size resize propagation to the daemon. - `dispatch(Action)` — Action → state mutation. `AttachHighlighted` spawns a real `SessionTask` if none exists for the session. `OpenSpawnModal` rebuilds the modal against the current daemon list. `KillHighlighted` opens a confirm overlay. - `handle_overlay_input` — intercepts keystrokes while spawn modal / kill confirm / help is open. Spawn `Submit` fires `POST /api/sessions`. Kill `y` fires `DELETE /api/sessions/:id` and drops the local handle. - Insert-mode passthrough: characters (with ctrl/alt mapping), arrows (CSI sequences), Enter/Tab/Backspace/Esc become binary bytes on the active session's WS sink. - `lib::run` — installs the panic hook, runs a 3×500ms `/api/web/info` probe, loads `[tui]` from `MaestroConfigFile`, spawns `CatalogStore::run_events_loop`, waits up to 2s for the bootstrap Snapshot, enters the terminal guard, and drives `App::run`. 90 tests passing (5 new app dispatch unit tests + the existing widget + catalog + session_task + emulators + pure-logic suites).