Skip to content

Synapse v1.9.3 — "live wire"

Fourth release of the v2.0 train, and the flagship of the refactor half: a real-time push channel replacing blind polling, the graph viewer's WebGL instance no longer resets itself mid-ingest, one unified UI kit, and two long-standing UX papercuts (full-page reload on vault switch, a command palette that could only navigate) closed out. Five workstreams, zero migrations.

Added

  • GET /events SSE push channel (flagship, FE-RT-2): a change-driven generator streams data_version and ingest-queue counts to the browser instead of the client polling for them. Heartbeat every 15s, hard 30-minute stream cap (I7-bounded), clean shutdown on client disconnect. The frontend eventsStore uses a manual fetch() + ReadableStream reader (instead of native EventSource, which can't carry Bearer/CF-Access auth headers), with exponential-backoff reconnect and Last-Event-ID resume.
  • Command palette v2: executable actions (new chat, import content, run lint scan, switch project, switch theme, regenerate overview) alongside the existing page/section navigation.

Changed

  • GraphViewer.tsx (3,627 lines) had its 7 already-formed subcomponents extracted (move-only, FE-ARCH-1) into components/graph/.
  • The sigma WebGL instance is no longer killed and rebuilt on every background data refresh (FE-RT-1). During a long ingest, the periodic /graph refetch used to tear down and recreate the entire renderer. It now diffs the incoming payload into the already-mounted graphology graph in place and only rebuilds on a real theme/colorMode change or the true first mount.
  • Startup fan-out and re-render efficiency (FE-PERF-1/2/3): the Home dashboard's "open questions" block now asks the server to filter by page type (GET /pages?type=query); four below-the-fold blocks defer their first fetch to requestIdleCallback; activityStore skips its state update entirely when a poll snapshot is structurally unchanged; chat streaming batches token/think deltas into one requestAnimationFrame-scheduled update per frame.
  • One UI kit: new components/ui primitives (Button, Chip, Card, Field, Notice, Skeleton) replace both parallel button systems. A --syn-font-*/--syn-space-* token scale was added; 26 hand-rolled inline SVG icons were replaced with lucide-react equivalents.
  • Switching the active vault no longer reloads the page (FE-UIUX-3): resetAllVaultStores() is the single choke point both the project launcher and the new-project wizard now call after activation.

Fixed

  • A GraphViewer bug found during this release's own verification: the live-diff effect merged the wrong attribute shape into the mounted sigma graph, stripping every node's color on the very first background refresh after mount.
  • A persistent SSE connection was silently hanging the entire E2E suite: page.goto(..., { waitUntil: "networkidle" }) can never resolve once a long-lived stream is open. Fixed by deferring the stream connection past the initial load burst and switching 9 affected E2E spec files from networkidle to domcontentloaded.

Upgrade

No Alembic migrations. Pull new images.