Skip to content

Latest commit

 

History

History
654 lines (532 loc) · 33.3 KB

File metadata and controls

654 lines (532 loc) · 33.3 KB

AION — Changelog

This document describes what has changed. AION reads this on startup to know what is new. Required: Add an entry after each self-modification (code, plugin, config).


1.5.0 — 2026-04-03

Architecture

  • aion.py modularized — monolith split into core/ package: aion_config.py, aion_character.py, aion_permissions.py, aion_prompt.py, aion_providers.py — each independently hot-reloadable
  • core/aion_progress.py — new per-task progress reporting system; tools call report(percent, label) for real-time frontend progress bars
  • All tools always visibletier_threshold=2 is now the default; tier-2 tools (desktop, browser, audio) are always in the API schema. Eliminates hallucinated tool names and retry turns. Escalation logic removed.
  • Grouped Capability Index — system prompt now contains a semantic, auto-generated tool index grouped by prefix (DESKTOP, AUDIO, BROWSER…). Updates automatically when plugins change.

Self-Improvement System (new)

  • record_mistake tool — AION records mistakes to mistakes.md; last 5 entries are injected into every session's system prompt
  • lookup_rule tool — search prompts/rules.md by keyword or section; returns matching sections with full content
  • Boot maintenance sessionboot_session plugin spawns a silent background AionSession on every startup after ≥1h offline; reviews mistakes, character, todos, and writes a startup reflection
  • Offline duration hint — system prompt shows how long AION was offline
  • Doc freshness warning — warns when core .py files are newer than AION_SELF.md to prevent acting on stale self-knowledge
  • End-of-conversation protocol — mandatory rules for session close: update_character, reflect, record_mistake, CHANGELOG check
  • max_rules_chars: 35000 — full rules.md (27 KB) now always loaded; previously truncated at 12 KB, cutting off half the rules

New Tools

  • desktop_set_window_state — minimize, maximize, restore or close any window by partial title match (uses pygetwindow)
  • boot_status — returns last boot time, offline duration, maintenance status
  • record_mistake — persistent mistake journal with session injection
  • lookup_rule — rules.md keyword/section search

New Plugins

  • boot_session — startup maintenance session (see Self-Improvement above)
  • docx_to_speech — converts Word documents (.docx) to MP3/WAV audio via python-docx + audio_pipeline TTS; supports edge-tts and sapi5 engines

Multi-Channel UI

  • Channel switcher — pill tabs to switch between web/Telegram/Discord/Slack with unread message counts and readonly indicators
  • Detach-task (⊞ button) — offload long-running tasks to background while keeping chat responsive
  • Mood system — visual mood badges and subtle bubble tinting per mood state
  • Activity log — tool execution timeline in the UI
  • Update banner — prominent notification when a new AION version is available
  • Progress bars — real-time progress for long-running tool operations

Plugin Updates

  • anthropic_provider — Claude 4.x model support (opus-4-6, sonnet-4-6, haiku-4-5); dynamic model listing from Anthropic API
  • gemini_provider — full Function Calling for Gemini 2.5-pro/flash; thinking budgets, vision, streaming all stable
  • audio_pipeline — any audio format (OGG, MP3, WAV, FLAC, WebM) via Faster Whisper for offline multilingual transcription; multi-engine TTS routing
  • telegram_bot — feature parity with web UI: isolated history per user, inline approval buttons, photo support, voice transcription + TTS synthesis

Documentation & Maintenance

  • MAINTENANCE.md — new change-propagation guide listing exactly what to update for each change type (new tool, architecture change, rule change, etc.)
  • docs/messaging.md — comprehensive integration guide: Telegram, Discord, Slack, Alexa, audio, browser automation, MCP
  • hub-repo-template/ — framework for distributable plugin repositories with manifest.json, SHA256 verification, GitHub Actions workflow

