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:
@@ -37,8 +37,15 @@ export interface EnsureSessionOpts {
|
||||
agent: string;
|
||||
/** Resolved model id. */
|
||||
model: string;
|
||||
/** P1.5-b: the chat (tab) this turn belongs to. agent_sessions is keyed
|
||||
* (chat_id, agent) — the tab/chat is the context unit. Always non-null:
|
||||
* the dispatcher creates a chat for session-less tasks before calling. */
|
||||
chatId: string;
|
||||
/** Shared per-session worktree (one per `sessions.id`, not per pane). */
|
||||
worktreePath: string;
|
||||
/** P1.5-b: the `worktrees.id` for this session's worktree — stored on the
|
||||
* agent_sessions row informationally (NOT the key). */
|
||||
worktreeId: string;
|
||||
projectId: string;
|
||||
}
|
||||
|
||||
@@ -47,6 +54,10 @@ export interface AgentSessionHandle {
|
||||
sessionId: string;
|
||||
agent: string;
|
||||
backend: AgentBackendKind;
|
||||
/** P1.5-b: the chat (tab) this session is keyed on (with agent). */
|
||||
chatId: string;
|
||||
/** P1.5-b: the worktree this session's chat runs in (informational link). */
|
||||
worktreeId: string;
|
||||
/** Provider's own session id (resume token); null until the backend assigns one. */
|
||||
agentSessionId: string | null;
|
||||
/** opencode HTTP server port; null for ACP backends. */
|
||||
|
||||
Reference in New Issue
Block a user