Changelog
Changelog
Section titled “Changelog”All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Section titled “[Unreleased]”POST /term/injectwrites only into sessions whose roster entry is an agent harness (room: true). Terminal-only sessions (room: false) answer 409session is not an agent harnessand nothing is written to the PTY (#810). Custom harness entries must setroom: trueto receive chat; terminal-only entries are typed through the terminal. Typing into a shell remains the terminal websocket.- When a herdr-backed coding agent exits, den reaps the PTY and mux session after a short grace so chat inject 409s instead of writing into the leftover shell (#791). Adopted harness panes stay closed to inject until a pane-scoped
pane list/agent listprobe (or a working|idle|blocked frame, orpane.agent_detectedwith a live agent) proves a live agent; a fresh create stays not-ready and re-probes instead of killing a still-booting harness;POST /termduring the grace mints a new pty immediately. - Term ready-gate waits for output quiescence or herdr agent-idle (not first-chunk + delay). The first buffered inject on an agent pane is confirmed only by a herdr
workingframe; unconfirmed turns are recorded on the pty and never retried (#796). - Claude transcript adapter strips Claude Code’s
<pasted_content id="…">…</pasted_content id="…">framing from a parsed user turn before it reaches the transcript, and from the session drawer title (#818). The den injects chat as a bracketed paste, which Claude Code wraps and stores verbatim; left as-is the wrapper showed as raw tags in the user bubble and, because the web client retires an optimistic bubble by exact-text match with no id, duplicated the turn. The strip is paired and id-anchored, so literal user text that merely mentions the tag is left untouched.
RivetHub client
Section titled “RivetHub client”- Composer model picker for conversations whose harness supports choosing a model per turn.
apps/rivethub-web: the composer autofocuses on landing in a conversation and when switching to another, so you can type without clicking first. Waits for the socket (the textarea is disabled while reconnecting) and fires once per session. It never pulls focus from something you’re already using — an inline rename, a filter, a dialog, or the terminal — and skips touch devices so a tap can’t raise the keyboard over the transcript.apps/rivethub-web: prevent sidebar and composer node pickers flashing while discovery is pending or failed with one saved node; keep multiple saved nodes available immediately (#809).apps/rivethub-web: hide node pickers only when connected to the sole saved node (or the app origin with no saved nodes) and mesh discovery confirms no peers; keep discovery and first-peer saving available.
Harness integrations
Section titled “Harness integrations”opencodeharness (idopencode, provideropencode-cli, rosteropencode) surfaced in RivetHub web, Android, and docs. Defaultmodeliszai/glm-5.3-flash. The installed OpenCode CLI owns backend, endpoint, and credentials.pimemory capture (integrations/pi/rivet-memory): v3 session jsonl watcher underagent=rivet-deepseek/channel=pi, systemd user unitpi-memory-capture.service/ launchddev.rivetos.pi-capture, wired intorivetos plugins installand doctor.
Harness
Section titled “Harness”piharness (earendil-works/pi, providerpi-cli, roster commandpi) on RivetHub web + Android, with a commented@rivetos/provider-pi-cliconfig example (recommended default backend z.ai GLM).- feat(harness): add qwen-code — Qwen Code CLI as the eighth first-class harness (driver, provider, executor, hooks-driven memory capture via a qwen extension, web + Android).
- RivetHub client — new chats and registered harness sessions open in Chat; legacy sessions wait for registry resolution and fall back to Terminal on failure, with the settled view remembered across navigation.
RivetHub client
Section titled “RivetHub client”- Sidebar Agents: pre-fill the existing create form from unsaved edits when a preset’s node fails to load harnesses, validate settings against another reachable node, and create a copy; the original stays on its node and can be deleted when it is reachable again. Surface save and delete failures.
RivetHub client
Section titled “RivetHub client”- Chat: preserve in-flight sends, ordering, and visible failure/retry across draft adoption and native-id rotation (#795).
- Chat: a committed user turn retires the optimistic bubble of the send it confirms — by item id when the echo carries one, otherwise the accepted/sending bubble before a failed twin of the same text — so repeating a message can no longer retire the wrong bubble or strand the committed send’s own.
Breaking
Section titled “Breaking”- Per-user memory routing reads only the users.json registry (
RIVETOS_USERS_FILE, else$RIVETOS_SHARED_DIR/rivetos/users.json, else~/.rivetos/users.json). TheRIVETOS_USER_DBSandRIVETOS_DEN_DEVICE_USERSenv maps are removed — leftover values do not route. - Removed the
deepseek-harness(dsh) harness —HARNESS_IDStoken,@rivetos/harness-deepseek,integrations/deepseekcapture plugin, and thedeepseek/dshpreset aliases (presets using them no longer map to a harness); nodes with adshroster entry in~/.rivetos/den-term.jsonneedrivetos plugins install --forceor a hand edit.
[0.5.0] - 2026-08-30
Section titled “[0.5.0] - 2026-08-30”First stable release. Everything since the 0.4.0 public beta: gateway + RivetHub, den, harness control plane, memory wiki, device mTLS, and per-user tenancy. Workspace packages align at 0.5.0 (RivetHub Electron keeps its own 0.5.4 updater cadence).
Runtime / mesh
Section titled “Runtime / mesh”- Self-registering plugin manifests (
PluginManifest+register(ctx));transportcategory; in-process@rivetos/mcp-server. - Providers: dedicated
@rivetos/provider-vllmand@rivetos/provider-llama-serverreplaceopenai-compat;@rivetos/provider-claude-clidrives localclaudewith an embedded MCP bridge. - Agent loop on the AI SDK (
@rivetos/aisdk); providers migrated to official AI SDK packages. - Mesh mTLS (shared CA, HTTPS agent channel,
mesh.tls,.meshDNS). Breaking: all mesh nodes must upgrade together.mesh.secretis ignored for agent-channel auth (warning on load); remove it from config. rivetos mesh enroll/mesh sync/mesh renew(SSH hub helper, unpack issued certs +mesh.json); doctor warns when the leaf expires within 30 days. Breaking:mesh join <host>without--manualexits non-zero — usemesh enrollormesh join --manual(#599).- Durable task engine (
ros_tasks): chat-loop executor, heartbeats, subagents, mesh delegation over shared Postgres, evaluation/retry/escalation. - Gateway embedded in the rivetos process:
/api/tasks, catalog, sessions, notifications WS, uploads, wiki, memory, workflows. - Workflows v1: journal-replay engine, step SDK, budget/
parallel, gateway + RivetHub runs UI (#438, #441–#446). - MCP unification: core + sidecar split, era-negotiating stdio, MCP 2026-07-28 final / SDK 2.0 (#275, #276, #435, #451).
RIVETOS_INSTALL_ROOTandRIVETOS_SHARED_DIRreplace hardcoded install-root and shared-dir defaults (#595, #590).- Identity contract in workspace templates — verify before assuming, maintain the user roster (#594).
- Removed: Pulumi IaC, split container images, Telegram/Discord/voice-discord channels (Phase 5, #490), unused circuit-breaker/audit-rotation exports (#463), Rivet Team product (#530).
Memory / wiki
Section titled “Memory / wiki”- Memory v5 compaction (leaf/branch/root + tool-call synthesis) and hybrid search (FTS + trigram + vector/RRF).
- Compaction and embedding moved onto graphile-worker (
services/{compaction,embedding}-worker). - Memory wiki: page model, extract/consolidate/recompile, durable topics and Wikipedia-style articles,
/api/wiki+ hub UI,wiki_search/wiki_read(#285–#292, #414, #416). memory_get_fulldisk-pointer recall;window=shortcuts; tool rows excluded from browse by default (#546); tool_result search/embed (#440, #482).- Per-user memory routing (device identity → per-user database) (#561);
/api/memoryrouted by the den-stamped user (#571). - Compaction skips heartbeats (#518); deadlock retry + wiki enqueue after commit (#542);
rivetos memory retry-failed(#508).
RivetHub client
Section titled “RivetHub client”apps/rivethub-web: chat-first hub over the gateway — transcript, composer, node switcher, terminal, files, memory Search/Browse/Stats, wiki, workflows/flows canvas (#295–#307, #428–#433, #502, #550).- Desktop shell migrated from Tauri to Electron (
apps/rivethub-electron) (#555); in-app updates from the mesh filestore (#562). Electron stays on its own 0.5.x updater cadence (0.5.4 as of #587). - Composer attachments, interactive ask card, voice mode (#576); per-session node binding (#583); agents roster in the sidebar (#549).
- Loopback mTLS pipe so the desktop client presents device certs to the gateway (#494).
apps/rivet-bots-android: Grok Bot-style client where every bot is a mesh agent node (#541, #544, #545).
- New stack:
@rivetos/den-protocol,@rivetos/den-server(harness event contract, PTY terminals, mesh overview). - Den embedded in the rivetos process; harness adapters (Claude Code, Grok Build, later Hermes/Kimi/DeepSeek); MicBridge host-mic input (#418); voice transcribe/speak proxy (#574).
- Harness control-plane fencing per session owner (#580, #582); idle auto-close of unattached harness PTYs (#439, #514).
- DeepSeek
dshTUI driver (#539).
Harness integrations
Section titled “Harness integrations”- Harness control-plane contract +
SessionIdcodec (#456); drivers for Claude Code (#458), Grok Build (#472), Hermes (#477), kimi-code (#480), DeepSeek (#539). - Rotation re-keying and superseded lifecycle (#470); reasoning-delta on the contract (#469); gateway attachment staging (#465).
- Capture plugins: Grok Build, Hermes, Kimi Code, Grok Bot memory bridge (#517); kimi-code headless executor + wire.jsonl backfill (#474, #481).
- RivetHub and Android chat bound to the harness control plane (#466, #479).
Tenancy / multi-user
Section titled “Tenancy / multi-user”- Mesh device enrollment (QR pairing) and per-device datahub credentials (#357, #366).
- Gateway Rivet CA device mTLS; bearer tokens removed (#491). Breaking: clients must present a device cert.
- Resolve the user at the den edge and filter RivetHub by owner (#565); wiki/memory/harness surfaces honor the routed user (#571, #579, #580, #581).
- Early per-user identity (profile
USER.md+ memory tag) generalized into the owner-user model.
Release / infra
Section titled “Release / infra”- Unified
rivetoscontainer image (--role); GHCR publish;@rivetos/cliinstallable vianpm install -g. - Versioned SQL migrations as source of truth; Nx module-boundary enforcement; secret scanner (#363); commit authorship check (#552).
docs/RELEASES.mdrelease policy; docs truth-sweep to Phase-5 reality (#589, #593).- Workspace versions normalized to 0.5.0 for the first stable tag (this release). Lockfile refresh (
npm install) must land in the PR — CI runsnpm ci.
[0.4.0] - 2026-04-05
Section titled “[0.4.0] - 2026-04-05”First public beta. Containerized distribution, reliability hardening, and launch documentation across three internal milestones (M6 containers, M7 reliability, M8 docs).
- Containerized distribution: agent + datahub Dockerfiles, root
docker-compose.yaml, Nx container build targets,DATA-PERSISTENCE.mdmodel, CI pipeline. rivetos build,rivetos initinteractive wizard,rivetos config,rivetos agent add/remove/list,rivetos updatesource-based update flow.- Pulumi infrastructure components and
rivetos infra up/preview/destroy(later removed in 0.4.x). - Reliability primitives:
RivetErrorhierarchy, channelReconnectionManager, provider circuit breaker, memory connection pooling, structured logging, audit log rotation. - Observability:
rivetos logs, runtime metrics,/health,/health/live,/metricsendpoints, enhancedrivetos statusandrivetos doctor,rivetos testsmoke suite. - Secret management:
redactSecrets(),.envpermission enforcement, config secret validation, 1Passwordop://resolution. - Multi-agent mesh:
FileMeshRegistry,MeshDelegationEngine, mesh HTTP endpoints,rivetos meshCLI,rivetos init --join,rivetos update --mesh. - Launch docs:
GETTING-STARTED,CONFIG-REFERENCE,PLUGINS,SKILLS,DEPLOYMENT,TROUBLESHOOTING, example configs,rivetos plugin init,rivetos skill init,rivetos skill validate.
Changed
Section titled “Changed”- Node.js requirement: 22 → 24.
- All package versions normalized to 0.4.0 (was unreleased 1.0.0 placeholders).
- Containers moved from
containers/toinfra/containers/. - Plugin discovery is convention-based via
package.jsonrivetosfield; all plugins exportcreatePlugin()factory. - Root
package.jsonno longer leaks plugin dependencies (onlyyamlremains).
Removed
Section titled “Removed”- Backward-compat runtime shim
core/src/runtime.ts. - Architecture violation:
memory-postgres/review-loop.tsno longer imports from@rivetos/core.
Long-form release narrative archived outside the repo:
0.4.0-milestone-6-containerized-distribution.md,0.4.0-milestone-7-reliability-polish.md,0.4.0-milestone-8-documentation-launch.md.
[0.0.8] - 2026-04-03
Section titled “[0.0.8] - 2026-04-03”Changed
Section titled “Changed”- License — changed from MIT to Apache License 2.0. NOTICE file added.
- Documentation overhaul — updated all markdown files to reflect current architecture and features.
- Deleted
CODE_OF_CONDUCT.md,REFACTOR_PROGRESS.md,docs/PHASE2.md,docs/MILESTONE-2-3-ANALYSIS.md(obsolete).
[0.0.7] - 2026-04-03
Section titled “[0.0.7] - 2026-04-03”Changed
Section titled “Changed”- Runtime decomposition —
runtime.ts(576 lines) split into focused modules:runtime.ts(296 lines) — thin compositor, registration, routing, lifecycleturn-handler.ts(263 lines) — single message turn processingmedia.ts(105 lines) — attachment resolution, download, multimodal contentstreaming.ts,sessions.ts,commands.ts— already extracted, unchanged
- Delegation/subagent/skills registration moved from
Runtime.start()toboot/registrars/agents.tsfor consistency with other registrars. - Net -280 lines from runtime. Runtime no longer knows about images, base64, content parts, history management, hook execution, or memory appending.
[0.0.6] - 2026-04-03
Section titled “[0.0.6] - 2026-04-03”- Boot package (
@rivetos/boot) — composition root properly decomposed:config.ts— YAML config loading with env var resolutionvalidate.ts— schema validation with structured error/warning reportinglifecycle.ts— PID file, signal handlers, shutdownregistrars/providers.ts— provider instantiationregistrars/channels.ts— channel instantiationregistrars/hooks.ts— safety, fallback, auto-action, session hook wiringregistrars/tools.ts— tool plugin registrationregistrars/memory.ts— memory backend wiringregistrars/agents.ts— delegation, subagent, skills registration
typechecktarget on all 21 nx packages —tsc --noEmitcatches type errors independently per package.- Typing indicators for Discord channel plugin (same pattern as Telegram — channel-managed, runtime-agnostic).
- Message splitting in channel plugins — Discord (2000 char) and Telegram (4096 char) handle overflow internally. Runtime has zero knowledge of message length limits.
- Safety cap fix — when agent hits tool iteration limit, preserves the accumulated response text instead of replacing it with a generic message.
Changed
Section titled “Changed”- CLI rewired — imports from
@rivetos/bootinstead of../../../../src/boot.js. No more rootDir violations. - Telegram typing refactored — typing indicator management moved from internal
handleMessage()wrapping to publicstartTyping()/stopTyping()methods, then back to channel-internal management (matching Discord’s pattern). Runtime doesn’t touch typing. - 21/21 packages typecheck clean — fixed ~138 type errors across the monorepo (config types, tool result types, delegation types, missing tsconfigs).
Removed
Section titled “Removed”src/boot.ts— 500-line god file replaced by@rivetos/bootpackage with 7 focused files.src/config.ts,src/validate.ts— moved topackages/boot/src/.
[0.0.5] - 2026-04-02
Section titled “[0.0.5] - 2026-04-02”rivetos logs— tail runtime logs with filtering (--lines,--follow,--since,--grep,--json). Wrapsjournalctlfor systemd service, falls back to log file reading.rivetos skills list— discovers all skills fromskill_dirs, parses SKILL.md frontmatter, shows name/description/trigger count.rivetos plugins list— enumerates configured providers, channels, memory backends, and tools with status (configured / available / missing-key).rivetos login— OAuth login for Anthropic subscription auth.
Changed
Section titled “Changed”- CLI extracted to
@rivetos/cli(packages/cli/) — independent Nx package with ownpackage.json,tsconfig.json, build/test targets. Enablesnx run cli:build,nx run cli:test, affected-only testing, and Nx caching. Oldsrc/cli/removed. @rivetos/clipath alias added totsconfig.base.json.- Root
binentry updated to point topackages/cli/src/index.ts.
Milestone
Section titled “Milestone”- 0.5 — CLI Tools: Complete. All planned CLI commands shipped.
mesh list/ping/removemoved to Milestone 6.6 (Fleet Management).
[0.0.4] - 2026-04-02
Section titled “[0.0.4] - 2026-04-02”- Config validation engine (
packages/boot/src/validate.ts) — schema validation on startup with structured error/warning reporting- Missing required fields, invalid types, unknown keys
- Cross-reference validation: agents ↔ providers, heartbeats, channel bindings, coding pipeline
- Warns on hardcoded API keys/tokens in config (use env vars)
- Warns on out-of-range values (temperature, max_tokens)
- Human-readable error messages with config path and available options
rivetos config validateCLI command — dry-run config validation without starting the runtime- Upgraded
rivetos doctor— now runs schema validation, config-aware env var checks, and provider connectivity tests - 62 unit tests for config validation covering all sections, cross-references, edge cases
ConfigValidationErrorthrown on boot with formatted output when config is invalid
Changed
Section titled “Changed”loadConfig()now validates schema before resolving env vars — catches structural issues earlyrivetos doctorversion bumped to match package version- Root test script now includes validation tests alongside Nx project tests
[0.0.1] - 2026-03-28
Section titled “[0.0.1] - 2026-03-28”- Core runtime with agent loop, router, workspace loader, message queue
- Streaming-first provider interface (
AsyncIterable<StreamEvent>) - Domain-driven design with clean architecture (types → domain → application → plugins)
- Providers: Anthropic (with OAuth subscription auth), Google Gemini, xAI Grok, Ollama, llama-server
- Channels: Telegram (grammY) with typing indicator, inline buttons, reactions
- Memory: PostgreSQL adapter with full transcript archive, summary DAG, hybrid FTS+vector search
- Tools: Shell execution with safety categorization and AbortSignal support
- Full command surface:
/stop,/interrupt,/steer,/new,/status,/model,/think,/reasoning - Message queue with deterministic behavior (commands immediate, messages queued)
- Session persistence across restarts via Memory plugin
- Thinking level control (off/low/medium/high) mapped to provider-specific parameters
- CLI:
rivetos start/stop/status/doctor/config/version+ provider commands - Toggleable structured logging via
RIVETOS_LOG_LEVELenvironment variable - YAML configuration with
${ENV_VAR}resolution - GitHub Actions CI
- Apache 2.0 license
