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).
aion.pymodularized — monolith split intocore/package:aion_config.py,aion_character.py,aion_permissions.py,aion_prompt.py,aion_providers.py— each independently hot-reloadablecore/aion_progress.py— new per-task progress reporting system; tools callreport(percent, label)for real-time frontend progress bars- All tools always visible —
tier_threshold=2is 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.
record_mistaketool — AION records mistakes tomistakes.md; last 5 entries are injected into every session's system promptlookup_ruletool — searchprompts/rules.mdby keyword or section; returns matching sections with full content- Boot maintenance session —
boot_sessionplugin 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
.pyfiles are newer thanAION_SELF.mdto 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— fullrules.md(27 KB) now always loaded; previously truncated at 12 KB, cutting off half the rules
desktop_set_window_state— minimize, maximize, restore or close any window by partial title match (usespygetwindow)boot_status— returns last boot time, offline duration, maintenance statusrecord_mistake— persistent mistake journal with session injectionlookup_rule— rules.md keyword/section search
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
- 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
anthropic_provider— Claude 4.x model support (opus-4-6, sonnet-4-6, haiku-4-5); dynamic model listing from Anthropic APIgemini_provider— full Function Calling for Gemini 2.5-pro/flash; thinking budgets, vision, streaming all stableaudio_pipeline— any audio format (OGG, MP3, WAV, FLAC, WebM) via Faster Whisper for offline multilingual transcription; multi-engine TTS routingtelegram_bot— feature parity with web UI: isolated history per user, inline approval buttons, photo support, voice transcription + TTS synthesis
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, MCPhub-repo-template/— framework for distributable plugin repositories with manifest.json, SHA256 verification, GitHub Actions workflow
- Wakeup delivery via config.json poll (was unreliable SSE queue)
- Wakeup prompt includes character context; JS retry at 5/10/18s
thinking_budget=512for 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
confirmedcorrectly NOT required indesktop_set_window_statefloat | Nonesyntax in boot_session.py usesOptional[float]for Python 3.9
read_plugin_doctool — new built-in incore_tools. Callread_plugin_doc("plugin_name")to read a plugin's full README on demand. Call without args to list all documented plugins. Replaces the manualfile_read("plugins/{name}/README.md")pattern. System prompt updated.- focus_manager plugin —
focus_set,focus_get,focus_clear. Stores the current task focus inplugins/focus_manager/focus_state.jsonand injects it into every turn's system prompt. Prevents topic drift on multi-step tasks. Now also has a README. - focus_manager README —
plugins/focus_manager/README.mdcreated (was the only plugin without documentation).
- Reflection quality —
reflecttool 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()inaion_session.pynow checks for near-duplicate content before appending tothoughts.md. Prevents the same thought being recorded multiple times across consecutive sessions. - Memory injection reduced —
get_context_semanticcalled withmax_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 RECORDINGsection with explicit guidance on when to callmemory_recordfor 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.
.envremoved — all secrets now stored in the encrypted vault (credentials/*.md.enc, Fernet/AES-128-CBC)..envis no longer created or read. Existing installations: runaion --setupor enter keys in Settings → API Keys to migrate.
- Full Vault migration —
onboarding.pywrites all API keys and tokens directly to the encrypted vault;load_dotenvremoved fromaion.py,aion_web.py,aion_cli.py - Vault startup injection —
_vault_inject_all_sync()loads all known keys from vault intoos.environat 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.json —
AION_PORTandAION_GITHUB_REPOmigrated from.envtoconfig.json;updaterplugin and web server read from config first
- Ollama model routing —
_api_model_name()stripsollama/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 toollama/qwen3.5:2bon save - Startup wakeup — reasoning flag extended to
gemini-2.5models; 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 containsfunction_callparts; 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
defaultmodel to the user's chosen primary model instead of hardcodedgemini-2.5-flash - Moltbook get_own_posts — endpoint corrected from
/agents/me/poststo/me/posts - Ollama base URL — changed from
localhostto127.0.0.1to avoid IPv6 resolution issues
aion.py: unused imports removed,datetime.now()→datetime.now(UTC), helpers extractedcredentials.py: added_vault_set_field_sync,_vault_inject_all_sync,_KNOWN_VAULT_KEYS- Plugin hint messages updated: no longer reference
.env, point tocredential_writeinstead
- 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 (
desktopplugin) — 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, generatesAION_SELF_SUMMARY.mdin 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.mdtruncation 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
/telegramcommands - HTTPS Tunnel (
web_tunnelplugin) — cloudflared quick tunnel, no account needed
- Ctrl+C now terminates AION instantly —
os._exit(0)+ subprocess cleanup; uvicornCancelledErrorshutdown 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.exedetection, threading race conditions inplugin_loader,Path.home()crash in Docker - async/threading: scheduler loop, sub-session LRU, OAuth state expiry, contextvar reset
config_store.py— single thread-safe config module with atomic writes via temp fileAionMemorysingleton withasyncio.Lockfor all memory operationsfind_claude_bin()centralized inconfig_store— 3 duplicate implementations removed- CLI commands extracted to handler functions with
_CMD_PREFIX_DISPATCHtable _backup_code_file()helper replaces 3 identical backup blocks inaion.py
- README rewritten: 133 lines (was 811), AION vs. OpenClaw comparison, clear USPs
- New
docs/folder:configuration.md,api.md,plugins.md,messaging.md
_auto_character_update()rewritten: full rewrite every 5 conversations with fixed size cap (CHARACTER_MAX_CHARS=5000) — character evolves, never accumulates_compress_rules(): LLM compressesrules.mdwhen >15 KB, preserving all rules_generate_self_doc_summary(): generatesAION_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/✓ donetoasts via/api/eventsduring optimization
- 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
- 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"]=2includes all read_self_doc: loadsAION_SELF_SUMMARY.mdby default (~3–5 KB vs 63 KB);full=Truefor complete doc- New tool
generate_self_doc_summary: AION can regenerate summary on demand rules.mdtruncation guard:max_rules_chars(default 12,000) + smart auto-compression- Changelog opt-in:
system_prompt_show_changelog(default false) removes ~150 tokens/turn
- 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 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 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
$DISPLAYunset on Linux - Requires:
pip install pyautogui Pillow
_dispatch()checksretry_policyon 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()acceptsretry_policydict
- Removed dead
chat_turn()function (replaced byAionSession.stream()) run_aion_turn()now uses per-channelAionSessionregistry (no more_conversationsdict)aion_web.pydelegates_load_config/_save_configtoconfig_store.py(thread-safe)shell_tools.pyfallback usesMAX_MEMORYfromaioninstead of hardcoded300
AionMemory.get_context_semantic()— async semantic search via Ollamanomic-embed-textembeddings- 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)
- 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_envfield 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
- 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()callsctypes.SetConsoleModewithENABLE_VIRTUAL_TERMINAL_PROCESSINGbefore rendering the selector - File:
aion_launcher.py
- Pulls the latest version from GitHub and reinstalls in one step
- Runs
git pullfollowed bypip 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
- 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 updateinstruction - FastAPI endpoints:
GET /api/update-status,POST /api/update-trigger - AION tools:
update_status,check_for_updates - Configured via
AION_GITHUB_REPO=xynstr/aionin.env - File:
plugins/updater/updater.py
- Polls
/api/update-statuson 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
- If an update has been detected (from a previous daily check), a yellow notice is shown
before the mode selector on the next
aionstart - File:
aion_launcher.py
- Running
aionwithout flags now shows an arrow-key selector (↑↓ + Enter) - Options:
Web UI (http://localhost:7000)orCLI (terminal only) aion --webstarts Web UI directly (new flag),aion --clistarts CLI directly (unchanged)- Non-TTY fallback: numbered text input (1=Web / 2=CLI)
- File:
aion_launcher.py
- 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
- 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 languageparameter added to bothtranscribe_audioandaudio_transcribe_any- Files:
plugins/audio_transcriber/audio_transcriber.py,plugins/audio_pipeline/audio_pipeline.py - Requirements:
faster-whisper>=1.0.0added,voskremoved
onboarding.pyStep 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.jsonviawrite_config()and shown in the completion banner
aion config list— show all settings fromconfig.jsonaion config get <key>— read one settingaion 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/configcommand)
/config list,/config set,/config get,/config unsetavailable directly in chat- Settings take effect after server restart
model— active LLM modelcheck_model— cheap model for internal YES/NO checksmax_history_turns— history truncation limit (default: 40)tts_engine— TTS engine: edge / sapi5 / pyttsx3 / offtts_voice— TTS voice name (e.g.de-DE-KatjaNeural)thinking_level— reasoning depth: off / minimal / standard / deep / extremebrowser_headless— browser mode: true/false
_ensure_dependencies()was not called in the--setupbranch → missing packages causedonboarding.pyto 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
register_provider()used.append()without checking for existing entries → every plugin reload (hot-reload, server restart) added another copy- Fix: Added dedup by
prefixbefore appending; global registry is cleaned first - File:
aion.py
sendApproval()calledsendMsg()which was never defined anywhere → silent JS error- Fix: Replaced with direct
input.value = 'ja'; send();+ resetisThinking = falseto handle edge cases where the stream flag wasn't cleared yet - File:
static/index.html
- 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_textcontains "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
google-genaiwas missing fromrequirements.txt- Fix: Added
google-genai>=0.8.0 - File:
requirements.txt
/api/keysendpoint read fromos.environwhich includes Windows system environment variables — not just AION's.env- Fix: New
_read_env_file()helper reads only AION's.envdirectly; "set"-status is now based exclusively on.envcontent - File:
aion_web.py
aion_web.py __main__calledsys.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
/api/providersnow callslist_models_fn()per provider if registered (4s timeout, fallback to static list on error)register_provider()accepts new optionallist_models_fn=parameter- Gemini: fetches live model list from Google Gen AI API (
generateContentmodels 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
- 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*"])
- 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 overrideset_thinking_level("standard")— Set globallyget_control_settings()— Check current configuration
_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
✅ 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
ask_claude(prompt, context_files, task_type)— uses Claude.ai subscription viaclaude --print; no API key neededclaude_cli_login()— installs Claude Code CLI via npm if missing, opens browser for OAuthclaude_cli_status()— checks if CLI is installed + authenticatedget_task_routing()/set_task_routing()— reads/writestask_routinginconfig.json- Startup check reports CLI status when loading
- 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 automaticallyask_claudeuse - Configurable via Web UI System tab + onboarding step 8 +
set_task_routingTool
aion.py:collected_audioList parallel tocollected_images— collectsaudio_tts-resultsaion_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
_KEY_METAobject 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
- 4 fields: coding/review/browsing/default model
- Status display: Claude CLI installed + authenticated
- Save via
/api/config/settings(allowed set aroundtask_routingexpanded)
GET /api/audio/{filename}— Serve audio file from temp directoryGET /api/claude-cli/status— CLI installation and auth statusPOST /api/claude-cli/login— Start browser login
_tts_edge()added.mp3even though path already ended in.mp3→filename.mp3.mp3- Fix: explicit check before appending extension
- Voice reply was in
elifbranch → was skipped ifresponse_blockswas filled - Fix: Voice transmission moved into
if response_blocks:block, after all text/image blocks
- Badges, feature comparison, provider table (API-Key vs. subscription), REST-API reference
- Troubleshooting, LLM-loop diagram, Task Routing section
- Claude CLI Provider Plugin documented
- Audio Web UI Pipeline documented
- Keys Tab improvements documented
- New API endpoints documented
claude_cli_provideradded to plugin directory and tools table
- 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"
- Now returns first_line and last_line
- Hint recommends file_replace_lines with concrete line numbers
- file_replace_lines registered as preferred tool
- Explicit rule: 'old' in self_patch_code MUST be copied exactly
- 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
- 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
approvalsignals the frontend that buttons should be shown - Keyboard input ("yes"/"no") continues to work as fallback
schedule_addnow has anintervalparameter:"5m","30s","1h","2h30m"- In addition to fixed times, tasks can now be repeated at any interval
- Check interval: every 5 seconds (previously 10s)
- Send audio file as Telegram voice message (WAV, MP3, OGG …)
- Workflow:
audio_tts(text)→send_telegram_voice(path) - ffmpeg automatically converts to OGG OPUS
audio_transcribe_any(file_path)— any audio file → text (ffmpeg + Vosk, offline)audio_tts(text)— text → WAV audio file (pyttsx3/SAPI5, offline)
moltbook_get_feed,moltbook_create_post,moltbook_add_comment- Social presence on moltbook.com
- Plugin READMEs are read on load and displayed in the system prompt
- Each plugin needs a README.md with a brief description
- Messages are sent as HTML (no longer MarkdownV2)
- Markdown-to-HTML conversion (_md_to_html) built in
- OGG voice message → ffmpeg → Vosk → text → AION → TTS response
- Thread name check prevents second polling thread on plugin reload
- Removed entire gate mechanism (
_pending_code_action,_pending_needs_user_turn) - New system:
confirmedparameter inself_patch_code,self_modify_code,create_plugin - Without
confirmed: shows preview. Withconfirmed=true: executes. Stateless, loop-proof - Side effect: System prompt text leaked into output when message history was corrupted by loop
- 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-botremoved from optional installs (not used, caused conflicts)
- Startup check now accepts
GEMINI_API_KEYas alternative toOPENAI_API_KEY - Previously:
sys.exit(1)if no OpenAI key → crash for Gemini-only users
- start.bat terminates old processes more aggressively (second kill attempt, 12s wait)
- Backoff strategy: 12s → 14s → max 30s; log warning every 5 attempts
- clio_reflection.py → _clio_reflection.py (plugin loader ignores _ prefix)
- Reason: had fake random values (random.randint) instead of actual confidence calculation
- 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
- BEFORE calling self_patch_code/self_modify_code/create_plugin: ask user
- Flow: Read code → show changes → wait for approval → execute
## 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