File size: 3,553 Bytes
cd8bd0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
-- 002_mcp_a2a_tables.sql
-- Tables for MCP Server audit, A2A task lifecycle,
-- routing decision tracking, and Auto-Combo adaptation state.

-- ============ MCP Tool Audit ============
-- Tracks every MCP tool invocation for security audit and observability.
CREATE TABLE IF NOT EXISTS mcp_tool_audit (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    tool_name TEXT NOT NULL,
    input_hash TEXT,
    output_summary TEXT,
    duration_ms INTEGER,
    api_key_id TEXT,
    success INTEGER DEFAULT 1,
    error_code TEXT,
    created_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_mta_tool ON mcp_tool_audit(tool_name);
CREATE INDEX IF NOT EXISTS idx_mta_created ON mcp_tool_audit(created_at);
CREATE INDEX IF NOT EXISTS idx_mta_apikey ON mcp_tool_audit(api_key_id);

-- ============ A2A Tasks ============
-- Stores A2A task lifecycle (submitted → working → completed/failed/cancelled).
CREATE TABLE IF NOT EXISTS a2a_tasks (
    id TEXT PRIMARY KEY,
    state TEXT NOT NULL DEFAULT 'submitted',
    skill_id TEXT,
    input_json TEXT,
    output_json TEXT,
    cost_estimated REAL,
    cost_actual REAL,
    routing_explanation TEXT,
    resilience_trace TEXT,
    policy_verdict TEXT,
    api_key_id TEXT,
    created_at TEXT DEFAULT (datetime('now')),
    updated_at TEXT DEFAULT (datetime('now')),
    completed_at TEXT,
    expires_at TEXT
);
CREATE INDEX IF NOT EXISTS idx_a2a_state ON a2a_tasks(state);
CREATE INDEX IF NOT EXISTS idx_a2a_skill ON a2a_tasks(skill_id);
CREATE INDEX IF NOT EXISTS idx_a2a_created ON a2a_tasks(created_at);

-- ============ A2A Task Events ============
-- Event log for each A2A task (state transitions, errors, fallbacks).
CREATE TABLE IF NOT EXISTS a2a_task_events (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    task_id TEXT NOT NULL REFERENCES a2a_tasks(id) ON DELETE CASCADE,
    event_type TEXT NOT NULL,
    data_json TEXT,
    created_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_a2ae_task ON a2a_task_events(task_id);
CREATE INDEX IF NOT EXISTS idx_a2ae_type ON a2a_task_events(event_type);

-- ============ Routing Decisions ============
-- Records every routing decision for explainability and learning.
CREATE TABLE IF NOT EXISTS routing_decisions (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    request_id TEXT,
    task_type TEXT,
    combo_id TEXT,
    provider_selected TEXT,
    model_selected TEXT,
    score REAL,
    factors_json TEXT,
    fallbacks_triggered INTEGER DEFAULT 0,
    success INTEGER DEFAULT 1,
    latency_ms INTEGER,
    cost REAL,
    source TEXT DEFAULT 'api',
    created_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_rd_request ON routing_decisions(request_id);
CREATE INDEX IF NOT EXISTS idx_rd_combo ON routing_decisions(combo_id);
CREATE INDEX IF NOT EXISTS idx_rd_provider ON routing_decisions(provider_selected);
CREATE INDEX IF NOT EXISTS idx_rd_created ON routing_decisions(created_at);

-- ============ Combo Adaptation State ============
-- Persisted learning state for Auto-Combo scoring engine.
CREATE TABLE IF NOT EXISTS combo_adaptation_state (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    combo_id TEXT NOT NULL,
    provider_id TEXT NOT NULL,
    learned_score REAL DEFAULT 0.5,
    request_count INTEGER DEFAULT 0,
    success_count INTEGER DEFAULT 0,
    avg_latency_ms REAL,
    last_failure_at TEXT,
    excluded_until TEXT,
    updated_at TEXT DEFAULT (datetime('now')),
    UNIQUE(combo_id, provider_id)
);
CREATE INDEX IF NOT EXISTS idx_cas_combo ON combo_adaptation_state(combo_id);