Fixes

  • Wakeup delivery via config.json poll (was unreliable SSE queue)
  • Wakeup prompt includes character context; JS retry at 5/10/18s
  • thinking_budget=512 for Gemini 2.5 wakeup (budget=0 was invalid)
  • Provider registry mutated in-place to avoid stale references after import
  • Restart marker added to session context to prevent resuming stale tasks
  • confirmed correctly NOT required in desktop_set_window_state
  • float | None syntax in boot_session.py uses Optional[float] for Python 3.9

1.3.0 — 2026-03-29

New Features

  • read_plugin_doc tool — new built-in in core_tools. Call read_plugin_doc("plugin_name") to read a plugin's full README on demand. Call without args to list all documented plugins. Replaces the manual file_read("plugins/{name}/README.md") pattern. System prompt updated.
  • focus_manager pluginfocus_set, focus_get, focus_clear. Stores the current task focus in plugins/focus_manager/focus_state.json and injects it into every turn's system prompt. Prevents topic drift on multi-step tasks. Now also has a README.
  • focus_manager READMEplugins/focus_manager/README.md created (was the only plugin without documentation).

Improvements

  • Reflection qualityreflect tool description rewritten to prevent planning-note spam. The tool is now clearly for post-experience insights only. "I will now do X" is explicitly forbidden. Near-duplicate protection added (>55% word overlap → entry skipped).
  • Auto-reflect duplicate prevention_auto_reflect() in aion_session.py now checks for near-duplicate content before appending to thoughts.md. Prevents the same thought being recorded multiple times across consecutive sessions.
  • Memory injection reducedget_context_semantic called with max_entries=3 (was 5). The top-3 entries are the relevant ones; entries 4-5 had low similarity scores and added noise.
  • reflection README updated — trigger types updated to English (general, error, insight, user_observation, task_completed, uncertainty), full usage guide added.
  • rules.md — new MEMORY RECORDING section with explicit guidance on when to call memory_record for insights that should survive across sessions.
  • AION_SELF.md — updated: focus_manager documented, reflect behavior updated, read_plugin_doc added to tool table, memory max_entries corrected to 3.

1.2.1 — 2026-03-27

