v0.14.0
ductor v0.14.0
Matrix support, modular messenger architecture, and the /interrupt command.
Matrix Transport
ductor now runs on Matrix alongside Telegram. Use it as your only transport or run both in parallel — same agent, same workspace, same sessions.
- Segment-based streaming — responses arrive as separate messages, clean and readable
- Reaction buttons — emoji digits (1️⃣–🔟) replace Telegram's inline keyboards, with text input fallback
- Incoming media — images, audio, video, and files are downloaded and injected into the conversation
- Full command parity — every command works with both
!cmdand/cmdprefix - Auth model — room allowlist + user allowlist + group_mention_only support
- Auto-join/leave — invited to an allowed room? Joined. Unauthorized? Rejected and left.
ductor install matrix # install matrix-nio dependencyThen add to config:
{"transports": ["telegram", "matrix"]}Setup guide: docs/matrix-setup.md
Modular Messenger Architecture
The entire bot layer has been restructured into a transport plugin system. The core (orchestrator, sessions, CLI, cron, webhooks) never knows which messenger delivered the message.
BotProtocol— runtime-checkable interface that every transport implementsTransportRegistry— factory dict for bot creation, lazy importsMultiBotAdapter— runs multiple transports in parallel on a shared orchestratorSessionKey— transport-prefixed persistence keys (tg:123vsmx:456) prevent session collisionsMessengerCapabilities— feature matrix per transport (streaming style, button support, etc.)
Adding a new messenger (Discord, Slack, Signal, ...) means implementing BotProtocol in a new sub-package. Guide: docs/modules/messenger.md
/interrupt — Soft Interrupt
New command for when you don't want to nuke everything.
| Command | What it does |
|---|---|
/interrupt |
Sends SIGINT to the current process. Queued messages continue. |
/stop |
Kills the current process and discards all queued messages. |
/stop_all |
Kills everything — all messages, sessions, tasks, all agents. |
Trigger words: esc, interrupt, skip, überspringen
Works across Telegram (private, groups, topics), Matrix rooms, sub-agent chats, and named sessions.
Bug Fixes
- Bot no longer responds to
/command@other_bot(#36) — in group chats with multiple bots, commands addressed to another bot are now correctly ignored - Codex Docker stdin on Windows (#40) —
docker exec -ikeeps stdin open so prompts reach the CLI - Docker container paths (#38) —
/ductor/...paths from inside the container are translated to host paths for file sending - Matrix message replay — sent events are tracked to prevent duplicate processing after reconnect
- Matrix
/stop_all— now correctly interrupts across all transports, not just the current one
Documentation
- New Matrix setup guide with step-by-step instructions
- Group setup tip: how to use
/whereto find and add group IDs - Expanded
config.example.jsonwith all features - Updated all module docs for the new messenger architecture
Community
- PR #29 by @n-haminger — Matrix transport implementation. Merged and restructured into the modular plugin system.
- PR #37 by @liuh886 — Group command filtering and Windows Docker fixes. Ported into the restructured codebase.
Upgrade
ductor upgrade
# or
pipx upgrade ductor