Skip to content

feat(web-explorer): Sen Web Explorer + npm license attribution - #83

Open
EnriqueParodi wants to merge 1 commit into
feat/db-python-bindingsfrom
feat/web-explorer
Open

feat(web-explorer): Sen Web Explorer + npm license attribution#83
EnriqueParodi wants to merge 1 commit into
feat/db-python-bindingsfrom
feat/web-explorer

Conversation

@EnriqueParodi

Copy link
Copy Markdown
Collaborator

Browser-based UI for inspecting and interacting with a running Sen process.
React + TypeScript on top of @sen/client; served by jsonrpc's static-file
server so the browser only ever talks to one origin (the JSON-RPC endpoint
that also carries the live data).

What you can do with it:

  • Browse the live topology (sessions, buses, objects matched by named
    queries). Author and reuse interests across sessions; queries persist.
  • Inspect any object's properties with type-aware rendering for structs,
    sequences, variants, and units. Edit writable properties in place.
  • Invoke methods with typed argument editors.
  • Watch events into a unified bottom drawer plus per-class tables with
    resizable columns, source filtering, and a live row-arrival highlight.
  • Plot numeric leaves on a multi-series board: drag series between panels,
    share a cursor across panels, brush-zoom, pause/resume, scrub through
    a retention-bounded history. Pop the board out to a second monitor.
  • Pin objects to a Cockpit / Overview workspace for at-a-glance monitoring
    across instances, with a class-grouped Overview to navigate dense
    topologies.
  • Save layouts: panel arrangement, column widths, retention windows,
    pinned set, open queries all round-trip through localStorage.
  • Light + dark themes.

Layer model:

  • Frontend is a thin reactive skin over @sen/client; no Sen-specific
    schema hard-coded anywhere in the UI. Every type, property, and unit
    is discovered at runtime.
  • C++ component subscribes to jsonrpc's StaticFileServer control bus
    and registers a baked index.html bundle at /explorer.
  • gridstack v12 for the resizable grid (PlotsView + OverviewWorkspace);
    uPlot for time series; react-virtuoso for the event tables.
  • One bundled index.html, no runtime CDN fetch, no telemetry.

Correctness commitments:

  • WatchCollectors mount event-watch wire subscriptions independently of
    the Events tab; an event watch with no Events tab open now sees its
    values, not "--".
  • The three useMemo-for-ref-mutation sites in u_plot_chart became
    sentinel-refs (React 19 drops memoised values for offscreen subtrees).
  • Plot panel layout persistence carries a schema version envelope.
  • Panel ids are crypto.randomUUID, not monotonic counters.
  • defaultUrl trusts same-origin; the prior port allowlist would have
    blocked legitimate https deployments behind a reverse proxy.
  • Object handle swaps on reconnect skip the gap sentinel; the prior
    behaviour briefly showed "no value" across every reconnected widget.
  • gridstack cross-doc monkey-patch removed (was patching the private
    _mouseDown / _mouseMove / _mouseUp / _keyEvent for popup-window
    portals); popouts now use layout-lock for portable resize.
  • Modal focus-management effect no longer depends on onClose; the prior
    deps would re-fire on every parent render and steal focus from any
    input inside the modal (real bug, caught during user testing).
  • ObjectEventCollector eventNames sealed readonly; the prior for ... of
    iterated over a mutating array on a parallel resubscribe path.
  • gridstack pinned to an exact version + fail-loud private-method assert;
    if a minor bump silently changes private internals the explorer fails
    fast instead of silently misrendering.

Plus extensive polish across the plot board (rAF-batched render, per-line
cursor labels, brush-zoom integrated with uPlot's native pattern, panel
drag-between, axis-per-unit, retention slider bound to window cap) and
a CLI shortcut: sen web-explorer bakes a yaml preset (ether + jsonrpc +
webexplorer) into cli_run and opens the browser at the right URL.

Plus an npm license attribution helper (sen_internal_bake_npm_licenses)
that the web explorer calls to bake its runtime dependency licenses into
the install bundle; reusable by any future npm-built frontend.

Ships with the getting-started guides:

Closes the gap between what the tree can do and what a newcomer can find:

  • install.md: 'What the build needs' -- toolchain-via-Conan (incl. Node.js
    arriving as a tool requirement, not a host install), the Conan Center +
    npm registry network requirement, first-build time, how to skip the
    browser stack, Windows caveat.
  • docs/getting_started/testing.md (new, in nav): enabling tests, the
    run_tests lanes (flaky tier with until-pass:5, junitparser merge), a
    table of suites that are environment-sensitive by design (previously
    tribal knowledge), and the Debug lane where SEN_DEBUG_ASSERT and the
    invariant checks actually compile.
  • README How to Build: short pointers to the above and to the Web
    Explorer showcase; the showcase itself stays documented with its
    component (docs/components/web_explorer.md), which now links back to
    the install guide for getting a built tree.

@EnriqueParodi
EnriqueParodi force-pushed the feat/db-python-bindings branch from 2738b1e to f49a9a7 Compare August 16, 2026 16:24
@EnriqueParodi
EnriqueParodi force-pushed the feat/web-explorer branch 2 times, most recently from 3a49b64 to 9dbddc0 Compare August 16, 2026 17:04
@EnriqueParodi
EnriqueParodi force-pushed the feat/db-python-bindings branch 2 times, most recently from 751d7b5 to f6e22c6 Compare August 16, 2026 17:26
@EnriqueParodi
EnriqueParodi force-pushed the feat/web-explorer branch 2 times, most recently from 8c5f59a to 738c6f6 Compare August 16, 2026 20:05
@EnriqueParodi
EnriqueParodi force-pushed the feat/db-python-bindings branch 2 times, most recently from e1114f6 to 5bb1d7d Compare August 17, 2026 07:13
@EnriqueParodi
EnriqueParodi force-pushed the feat/db-python-bindings branch from 5bb1d7d to bdfa58e Compare August 17, 2026 07:46
@EnriqueParodi
EnriqueParodi force-pushed the feat/web-explorer branch 2 times, most recently from 0660c70 to 9af4ce3 Compare August 18, 2026 22:27
@EnriqueParodi
EnriqueParodi force-pushed the feat/db-python-bindings branch 2 times, most recently from 9e5bd31 to 567004c Compare August 19, 2026 07:42
@EnriqueParodi
EnriqueParodi force-pushed the feat/db-python-bindings branch from 567004c to 548c5d2 Compare August 19, 2026 17:01
@EnriqueParodi
EnriqueParodi marked this pull request as ready for review August 19, 2026 17:03
@EnriqueParodi
EnriqueParodi force-pushed the feat/db-python-bindings branch from 548c5d2 to 9794fd5 Compare August 19, 2026 19:06
@EnriqueParodi
EnriqueParodi force-pushed the feat/db-python-bindings branch from 9794fd5 to 4f43ff8 Compare August 19, 2026 21:21
Browser-based UI for inspecting and interacting with a running Sen process,
React and TypeScript on top of @sen/client. The jsonrpc static-file server
serves it, so the browser only talks to the origin that already carries the
live data, and the npm dependencies' licences are attributed alongside.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant