Releases: hongdp/deskd
Release list
deskd 0.3.1 — metadata, legibility, and a live trace
Three quality-of-console releases riding one version, all born from a production desk's supervisor reviews this weekend.
Runtime, visible and tunable (#28)
- Providers publish
modelshint lists and the shared reasoning tiers;deskd runtime showanswers what would launch, and can it in one command — a missing harness binary reports itself with the way out (install link, or register aCommandProviderandset-provider). - The console gains a seventh view:
/runtime— per-role provider/model/thinking with pickers synced from provider metadata, preflights surfaced verbatim, session ownership, and supervisor-gated writes on the same access-code boundary as every other console action. - Effect timing told truthfully: sessions are turn-per-process, so model and reasoning apply on the role's next turn; only provider waits for the next new session (cross-provider resume guard).
Meetings you can read, ledgers that speak up (#29)
- Transcripts render agent prose as prose: an escape-first markdown subset (bold, inline code, lists, tables) replaces the wall of literal asterisks.
send_updatenow returns the sender's still-unpaid response obligations with the remedy in the warning — measured live: an answer written in substance but sent withoutreply_toleft its debt pending and paged a human twice.
A live tool trace on the board (#30)
orchestration.tool_trace()+agent_sessions.last_tool: hosts mirror the harness's tool stream from their in-session hook, and the board's "Now executing" moves at tool speed. Shown only while fresh (120s) — a stale "doing X" is a lie with a timestamp, so the engine hides it rather than trusting consumers to check ages.
Upgrade: pip install -U "deskd[web]". Additive throughout; hosts that ignore every new surface behave exactly as before.
deskd 0.3.0 — the provider seam
The release where a fresh clone can run its own agents, not just the demo.
The provider seam
deskd.providers—ClaudeCodeProviderships as the built-in default (per-role model via argv; the shared reasoning tierslow|medium|high|maxmap to a thinking-token budget in the child env).CommandProviderturns any CLI into a provider from an argv template with placeholders — unset values drop their element (and its dangling flag) cleanly. Register customs viaconfigure(providers=(…,)); a host entry namedclaudereplaces the built-in instead of forking it. SubclassProviderfor custom preflights and sandboxes.- Per-role runtime tuning as engine state —
deskd runtime show | set-provider | set-model | set-reasoning <value|default> --role R, stored on the registry row, validated at set time. Model/thinking differ per role on purpose. deskd agent run | command | session-provider— the driver arm. Enforces the invariants every driver must keep: sessions never resume under a provider that did not create them (owner recorded asharness#provider; the new provider takes over at the next cold spawn); roles with no declared tool grant get the driver's fail-closed default; preflight refusal exits 75 and leaves the demand pending; sessions are parked after a turn, not ended. The reference cron driver now launches through this seam (DESKD_AGENT_CMDremains as the deprecated raw-command path).
Wake-ladder honesty (since 0.2.x)
- An unpaid termination vote names itself: wake labels and human-rung pages say "your vote closes it",
wake_sourcesanswers withvotes_owed, and escalation pages carry a durableRef:that outlives self-healing demands. - Escalations can be answered: asks are demands on someone, not telemetry; a rejection is a demand on the proposer.
- Wake generations, resumable meetings, console static revalidation, vacated-desk rendering, and a host-extensible console nav.
Upgrade: pip install -U "deskd[web]". New public modules only — no breaking changes; existing hosts keep their own drivers until they opt into the seam.
deskd 0.2.0 — the market-readiness release
Feature release. Highlights:
- Six-view console on one design system (light+dark, zero build): Board with linked KPI tiles and an always-visible alarm row, Agent detail, Meetings with day navigation and termination votes, and three views for state that previously had no surface at all — Wake ladder (rung wiring, demand trajectories, attempt history), Escalations (the human-rung ledger: queued/sent/failed, channel health), Tasks & hooks.
examples/support_desk— a runnable demo with zero LLM/API keys: three scripted agents drive the real engine while you watch the console; an agent goes silent and the wake ladder climbs to the human rung on camera.pip install 'deskd[web]'thenpython -m examples.support_desk.run_demo.meetings/subpackage: the 2248-line meetings.py split into a layered package (store / obligations / escalations / sweep / lifecycle / messaging / termination / views / supervisor) behind a compatibility facade — a pure move, verified function-by-function;supervisor.pyis the seed of the roadmap's supervisor-boundary extraction.- README overhaul (theme-aware screenshots, 60-second quickstart, architecture diagrams, honest comparison), CI workflow, packaging metadata.
- Console hotfix: meeting-sidebar overflow on long agendas (#10).
402 tests. No breaking API changes — the meetings facade re-exports everything the old module did.
deskd 0.1.5
Reliability release.
- Termination votes are wake demand (#8): proposing a meeting's end now wakes every other required attendee to vote; casting the vote settles the wake; closing a meeting settles every pending wake request; the sweep re-arms parked votes after the meeting's wait timeout. A meeting can no longer sit in
termination_pendingforever because the counterpart went idle. - Non-closing confirms say who they wait for (#8):
confirm_endreturnswaiting_on— a recorded supervisor vote that doesn't close the meeting is now distinguishable from a silent failure. - Also since 0.1.4:
orchestration.pysplit into a layered subpackage (#6), stop-state fixes (#5), outage resilience — terminal-rung recycle + undelivered-page retry (#7).
deskd 0.1.4
Two fixes from a live incident — a normal-priority meeting on a quiet desk took 17 minutes to convene (#4).
A meeting invitation is a wake demand. call_meeting now arms meeting_wake_requests for invited agents at call time regardless of priority (previously urgent-only; a normal call had no path to its invitees except the attendance-timeout sweep). Machine rungs only — no escalation for a normal call; urgency keeps its immediate human escalation on top.
The meeting SLA clocks tick on the planning tick. New public meetings.sweep_timeouts(); plan_wakes runs it every record-mode tick, so the attendance-timeout and stale-attendee clocks advance once a minute instead of only when some session happens to read a meeting. Dry ticks stay inert.
Call→check-in on a quiet desk drops from ~17 min to ~1–2 min. No API breaks; no schema changes.
deskd 0.1.3
Roadmap P2, two of four items (#3).
The ledger is not the transport. New deskd.channels module owns the pluggable egress half — EscalationChannel / CallableChannel, the registry, deliver(), the outbox fallback. deskd.meetings re-exports every historical name (same objects, one registry), so hosts that registered channels through it keep working unchanged.
The terminal rung is not a UI. Arrival at any leaves_machine rung writes a durable wake_escalations row — once per rung climbed, for every reason kind — inside the planning transaction, and mirrors it out through the registered channels after commit. Closes the live gap where only meeting wakes escalating past the machine reached a person. The reference driver's human branch is now log-only; host drivers with their own meeting-specific branch should drop it or meeting wakes escalate twice.
Wired-rung visibility. board().health gains channels (per-channel availability + outbox marker), human_rung_unwired, and undelivered_escalations.
Schema: new wake_escalations table, created automatically on connect. Plans gain a top-level escalations list. No API breaks.
deskd 0.1.2
Roadmap P1 — authority as a first-class dimension (#2).
Declaration → enforcement. Wake-plan actions and rollovers carry each role's registry declaration (capabilities + authority); the reference driver maps authority["allowed_tools"] to the session's --allowedTools per role. The global DESKD_WAKE_ALLOWED_TOOLS default now covers only roles that declare nothing. The engine declares; the harness enforces.
Capability-addressed routing. New inbox_route() / deskd inbox route: enqueue to whichever enabled role declares the required capability (fewest un-acked items, name tie-break; presence-independent). A demand no enabled role may take is unroutable — the ladder's overdue state on the authority axis: recorded durably in the new unroutable_demands table (inbox dedup contract, keyed on the capability), surfaced via board().health.unroutable_demands, and re-routed automatically by the first planning tick in which a qualifying role exists.
Schema: new unroutable_demands table, created automatically on connect. No API breaks; plans gain fields (actions[].capabilities/authority, top-level routed), drivers written against 0.1.1 keep working.
deskd 0.1.1
First release published via PyPI Trusted Publishing (OIDC, no long-lived token).
- Published on PyPI:
pip install "deskd[web]" - README: PyPI install instructions
- CI: release workflow — test (3.11 + 3.13) → build → publish via the
pypienvironment - Fix: keep SQL comments out of stored DDL (older-SQLite ALTER corruption, caught by this workflow's test gate)