Appearance
Changelog
All notable changes to this project are documented here.
Format follows Keep a Changelog.
[Unreleased]
Fixed
- Built-in chat MCP works with hostname-only TLS certificates - when client TLS is enabled, Hive derives the local MCP WebSocket endpoint from the configured certificate's DNS subject alternative name. It falls back to a local IP only when that exact IP is present in the certificate, and never disables hostname verification.
- Windows Notes vault paths no longer fail their own root check - Hive normalizes Windows extended-length path prefixes before comparing the configured vault and resolved file path, preventing valid default vaults from reporting
path escapes vault root. - Ctrl+C did nothing in Windows run-as terminals - the service-side run-as helper received the ConPTY control event, but the PowerShell process created in the interactive user's Windows session did not. The helper now bridges the event to a target-session relay, which interrupts the foreground command while keeping the PowerShell session alive.
- Windows agent chat died before the first reply - the headless agent CLI was spawned through a
cmd /cwrapper, and cmd drops the outer quotes of its command line whenever it sees more than two quote characters or a program with no executable extension. An install underC:\Program Files\...therefore exited 1 with'C:\Program' is not recognized as an internal or external command, surfacing in the chat as "The agent stopped without a reply (exit code 1)". The daemon now spawns the CLI directly (letting the standard library host.cmdshims with escaping that survives), prefers an executable extension when resolving a program onPATHinstead of npm's extensionless shim, and runs batch-file CLIs throughcmd.exe /S /Cin the run-as helper, whichCreateProcessAsUserWcannot launch on its own.
Changed
- Daemon updates now include the node CLI - every manifest-based daemon update requires and stages the matching
hiveartifact, installing it besidehivedon restart when missing and replacing it when stale. The desktop app no longer exposes separate local, per-node, or cluster-wide CLI update controls. hive update/hive update-nodedefault to the local node - a barehive updatealready self-updates the CLI following the local node's[update]channel and manifest URL;hive update-node(renamed fromupdate-daemon, which remains as an alias) now likewise defaults to updating the local node with no arguments, instead of requiring--from <url>. Both still accept--from/--channel/--remote-tokenoverrides.
Added
- Direct chat deletion everywhere - right-click a chat row on desktop, use its touch/mobile delete control or active-chat actions menu, or search F1 for the chat by name. Every entry point opens the same destructive confirmation before deleting the chat and saved transcript.
- Configurable navigation - choose Full or Simple usage profiles, where Simple shows only Chats and Notes, reorder or hide individual feature destinations, and switch between Comfortable and Compact spacing. Connection, Settings, Documentation, and the navigation settings remain available as permanent escape hatches on desktop and mobile, with matching F1 commands.
- Documentation inside the app - open the public docs from the expanded or collapsed desktop menu, the mobile menu footer, or F1 > Open Hive documentation.
- Human and AI changelog - root
CHANGELOG.mdis the single source for the public/docs/changelogpage, raw Markdown,llms.txt, andllms-full.txt. - Built-in chat MCP tools - untitled chats can call
hive_set_chat_title; chats with attachments can callhive_list_contextandhive_read_context_fileto inspect cross-node context, including cached snapshots when an owning node is offline. - Task targeting and durable cross-node moves - create and operate tasks on a selected cluster node from the app or CLI, filter the task list by node, and move a non-running task with its UUID, schedule, configuration, timestamps, and retained run history. Durable operation IDs make retries safe across disconnects and daemon restarts.
- Preferred Notes serving node - each device can pin Notes to one cluster node while connected elsewhere. All vault operations, settings, sync, and S3 tests route to that node; an offline preference stops instead of silently switching vaults.
- Symlink-safe Agent Docs rollout - discovery and status show symbolic-link targets. Hive preserves safe links inside the managed root and blocks broken links, external targets, escaping parent links, and write-time link swaps with a visible reason.
hive version- new command printing this CLI's version, its build platform, and the locally installedhivedversion.hive --version/-Vprint the CLI version alone.- Remote-URL updates - daemons, the CLI, and the desktop / mobile app can self-update from an arbitrary HTTP(S) URL hosting a
RemoteUpdateManifestJSON document.hive update --from <url>replaces the running CLI,hive update-daemon --from <url> [--refresh-artifacts]asks the connected daemon to self-update (and optionally bulk-refresh its bundledclients/anddaemons/trees so subsequent peer pulls serve the new version), and the desktop app's Settings → Updates card drives both flows from the GUI. Optional Bearer token (HIVE_UPDATE_TOKEN) for private endpoints; every artifact is SHA-256 verified post-download. Seedocs/remote-updates.md. - Persistent + cluster-shared update settings - the manifest URL, bearer token, auto-check toggle, and interval are now persisted across restarts. Stored on the daemon under a new
[update]config section and replicated to every cluster peer viaPeerMessage::SyncRemoteUpdateConfig, so isolated nodes can still auto-update on schedule. The desktop app mirrors the same settings tolocalStorageso it can keep checking and update itself even when no daemon is reachable. Daemons run a background auto-check task (6-hour default) that broadcastsServerMessage::RemoteUpdateAvailablewhen a newer manifest version appears; install is always manually confirmed. - PTY sessions - interactive terminal sessions via
portable-pty 0.8;SessionMode::Ptyspawns the process in a full PTY, forwarding raw bytes to clients. Clients sendSendPtyInputfor keystrokes andResizePtyfor window resize events. - SQLite persistence - session metadata and task records are persisted to SQLite (
rusqlite) at the platform data directory. The daemon restores sessions on startup without re-spawning processes; status changes (Idle, Exited) are written back immediately. - Task scheduler -
Schedulerruns a 10-second tick loop and firesPendingtasks whosenext_run_athas elapsed. Three schedule types:OneShot(immediate, runs once),Interval { seconds }(repeating),Cron { expression }(6-field cron viacron 0.12). Tasks are persisted to SQLite and restored on daemon restart. - Notifications -
NotificationEnginefires HTTP notifications on session completion, session error, task completion, and cluster role change. Three backends: generic webhook (POST/PUT with custom headers), ntfy (topic + optional bearer token), and Pushover. Configured via[notifications]inconfig.toml. - Projects -
Projecttype (UUID key, name, description, working directory, default model, extra args) with full CRUD via protocol messages and Tauri commands. Sessions can be associated with a project viaproject_id. - Process adoption -
hive adopt [--pid <pid>] [--name <name>] [--dir <dir>]registers a running Claude Code process with the daemon without spawning it. Adopted sessions appear inhive lsand can be killed viahive kill. Dead adopted sessions are reaped automatically. hive install- extracts the bundledhivedbinary, runs an interactive config wizard (port, token, display name, cluster settings), and writes a systemd unit on Linux. Flags:--non-interactive,--name <name>,--json.- Node display names -
display_namefield inDaemonConfigandClusterSection. Names propagate via peer handshake (PeerHello/PeerHelloAck) and are shown in cluster status. Runtime rename viahive rename-node <id> <name>or the app's pencil icon; change is broadcast to all peers and persisted toconfig.toml. - Daemon version + remote update -
AuthResultnow carriesdaemon_versionandplatform. Version badges shown in ClusterStatusView and SettingsView.hive update-node --address <host:port>and the app's Update button push a newhivedbinary to a remote node via WebSocket and trigger a self-restart. - Cluster node remove -
hivesendsRemoveNode; the daemon removes the peer from its config, disconnects it, and broadcastsPeerForgetNodeto remaining peers so they stop reconnecting. InitClustermessage - allows the Tauri app to configure cluster settings on a daemon in standalone mode and optionally restart it to join the cluster.- Windows Service -
hivedregisters with the Windows SCM; install/uninstall via the desktop app's Settings view orsccommands. The service usesCREATE_NO_WINDOWfor all child processes. - PTY terminal view -
PtyTerminal.vuewraps xterm.js (@xterm/xterm) withFitAddonfor automatic column/row fitting. Scrollback is buffered in the Pinia store (MAX_PTY_SCROLLBACK = 2000raw chunks) and replayed on component mount so navigating away and back preserves terminal history. AResizeObserverkeeps the terminal sized to its container; resize events are forwarded to the daemon viaresize_pty. Theme-aware ANSI palettes (DARK_THEME/LIGHT_THEME) toggle reactively without re-creating the terminal. - Shell picker -
NewSessionDialog.vueshows a platform-filtered shell preset list for PTY sessions (PowerShell/cmd on Windows, bash/zsh/fish on Unix, plus aCustom…free-text entry). The selected command is passed tonew_sessionas the optionalcommandfield; choosing the defaultclaudepreset sendsNoneand lets the daemon decide. - App auto-update -
check_updateTauri command queries the update manifest and returnsOption<{ version, body }>;install_updatedownloads and installs the update then restarts the app. Backed bytauri-plugin-updater. - Remote Terminals (#7) -
TerminalKindenum (Claude|Shell { command, args }) added toclusto-protocol/src/session.rs.SessionInfogains akindfield (defaults toClaude, fully backward-compatible). NewOpenTerminalclient message andTerminalOpenedserver message.rc open <node> [--shell powershell|bash|zsh|cmd]CLI command opens a raw interactive shell session on any connected node. The PTY backend now accepts an arbitrary command rather than always launchingclaude. - Agent Teams (#9) -
TeamandTeamStatustypes added toclusto-protocol/src/team.rs. Six newClientMessagevariants:CreateTeam,SpawnWorker,RelayTeamMessage,ListTeams,GetTeam,DisbandTeam. Six newServerMessagevariants:TeamCreated,WorkerSpawned,TeamMessage,TeamList,TeamUpdated,TeamDeleted.SessionInfogainsteam_id: Option<Uuid>andis_team_leader: bool. Teams are replicated across cluster nodes viaPeerMessage::TeamUpserted/TeamRemoved, persisted in SQLite, and accessible via Tauri commands. - Desktop app (Tauri 2.0) - Vue 3 + TypeScript frontend with Pinia stores. Views: Sessions, Cluster, Settings, Connect. Manages connection profiles, session lifecycle, cluster topology, local daemon install/start/stop/restart, and Windows Service registration.
- Android app - APK and AAB built via
cargo tauri android build. Supports the same feature set as the desktop app. - CI workflow -
ci.ymlrunscargo testfor all Rust crates and Vitest for the frontend on every push. - Release workflow -
release.ymlbuilds multi-platform binaries (Windows x64, Linux x64, Linux ARM64) and creates a GitHub Release with attached assets.
Changed
SessionManagerevent loop (process_events) now handles SDK process completion via anmpscchannel fed by per-session oneshot watcher tasks, replacing a polling approach.- Session status transitions to
Idle(notExited) when an SDK process completes normally;Exitedis reserved for killed sessions. - Cluster state replication extended to include projects and their CRUD mutations.
ClusterNode.display_nameisArc<RwLock<Option<String>>>to support runtime rename without daemon restart.PeerHelloandPeerHelloAckcarryversionanddisplay_namefields so joining nodes advertise their version immediately.SyncClusterConfigis broadcast to all peers afterUpdateClusterConfigso peer lists stay consistent without restart.- Follower nodes ban removed peers (via
PeerTransportban list) to prevent immediate reconnect afterRemoveNode.
Fixed
- Self-connections in
PeerTransportare now rejected; a node no longer tries to connect to its own peer address. remove-nodeno longer triggers a reconnect loop when the removed peer attempts to rejoin.update-noderelay correctly propagates auth failure back to the originating client.- Version comparison in cluster upgrade flow uses semver ordering, not string comparison.