Repository navigation
v1.14.0
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-keyserve/mcp,/attachand the A2A endpoints overhttps://andwss://, from a PEM certificate or a.pfx(password inFUSERAFT_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-Idheader 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-fileholds named tokens, onename 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
readtoken watches the daemon's progress over/attachand can callget_status/get_resultover MCP, but can't dispatch tasks, so it's never asked to approve anything. fuseraft attach --urltakes--cert-sha256to trust a self-signed certificate by its fingerprint, and--client-idto pick a running task and its approval back up. With a read-only token it only watches.
Changed
- SIGTERM (what systemd and
podman stopsend) shuts the daemon down the way Ctrl+C does. A stopping daemon denies a pending approval instead of waiting on it, whatever--unattended-policysays; the task asks again when it resumes. - The attach
hellonow carriesclientId,readOnly,inFlightandpendingResults, andresultcarriestask. There's a newtask_resumedevent. 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