Files

52 lines
2.5 KiB
Markdown

# Desktop runner for Den-scheduled Automations
## Outcome
Den remains the durable scheduler and source of truth for Automation schedules,
occurrences, leases, notification cursors, ordered events, usage, and terminal
results. Den no longer launches OpenCode or stores an Automation execution
runtime in its container.
An authenticated desktop installation registers as a `desktop` runner and
maintains a Server-Sent Events stream. SSE carries only a wake-up type and a
resumable notification cursor. After connecting or receiving a wake-up, the
desktop discovers work over HTTP, atomically claims one occurrence, and reports
attempt-bound heartbeats, ordered events, cancellation, usage, and completion.
When a runner has no pending notifications, Den exponentially backs its cursor
query off from one second to 15 seconds. The poll resets to one second after
activity, and its sleep is capped by the existing 15-second presence keepalive.
This preserves the resumable SSE and bounded claim protocol while reducing an
idle runner's steady-state notification queries from 60 to four per minute.
The claimed Automation runs as a normal visible local OpenWork thread in the
desktop's active workspace. It uses the selected model and the same local
OpenCode tool and integration experience as a thread started by the user.
## Offline behavior
Scheduled desktop occurrences have a bounded claim window. If no eligible
desktop claims one before its deadline, Den durably records `skipped` with
`runner_unavailable`; the app displays **Missed — desktop runner unavailable**.
Run now fails immediately with **No desktop runner is online** while no desktop
SSE connection is present.
## Focused proof
The 2026-08-04 packaged macOS candidate was connected to the local Den test
profile and produced both required outcomes:
- `Desktop visible thread E2E 08:45:31` succeeded as a normal sidebar thread,
with result `DESKTOP_VISIBLE_THREAD_OK`, ordered user/assistant/usage/terminal
events, and token usage stored in Den.
- `Disconnected desktop final 08:46:51` was not claimed and became the explicit
missed desktop-runner-unavailable receipt. Run now while disconnected returned
the explicit no-runner-online response.
## Deferred hardening
Repository-wide suites, cross-platform packaged proof, multi-replica online
presence, exhaustive reconnect/race testing, fault injection, and broader
security review remain follow-up work. A future `sandbox` target can extend the
execution-target contract; it is not implemented here.