May 16, 2026

Brain Gets Rebuilt, and Chalie Learns to Talk to Other Agents

The dashboard got a ground-up rebuild and Chalie gained an MCP server so external coding agents can talk to it directly.

Two things had to happen before either felt real: the dashboard needed to stop lying about what the backend was actually doing, and Chalie needed a front door other agents could knock on. Today both landed, plus the debugging tail that always follows a day this big.

The brain dashboard got rebuilt from scratch — 13 modular vanilla JS files replacing a single 6.5K-line Bootstrap monolith, net -5,400 lines. Sidebar navigation, a command palette, dark/light theme, hash-based routing, no external dependencies. But a redesign is only as good as the data it shows, and the first pass didn’t match the backend at all: the memory panel expected the wrong keys, the usage chart couldn’t parse the bucketed token format, the documents panel didn’t know about original_name or file_size_bytes, policies were wired action-first when the backend is context-first. All of it got re-wired to the real response shapes, panel by panel, then re-wired again after a rebase brought in more backend changes underneath it. A dashboard that shows the wrong numbers is worse than no dashboard — it looks authoritative while being wrong.

The bigger structural move was the MCP server: a FastMCP endpoint that exposes Chalie as a single talk_to_chalie tool, so an external coding agent can hand it a task and get back a real answer — full reasoning loop, memory, policy-gated tools, personality — without that agent needing to know anything about Chalie’s internals. Each external agent gets its own isolated channel so transcripts don’t cross-contaminate. This is the first crack at agent-to-agent communication as a first-class interface, not a side door.

Getting it right took several passes. The first cut used str.format() to build prompts from agent-supplied names — a straightforward injection vector once you think about it, closed by switching to str.replace() and validating names against a safe charset. The disclosure path — the message Chalie shows the user summarizing what an external agent asked it to do — first ran through a context-wiped processor that returned blank history, then got fixed to run through the same full message processor a real conversation uses, so the disclosure actually has Chalie’s voice and memory behind it. And a 500-character truncation on that disclosure text was quietly cutting responses mid-sentence; that’s gone. The talk_to_chalie handler moved onto asyncio.to_thread so a slow reasoning loop doesn’t stall the whole server for other agents waiting on it. None of this is exciting to describe, but a communication layer that agents actually trust depends on getting the boring parts (auth, isolation, no truncation, no stalls) right before the exciting part (agents talking to each other) means anything.

The rest of the day was cleanup that unblocks a release: the voice pipeline’s silence-handling bug — audio getting silently dropped when the voice-activity detector found no speech — is fixed, so a quiet or noisy clip no longer just vanishes. File uploads were refactored to flow through the same tool-dispatch path as everything else instead of a bespoke 300-second polling loop, which also means uploads now get proper policy checks and audit logging for free. A handful of chat UI bugs (a loading overlay that flashed on page load, an attach menu that wouldn’t close on scroll) got fixed alongside a security pass on the new dashboard: centralized session-expiry handling, a delete-confirmation modal that was previously missing, an async race in the cognition panel that could render stale data.

Two threads converge here: the dashboard now reflects what Chalie is actually doing, and Chalie now has a mechanism for other agents to ask it to do things. Next is making that mechanism something people actually reach for.

  • Brain dashboard rebuilt as 13 modular files, sidebar nav + command palette, net -5,400 LOC

  • New MCP server exposes a single talk_to_chalie tool for external agents, with per-agent channel isolation

  • Closed a prompt-injection vector in agent name handling before it shipped further

  • Voice pipeline no longer silently drops audio when no speech is detected

  • File uploads now flow through the same policy-gated tool path as every other action, replacing a 300-second polling loop