Skip to content

v0.14.0

Choose a tag to compare

@PleasePrompto PleasePrompto released this 11 Mar 05:09
· 170 commits to main since this release

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 !cmd and /cmd prefix
  • 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 dependency

Then 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 implements
  • TransportRegistry — factory dict for bot creation, lazy imports
  • MultiBotAdapter — runs multiple transports in parallel on a shared orchestrator
  • SessionKey — transport-prefixed persistence keys (tg:123 vs mx:456) prevent session collisions
  • MessengerCapabilities — 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 -i keeps 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 /where to find and add group IDs
  • Expanded config.example.json with 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