feat(coder): boulder state — cross-session plan persistence + auto-resumption
New plans table (id, project_id, title, description, status, flow_run_id, progress_pct, items_total, items_completed, metadata, timestamps) with CHECK constraints and indexes. Plan store (plan-store.ts): createPlan, getPlan, listPlans, listActivePlans, updatePlan, updatePlanFromRun, findPlanWithRunningRun, planStatusFromRun. Flow-runner integration: onRunTerminal callback fires on every terminal transition (complete/fail/cancel) and updates linked plans automatically. 5 API endpoints: GET /api/plans, GET /api/plans/active, GET /api/plans/:id, POST /api/plans, PATCH /api/plans/:id. 484 tests pass, build clean.
This commit is contained in:
@@ -438,3 +438,31 @@ CREATE TABLE IF NOT EXISTS flow_step_events (
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS flow_step_events_run_idx ON flow_step_events(run_id);
|
||||
|
||||
-- v2.9.0: Boulder state — cross-session plan persistence with auto-resumption.
|
||||
-- project_id carries no FK (matches tasks/fow_runs convention).
|
||||
-- flow_run_id links the plan to an in-flight orchestrator run for auto-tracking.
|
||||
CREATE TABLE IF NOT EXISTS plans (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
project_id UUID NOT NULL,
|
||||
title TEXT NOT NULL,
|
||||
description TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
flow_run_id UUID REFERENCES flow_runs(id) ON DELETE SET NULL,
|
||||
progress_pct INTEGER NOT NULL DEFAULT 0,
|
||||
items_total INTEGER NOT NULL DEFAULT 0,
|
||||
items_completed INTEGER NOT NULL DEFAULT 0,
|
||||
metadata JSONB,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
|
||||
CONSTRAINT plans_status_chk CHECK (status IN ('active', 'completed', 'cancelled', 'failed')),
|
||||
CONSTRAINT plans_progress_chk CHECK (progress_pct >= 0 AND progress_pct <= 100),
|
||||
CONSTRAINT plans_items_chk CHECK (items_total >= 0 AND items_completed >= 0 AND items_completed <= items_total)
|
||||
);
|
||||
|
||||
-- Plan queries by project and status.
|
||||
CREATE INDEX IF NOT EXISTS plans_project_status_idx ON plans(project_id, status);
|
||||
-- Fast lookup of the plan owning a flow run (for onRunTerminal updates).
|
||||
CREATE INDEX IF NOT EXISTS plans_flow_run_id_idx ON plans(flow_run_id);
|
||||
-- Plans sorted by recency (for "resume from last" surface).
|
||||
CREATE INDEX IF NOT EXISTS plans_project_created_idx ON plans(project_id, created_at DESC);
|
||||
|
||||
Reference in New Issue
Block a user