Skip to content

v1.14.0

Choose a tag to compare

@github-actions github-actions released this 01 Nov 18:45
· 3 commits to main since this release
v1.14.0
271df49

fuseraft serve is now ready to run on one machine and drive from another. It speaks TLS, keeps a client's tasks across dropped connections, picks its own work back up after a crash or restart, and gives each client its own token, including read-only ones. fuseraft-web's Daemons page relies on this release for reconnecting and restarts.

New

  • TLS. --tls-cert/--tls-key serve /mcp, /attach and the A2A endpoints over https:// and wss://, from a PEM certificate or a .pfx (password in FUSERAFT_SERVE_TLS_PASSWORD). The daemon prints the certificate's SHA-256 fingerprint, and warns at startup when it serves plain HTTP beyond loopback.
  • Reconnecting clients. A WebSocket client that sends a Fuseraft-Client-Id header keeps its tasks across connections. If it drops while its task waits for approval, the daemon waits --reconnect-grace (60 seconds by default) and asks again on the new connection. Results that finish while it's away are sent when it returns. Pings every 15 seconds notice a peer that vanished without closing.
  • Restarts keep the queue. Unfinished tasks and uncollected results are saved to ~/.fuseraft/state/<project>/serve-queue.json. After a crash, a reboot or an upgrade, the task that was running resumes from its saved session and the queued ones follow, each still belonging to the client that sent it. A task that keeps interrupting the daemon is failed after 3 tries.
  • A token per client. --tokens-file holds named tokens, one name token [full|read] per line. The daemon re-reads the file when it changes, so removing or rescoping a token takes effect within seconds and closes that token's connections. Client ids are kept per token.
  • Read-only tokens. A read token watches the daemon's progress over /attach and can call get_status/get_result over MCP, but can't dispatch tasks, so it's never asked to approve anything.
  • fuseraft attach --url takes --cert-sha256 to trust a self-signed certificate by its fingerprint, and --client-id to pick a running task and its approval back up. With a read-only token it only watches.

Changed

  • SIGTERM (what systemd and podman stop send) shuts the daemon down the way Ctrl+C does. A stopping daemon denies a pending approval instead of waiting on it, whatever --unattended-policy says; the task asks again when it resumes.
  • The attach hello now carries clientId, readOnly, inFlight and pendingResults, and result carries task. There's a new task_resumed event. The wire protocol stays at version 1.

Fixed

  • After a crash, a daemon that's PID 1 in a container couldn't start again, because the leftover pidfile named its own PID.
  • Stopping the daemon while a task waited for approval hung.
  • A connection replaced by a newer one with the same client id was never closed.

Heads-up: a tool call that was halfway through when the daemon died runs again on resume, just as with fuseraft run --resume.

What's Changed

  • docs: fuseraft-server is now fuseraft-web by @fuseraft in #196
  • feat(serve): run a daemon across machines: TLS, reconnect, restarts, per-client tokens by @fuseraft in #197

Full Changelog: v1.13.0...v1.14.0