Skip to content

v0.6.0 — Trust the library, retire the daemons

Choose a tag to compare

@chalie-ai chalie-ai released this 09 May 12:59
· 1059 commits to main since this release

Chalie v0.6.0 Release

This is the biggest release Chalie has had. We rewrote the cognitive runtime around a single shared worker, redesigned the chat interface from the ground up with a light/dark theme, rebuilt the voice path on top of the library's own pipeline, gave replies a proper rich-media card system, rewrote conversation compaction as append-only history, and overhauled how subagents are dispatched and waited on. Everything is smaller, faster, and quieter under the hood.

🎨 Rich-Media Chat Cards

  • Weather, lists, timers, scheduler, and article results now render as proper visual cards inline in chat — not just text. Weather has an ambient-sky background that shifts with the conditions; article cards carry a real image below the synthesis; lists keep their checkboxes between turns.
  • Built-in countdown timer — ask Chalie to set a timer and you get an ephemeral card with pause, resume, and an alarm when it ends. The timer survives pause/resume cleanly and counts down to the second.
  • Smarter image picking — search and news results now shortlist candidate images with descriptive captions so the model can choose the one that matches the story, instead of grabbing whatever happened to be first. When a source has no thumbnail, Chalie falls back to its og:image automatically.
  • Same-day scheduler view — when you ask about today's events, the card lists everything for the day and drops the redundant confirm button.

✨ Interface Refresh

  • Light and dark themes with a persistent toggle — Chalie remembers which one you picked across sessions.
  • Full-bleed assistant turns — Chalie's responses now flow edge-to-edge without bubble chrome, with a glyph + timestamp header and 24px action buttons. Cleaner read, more breathing room.
  • User turns simplified — bold text, no metadata row, an 80% white bubble in light mode that disappears entirely in dark.
  • Subtle living details — a faint stripe accent, soft bloom on the active turn, hover lift on action rows. Restraint over flash.
  • Themed audio player and ACT spinner — the inline tool-narration spinner now adapts to whichever theme you're in.

🤖 Subagent Rework

  • goal_pursuit is now subagent — a single tool with a type-discriminated schema (web_surfer, researcher, etc.). The model picks the right specialist by name, and the wait/cap behaviour is tuned per-type (web_surfer can run synchronously for up to 30 minutes).
  • ACT timeout removed — long-running subagents no longer get killed mid-task by an arbitrary cap. The dispatcher waits as long as the subagent type allows.
  • Async subagent results now reliably reach the user — three silent-death paths in the delivery pipeline have been eliminated, including a race on the parent processor lifecycle.
  • Schema collision fixed — the subagent's type parameter was colliding with the dispatcher's reserved action-envelope key, causing 'Unknown action type' errors. Renamed to agent_type.

🧠 Memory & Routing

  • Recall is now single-call-per-topic — the model is guided to make one focused recall query per topic instead of building intra-query splitting into the engine. Plus narrow-retry guidance when the first call comes back thin.
  • Schedule search via the schedule tool, not memory — recall no longer fans out into scheduled items. The model calls the schedule tool directly, with a new semantic search action backed by vector similarity.
  • Document and schedule recall now route through the real tool dispatch path — eliminating duplicated query logic and synthetic record-and-render workarounds.
  • Concept canonicalisation hardened — aliases like 'birthday' vs 'birth_date' now resolve reliably because the lookup table embeds aliases as their own rows (27 → 365 rows) instead of relying on cosine similarity to bridge the gap.
  • find_tools hoisted to the front of the always-available list — when the model is choosing what to call first, tool discovery is now its first option, not its last.
  • Search routing supplemented with DuckDuckGo on weak signals — when the router is uncertain, a lightweight DDG pass broadens the result set instead of returning thin output.

🗜️ Append-Only Compaction

  • Compaction has been rewritten as an append-only flow over tool_calls with a continuity prompt and a clean subagent split. No more rewriting history — past turns stay verbatim, and the model picks up exactly where it left off.
  • max_tokens and compact_at are now persisted per-provider — no on-the-fly threshold math, no 'why did it compact now' confusion.
  • Provider payload measurement fixed — compaction now measures the actual provider payload, not just the user body, so the threshold reflects what the model will actually receive.
  • Proactive overflow no longer loops — a one-shot guard prevents runaway compaction when the handler returns False.

🎙️ Voice

  • Parallel TTS — three independent Kokoro instances now synthesise in parallel, dropping wait times on long messages from seconds to fractions. Memory cost ~600MB; latency win is dramatic.
  • Markdown bleed fixed — *example* is no longer pronounced 'asterisk example asterisk'. Bold, italic, code, links, and bare URLs are stripped before synthesis. Identifiers like module_name and expressions like 2 * 3 survive intact.
  • Silent truncation removed — phoneme-cap overflows now raise loudly, and text is pre-chunked along sentence and clause boundaries so the cap is never hit. Audio no longer goes missing without a log line.
  • Synchronous NDJSON streaming — fixes a 50% chunk-loss bug where TTS frames were being dropped mid-stream.
  • Kokoro fp16 patch — works around a kokoro-onnx 0.5.0 dtype bug that broke synthesis on the HF fp16 schema.
  • Player keyboard shortcuts no longer hijack typing — chat input has full keyboard focus while the player is open.

📎 Reliability & Polish

  • File uploads block the LLM until processing completes — no more silent skips, no more 'apologise and move on' when the model races past an attached file.
  • Path traversal guard on data file endpoints — get/put/delete now resolve real paths before reading.
  • Read tool preserves dates and URLs — trafilatura now extracts with include_links=True, so date metadata that lives next to anchor links survives the boilerplate filter.
  • Privacy delete-all reaches all live tables — three dead tables removed from the wipe path, replaced with the actual current set.
  • Markdown is now forbidden inside allowed HTML tags — system prompt explicitly rules out the mixed-syntax outputs that were sometimes leaking through.
  • Brain dashboard error log — surface the latest backend errors directly in the dashboard via /system/observability/errors, instead of hunting through log files.

⚙️ Under the Hood

  • DMN folded into the subconscious worker as step 5 — the background-LLM queue is gone, and DMN ticks now ride the same idle-gated pipeline as everything else.
  • Provider configuration flattened — single global LLM provider, with max_tokens/compact_at persisted instead of recomputed on every call. Single backfill function shared between boot and provider creation.
  • Canonical paths — paths.py now defines sibling /data and /resources directories; environment-variable and CLI-flag overrides have been dropped.
  • Dashboard gateway moved into the backend, dead app.py ripped out.
  • Sonar pass — seven sweeps clearing 51 issues across PR-1698 and follow-ups: unused locals/params, commented-out code, redundant exception classes, duplicate string literals, JS modernisation, form-label associations, log-injection sanitiser, explicit Flask methods.
  • Substantial dead-code removal — DataGraphService lost 8 unused public methods, DocumentService lost a dead search_by_metadata, the LLM service dropped an unused stream= parameter, and several other helpers with zero callers were retired.

If you're upgrading a custom deployment, note that pre-trained model assets have moved from backend/data/pre-trained/ to resources/pre-trained/, and the per-job provider assignments table has been dropped (single global provider only). Chalie will boot cleanly on a fresh start; existing databases are migrated automatically.