fix(coder): CASCADE delete on session_worktrees + agent_sessions FKs
Deleting a session with linked session_worktrees or agent_sessions rows threw a FK violation (500 on DELETE /api/sessions/:id). Both FKs now ON DELETE CASCADE. Idempotent migration: drops the old constraint and re-adds with CASCADE only if confdeltype != 'c'. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -78,15 +78,27 @@ ALTER TABLE tasks ADD COLUMN IF NOT EXISTS feature_values JSONB;
|
|||||||
|
|
||||||
-- v2.6: one shared worktree per session (all agents/panes in the session operate in it).
|
-- v2.6: one shared worktree per session (all agents/panes in the session operate in it).
|
||||||
CREATE TABLE IF NOT EXISTS session_worktrees (
|
CREATE TABLE IF NOT EXISTS session_worktrees (
|
||||||
session_id UUID PRIMARY KEY REFERENCES sessions(id),
|
session_id UUID PRIMARY KEY REFERENCES sessions(id) ON DELETE CASCADE,
|
||||||
worktree_path TEXT NOT NULL,
|
worktree_path TEXT NOT NULL,
|
||||||
base_commit TEXT,
|
base_commit TEXT,
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
|
created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
|
||||||
);
|
);
|
||||||
|
-- Migrate existing FK to CASCADE (idempotent: drops the old constraint if present).
|
||||||
|
DO $$ BEGIN
|
||||||
|
IF EXISTS (
|
||||||
|
SELECT 1 FROM pg_constraint
|
||||||
|
WHERE conname = 'session_worktrees_session_id_fkey'
|
||||||
|
AND confdeltype <> 'c'
|
||||||
|
) THEN
|
||||||
|
ALTER TABLE session_worktrees DROP CONSTRAINT session_worktrees_session_id_fkey;
|
||||||
|
ALTER TABLE session_worktrees ADD CONSTRAINT session_worktrees_session_id_fkey
|
||||||
|
FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
-- v2.6: one backend session per (session, agent); resumed on switch-back.
|
-- v2.6: one backend session per (session, agent); resumed on switch-back.
|
||||||
CREATE TABLE IF NOT EXISTS agent_sessions (
|
CREATE TABLE IF NOT EXISTS agent_sessions (
|
||||||
session_id UUID NOT NULL REFERENCES sessions(id),
|
session_id UUID NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
||||||
agent TEXT NOT NULL,
|
agent TEXT NOT NULL,
|
||||||
backend TEXT NOT NULL,
|
backend TEXT NOT NULL,
|
||||||
agent_session_id TEXT,
|
agent_session_id TEXT,
|
||||||
@@ -99,6 +111,19 @@ CREATE TABLE IF NOT EXISTS agent_sessions (
|
|||||||
CONSTRAINT agent_sessions_status_chk CHECK (status IN ('idle', 'active', 'crashed', 'closed'))
|
CONSTRAINT agent_sessions_status_chk CHECK (status IN ('idle', 'active', 'crashed', 'closed'))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
-- Migrate existing agent_sessions FK to CASCADE.
|
||||||
|
DO $$ BEGIN
|
||||||
|
IF EXISTS (
|
||||||
|
SELECT 1 FROM pg_constraint
|
||||||
|
WHERE conname = 'agent_sessions_session_id_fkey'
|
||||||
|
AND confdeltype <> 'c'
|
||||||
|
) THEN
|
||||||
|
ALTER TABLE agent_sessions DROP CONSTRAINT agent_sessions_session_id_fkey;
|
||||||
|
ALTER TABLE agent_sessions ADD CONSTRAINT agent_sessions_session_id_fkey
|
||||||
|
FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
-- v2.6: config fingerprint for stale-session detection (auto-recover on model change).
|
-- v2.6: config fingerprint for stale-session detection (auto-recover on model change).
|
||||||
ALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS config_hash TEXT;
|
ALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS config_hash TEXT;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user