feat(core): run session schedules as global background jobs
Moves schedule timers out of the per-Location plugin into a new global SessionSchedule service. Previously timers lived in the Location's plugin scope, so they stopped on server restart until something reloaded the Location, and stopped whenever the Location was evicted after 60 minutes of inactivity. Timers now live in the global service and call Session.prompt, which loads the Location on demand, so schedules fire even when the session is not open. - SessionSchedule persists entries in KV (session.schedule/<id>) and exposes set/remove/resume. A deleted session ends its schedule. - The managed server calls resume at boot next to restart continuity; unmanaged servers sharing the database do not restore schedules. - The opencode.schedule plugin now only registers /schedule and delegates to the service; the per-Location restore logic is removed. Verified: core and server typecheck; against an isolated managed-mode server, a 5s schedule fired every 5s, resumed after a restart with no client touching the session, and `/schedule off` stopped the boot-restored timer. Server tests: 3 OpenAI OAuth port tests fail identically without this change.
R
Ryan Vogel committed
a5ceab882ed8915d548d01a4b38e4b876eb2d514
Parent: e0709f8