<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ida-tui.git, branch main</title>
<subtitle>tui for headless ida</subtitle>
<id>https://git.sl0p.foo/ida-tui.git/atom/?h=main</id>
<link rel='self' href='https://git.sl0p.foo/ida-tui.git/atom/?h=main'/>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/'/>
<updated>2026-07-11T20:58:57Z</updated>
<entry>
<title>TODO: opcodes in disas view done</title>
<updated>2026-07-11T20:58:57Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-11T20:58:57Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=d0468e46f865af6441189fdffc230e392d03f29c'/>
<id>urn:sha1:d0468e46f865af6441189fdffc230e392d03f29c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>disasm: render opcode bytes (toggle 'o'), padded to widest insn</title>
<updated>2026-07-11T20:58:52Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-11T20:58:52Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=17b8c95b948d4fe2d38cac4f80ffa8fb0a750d4f'/>
<id>urn:sha1:17b8c95b948d4fe2d38cac4f80ffa8fb0a750d4f</id>
<content type='text'>
Fetch per-instruction opcode bytes alongside the disasm listing and show
them in a column between the address and the mnemonic. Instruction length
comes from consecutive addresses (variable-length safe: x86 movabs shows
its full 10 bytes); the block over-fetches one instruction for the last
line's boundary, falling back to the function end for the final insn.

The column pads to the widest instruction across the whole function:
_fetch_block tracks a running max, and on load a background scan_bytes()
settles a stable width so padding doesn't jump as blocks stream in.
_op_field is shared by the rendered strip, _line_plain, and search _fmt
so cursor/match offsets stay aligned. 'o' toggles the column.
</content>
</entry>
<entry>
<title>docs: add README</title>
<updated>2026-07-11T19:38:10Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-11T19:38:10Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=337ccbc1fd04d1af25924e746a126315354d9d2e'/>
<id>urn:sha1:337ccbc1fd04d1af25924e746a126315354d9d2e</id>
<content type='text'>
</content>
</entry>
<entry>
<title>spawn.sh: run location-independent + env-configurable host/port/target</title>
<updated>2026-07-11T19:09:45Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-07-11T19:09:45Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=4e68fbb9e052d874704162254a07a854e9dcc82e'/>
<id>urn:sha1:4e68fbb9e052d874704162254a07a854e9dcc82e</id>
<content type='text'>
</content>
</entry>
<entry>
<title>drive: make `dis` drive the live UI too (generalize _show_decomp -&gt; _show_view)</title>
<updated>2026-07-11T19:09:45Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-07-11T19:09:45Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=b55e5529fb96e0cfa5769d1af4e89350c8c255ce'/>
<id>urn:sha1:b55e5529fb96e0cfa5769d1af4e89350c8c255ce</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix: don't hang drive pc on undecompilable functions</title>
<updated>2026-07-11T08:59:48Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-07-11T08:59:48Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=2c86330705569805c5d201113a569c9e03c0214a'/>
<id>urn:sha1:2c86330705569805c5d201113a569c9e03c0214a</id>
<content type='text'>
toggle_view's settle predicate (lambda: app._active != before) never
fired when tabbing toward pseudocode on a function Hex-Rays can't
decompile: App._apply_decomp snaps the view back to disasm, so _active
returns to its prior value -&gt; full 20s settle timeout (x2 in _show_decomp,
~40s for drive pc). Recognize the decomp-failed fallback as settled.

Also harden two amplifiers surfaced by the same case:
- rpcclient: the CLI socket had no read timeout and would block forever
  on any server slowness; add a bounded settimeout (IDATUI_RPC_TIMEOUT,
  default 90s) with a clear error.
- domain.decompile: pass a bounded 15s timeout and cache failures, so a
  failing decompile can't sit at the 30s client default or be re-run by
  transport retries.
</content>
</entry>
<entry>
<title>drive pc: render pseudocode in the TUI, not just the driver</title>
<updated>2026-07-11T08:09:03Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-07-11T08:09:03Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=156168cb42237884edd39af15bc80138c9443910'/>
<id>urn:sha1:156168cb42237884edd39af15bc80138c9443910</id>
<content type='text'>
The pc command called only the read-only pseudocode RPC (runs off the UI
loop, never touches the screen), so LLM-driven sessions showed nothing on
the live pane. Compose goto + toggle_view + search so the real TUI
navigates to the function, makes the decomp pane the visibly-active view,
and jumps the cursor to the needle — then return the same text as before.
</content>
</entry>
<entry>
<title>docs: blueprint for generalizing the TUI-driving layer (e.g. gdb)</title>
<updated>2026-07-10T17:25:34Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-10T17:25:34Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=8b6d7c938516caa9bb14d1bcca683e9e18da4905'/>
<id>urn:sha1:8b6d7c938516caa9bb14d1bcca683e9e18da4905</id>
<content type='text'>
A design reference for bringing the idatui spawn/drive/introspect experience
to other terminal apps. Captures the invariants worth keeping, the reusable
core vs per-target Adapter split, a target taxonomy (embedded / control-
channel / black-box PTY), the three hard problems (injection, settle,
introspection) with technique gradients, tmux as the universal substrate,
and a concrete gdb worked example (TUI pane + gdb-Python plugin as the
adapter). No code.
</content>
</entry>
<entry>
<title>app: multi-line comments via literal \\n (long notes were clipping)</title>
<updated>2026-07-10T14:43:32Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-10T14:43:32Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=7ae37ba3b432bbb2482df9c99864350e685b0241'/>
<id>urn:sha1:7ae37ba3b432bbb2482df9c99864350e685b0241</id>
<content type='text'>
The comment prompt is single-line, so a long note rendered as one giant
'//' line that ran off the right edge and got clipped. Interpret a literal
'\\n' (backslash-n) in the comment text as a real newline in _do_comment
(the single choke point for the ';' prompt and the RPC 'comment' verb) —
Hex-Rays renders each as its own '//' line. Verified live and locked in
the comment_func scenario (multi-line render); suite 104 green.
</content>
</entry>
<entry>
<title>drive: add save + retype; point docs/skills at the ergonomic frontend</title>
<updated>2026-07-10T14:21:36Z</updated>
<author>
<name>blasty</name>
<email>blasty@local</email>
</author>
<published>2026-07-10T14:21:36Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/ida-tui.git/commit/?id=a03a1e08f65806f8963eeffc5f65c28af40bc949'/>
<id>urn:sha1:a03a1e08f65806f8963eeffc5f65c28af40bc949</id>
<content type='text'>
Round out idatui.drive with 'save' and 'retype &lt;fn&gt; &lt;proto&gt;' so the whole
common RE loop (orient/understand/act/persist) has a terse command. Update
docs/RPC.md and both skills (idatui, idatui-rpc) to recommend idatui.drive
as the day-to-day driving surface, with rpcclient/raw as the fallback for
unwrapped verbs.
</content>
</entry>
</feed>
