AI Channel Regular, Ollama & BOTLINK v2
v0.5.0 reshapes ai-chat into a true channel regular — character engine, ambient participation, mood, on-demand games — adds an Ollama provider for self-hosted setups, hardens the BOTLINK handshake against replay, and closes 10 findings from a post-incident stability audit.
Added
!ai character <name>provider between gemini and ollama with a plugin reload.txt into games/ and play it via !ai play <name>; ships with 20 Questions and TriviaNickServ GHOST + reclaim when the configured nick is taken on connectChanged
- BOTLINK v2 handshake — HMAC challenge-response replaces the replay-able scrypt wire token; every botnet must share a
link_saltinbot.json - Hub-side BSAY re-check — fanout re-runs the originating user's
+mpermission so a compromised leaf can't bypass it - System-prompt assembly restructured — explicit Persona / Right now / Rules sections with non-overridable safety clause; defense-in-depth dropper for fantasy-command prefixes
Breaking
- `!ai` freeform removed — talk to the bot by nick (
<botnick>: hello);!aiis now a subcommand console with!ai help - ai-chat private messaging removed — the plugin responds only in channels — PMs were a reconnaissance vector for prompt-injection probes
- `triggers.engagement_seconds` removed — replaced by
engagement.soft_timeout_minutesandengagement.hard_ceiling_minutes
Fixed
- 2026-04-21 stability audit — 10 findings closed from the post-incident review of a 12+ hour outage where silent SASL failure left the bot unidentified and op-less
- SASL silent failure — NickServ "please identify" notice now triggers a one-shot password fallback and surfaces
bot:identifiedon confirmation - Ambient tick-loop crash recovery — wrapped in try/catch so a transient bug surfaces in the log instead of silently disabling ambient for the process lifetime
- Engagement map leak — eviction TTL with an unconditional 1000-entry cap so stale entries can't pin below the cap indefinitely
See CHANGELOG.md for the full list of changes.