Releases: littlebearapps/untether
v0.24.0
What's Changed
- feat: agent preamble, post-outline approval, URL updates by @nathanschram in #24
Full Changelog: v0.23.5...v0.24.0
v0.23.5
What's Changed
- docs: comprehensive documentation audit and upgrade by @nathanschram in #20
- feat: enrich error reporting in Telegram and structlog by @nathanschram in #19
Full Changelog: v0.23.3...v0.23.5
v0.23.3
Fixes
- Add
rate_limit_eventto Claude stream-json schema (CLI v2.1.45+)- New
StreamRateLimitMessageandRateLimitInfomsgspec structs - Event is decoded cleanly and silently skipped (informational only)
- Eliminates noisy
jsonl.msgspec.invalidwarning in logs
- New
Full changelog: v0.23.2...v0.23.3
What's Changed
- fix: add rate_limit_event to Claude stream-json schema by @nathanschram in #6
Full Changelog: v0.23.2...v0.23.3
v0.23.2
Fixes
- Fix crash when Claude OAuth credentials file missing (macOS Keychain, API key auth)
_maybe_append_usage_footer()now catchesFileNotFoundErrorandhttpx.HTTPStatusError- Post-run messages are delivered to Telegram even when usage data is unavailable
- Add macOS Keychain support for
/usagecommand and subscription usage footer- On macOS, Claude Code stores OAuth credentials in the Keychain, not on disk
_read_access_token()tries the file first, then falls back to macOS Keychain viasecurity find-generic-password
Full changelog: v0.23.1...v0.23.2
What's Changed
- fix: handle missing OAuth credentials on macOS (Keychain support) by @nathanschram in #5
Full Changelog: v0.23.1...v0.23.2
v0.23.1
Highlights
📋 Structured startup message — every status field now appears on its own line, always visible. Projects listed by name, plus voice and files status at a glance.
Changes
- Restructure startup message: one field per line, always show all status fields
- List project names instead of count
- Always show mode, topics, triggers, resume lines, voice, and files status
- Add voice and files enabled/disabled status
- Update PyPI description and keywords to reflect current feature set
Links
- PyPI: untether 0.23.1
- Full changelog: v0.23.0...v0.23.1
v0.23.0
Highlights
🏷 Model & mode footer — every completed message now shows the model and permission mode in the footer (e.g. 🏷 sonnet · plan). All four engines populate model info.
🐶 Compact startup message — version number, project count, and conditional diagnostics. Only shows mode/topics/triggers/engines when they carry signal.
🔀 Callback query routing — Telegram callback queries now route to command backends via command_id:args... format, enabling plugins to build interactive UX with inline keyboards.
Changes
- Refresh startup message: dog emoji, version number, conditional diagnostics, project count
- Only shows mode/topics/triggers/engines lines when they carry signal
- Removes
resume lines:field (config detail, not actionable)
- Add model + permission mode footer on final messages (
🏷 sonnet · plan)- All 4 engines (Claude, Codex, OpenCode, Pi) populate
StartedEvent.metawith model info - Claude also includes
permissionModefromsystem.init - Codex/OpenCode use runner config since their JSONL streams don't include model metadata
- All 4 engines (Claude, Codex, OpenCode, Pi) populate
- Route Telegram callback queries to command backends
- Callback data format:
command_id:args...routes to registered command plugins - Extracts
message_thread_idfrom callback for proper topic context - Enables plugins to build interactive UX with inline keyboards
- Callback data format:
Links
- PyPI: untether 0.23.0
- Full changelog: v0.22.2...v0.23.0
v0.22.2
What's Changed
- feat: interactive enhancements — AskUserQuestion, export, browse, cost, triggers by @nathanschram in #1
- feat: public release — docs, PyPI metadata, GitHub templates by @nathanschram in #2
New Contributors
- @nathanschram made their first contribution in #1
Full Changelog: v0.1.0...v0.22.2