June 14, 2026

Vue frontend cutover, three roles for providers

The backend now serves the Vue 3 interface and Brain SPA for real, providers split into chat/vision/delegate roles, and memory gets a hierarchy roll-up.

The Vue migration had run on a coexistence route for weeks — new frontend live at /next/, old static apps serving everything else. Today that ends: the backend’s serve routes cut over to the built Vue apps, the legacy static apps and their auth-gate are deleted outright, and a new Docker builder stage runs the pnpm workspace build so the served dist/ trees exist in the image instead of 404ing. Login and onboarding are ported as Vue multi-page entries, and Playwright feature tests drive the real served pages against a live backend — no mocks, because a frontend rewrite that only passes against a stub isn’t proven yet.

The Brain admin SPA finishes at the same time: eleven panels and twenty-seven sub-views, ported with verbatim DOM, classes, and copy so nothing shifts under existing muscle memory — Scheduler, Lists, Documents, Skills, MCP, Backup/Restore, Capabilities, Policies, Providers, Vision, and seven Cognition sub-views. The review pass on the Documents/Lists/Scheduler port catches a real pre-existing bug: the watched-folders panel was reading fields the endpoint never returned — the value of a faithful port over a rewrite, since old bugs get exposed and fixed instead of carried forward silently.

Providers split into three roles instead of one. Until now a single selected provider handled chat, vision, and any subagent work like web search or browsing. Now a dedicated delegate role falls back to the main provider unless an admin pins something else, with vision and delegate selectors in the Providers tab — so you can run a cheap, fast model for background search delegation while keeping a stronger model on the actual conversation, without one setting fighting the other. A delete-in-role guard stops you deleting a provider still pinned as main, vision, or delegate — a foot-gun that otherwise only shows up as a confusing 500 later.

Memory work adds the next tier of the ongoing redesign: episode roll-up. Instead of a similarity threshold that almost never fired, channels now cluster once they cross fifty leaf episodes, using UMAP dimensionality reduction feeding HDBSCAN — producing genuine era-level digests instead of a flat pile of everything Chalie has ever seen. A related fix persists the roll-up’s tier metadata, so higher-level summaries decay on their own slower clock instead of aging out at leaf speed. Pinned “moments” also get their own dedicated store with proper full-text and vector indexes, off the general knowledge graph where they didn’t belong; the six-hourly auto-capture worker that used to grab them opportunistically is gone — moments are explicit now, not scraped.

On reliability, the tool-result contract — every tool must return a structured result, never a bare string or dict — moves from a runtime spot-check to a static type gate that fails the build if any code path could return the wrong shape, catching branches a runtime probe would never exercise. A companion change heals mangled tool argument keys before they hit the dispatcher, so a slightly-off key name doesn’t silently drop a parameter. The idle gate — the moment Chalie notices you’ve stepped away — now runs conversation compaction immediately instead of waiting for the next message to trigger it mid-turn.

None of this is glamorous, and that’s the point. A frontend cutover, a provider role split, and a memory tier are the unglamorous prerequisites for what actually feels different to use: faster responses under load, a model config that doesn’t fight itself, a memory system that holds months of context without degrading into noise. That’s the direction the next stretch keeps pushing.

  • Vue 3 frontend fully cut over — backend serves the built interface and Brain SPA, legacy static apps deleted, Playwright tests run against the real backend

  • Brain SPA complete: 11 panels, 27 sub-views, faithful port surfaces and fixes a real watched-folders data bug

  • Providers split into chat/vision/delegate roles with a delete-in-role guard, so a pinned provider can’t be deleted out from under a running config

  • Memory hierarchy roll-up ships (UMAP → HDBSCAN clustering into era-level digests) alongside a dedicated store for pinned moments

  • Tool-call contract enforcement moves from runtime spot-checks to a static type gate; idle time now triggers conversation compaction immediately