**Repo**: `coder/coder` **Scope**: Add coderd agent endpoint for shutdown scripts to POST log snapshots. **Changes**: - Add `POST /api/v2/workspaces/{workspace}/agents/me/tasks/{task}/snapshot?format=agentapi` endpoint - Request body: raw AgentAPI payload for `format=agentapi` (clients do not send the DB wrapper) - Validate: task belongs to workspace, payload ≤ 64KB, decodes as AgentAPI payload schema - Store in `task_snapshots` table (upsert, overwrite on each pause): - `log_snapshot` wrapper: `{"format":"agentapi","data":<raw_payload>}` - Uses workspace agent token for auth **Files**: - `coderd/aitasks.go` (or new `coderd/aitasks_snapshot.go`) - `codersdk/aitasks.go` - `coderd/coderd.go` (route registration) **Acceptance criteria**: - [ ] Endpoint accepts valid snapshot and returns 204 - [ ] Validates `format` query parameter (currently only `agentapi` supported) - [ ] Rejects payloads > 64KB with 400 - [ ] Rejects invalid task/workspace combinations with 404 - [ ] Overwrites existing snapshot for same task - [ ] Uses agent token auth - [ ] Stores snapshot in DB wrapper format: `{"format":"agentapi","data":<raw_payload>}` **Dependencies**: - #1250 <!-- Issue 1 --> - coder/coder#19467 **References**: - [PRD: Start/Pause/Resume the Task Workspace](https://www.notion.so/coderhq/Start-Pause-Resume-the-Task-Workspace-2aad579be59280e5a15ef6bb6a93f246) - [RFC: Tasks: Start/Pause/Resume Lifecycle](https://www.notion.so/coderhq/Tasks-Start-Pause-Resume-Lifecycle-2cdd579be592805a929fc36d0c82d65d): Log Snapshots, API Changes
Activity
feat(coderd): add task log snapshot storage endpoint (#21644)