feat: implement tier 1 quick wins (tool groups, typing, pruning, verbose, think)

Five additive features with no breaking changes:

- Tool groups: group:fs, group:runtime, group:web, group:memory syntactic
  sugar for allow/deny lists in tool policy config
- Typing indicators: Discord sendTyping() and WhatsApp sendStateTyping()
  on message receipt for better UX feedback
- Session pruning: TTL-based auto-cleanup via sessions.ttl config with
  hourly daemon timer and SQLite GROUP BY pruning
- /verbose command: TUI command parser toggle for raw streaming display
- !!think prefix: per-message extended thinking mode wired through
  Anthropic (budget_tokens), OpenAI/GitHub (reasoning_effort), and
  Gemini (thinkingConfig) providers

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
William Valentin
2026-02-07 13:35:00 -08:00
parent 6bb424cddc
commit 1c2f54fae3
19 changed files with 563 additions and 20 deletions
+7
View File
@@ -196,6 +196,13 @@ export class DiscordAdapter implements ChannelAdapter {
}
}
// Send typing indicator (lasts 10 seconds, no need for interval)
try {
if ('sendTyping' in message.channel) {
(message.channel as any).sendTyping();
}
} catch { /* ignore typing errors */ }
// Strip bot mention from the message text
const text = message.content.replace(/<@!?\d+>/g, '').trim();
+2
View File
@@ -287,6 +287,8 @@ export class SlackAdapter implements ChannelAdapter {
}
}
// Note: Slack doesn't expose a typing indicator API for bots
// Build peer ID: channelId:threadTs (thread-aware)
const threadTs = message.thread_ts ?? message.ts ?? '';
const peerId = `${channelId}:${threadTs}`;
+6
View File
@@ -236,6 +236,12 @@ export class WhatsAppAdapter implements ChannelAdapter {
}
}
// Send typing indicator
try {
const chat = await (message as any).getChat();
await chat.sendStateTyping();
} catch { /* ignore typing errors */ }
// Strip bot mention from message body for group messages
let text = message.body ?? '';
if (isGroup && this.botId) {