Skip to content

v0.6.0 — Fusion

Choose a tag to compare

@github-actions github-actions released this 11 Sep 22:27
· 423 commits to main since this release

60 PRs (#347–#406) on top of v0.5.6.

Fusion — one model plans, another builds

A run mode over two providers. One orchestrates: it reads, plans, briefs, and reviews what comes back. The other executes, several workers at once, each on its own throwaway session. Pick it in the composer (ctrl+r, or /runmode fusion).

  • Two slots, either kind. Cloud plans while local builds, or local plans while cloud builds — the pairing is yours. The ⇄ between the two model names trades the seats in one click (/runmode swap from the keyboard).
  • The orchestrator does not build. Every mutating tool is refused for its whole turn: read, delegate, reply, nothing else. Rework goes back out as another fan-out with what was wrong and what good looks like. Without this it read the workers' replies, decided it could do better, and rewrote their files — which is not orchestration, it is a very expensive single agent.
  • One approval per task. fusion.delegate asks once, naming the task titles and the directory the fan-out will write in. Every worker in that turn then writes files and runs commands inside it — the build, the tests, the output — without asking again. Reach outside it and the call is refused, and comes back as a task to re-delegate.
  • The machine sizes the pool, the model sizes the fan-out. Worker count is not a setting: the orchestrator knows how divisible the job is and asks for what it needs, bounded by the task count and the server's request slots. Slots are derived from the hardware, not typed in.
  • Live feed. Each worker announces itself as it starts, picks up a tool, and lands, tagged with the model running it.

The agent loop keeps going

  • A truncated completion is recovered, not fatal (#359) — a reply the server cut short is retried with a larger cap or a re-packed prompt, once per step.
  • An unparseable tool call no longer ends the turn (#387): the model is told what it emitted and what the schema wanted, and gets one repair.
  • An empty native-tools completion is retried (#393) instead of being read as "the model is done".
  • Fallover within the provider class (#386): a dead cloud link tries its siblings before falling to local, and a 402 repairs itself against the credit balance. The chat says when the primary drops out (#384, #385).
  • Output ceilings you choose (#381, #382): cloud completions are no longer capped at the llama-server budget.

Local models

  • Parallel range downloads (#354) — 16 connections, resumable across an offline period and a relaunch (#356). A vision model pulls its GGUF and mmproj together (#353), and a projector that fails no longer strands the weights (#364).
  • Ping when it lands (#360, #361): Telegram, Discord or e-mail when a background download finishes.
  • Restart the model server from the TUI (#377), and supportsTools: "strict" is honoured on the tools payload (#395, #402).

Git, GitHub and e-mail

  • Local repository writes (#373): init, add, commit, checkout.
  • Remote sync, off by default (#368, #372): push, pull, fetch, clone and remote are inert until you turn the switch on for that repository. A repository stays local unless you say otherwise.
  • GitHub in the hub (#357): open PRs and file issues as yourself; /report files one with the session's logs at a privacy level you pick (#358).
  • The agent's own inbox (#361, #362): os.email.inbox and os.email.send, with a verified owner address.

Channels

  • A session per chat (#347): every Telegram chat, forum topic and Discord channel keeps its own thread, and the Swarm tab runs several bots at once.
  • Attachments both ways (#348–#352): files sent to the agent reach it, and files it produces come back as photos, documents or uploads.
  • More than one Discord owner (#388), a /model command in both channels (#394), and the model is told who is speaking and where (#401).

The TUI

  • No more blink (#390, #379): Ink's incremental renderer lost the frame on a session swap and left the composer drawn over itself. Full-frame repaint, deliberately.
  • The session rail — every session listed (#367), reorderable with Shift+↑/↓ or the mouse (#369), pinnable (#376), and imported transcripts render faithfully (#366, #370).
  • The outage readout ticks, names the failure and keeps the route on screen (#380).

Fixes

Images are typed by their bytes, not their file extension (#399) — a PNG renamed .jpg no longer dies on an opaque provider 400. A long session's trace keeps its end rather than its start (#397). Intraword asterisks survive Telegram (#392). Only the lock's owner may release it (#400).

New config

USER_CONFIG_VERSION 51 → 64. Every block is additive; an existing file gains the behaviour and stays readable.

{
  "llm": {
    "runMode": {
      "mode": "fusion",
      "fusion": {
        "orchestratorProvider": "openrouter",
        "workerProvider": "local-llama",
        "workerMaxSteps": 40,
        "workerTimeoutMs": 2700000
      }
    }
  },
  "localModels": { "managed": { "parallel": 2 } }
}

Upgrading

atomic-agent update, or download below. The local tool grammar changed in this release, so the first local prompt after upgrading rebuilds the KV cache and is slower than usual — once.