Files
goclaw/migrations/000002_agent_links.up.sql
T

49 lines
2.6 KiB
SQL

-- ============================================================
-- Agent frontmatter (short expertise/capability summary for delegation + UI display).
-- NOTE: This is NOT the same as other_config.description which is the
-- LLM summoning prompt used to initialize the agent's identity.
-- ============================================================
ALTER TABLE agents ADD COLUMN IF NOT EXISTS frontmatter TEXT;
-- Search support: FTS (tsvector) + semantic (pgvector) for agent discovery.
-- Pattern follows skills table: hybrid BM25 + cosine similarity.
-- tsv is auto-generated from display_name + frontmatter.
-- embedding is populated on create/update when an embedding provider is available.
ALTER TABLE agents ADD COLUMN IF NOT EXISTS tsv tsvector
GENERATED ALWAYS AS (to_tsvector('simple', COALESCE(display_name, '') || ' ' || COALESCE(frontmatter, ''))) STORED;
ALTER TABLE agents ADD COLUMN IF NOT EXISTS embedding vector(1536);
CREATE INDEX IF NOT EXISTS idx_agents_tsv ON agents USING GIN(tsv);
CREATE INDEX IF NOT EXISTS idx_agents_embedding ON agents USING hnsw(embedding vector_cosine_ops);
-- ============================================================
-- Agent Links (inter-agent delegation permissions)
-- ============================================================
CREATE TABLE agent_links (
id UUID PRIMARY KEY DEFAULT uuid_generate_v7(),
source_agent_id UUID NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
target_agent_id UUID NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
direction VARCHAR(20) NOT NULL DEFAULT 'outbound',
description TEXT,
max_concurrent INT NOT NULL DEFAULT 3,
settings JSONB NOT NULL DEFAULT '{}',
status VARCHAR(20) NOT NULL DEFAULT 'active',
created_by VARCHAR(255) NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(source_agent_id, target_agent_id),
CHECK (source_agent_id != target_agent_id)
);
CREATE INDEX idx_agent_links_source ON agent_links(source_agent_id) WHERE status = 'active';
CREATE INDEX idx_agent_links_target ON agent_links(target_agent_id) WHERE status = 'active';
-- ============================================================
-- Linked traces for delegation: parent_trace_id on traces table
-- allows navigating between caller and delegate traces.
-- ============================================================
ALTER TABLE traces ADD COLUMN IF NOT EXISTS parent_trace_id UUID;
CREATE INDEX IF NOT EXISTS idx_traces_parent ON traces(parent_trace_id) WHERE parent_trace_id IS NOT NULL;