v0.12.0 — .aegis.yaml + aegis config + ConfigPanel
Breaking
.aegis.pyremoved..aegis.yamlis now the single config substrate. Rewrite imperativeAgent(...)/queues = {...}/telegram_token = ...lines as YAML sections — see Configuration. Any.aegis.pyin the tree is ignored.aegis initretired. Bootstrap by launchingaegisin an empty directory (the TUI opens the ConfigPanel — pressato add an agent), or via the scriptable CLI:aegis config agent add <slug> --provider <…> --model <…>.
aegis config CLI surface
Idempotent subcommands for every authorable section of .aegis.yaml. Each writing verb routes through ruamel.yaml so existing comments + key order are preserved, validates the prospective body via the YAML loader before persisting, and fails loud on invalid input (the on-disk file is unchanged):
```
aegis config show [--json]
aegis config agent list / add --provider --model [--effort] [--permission] / remove
aegis config queue list / add --agent --max-parallel [--budget …]+ / remove
aegis config telegram show / set [--token --chat-id --auto-prompt + --clear-* variants]
aegis config default-agent
aegis config plugin-dir list / add / remove
```
--budget format: usd:1.00:1h or output_tokens:500000:1h (repeatable).
TUI ConfigPanel
New tab type. Stacks default-agent + agents/queues/telegram/plugin_dirs tables, re-reads .aegis.yaml on each refresh. Launching aegis with no .aegis.yaml mounts the panel as the only tab. F2 opens (or focuses) it from any other tab mid-session. Press a on the panel for an AddAgentModal that validates through the same add_agent helper the CLI uses.
Ctrl+, was the original mid-session binding but most terminals can't deliver it distinctly from , — F2 is the new home.
File picker — keyboard nav + unique-match bypass
- Up/Down/PgUp/PgDn move the highlight while focus stays in the Input (priority bindings).
- Top match is always preselected after each filter — Enter opens it without arrow keys.
- Escape is a priority binding so the Input can't swallow it.
- Indexer poll is one-shot; was running every 150ms forever and clobbering your typed query.
- Ctrl+click on a backtick token bypasses the picker entirely when the token resolves to a unique indexed file. Falls back to the prefilled picker, whose dismiss path now actually opens the file (the previous
push_screencall dropped the result).
File viewer — cancel-edit confirm bar
Escape in edit mode with unsaved modifications now shows a ⚠ unsaved edits — [d] discard / [esc] keep editing bar and parks the TextArea read-only so the bar's keystrokes don't get typed into the buffer. Clean buffer still exits edit mode silently.
1009 hermetic tests green. Full changelog: CHANGELOG.md.