feat(ssa): Complete T-test end-to-end testing with 9 bug fixes - Phase 1 core 85% complete. R service: missing value auto-filter. Backend: error handling, variable matching, dynamic filename. Frontend: module activation, session isolation, error propagation. Full flow verified.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-19 20:57:00 +08:00
parent 8137e3cde2
commit 49b5c37cb1
86 changed files with 21207 additions and 252 deletions

View File

@@ -1,8 +1,77 @@
-- Add knowledge_config field to prompt_templates
ALTER TABLE "capability_schema"."prompt_templates" ADD COLUMN "knowledge_config" JSONB;
-- =============================================
-- FIX: Create prompt_templates and prompt_versions tables if they don't exist
-- Background: These tables were originally created via `prisma db push`
-- (bypassing migrations), causing shadow database validation failures.
-- This fix ensures migrations can replay cleanly from scratch.
-- =============================================
-- Create PromptStatus enum if not exists
DO $$ BEGIN
CREATE TYPE "capability_schema"."PromptStatus" AS ENUM ('DRAFT', 'ACTIVE', 'ARCHIVED');
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
-- CreateTable: prompt_templates (if not exists)
CREATE TABLE IF NOT EXISTS "capability_schema"."prompt_templates" (
"id" SERIAL NOT NULL,
"code" TEXT NOT NULL,
"name" TEXT NOT NULL,
"module" TEXT NOT NULL,
"description" TEXT,
"variables" JSONB,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "prompt_templates_pkey" PRIMARY KEY ("id")
);
-- CreateIndex (if not exists)
CREATE UNIQUE INDEX IF NOT EXISTS "prompt_templates_code_key" ON "capability_schema"."prompt_templates"("code");
CREATE INDEX IF NOT EXISTS "idx_prompt_templates_module" ON "capability_schema"."prompt_templates"("module");
-- CreateTable: prompt_versions (if not exists)
CREATE TABLE IF NOT EXISTS "capability_schema"."prompt_versions" (
"id" SERIAL NOT NULL,
"template_id" INTEGER NOT NULL,
"version" INTEGER NOT NULL,
"content" TEXT NOT NULL,
"model_config" JSONB,
"status" "capability_schema"."PromptStatus" NOT NULL DEFAULT 'DRAFT',
"changelog" TEXT,
"created_by" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "prompt_versions_pkey" PRIMARY KEY ("id")
);
-- CreateIndex (if not exists)
CREATE INDEX IF NOT EXISTS "idx_prompt_versions_template_status" ON "capability_schema"."prompt_versions"("template_id", "status");
CREATE INDEX IF NOT EXISTS "idx_prompt_versions_status" ON "capability_schema"."prompt_versions"("status");
-- AddForeignKey (if not exists)
DO $$ BEGIN
ALTER TABLE "capability_schema"."prompt_versions"
ADD CONSTRAINT "prompt_versions_template_id_fkey"
FOREIGN KEY ("template_id") REFERENCES "capability_schema"."prompt_templates"("id")
ON DELETE RESTRICT ON UPDATE CASCADE;
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
-- =============================================
-- Original migration content starts here
-- =============================================
-- Add knowledge_config field to prompt_templates (if not exists)
DO $$ BEGIN
ALTER TABLE "capability_schema"."prompt_templates" ADD COLUMN "knowledge_config" JSONB;
EXCEPTION
WHEN duplicate_column THEN null;
END $$;
-- CreateTable: system_knowledge_bases
CREATE TABLE "capability_schema"."system_knowledge_bases" (
CREATE TABLE IF NOT EXISTS "capability_schema"."system_knowledge_bases" (
"id" TEXT NOT NULL,
"code" VARCHAR(50) NOT NULL,
"name" VARCHAR(100) NOT NULL,
@@ -18,7 +87,7 @@ CREATE TABLE "capability_schema"."system_knowledge_bases" (
);
-- CreateTable: system_kb_documents
CREATE TABLE "capability_schema"."system_kb_documents" (
CREATE TABLE IF NOT EXISTS "capability_schema"."system_kb_documents" (
"id" TEXT NOT NULL,
"kb_id" TEXT NOT NULL,
"filename" VARCHAR(255) NOT NULL,
@@ -35,20 +104,19 @@ CREATE TABLE "capability_schema"."system_kb_documents" (
CONSTRAINT "system_kb_documents_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "system_knowledge_bases_code_key" ON "capability_schema"."system_knowledge_bases"("code");
-- CreateIndex (if not exists)
CREATE UNIQUE INDEX IF NOT EXISTS "system_knowledge_bases_code_key" ON "capability_schema"."system_knowledge_bases"("code");
CREATE INDEX IF NOT EXISTS "idx_system_kb_category" ON "capability_schema"."system_knowledge_bases"("category");
CREATE INDEX IF NOT EXISTS "idx_system_kb_status" ON "capability_schema"."system_knowledge_bases"("status");
CREATE INDEX IF NOT EXISTS "idx_system_kb_docs_kb_id" ON "capability_schema"."system_kb_documents"("kb_id");
CREATE INDEX IF NOT EXISTS "idx_system_kb_docs_status" ON "capability_schema"."system_kb_documents"("status");
-- CreateIndex
CREATE INDEX "idx_system_kb_category" ON "capability_schema"."system_knowledge_bases"("category");
-- CreateIndex
CREATE INDEX "idx_system_kb_status" ON "capability_schema"."system_knowledge_bases"("status");
-- CreateIndex
CREATE INDEX "idx_system_kb_docs_kb_id" ON "capability_schema"."system_kb_documents"("kb_id");
-- CreateIndex
CREATE INDEX "idx_system_kb_docs_status" ON "capability_schema"."system_kb_documents"("status");
-- AddForeignKey
ALTER TABLE "capability_schema"."system_kb_documents" ADD CONSTRAINT "system_kb_documents_kb_id_fkey" FOREIGN KEY ("kb_id") REFERENCES "capability_schema"."system_knowledge_bases"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey (if not exists)
DO $$ BEGIN
ALTER TABLE "capability_schema"."system_kb_documents"
ADD CONSTRAINT "system_kb_documents_kb_id_fkey"
FOREIGN KEY ("kb_id") REFERENCES "capability_schema"."system_knowledge_bases"("id")
ON DELETE CASCADE ON UPDATE CASCADE;
EXCEPTION
WHEN duplicate_object THEN null;
END $$;

View File

@@ -2,6 +2,9 @@
-- 创建 8 张新表用于支持完整的 Agent 功能
-- 日期: 2026-02-07
-- Enable pgvector extension for embedding support
CREATE EXTENSION IF NOT EXISTS vector;
-- CreateTable: iit_skills (Skill 配置存储)
CREATE TABLE "iit_schema"."skills" (
"id" TEXT NOT NULL,

View File

@@ -0,0 +1,164 @@
-- CreateSchema
CREATE SCHEMA IF NOT EXISTS "ssa_schema";
-- CreateTable: ssa_sessions
CREATE TABLE "ssa_schema"."ssa_sessions" (
"id" TEXT NOT NULL,
"user_id" TEXT NOT NULL,
"title" TEXT,
"data_schema" JSONB,
"data_payload" JSONB,
"data_oss_key" TEXT,
"status" TEXT NOT NULL DEFAULT 'active',
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "ssa_sessions_pkey" PRIMARY KEY ("id")
);
-- CreateTable: ssa_messages
CREATE TABLE "ssa_schema"."ssa_messages" (
"id" TEXT NOT NULL,
"session_id" TEXT NOT NULL,
"role" TEXT NOT NULL,
"content_type" TEXT NOT NULL,
"content" JSONB NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "ssa_messages_pkey" PRIMARY KEY ("id")
);
-- CreateTable: ssa_tools_library
CREATE TABLE "ssa_schema"."ssa_tools_library" (
"id" TEXT NOT NULL,
"tool_code" TEXT NOT NULL,
"name" TEXT NOT NULL,
"version" TEXT NOT NULL DEFAULT '1.0.0',
"description" TEXT NOT NULL,
"usage_context" TEXT,
"params_schema" JSONB NOT NULL,
"guardrails" JSONB,
"search_text" TEXT NOT NULL,
"embedding" vector(1024),
"is_active" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "ssa_tools_library_pkey" PRIMARY KEY ("id")
);
-- CreateTable: ssa_execution_logs
CREATE TABLE "ssa_schema"."ssa_execution_logs" (
"id" TEXT NOT NULL,
"session_id" TEXT NOT NULL,
"message_id" TEXT,
"tool_code" TEXT NOT NULL,
"input_params" JSONB NOT NULL,
"output_status" TEXT NOT NULL,
"output_result" JSONB,
"trace_log" TEXT[],
"execution_ms" INTEGER,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "ssa_execution_logs_pkey" PRIMARY KEY ("id")
);
-- CreateTable: ssa_decision_table
CREATE TABLE "ssa_schema"."ssa_decision_table" (
"id" TEXT NOT NULL,
"goal_type" TEXT NOT NULL,
"y_type" TEXT NOT NULL,
"x_type" TEXT,
"design_type" TEXT NOT NULL,
"tool_code" TEXT NOT NULL,
"alt_tool_code" TEXT,
"priority" INTEGER NOT NULL DEFAULT 0,
"is_active" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "ssa_decision_table_pkey" PRIMARY KEY ("id")
);
-- CreateTable: ssa_r_code_library
CREATE TABLE "ssa_schema"."ssa_r_code_library" (
"id" TEXT NOT NULL,
"tool_code" TEXT NOT NULL,
"version" TEXT NOT NULL DEFAULT '1.0.0',
"file_name" TEXT NOT NULL,
"code_content" TEXT NOT NULL,
"entry_func" TEXT NOT NULL DEFAULT 'run_analysis',
"description" TEXT,
"dependencies" TEXT[] DEFAULT ARRAY[]::TEXT[],
"is_active" BOOLEAN NOT NULL DEFAULT true,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "ssa_r_code_library_pkey" PRIMARY KEY ("id")
);
-- CreateTable: ssa_param_mapping
CREATE TABLE "ssa_schema"."ssa_param_mapping" (
"id" TEXT NOT NULL,
"tool_code" TEXT NOT NULL,
"json_key" TEXT NOT NULL,
"r_param_name" TEXT NOT NULL,
"data_type" TEXT NOT NULL,
"is_required" BOOLEAN NOT NULL DEFAULT false,
"default_value" TEXT,
"validation_rule" TEXT,
"description" TEXT,
CONSTRAINT "ssa_param_mapping_pkey" PRIMARY KEY ("id")
);
-- CreateTable: ssa_guardrail_config
CREATE TABLE "ssa_schema"."ssa_guardrail_config" (
"id" TEXT NOT NULL,
"tool_code" TEXT NOT NULL,
"check_name" TEXT NOT NULL,
"check_order" INTEGER NOT NULL DEFAULT 0,
"check_code" TEXT NOT NULL,
"threshold" TEXT,
"action_type" TEXT NOT NULL,
"action_target" TEXT,
"is_enabled" BOOLEAN NOT NULL DEFAULT true,
CONSTRAINT "ssa_guardrail_config_pkey" PRIMARY KEY ("id")
);
-- CreateTable: ssa_interpretation_templates
CREATE TABLE "ssa_schema"."ssa_interpretation_templates" (
"id" TEXT NOT NULL,
"tool_code" TEXT NOT NULL,
"scenario_key" TEXT NOT NULL,
"template" TEXT NOT NULL,
"placeholders" TEXT[] DEFAULT ARRAY[]::TEXT[],
CONSTRAINT "ssa_interpretation_templates_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "idx_ssa_session_user" ON "ssa_schema"."ssa_sessions"("user_id");
CREATE INDEX "idx_ssa_session_status" ON "ssa_schema"."ssa_sessions"("status");
CREATE INDEX "idx_ssa_message_session" ON "ssa_schema"."ssa_messages"("session_id");
CREATE UNIQUE INDEX "ssa_tools_library_tool_code_key" ON "ssa_schema"."ssa_tools_library"("tool_code");
CREATE INDEX "idx_ssa_exec_log_session" ON "ssa_schema"."ssa_execution_logs"("session_id");
CREATE INDEX "idx_ssa_exec_log_tool" ON "ssa_schema"."ssa_execution_logs"("tool_code");
CREATE UNIQUE INDEX "uq_ssa_decision_table" ON "ssa_schema"."ssa_decision_table"("goal_type", "y_type", "x_type", "design_type");
CREATE INDEX "idx_ssa_rcode_tool" ON "ssa_schema"."ssa_r_code_library"("tool_code");
CREATE UNIQUE INDEX "uq_ssa_param_mapping" ON "ssa_schema"."ssa_param_mapping"("tool_code", "json_key");
CREATE INDEX "idx_ssa_guardrail_tool" ON "ssa_schema"."ssa_guardrail_config"("tool_code");
CREATE UNIQUE INDEX "uq_ssa_interpretation" ON "ssa_schema"."ssa_interpretation_templates"("tool_code", "scenario_key");
-- AddForeignKey
ALTER TABLE "ssa_schema"."ssa_messages" ADD CONSTRAINT "ssa_messages_session_id_fkey" FOREIGN KEY ("session_id") REFERENCES "ssa_schema"."ssa_sessions"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "ssa_schema"."ssa_execution_logs" ADD CONSTRAINT "ssa_execution_logs_session_id_fkey" FOREIGN KEY ("session_id") REFERENCES "ssa_schema"."ssa_sessions"("id") ON DELETE CASCADE ON UPDATE CASCADE;