summaryrefslogblamecommitdiff
path: root/makima/migrations/20260203000000_create_chains.sql
blob: 7811a4529eabe60685d6b8400d064b0c5e0a3bbb (plain) (tree)



























































                                                                                                               
-- Chains table - DAG of contracts for multi-contract orchestration
-- Fits Makima's control theme - she controls through invisible chains
CREATE TABLE IF NOT EXISTS chains (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    owner_id UUID NOT NULL REFERENCES owners(id) ON DELETE CASCADE,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    status VARCHAR(32) NOT NULL DEFAULT 'active',  -- active/completed/archived
    -- Loop control for iterative execution
    loop_enabled BOOLEAN NOT NULL DEFAULT false,
    loop_max_iterations INTEGER DEFAULT 10,
    loop_current_iteration INTEGER DEFAULT 0,
    loop_progress_check TEXT,  -- Prompt/criteria for evaluating progress
    -- Repository reference (optional - contracts may have their own repos)
    repository_url VARCHAR(512),
    local_path VARCHAR(512),
    -- Versioning for optimistic locking
    version INTEGER NOT NULL DEFAULT 1,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE INDEX idx_chains_owner_id ON chains(owner_id);
CREATE INDEX idx_chains_status ON chains(status);

-- Chain contracts - links contracts to chains with DAG dependency info
-- The depends_on array forms the DAG edges (directed acyclic graph)
CREATE TABLE IF NOT EXISTS chain_contracts (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    chain_id UUID NOT NULL REFERENCES chains(id) ON DELETE CASCADE,
    contract_id UUID NOT NULL REFERENCES contracts(id) ON DELETE CASCADE,
    -- DAG edges: contract IDs this contract depends on (must complete before this starts)
    depends_on UUID[] DEFAULT '{}',
    -- Order for display/processing (topological sort order)
    order_index INTEGER NOT NULL DEFAULT 0,
    -- Position for GUI editor
    editor_x FLOAT DEFAULT 0,
    editor_y FLOAT DEFAULT 0,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    UNIQUE(chain_id, contract_id)
);

CREATE INDEX idx_chain_contracts_chain_id ON chain_contracts(chain_id);
CREATE INDEX idx_chain_contracts_contract_id ON chain_contracts(contract_id);

-- Add chain_id to contracts table for reverse lookup
ALTER TABLE contracts ADD COLUMN IF NOT EXISTS chain_id UUID REFERENCES chains(id) ON DELETE SET NULL;
CREATE INDEX IF NOT EXISTS idx_contracts_chain_id ON contracts(chain_id);

-- Chain events for audit trail
CREATE TABLE IF NOT EXISTS chain_events (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    chain_id UUID NOT NULL REFERENCES chains(id) ON DELETE CASCADE,
    event_type VARCHAR(64) NOT NULL,  -- created, contract_added, contract_completed, loop_iteration, completed
    contract_id UUID REFERENCES contracts(id) ON DELETE SET NULL,
    event_data JSONB,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE INDEX idx_chain_events_chain_id ON chain_events(chain_id);