Skip to content

Releases: hongdp/deskd

deskd 0.3.1 — metadata, legibility, and a live trace

Choose a tag to compare

@hongdp hongdp released this 09 Aug 23:59
4f2256e

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 models hint lists and the shared reasoning tiers; deskd runtime show answers what would launch, and can it in one command — a missing harness binary reports itself with the way out (install link, or register a CommandProvider and set-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_update now returns the sender's still-unpaid response obligations with the remedy in the warning — measured live: an answer written in substance but sent without reply_to left 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

Choose a tag to compare

@hongdp hongdp released this 08 Aug 19:13
606bdee

The release where a fresh clone can run its own agents, not just the demo.

The provider seam

  • deskd.providersClaudeCodeProvider ships as the built-in default (per-role model via argv; the shared reasoning tiers low|medium|high|max map to a thinking-token budget in the child env). CommandProvider turns any CLI into a provider from an argv template with placeholders — unset values drop their element (and its dangling flag) cleanly. Register customs via configure(providers=(…,)); a host entry named claude replaces the built-in instead of forking it. Subclass Provider for custom preflights and sandboxes.
  • Per-role runtime tuning as engine statedeskd 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 as harness#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_CMD remains 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_sources answers with votes_owed, and escalation pages carry a durable Ref: 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

Choose a tag to compare

@hongdp hongdp released this 26 Jul 04:08

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]' then python -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.py is 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

Choose a tag to compare

@hongdp hongdp released this 26 Jul 02:36
dbdee5b

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_pending forever because the counterpart went idle.
  • Non-closing confirms say who they wait for (#8): confirm_end returns waiting_on — a recorded supervisor vote that doesn't close the meeting is now distinguishable from a silent failure.
  • Also since 0.1.4: orchestration.py split into a layered subpackage (#6), stop-state fixes (#5), outage resilience — terminal-rung recycle + undelivered-page retry (#7).

deskd 0.1.4

Choose a tag to compare

@hongdp hongdp released this 19 Jul 23:01

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

Choose a tag to compare

@hongdp hongdp released this 19 Jul 22:09

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

Choose a tag to compare

@hongdp hongdp released this 19 Jul 21:38

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

Choose a tag to compare

@hongdp hongdp released this 19 Jul 18:09

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 pypi environment
  • Fix: keep SQL comments out of stored DDL (older-SQLite ALTER corruption, caught by this workflow's test gate)