Aonyx Agent v0.8.0
Changelog
All notable changes to Aonyx Agent will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased]
(nothing yet)
[0.8.0] — 2026-06-03 — real end-to-end tool calling
Fixes a blocker. The agent can now actually call tools — built-in, MCP,
and plugin — on every supported provider. Previously the providers deferred
tool calling: openai_compat never sent the tools field, and neither it
nor anthropic parsed tool calls back from the response, so the agent could
only emit text and would hallucinate instead of querying its tools/RAG.
clippy --all-features -D warnings clean; full workspace suite green.
Fixed / Added
- Core —
Messagenow carries structured tool data:tool_calls(on an
assistant turn that requested tools) andtool_call_id(on a tool result),
so multi-turn tool exchanges replay correctly. Backward-compatible
(#[serde(default)]— older persisted sessions decode unchanged). - Runner — records the assistant's tool-call turn (text and the
calls) and links each result back by id; tool schemas now carry their
description so the model knows what each tool does. - OpenAI-compatible providers (OpenAI, OpenRouter, LM Studio, llama.cpp's
llama-server, and Ollama via its/v1endpoint) — send tools in OpenAI
{type:"function", …}shape, replay assistanttool_calls+tool
results withtool_call_id, and accumulate streameddelta.tool_calls[]
fragments into complete calls. - Anthropic — serialize assistant tool calls as
tool_useblocks and
results astool_resultblocks; parse streamedtool_use
(content_block_start→input_json_delta→content_block_stop).
Known follow-ups
- The native Ollama provider (
/api/chat) and the claude-code
provider still route tool use through their own paths; Ollama users wanting
tools today should point an OpenAI-compatible provider at
http://localhost:11434/v1.
Notes
- The Tauri desktop app (originally slated for v0.8.0) shifts to v0.9.0.
[0.7.0] — 2026-06-03 — Vague 4 (1/2): automation API
Adds a first-class REST + WebSocket automation API over the agent core
(aonyx serve api) in a new aonyx-api crate. clippy --all-features -D warnings clean on the pinned 1.96.0 toolchain; full workspace test suite
green.
Added
- Automation API (
aonyx serve api, featureapi, in the-full
binary) — a bearer-authed HTTP surface over the same core that powers the
CLI/TUI:- Sessions —
GET/POST /v1/sessions,GET/DELETE /v1/sessions/:id,
POST /v1/sessions/:id/messages(blocking turn), persisted in the same
~/.aonyx/sessions.dbas the CLI/TUI. - Streaming —
GET /v1/sessions/:id/stream(bidirectional WebSocket)
andPOST /v1/sessions/:id/messages/stream(one-shot SSE): live text
deltas + tool-activity frames. - Memory palace —
GET /v1/memory/search(hybrid),GET/POST /v1/memory/diary,GET /v1/memory/kg/entities,/entities/:name,
/relations. - Introspection —
GET /v1/tools,/v1/skills,/v1/config
(secrets are never exposed),/v1/info,/v1/health. - OpenAI-compatible —
POST /v1/chat/completions+GET /v1/models
co-mounted on the same port, so any OpenAI SDK is a drop-in client. - OpenAPI —
GET /v1/openapi.json(open, for discovery). - Security — bearer token (flag / keyring
api_token/AONYX_API_TOKEN);
binds127.0.0.1by default; a non-loopback bind refuses to start
without a token; destructive tools stay denied at the loop level.
- Sessions —
Notes
- New crate
aonyx-api(10 crates total). The API never depends on
aonyx-agent— the agent loop is injected through anApiAgenttrait,
exactly like the channel adapters — so the binary pulls it in behind the
apifeature with no dependency cycle. - First half of Vague 4. The Windows desktop app (Tauri 2, hybrid
local/remote) lands in v0.8.0.
[0.6.0] — 2026-06-02 — Vague 3 finale (cloud-sync · self-evolution · sandbox)
Closes the Vague 3 arc — and with it the full PRD roadmap (Vague 1 + 2 + 3).
clippy --all-targets --all-features -D warnings clean on the pinned 1.96.0
toolchain; full workspace test suite green.
Added
- Encrypted cloud-sync (Phase AAA, Vague 3) —
aonyx memory backup
zips the project palace and encrypts it (XChaCha20-Poly1305, key derived
from a passphrase via Argon2id) into a portable.aonyxbakfile;aonyx memory restore <file>brings it back on any machine. Sync the file via
any cloud (S3 / Dropbox / rsync / git) — only the passphrase opens it. - Self-evolution (Phase BBB, Vague 3) —
aonyx reflectreads the
project diary, asks the model to distil recurring patterns, preferences,
and lessons, and proposes an improved system prompt (shown as a diff);
aonyx reflect --applyadopts it intoconfig.toml. A bounded,
deterministic take on the DSPy/GEPA idea — the agent learns from its own
history. - Sandboxed / remote exec (Phase CCC, Vague 3) —
sandbox_execruns a
command off the host via a Docker backend (docker run --rm <image>)
or an HTTP backend (POST {command}→{stdout,stderr,exit_code})
for a Modal function, a Daytona workspace, or any compatible shim.
Configured viasandbox_backend/sandbox_image/sandbox_url(HTTP
token in the keyring); registered only when a backend is set.
[0.5.0] — 2026-06-02 — multimodal & web (Vague 3)
Vague 3 takes off: drive a real headless browser, generate images, and
speak. clippy --all-targets --all-features -D warnings clean on the
pinned 1.96.0 toolchain; full workspace test suite green. The -full
release binaries now also bundle browser automation.
Added
- Browser automation (Phase YY, Vague 3) — a headless Chrome / Chromium
toolset over CDP (chromiumoxide):browser_navigate,browser_read,
browser_click,browser_screenshot, all sharing one lazily-launched
browser session. Behind thebrowsercargo feature (included in the
-fullrelease binaries); needs a Chrome/Chromium binary at runtime. - Image generation & TTS (Phase ZZ, Vague 3) —
image_gen(OpenAI
images API → PNG) andtts(OpenAI audio/speech → MP3). Lightweight and
always available; the OpenAI key is injected (config → keyring → env), so
they work with a keyring-stored key. Clear error when no key is set.
[0.4.0] — 2026-06-02 — integrations & onboarding
The Vague 2 finishing arc (phases SS → XX): onboarding, real channel
adapters, an OpenAI-compatible server, Lua plugins, and skill
auto-generation. clippy --all-targets --all-features -D warnings clean on
a pinned 1.96.0 toolchain; full workspace test suite green. Prebuilt release
binaries now ship in lean and -full (all adapters + plugins)
variants.
Added
aonyx setup— an interactive onboarding wizard (Phase SS): pick a
provider, enter the API key, choose a model, and verify it with a live
connection ping before writingconfig.toml.- OS keyring secret storage (
keyringcrate) for API keys — macOS
Keychain, Windows Credential Manager, Linux Secret Service. Runtime
resolution order:config.toml→ keyring → environment variable. Keys
no longer need to live in plaintext, and an env-sourced key can no
longer leak intoconfig.tomlon save. - Linux
aarch64prebuilt binary, built natively on a GitHub-hosted
ARM runner. - Telegram bot (
aonyx serve telegram, Phase TT) — ateloxide
long-poll bot bridged to the agent loop, with per-chat history, a
chat-id allow-list, and anaonyx setup telegramwizard (token →
keyring). Behind the opt-intelegramcargo feature so the default
binary stays lean; destructive tools stay denied for remote chats. - Discord bot (
aonyx serve discord, Phase UU) — aserenitygateway
bot sharing the same bridge (per-channel history, allow-list, 2000-char
chunking) with anaonyx setup discordwizard. Behind thediscord
feature; needs the MESSAGE CONTENT privileged intent enabled. - OpenAI-compatible HTTP server (
aonyx serve openai --port, Phase VV)
— anaxumserver exposingPOST /v1/chat/completions+/v1/models
so any OpenAI SDK can point at the local agent. Stateless (the client
owns history, bridged through a newAgentHandler::complete), optional
bearer auth. Behind theopenai-serverfeature. - Lua plugins (Phase WW) — drop a
.luafile in~/.aonyx/plugins/
to add an in-process tool viaaonyx.register_tool { name, description, run = function(args) ... end }. The Lua VM runs on a dedicated thread
(so the tools staySend + Sync); JSON args/results bridge
automatically. Behind thelua-pluginsfeature. Example:
examples/plugins/hello.lua. - Skill auto-generation (Phase XX) — on by default: when a request
shape (its leading action word) recursskill_autogen_thresholdtimes
(default 3), Aonyx writes aSKILL.mdto~/.aonyx/skills/seeded with
the real examples seen; it loads on the next session. Deterministic — no
model call. Disable withskill_autogen = falseinconfig.toml.
[0.3.0] — 2026-06-01 — the connected agent
The post-0.2.0 arc (phases AA → RR) opens Aonyx up to the wider tool
ecosystem and deepens the memory-palace integration. clippy --workspace --all-targets --all-features -D warnings clean on a pinned 1.96.0
toolchain (local == CI); ~280 workspace tests.
Added
MCP (Model Context Protocol)
- MCP client — connect to remote MCP servers over stdio (GG) and
Streamable HTTP/SSE (II); their tools register into the catalogue as
<server>__<tool>and are callable like any built-in. - MCP server —
aonyx mcp serveexposes Aonyx's own tools to other
clients (Claude Code, Cursor, …) over stdio (HH). It now also serves the
palace-backedmemory_*tools scoped to the current directory (NN),
and over a minimal Streamable HTTP transport via--port(OO),
with optional bearer-token auth (--token/$AONYX_MCP_TOKEN)
rejecting unauthorized HTTP requests with401(PP).
Built-in tools
web_fetch(readability extraction) andweb_search(Brave → Tavily
fallback) (JJ, MM);web_fetchnow extracts text from PDFs too
(PP).memory_search/memory_diary_append/memory_kg_query— the agent
reads and writes its own memory palace mid-turn (MM).
Sessions & providers
/forka session into a child branch (Z); auto-compact long sessions
(BB);/retrythe last turn (CC);/treesession genealogy (MM)./modeland/providerlive-switch (EE, LL);/providerpersists the
choice and remaps the model to the new provider's default when the
active id doesn't fit (NN).
Vision & export
- Local
@imagereferences are downscaled to ≤1568px before being sent to
a vision model, capping token cost (NN). Remote image URLs are
fetched (and downscaled) into vision attachments too (OO). /export-htmlstandalone styled HTML (FF);/export-bundlewrites a
.zipof Markdown + HTML +meta.json(NN), plus amessages.json
transcript for re-import (OO)./import-bundle <zip>restores a
session from thatmessages.jsonas a fresh, active session (PP).
Approval
- Per-tool always-allow: the approval overlay's
[A]key remembers a
destructive tool so future calls skip the prompt; persisted to config
(OO). Rules also accept aname:needlearg-pattern form — e.g.
bash:cargoauto-approves only cargo commands (PP).
Robustness & cost
- HTTP providers (Anthropic / OpenAI-compatible / Ollama) retry
transient 429 / 5xx / network errors with exponential backoff (RR). - Anthropic prompt-caching: the system prompt is sent as a cached
block, cutting input-token cost across a session's turns (RR). /costprints a detailed per-session token + USD breakdown (RR).
TUI
/mcppanel lists connected MCP servers and toggles all of a server's
tools at once (RR)./renameretitles the current session (RR).
@globrefs (@src/**/*.rs) load every matching file (RR).
Skills & theming
- Custom skills loaded from
~/.aonyx/skills/(DD); live theme editor
/theme-edit(KK).
[0.2.0] — 2026-05-29 — the full-screen TUI
A 25-phase arc (B → Z) turning the line-based REPL into a full-screen
ratatui terminal UI with multimodal input, multi-session branching, a
memory-palace inspector, and live capability toggles. 185 workspace tests,
clippy --workspace -D warnings clean.
Launch with aonyx --tui. The legacy line REPL remains the default.
Added
Terminal UI (ratatui)
- Full-screen layout: scrollable conversation viewport, multi-line composer,
status bar. Auto-scroll, animated braille spinner,💭 thinking…
placeholder. - Markdown rendering in the viewport via
tui-markdown, with a
ratatui_core → ratatuicolour converter. Rendered live during
streaming — headings / bold / code light up as the model types. @pathfile references load files into the next turn's context;
!cmdruns a local shell and feeds the output back.- Fuzzy autocomplete popup (
nucleo-matcher) for@files,/commands,
and/cmd <arg>argument completion (/themes,/load,/ingest,
/undo). - Inline composer syntax highlight:
/cmdmagenta,!bashyellow, chat
default — recoloured on every keystroke. Ctrl+Pfuzzy command palette over every slash command + theme.- Mouse support: scroll wheel, single-click palette accept.
/mouse
toggles capture so the host terminal can do native drag-to-select + copy. - Vim modal editing (
/vim): Insert / Normal,j/k/g/Gnavigation. - 4 bundled themes (
/themes): default, catppuccin, dracula, gruvbox. - Desktop notifications (
notify-rust) on long-turn completion + errors. - Token + USD cost estimator in the status bar (per-provider pricing table).
Multi-session
SqliteSessionStorecross-run persistence at~/.aonyx/sessions.db,
auto-restore on startup./sessionslist,/newrotate,/find <query>full-text search across
every session,/load <id-prefix>switch,/forkbranch the current
session into a child (parent_id tracked).
Floating panels
/kg— memory-palace visualization: entities grouped by type, relations
assrc ──predicate──▶ dst./tools— enable / disable registered tools live (sharedToolRegistry
disabled-set)./skills— enable / disable loaded skills live (shared runner toggle set)./inspect— pretty-printed JSON of the last LLM request (base64 images
elided).
Safety + memory
- Inline approval overlay: destructive
fs_edit/fs_write/bashcalls
pause the runner for a[Y/n]decision (asyncAsyncApproverbridge). /undo [N|list]— revert the last N filesystem changes via a JSONL
snapshot journal at<cwd>/.aonyx/undo.jsonl./ingest <path>— chunk a local file (paragraph-aligned) into the project
palace; searchable by the agent.
Multimodal
@image.pngrendered inline as a half-block Unicode thumbnail (works in
any truecolor terminal, no Kitty / iTerm / Sixel dependency).- Vision passthrough: images forwarded to Anthropic (
image/source
blocks) and OpenAI-compatible providers (image_urldata URLs). Attachment::ImageonMessage,#[serde(default)]for backwards
compatibility with existing persisted rows.
Changed
ApprovalPolicy::allowis nowasyncto support the interactive TUI
approver.AgentRunnerexposes shared handles:skill_toggle_handle(),
last_request_handle().SessionStoregainssearch,find_by_id_prefix, andfork.ToolRegistrygains a shared disabled-set withdisable/enable/
toggle/is_disabled.
[0.1.0] — 2026-05-28 — pre-alpha foundations
This is the first release. Aonyx Agent runs end-to-end against Anthropic / OpenAI /
OpenRouter / Ollama / LM Studio with a working memory palace (Knowledge Graph,
diary, BM25 full-text search) and four built-in skills.
Added
Agent core
aonyx-agent::AgentRunner— multi-turn loop with streaming, tool dispatch,
ApprovalPolicygate, per-turn iteration cap, skill activation, project context.ApprovalPolicywithAutoAllow,DenyDestructive(default),Custom(Arc<Fn>).ChatRequest/ChatChunk/ChatStream = BoxStream<'static, Result<ChatChunk>>
shared types inaonyx-core.
Memory palace
aonyx-memory::SqliteKgStore— Knowledge Graph with entity / relation
temporal validity windows, idempotent migrations, indexes, 5 tests.aonyx-memory::SqliteDiaryStore— append-only narrative log per project.aonyx-memory::SqliteChunksStore— SQLite FTS5 BM25 search with
unicode61 remove_diacritics 2tokenizer.aonyx-memory::Palace— unified facade composing the three stores;open(dir)
creates{kg.db, diary.db, chunks.db}layout under./.aonyx/.MemoryStore::hybrid_searchdelegates to BM25 (FTS5). Vector layer
(fastembed-rs + HNSW + RRF k=60) intentionally deferred to V1.1.
LLM providers
aonyx-llm::anthropic::AnthropicProvider— native Messages API,
streaming SSE,content_block_delta+message_stopevents,
system-message extraction.aonyx-llm::openai_compat::OpenAiCompatProvider— shared backend for every
"speaks-OpenAI" endpoint. Optional Bearer auth, optional extra headers.aonyx-llm::openai::provider— OpenAI public API factory.aonyx-llm::openrouter::provider+provider_with_attribution—
OpenRouter aggregator with optionalHTTP-Referer/X-Title.aonyx-llm::lm_studio::provider— LM Studio with empty Bearer (no auth header).aonyx-llm::OllamaProvider— JSON-lines streaming from/api/chat.aonyx-llm::Router— fallback chain across providers withtracing::warnon each failure.
Tools (10 built-in handlers, registered by ToolRegistry::default_set())
fs_read,fs_glob,fs_grep—Safe.fs_write,fs_edit—Destructive(must clearApprovalPolicy).bash—Destructive;cmd /Con Windows,sh -celsewhere; timeout via
tokio::time::timeout;kill_on_drop.git_status,git_diff,git_log,git_show—Safe.
Skills
aonyx-skills::SkillLoader— parses YAML frontmatter + markdown body from
anySKILL.md/*.skill.md. Handles\nand\r\nline endings.aonyx-skills::SkillEngine— activates skills via case-insensitive keywords,
query regex, project regex,always_on, ormanual. Invalid regexes are
silently skipped.aonyx-skills::builtin_skills()returns the four V1 built-ins embedded
in the binary at compile time:
code-review,doc-writer,data-analyst,incident-response.
CLI
aonyx— opens an interactive REPL in the current dir.aonyx new <path>— same, scoped to<path>.aonyx config show / path— inspect~/.aonyx/config.toml.aonyx memory stats— report kg / diary / chunk counts.aonyx memory search <query>— BM25 search across chunks.- Slash commands inside a session:
/quit /q /exit,/clear /reset,/help /?. - First-run wizard writes
~/.aonyx/config.tomlwith sensible defaults. - Environment fallbacks:
ANTHROPIC_API_KEY,OPENAI_API_KEY,
OPENROUTER_API_KEY.
Distribution
- MIT license, public repository at https://github.com/feiuz/aonyx-agent.
- CI matrix on Linux, macOS, Windows for format / clippy / test.
- Release pipeline (
.github/workflows/release.yml) triggers onv*.*.*
tags and produces static binaries for Linux x86_64, macOS x86_64 + arm64,
Windows x86_64. release.tomlforcargo-releaseautomation;docs/releasing.mdwalkthrough.
Numbers
- 90 tests across 5 crates (8 agent + 26 llm + 22 memory + 14 tools + 13 skills + 7 cli).
aonyx.exerelease binary: 8.0 MB stripped.- p50 cold start to interactive prompt: well under 1 s.
Known gaps (planned for V1.1+)
- Vector embeddings (
fastembed-rsONNX), HNSW index, RRF fusion, temporal boost. - Tree-sitter code-aware chunk splitter.
- MCP client and server (
aonyx-mcpcrate is scaffolded but inert). - Interactive approval prompt (CLI currently only supports
DenyDestructive). - Subagent spawning (
aonyx-agent::subagentis scaffolded but inert). - Telegram / Discord adapters (
aonyx-adaptersis scaffolded but inert). - OpenAI-compatible HTTP server.
toolsblocks in OpenAI / Ollama provider payloads (text-only V1).
Full Changelog: v0.7.0...v0.8.0