Phase 4 of v2.0. BooCoder can now queue tasks and dispatch them through the inference loop autonomously. Dispatcher (services/dispatcher.ts): in-process setInterval(5s) polls tasks WHERE state='pending', picks one at a time, creates an isolated session+chat, enqueues inference with the task's input as the user message, polls for completion, marks state completed/failed with output_summary. Single-task-at-a-time for v2.0.0; parallel dispatch is a Phase 5+ concern. Respects onClose hook for graceful shutdown. Task routes (routes/tasks.ts): POST /api/tasks (create), GET /api/tasks (list with state/project filters), GET /api/tasks/:id (detail), POST /api/tasks/:id/cancel (marks cancelled, aborts if running). Agent probe (services/agent-probe.ts): on startup, probes PATH for opencode/goose/claude/pi via which + --version. UPSERTs into available_agents table. Finds nothing inside the container (expected — Phase 5 addresses host-agent access via ACP/PTY). Schema: ALTER TABLE tasks ADD COLUMN IF NOT EXISTS session_id (links task to its auto-created inference session for isolation). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
52 lines
1.9 KiB
SQL
52 lines
1.9 KiB
SQL
-- v2.0.0: BooCoder schema — pending changes, tasks, agent registry.
|
|
-- Applied on startup by apps/coder/src/db.ts:applySchema().
|
|
-- Lives in the same 'boochat' database as BooChat's tables.
|
|
|
|
CREATE TABLE IF NOT EXISTS pending_changes (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
session_id UUID NOT NULL,
|
|
task_id UUID,
|
|
file_path TEXT NOT NULL,
|
|
operation TEXT NOT NULL,
|
|
diff TEXT NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'pending',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
|
|
CONSTRAINT pending_changes_operation_chk CHECK (operation IN ('create', 'edit', 'delete')),
|
|
CONSTRAINT pending_changes_status_chk CHECK (status IN ('pending', 'applied', 'rejected', 'reverted'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS tasks (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
project_id UUID NOT NULL,
|
|
parent_task_id UUID REFERENCES tasks(id),
|
|
state TEXT NOT NULL DEFAULT 'pending',
|
|
input TEXT NOT NULL,
|
|
output_summary TEXT,
|
|
agent TEXT,
|
|
model TEXT,
|
|
execution_path TEXT,
|
|
worktree_path TEXT,
|
|
cost_tokens INTEGER,
|
|
started_at TIMESTAMPTZ,
|
|
ended_at TIMESTAMPTZ,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
|
|
CONSTRAINT tasks_state_chk CHECK (state IN ('pending', 'running', 'completed', 'failed', 'blocked', 'cancelled')),
|
|
CONSTRAINT tasks_execution_path_chk CHECK (execution_path IS NULL OR execution_path IN ('native', 'acp', 'pty'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS available_agents (
|
|
name TEXT PRIMARY KEY,
|
|
install_path TEXT,
|
|
version TEXT,
|
|
supports_acp BOOLEAN NOT NULL DEFAULT false,
|
|
supports_mcp_client BOOLEAN NOT NULL DEFAULT false,
|
|
last_probed_at TIMESTAMPTZ
|
|
);
|
|
|
|
-- v2.0.0 Phase 4: link tasks to their inference sessions.
|
|
ALTER TABLE tasks ADD COLUMN IF NOT EXISTS session_id UUID REFERENCES sessions(id);
|
|
|
|
-- Human inbox: tasks needing attention
|
|
CREATE OR REPLACE VIEW human_inbox AS
|
|
SELECT * FROM tasks WHERE state IN ('blocked', 'failed');
|