v1.0.255
✨ New: Scheduled tasks are a task board
The sidebar clock no longer opens a 384px flyout — it opens the same full-viewport card grid as recent sessions, so the sidebar's two "things happening elsewhere" surfaces read alike. Drag-to-reorder is gone along with the single column; "drop at index 2" stopped meaning anything across three columns.
A task can now carry its instruction by reference. Set taskFile to an absolute path and the agent is told to read it at fire time, mutually exclusive with an inline message. The content is deliberately not inlined, so editing the file changes the next run instead of freezing at creation. A bad path fails while the dialog is still open, and is re-checked before every dispatch — otherwise a missing file burns a turn and the agent's polite "that file does not exist" reports as SUCCESS, which is the one outcome a scheduled task must not hide.
Cards now show the real prompt the agent will receive, computed server-side by the same builder the dispatcher calls, so a card cannot advertise a message that is never sent. File-backed tasks gain a preview, and every card gains a copy button. ESC unwinds preview → edit dialog → board instead of collapsing the whole stack at once.
Every card also carries an engine badge — including the claude default that the session lists hide as noise, since a task fires unattended and "which engine will run this" is exactly what the board should say. Recent sessions get the badge too: the engine field had been declared for ages and never written by anything, so it is now filled in at read time from the per-project session map.
Completed tasks get the full action row instead of just delete. Run-now and edit always worked server-side on a completed task; the buttons were simply never rendered.
🐛 Fix: sessions reopen as themselves
Opening a session from a list handed the new tab nothing but an id, so its engine, execution mode, model and per-session toggles all fell back to the defaults. A DeepSeek Built-in Agent session came back looking like Claude, and its next message would have been posted to the Agent SDK — which never wrote that transcript in the first place.
Engine and execution mode are now proven from the transcript's own store (which directory holds the file is a byproduct of the run, so it cannot be missing or wrong), and the remaining per-session settings are read from session.json on every open. One path covers every entry point: session list, recent, pinned, scheduled tasks, and cross-project handoffs that only ever carried an id.
🐛 Fix: a failed tool call no longer bricks a Built-in Agent session
A tool that threw — or whose input failed schema validation — emitted tool-error and never tool-result, leaving the call dangling in the transcript. On the next turn, replay dropped it, the assistant message it lived in became empty, and the provider rejected the entire request. Because replay runs every turn, the session was then unusable forever. One observed session had 108 tool calls and 54 results.
Failed calls now close with an error result, which also unsticks the UI that kept spinning while it waited for one, and replay flushes a turn as a single assistant message so existing broken transcripts heal on next use.
Scheduled fires now honor independent task as well. The toggle only ever existed in the browser's request body, so the scheduler — dispatching in-process with its own parameters — replayed the full transcript even for a session with the box ticked.
📦 Misc: UI polish
Placeholder text is pinned to one color by a single base rule. It had been declared three different ways across 23 inputs, and the muted-foreground variant resolved to one step below body text in dark mode, so those placeholders read as already-typed input.
Session overlays drop their backdrop blur to match the ~29 other overlays that dim with a plain scrim, and quick reply buttons now pick up the brand color on their border on hover, matching the toolbar above them.