Identify a process instance by a deterministic identity returned
from the agent (per-OS, with a Process.mainModule + pid fallback)
and stash it on ProcessSession.processInfo. Rekey memory_page
into memory_page_module (module UUID + offset) so cached bytes
survive ASLR, and memory_page_anon (process identity + address)
for JIT / heap regions that only survive within one process
instance. Purge stale anon pages on every fresh attach.
Add updateProcessInfo, updateModuleAnalysis and updateInsight
SessionOps plus a side-channel publish-memory-page op and a
+fetch-memory-page request. The driver write-throughs every
page it fetches; non-drivers pull on miss and persist locally.
Module-analysis rows flow the same way so non-drivers can key
their cache by module UUID. The lab-join snapshot now carries
processInfo and module_analyses too.
Refresh actions on the insight detail view: Reread Bytes drops
the pages overlapping the visible range; Reanalyze Module drops
the module's analysis and pages, re-running r2 on next access.
The macOS detail view now reads the insight live from
insightsBySession via observation; GTK forwards .insightUpdated
into the detail and reschedules a refresh when the resolved
address changes.
Engine subscribes to module/thread deltas and trace updates, drives
the unified ITrace lifecycle, paginates set-trace-data uploads with
lazy server-stat resume, and falls back to a paginated +fetch with
optional first-paint prefix and onProgress reporting. Server-driven
trace-data-progressed broadcasts feed back as cache invalidations.
ProjectStore picks up itrace, project_ui_state and session_ui_state
tables; the schema is created with if-not-exists, no migrations.
SessionOp carries upsertTrace, removeTrace, traceDataProgressed,
and the module/thread updates are now ModuleDelta/ThreadDelta.
Replace hand-built popover+button context menus with GTK4's
native PopoverMenu backed by GMenuModel and GAction across
all ten callsites. Destructive items use a Button child with
the standard .destructive-action CSS class. Remove all custom
.luma-menu CSS.
Add SessionListChange enum to LumaCore so Engine can emit
granular add/update/remove events for sessions, instruments,
insights, and captures. MainWindow sidebar now handles these
incrementally instead of rebuilding the entire ListBox.
Also:
- Fix detach banner not appearing after user-initiated detach
(detach event handler was not setting phase to .idle)
- Suppress detach banner during first-ever attach only
- Disable "Add Instrument" when session is detached
- Fix crash in REPLPane.refresh() by clearing focus before
removing selectable children
- Use lowercase "luma" for XDG config/data directories