- 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)
Each instrument carries an InstrumentCompatibility (platforms,
osIDs, archs; nil set means any). Hook pack manifests and custom
defs declare it; tracer and codeshare default to universal.
System parameters are queried lazily via SystemParametersCache,
keyed by device id and invalidated when devices disappear.
Restoring an incompatible instrument now marks it with a reason
on its InstrumentRef instead of attaching.
Inline the lookup into Interceptor.attach() and guard the
Windows case explicitly. Steer mission agents toward get*
over find* unless absence is a real expected case.
Date.now() returns epoch milliseconds — large enough that every
point ends up pinned to the far right of the chart. Use the
call sequence number instead, and switch the y axis to the
open()'d path's length so the graph shows variation per call
rather than a y=x diagonal. Rename the series from `count` to
`length` to match.
Spell out which widget kinds expose which methods, that onAction
triggers on list or table widgets, and that Persistence must be
Session for `restored.<id>` to type-check. Drop the defensive
`?? ""` on readUtf8String() — open() with a NULL path is invalid.
Uncomment the logStack sample so the declared feature is actually
exercised.
InstrumentWidget (graph or list, with a persistence enum) lives
on CustomInstrumentDef and HookPackManifest. Runtime widget data
serializes through a widget_state table keyed by instance id and
widget id; the def itself round-trips a widgets_json column on
custom_instrument_def.
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.