Skip to content

Happy Agent v0.4.86

Choose a tag to compare

@github-actions github-actions released this 09 Oct 22:05
8071046

A faster, steadier daemon

The daemon does all of its work on one thread, so anything slow held up every other request. On busy machines, especially team nodes with many conversations, even simple requests could take seconds. This release removes the causes we found.

  • JavaScript runs with the JIT compiler again. Since late September every daemon ran entirely in the slower interpreter, to avoid a crash that turned out to have a different cause. On a busy team node, history requests are now about three times faster on average, and the slowest dropped from about 0.8 s to about 0.13 s. Commands your agents run in their shells no longer inherit the JIT-off settings either.
  • Streaming replies no longer write to the database for every fragment. Each piece of streamed text, thinking or tool arguments used to be saved separately, which kept the disk busy and stalled other requests for seconds at a time.
  • Starting tools and providers no longer freezes the daemon. The bundled helper programs were re-read and re-checked every time a tool or provider started, which blocked everything for one to three seconds.
  • Phone sync no longer floods busy machines. A change to one conversation used to re-sync every conversation shared with the Happy phone app. Now only the affected conversations sync, each at most once a second, so a busy agent's progress or a draft typed on the phone can take up to a second longer to arrive.
  • Conversation history opens faster. Each stored message is checked once instead of twice, and response checks are prepared once instead of on every request.

Remote connections

  • Opening many conversations at once on a remote Happy Agent no longer fails. A remote connection refused anything beyond 32 requests at a time ("The remote connection is busy"), and the desktop's always-open event stream counted towards that limit, so opening about eight conversations at once could fail some of them even when the remote was idle. Requests now go through in parallel with no limit.

Dedicated runners

You can now keep Happy Agent off the machine that does the work.

  • A runner is a separate machine that holds your project folders and does all the work on them: agent file tools and commands, Git, workspace checkouts, terminals, file browsing and watching, the workspace preview proxy, and MCP stdio servers. The daemon keeps the database, provider credentials, and inference.
  • Start one with happy-agent runner --endpoint <daemon>. It dials out to the daemon, so it needs no inbound port. A standalone daemon is reached over Tailcat with tailcat:<address>, a team node through its listener.
  • Each runner has a fixed token, configured under [runners.<id>] in the node's happy.toml; there is no join step. You can configure several runners and pick one per project, and [runners] default places the home project and bot folders.
  • Once any runner is configured, nothing runs on the daemon's own machine and nothing falls back to it. When a runner is away, work on its folders fails at once with a message naming it, and resumes when the runner reconnects, including its MCP servers.
  • Repository tokens and attached secrets never reach a runner. Git on a runner authenticates through the daemon.
  • Runner projects can run each workspace's agent commands in a Docker container on the runner.
  • A new recipe, Add a runner, covers deploying one as a systemd service. The standalone and team deployment recipes now recommend a dedicated runner.
  • Not yet on runners: sandboxed workspace services are refused with a clear message, and live Git change tracking isn't shown for runner folders.
  • For developers: protocol 26 adds GET /v0/runners, the runners.updated event, a "runner" compute on projects, workspaces, and bots, and an optional runnerId when registering or cloning a project.

Fixes

  • Claude Code no longer reads across your whole disk. When Happy was opened from Finder, the daemon and Claude Code started in the root of your disk. Claude Code read across the disk on startup, macOS asked whether Happy could access data from other apps, and the model was told it was working in /. The daemon now starts in your home folder, and Claude Code runs in a private, empty folder of its own. If you start the daemon yourself with happy-agent start, it now reads the local happy.toml from your home folder rather than from the folder you ran the command in.
  • happy-agent start no longer replaces a daemon that is already running and compatible. The daemon now reports protocol 26, matching the client it ships with.
  • Product terminals use Bun's PTY only; the node-pty dependency is gone.