Breaking Changes

  • .env removed — all secrets now stored in the encrypted vault (credentials/*.md.enc, Fernet/AES-128-CBC). .env is no longer created or read. Existing installations: run aion --setup or enter keys in Settings → API Keys to migrate.

New Features

  • Full Vault migrationonboarding.py writes all API keys and tokens directly to the encrypted vault; load_dotenv removed from aion.py, aion_web.py, aion_cli.py
  • Vault startup injection_vault_inject_all_sync() loads all known keys from vault into os.environ at startup (covers OpenAI, Gemini, DeepSeek, Grok, Anthropic, Telegram, Discord, Slack)
  • POST /api/keys now vault-backed — saving keys via Web UI writes to encrypted vault instead of .env
  • Port + GitHub repo in config.jsonAION_PORT and AION_GITHUB_REPO migrated from .env to config.json; updater plugin and web server read from config first

Fixes

  • Ollama model routing_api_model_name() strips ollama/ prefix before API calls; _resolve_ollama_prefix() auto-adds prefix for bare model names (fixes 404 errors)
  • Ollama model selection — selecting a model without ollama/ prefix (e.g. qwen3.5:2b) is now auto-corrected to ollama/qwen3.5:2b on save
  • Startup wakeup — reasoning flag extended to gemini-2.5 models; token limit raised to 2000; traceback logging added on error
  • uvicorn log level — read from config.json["log_level"] instead of hardcoded "warning"
  • Ctrl+C visibility[AION] Server wird beendet … + [AION] Beendet. now printed on shutdown
  • Gemini INVALID_ARGUMENT_build_contents() now drops text parts when a model turn contains function_call parts; post-processing guards against consecutive model turns and histories that start with a model turn
  • Vault integration — all credential-dependent plugins (Anthropic, Gemini, DeepSeek, Grok, Discord, Slack, Moltbook) now read API keys from the encrypted vault as fallback when env vars are absent
  • task_routing default — onboarding now sets default model to the user's chosen primary model instead of hardcoded gemini-2.5-flash
  • Moltbook get_own_posts — endpoint corrected from /agents/me/posts to /me/posts
  • Ollama base URL — changed from localhost to 127.0.0.1 to avoid IPv6 resolution issues

Refactoring

  • aion.py: unused imports removed, datetime.now()datetime.now(UTC), helpers extracted
  • credentials.py: added _vault_set_field_sync, _vault_inject_all_sync, _KNOWN_VAULT_KEYS
  • Plugin hint messages updated: no longer reference .env, point to credential_write instead

1.2.0 — 2026-03-27

New Features

  • Evolving Personality 2.0 — Mood Engine (5 states: curious/focused/playful/calm/reflective), relationship depth (5 levels based on exchange count), temporal awareness (morning/night context)
  • Proactive AI — daily 08:30 briefings, unfinished task surfacing via LLM memory analysis, server-sent push toasts in the Web UI (SSE)
  • Desktop Automation (desktop plugin) — full-screen screenshot, click, type, hotkeys, scroll via pyautogui; headless guard on Linux only; approval pattern for destructive actions
  • Self-Healing Workflows — retry policies with exponential backoff, error classification (network/resource/not_found/fatal), tool alternatives on failure
  • Context Compression — auto-compresses character.md, rules.md, generates AION_SELF_SUMMARY.md in background; SSE toast notifications during optimization
  • Snapshot Visibility — Web UI panel + CLI /snapshots + REST API for plugin snapshots
  • Token Optimization — tool schema tiering (tier-2 saves 1,500–2,500 tokens/turn), rules.md truncation guard, changelog opt-in in system prompt
  • CLI Onboarding Wizard — first-run plugin selection with recommended defaults
  • Telegram Settings — Web UI tab (token + whitelist) + CLI /telegram commands
  • HTTPS Tunnel (web_tunnel plugin) — cloudflared quick tunnel, no account needed

Fixes

  • Ctrl+C now terminates AION instantly — os._exit(0) + subprocess cleanup; uvicorn CancelledError shutdown noise suppressed via logging filter
  • 11 cross-platform bugs fixed: asyncio event loop on Python 3.10+, macOS Desktop plugin falsely disabled, APPDATA empty-string paths, pythonw.exe detection, threading race conditions in plugin_loader, Path.home() crash in Docker
  • async/threading: scheduler loop, sub-session LRU, OAuth state expiry, contextvar reset

Refactoring

  • config_store.py — single thread-safe config module with atomic writes via temp file
  • AionMemory singleton with asyncio.Lock for all memory operations
  • find_claude_bin() centralized in config_store — 3 duplicate implementations removed
  • CLI commands extracted to handler functions with _CMD_PREFIX_DISPATCH table
  • _backup_code_file() helper replaces 3 identical backup blocks in aion.py

Docs

  • README rewritten: 133 lines (was 811), AION vs. OpenClaw comparison, clear USPs
  • New docs/ folder: configuration.md, api.md, plugins.md, messaging.md

2026-03-26 — Context Compression + Snapshot Visibility + Token Optimization

Context Compression

  • _auto_character_update() rewritten: full rewrite every 5 conversations with fixed size cap (CHARACTER_MAX_CHARS=5000) — character evolves, never accumulates
  • _compress_rules(): LLM compresses rules.md when >15 KB, preserving all rules
  • _generate_self_doc_summary(): generates AION_SELF_SUMMARY.md (~3–5 KB index of 63 KB doc)
  • _startup_compress_check(): background task 5s after start checks all thresholds
  • _backup_file(): timestamped backups before every compression (max 3 kept per file)
  • SSE push notifications: ⚙ running / ✓ done toasts via /api/events during optimization

Snapshot Visibility

  • Web UI: "Snapshots" collapsible panel in Plugins section with per-plugin timestamps + Restore buttons
  • CLI: /snapshots, /snapshots <plugin>, /snapshots restore <plugin> [<timestamp>]
  • API: GET /api/snapshots, GET /api/snapshots/{plugin}, POST /api/snapshots/{plugin}/restore
  • Self-healing hint: exhausted retries now mention available plugin snapshots for recovery

Token Optimization

  • Tool schema tiering: 16 contextual plugins (desktop, playwright_browser, etc.) → tier=2, excluded by default (saves 1,500–2,500 tokens/turn); config.json["tool_tier"]=2 includes all
  • read_self_doc: loads AION_SELF_SUMMARY.md by default (~3–5 KB vs 63 KB); full=True for complete doc
  • New tool generate_self_doc_summary: AION can regenerate summary on demand
  • rules.md truncation guard: max_rules_chars (default 12,000) + smart auto-compression
  • Changelog opt-in: system_prompt_show_changelog (default false) removes ~150 tokens/turn

2026-03-26 — Personality 2.0 + Proactive AI + Desktop Automation + Self-Healing

Evolving Personality 2.0

  • Mood Engine (plugins/mood_engine/): 5-state mood system (curious/focused/playful/calm/reflective) computed from time-of-day, conversation topic keywords, and tool error signals
  • Mood hint injected into every system prompt — influences AION's communication style dynamically
  • Relationship Depth: 5 levels based on exchange_count — progressively richer collaboration style
  • Temporal Awareness: morning/late-night context hint injected per call
  • Tools: mood_check, mood_set

Proactive Wake-on-Trigger

  • Proactive plugin (plugins/proactive/): daily analysis at 08:30 weekdays reads conversation history + memory, finds unfinished tasks and open questions via LLM
  • Server-Push SSE (GET /api/events): persistent browser connection with 30s heartbeat
  • Push Toast UI: slide-in notification bottom-right with Accept/Dismiss buttons (auto-dismiss 30s)
  • Tools: proactive_check, proactive_clear

Desktop Automation

  • Desktop plugin (plugins/desktop/): full-screen screenshot (base64 PNG), click, type, hotkey, scroll, mouse move — all via pyautogui
  • Destructive actions require confirmed=true (approval pattern)
  • Headless/server guard: auto-disabled when $DISPLAY unset on Linux
  • Requires: pip install pyautogui Pillow

Self-Healing Workflows

  • _dispatch() checks retry_policy on plugin tools before executing
  • _dispatch_with_retry(): exponential backoff, silent retries for transient errors
  • _classify_error(): categorizes errors as network/resource/not_found/fatal
  • Alternative tool suggestions appended after max retries exhausted
  • PluginAPI.register_tool() accepts retry_policy dict

Bug Fixes & Refactoring

  • Removed dead chat_turn() function (replaced by AionSession.stream())
  • run_aion_turn() now uses per-channel AionSession registry (no more _conversations dict)
  • aion_web.py delegates _load_config/_save_config to config_store.py (thread-safe)
  • shell_tools.py fallback uses MAX_MEMORY from aion instead of hardcoded 300

2026-03-26 — Agentic RAG Memory + MCP Support

Agentic RAG Memory

  • AionMemory.get_context_semantic() — async semantic search via Ollama nomic-embed-text embeddings
  • Cosine similarity replaces keyword matching for memory retrieval
  • Lazy embedding: up to 10 new entries embedded per turn (no startup delay)
  • Vectors cached in aion_memory_vectors.json (gitignored, user-specific)
  • Automatic fallback to keyword matching if Ollama is unavailable
  • File: aion.py (AionMemory class, lines ~597–730)

MCP Client Plugin

  • New plugin plugins/mcp_client/ — connects AION to any MCP server
  • Server config via mcp_servers.json (committable, no secrets)
  • Secrets injected from credentials vault (vault_env field in config)
  • Server tools auto-registered as mcp_{server}_{tool} on startup
  • Lazy reconnect on session failure
  • Management tools: mcp_list_servers, mcp_connect_server
  • Requires: pip install mcp

2026-03-24 — ANSI Fix + Auto-Update System

Fix: ANSI/VT100 rendering in PowerShell

  • Arrow-key selector showed raw escape codes ([2m, [92;1m>) in PowerShell on Windows 10
  • Root cause: VT100 processing is not enabled by default on Windows terminals
  • Fix: _enable_win_vt() calls ctypes.SetConsoleMode with ENABLE_VIRTUAL_TERMINAL_PROCESSING before rendering the selector
  • File: aion_launcher.py

New: aion update command

  • Pulls the latest version from GitHub and reinstalls in one step
  • Runs git pull followed by pip install -e . in the project directory
  • Prints the new version number after a successful update
  • No manual git/pip commands needed for users
  • File: aion_launcher.py

New: Updater Plugin (plugins/updater/)

  • Background thread checks GitHub Releases API once per day (first check after 60s)
  • Compares latest release tag with local version from pyproject.toml
  • On new version: notifies all configured channels (Telegram, Discord, Slack) with version diff and aion update instruction
  • FastAPI endpoints: GET /api/update-status, POST /api/update-trigger
  • AION tools: update_status, check_for_updates
  • Configured via AION_GITHUB_REPO=xynstr/aion in .env
  • File: plugins/updater/updater.py

New: Update banner in Web UI

  • Polls /api/update-status on page load and every 6h
  • Shows a dismissible yellow banner when a new version is available
  • Displays current and latest version with a link to the GitHub release notes
  • Dismissed state persists for the browser session (sessionStorage)
  • File: static/index.html

New: Startup update notice in CLI

  • If an update has been detected (from a previous daily check), a yellow notice is shown before the mode selector on the next aion start
  • File: aion_launcher.py

2026-03-24 — Launcher Mode Selector + Telegram Voice Fix

New: Interactive Mode Selector on aion start

  • Running aion without flags now shows an arrow-key selector (↑↓ + Enter)
  • Options: Web UI (http://localhost:7000) or CLI (terminal only)
  • aion --web starts Web UI directly (new flag), aion --cli starts CLI directly (unchanged)
  • Non-TTY fallback: numbered text input (1=Web / 2=CLI)
  • File: aion_launcher.py

Fix: Telegram voice reply no longer sends redundant text

  • When AION responds to a voice message, only the voice note is sent — the text is suppressed
  • Images in the response are still sent before the voice note
  • Approval keyboards (Ja/Nein) are unaffected — text is kept when confirmation is needed
  • File: plugins/telegram_bot/telegram_bot.py

2026-03-24 — STT: Vosk → Faster Whisper

Replaced: Vosk → Faster Whisper (audio_transcriber + audio_pipeline)

  • Vosk removed — required manual model download, German-only, lower accuracy
  • Faster Whisper — offline, multilingual, auto-detects language, auto-downloads model
  • No manual model download — model fetched from HuggingFace Hub on first use (~465 MB for 'small')
  • All audio formats supported (WAV, MP3, OGG, M4A, FLAC, WebM) via ffmpeg (optional)
  • GPU auto-detected — uses CUDA float16 if torch+CUDA available, else CPU int8
  • Model size configurable: aion config set whisper_model small|medium|large-v3
  • language parameter added to both transcribe_audio and audio_transcribe_any
  • Files: plugins/audio_transcriber/audio_transcriber.py, plugins/audio_pipeline/audio_pipeline.py
  • Requirements: faster-whisper>=1.0.0 added, vosk removed

2026-03-24 — Setup Expansion + CLI Config Tool

New: TTS and Thinking Level in Setup Wizard

  • onboarding.py Step 8 now asks for TTS engine (off / edge-tts / sapi5 / pyttsx3), optional voice name, and thinking level (standard / deep / minimal / off)
  • Settings are saved to config.json via write_config() and shown in the completion banner

New: aion config CLI Command

  • aion config list — show all settings from config.json
  • aion config get <key> — read one setting
  • aion config set <key> <value> — write a setting (JSON-aware: numbers, booleans, lists parsed)
  • aion config unset <key> — remove a setting
  • Files: aion_launcher.py (dispatcher + function), aion_cli.py (REPL /config command)

New: /config in CLI REPL (aion --cli)

  • /config list, /config set, /config get, /config unset available directly in chat
  • Settings take effect after server restart

Common config keys

  • model — active LLM model
  • check_model — cheap model for internal YES/NO checks
  • max_history_turns — history truncation limit (default: 40)
  • tts_engine — TTS engine: edge / sapi5 / pyttsx3 / off
  • tts_voice — TTS voice name (e.g. de-DE-KatjaNeural)
  • thinking_level — reasoning depth: off / minimal / standard / deep / extreme
  • browser_headless — browser mode: true/false

2026-03-24 — Critical Bug-Fixes: Onboarding, Approval-Flow, Provider-Dedup

Fixed: aion --setup did nothing

  • _ensure_dependencies() was not called in the --setup branch → missing packages caused onboarding.py to crash silently before showing anything
  • Fix: _ensure_dependencies() now runs first; subprocess uses -u (unbuffered) + explicit stdin/stdout/stderr; completion message printed after success
  • File: aion_launcher.py

Fixed: Provider list 20×-duplicated in Web UI

  • register_provider() used .append() without checking for existing entries → every plugin reload (hot-reload, server restart) added another copy
  • Fix: Added dedup by prefix before appending; global registry is cleaned first
  • File: aion.py

Fixed: "Ja / Bestätigen" button did nothing

  • sendApproval() called sendMsg() which was never defined anywhere → silent JS error
  • Fix: Replaced with direct input.value = 'ja'; send(); + reset isThinking = false to handle edge cases where the stream flag wasn't cleared yet
  • File: static/index.html

Fixed: AION executed actions autonomously without waiting for user confirmation

  • The completion-check ([System] Execute it NOW) was triggered even when AION had asked "Soll ich beginnen?" — the checker saw a plan description and returned YES
  • Fix 1: Question-signal detection before the completion-check → if final_text contains "soll ich", "shall i", "lass mich wissen", etc., loop breaks immediately
  • Fix 2: Completion-check system prompt explicitly handles "plan + question" case → NO
  • File: aion.py

Fixed: No module named 'google' on fresh install

  • google-genai was missing from requirements.txt
  • Fix: Added google-genai>=0.8.0
  • File: requirements.txt

Fixed: Gemini API key shown as "set" on fresh install

  • /api/keys endpoint read from os.environ which includes Windows system environment variables — not just AION's .env
  • Fix: New _read_env_file() helper reads only AION's .env directly; "set"-status is now based exclusively on .env content
  • File: aion_web.py

Fixed: Web server crashed on startup without API key

  • aion_web.py __main__ called sys.exit(1) when no key was configured → prevented users from configuring keys via the Web UI
  • Fix: Changed to a warning message only; server starts and directs user to Settings → API Keys or aion --setup
  • File: aion_web.py

New: Dynamic model list from provider APIs

  • /api/providers now calls list_models_fn() per provider if registered (4s timeout, fallback to static list on error)
  • register_provider() accepts new optional list_models_fn= parameter
  • Gemini: fetches live model list from Google Gen AI API (generateContent models only)
  • Ollama: fetches installed models from local http://localhost:11434/api/tags
  • Files: aion.py, aion_web.py, plugins/gemini_provider/gemini_provider.py, plugins/ollama_provider/ollama_provider.py

2026-03-23 (5) — Security & Control Features (Phase 3 Complete) + CLI Tools

New: Channel Allowlist (config.json → "channel_allowlist")

  • Blocks/allows specific channels: z.B. nur Telegram erlauben, Discord/Slack sperren
  • Syntax: ["default", "web", "telegram*"] (exact matches + wildcards)
  • Check: AionSession.stream() am Anfang → Error if not in allowlist
  • Flexibility: if not set → all channels allowed
  • CLI Tool: set_channel_allowlist(["default", "telegram*"])

New: Thinking Level Control (config.json → "thinking_level" + "thinking_overrides")

  • 4 Levels: minimal (fast) → standard (normal) → deep (extensive) → ultra (maximal)
  • Global: "thinking_level": "standard" for all channels
  • Channel Override: "thinking_overrides": {"telegram*": "deep", "discord*": "minimal"}
  • Implementation: Adds system prompts (reflect-Tool nutzen ja/nein, wie intensiv)
  • CLI Tools:
    • set_thinking_level("deep", "telegram*") — Per-channel override
    • set_thinking_level("standard") — Set globally
    • get_control_settings() — Check current configuration

Implementation Details

  • _check_channel_allowlist(channel) — Wildcard matching with exact-match fallback
  • _get_thinking_prompt(channel) — Channel-specific thinking level prompts
  • _build_system_prompt(channel) — Now channel-aware for thinking level overrides
  • No regressions: Legacy chat_turn() uses default channel

Phase 3 Summary

✅ Browser Automation (Playwright) — 8 tools ✅ Model Failover — Auto-retry on API error ✅ Discord Bot — Bidirectional, per-user sessions ✅ Slack Bot — Socket Mode, thread support ✅ Multi-Agent Router — Custom routing ✅ Docker Support — Deployment-ready ✅ Security: Allowlist ✅ Control: Thinking Level


2026-03-22 (4) — Claude Subscription Integration + Audio Web UI + Keys Tab + Public README

New: Claude CLI Provider Plugin (plugins/claude_cli_provider/)

  • ask_claude(prompt, context_files, task_type) — uses Claude.ai subscription via claude --print; no API key needed
  • claude_cli_login() — installs Claude Code CLI via npm if missing, opens browser for OAuth
  • claude_cli_status() — checks if CLI is installed + authenticated
  • get_task_routing() / set_task_routing() — reads/writes task_routing in config.json
  • Startup check reports CLI status when loading

New: Task Routing (config.json → "task_routing")

  • Routing table: coding → claude-opus-4-6, review → claude-sonnet-4-6, browsing → gemini-2.5-flash, default → gemini-2.5-pro
  • AION reads rules.md-rule: for coding tasks automatically ask_claude use
  • Configurable via Web UI System tab + onboarding step 8 + set_task_routing Tool

New: Audio in Web UI

  • aion.py: collected_audio List parallel to collected_images — collects audio_tts-results
  • aion_web.py: /api/audio/{filename} endpoint with security checks (extension + no path traversal)
  • static/index.html: appendAudioBlock(url, format) renders <audio controls> player in chat

New: Web UI Keys Tab improvements

  • _KEY_META object with provider links, hints, and status dots
  • Claude login block directly in Keys tab (no terminal needed)
  • Auto-poll after login: check every 4s if Claude CLI is authenticated

New: Task Routing section in System tab

  • 4 fields: coding/review/browsing/default model
  • Status display: Claude CLI installed + authenticated
  • Save via /api/config/settings (allowed set around task_routing expanded)

New: New API endpoints

  • GET /api/audio/{filename} — Serve audio file from temp directory
  • GET /api/claude-cli/status — CLI installation and auth status
  • POST /api/claude-cli/login — Start browser login

Fix: Double .mp3 extension (audio_pipeline.py)

  • _tts_edge() added .mp3 even though path already ended in .mp3filename.mp3.mp3
  • Fix: explicit check before appending extension

Fix: Telegram Response Ordering — Voice After All Blocks

  • Voice reply was in elif branch → was skipped if response_blocks was filled
  • Fix: Voice transmission moved into if response_blocks: block, after all text/image blocks

Update: README.md Completely Redesigned for Public Release

  • Badges, feature comparison, provider table (API-Key vs. subscription), REST-API reference
  • Troubleshooting, LLM-loop diagram, Task Routing section

Update: AION_SELF.md Section 13

  • Claude CLI Provider Plugin documented
  • Audio Web UI Pipeline documented
  • Keys Tab improvements documented
  • New API endpoints documented
  • claude_cli_provider added to plugin directory and tools table

2026-03-19 (3)

New: file_replace_lines Tool

  • Replaces lines start_line–end_line directly (no string matching)
  • self_read_code now returns first_line/last_line → read line numbers → replace
  • More reliable than self_patch_code, no more "not found"

Changed: self_read_code — Line numbers in output

  • Now returns first_line and last_line
  • Hint recommends file_replace_lines with concrete line numbers

Changed: System-Prompt Self-Modification

  • file_replace_lines registered as preferred tool
  • Explicit rule: 'old' in self_patch_code MUST be copied exactly

Fix: smart_patch line-tracking bug

  • block_core had filtered out blank lines, match_end calculation counted them anyway
  • Fix: match_end now tracks the actual line range including blank lines
  • New: Uniqueness check reports error if block occurs multiple times

2026-03-19 (2)

New: Confirmation Buttons (Web UI + Telegram)

  • Web UI: When AION wants to confirm a code change, "Confirm" and "Reject" buttons appear directly in the chat — no typing needed
  • Telegram: Inline keyboard with "Yes" / "No" buttons is sent; button click is processed via callback_query
  • aion.py: New SSE event type approval signals the frontend that buttons should be shown
  • Keyboard input ("yes"/"no") continues to work as fallback

2026-03-19

New: Scheduler Interval Mode

  • schedule_add now has an interval parameter: "5m", "30s", "1h", "2h30m"
  • In addition to fixed times, tasks can now be repeated at any interval
  • Check interval: every 5 seconds (previously 10s)

New: send_telegram_voice(path)

  • Send audio file as Telegram voice message (WAV, MP3, OGG …)
  • Workflow: audio_tts(text)send_telegram_voice(path)
  • ffmpeg automatically converts to OGG OPUS

New: audio_pipeline Plugin

  • audio_transcribe_any(file_path) — any audio file → text (ffmpeg + Vosk, offline)
  • audio_tts(text) — text → WAV audio file (pyttsx3/SAPI5, offline)

New: Moltbook Plugin

  • moltbook_get_feed, moltbook_create_post, moltbook_add_comment
  • Social presence on moltbook.com

New: Dynamic Plugin Overview

  • Plugin READMEs are read on load and displayed in the system prompt
  • Each plugin needs a README.md with a brief description

Changed: Telegram → HTML Format

  • Messages are sent as HTML (no longer MarkdownV2)
  • Markdown-to-HTML conversion (_md_to_html) built in

Changed: Telegram Voice Message Reception

  • OGG voice message → ffmpeg → Vosk → text → AION → TTS response

Fix: Telegram Double Responses After self_reload_tools

  • Thread name check prevents second polling thread on plugin reload

Fix: Approval loop on code changes

  • Removed entire gate mechanism (_pending_code_action, _pending_needs_user_turn)
  • New system: confirmed parameter in self_patch_code, self_modify_code, create_plugin
  • Without confirmed: shows preview. With confirmed=true: executes. Stateless, loop-proof
  • Side effect: System prompt text leaked into output when message history was corrupted by loop

New: start.bat — Visual Redesign

  • ASCII logo, ANSI colors (green/yellow/red), box frames for each step
  • 6-step progress display with checkmark/exclamation/cross symbols
  • Active model is displayed at startup
  • Complete log in aion_start.log (absolute path, from line 1)
  • On error: last 25 log lines displayed directly in console
  • python-telegram-bot removed from optional installs (not used, caused conflicts)

Fix: aion_web.py — Crash with Gemini-only Setup

  • Startup check now accepts GEMINI_API_KEY as alternative to OPENAI_API_KEY
  • Previously: sys.exit(1) if no OpenAI key → crash for Gemini-only users

Fix: Telegram 409-Loop

  • start.bat terminates old processes more aggressively (second kill attempt, 12s wait)
  • Backoff strategy: 12s → 14s → max 30s; log warning every 5 attempts

Changed: CLIO Plugin Disabled

  • clio_reflection.py → _clio_reflection.py (plugin loader ignores _ prefix)
  • Reason: had fake random values (random.randint) instead of actual confidence calculation

Changed: _auto_character_update Improved

  • Temperature: 0.2 → 0.7 (more creative character analysis)
  • Prompt: FORBIDDEN/WANTED structure, compares against existing character.md
  • Pattern recognition: searches for patterns across multiple conversations

Changed: Confirmation Required for Code Changes

  • BEFORE calling self_patch_code/self_modify_code/create_plugin: ask user
  • Flow: Read code → show changes → wait for approval → execute

Format for New Entries

## YYYY-MM-DD

### New: [Feature-Name]
- What was added and why

### Changed: [What]
- What and why changed

### Fix: [What]
- What was broken and how it was fixed