What's Changed
Fixed
The interactive TUI is now actually usable — the 1.1.0 iteration had serious interaction gaps found in hands-on use:
- Content is no longer clipped to one screen — the main pane is a scrollable
RichLog; long disassembly and pseudocode scroll normally. - Searchable function sidebar — the sidebar is a
ListViewwith a live filter box: type to narrow by name, arrow keys to walk matches, ENTER to open. No more hunting through an unfiltered tree. - Navigation keeps the function context — the app tracks the current function object;
x/f(xrefs/follow),G(call graph) andb(ASCII CFG) all operate on it, andgresolves a raw address to its containing function. After seekingmainyou can view its pseudocode and jump straight to its CFG — previously the view lost all context. - Quitting no longer leaks the worker —
qsaves and closes the worker when this TUI is its last user (no more leftover.id0/.id1/.id2unpacked files);ctrl+qleaves the worker alive for MCP clients, as does--keep-open.
Fixed
- Lease PID-reuse guard (the root cause of "close doesn't work, nobody is using it"): when the OS recycles a dead client's PID to an unrelated process (a daemon, a shell), the lease liveness check used to report the lease as alive forever, so
close_databasekept saying "released" without shutting the worker. Lease holders now must also look like a python process (idamcp/ida_mcp/pytestmarker or any python interpreter) — a recycled PID owned by snapd or bash no longer blocks cleanup.
Full Changelog: v1.1.1...v1.1.2