0.7.0
Instrument compatibility (new)
Each instrument carries an InstrumentCompatibility (platforms,
osIDs, archs). Hook pack manifests and custom defs declare it; tracer
and codeshare default to universal.
- Pickers gray out mismatched descriptors with a tooltip and disable
Add; sidebars badge instruments skipped at restore time. - Custom defs grow a Compatibility… popover with canonical Frida
values (macOS, x86_64, MIPS, …). - Editing a def re-evaluates compatibility: tightening detaches now-
incompatible instances, loosening reattaches previously skipped
ones. - Restoring an incompatible instrument marks it with a reason on the
InstrumentRefinstead of attaching. - Exposed to mission tools via
create_custom_instrument.
Document lifecycle & storage
Workspaceis gone; each open document owns its ownEngine
throughEngineRegistry.MainWindowView.initis a pure lookup,
so SwiftUI's view-tree re-evaluations no longer open extra
ProjectStores that race the live one'sBEGIN IMMEDIATE.- Engines shut down cleanly on document close: event log tasks
cancelled, device watchers stopped, MCP servers stopped, process
nodes detached, collaboration torn down. - Engine open failures surface as an error view instead of a crash.
- UI-state persistence (sidebar selection, collaboration panel
visibility, session detail section, event-stream collapse) moved
ontoEngineand adopted by both frontends. db.sqlitestamps aPRAGMA user_versionon creation; opening a
project with a mismatched version is refused with a structured
error instead of crashing inside GRDB.- SQLite gets a 5s busy timeout.
Tracer & MCP
- Tracer hook state is an enum (
.enabled/.disabled), with room
for future cases.update_tracer_hookaccepts and returns it as a
string. The unusedisPinnedhook field is gone. - MCP tool calls get stable per-mission ids (
t<n>) surfaced via
_meta. JSON-RPC ids are only unique per connection, so reconnects
used to breakrecord_finding's evidence lookup. - Mission system prompt steers agents toward
getGlobalExportByName
/getGlobalFunctionByNameand explicit platform guards over
silentfind*null checks.
UI / UX (macOS)
- Picking a lab from Welcome opens a new untitled doc; the previous
pre-created.lumadirectory was rejected by the document reader. - Add Instrument blocks duplicates: already-attached descriptors dim
with a banner and a disabled Add action. - REPL has an empty state.
- Pinned events keep their title and inspectable payload after pinning
(the runtime event'sJSInspectValueflows into the notebook entry,
and the descriptor's display name is resolved for custom
instruments). - Blank projects auto-select the notebook to match the detail-pane
fallthrough. - Sidebar row icons inherit the primary color so selected rows invert
them to white instead of fading into the accent fill. - Welcome action subtitles and Sponsored-by row spacing polished.
GTK frontend
- Adopts the new
EngineUI-state APIs: collaboration panel
visibility and event-stream collapse persist per project, matching
the SwiftUI host. - Sidebar hides empty Sessions / Custom Instruments / Packages
sections; tighter spacing via a.luma-flush-listboxCSS class. - Session detail re-renders modules and threads on every state apply,
so initial agent enumeration shows up even ifthreadDeltasraced
past the first emit. Summary keys are left-aligned via a
SizeGroup. - Add Instrument dialog groups custom defs under a Custom Instruments
header, matching the SwiftUI host. - Boolean features render as
CheckButtonwith the name as the
label, matching SwiftUI's checkbox-styleToggle.
Internal
- LLM capabilities are now
Set<LLMCapability>with asupports(_:)
accessor onLLMProviderCapabilitiesandLLMModelInfo.