r2 in the REPL (new)
The REPL gains radare2 as a first-class language alongside JavaScript.
The prompt is a clickable mode toggle, and :, :r2, :js switch
from the keyboard. r2 input routes through the session disassembler
and renders JSON commands as an inspectable value tree, everything
else as ANSI-parsed styled text.
- Autocompletion for both languages: r2 commands complete via r2's
own help tree and arguments against flag and symbol names; JS
completions are annotated with Frida types from the embedded
frida-gum typings. px/xhexdumps render in the interactive hex view with real
addresses; r2 results keep their colors when pinned to the
notebook.- The REPL seeds its seek to the main module base on open, and
persists the r2 seek as an address anchor that re-bases across runs. - Output and prompt reworked: long lines scroll horizontally instead
of wrapping, long text reveals in chunks with show-more / show-all,
the prompt is a single mode-colored glyph, and the empty state
shows a per-mode example.
Markdown rendering (new)
A block-level Markdown renderer ported into LumaCore and shared by
both frontends: headings, lists, tables, task lists, blockquotes,
code blocks, and footnotes, with inline spans, LaTeX-to-Unicode
rewriting, and StyledText code highlighting. Based on code by
@trufae.
Sidebar: modules & threads
- Modules and threads move from tabs into collapsible sidebar groups
that mirror the hooks UX — a few top picks plus a browse popover
for the rest, with threads collapsed by default. One sidebar-row
and one browser-popover component is now shared across hooks,
modules, and threads in both frontends. - Instrument hooks get a disclosure chevron with per-instrument
collapsed state persisted in session UI state. - Module analysis is lazy with a per-module Analyze action and status
indicator; persisted analyses replay into a fresh r2 core on attach
to restore last session's warm state without blocking. - Program modules group ahead of system ones.
Disassembly
- Hex address operands are clickable for the pointer actions while
the rest of the line stays selectable; the reread/reanalyze buttons
overlay instead of pushing content down. - First-view disassembly analyzes the function on demand so it stops
at the function end instead of overshooting, and draws jump/call
flow arrows sourced frompdj/pDj. - Fixed operand address context menus that the system selection menu
was hiding (macOS) or opening alongside (GTK).
Collaboration
- The redundant "driver" seat is gone; session interaction gates on
ownership. Hosting is claimed through an acknowledged request and
attaches only once the server accepts, instead of optimistically.
Spawn/attach/re-attach controls gate on owner + lab-joined + seat
free, and re-attach is disabled while offline. - Host-ownership checks resolve before the collaboration bus connects
viaEngine.localUserID(falling back to the GitHub identity), so
the banner, REPL, and host badge are correct before reconnect. - Token poll retries on transient network loss, so switching to the
browser to authorize on iOS no longer kills sign-in.
Fixes & internals
- Existing project databases gain the REPL, seek, and styled-notebook
columns on open — create-if-not-exists never altered shipped
tables, so saves failed. - Custom instrument handling hardened; runtime parsing and rendering
guarded; mission transcript updates throttled and context reads
optimized; agent bundles generated through a SwiftPM plugin. Thanks
to Sunwoo Moon (@eunhhu). - JS REPL completion no longer dumps global scope; out-of-range JS
numbers no longer trap.
Packaging
- The Nix flake exposes an overlay and extracts
package.nixso the
package can be consumed standalone. Thanks to Abhi (@AbhiTheModder).