<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ida-tui.git/idatui/tui.py, branch pre-codemode</title>
<subtitle>tui for headless ida</subtitle>
<id>https://git.sl0p.foo/ida-tui.git/atom/idatui/tui.py?h=pre-codemode</id>
<link rel='self' href='https://git.sl0p.foo/ida-tui.git/atom/idatui/tui.py?h=pre-codemode'/>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/'/>
<updated>2026-07-24T12:53:56Z</updated>
<entry>
<title>mcp: delete the ida-pro-mcp transport, supervisor, and mcp-only tests</title>
<updated>2026-07-24T12:53:56Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-24T12:53:56Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=22ffea91210610d1def042e230ffe8d223022b30'/>
<id>urn:sha1:22ffea91210610d1def042e230ffe8d223022b30</id>
<content type='text'>
The idalib worker is the only backend now, so remove the dead HTTP/supervisor
surface entirely (~2200 lines):

* deleted idatui/client.py (the IDAClient HTTP/JSON-RPC transport + session
  manager), idatui/tui.py (the old mcp TUI entry, superseded by launch.py),
  spawn.sh, and systemd/ (the supervisor unit).
* deleted the mcp-only tests (stress_client, smoke_client, test_keepalive,
  stress_paging, rpc_smoke, serverctl.sh, pane_smoke, test_domain) -- the worker
  pilot (tests/test_scenarios.py) supersedes them.
* migrated the tmux RPC harness (idatui/pane.py) to the worker: it spawns
  `idatui.launch &lt;binary&gt; --rpc &lt;sock&gt;` instead of the mcp `idatui.tui`, drops
  the supervisor auto-start/ensure machinery, and reaps our own worker
  (idatui/worker.py) instead of ida_pro_mcp.idalib_server. --db/--url/--no-
  ensure-server are gone; --open is required.
* __init__ / __main__ / domain no longer import client (exceptions come from
  errors.py, the domain client hint is WorkerClient); pyproject points both
  console scripts at idatui.launch; README + ida-tui header describe the
  worker-only flow.

What stays (by design): the ida_pro_mcp *package* (the worker reuses its @tool
functions in-process) and server/patch_server.py (the worker injects its custom
tools on startup). Verified: whole package imports + IdaTui constructs + pilot
lists 31 scenarios. The worker pilot (134 pass / 2 known flakes) is the E2E gate.
</content>
</entry>
<entry>
<title>rpc: unix-socket puppeteering server (raw keys + introspection + screen)</title>
<updated>2026-07-10T13:10:25Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-10T13:10:25Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=690a34512eaed933917f2d2c1cf12327923b39ac'/>
<id>urn:sha1:690a34512eaed933917f2d2c1cf12327923b39ac</id>
<content type='text'>
Run the TUI with --rpc &lt;sock&gt; and it renders normally while an asyncio
listener on the same loop lets another process drive it. Handlers touch
the UI directly (same loop, no thread hop), so every injected key has the
identical on-screen effect a keyboard would — the point for livestreaming.

Newline-delimited JSON. v1 methods: keys/text (raw injection, via the same
_press_keys the pilot uses; text can interleave wait:&lt;ms&gt; for a typed-out
look), state/view/screen/functions (introspection; screen() is a full
plain-text render of exactly what the viewer sees). No auth by design —
the socket is 0600, local only.

tests/rpc_smoke.py drives it end-to-end over a real socket (7 green).
</content>
</entry>
<entry>
<title>tui: --open PATH to create/attach a session for an arbitrary binary</title>
<updated>2026-07-09T10:15:42Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-09T10:15:42Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=3527cb15cf02a7c50d976c52b39ec73e0adf760d'/>
<id>urn:sha1:3527cb15cf02a7c50d976c52b39ec73e0adf760d</id>
<content type='text'>
- app: when open_path is set, idb_open (idle_ttl=1e9, long timeout) and pin the
  returned session; clean status on failure (e.g. non-writable dir)
- tui.py: --open flag + usage docs (attach vs open)
- verified: --open targets/cat -&gt; new session, 161 funcs loaded
</content>
</entry>
<entry>
<title>Phase 1 TUI: two-pane functions&lt;-&gt;disasm, virtualized listing, nav backbone</title>
<updated>2026-07-09T10:05:24Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-09T10:05:24Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=8d67549eaa927c7ffc48c57f3ebc438c0fe7da09'/>
<id>urn:sha1:8d67549eaa927c7ffc48c57f3ebc438c0fe7da09</id>
<content type='text'>
- idatui/app.py: keyboard-first Textual app
  * FunctionsPanel: lazy-streamed function list (DataTable) with glob filter
  * DisasmView: line-VIRTUALIZED ScrollView -- paints from domain block cache,
    background-fetches misses, prefetches neighbors. Proven: 52,120-insn func,
    jump-to-bottom in 0.31s with only ~6 blocks (~1.5k lines) ever materialized.
  * address-history nav stack (Enter follow / Esc back); goto by name or 0xADDR
  * bump_idle_ttl + KeepAlive on startup so the session never idles out
  * all MCP work on Textual worker threads; UI never blocks
- idatui/tui.py: launcher (python -m idatui.tui / console script 'idatui')
- tests/test_tui.py: headless Pilot test, 9/9 (boot, load 10k funcs, open,
  scroll, bg-cache, goto-bottom, filter)
- pyproject: textual extra + idatui script entry
</content>
</entry>
</feed>
