Aonyx Agent v0.7.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.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.6.0...v0.7.0