v0.6.3: Quiet hours fix, cron delivery race, Windows fixes
ductor v0.6.3
Hotfix release addressing quiet hours inheritance bug, cron result delivery race, Windows timezone crash, and Windows upgrade pipeline issues discovered after v0.6.0.
Quiet hours fix (v0.6.3)
Cron jobs and webhooks without explicit quiet_start/quiet_end were incorrectly inheriting the heartbeat quiet window (default 21:00–08:00), silently skipping execution even when no quiet hours were intended.
- Cron: Jobs now only respect quiet hours explicitly set on the job itself.
- Webhook: Same fix — hook-level quiet hours only.
- Heartbeat: Unchanged, correctly uses its own config.
Cron result delivery fix (v0.6.2)
Cron job results were silently dropped under two conditions:
- Race condition: Result delivery happened AFTER
update_run_status()wrote tocron_jobs.json. The file-watcher could detect the change, trigger a reschedule, and cancel the running task — before the Telegram message was sent. Results are now delivered before the file write. - Deleted job guard:
if self._on_result and job:silently dropped results whenget_job()returnedNone(e.g., after a manager reload). Removed thejobdependency — delivery now uses the title captured at execution start. - Unhandled exceptions:
_run_atonly caughtCancelledError, so any unexpected exception in_execute_jobsilently lost the result and prevented rescheduling. Now catches and logs all exceptions.
Windows timezone fix (v0.6.1)
On Windows, Python's zoneinfo requires the tzdata PyPI package (no system IANA database). Without it, all ZoneInfo() calls fail — crashing cron scheduling and quiet hour checks.
tzdata>=2024.1added as core dependency.- Crashproof UTC fallback:
resolve_user_timezone()can now never raise.
Windows upgrade pipeline fix (v0.6.1)
pipx upgrade fails on Windows with PermissionError because the running bot process locks ductor.exe.
- Windows: Uses
pipx runpipinstead ofpipx upgrade. - Always verify version: Checks installed version after upgrade regardless of exit code.
v0.6.0 features (included)
WebSocket API server (beta)
New direct connection transport alongside Telegram — designed for the upcoming ductor mobile app.
- E2E encryption: NaCl Box (Curve25519 + XSalsa20-Poly1305) with ephemeral keypairs per connection. Forward secrecy by design.
- Bearer-auth HTTP endpoints:
/files(list),/files/<path>(download),/upload(multipart). - Gated behind explicit opt-in:
ductor api enable/ductor api disable. - Zero coupling: The
api/module never imports frombot/.
Docker host directory mounts
Mount host project directories into the Docker sandbox so the LLM can work on your code. (#12)
- Config:
docker.mountslist — paths mounted at/mnt/<basename>. - CLI:
ductor docker mount/unmount/mounts. - Cross-platform:
~and$ENV_VARSexpanded. Collision handling with automatic suffixes.
Files module
Shared file handling for Telegram and API transports.
- Magic-bytes MIME detection via
filetypewith extension fallback. - Video/audio native upload with document fallback.
Background tasks
/bg command for fire-and-forget tasks with notification delivery.
DRY refactor
8 new shared modules extracted: text/response_format, infra/file_watcher, infra/task_runner, infra/json_store, infra/service_base, infra/base_observer, cli/model_cache, cli/executor. 2324 tests passing.
Other v0.6.0 changes
- Upgrade pipeline with retry and version verification
- Abort word expansion (
esc,hold,aufhören) - GitHub issue templates
- Fail-closed
file_access,/stop@botnamesupport - CancelledError propagation fix, shutdown kills active CLI processes
- Async stdin feed for CLI providers (Windows ProactorEventLoop fix)
Upgrade
ductor upgrade
# or
pip install --upgrade ductor