otaku 0.1.2
Hardening release: complete state-dir isolation, never-overwrite key handling, and REPL quality-of-life.
Fixed
OTAKU_CONFIG_DIRis now fully isolated. Previously a custom state dir
wrote a config pointing at the default~/.otaku/history.db, and — much
worse — its first run replaced the shared OS-keychain key, making the
primary setup's history permanently undecryptable. Each dir now gets its own
default database and its own keychain item; the default~/.otakukeeps the
legacy item name, so existing installs keep unlocking.- Unlock failures no longer stutter ("Could not unlock encryption key: could
not unlock…") and a key mismatch is spelled out instead of surfacing as an
empty error. /rememberno longer risks dropping other models' saved defaults when
model_defaults.jsonis corrupt — it refuses instead, and writes atomically.
Changed
- Key setup never overwrites anything. Provisioning reuses an existing
keychain orretrieve_commandkey instead of replacing it, keychain writes
are add-only, andkeys.jsonis created exclusively — so deleting
keys.jsonno longer burns the key, and a restored backup keeps working.
A stray pre-envelopehistory.keyis left in place rather than deleted. - Bare
otakuunlocks encryption before the model picker, so interactive
key ceremonies (passphrase,commandproviders) happen up front. /historyrows fall backtitle → summary → first prompt.- Config paths in notices are shown
~-shortened; shorter-nrbanner.
Added
/modelremembers the switched-to model as the last used one (the picker
preselects it next time).[defaults].verbose— set the stats line globally (a session-wide UI
preference; deliberately not per-model, so/rememberdoesn't pin it).