feat(coder): re-key agent_sessions to (chat_id, agent) + worktrees table (P1.5-b)
The tab (a chat) is the context unit: two opencode tabs in one session are two independent agent contexts sharing one worktree. agent_sessions re-keys from (session_id, agent) to (chat_id, agent) — chat_id FK ON DELETE CASCADE (closing a tab ends its context); worktree_id and session_id become informational SET NULL columns. New worktrees table (one-per-session, survives session delete via session_id SET NULL) supersedes session_worktrees, which is defanged (CASCADE dropped) not yet removed. chat_id is threaded end-to-end: tasks.chat_id added, written by the coder message + skills routes from the frontend tab, read by runOpenCodeServerTask which falls back to resolve-or-create a chat for session-less creators (arena/MCP/new_task/generic) so ensureSession never gets a null key. Idempotent migration with a backfill-verify gate (0-row assertion after the test session was deleted). config_hash fingerprint logic preserved; one-worktree-per-session unchanged; runExternalAgent untouched. Column rename worktree_path -> path repointed at all five readers (server delete-guard, risk/stash endpoints, ensureSessionWorktree). Supersedes the earlier (worktree_id) draft. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -18,7 +18,7 @@ export function registerWorktreeSafetyRoutes(app: FastifyInstance, sql: Sql): vo
|
||||
'/api/sessions/:sessionId/worktree-risk',
|
||||
async (req) => {
|
||||
const rows = await sql<{ worktree_path: string }[]>`
|
||||
SELECT worktree_path FROM session_worktrees WHERE session_id = ${req.params.sessionId}
|
||||
SELECT path AS worktree_path FROM worktrees WHERE session_id = ${req.params.sessionId}
|
||||
`;
|
||||
const reports = [];
|
||||
for (const row of rows) {
|
||||
@@ -33,7 +33,7 @@ export function registerWorktreeSafetyRoutes(app: FastifyInstance, sql: Sql): vo
|
||||
'/api/sessions/:sessionId/worktree-stash',
|
||||
async (req) => {
|
||||
const rows = await sql<{ worktree_path: string }[]>`
|
||||
SELECT worktree_path FROM session_worktrees WHERE session_id = ${req.params.sessionId}
|
||||
SELECT path AS worktree_path FROM worktrees WHERE session_id = ${req.params.sessionId}
|
||||
`;
|
||||
const results = [];
|
||||
for (const row of rows) {
|
||||
|
||||
Reference in New Issue
Block a user