arcadiasuite/migrations/0003_arcadia_skills.sql

105 lines
4.2 KiB
SQL

-- Migration 0003: Arcádia Agentic Suite — Skills POO
-- Criado em: 2026-03-24 | Autor: João
-- Adiciona tabelas arcadia_skills e skill_executions
-- NÃO altera nem remove xos_skill_registry (modelo XOS legado preservado)
-- ─── Tabela principal de Skills (modelo orientado a objetos) ─────────────────
CREATE TABLE IF NOT EXISTS "arcadia_skills" (
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Identidade
"name" VARCHAR(255) NOT NULL,
"slug" VARCHAR(255) NOT NULL,
"description" TEXT,
"version" VARCHAR(50) NOT NULL DEFAULT '1.0.0',
"icon" VARCHAR(100),
"tags" TEXT[],
-- Namespace multi-tenant (system > tenant > company > user)
"namespace" VARCHAR(20) NOT NULL DEFAULT 'tenant',
"tenant_id" INTEGER REFERENCES "tenants"("id") ON DELETE CASCADE,
"company_id" INTEGER,
"user_id" VARCHAR REFERENCES "users"("id") ON DELETE SET NULL,
-- Herança POO: lista de slugs referenciando outras skills
"extends" TEXT[],
-- Interfaces / contratos implementados
"implements" TEXT[],
-- Encapsulamento
"visibility_execute" VARCHAR(20) DEFAULT 'public',
"visibility_params" VARCHAR(20) DEFAULT 'public',
-- Composição: dependências como referências /tipo/caminho
"dependencies" TEXT[],
-- Trigger automático
"trigger_type" VARCHAR(30),
"trigger_config" JSONB,
-- Corpo da skill (Markdown com blocos /skill/, /kg/, /tool/, etc.)
"body" TEXT,
-- Schemas de entrada e saída
"parameters_schema" JSONB,
"return_schema" JSONB,
-- Estado
"status" VARCHAR(20) NOT NULL DEFAULT 'draft',
"is_system" BOOLEAN DEFAULT false,
-- Autoria
"author" VARCHAR(255),
"created_by" VARCHAR REFERENCES "users"("id") ON DELETE SET NULL,
"created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Slug único por namespace + tenant
CREATE UNIQUE INDEX IF NOT EXISTS idx_arcadia_skills_slug_tenant
ON arcadia_skills(slug, tenant_id, namespace);
-- Índices de consulta frequente
CREATE INDEX IF NOT EXISTS idx_arcadia_skills_tenant ON arcadia_skills(tenant_id);
CREATE INDEX IF NOT EXISTS idx_arcadia_skills_namespace ON arcadia_skills(namespace);
CREATE INDEX IF NOT EXISTS idx_arcadia_skills_status ON arcadia_skills(status);
CREATE INDEX IF NOT EXISTS idx_arcadia_skills_created_by ON arcadia_skills(created_by);
-- ─── Tabela de execuções de skills ──────────────────────────────────────────
CREATE TABLE IF NOT EXISTS "skill_executions" (
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
"skill_id" UUID NOT NULL REFERENCES "arcadia_skills"("id") ON DELETE CASCADE,
-- Contexto de execução
"tenant_id" INTEGER REFERENCES "tenants"("id"),
"company_id" INTEGER,
"user_id" VARCHAR REFERENCES "users"("id") ON DELETE SET NULL,
-- Origem
"triggered_by" VARCHAR(30),
"automation_id" INTEGER,
"parent_execution_id" UUID,
-- Dados
"input_params" JSONB,
"output_result" JSONB,
"resolved_dependencies" JSONB,
-- Estado
"status" VARCHAR(20) NOT NULL DEFAULT 'pending',
"error_message" TEXT,
"duration_ms" INTEGER,
-- Imutabilidade / auditoria
"audit_hash" VARCHAR(64),
"started_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"completed_at" TIMESTAMP
);
-- Índices de consulta frequente
CREATE INDEX IF NOT EXISTS idx_skill_executions_skill_id ON skill_executions(skill_id);
CREATE INDEX IF NOT EXISTS idx_skill_executions_tenant ON skill_executions(tenant_id);
CREATE INDEX IF NOT EXISTS idx_skill_executions_status ON skill_executions(status);
CREATE INDEX IF NOT EXISTS idx_skill_executions_started ON skill_executions(started_at DESC);