Drop the Monaco webview. Edit in a GtkSourceView on GTK and in a
native text view on Apple, both speaking to Frida.Compiler's
in-process language server for completions, signature help,
hovers and diagnostics.
Color, complete and indent code natively, matching the GitHub
theme in light and dark.
A wedged custom instrument blocks dispose RPC, which made every
write_custom_instrument_file call hang waiting on the live reload.
The store write already succeeded; only the side-effect bounce was
stuck, and that's exactly when you most need to edit the source.
Detach the reload into a Task so writes return as soon as the
on-disk state is updated.
InstrumentDetailView no longer wraps with .padding(8). Each config
view declares its own padding. Form views pad all four sides;
editor views (Tracer hook editor, Custom Instrument source) leave
the trailing edge flush so the scrollbar reaches the window edge.
Tracer hook editor and custom-instrument file editor now ask Save /
Discard / Cancel before navigating away with unsaved work. Covers
both the SwiftUI and GTK frontends; Cancel reverts the sidebar
selection.
On the GTK side, TracerConfigEditor.update() refreshes hook metadata
in place when only the selection or content of an existing hook
changed, instead of rebuilding the whole pane — switching hooks no
longer drops unsaved drafts.
Fix activeInstrumentID extracting componentID instead of
instrumentID, and defer reconcileInstrumentChildren until after
select() in navigateToInstrumentComponent — avoids a GtkListBox
cursor crash and a duplicate selectComponent call.
Sidebar: manual expansion for sessions and custom instruments;
child rows align under parent icon column. Surface tracer hooks
inline under the Tracer item with a Browse-all popover for the
overflow.
Editor: drop static header rows; SaveBar slides down from the
editor top with Save button and unsaved indicator. Shared
between tracer and custom instrument editors.
GTK: pin detached banner to system-orange across focused and
backdrop states. Trim chevron button padding so it honors the
24px column, and tighten row padding so the icon sits 4px from
the row edge.
- Store source files as named CustomInstrumentFile rows per def
- Render sidebar with disclosure groups
- Drive editor via Monaco project models with activePath
- Validate Add/Rename/Delete dialogs and submit on Enter
- Fork installed hook packs into editable custom instruments
- Reload instances on def change; clear stale compat reasons live
- Focus editor on selection (native + Monaco)
EngineRegistry caches one Engine per working-project URL.
MainWindowView.init does a pure lookup, so SwiftUI's
view-tree re-evaluations cannot open extra ProjectStores
that race the live one's BEGIN IMMEDIATE and crash via
try!.
UI-state persistence (collapse flag, sidebar selection,
session detail section, etc.) lives on Engine for GTK to
adopt. SQLite has a 5s busy timeout. Engine open failures
surface as an error view.
TargetPicker is host @State injected via environment.
Global instrument-UI defaults register at app startup;
per-engine instrument and local-notifier hookups live in
Engine extensions.
Boolean schema carries an explicit default; was hardcoded true.
Editors expose a Default toggle in the schema panel, and boolean
fields are now expandable to reach it.
Discrete Add Feature button gating the input row. id field
auto-derives a Title-cased name until the user edits it.
Inline kind picker on each row. Feature rows are collapsible
and auto-collapse when adding the next one. Schema editor
applies the same patterns to nested object fields and combo
choices.