20 PRs (#326–#345) on top of v0.5.5.
Integrations — Composio, Discord, and one place for credentials
- Integrations hub (#328): one tab where every third-party credential goes, rendered from a descriptor rather than a bespoke pane per service — and each integration carries its own numbered setup walkthrough on screen until it connects (#343).
- Composio (#327, #330): ~1500 SaaS toolkits over MCP, gated on the API key alone. Four meta-tools, so the prompt cost is flat regardless of catalogue size, and the model is told how to reach for them.
- Discord remote control (#331): DMs and @mentions reach the agent, replies come back, and approvals prompt in the channel the turn came from. Raw HTTP + Gateway — zero new dependencies — and
MESSAGE_CONTENTis never requested, so the bot cannot read guild chatter it was not addressed in. - Telegram moved into the hub (#329, #332): the Telegram tab is gone;
/telegramstill works and lands on the hub. A dead polling loop now reports itself instead of sitting on a green badge (#333), a failed channel says why (#337), and "already running in another atomic-agent" is no longer red (#338). - Credentials saved in the hub now reach the running channel (#342) — before, a token pasted on a fresh install did nothing until the next launch.
Downloads that survive
- Resumable model downloads (#334):
.part+ sidecar,Range/If-Rangeresume, retry with backoff, stall watchdog. A kill at 90% of a 20 GB GGUF no longer costs the whole transfer. models pull --background(#335): a detached worker that outlives the terminal, withmodels downloads/cancel/clear.- TUI pulls run through that worker (#336): quit the app and the download keeps going; reopen and it is adopted, landed and activated.
The agent loop
- A turn is a task, not a step budget (#344).
agent.maxSteps(25) is now a checkpoint interval; what ends a task isagent.task.maxSteps(1000),agent.task.maxDurationMs(2 h), the model finishing, the loop breaker, or you. Every leg boundary reports itself (» still working — 50 steps, 12 min (ceiling 1000)), a leg where nothing usable came back ends the run, and the closing message names the ceiling and sayscontinuepicks up from there — instead of(stopped: max_steps reached without a reply). - A provider outage is waited out, not fatal (#345). The same step is retried on a 2s→30s backoff for up to five minutes, with a live readout in the composer and a sticky
provider unreachablestate once the budget is spent. A 404 from a wrong URL or a 401 from a dead key still fails instantly — a typo is not an outage.
Reliability and diagnostics
- Reflection can no longer reject after a store closes (#326) — four live crash clusters.
- A dropped stream explains itself instead of printing
terminated(#339). - Model failures carry
tool_transport/failure_stagetags (#340). - Subscription CLIs (
claude,codex) launch throughcmd.exeon Windows (#341).
New config keys
USER_CONFIG_VERSION 51 → 53. Both new blocks are additive: an existing config file gains the behaviour and stays readable. agent.task.autoContinue: false restores the previous "stop at maxSteps" behaviour, and agent.providerWait.enabled: false restores fail-fast on a transport error.
{ "agent": { "maxSteps": 25, "task": { "maxSteps": 1000, "maxDurationMs": 7200000, "autoContinue": true }, "providerWait": { "enabled": true, "maxWaitMs": 300000 } } }