create-safest-tools 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -3
- package/package.json +1 -1
- package/src/cli.mjs +45 -2
- package/src/config.mjs +4 -3
- package/src/scaffold.mjs +4 -1
- package/src/update.mjs +265 -0
- package/template/README.md +5 -3
- package/template/console/shell/WorkspaceShell.tsx +0 -4
- package/template/migrations/0001_safest_resolve_baseline.sql +2446 -0
- package/template/package.json +4 -3
- package/template/public/console/auth-shell.js +3 -9
- package/template/public/styles.css +2 -15
- package/template/scripts/reports-owner-setup.mjs +22 -7
- package/template/scripts/reports-plan.mjs +1 -1
- package/template/migrations/0001_reports_foundation.sql +0 -444
- package/template/migrations/0002_human_report_loop.sql +0 -65
- package/template/migrations/0003_delivery_reliability.sql +0 -18
- package/template/migrations/0004_public_intake.sql +0 -14
- package/template/migrations/0005_operations_visibility.sql +0 -24
- package/template/migrations/0006_ai_governance.sql +0 -198
- package/template/migrations/0007_ai_release_gates.sql +0 -6
- package/template/migrations/0008_retention_analytics_exports.sql +0 -52
- package/template/migrations/0009_retention_derived_copies.sql +0 -14
- package/template/migrations/0010_ai_quality_controls.sql +0 -26
- package/template/migrations/0011_analyst_presence.sql +0 -28
- package/template/migrations/0012_queue_policies.sql +0 -87
- package/template/migrations/0013_routing_agents.sql +0 -63
- package/template/migrations/0014_webhook_enrichments.sql +0 -122
- package/template/migrations/0015_queue_owned_ai.sql +0 -55
- package/template/migrations/0016_operator_accounts.sql +0 -67
- package/template/migrations/0017_operator_profiles_and_recovery.sql +0 -33
- package/template/migrations/0018_platform_configuration.sql +0 -382
- package/template/migrations/0019_workflow_authoring_runtime.sql +0 -372
- package/template/migrations/0020_tasks_findings_assistant_budgets.sql +0 -427
- package/template/migrations/0021_abuse_evidence_operations.sql +0 -324
- package/template/migrations/0022_workflow_dispatch_operations.sql +0 -42
- package/template/migrations/0023_component_connection_execution.sql +0 -75
- package/template/migrations/0024_access_runtime_integrity.sql +0 -72
- package/template/migrations/0025_installation_timezone.sql +0 -11
- package/template/migrations/0026_ai_and_egress_execution_controls.sql +0 -49
- package/template/migrations/0027_prompt_and_ai_registry.sql +0 -37
- package/template/migrations/0028_step_attempt_ai_provenance.sql +0 -13
- package/template/migrations/0029_evidence_fetch_transport.sql +0 -5
- package/template/migrations/0030_evidence_dlq_incidents.sql +0 -45
- package/template/migrations/0031_shadow_quality_integrity.sql +0 -7
- package/template/migrations/0032_action_delivery_outbox.sql +0 -55
- package/template/migrations/0033_configuration_and_assistant_drafts.sql +0 -43
- package/template/migrations/0034_installation_integrations.sql +0 -31
- package/template/migrations/0035_workspace_governance.sql +0 -21
- package/template/migrations/0036_published_routing_baseline.sql +0 -15
- package/template/migrations/0037_builtin_phishing_specialist.sql +0 -71
- package/template/migrations/0038_remove_deprecated_enrichment_runtime.sql +0 -228
- package/template/migrations/0039_secure_reporting_channels.sql +0 -45
- package/template/migrations/0040_notification_only_reporting.sql +0 -24
- package/template/migrations/0041_better_auth_credentials.sql +0 -17
- package/template/migrations/0042_owner_setup_tokens.sql +0 -29
|
@@ -0,0 +1,2446 @@
|
|
|
1
|
+
-- Safest Resolve fresh-install baseline.
|
|
2
|
+
-- Squashed from the pre-customer migration history after release 0.3.1.
|
|
3
|
+
PRAGMA foreign_keys = ON;
|
|
4
|
+
|
|
5
|
+
CREATE TABLE installations (
|
|
6
|
+
id TEXT PRIMARY KEY,
|
|
7
|
+
display_name TEXT NOT NULL,
|
|
8
|
+
default_locale TEXT NOT NULL DEFAULT 'en',
|
|
9
|
+
anonymous_reporting_enabled INTEGER NOT NULL DEFAULT 0 CHECK (anonymous_reporting_enabled IN (0, 1)),
|
|
10
|
+
created_at TEXT NOT NULL,
|
|
11
|
+
updated_at TEXT NOT NULL
|
|
12
|
+
, timezone TEXT NOT NULL DEFAULT 'UTC', settings_json TEXT NOT NULL DEFAULT '{}');
|
|
13
|
+
|
|
14
|
+
CREATE TABLE application_integrations (
|
|
15
|
+
id TEXT PRIMARY KEY,
|
|
16
|
+
installation_id TEXT NOT NULL REFERENCES installations(id),
|
|
17
|
+
name TEXT NOT NULL,
|
|
18
|
+
key_id TEXT NOT NULL UNIQUE,
|
|
19
|
+
allowed_origins_json TEXT NOT NULL DEFAULT '[]',
|
|
20
|
+
enabled INTEGER NOT NULL DEFAULT 1 CHECK (enabled IN (0, 1)),
|
|
21
|
+
created_at TEXT NOT NULL,
|
|
22
|
+
updated_at TEXT NOT NULL
|
|
23
|
+
, scopes_json TEXT NOT NULL DEFAULT '["submit_reports","mint_context_tokens"]', channel_mode TEXT NOT NULL DEFAULT 'contextual'
|
|
24
|
+
CHECK (channel_mode IN ('contextual', 'anonymous')), form_version_id TEXT REFERENCES report_form_versions(id), context_schema_json TEXT NOT NULL
|
|
25
|
+
DEFAULT '{"version":1,"allow_unknown":true,"fields":[]}');
|
|
26
|
+
|
|
27
|
+
CREATE TABLE report_form_versions (
|
|
28
|
+
id TEXT PRIMARY KEY,
|
|
29
|
+
installation_id TEXT NOT NULL REFERENCES installations(id),
|
|
30
|
+
form_key TEXT NOT NULL,
|
|
31
|
+
version INTEGER NOT NULL CHECK (version > 0),
|
|
32
|
+
title TEXT NOT NULL,
|
|
33
|
+
description TEXT NOT NULL DEFAULT '',
|
|
34
|
+
target_types_json TEXT NOT NULL,
|
|
35
|
+
reasons_json TEXT NOT NULL,
|
|
36
|
+
fields_json TEXT NOT NULL,
|
|
37
|
+
consent_notice TEXT NOT NULL,
|
|
38
|
+
published_at TEXT,
|
|
39
|
+
retired_at TEXT,
|
|
40
|
+
created_by TEXT NOT NULL,
|
|
41
|
+
created_at TEXT NOT NULL,
|
|
42
|
+
UNIQUE (installation_id, form_key, version)
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
CREATE TABLE policy_versions (
|
|
46
|
+
id TEXT PRIMARY KEY,
|
|
47
|
+
installation_id TEXT NOT NULL REFERENCES installations(id),
|
|
48
|
+
policy_key TEXT NOT NULL,
|
|
49
|
+
version INTEGER NOT NULL CHECK (version > 0),
|
|
50
|
+
title TEXT NOT NULL,
|
|
51
|
+
rules_json TEXT NOT NULL,
|
|
52
|
+
published_at TEXT,
|
|
53
|
+
created_by TEXT NOT NULL,
|
|
54
|
+
created_at TEXT NOT NULL,
|
|
55
|
+
UNIQUE (installation_id, policy_key, version)
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
CREATE TABLE queue_definitions (
|
|
59
|
+
id TEXT PRIMARY KEY,
|
|
60
|
+
installation_id TEXT NOT NULL REFERENCES installations(id),
|
|
61
|
+
queue_key TEXT NOT NULL,
|
|
62
|
+
name TEXT NOT NULL,
|
|
63
|
+
queue_kind TEXT NOT NULL CHECK (queue_kind IN ('human', 'ai', 'appeal', 'operations')),
|
|
64
|
+
enabled INTEGER NOT NULL DEFAULT 1 CHECK (enabled IN (0, 1)),
|
|
65
|
+
created_at TEXT NOT NULL,
|
|
66
|
+
updated_at TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', purpose TEXT NOT NULL DEFAULT 'reports'
|
|
67
|
+
CHECK (purpose IN ('reports', 'appeals', 'quality', 'operations')), status TEXT NOT NULL DEFAULT 'active'
|
|
68
|
+
CHECK (status IN ('active', 'paused', 'archived')), position INTEGER NOT NULL DEFAULT 100, active_version_id TEXT, created_by TEXT NOT NULL DEFAULT 'system',
|
|
69
|
+
UNIQUE (installation_id, queue_key)
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
CREATE TABLE queue_versions (
|
|
73
|
+
id TEXT PRIMARY KEY,
|
|
74
|
+
queue_id TEXT NOT NULL REFERENCES queue_definitions(id),
|
|
75
|
+
version INTEGER NOT NULL CHECK (version > 0),
|
|
76
|
+
mode TEXT NOT NULL CHECK (mode IN ('off', 'shadow', 'assist', 'autonomous_low_priority')),
|
|
77
|
+
priority INTEGER NOT NULL DEFAULT 50 CHECK (priority BETWEEN 0 AND 100),
|
|
78
|
+
response_sla_minutes INTEGER,
|
|
79
|
+
resolution_sla_minutes INTEGER,
|
|
80
|
+
claim_ttl_minutes INTEGER NOT NULL DEFAULT 15 CHECK (claim_ttl_minutes BETWEEN 1 AND 1440),
|
|
81
|
+
fallback_queue_id TEXT REFERENCES queue_definitions(id),
|
|
82
|
+
configuration_json TEXT NOT NULL DEFAULT '{}',
|
|
83
|
+
published_at TEXT,
|
|
84
|
+
created_by TEXT NOT NULL,
|
|
85
|
+
created_at TEXT NOT NULL, management_mode TEXT NOT NULL DEFAULT 'human'
|
|
86
|
+
CHECK (management_mode IN ('human', 'ai', 'hybrid')), routing_criteria_json TEXT NOT NULL DEFAULT '{"match":"all","conditions":[]}', reviewer_instructions TEXT NOT NULL DEFAULT 'Review the report against the published customer policy.', ai_instructions TEXT, enrichment_requirements_json TEXT NOT NULL DEFAULT '[]', ai_bounds_json TEXT NOT NULL DEFAULT '{}', retired_at TEXT,
|
|
87
|
+
UNIQUE (queue_id, version)
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
CREATE TABLE routing_rule_versions (
|
|
91
|
+
id TEXT PRIMARY KEY,
|
|
92
|
+
installation_id TEXT NOT NULL REFERENCES installations(id),
|
|
93
|
+
version INTEGER NOT NULL CHECK (version > 0),
|
|
94
|
+
rules_json TEXT NOT NULL,
|
|
95
|
+
fixture_results_json TEXT NOT NULL,
|
|
96
|
+
published_at TEXT,
|
|
97
|
+
created_by TEXT NOT NULL,
|
|
98
|
+
created_at TEXT NOT NULL,
|
|
99
|
+
UNIQUE (installation_id, version)
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
CREATE TABLE reports (
|
|
103
|
+
id TEXT PRIMARY KEY,
|
|
104
|
+
public_reference TEXT NOT NULL UNIQUE,
|
|
105
|
+
installation_id TEXT NOT NULL REFERENCES installations(id),
|
|
106
|
+
integration_id TEXT NOT NULL REFERENCES application_integrations(id),
|
|
107
|
+
idempotency_key TEXT NOT NULL,
|
|
108
|
+
source TEXT NOT NULL CHECK (source IN ('signed_widget', 'public_page', 'server_api')),
|
|
109
|
+
form_version_id TEXT REFERENCES report_form_versions(id),
|
|
110
|
+
policy_version_id TEXT REFERENCES policy_versions(id),
|
|
111
|
+
routing_rule_version_id TEXT REFERENCES routing_rule_versions(id),
|
|
112
|
+
queue_id TEXT REFERENCES queue_definitions(id),
|
|
113
|
+
state TEXT NOT NULL CHECK (state IN (
|
|
114
|
+
'received', 'human_review', 'ai_review', 'awaiting_reporter', 'resolved_by_human',
|
|
115
|
+
'resolved_by_ai', 'human_review_requested', 'appealed', 'closed'
|
|
116
|
+
)),
|
|
117
|
+
priority INTEGER NOT NULL DEFAULT 50 CHECK (priority BETWEEN 0 AND 100),
|
|
118
|
+
reason_code TEXT NOT NULL,
|
|
119
|
+
locale TEXT NOT NULL,
|
|
120
|
+
consent_notice TEXT NOT NULL,
|
|
121
|
+
consented_at TEXT NOT NULL,
|
|
122
|
+
submitted_at TEXT NOT NULL,
|
|
123
|
+
received_at TEXT NOT NULL,
|
|
124
|
+
updated_at TEXT NOT NULL,
|
|
125
|
+
due_at TEXT,
|
|
126
|
+
resolved_at TEXT,
|
|
127
|
+
routing_status TEXT NOT NULL DEFAULT 'pending' CHECK (routing_status IN ('pending', 'enqueued', 'processing', 'complete', 'failed')),
|
|
128
|
+
routing_attempts INTEGER NOT NULL DEFAULT 0 CHECK (routing_attempts >= 0),
|
|
129
|
+
routing_error_code TEXT, queue_version_id TEXT REFERENCES queue_versions(id), routing_agent_version_id TEXT, routing_reason_json TEXT, intake_decision_id TEXT REFERENCES intake_decisions(id), duplicate_group_id TEXT REFERENCES duplicate_groups(id), quarantine_reason_code TEXT,
|
|
130
|
+
UNIQUE (integration_id, idempotency_key)
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
CREATE TABLE report_participants (
|
|
134
|
+
id TEXT PRIMARY KEY,
|
|
135
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
136
|
+
audience TEXT NOT NULL CHECK (audience IN ('reporter', 'affected_user')),
|
|
137
|
+
reference TEXT,
|
|
138
|
+
contact_mode TEXT NOT NULL CHECK (contact_mode IN ('portal', 'customer_notification', 'none')),
|
|
139
|
+
contact_ciphertext TEXT,
|
|
140
|
+
created_at TEXT NOT NULL, reference_redacted_at TEXT,
|
|
141
|
+
UNIQUE (report_id, audience)
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
CREATE TABLE report_targets (
|
|
145
|
+
id TEXT PRIMARY KEY,
|
|
146
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
147
|
+
target_type TEXT NOT NULL,
|
|
148
|
+
target_reference TEXT NOT NULL,
|
|
149
|
+
owner_reference TEXT,
|
|
150
|
+
customer_url TEXT,
|
|
151
|
+
signed_facts_json TEXT NOT NULL DEFAULT '{}',
|
|
152
|
+
created_at TEXT NOT NULL, sensitive_redacted_at TEXT, routing_facts_json TEXT NOT NULL DEFAULT '{}',
|
|
153
|
+
UNIQUE (report_id, target_type, target_reference)
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
CREATE TABLE report_answers (
|
|
157
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
158
|
+
field_key TEXT NOT NULL,
|
|
159
|
+
value_json TEXT NOT NULL,
|
|
160
|
+
created_at TEXT NOT NULL, redacted_at TEXT,
|
|
161
|
+
PRIMARY KEY (report_id, field_key)
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
CREATE TABLE evidence_references (
|
|
165
|
+
id TEXT PRIMARY KEY,
|
|
166
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
167
|
+
evidence_kind TEXT NOT NULL CHECK (evidence_kind IN ('allegation', 'signed_fact', 'customer_reference', 'fetched_record', 'snapshot')),
|
|
168
|
+
reference TEXT NOT NULL,
|
|
169
|
+
availability TEXT NOT NULL DEFAULT 'available' CHECK (availability IN ('available', 'unavailable', 'deleted', 'changed')),
|
|
170
|
+
retention_class TEXT NOT NULL DEFAULT 'reference',
|
|
171
|
+
created_at TEXT NOT NULL,
|
|
172
|
+
UNIQUE (report_id, evidence_kind, reference)
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
CREATE TABLE report_state_history (
|
|
176
|
+
id TEXT PRIMARY KEY,
|
|
177
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
178
|
+
background_job_id TEXT UNIQUE REFERENCES background_jobs(id),
|
|
179
|
+
from_state TEXT,
|
|
180
|
+
to_state TEXT NOT NULL,
|
|
181
|
+
reason_code TEXT NOT NULL,
|
|
182
|
+
actor_type TEXT NOT NULL,
|
|
183
|
+
actor_id TEXT NOT NULL,
|
|
184
|
+
created_at TEXT NOT NULL
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
CREATE TABLE owner_setup_tokens (
|
|
188
|
+
id TEXT PRIMARY KEY,
|
|
189
|
+
email TEXT NOT NULL COLLATE NOCASE,
|
|
190
|
+
token_hash TEXT NOT NULL UNIQUE,
|
|
191
|
+
purpose TEXT NOT NULL CHECK (purpose IN ('bootstrap', 'recovery')),
|
|
192
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'consumed', 'revoked')),
|
|
193
|
+
expires_at TEXT NOT NULL,
|
|
194
|
+
consumed_at TEXT,
|
|
195
|
+
revoked_at TEXT,
|
|
196
|
+
created_at TEXT NOT NULL
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
CREATE TABLE context_token_uses (
|
|
200
|
+
jti TEXT PRIMARY KEY,
|
|
201
|
+
integration_id TEXT NOT NULL REFERENCES application_integrations(id),
|
|
202
|
+
report_id TEXT NOT NULL UNIQUE REFERENCES reports(id) ON DELETE CASCADE,
|
|
203
|
+
used_at TEXT NOT NULL
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
CREATE TABLE case_messages (
|
|
207
|
+
id TEXT PRIMARY KEY,
|
|
208
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
209
|
+
audience TEXT NOT NULL CHECK (audience IN ('internal', 'reporter', 'affected_user')),
|
|
210
|
+
direction TEXT NOT NULL CHECK (direction IN ('inbound', 'outbound', 'internal')),
|
|
211
|
+
sender_type TEXT NOT NULL CHECK (sender_type IN ('reporter', 'affected_user', 'human', 'ai', 'system')),
|
|
212
|
+
sender_id TEXT NOT NULL,
|
|
213
|
+
body TEXT NOT NULL,
|
|
214
|
+
template_version_id TEXT,
|
|
215
|
+
automated INTEGER NOT NULL DEFAULT 0 CHECK (automated IN (0, 1)),
|
|
216
|
+
delivery_state TEXT NOT NULL DEFAULT 'not_required' CHECK (delivery_state IN ('not_required', 'queued', 'delivered', 'failed', 'suppressed')),
|
|
217
|
+
created_at TEXT NOT NULL
|
|
218
|
+
, idempotency_key TEXT, redacted_at TEXT, conversation_id TEXT REFERENCES conversations(id), workflow_run_id TEXT REFERENCES workflow_runs(id), audience_checked_at TEXT);
|
|
219
|
+
|
|
220
|
+
CREATE TABLE review_claims (
|
|
221
|
+
report_id TEXT PRIMARY KEY REFERENCES reports(id) ON DELETE CASCADE,
|
|
222
|
+
reviewer_id TEXT NOT NULL,
|
|
223
|
+
claimed_at TEXT NOT NULL,
|
|
224
|
+
expires_at TEXT NOT NULL,
|
|
225
|
+
version INTEGER NOT NULL DEFAULT 1 CHECK (version > 0)
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
CREATE TABLE decisions (
|
|
229
|
+
id TEXT PRIMARY KEY,
|
|
230
|
+
report_id TEXT NOT NULL REFERENCES reports(id),
|
|
231
|
+
decision_code TEXT NOT NULL,
|
|
232
|
+
policy_version_id TEXT NOT NULL REFERENCES policy_versions(id),
|
|
233
|
+
policy_code TEXT NOT NULL,
|
|
234
|
+
rationale TEXT NOT NULL,
|
|
235
|
+
evidence_references_json TEXT NOT NULL,
|
|
236
|
+
maker_type TEXT NOT NULL CHECK (maker_type IN ('human', 'ai')),
|
|
237
|
+
maker_id TEXT NOT NULL,
|
|
238
|
+
queue_version_id TEXT REFERENCES queue_versions(id),
|
|
239
|
+
ai_run_id TEXT,
|
|
240
|
+
proposed_action_code TEXT,
|
|
241
|
+
supersedes_decision_id TEXT REFERENCES decisions(id),
|
|
242
|
+
created_at TEXT NOT NULL
|
|
243
|
+
, idempotency_key TEXT, sensitive_redacted_at TEXT);
|
|
244
|
+
|
|
245
|
+
CREATE TABLE notices (
|
|
246
|
+
id TEXT PRIMARY KEY,
|
|
247
|
+
report_id TEXT NOT NULL REFERENCES reports(id),
|
|
248
|
+
decision_id TEXT REFERENCES decisions(id),
|
|
249
|
+
audience TEXT NOT NULL CHECK (audience IN ('reporter', 'affected_user')),
|
|
250
|
+
template_version_id TEXT NOT NULL,
|
|
251
|
+
rendered_body TEXT NOT NULL,
|
|
252
|
+
delivery_state TEXT NOT NULL CHECK (delivery_state IN ('queued', 'delivered', 'failed', 'suppressed')),
|
|
253
|
+
created_at TEXT NOT NULL,
|
|
254
|
+
updated_at TEXT NOT NULL
|
|
255
|
+
, idempotency_key TEXT, message_id TEXT REFERENCES case_messages(id), redacted_at TEXT);
|
|
256
|
+
|
|
257
|
+
CREATE TABLE "decision_action_outbox" (
|
|
258
|
+
id TEXT PRIMARY KEY,
|
|
259
|
+
report_id TEXT NOT NULL REFERENCES reports(id),
|
|
260
|
+
decision_id TEXT NOT NULL REFERENCES decisions(id),
|
|
261
|
+
idempotency_key TEXT NOT NULL UNIQUE,
|
|
262
|
+
action_code TEXT NOT NULL,
|
|
263
|
+
target_reference TEXT NOT NULL,
|
|
264
|
+
payload_json TEXT NOT NULL,
|
|
265
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'delivering', 'accepted', 'rejected', 'already_applied', 'failed')),
|
|
266
|
+
attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
|
|
267
|
+
next_attempt_at TEXT NOT NULL,
|
|
268
|
+
last_error_code TEXT,
|
|
269
|
+
created_at TEXT NOT NULL,
|
|
270
|
+
updated_at TEXT NOT NULL
|
|
271
|
+
, lease_expires_at TEXT, terminal INTEGER NOT NULL DEFAULT 0 CHECK (terminal IN (0, 1)), payload_redacted_at TEXT);
|
|
272
|
+
|
|
273
|
+
CREATE TABLE "decision_action_attempts" (
|
|
274
|
+
id TEXT PRIMARY KEY,
|
|
275
|
+
action_id TEXT NOT NULL REFERENCES "decision_action_outbox"(id) ON DELETE CASCADE,
|
|
276
|
+
attempt_number INTEGER NOT NULL CHECK (attempt_number > 0),
|
|
277
|
+
response_class TEXT NOT NULL,
|
|
278
|
+
response_status INTEGER,
|
|
279
|
+
error_code TEXT,
|
|
280
|
+
started_at TEXT NOT NULL,
|
|
281
|
+
finished_at TEXT NOT NULL,
|
|
282
|
+
UNIQUE (action_id, attempt_number)
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
CREATE TABLE notification_outbox (
|
|
286
|
+
id TEXT PRIMARY KEY,
|
|
287
|
+
notice_id TEXT NOT NULL REFERENCES notices(id),
|
|
288
|
+
idempotency_key TEXT NOT NULL UNIQUE,
|
|
289
|
+
channel TEXT NOT NULL CHECK (channel IN ('customer_webhook', 'email')),
|
|
290
|
+
payload_json TEXT NOT NULL,
|
|
291
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'delivering', 'delivered', 'failed', 'suppressed')),
|
|
292
|
+
attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
|
|
293
|
+
next_attempt_at TEXT NOT NULL,
|
|
294
|
+
last_error_code TEXT,
|
|
295
|
+
created_at TEXT NOT NULL,
|
|
296
|
+
updated_at TEXT NOT NULL
|
|
297
|
+
, lease_expires_at TEXT, terminal INTEGER NOT NULL DEFAULT 0 CHECK (terminal IN (0, 1)), payload_redacted_at TEXT);
|
|
298
|
+
|
|
299
|
+
CREATE TABLE notification_attempts (
|
|
300
|
+
id TEXT PRIMARY KEY,
|
|
301
|
+
notification_id TEXT NOT NULL REFERENCES notification_outbox(id) ON DELETE CASCADE,
|
|
302
|
+
attempt_number INTEGER NOT NULL CHECK (attempt_number > 0),
|
|
303
|
+
response_class TEXT NOT NULL,
|
|
304
|
+
response_status INTEGER,
|
|
305
|
+
error_code TEXT,
|
|
306
|
+
started_at TEXT NOT NULL,
|
|
307
|
+
finished_at TEXT NOT NULL,
|
|
308
|
+
UNIQUE (notification_id, attempt_number)
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
CREATE TABLE appeals (
|
|
312
|
+
id TEXT PRIMARY KEY,
|
|
313
|
+
report_id TEXT NOT NULL REFERENCES reports(id),
|
|
314
|
+
decision_id TEXT NOT NULL REFERENCES decisions(id),
|
|
315
|
+
appellant_audience TEXT NOT NULL CHECK (appellant_audience IN ('reporter', 'affected_user')),
|
|
316
|
+
reason TEXT NOT NULL,
|
|
317
|
+
state TEXT NOT NULL CHECK (state IN ('submitted', 'human_review', 'upheld', 'modified', 'reversed')),
|
|
318
|
+
queue_id TEXT NOT NULL REFERENCES queue_definitions(id),
|
|
319
|
+
submitted_at TEXT NOT NULL,
|
|
320
|
+
resolved_at TEXT, idempotency_key TEXT, reason_redacted_at TEXT,
|
|
321
|
+
UNIQUE (decision_id, appellant_audience)
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
CREATE TABLE appeal_decisions (
|
|
325
|
+
id TEXT PRIMARY KEY,
|
|
326
|
+
appeal_id TEXT NOT NULL UNIQUE REFERENCES appeals(id),
|
|
327
|
+
outcome TEXT NOT NULL CHECK (outcome IN ('upheld', 'modified', 'reversed')),
|
|
328
|
+
rationale TEXT NOT NULL,
|
|
329
|
+
reviewer_id TEXT NOT NULL,
|
|
330
|
+
corrective_action_id TEXT REFERENCES "decision_action_outbox"(id),
|
|
331
|
+
created_at TEXT NOT NULL
|
|
332
|
+
, idempotency_key TEXT, rationale_redacted_at TEXT);
|
|
333
|
+
|
|
334
|
+
CREATE TABLE background_jobs (
|
|
335
|
+
id TEXT PRIMARY KEY,
|
|
336
|
+
report_id TEXT REFERENCES reports(id),
|
|
337
|
+
job_type TEXT NOT NULL CHECK (job_type IN ('route_report', 'deliver_action', 'deliver_notification', 'resume_ai', 'retention')),
|
|
338
|
+
idempotency_key TEXT NOT NULL UNIQUE,
|
|
339
|
+
state TEXT NOT NULL CHECK (state IN ('pending', 'enqueued', 'processing', 'complete', 'failed', 'dead_letter')),
|
|
340
|
+
payload_json TEXT NOT NULL,
|
|
341
|
+
attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
|
|
342
|
+
available_at TEXT NOT NULL,
|
|
343
|
+
last_error_code TEXT,
|
|
344
|
+
created_at TEXT NOT NULL,
|
|
345
|
+
updated_at TEXT NOT NULL
|
|
346
|
+
, ai_config_version_id TEXT REFERENCES ai_queue_config_versions(id));
|
|
347
|
+
|
|
348
|
+
CREATE TABLE audit_entries (
|
|
349
|
+
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
350
|
+
id TEXT NOT NULL UNIQUE,
|
|
351
|
+
action TEXT NOT NULL,
|
|
352
|
+
actor_type TEXT NOT NULL,
|
|
353
|
+
actor_id TEXT NOT NULL,
|
|
354
|
+
target_type TEXT NOT NULL,
|
|
355
|
+
target_id TEXT NOT NULL,
|
|
356
|
+
details_json TEXT NOT NULL,
|
|
357
|
+
previous_hash TEXT NOT NULL UNIQUE,
|
|
358
|
+
entry_hash TEXT NOT NULL UNIQUE,
|
|
359
|
+
created_at TEXT NOT NULL
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
CREATE TABLE daily_aggregates (
|
|
363
|
+
aggregate_date TEXT NOT NULL,
|
|
364
|
+
metric_key TEXT NOT NULL,
|
|
365
|
+
dimension_key TEXT NOT NULL,
|
|
366
|
+
dimension_value TEXT NOT NULL,
|
|
367
|
+
value INTEGER NOT NULL DEFAULT 0,
|
|
368
|
+
updated_at TEXT NOT NULL,
|
|
369
|
+
PRIMARY KEY (aggregate_date, metric_key, dimension_key, dimension_value)
|
|
370
|
+
);
|
|
371
|
+
|
|
372
|
+
CREATE TABLE message_template_versions (
|
|
373
|
+
id TEXT PRIMARY KEY,
|
|
374
|
+
installation_id TEXT NOT NULL REFERENCES installations(id),
|
|
375
|
+
template_key TEXT NOT NULL,
|
|
376
|
+
version INTEGER NOT NULL CHECK (version > 0),
|
|
377
|
+
audience TEXT NOT NULL CHECK (audience IN ('reporter', 'affected_user')),
|
|
378
|
+
purpose TEXT NOT NULL CHECK (purpose IN ('follow_up', 'outcome', 'affected_user_notice', 'appeal_outcome')),
|
|
379
|
+
locale TEXT NOT NULL,
|
|
380
|
+
body_template TEXT NOT NULL,
|
|
381
|
+
published_at TEXT,
|
|
382
|
+
created_by TEXT NOT NULL,
|
|
383
|
+
created_at TEXT NOT NULL, automation_allowed INTEGER NOT NULL DEFAULT 0 CHECK (automation_allowed IN (0, 1)), variables_schema_json TEXT NOT NULL DEFAULT '{}',
|
|
384
|
+
UNIQUE (installation_id, template_key, version, locale)
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
CREATE TABLE appeal_claims (
|
|
388
|
+
appeal_id TEXT PRIMARY KEY REFERENCES appeals(id) ON DELETE CASCADE,
|
|
389
|
+
reviewer_id TEXT NOT NULL,
|
|
390
|
+
claimed_at TEXT NOT NULL,
|
|
391
|
+
expires_at TEXT NOT NULL,
|
|
392
|
+
version INTEGER NOT NULL DEFAULT 1 CHECK (version > 0)
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
CREATE TABLE audit_events (
|
|
396
|
+
id TEXT PRIMARY KEY,
|
|
397
|
+
idempotency_key TEXT NOT NULL UNIQUE,
|
|
398
|
+
action TEXT NOT NULL,
|
|
399
|
+
actor_type TEXT NOT NULL,
|
|
400
|
+
actor_id TEXT NOT NULL,
|
|
401
|
+
target_type TEXT NOT NULL,
|
|
402
|
+
target_id TEXT NOT NULL,
|
|
403
|
+
details_json TEXT NOT NULL,
|
|
404
|
+
created_at TEXT NOT NULL,
|
|
405
|
+
chained_at TEXT,
|
|
406
|
+
chain_error_code TEXT
|
|
407
|
+
);
|
|
408
|
+
|
|
409
|
+
CREATE TABLE intake_rate_limits (
|
|
410
|
+
bucket_key TEXT NOT NULL,
|
|
411
|
+
window_start TEXT NOT NULL,
|
|
412
|
+
request_count INTEGER NOT NULL DEFAULT 0 CHECK (request_count >= 0),
|
|
413
|
+
updated_at TEXT NOT NULL,
|
|
414
|
+
PRIMARY KEY (bucket_key, window_start)
|
|
415
|
+
);
|
|
416
|
+
|
|
417
|
+
CREATE TABLE ai_queue_config_versions (
|
|
418
|
+
id TEXT PRIMARY KEY,
|
|
419
|
+
queue_id TEXT NOT NULL REFERENCES queue_definitions(id),
|
|
420
|
+
version INTEGER NOT NULL CHECK (version > 0),
|
|
421
|
+
mode TEXT NOT NULL CHECK (mode IN ('off', 'shadow', 'assist', 'autonomous_low_priority')),
|
|
422
|
+
enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
|
|
423
|
+
provider TEXT NOT NULL CHECK (provider IN ('workers_ai')),
|
|
424
|
+
model TEXT NOT NULL,
|
|
425
|
+
input_cost_microusd_per_million INTEGER NOT NULL DEFAULT 0 CHECK (input_cost_microusd_per_million >= 0),
|
|
426
|
+
output_cost_microusd_per_million INTEGER NOT NULL DEFAULT 0 CHECK (output_cost_microusd_per_million >= 0),
|
|
427
|
+
prompt_version TEXT NOT NULL,
|
|
428
|
+
policy_version_id TEXT NOT NULL REFERENCES policy_versions(id),
|
|
429
|
+
eligible_form_versions_json TEXT NOT NULL,
|
|
430
|
+
eligible_sources_json TEXT NOT NULL,
|
|
431
|
+
eligible_reason_codes_json TEXT NOT NULL,
|
|
432
|
+
eligible_target_types_json TEXT NOT NULL,
|
|
433
|
+
allowed_fields_json TEXT NOT NULL,
|
|
434
|
+
allowed_outcomes_json TEXT NOT NULL,
|
|
435
|
+
allowed_action_codes_json TEXT NOT NULL DEFAULT '[]',
|
|
436
|
+
allowed_template_ids_json TEXT NOT NULL,
|
|
437
|
+
confidence_threshold REAL NOT NULL CHECK (confidence_threshold >= 0 AND confidence_threshold <= 1),
|
|
438
|
+
max_follow_up_turns INTEGER NOT NULL CHECK (max_follow_up_turns >= 0 AND max_follow_up_turns <= 5),
|
|
439
|
+
max_wait_hours INTEGER NOT NULL CHECK (max_wait_hours >= 1 AND max_wait_hours <= 720),
|
|
440
|
+
daily_report_budget INTEGER NOT NULL CHECK (daily_report_budget >= 0),
|
|
441
|
+
daily_cost_budget_microusd INTEGER NOT NULL CHECK (daily_cost_budget_microusd >= 0),
|
|
442
|
+
quality_sample_rate REAL NOT NULL CHECK (quality_sample_rate >= 0 AND quality_sample_rate <= 1),
|
|
443
|
+
fallback_queue_id TEXT NOT NULL REFERENCES queue_definitions(id),
|
|
444
|
+
pause_state TEXT NOT NULL DEFAULT 'ready' CHECK (pause_state IN ('ready', 'paused', 'budget_exhausted', 'quality_paused')),
|
|
445
|
+
published_at TEXT,
|
|
446
|
+
retired_at TEXT,
|
|
447
|
+
created_by TEXT NOT NULL,
|
|
448
|
+
created_at TEXT NOT NULL,
|
|
449
|
+
idempotency_key TEXT NOT NULL UNIQUE, minimum_shadow_runs INTEGER NOT NULL DEFAULT 25 CHECK (minimum_shadow_runs >= 1 AND minimum_shadow_runs <= 100000), minimum_quality_reviews INTEGER NOT NULL DEFAULT 5 CHECK (minimum_quality_reviews >= 0 AND minimum_quality_reviews <= 100000), maximum_failure_rate REAL NOT NULL DEFAULT 0.05 CHECK (maximum_failure_rate >= 0 AND maximum_failure_rate <= 1), maximum_disagreement_rate REAL NOT NULL DEFAULT 0.10 CHECK (maximum_disagreement_rate >= 0 AND maximum_disagreement_rate <= 1), pause_reason TEXT, paused_at TEXT, queue_version_id TEXT REFERENCES queue_versions(id),
|
|
450
|
+
UNIQUE (queue_id, version)
|
|
451
|
+
);
|
|
452
|
+
|
|
453
|
+
CREATE TABLE dead_letter_items (
|
|
454
|
+
id TEXT PRIMARY KEY,
|
|
455
|
+
fingerprint TEXT NOT NULL UNIQUE,
|
|
456
|
+
source_queue TEXT NOT NULL,
|
|
457
|
+
source_message_id TEXT NOT NULL,
|
|
458
|
+
job_type TEXT NOT NULL CHECK (job_type IN (
|
|
459
|
+
'route_report', 'process_ai_report', 'fetch_evidence',
|
|
460
|
+
'dispatch_workflow', 'deliver_action', 'deliver_notification', 'deliver_email',
|
|
461
|
+
'apply_action_proposal', 'invalid'
|
|
462
|
+
)),
|
|
463
|
+
job_id TEXT,
|
|
464
|
+
report_id TEXT REFERENCES reports(id),
|
|
465
|
+
outbox_id TEXT,
|
|
466
|
+
incident_id TEXT REFERENCES operations_incidents(id) ON DELETE SET NULL,
|
|
467
|
+
state TEXT NOT NULL DEFAULT 'open' CHECK (state IN ('open', 'acknowledged', 'resolved')),
|
|
468
|
+
error_code TEXT NOT NULL,
|
|
469
|
+
occurrence_count INTEGER NOT NULL DEFAULT 1 CHECK (occurrence_count > 0),
|
|
470
|
+
details_json TEXT NOT NULL DEFAULT '{}',
|
|
471
|
+
first_seen_at TEXT NOT NULL,
|
|
472
|
+
last_seen_at TEXT NOT NULL,
|
|
473
|
+
resolved_at TEXT
|
|
474
|
+
);
|
|
475
|
+
|
|
476
|
+
CREATE TABLE ai_runs (
|
|
477
|
+
id TEXT PRIMARY KEY,
|
|
478
|
+
report_id TEXT NOT NULL REFERENCES reports(id),
|
|
479
|
+
background_job_id TEXT NOT NULL UNIQUE REFERENCES background_jobs(id),
|
|
480
|
+
config_version_id TEXT NOT NULL REFERENCES ai_queue_config_versions(id),
|
|
481
|
+
mode TEXT NOT NULL CHECK (mode IN ('shadow', 'assist', 'autonomous_low_priority')),
|
|
482
|
+
provider TEXT NOT NULL,
|
|
483
|
+
model TEXT NOT NULL,
|
|
484
|
+
prompt_version TEXT NOT NULL,
|
|
485
|
+
policy_version_id TEXT NOT NULL REFERENCES policy_versions(id),
|
|
486
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'succeeded', 'invalid', 'failed', 'escalated')),
|
|
487
|
+
input_references_json TEXT NOT NULL,
|
|
488
|
+
output_json TEXT,
|
|
489
|
+
error_code TEXT,
|
|
490
|
+
started_at TEXT NOT NULL,
|
|
491
|
+
finished_at TEXT,
|
|
492
|
+
input_units INTEGER,
|
|
493
|
+
output_units INTEGER,
|
|
494
|
+
estimated_cost_microusd INTEGER NOT NULL DEFAULT 0 CHECK (estimated_cost_microusd >= 0)
|
|
495
|
+
, output_redacted_at TEXT);
|
|
496
|
+
|
|
497
|
+
CREATE TABLE ai_results (
|
|
498
|
+
id TEXT PRIMARY KEY,
|
|
499
|
+
ai_run_id TEXT NOT NULL UNIQUE REFERENCES ai_runs(id) ON DELETE CASCADE,
|
|
500
|
+
outcome TEXT NOT NULL,
|
|
501
|
+
policy_code TEXT,
|
|
502
|
+
evidence_references_json TEXT NOT NULL,
|
|
503
|
+
summary TEXT NOT NULL,
|
|
504
|
+
confidence REAL,
|
|
505
|
+
uncertain INTEGER NOT NULL CHECK (uncertain IN (0, 1)),
|
|
506
|
+
message_template_id TEXT REFERENCES message_template_versions(id),
|
|
507
|
+
message_variables_json TEXT,
|
|
508
|
+
action_code TEXT,
|
|
509
|
+
escalation_code TEXT,
|
|
510
|
+
validation_state TEXT NOT NULL CHECK (validation_state IN ('valid', 'invalid')),
|
|
511
|
+
validation_errors_json TEXT NOT NULL,
|
|
512
|
+
created_at TEXT NOT NULL
|
|
513
|
+
, redacted_at TEXT);
|
|
514
|
+
|
|
515
|
+
CREATE TABLE ai_tool_calls (
|
|
516
|
+
id TEXT PRIMARY KEY,
|
|
517
|
+
ai_run_id TEXT NOT NULL REFERENCES ai_runs(id) ON DELETE CASCADE,
|
|
518
|
+
tool_name TEXT NOT NULL,
|
|
519
|
+
input_references_json TEXT NOT NULL,
|
|
520
|
+
status TEXT NOT NULL CHECK (status IN ('allowed', 'denied', 'succeeded', 'failed')),
|
|
521
|
+
error_code TEXT,
|
|
522
|
+
created_at TEXT NOT NULL
|
|
523
|
+
);
|
|
524
|
+
|
|
525
|
+
CREATE TABLE ai_quality_samples (
|
|
526
|
+
id TEXT PRIMARY KEY,
|
|
527
|
+
ai_run_id TEXT NOT NULL UNIQUE REFERENCES ai_runs(id),
|
|
528
|
+
report_id TEXT NOT NULL REFERENCES reports(id),
|
|
529
|
+
sample_reason TEXT NOT NULL,
|
|
530
|
+
state TEXT NOT NULL CHECK (state IN ('pending', 'claimed', 'complete')),
|
|
531
|
+
selected_at TEXT NOT NULL
|
|
532
|
+
, claimed_by TEXT, claimed_at TEXT, claim_expires_at TEXT);
|
|
533
|
+
|
|
534
|
+
CREATE TABLE quality_reviews (
|
|
535
|
+
id TEXT PRIMARY KEY,
|
|
536
|
+
sample_id TEXT NOT NULL UNIQUE REFERENCES ai_quality_samples(id),
|
|
537
|
+
reviewer_id TEXT NOT NULL,
|
|
538
|
+
agrees INTEGER NOT NULL CHECK (agrees IN (0, 1)),
|
|
539
|
+
notes TEXT NOT NULL,
|
|
540
|
+
created_at TEXT NOT NULL
|
|
541
|
+
, notes_redacted_at TEXT, issue_codes_json TEXT NOT NULL DEFAULT '[]', corrected_outcome_code TEXT, corrected_policy_code TEXT, idempotency_key TEXT);
|
|
542
|
+
|
|
543
|
+
CREATE TABLE ai_usage_daily (
|
|
544
|
+
usage_date TEXT NOT NULL,
|
|
545
|
+
config_version_id TEXT NOT NULL REFERENCES ai_queue_config_versions(id),
|
|
546
|
+
reports_started INTEGER NOT NULL DEFAULT 0 CHECK (reports_started >= 0),
|
|
547
|
+
reports_resolved INTEGER NOT NULL DEFAULT 0 CHECK (reports_resolved >= 0),
|
|
548
|
+
reports_escalated INTEGER NOT NULL DEFAULT 0 CHECK (reports_escalated >= 0),
|
|
549
|
+
failures INTEGER NOT NULL DEFAULT 0 CHECK (failures >= 0),
|
|
550
|
+
estimated_cost_microusd INTEGER NOT NULL DEFAULT 0 CHECK (estimated_cost_microusd >= 0),
|
|
551
|
+
updated_at TEXT NOT NULL, eligible_reports INTEGER NOT NULL DEFAULT 0 CHECK (eligible_reports >= 0), waiting_for_reporter INTEGER NOT NULL DEFAULT 0 CHECK (waiting_for_reporter >= 0), human_review_requests INTEGER NOT NULL DEFAULT 0 CHECK (human_review_requests >= 0), appeals_filed INTEGER NOT NULL DEFAULT 0 CHECK (appeals_filed >= 0), appeal_reversals INTEGER NOT NULL DEFAULT 0 CHECK (appeal_reversals >= 0), invalid_outputs INTEGER NOT NULL DEFAULT 0 CHECK (invalid_outputs >= 0), provider_errors INTEGER NOT NULL DEFAULT 0 CHECK (provider_errors >= 0), timeouts INTEGER NOT NULL DEFAULT 0 CHECK (timeouts >= 0),
|
|
552
|
+
PRIMARY KEY (usage_date, config_version_id)
|
|
553
|
+
);
|
|
554
|
+
|
|
555
|
+
CREATE TABLE legal_holds (
|
|
556
|
+
id TEXT PRIMARY KEY,
|
|
557
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
558
|
+
reason TEXT NOT NULL,
|
|
559
|
+
state TEXT NOT NULL CHECK (state IN ('active', 'released')),
|
|
560
|
+
placed_by TEXT NOT NULL,
|
|
561
|
+
idempotency_key TEXT NOT NULL UNIQUE,
|
|
562
|
+
created_at TEXT NOT NULL,
|
|
563
|
+
released_by TEXT,
|
|
564
|
+
release_idempotency_key TEXT UNIQUE,
|
|
565
|
+
released_at TEXT
|
|
566
|
+
);
|
|
567
|
+
|
|
568
|
+
CREATE TABLE deletion_requests (
|
|
569
|
+
id TEXT PRIMARY KEY,
|
|
570
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
571
|
+
scope TEXT NOT NULL CHECK (scope IN ('participant_data', 'all_permitted_data')),
|
|
572
|
+
reason TEXT NOT NULL,
|
|
573
|
+
state TEXT NOT NULL CHECK (state IN ('pending', 'blocked_by_hold', 'complete', 'failed')),
|
|
574
|
+
requested_by TEXT NOT NULL,
|
|
575
|
+
idempotency_key TEXT NOT NULL UNIQUE,
|
|
576
|
+
requested_at TEXT NOT NULL,
|
|
577
|
+
completed_at TEXT,
|
|
578
|
+
last_error_code TEXT
|
|
579
|
+
);
|
|
580
|
+
|
|
581
|
+
CREATE TABLE retention_jobs (
|
|
582
|
+
id TEXT PRIMARY KEY,
|
|
583
|
+
job_kind TEXT NOT NULL CHECK (job_kind IN ('scheduled_retention', 'deletion_request')),
|
|
584
|
+
state TEXT NOT NULL CHECK (state IN ('running', 'complete', 'failed')),
|
|
585
|
+
cutoff_at TEXT NOT NULL,
|
|
586
|
+
messages_redacted INTEGER NOT NULL DEFAULT 0 CHECK (messages_redacted >= 0),
|
|
587
|
+
reports_anonymized INTEGER NOT NULL DEFAULT 0 CHECK (reports_anonymized >= 0),
|
|
588
|
+
portal_sessions_revoked INTEGER NOT NULL DEFAULT 0 CHECK (portal_sessions_revoked >= 0),
|
|
589
|
+
error_code TEXT,
|
|
590
|
+
started_at TEXT NOT NULL,
|
|
591
|
+
finished_at TEXT
|
|
592
|
+
);
|
|
593
|
+
|
|
594
|
+
CREATE TABLE analyst_profiles (
|
|
595
|
+
actor_id TEXT PRIMARY KEY,
|
|
596
|
+
display_name TEXT NOT NULL,
|
|
597
|
+
email TEXT,
|
|
598
|
+
avatar_url TEXT,
|
|
599
|
+
avatar_color TEXT NOT NULL,
|
|
600
|
+
roles_json TEXT NOT NULL,
|
|
601
|
+
created_at TEXT NOT NULL,
|
|
602
|
+
updated_at TEXT NOT NULL,
|
|
603
|
+
last_authenticated_at TEXT NOT NULL
|
|
604
|
+
);
|
|
605
|
+
|
|
606
|
+
CREATE TABLE analyst_sessions (
|
|
607
|
+
id TEXT PRIMARY KEY,
|
|
608
|
+
actor_id TEXT NOT NULL REFERENCES analyst_profiles(actor_id) ON DELETE CASCADE,
|
|
609
|
+
activity_state TEXT NOT NULL DEFAULT 'online'
|
|
610
|
+
CHECK (activity_state IN ('online', 'viewing', 'editing', 'away')),
|
|
611
|
+
active_report_id TEXT REFERENCES reports(id) ON DELETE SET NULL,
|
|
612
|
+
connected_at TEXT NOT NULL,
|
|
613
|
+
last_seen_at TEXT NOT NULL
|
|
614
|
+
);
|
|
615
|
+
|
|
616
|
+
CREATE TABLE configuration_mutations (
|
|
617
|
+
idempotency_key TEXT PRIMARY KEY,
|
|
618
|
+
action TEXT NOT NULL,
|
|
619
|
+
actor_id TEXT NOT NULL,
|
|
620
|
+
target_id TEXT NOT NULL,
|
|
621
|
+
response_json TEXT NOT NULL,
|
|
622
|
+
created_at TEXT NOT NULL
|
|
623
|
+
);
|
|
624
|
+
|
|
625
|
+
CREATE TABLE routing_agent_versions (
|
|
626
|
+
id TEXT PRIMARY KEY,
|
|
627
|
+
installation_id TEXT NOT NULL REFERENCES installations(id),
|
|
628
|
+
version INTEGER NOT NULL CHECK (version > 0),
|
|
629
|
+
enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
|
|
630
|
+
rollout_mode TEXT NOT NULL CHECK (rollout_mode IN ('off', 'shadow', 'active')),
|
|
631
|
+
provider TEXT NOT NULL DEFAULT 'workers_ai' CHECK (provider = 'workers_ai'),
|
|
632
|
+
model TEXT NOT NULL,
|
|
633
|
+
instructions TEXT NOT NULL,
|
|
634
|
+
candidate_queue_ids_json TEXT NOT NULL,
|
|
635
|
+
safeguard_queue_id TEXT NOT NULL REFERENCES queue_definitions(id),
|
|
636
|
+
default_queue_id TEXT NOT NULL REFERENCES queue_definitions(id),
|
|
637
|
+
confidence_threshold REAL NOT NULL CHECK (confidence_threshold BETWEEN 0 AND 1),
|
|
638
|
+
allowed_fields_json TEXT NOT NULL,
|
|
639
|
+
published_at TEXT NOT NULL,
|
|
640
|
+
created_by TEXT NOT NULL,
|
|
641
|
+
created_at TEXT NOT NULL,
|
|
642
|
+
idempotency_key TEXT NOT NULL UNIQUE,
|
|
643
|
+
UNIQUE (installation_id, version)
|
|
644
|
+
);
|
|
645
|
+
|
|
646
|
+
CREATE TABLE routing_agent_runs (
|
|
647
|
+
id TEXT PRIMARY KEY,
|
|
648
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
649
|
+
routing_agent_version_id TEXT NOT NULL REFERENCES routing_agent_versions(id),
|
|
650
|
+
background_job_id TEXT NOT NULL UNIQUE REFERENCES background_jobs(id),
|
|
651
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'succeeded', 'failed', 'rejected', 'shadowed')),
|
|
652
|
+
candidate_queue_ids_json TEXT NOT NULL,
|
|
653
|
+
selected_queue_id TEXT REFERENCES queue_definitions(id),
|
|
654
|
+
confidence REAL,
|
|
655
|
+
needs_human INTEGER CHECK (needs_human IN (0, 1)),
|
|
656
|
+
rationale TEXT,
|
|
657
|
+
validation_errors_json TEXT NOT NULL DEFAULT '[]',
|
|
658
|
+
started_at TEXT NOT NULL,
|
|
659
|
+
finished_at TEXT
|
|
660
|
+
);
|
|
661
|
+
|
|
662
|
+
CREATE TABLE component_runs (
|
|
663
|
+
id TEXT PRIMARY KEY,
|
|
664
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
665
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
666
|
+
workflow_run_id TEXT REFERENCES workflow_runs(id) ON DELETE SET NULL,
|
|
667
|
+
step_run_id TEXT REFERENCES workflow_step_runs(id) ON DELETE SET NULL,
|
|
668
|
+
component_version_id TEXT NOT NULL REFERENCES component_versions(id),
|
|
669
|
+
operation_id TEXT NOT NULL UNIQUE,
|
|
670
|
+
effect_class TEXT NOT NULL CHECK (effect_class IN ('read_only', 'side_effecting')),
|
|
671
|
+
state TEXT NOT NULL CHECK (state IN ('pending', 'running', 'succeeded', 'failed', 'timed_out', 'cancelled')),
|
|
672
|
+
input_json TEXT NOT NULL,
|
|
673
|
+
input_digest TEXT NOT NULL,
|
|
674
|
+
output_json TEXT,
|
|
675
|
+
output_digest TEXT,
|
|
676
|
+
finding_id TEXT REFERENCES findings(id),
|
|
677
|
+
cache_hit INTEGER NOT NULL DEFAULT 0 CHECK (cache_hit IN (0, 1)),
|
|
678
|
+
attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
|
|
679
|
+
error_code TEXT,
|
|
680
|
+
started_at TEXT,
|
|
681
|
+
finished_at TEXT,
|
|
682
|
+
created_at TEXT NOT NULL,
|
|
683
|
+
updated_at TEXT NOT NULL
|
|
684
|
+
);
|
|
685
|
+
|
|
686
|
+
CREATE TABLE report_contexts (
|
|
687
|
+
id TEXT PRIMARY KEY,
|
|
688
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
689
|
+
integration_id TEXT NOT NULL REFERENCES application_integrations(id) ON DELETE CASCADE,
|
|
690
|
+
form_version_id TEXT NOT NULL REFERENCES report_form_versions(id),
|
|
691
|
+
origin TEXT NOT NULL,
|
|
692
|
+
reporter_reference TEXT,
|
|
693
|
+
target_type TEXT NOT NULL,
|
|
694
|
+
target_reference TEXT NOT NULL,
|
|
695
|
+
target_owner_reference TEXT,
|
|
696
|
+
target_customer_url TEXT,
|
|
697
|
+
trusted_facts_json TEXT NOT NULL DEFAULT '{}',
|
|
698
|
+
routing_facts_json TEXT NOT NULL DEFAULT '{}',
|
|
699
|
+
context_schema_version INTEGER NOT NULL DEFAULT 1 CHECK (context_schema_version > 0),
|
|
700
|
+
assertion_source TEXT NOT NULL DEFAULT 'customer_backend'
|
|
701
|
+
CHECK (assertion_source IN ('customer_backend', 'resolve_hosted')),
|
|
702
|
+
created_at TEXT NOT NULL,
|
|
703
|
+
expires_at TEXT NOT NULL,
|
|
704
|
+
used_at TEXT,
|
|
705
|
+
report_id TEXT REFERENCES reports(id) ON DELETE SET NULL
|
|
706
|
+
);
|
|
707
|
+
|
|
708
|
+
CREATE TABLE owner_setup_rate_limits (
|
|
709
|
+
bucket_key TEXT PRIMARY KEY,
|
|
710
|
+
window_start TEXT NOT NULL,
|
|
711
|
+
request_count INTEGER NOT NULL CHECK (request_count > 0),
|
|
712
|
+
updated_at TEXT NOT NULL
|
|
713
|
+
);
|
|
714
|
+
|
|
715
|
+
CREATE TABLE operator_users (
|
|
716
|
+
id TEXT PRIMARY KEY,
|
|
717
|
+
email TEXT NOT NULL COLLATE NOCASE UNIQUE,
|
|
718
|
+
display_name TEXT NOT NULL,
|
|
719
|
+
avatar_url TEXT,
|
|
720
|
+
roles_json TEXT NOT NULL,
|
|
721
|
+
status TEXT NOT NULL DEFAULT 'active'
|
|
722
|
+
CHECK (status IN ('active', 'suspended')),
|
|
723
|
+
invited_by TEXT,
|
|
724
|
+
accepted_at TEXT,
|
|
725
|
+
last_login_at TEXT,
|
|
726
|
+
created_at TEXT NOT NULL,
|
|
727
|
+
updated_at TEXT NOT NULL
|
|
728
|
+
, avatar_object_key TEXT, avatar_uploaded_at TEXT);
|
|
729
|
+
|
|
730
|
+
CREATE TABLE role_bindings (
|
|
731
|
+
id TEXT PRIMARY KEY,
|
|
732
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
733
|
+
principal_type TEXT NOT NULL CHECK (principal_type IN ('operator_user', 'access_group', 'service_identity')),
|
|
734
|
+
principal_id TEXT NOT NULL,
|
|
735
|
+
role TEXT NOT NULL CHECK (role IN (
|
|
736
|
+
'owner', 'administrator', 'workflow_author', 'reviewer', 'appeal_reviewer',
|
|
737
|
+
'quality_reviewer', 'operations', 'auditor'
|
|
738
|
+
)),
|
|
739
|
+
queue_scope_json TEXT NOT NULL DEFAULT '[]',
|
|
740
|
+
field_scope_json TEXT NOT NULL DEFAULT '{}',
|
|
741
|
+
created_by TEXT NOT NULL,
|
|
742
|
+
created_at TEXT NOT NULL,
|
|
743
|
+
revoked_at TEXT
|
|
744
|
+
);
|
|
745
|
+
|
|
746
|
+
CREATE TABLE "infrastructure_owner_sessions" (
|
|
747
|
+
id TEXT PRIMARY KEY,
|
|
748
|
+
user_id TEXT NOT NULL REFERENCES operator_users(id) ON DELETE CASCADE,
|
|
749
|
+
token_hash TEXT NOT NULL UNIQUE,
|
|
750
|
+
csrf_hash TEXT NOT NULL,
|
|
751
|
+
expires_at TEXT NOT NULL,
|
|
752
|
+
last_seen_at TEXT NOT NULL,
|
|
753
|
+
revoked_at TEXT,
|
|
754
|
+
created_at TEXT NOT NULL
|
|
755
|
+
);
|
|
756
|
+
|
|
757
|
+
CREATE TABLE installation_features (
|
|
758
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
759
|
+
feature_key TEXT NOT NULL,
|
|
760
|
+
state TEXT NOT NULL CHECK (state IN ('unavailable', 'disabled', 'setup_required', 'ready', 'degraded', 'paused')),
|
|
761
|
+
capability_json TEXT NOT NULL DEFAULT '{}',
|
|
762
|
+
checked_at TEXT NOT NULL,
|
|
763
|
+
error_code TEXT,
|
|
764
|
+
revision INTEGER NOT NULL DEFAULT 1 CHECK (revision >= 1),
|
|
765
|
+
PRIMARY KEY (installation_id, feature_key)
|
|
766
|
+
);
|
|
767
|
+
|
|
768
|
+
CREATE TABLE service_identities (
|
|
769
|
+
id TEXT PRIMARY KEY,
|
|
770
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
771
|
+
identity_key TEXT NOT NULL,
|
|
772
|
+
display_name TEXT NOT NULL,
|
|
773
|
+
identity_kind TEXT NOT NULL CHECK (identity_kind IN (
|
|
774
|
+
'integration', 'workflow_runtime', 'assistant', 'specialist_agent', 'delivery', 'maintenance'
|
|
775
|
+
)),
|
|
776
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'paused', 'revoked')),
|
|
777
|
+
scopes_json TEXT NOT NULL DEFAULT '[]',
|
|
778
|
+
key_hash TEXT,
|
|
779
|
+
binding_reference TEXT,
|
|
780
|
+
created_at TEXT NOT NULL,
|
|
781
|
+
rotated_at TEXT,
|
|
782
|
+
revoked_at TEXT,
|
|
783
|
+
UNIQUE (installation_id, identity_key),
|
|
784
|
+
CHECK (key_hash IS NULL OR binding_reference IS NULL)
|
|
785
|
+
);
|
|
786
|
+
|
|
787
|
+
CREATE TABLE connection_definitions (
|
|
788
|
+
id TEXT PRIMARY KEY,
|
|
789
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
790
|
+
connection_key TEXT NOT NULL,
|
|
791
|
+
name TEXT NOT NULL,
|
|
792
|
+
description TEXT NOT NULL DEFAULT '',
|
|
793
|
+
kind TEXT NOT NULL CHECK (kind IN (
|
|
794
|
+
'webhook', 'external_api', 'customer_worker', 'ai_provider', 'notification', 'email'
|
|
795
|
+
)),
|
|
796
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'paused', 'archived')),
|
|
797
|
+
active_version_id TEXT,
|
|
798
|
+
created_by TEXT NOT NULL,
|
|
799
|
+
created_at TEXT NOT NULL,
|
|
800
|
+
updated_at TEXT NOT NULL,
|
|
801
|
+
UNIQUE (installation_id, connection_key)
|
|
802
|
+
);
|
|
803
|
+
|
|
804
|
+
CREATE TABLE connection_versions (
|
|
805
|
+
id TEXT PRIMARY KEY,
|
|
806
|
+
connection_id TEXT NOT NULL REFERENCES connection_definitions(id) ON DELETE CASCADE,
|
|
807
|
+
version INTEGER NOT NULL CHECK (version >= 1),
|
|
808
|
+
base_url TEXT,
|
|
809
|
+
service_binding_name TEXT,
|
|
810
|
+
allowed_hosts_json TEXT NOT NULL DEFAULT '[]',
|
|
811
|
+
allowed_methods_json TEXT NOT NULL DEFAULT '["POST"]',
|
|
812
|
+
allowed_path_prefixes_json TEXT NOT NULL DEFAULT '["/"]',
|
|
813
|
+
redirect_policy_json TEXT NOT NULL DEFAULT '{"follow":false,"maximum":0}',
|
|
814
|
+
request_limit_bytes INTEGER NOT NULL DEFAULT 65536 CHECK (request_limit_bytes BETWEEN 1 AND 1048576),
|
|
815
|
+
response_limit_bytes INTEGER NOT NULL DEFAULT 262144 CHECK (response_limit_bytes BETWEEN 1 AND 5242880),
|
|
816
|
+
response_content_types_json TEXT NOT NULL DEFAULT '["application/json"]',
|
|
817
|
+
timeout_ms INTEGER NOT NULL DEFAULT 5000 CHECK (timeout_ms BETWEEN 100 AND 120000),
|
|
818
|
+
concurrency_limit INTEGER NOT NULL DEFAULT 8 CHECK (concurrency_limit BETWEEN 1 AND 1000),
|
|
819
|
+
requests_per_window INTEGER NOT NULL DEFAULT 60 CHECK (requests_per_window BETWEEN 1 AND 1000000),
|
|
820
|
+
window_seconds INTEGER NOT NULL DEFAULT 60 CHECK (window_seconds BETWEEN 1 AND 86400),
|
|
821
|
+
credential_strategy TEXT NOT NULL DEFAULT 'none' CHECK (credential_strategy IN (
|
|
822
|
+
'none', 'static_header', 'bearer', 'hmac', 'oauth2_client_credentials',
|
|
823
|
+
'oauth2_authorization_code', 'mutual_tls', 'service_binding'
|
|
824
|
+
)),
|
|
825
|
+
secret_reference TEXT,
|
|
826
|
+
signing_strategy_json TEXT NOT NULL DEFAULT '{}',
|
|
827
|
+
oauth_configuration_json TEXT NOT NULL DEFAULT '{}',
|
|
828
|
+
published_at TEXT NOT NULL,
|
|
829
|
+
retired_at TEXT,
|
|
830
|
+
created_by TEXT NOT NULL,
|
|
831
|
+
created_at TEXT NOT NULL,
|
|
832
|
+
UNIQUE (connection_id, version),
|
|
833
|
+
CHECK ((base_url IS NOT NULL) != (service_binding_name IS NOT NULL))
|
|
834
|
+
);
|
|
835
|
+
|
|
836
|
+
CREATE TABLE connection_health (
|
|
837
|
+
connection_version_id TEXT PRIMARY KEY REFERENCES connection_versions(id) ON DELETE CASCADE,
|
|
838
|
+
state TEXT NOT NULL DEFAULT 'unknown' CHECK (state IN ('unknown', 'healthy', 'degraded', 'open_circuit', 'paused')),
|
|
839
|
+
consecutive_failures INTEGER NOT NULL DEFAULT 0 CHECK (consecutive_failures >= 0),
|
|
840
|
+
opened_at TEXT,
|
|
841
|
+
next_probe_at TEXT,
|
|
842
|
+
last_success_at TEXT,
|
|
843
|
+
last_error_code TEXT,
|
|
844
|
+
revision INTEGER NOT NULL DEFAULT 1 CHECK (revision >= 1),
|
|
845
|
+
updated_at TEXT NOT NULL
|
|
846
|
+
);
|
|
847
|
+
|
|
848
|
+
CREATE TABLE connection_credentials (
|
|
849
|
+
id TEXT PRIMARY KEY,
|
|
850
|
+
connection_version_id TEXT NOT NULL REFERENCES connection_versions(id) ON DELETE CASCADE,
|
|
851
|
+
strategy TEXT NOT NULL CHECK (strategy IN (
|
|
852
|
+
'static_header', 'bearer', 'hmac', 'oauth2_client_credentials',
|
|
853
|
+
'oauth2_authorization_code', 'mutual_tls', 'service_binding'
|
|
854
|
+
)),
|
|
855
|
+
secret_reference TEXT,
|
|
856
|
+
encrypted_access_token TEXT,
|
|
857
|
+
encrypted_refresh_token TEXT,
|
|
858
|
+
token_type TEXT,
|
|
859
|
+
granted_scopes_json TEXT NOT NULL DEFAULT '[]',
|
|
860
|
+
expires_at TEXT,
|
|
861
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'active', 'refresh_failed', 'revoked')),
|
|
862
|
+
last_refresh_at TEXT,
|
|
863
|
+
last_error_code TEXT,
|
|
864
|
+
created_at TEXT NOT NULL,
|
|
865
|
+
updated_at TEXT NOT NULL,
|
|
866
|
+
UNIQUE (connection_version_id)
|
|
867
|
+
);
|
|
868
|
+
|
|
869
|
+
CREATE TABLE connection_oauth_states (
|
|
870
|
+
id TEXT PRIMARY KEY,
|
|
871
|
+
connection_id TEXT NOT NULL REFERENCES connection_definitions(id) ON DELETE CASCADE,
|
|
872
|
+
actor_id TEXT NOT NULL,
|
|
873
|
+
operator_session_id TEXT,
|
|
874
|
+
state_hash TEXT NOT NULL UNIQUE,
|
|
875
|
+
pkce_verifier_ciphertext TEXT,
|
|
876
|
+
redirect_uri TEXT NOT NULL,
|
|
877
|
+
requested_scopes_json TEXT NOT NULL DEFAULT '[]',
|
|
878
|
+
expires_at TEXT NOT NULL,
|
|
879
|
+
consumed_at TEXT,
|
|
880
|
+
created_at TEXT NOT NULL
|
|
881
|
+
);
|
|
882
|
+
|
|
883
|
+
CREATE TABLE component_definitions (
|
|
884
|
+
id TEXT PRIMARY KEY,
|
|
885
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
886
|
+
component_key TEXT NOT NULL,
|
|
887
|
+
name TEXT NOT NULL,
|
|
888
|
+
description TEXT NOT NULL DEFAULT '',
|
|
889
|
+
component_kind TEXT NOT NULL CHECK (component_kind IN (
|
|
890
|
+
'built_in', 'webhook_enrichment', 'api_enrichment', 'workers_ai',
|
|
891
|
+
'specialist_agent', 'action', 'message'
|
|
892
|
+
)),
|
|
893
|
+
effect_class TEXT NOT NULL CHECK (effect_class IN ('read_only', 'side_effecting')),
|
|
894
|
+
owner_kind TEXT NOT NULL DEFAULT 'customer' CHECK (owner_kind IN ('safest', 'customer')),
|
|
895
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'paused', 'deprecated', 'archived')),
|
|
896
|
+
active_version_id TEXT,
|
|
897
|
+
created_by TEXT NOT NULL,
|
|
898
|
+
created_at TEXT NOT NULL,
|
|
899
|
+
updated_at TEXT NOT NULL,
|
|
900
|
+
UNIQUE (installation_id, component_key)
|
|
901
|
+
);
|
|
902
|
+
|
|
903
|
+
CREATE TABLE component_versions (
|
|
904
|
+
id TEXT PRIMARY KEY,
|
|
905
|
+
definition_id TEXT NOT NULL REFERENCES component_definitions(id) ON DELETE CASCADE,
|
|
906
|
+
version INTEGER NOT NULL CHECK (version >= 1),
|
|
907
|
+
implementation_kind TEXT NOT NULL CHECK (implementation_kind IN (
|
|
908
|
+
'built_in', 'webhook', 'external_api', 'workers_ai', 'specialist_agent', 'message_template'
|
|
909
|
+
)),
|
|
910
|
+
implementation_reference TEXT NOT NULL,
|
|
911
|
+
input_schema_json TEXT NOT NULL,
|
|
912
|
+
output_schema_json TEXT NOT NULL,
|
|
913
|
+
allowed_input_fields_json TEXT NOT NULL DEFAULT '[]',
|
|
914
|
+
data_classifications_json TEXT NOT NULL DEFAULT '[]',
|
|
915
|
+
connection_version_id TEXT REFERENCES connection_versions(id),
|
|
916
|
+
risk_class TEXT NOT NULL DEFAULT 'low' CHECK (risk_class IN ('low', 'medium', 'high', 'critical')),
|
|
917
|
+
timeout_policy_json TEXT NOT NULL,
|
|
918
|
+
retry_policy_json TEXT NOT NULL,
|
|
919
|
+
cache_policy_json TEXT NOT NULL DEFAULT '{"enabled":false}',
|
|
920
|
+
concurrency_policy_json TEXT NOT NULL DEFAULT '{}',
|
|
921
|
+
budget_policy_json TEXT NOT NULL DEFAULT '{}',
|
|
922
|
+
approval_policy_json TEXT NOT NULL DEFAULT '{}',
|
|
923
|
+
tool_manifest_json TEXT NOT NULL DEFAULT '[]',
|
|
924
|
+
compatibility_json TEXT NOT NULL DEFAULT '{}',
|
|
925
|
+
package_digest TEXT,
|
|
926
|
+
signature_metadata_json TEXT,
|
|
927
|
+
published_at TEXT NOT NULL,
|
|
928
|
+
retired_at TEXT,
|
|
929
|
+
created_by TEXT NOT NULL,
|
|
930
|
+
created_at TEXT NOT NULL,
|
|
931
|
+
UNIQUE (definition_id, version)
|
|
932
|
+
);
|
|
933
|
+
|
|
934
|
+
CREATE TABLE component_fixtures (
|
|
935
|
+
id TEXT PRIMARY KEY,
|
|
936
|
+
component_version_id TEXT NOT NULL REFERENCES component_versions(id) ON DELETE CASCADE,
|
|
937
|
+
name TEXT NOT NULL,
|
|
938
|
+
input_json TEXT NOT NULL,
|
|
939
|
+
expected_json TEXT NOT NULL,
|
|
940
|
+
expected_status TEXT NOT NULL DEFAULT 'succeeded' CHECK (expected_status IN ('succeeded', 'failed', 'timed_out')),
|
|
941
|
+
created_by TEXT NOT NULL,
|
|
942
|
+
created_at TEXT NOT NULL,
|
|
943
|
+
UNIQUE (component_version_id, name)
|
|
944
|
+
);
|
|
945
|
+
|
|
946
|
+
CREATE TABLE component_test_runs (
|
|
947
|
+
id TEXT PRIMARY KEY,
|
|
948
|
+
component_version_id TEXT NOT NULL REFERENCES component_versions(id) ON DELETE CASCADE,
|
|
949
|
+
fixture_id TEXT REFERENCES component_fixtures(id) ON DELETE SET NULL,
|
|
950
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'passed', 'failed')),
|
|
951
|
+
output_json TEXT,
|
|
952
|
+
error_code TEXT,
|
|
953
|
+
started_by TEXT NOT NULL,
|
|
954
|
+
started_at TEXT NOT NULL,
|
|
955
|
+
finished_at TEXT
|
|
956
|
+
);
|
|
957
|
+
|
|
958
|
+
CREATE TABLE workflow_definitions (
|
|
959
|
+
id TEXT PRIMARY KEY,
|
|
960
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
961
|
+
workflow_key TEXT NOT NULL,
|
|
962
|
+
name TEXT NOT NULL,
|
|
963
|
+
description TEXT NOT NULL DEFAULT '',
|
|
964
|
+
purpose TEXT NOT NULL CHECK (purpose IN ('report', 'appeal', 'quality', 'operations')),
|
|
965
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'paused', 'archived')),
|
|
966
|
+
active_version_id TEXT,
|
|
967
|
+
created_by TEXT NOT NULL,
|
|
968
|
+
created_at TEXT NOT NULL,
|
|
969
|
+
updated_at TEXT NOT NULL,
|
|
970
|
+
UNIQUE (installation_id, workflow_key)
|
|
971
|
+
);
|
|
972
|
+
|
|
973
|
+
CREATE TABLE workflow_drafts (
|
|
974
|
+
id TEXT PRIMARY KEY,
|
|
975
|
+
workflow_id TEXT NOT NULL REFERENCES workflow_definitions(id) ON DELETE CASCADE,
|
|
976
|
+
graph_json TEXT NOT NULL,
|
|
977
|
+
graph_digest TEXT NOT NULL,
|
|
978
|
+
revision INTEGER NOT NULL DEFAULT 1 CHECK (revision >= 1),
|
|
979
|
+
validation_json TEXT NOT NULL DEFAULT '{"valid":false,"errors":[],"warnings":[]}',
|
|
980
|
+
validation_digest TEXT,
|
|
981
|
+
validation_status TEXT NOT NULL DEFAULT 'unvalidated' CHECK (validation_status IN ('unvalidated', 'valid', 'invalid')),
|
|
982
|
+
created_by TEXT NOT NULL,
|
|
983
|
+
updated_by TEXT NOT NULL,
|
|
984
|
+
created_at TEXT NOT NULL,
|
|
985
|
+
updated_at TEXT NOT NULL,
|
|
986
|
+
UNIQUE (workflow_id)
|
|
987
|
+
);
|
|
988
|
+
|
|
989
|
+
CREATE TABLE workflow_artifacts (
|
|
990
|
+
id TEXT PRIMARY KEY,
|
|
991
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
992
|
+
compiler_version TEXT NOT NULL,
|
|
993
|
+
compatibility_date TEXT NOT NULL,
|
|
994
|
+
graph_digest TEXT NOT NULL,
|
|
995
|
+
source_digest TEXT NOT NULL,
|
|
996
|
+
bundle_digest TEXT NOT NULL,
|
|
997
|
+
manifest_digest TEXT NOT NULL,
|
|
998
|
+
bundle_r2_key TEXT,
|
|
999
|
+
inline_source_text TEXT,
|
|
1000
|
+
bundle_size_bytes INTEGER NOT NULL CHECK (bundle_size_bytes >= 0),
|
|
1001
|
+
capability_manifest_json TEXT NOT NULL,
|
|
1002
|
+
compiler_warnings_json TEXT NOT NULL DEFAULT '[]',
|
|
1003
|
+
signature_metadata_json TEXT,
|
|
1004
|
+
status TEXT NOT NULL DEFAULT 'ready' CHECK (status IN ('building', 'ready', 'invalid', 'missing', 'quarantined')),
|
|
1005
|
+
created_at TEXT NOT NULL,
|
|
1006
|
+
verified_at TEXT,
|
|
1007
|
+
UNIQUE (installation_id, bundle_digest),
|
|
1008
|
+
CHECK (bundle_r2_key IS NOT NULL OR inline_source_text IS NOT NULL)
|
|
1009
|
+
);
|
|
1010
|
+
|
|
1011
|
+
CREATE TABLE workflow_versions (
|
|
1012
|
+
id TEXT PRIMARY KEY,
|
|
1013
|
+
workflow_id TEXT NOT NULL REFERENCES workflow_definitions(id) ON DELETE CASCADE,
|
|
1014
|
+
version INTEGER NOT NULL CHECK (version >= 1),
|
|
1015
|
+
graph_json TEXT NOT NULL,
|
|
1016
|
+
graph_digest TEXT NOT NULL,
|
|
1017
|
+
input_schema_json TEXT NOT NULL DEFAULT '{"type":"object"}',
|
|
1018
|
+
output_schema_json TEXT NOT NULL DEFAULT '{"type":"object"}',
|
|
1019
|
+
authority_mode TEXT NOT NULL DEFAULT 'assist' CHECK (authority_mode IN ('off', 'shadow', 'assist', 'bounded_auto')),
|
|
1020
|
+
dependency_manifest_json TEXT NOT NULL,
|
|
1021
|
+
capability_manifest_json TEXT NOT NULL,
|
|
1022
|
+
artifact_id TEXT NOT NULL REFERENCES workflow_artifacts(id),
|
|
1023
|
+
compiler_version TEXT NOT NULL,
|
|
1024
|
+
test_evidence_json TEXT NOT NULL,
|
|
1025
|
+
published_by TEXT NOT NULL,
|
|
1026
|
+
published_at TEXT NOT NULL,
|
|
1027
|
+
retired_at TEXT,
|
|
1028
|
+
UNIQUE (workflow_id, version)
|
|
1029
|
+
);
|
|
1030
|
+
|
|
1031
|
+
CREATE TABLE workflow_dependencies (
|
|
1032
|
+
workflow_version_id TEXT NOT NULL REFERENCES workflow_versions(id) ON DELETE CASCADE,
|
|
1033
|
+
dependency_type TEXT NOT NULL CHECK (dependency_type IN (
|
|
1034
|
+
'component', 'connection', 'policy', 'template', 'model_alias', 'agent', 'workflow', 'compiler'
|
|
1035
|
+
)),
|
|
1036
|
+
dependency_key TEXT NOT NULL,
|
|
1037
|
+
dependency_version_id TEXT NOT NULL,
|
|
1038
|
+
dependency_digest TEXT,
|
|
1039
|
+
PRIMARY KEY (workflow_version_id, dependency_type, dependency_key)
|
|
1040
|
+
);
|
|
1041
|
+
|
|
1042
|
+
CREATE TABLE workflow_fixtures (
|
|
1043
|
+
id TEXT PRIMARY KEY,
|
|
1044
|
+
workflow_id TEXT NOT NULL REFERENCES workflow_definitions(id) ON DELETE CASCADE,
|
|
1045
|
+
name TEXT NOT NULL,
|
|
1046
|
+
input_json TEXT NOT NULL,
|
|
1047
|
+
component_results_json TEXT NOT NULL DEFAULT '{}',
|
|
1048
|
+
human_responses_json TEXT NOT NULL DEFAULT '{}',
|
|
1049
|
+
expected_json TEXT NOT NULL,
|
|
1050
|
+
failure_injection_json TEXT NOT NULL DEFAULT '{}',
|
|
1051
|
+
created_by TEXT NOT NULL,
|
|
1052
|
+
created_at TEXT NOT NULL,
|
|
1053
|
+
updated_at TEXT NOT NULL,
|
|
1054
|
+
UNIQUE (workflow_id, name)
|
|
1055
|
+
);
|
|
1056
|
+
|
|
1057
|
+
CREATE TABLE workflow_test_runs (
|
|
1058
|
+
id TEXT PRIMARY KEY,
|
|
1059
|
+
workflow_id TEXT NOT NULL REFERENCES workflow_definitions(id) ON DELETE CASCADE,
|
|
1060
|
+
workflow_version_id TEXT REFERENCES workflow_versions(id) ON DELETE SET NULL,
|
|
1061
|
+
fixture_id TEXT REFERENCES workflow_fixtures(id) ON DELETE SET NULL,
|
|
1062
|
+
graph_digest TEXT NOT NULL,
|
|
1063
|
+
mode TEXT NOT NULL CHECK (mode IN ('simulation', 'shadow')),
|
|
1064
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'passed', 'failed')),
|
|
1065
|
+
result_json TEXT,
|
|
1066
|
+
error_json TEXT,
|
|
1067
|
+
started_by TEXT NOT NULL,
|
|
1068
|
+
started_at TEXT NOT NULL,
|
|
1069
|
+
finished_at TEXT
|
|
1070
|
+
);
|
|
1071
|
+
|
|
1072
|
+
CREATE TABLE queue_workflow_pins (
|
|
1073
|
+
id TEXT PRIMARY KEY,
|
|
1074
|
+
queue_id TEXT NOT NULL REFERENCES queue_definitions(id) ON DELETE CASCADE,
|
|
1075
|
+
queue_version_id TEXT REFERENCES queue_versions(id),
|
|
1076
|
+
workflow_version_id TEXT NOT NULL REFERENCES workflow_versions(id),
|
|
1077
|
+
mode TEXT NOT NULL DEFAULT 'primary' CHECK (mode IN ('shadow', 'primary')),
|
|
1078
|
+
rollback_of_pin_id TEXT REFERENCES queue_workflow_pins(id),
|
|
1079
|
+
activated_by TEXT NOT NULL,
|
|
1080
|
+
activated_at TEXT NOT NULL,
|
|
1081
|
+
deactivated_at TEXT
|
|
1082
|
+
);
|
|
1083
|
+
|
|
1084
|
+
CREATE TABLE workflow_runs (
|
|
1085
|
+
id TEXT PRIMARY KEY,
|
|
1086
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1087
|
+
report_id TEXT REFERENCES reports(id) ON DELETE SET NULL,
|
|
1088
|
+
appeal_id TEXT REFERENCES appeals(id) ON DELETE SET NULL,
|
|
1089
|
+
parent_run_id TEXT REFERENCES workflow_runs(id),
|
|
1090
|
+
workflow_version_id TEXT NOT NULL REFERENCES workflow_versions(id),
|
|
1091
|
+
queue_id TEXT REFERENCES queue_definitions(id),
|
|
1092
|
+
queue_version_id TEXT REFERENCES queue_versions(id),
|
|
1093
|
+
pin_id TEXT REFERENCES queue_workflow_pins(id),
|
|
1094
|
+
run_kind TEXT NOT NULL CHECK (run_kind IN ('primary', 'appeal', 'shadow', 'quality', 'linked', 'test')),
|
|
1095
|
+
authority_mode TEXT NOT NULL CHECK (authority_mode IN ('off', 'shadow', 'assist', 'bounded_auto')),
|
|
1096
|
+
state TEXT NOT NULL CHECK (state IN (
|
|
1097
|
+
'created', 'dispatch_pending', 'queued', 'running', 'waiting', 'paused',
|
|
1098
|
+
'succeeded', 'failed', 'terminated', 'superseded', 'repair_required'
|
|
1099
|
+
)),
|
|
1100
|
+
cloudflare_instance_id TEXT,
|
|
1101
|
+
graph_digest TEXT NOT NULL,
|
|
1102
|
+
artifact_digest TEXT NOT NULL,
|
|
1103
|
+
input_json TEXT NOT NULL,
|
|
1104
|
+
output_json TEXT,
|
|
1105
|
+
current_node_id TEXT,
|
|
1106
|
+
error_code TEXT,
|
|
1107
|
+
error_summary TEXT,
|
|
1108
|
+
started_at TEXT,
|
|
1109
|
+
waiting_at TEXT,
|
|
1110
|
+
finished_at TEXT,
|
|
1111
|
+
created_at TEXT NOT NULL,
|
|
1112
|
+
updated_at TEXT NOT NULL,
|
|
1113
|
+
revision INTEGER NOT NULL DEFAULT 1 CHECK (revision >= 1),
|
|
1114
|
+
UNIQUE (cloudflare_instance_id)
|
|
1115
|
+
);
|
|
1116
|
+
|
|
1117
|
+
CREATE TABLE workflow_run_links (
|
|
1118
|
+
parent_run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE,
|
|
1119
|
+
child_run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE,
|
|
1120
|
+
link_type TEXT NOT NULL CHECK (link_type IN ('handoff', 'appeal', 'shadow', 'quality', 'subworkflow')),
|
|
1121
|
+
node_id TEXT,
|
|
1122
|
+
created_at TEXT NOT NULL,
|
|
1123
|
+
PRIMARY KEY (parent_run_id, child_run_id)
|
|
1124
|
+
);
|
|
1125
|
+
|
|
1126
|
+
CREATE TABLE workflow_step_runs (
|
|
1127
|
+
id TEXT PRIMARY KEY,
|
|
1128
|
+
run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE,
|
|
1129
|
+
node_id TEXT NOT NULL,
|
|
1130
|
+
node_type TEXT NOT NULL,
|
|
1131
|
+
branch_key TEXT NOT NULL DEFAULT '',
|
|
1132
|
+
occurrence INTEGER NOT NULL DEFAULT 1 CHECK (occurrence >= 1),
|
|
1133
|
+
state TEXT NOT NULL CHECK (state IN (
|
|
1134
|
+
'pending', 'running', 'waiting', 'succeeded', 'failed', 'skipped', 'timed_out', 'cancelled'
|
|
1135
|
+
)),
|
|
1136
|
+
input_digest TEXT,
|
|
1137
|
+
output_digest TEXT,
|
|
1138
|
+
started_at TEXT,
|
|
1139
|
+
waiting_at TEXT,
|
|
1140
|
+
finished_at TEXT,
|
|
1141
|
+
updated_at TEXT NOT NULL,
|
|
1142
|
+
UNIQUE (run_id, node_id, branch_key, occurrence)
|
|
1143
|
+
);
|
|
1144
|
+
|
|
1145
|
+
CREATE TABLE workflow_step_attempts (
|
|
1146
|
+
id TEXT PRIMARY KEY,
|
|
1147
|
+
step_run_id TEXT NOT NULL REFERENCES workflow_step_runs(id) ON DELETE CASCADE,
|
|
1148
|
+
attempt INTEGER NOT NULL CHECK (attempt >= 1),
|
|
1149
|
+
operation_id TEXT NOT NULL,
|
|
1150
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'succeeded', 'retryable_failed', 'permanent_failed', 'timed_out')),
|
|
1151
|
+
request_digest TEXT,
|
|
1152
|
+
response_digest TEXT,
|
|
1153
|
+
error_code TEXT,
|
|
1154
|
+
error_class TEXT,
|
|
1155
|
+
retry_at TEXT,
|
|
1156
|
+
started_at TEXT NOT NULL,
|
|
1157
|
+
finished_at TEXT, external_request_id TEXT, cost_microusd INTEGER NOT NULL DEFAULT 0 CHECK (cost_microusd >= 0),
|
|
1158
|
+
UNIQUE (step_run_id, attempt),
|
|
1159
|
+
UNIQUE (operation_id)
|
|
1160
|
+
);
|
|
1161
|
+
|
|
1162
|
+
CREATE TABLE workflow_step_outputs (
|
|
1163
|
+
step_run_id TEXT PRIMARY KEY REFERENCES workflow_step_runs(id) ON DELETE CASCADE,
|
|
1164
|
+
inline_json TEXT,
|
|
1165
|
+
r2_object_key TEXT,
|
|
1166
|
+
digest TEXT NOT NULL,
|
|
1167
|
+
size_bytes INTEGER NOT NULL CHECK (size_bytes >= 0),
|
|
1168
|
+
data_classification_json TEXT NOT NULL DEFAULT '[]',
|
|
1169
|
+
created_at TEXT NOT NULL,
|
|
1170
|
+
CHECK (inline_json IS NOT NULL OR r2_object_key IS NOT NULL)
|
|
1171
|
+
);
|
|
1172
|
+
|
|
1173
|
+
CREATE TABLE workflow_event_inbox (
|
|
1174
|
+
id TEXT PRIMARY KEY,
|
|
1175
|
+
run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE,
|
|
1176
|
+
event_type TEXT NOT NULL,
|
|
1177
|
+
event_key TEXT NOT NULL,
|
|
1178
|
+
source_type TEXT NOT NULL,
|
|
1179
|
+
source_id TEXT,
|
|
1180
|
+
payload_json TEXT NOT NULL,
|
|
1181
|
+
payload_digest TEXT NOT NULL,
|
|
1182
|
+
received_at TEXT NOT NULL,
|
|
1183
|
+
delivered_at TEXT,
|
|
1184
|
+
delivery_attempts INTEGER NOT NULL DEFAULT 0 CHECK (delivery_attempts >= 0),
|
|
1185
|
+
last_error_code TEXT,
|
|
1186
|
+
UNIQUE (run_id, event_type, event_key)
|
|
1187
|
+
);
|
|
1188
|
+
|
|
1189
|
+
CREATE TABLE workflow_waits (
|
|
1190
|
+
id TEXT PRIMARY KEY,
|
|
1191
|
+
run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE,
|
|
1192
|
+
step_run_id TEXT NOT NULL REFERENCES workflow_step_runs(id) ON DELETE CASCADE,
|
|
1193
|
+
wait_type TEXT NOT NULL CHECK (wait_type IN ('event', 'delay', 'human_task', 'participant_reply', 'deadline')),
|
|
1194
|
+
event_type TEXT,
|
|
1195
|
+
state TEXT NOT NULL CHECK (state IN ('waiting', 'satisfied', 'timed_out', 'cancelled')),
|
|
1196
|
+
deadline_at TEXT,
|
|
1197
|
+
satisfied_event_id TEXT REFERENCES workflow_event_inbox(id),
|
|
1198
|
+
created_at TEXT NOT NULL,
|
|
1199
|
+
satisfied_at TEXT,
|
|
1200
|
+
UNIQUE (step_run_id)
|
|
1201
|
+
);
|
|
1202
|
+
|
|
1203
|
+
CREATE TABLE workflow_dispatch_outbox (
|
|
1204
|
+
id TEXT PRIMARY KEY,
|
|
1205
|
+
run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE,
|
|
1206
|
+
operation TEXT NOT NULL CHECK (operation IN ('start', 'event', 'pause', 'resume', 'terminate', 'reconcile')),
|
|
1207
|
+
event_inbox_id TEXT REFERENCES workflow_event_inbox(id),
|
|
1208
|
+
operation_key TEXT NOT NULL UNIQUE,
|
|
1209
|
+
state TEXT NOT NULL DEFAULT 'pending' CHECK (state IN ('pending', 'leased', 'delivered', 'failed', 'dead_letter')),
|
|
1210
|
+
attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
|
|
1211
|
+
available_at TEXT NOT NULL,
|
|
1212
|
+
lease_expires_at TEXT,
|
|
1213
|
+
last_error_code TEXT,
|
|
1214
|
+
created_at TEXT NOT NULL,
|
|
1215
|
+
updated_at TEXT NOT NULL
|
|
1216
|
+
);
|
|
1217
|
+
|
|
1218
|
+
CREATE TABLE findings (
|
|
1219
|
+
id TEXT PRIMARY KEY,
|
|
1220
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1221
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
1222
|
+
run_id TEXT REFERENCES workflow_runs(id) ON DELETE SET NULL,
|
|
1223
|
+
step_run_id TEXT REFERENCES workflow_step_runs(id) ON DELETE SET NULL,
|
|
1224
|
+
component_version_id TEXT REFERENCES component_versions(id),
|
|
1225
|
+
ai_run_id TEXT REFERENCES ai_runs(id),
|
|
1226
|
+
finding_type TEXT NOT NULL,
|
|
1227
|
+
subject_type TEXT NOT NULL,
|
|
1228
|
+
subject_reference TEXT NOT NULL,
|
|
1229
|
+
status TEXT NOT NULL CHECK (status IN ('available', 'unavailable', 'invalid', 'stale', 'superseded')),
|
|
1230
|
+
confidence REAL CHECK (confidence IS NULL OR (confidence >= 0 AND confidence <= 1)),
|
|
1231
|
+
summary TEXT NOT NULL,
|
|
1232
|
+
data_json TEXT NOT NULL,
|
|
1233
|
+
provenance_json TEXT NOT NULL,
|
|
1234
|
+
uncertainty_json TEXT NOT NULL DEFAULT '[]',
|
|
1235
|
+
input_digest TEXT,
|
|
1236
|
+
output_digest TEXT NOT NULL,
|
|
1237
|
+
expires_at TEXT,
|
|
1238
|
+
created_at TEXT NOT NULL,
|
|
1239
|
+
superseded_at TEXT
|
|
1240
|
+
);
|
|
1241
|
+
|
|
1242
|
+
CREATE TABLE human_tasks (
|
|
1243
|
+
id TEXT PRIMARY KEY,
|
|
1244
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1245
|
+
report_id TEXT REFERENCES reports(id) ON DELETE SET NULL,
|
|
1246
|
+
appeal_id TEXT REFERENCES appeals(id) ON DELETE SET NULL,
|
|
1247
|
+
run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE,
|
|
1248
|
+
step_run_id TEXT NOT NULL REFERENCES workflow_step_runs(id) ON DELETE CASCADE,
|
|
1249
|
+
task_type TEXT NOT NULL CHECK (task_type IN (
|
|
1250
|
+
'review', 'approval', 'appeal_review', 'quality_review', 'operations', 'information_request'
|
|
1251
|
+
)),
|
|
1252
|
+
state TEXT NOT NULL CHECK (state IN ('open', 'claimed', 'completed', 'expired', 'cancelled')),
|
|
1253
|
+
queue_id TEXT REFERENCES queue_definitions(id),
|
|
1254
|
+
assigned_operator_id TEXT,
|
|
1255
|
+
context_json TEXT NOT NULL,
|
|
1256
|
+
context_digest TEXT NOT NULL,
|
|
1257
|
+
response_schema_json TEXT NOT NULL,
|
|
1258
|
+
action_proposal_id TEXT,
|
|
1259
|
+
due_at TEXT,
|
|
1260
|
+
escalation_at TEXT,
|
|
1261
|
+
created_at TEXT NOT NULL,
|
|
1262
|
+
updated_at TEXT NOT NULL,
|
|
1263
|
+
completed_at TEXT,
|
|
1264
|
+
UNIQUE (step_run_id)
|
|
1265
|
+
);
|
|
1266
|
+
|
|
1267
|
+
CREATE TABLE human_task_claims (
|
|
1268
|
+
id TEXT PRIMARY KEY,
|
|
1269
|
+
task_id TEXT NOT NULL REFERENCES human_tasks(id) ON DELETE CASCADE,
|
|
1270
|
+
operator_id TEXT NOT NULL,
|
|
1271
|
+
claimed_at TEXT NOT NULL,
|
|
1272
|
+
expires_at TEXT NOT NULL,
|
|
1273
|
+
released_at TEXT,
|
|
1274
|
+
release_reason TEXT
|
|
1275
|
+
);
|
|
1276
|
+
|
|
1277
|
+
CREATE TABLE human_task_responses (
|
|
1278
|
+
id TEXT PRIMARY KEY,
|
|
1279
|
+
task_id TEXT NOT NULL REFERENCES human_tasks(id) ON DELETE CASCADE,
|
|
1280
|
+
claim_id TEXT REFERENCES human_task_claims(id),
|
|
1281
|
+
operator_id TEXT NOT NULL,
|
|
1282
|
+
response_json TEXT NOT NULL,
|
|
1283
|
+
response_digest TEXT NOT NULL,
|
|
1284
|
+
idempotency_key TEXT NOT NULL,
|
|
1285
|
+
submitted_at TEXT NOT NULL,
|
|
1286
|
+
UNIQUE (task_id),
|
|
1287
|
+
UNIQUE (operator_id, idempotency_key)
|
|
1288
|
+
);
|
|
1289
|
+
|
|
1290
|
+
CREATE TABLE action_proposals (
|
|
1291
|
+
id TEXT PRIMARY KEY,
|
|
1292
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1293
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
1294
|
+
appeal_id TEXT REFERENCES appeals(id) ON DELETE SET NULL,
|
|
1295
|
+
run_id TEXT REFERENCES workflow_runs(id) ON DELETE SET NULL,
|
|
1296
|
+
step_run_id TEXT REFERENCES workflow_step_runs(id) ON DELETE SET NULL,
|
|
1297
|
+
decision_id TEXT REFERENCES decisions(id),
|
|
1298
|
+
action_code TEXT NOT NULL,
|
|
1299
|
+
target_json TEXT NOT NULL,
|
|
1300
|
+
payload_json TEXT NOT NULL,
|
|
1301
|
+
preconditions_json TEXT NOT NULL DEFAULT '{}',
|
|
1302
|
+
payload_digest TEXT NOT NULL,
|
|
1303
|
+
component_version_id TEXT REFERENCES component_versions(id),
|
|
1304
|
+
authority_mode TEXT NOT NULL CHECK (authority_mode IN ('assist', 'bounded_auto')),
|
|
1305
|
+
approval_policy_json TEXT NOT NULL,
|
|
1306
|
+
state TEXT NOT NULL CHECK (state IN (
|
|
1307
|
+
'proposed', 'approval_required', 'approved', 'rejected', 'queued',
|
|
1308
|
+
'applying', 'applied', 'failed', 'cancelled', 'compensation_required', 'compensated'
|
|
1309
|
+
)),
|
|
1310
|
+
operation_id TEXT NOT NULL UNIQUE,
|
|
1311
|
+
compensates_proposal_id TEXT REFERENCES action_proposals(id),
|
|
1312
|
+
created_by_type TEXT NOT NULL,
|
|
1313
|
+
created_by_id TEXT NOT NULL,
|
|
1314
|
+
created_at TEXT NOT NULL,
|
|
1315
|
+
updated_at TEXT NOT NULL
|
|
1316
|
+
, delivery_attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (delivery_attempt_count >= 0), next_attempt_at TEXT, lease_expires_at TEXT, last_error_code TEXT, delivery_terminal INTEGER NOT NULL DEFAULT 0 CHECK (delivery_terminal IN (0, 1)));
|
|
1317
|
+
|
|
1318
|
+
CREATE TABLE action_approvals (
|
|
1319
|
+
id TEXT PRIMARY KEY,
|
|
1320
|
+
proposal_id TEXT NOT NULL REFERENCES action_proposals(id) ON DELETE CASCADE,
|
|
1321
|
+
task_id TEXT REFERENCES human_tasks(id),
|
|
1322
|
+
approver_id TEXT NOT NULL,
|
|
1323
|
+
payload_digest TEXT NOT NULL,
|
|
1324
|
+
decision TEXT NOT NULL CHECK (decision IN ('approved', 'rejected')),
|
|
1325
|
+
reason TEXT,
|
|
1326
|
+
idempotency_key TEXT NOT NULL,
|
|
1327
|
+
created_at TEXT NOT NULL,
|
|
1328
|
+
UNIQUE (proposal_id),
|
|
1329
|
+
UNIQUE (approver_id, idempotency_key)
|
|
1330
|
+
);
|
|
1331
|
+
|
|
1332
|
+
CREATE TABLE appeal_workflow_links (
|
|
1333
|
+
appeal_id TEXT PRIMARY KEY REFERENCES appeals(id) ON DELETE CASCADE,
|
|
1334
|
+
run_id TEXT NOT NULL UNIQUE REFERENCES workflow_runs(id) ON DELETE CASCADE,
|
|
1335
|
+
original_run_id TEXT REFERENCES workflow_runs(id),
|
|
1336
|
+
original_decision_id TEXT REFERENCES decisions(id),
|
|
1337
|
+
created_at TEXT NOT NULL
|
|
1338
|
+
);
|
|
1339
|
+
|
|
1340
|
+
CREATE TABLE conversations (
|
|
1341
|
+
id TEXT PRIMARY KEY,
|
|
1342
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1343
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
1344
|
+
audience TEXT NOT NULL CHECK (audience IN ('internal', 'reporter', 'affected_user')),
|
|
1345
|
+
participant_id TEXT REFERENCES report_participants(id),
|
|
1346
|
+
status TEXT NOT NULL DEFAULT 'open' CHECK (status IN ('open', 'closed', 'suppressed')),
|
|
1347
|
+
locale TEXT NOT NULL,
|
|
1348
|
+
created_at TEXT NOT NULL,
|
|
1349
|
+
updated_at TEXT NOT NULL,
|
|
1350
|
+
UNIQUE (report_id, audience)
|
|
1351
|
+
);
|
|
1352
|
+
|
|
1353
|
+
CREATE TABLE email_deliveries (
|
|
1354
|
+
id TEXT PRIMARY KEY,
|
|
1355
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1356
|
+
message_id TEXT NOT NULL REFERENCES case_messages(id) ON DELETE CASCADE,
|
|
1357
|
+
notification_outbox_id TEXT REFERENCES notification_outbox(id),
|
|
1358
|
+
audience TEXT NOT NULL CHECK (audience IN ('operator', 'reporter', 'affected_user')),
|
|
1359
|
+
recipient_hash TEXT NOT NULL,
|
|
1360
|
+
provider TEXT NOT NULL,
|
|
1361
|
+
provider_message_id TEXT,
|
|
1362
|
+
state TEXT NOT NULL CHECK (state IN ('pending', 'sending', 'delivered', 'failed', 'suppressed', 'bounced')),
|
|
1363
|
+
attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
|
|
1364
|
+
last_error_code TEXT,
|
|
1365
|
+
next_attempt_at TEXT,
|
|
1366
|
+
delivered_at TEXT,
|
|
1367
|
+
created_at TEXT NOT NULL,
|
|
1368
|
+
updated_at TEXT NOT NULL
|
|
1369
|
+
);
|
|
1370
|
+
|
|
1371
|
+
CREATE TABLE model_aliases (
|
|
1372
|
+
id TEXT PRIMARY KEY,
|
|
1373
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1374
|
+
alias_key TEXT NOT NULL,
|
|
1375
|
+
name TEXT NOT NULL,
|
|
1376
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'paused', 'archived')),
|
|
1377
|
+
active_version_id TEXT,
|
|
1378
|
+
created_by TEXT NOT NULL,
|
|
1379
|
+
created_at TEXT NOT NULL,
|
|
1380
|
+
updated_at TEXT NOT NULL,
|
|
1381
|
+
UNIQUE (installation_id, alias_key)
|
|
1382
|
+
);
|
|
1383
|
+
|
|
1384
|
+
CREATE TABLE model_alias_versions (
|
|
1385
|
+
id TEXT PRIMARY KEY,
|
|
1386
|
+
alias_id TEXT NOT NULL REFERENCES model_aliases(id) ON DELETE CASCADE,
|
|
1387
|
+
version INTEGER NOT NULL CHECK (version >= 1),
|
|
1388
|
+
provider TEXT NOT NULL,
|
|
1389
|
+
model TEXT NOT NULL,
|
|
1390
|
+
connection_version_id TEXT REFERENCES connection_versions(id),
|
|
1391
|
+
fallback_alias_version_id TEXT REFERENCES model_alias_versions(id),
|
|
1392
|
+
input_cost_microusd_per_million INTEGER NOT NULL DEFAULT 0 CHECK (input_cost_microusd_per_million >= 0),
|
|
1393
|
+
output_cost_microusd_per_million INTEGER NOT NULL DEFAULT 0 CHECK (output_cost_microusd_per_million >= 0),
|
|
1394
|
+
capability_json TEXT NOT NULL DEFAULT '{}',
|
|
1395
|
+
data_policy_json TEXT NOT NULL DEFAULT '{}',
|
|
1396
|
+
published_at TEXT NOT NULL,
|
|
1397
|
+
retired_at TEXT,
|
|
1398
|
+
created_by TEXT NOT NULL,
|
|
1399
|
+
created_at TEXT NOT NULL,
|
|
1400
|
+
UNIQUE (alias_id, version)
|
|
1401
|
+
);
|
|
1402
|
+
|
|
1403
|
+
CREATE TABLE agent_definitions (
|
|
1404
|
+
id TEXT PRIMARY KEY,
|
|
1405
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1406
|
+
agent_key TEXT NOT NULL,
|
|
1407
|
+
name TEXT NOT NULL,
|
|
1408
|
+
description TEXT NOT NULL DEFAULT '',
|
|
1409
|
+
agent_kind TEXT NOT NULL CHECK (agent_kind IN ('routing', 'specialist', 'assistant', 'shadow')),
|
|
1410
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'paused', 'archived')),
|
|
1411
|
+
active_version_id TEXT,
|
|
1412
|
+
created_by TEXT NOT NULL,
|
|
1413
|
+
created_at TEXT NOT NULL,
|
|
1414
|
+
updated_at TEXT NOT NULL,
|
|
1415
|
+
UNIQUE (installation_id, agent_key)
|
|
1416
|
+
);
|
|
1417
|
+
|
|
1418
|
+
CREATE TABLE agent_versions (
|
|
1419
|
+
id TEXT PRIMARY KEY,
|
|
1420
|
+
agent_id TEXT NOT NULL REFERENCES agent_definitions(id) ON DELETE CASCADE,
|
|
1421
|
+
version INTEGER NOT NULL CHECK (version >= 1),
|
|
1422
|
+
prompt_version_id TEXT NOT NULL,
|
|
1423
|
+
model_alias_version_id TEXT REFERENCES model_alias_versions(id),
|
|
1424
|
+
tool_manifest_json TEXT NOT NULL,
|
|
1425
|
+
memory_policy_json TEXT NOT NULL DEFAULT '{}',
|
|
1426
|
+
maximum_turns INTEGER NOT NULL DEFAULT 8 CHECK (maximum_turns BETWEEN 1 AND 100),
|
|
1427
|
+
approval_policy_json TEXT NOT NULL DEFAULT '{}',
|
|
1428
|
+
input_schema_json TEXT NOT NULL,
|
|
1429
|
+
output_schema_json TEXT NOT NULL,
|
|
1430
|
+
published_at TEXT NOT NULL,
|
|
1431
|
+
retired_at TEXT,
|
|
1432
|
+
created_by TEXT NOT NULL,
|
|
1433
|
+
created_at TEXT NOT NULL,
|
|
1434
|
+
UNIQUE (agent_id, version)
|
|
1435
|
+
);
|
|
1436
|
+
|
|
1437
|
+
CREATE TABLE assistant_sessions (
|
|
1438
|
+
id TEXT PRIMARY KEY,
|
|
1439
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1440
|
+
principal_id TEXT NOT NULL,
|
|
1441
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'closed', 'expired')),
|
|
1442
|
+
timezone TEXT NOT NULL,
|
|
1443
|
+
created_at TEXT NOT NULL,
|
|
1444
|
+
updated_at TEXT NOT NULL,
|
|
1445
|
+
expires_at TEXT NOT NULL
|
|
1446
|
+
, idempotency_key TEXT);
|
|
1447
|
+
|
|
1448
|
+
CREATE TABLE assistant_messages (
|
|
1449
|
+
id TEXT PRIMARY KEY,
|
|
1450
|
+
session_id TEXT NOT NULL REFERENCES assistant_sessions(id) ON DELETE CASCADE,
|
|
1451
|
+
role TEXT NOT NULL CHECK (role IN ('user', 'assistant', 'system', 'tool')),
|
|
1452
|
+
body TEXT NOT NULL,
|
|
1453
|
+
citations_json TEXT NOT NULL DEFAULT '[]',
|
|
1454
|
+
model_alias_version_id TEXT REFERENCES model_alias_versions(id),
|
|
1455
|
+
created_at TEXT NOT NULL
|
|
1456
|
+
, idempotency_key TEXT);
|
|
1457
|
+
|
|
1458
|
+
CREATE TABLE assistant_tool_calls (
|
|
1459
|
+
id TEXT PRIMARY KEY,
|
|
1460
|
+
session_id TEXT NOT NULL REFERENCES assistant_sessions(id) ON DELETE CASCADE,
|
|
1461
|
+
message_id TEXT REFERENCES assistant_messages(id) ON DELETE SET NULL,
|
|
1462
|
+
tool_name TEXT NOT NULL,
|
|
1463
|
+
permission_snapshot_json TEXT NOT NULL,
|
|
1464
|
+
input_json TEXT,
|
|
1465
|
+
input_digest TEXT NOT NULL,
|
|
1466
|
+
output_summary_json TEXT,
|
|
1467
|
+
output_digest TEXT,
|
|
1468
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'succeeded', 'failed', 'denied')),
|
|
1469
|
+
error_code TEXT,
|
|
1470
|
+
started_at TEXT NOT NULL,
|
|
1471
|
+
finished_at TEXT,
|
|
1472
|
+
audit_event_id TEXT REFERENCES audit_events(id)
|
|
1473
|
+
);
|
|
1474
|
+
|
|
1475
|
+
CREATE TABLE shadow_comparisons (
|
|
1476
|
+
id TEXT PRIMARY KEY,
|
|
1477
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
1478
|
+
primary_run_id TEXT REFERENCES workflow_runs(id) ON DELETE SET NULL,
|
|
1479
|
+
shadow_run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE,
|
|
1480
|
+
primary_decision_id TEXT REFERENCES decisions(id),
|
|
1481
|
+
shadow_finding_id TEXT REFERENCES findings(id),
|
|
1482
|
+
comparison_codes_json TEXT NOT NULL,
|
|
1483
|
+
severity TEXT NOT NULL CHECK (severity IN ('info', 'low', 'medium', 'high', 'critical')),
|
|
1484
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'quality_task_created', 'reviewed', 'dismissed')),
|
|
1485
|
+
created_at TEXT NOT NULL,
|
|
1486
|
+
reviewed_at TEXT
|
|
1487
|
+
);
|
|
1488
|
+
|
|
1489
|
+
CREATE TABLE budget_policies (
|
|
1490
|
+
id TEXT PRIMARY KEY,
|
|
1491
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1492
|
+
scope_type TEXT NOT NULL CHECK (scope_type IN (
|
|
1493
|
+
'installation', 'queue', 'workflow', 'component', 'connection', 'agent', 'assistant', 'shadow'
|
|
1494
|
+
)),
|
|
1495
|
+
scope_id TEXT NOT NULL,
|
|
1496
|
+
metric TEXT NOT NULL CHECK (metric IN (
|
|
1497
|
+
'reports', 'calls', 'concurrent_calls', 'input_units', 'output_units', 'cost_microusd',
|
|
1498
|
+
'emails', 'actions', 'evidence_fetches', 'storage_bytes'
|
|
1499
|
+
)),
|
|
1500
|
+
limit_value INTEGER NOT NULL CHECK (limit_value >= 0),
|
|
1501
|
+
window_seconds INTEGER NOT NULL CHECK (window_seconds BETWEEN 1 AND 2678400),
|
|
1502
|
+
behavior TEXT NOT NULL CHECK (behavior IN ('block', 'fallback', 'defer', 'sample', 'pause')),
|
|
1503
|
+
fallback_reference TEXT,
|
|
1504
|
+
published_at TEXT NOT NULL,
|
|
1505
|
+
retired_at TEXT,
|
|
1506
|
+
created_by TEXT NOT NULL,
|
|
1507
|
+
created_at TEXT NOT NULL
|
|
1508
|
+
);
|
|
1509
|
+
|
|
1510
|
+
CREATE TABLE budget_usage (
|
|
1511
|
+
policy_id TEXT NOT NULL REFERENCES budget_policies(id) ON DELETE CASCADE,
|
|
1512
|
+
window_start TEXT NOT NULL,
|
|
1513
|
+
reserved_value INTEGER NOT NULL DEFAULT 0 CHECK (reserved_value >= 0),
|
|
1514
|
+
consumed_value INTEGER NOT NULL DEFAULT 0 CHECK (consumed_value >= 0),
|
|
1515
|
+
revision INTEGER NOT NULL DEFAULT 1 CHECK (revision >= 1),
|
|
1516
|
+
updated_at TEXT NOT NULL,
|
|
1517
|
+
PRIMARY KEY (policy_id, window_start)
|
|
1518
|
+
);
|
|
1519
|
+
|
|
1520
|
+
CREATE TABLE budget_reservations (
|
|
1521
|
+
id TEXT PRIMARY KEY,
|
|
1522
|
+
policy_id TEXT NOT NULL REFERENCES budget_policies(id) ON DELETE CASCADE,
|
|
1523
|
+
window_start TEXT NOT NULL,
|
|
1524
|
+
operation_type TEXT NOT NULL,
|
|
1525
|
+
operation_id TEXT NOT NULL,
|
|
1526
|
+
attempt_id TEXT NOT NULL,
|
|
1527
|
+
reserved_value INTEGER NOT NULL CHECK (reserved_value >= 0),
|
|
1528
|
+
committed_value INTEGER CHECK (committed_value IS NULL OR committed_value >= 0),
|
|
1529
|
+
status TEXT NOT NULL CHECK (status IN ('reserved', 'committed', 'released', 'expired')),
|
|
1530
|
+
expires_at TEXT NOT NULL,
|
|
1531
|
+
created_at TEXT NOT NULL,
|
|
1532
|
+
updated_at TEXT NOT NULL,
|
|
1533
|
+
UNIQUE (policy_id, operation_id, attempt_id)
|
|
1534
|
+
);
|
|
1535
|
+
|
|
1536
|
+
CREATE TABLE intake_decisions (
|
|
1537
|
+
id TEXT PRIMARY KEY,
|
|
1538
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1539
|
+
integration_id TEXT REFERENCES application_integrations(id),
|
|
1540
|
+
report_id TEXT REFERENCES reports(id) ON DELETE SET NULL,
|
|
1541
|
+
request_id TEXT NOT NULL,
|
|
1542
|
+
decision TEXT NOT NULL CHECK (decision IN ('accept', 'challenge', 'reject', 'quarantine', 'group')),
|
|
1543
|
+
reason_codes_json TEXT NOT NULL,
|
|
1544
|
+
source TEXT NOT NULL CHECK (source IN ('signed_widget', 'public_page', 'server_api', 'connector')),
|
|
1545
|
+
network_key_hash TEXT,
|
|
1546
|
+
contact_key_hash TEXT,
|
|
1547
|
+
target_key_hash TEXT,
|
|
1548
|
+
campaign_fingerprint TEXT,
|
|
1549
|
+
turnstile_outcome TEXT,
|
|
1550
|
+
rate_summary_json TEXT NOT NULL DEFAULT '{}',
|
|
1551
|
+
created_at TEXT NOT NULL,
|
|
1552
|
+
UNIQUE (installation_id, request_id)
|
|
1553
|
+
);
|
|
1554
|
+
|
|
1555
|
+
CREATE TABLE duplicate_groups (
|
|
1556
|
+
id TEXT PRIMARY KEY,
|
|
1557
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1558
|
+
fingerprint_version TEXT NOT NULL,
|
|
1559
|
+
fingerprint TEXT NOT NULL,
|
|
1560
|
+
target_type TEXT NOT NULL,
|
|
1561
|
+
target_reference_hash TEXT NOT NULL,
|
|
1562
|
+
reason_family TEXT,
|
|
1563
|
+
state TEXT NOT NULL CHECK (state IN ('active', 'split', 'merged', 'closed')),
|
|
1564
|
+
canonical_report_id TEXT REFERENCES reports(id) ON DELETE SET NULL,
|
|
1565
|
+
member_count INTEGER NOT NULL DEFAULT 0 CHECK (member_count >= 0),
|
|
1566
|
+
first_seen_at TEXT NOT NULL,
|
|
1567
|
+
last_seen_at TEXT NOT NULL,
|
|
1568
|
+
created_at TEXT NOT NULL,
|
|
1569
|
+
updated_at TEXT NOT NULL,
|
|
1570
|
+
UNIQUE (installation_id, fingerprint_version, fingerprint)
|
|
1571
|
+
);
|
|
1572
|
+
|
|
1573
|
+
CREATE TABLE duplicate_group_members (
|
|
1574
|
+
group_id TEXT NOT NULL REFERENCES duplicate_groups(id) ON DELETE CASCADE,
|
|
1575
|
+
report_id TEXT NOT NULL UNIQUE REFERENCES reports(id) ON DELETE CASCADE,
|
|
1576
|
+
similarity_basis_json TEXT NOT NULL,
|
|
1577
|
+
added_at TEXT NOT NULL,
|
|
1578
|
+
removed_at TEXT,
|
|
1579
|
+
PRIMARY KEY (group_id, report_id)
|
|
1580
|
+
);
|
|
1581
|
+
|
|
1582
|
+
CREATE TABLE abuse_surge_states (
|
|
1583
|
+
installation_id TEXT PRIMARY KEY REFERENCES installations(id) ON DELETE CASCADE,
|
|
1584
|
+
state TEXT NOT NULL CHECK (state IN ('normal', 'elevated', 'surge', 'recovery')),
|
|
1585
|
+
reason_codes_json TEXT NOT NULL,
|
|
1586
|
+
activated_at TEXT,
|
|
1587
|
+
recover_after TEXT,
|
|
1588
|
+
revision INTEGER NOT NULL DEFAULT 1 CHECK (revision >= 1),
|
|
1589
|
+
updated_by TEXT NOT NULL,
|
|
1590
|
+
updated_at TEXT NOT NULL
|
|
1591
|
+
);
|
|
1592
|
+
|
|
1593
|
+
CREATE TABLE report_queue_assignments (
|
|
1594
|
+
id TEXT PRIMARY KEY,
|
|
1595
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
1596
|
+
queue_id TEXT NOT NULL REFERENCES queue_definitions(id),
|
|
1597
|
+
queue_version_id TEXT REFERENCES queue_versions(id),
|
|
1598
|
+
routing_rule_version_id TEXT REFERENCES routing_rule_versions(id),
|
|
1599
|
+
routing_agent_version_id TEXT,
|
|
1600
|
+
assignment_kind TEXT NOT NULL CHECK (assignment_kind IN ('initial', 'reassignment', 'handoff', 'fallback')),
|
|
1601
|
+
reason_json TEXT NOT NULL,
|
|
1602
|
+
assigned_by_type TEXT NOT NULL,
|
|
1603
|
+
assigned_by_id TEXT NOT NULL,
|
|
1604
|
+
assigned_at TEXT NOT NULL,
|
|
1605
|
+
ended_at TEXT
|
|
1606
|
+
);
|
|
1607
|
+
|
|
1608
|
+
CREATE TABLE evidence_fetch_requests (
|
|
1609
|
+
id TEXT PRIMARY KEY,
|
|
1610
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1611
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
1612
|
+
evidence_reference_id TEXT NOT NULL REFERENCES evidence_references(id) ON DELETE CASCADE,
|
|
1613
|
+
run_id TEXT REFERENCES workflow_runs(id) ON DELETE SET NULL,
|
|
1614
|
+
step_run_id TEXT REFERENCES workflow_step_runs(id) ON DELETE SET NULL,
|
|
1615
|
+
connection_version_id TEXT NOT NULL REFERENCES connection_versions(id),
|
|
1616
|
+
requested_fields_json TEXT NOT NULL,
|
|
1617
|
+
freshness_requirement_seconds INTEGER CHECK (freshness_requirement_seconds IS NULL OR freshness_requirement_seconds >= 0),
|
|
1618
|
+
state TEXT NOT NULL CHECK (state IN ('pending', 'fetching', 'available', 'unavailable', 'failed')),
|
|
1619
|
+
operation_id TEXT NOT NULL UNIQUE,
|
|
1620
|
+
next_attempt_at TEXT NOT NULL,
|
|
1621
|
+
attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
|
|
1622
|
+
last_error_code TEXT,
|
|
1623
|
+
created_at TEXT NOT NULL,
|
|
1624
|
+
updated_at TEXT NOT NULL
|
|
1625
|
+
, request_method TEXT NOT NULL DEFAULT 'POST', request_path TEXT NOT NULL DEFAULT '/v1/evidence/fetch');
|
|
1626
|
+
|
|
1627
|
+
CREATE TABLE evidence_fetch_attempts (
|
|
1628
|
+
id TEXT PRIMARY KEY,
|
|
1629
|
+
request_id TEXT NOT NULL REFERENCES evidence_fetch_requests(id) ON DELETE CASCADE,
|
|
1630
|
+
attempt_number INTEGER NOT NULL CHECK (attempt_number >= 1),
|
|
1631
|
+
request_digest TEXT NOT NULL,
|
|
1632
|
+
response_status INTEGER,
|
|
1633
|
+
response_digest TEXT,
|
|
1634
|
+
response_class TEXT NOT NULL,
|
|
1635
|
+
error_code TEXT,
|
|
1636
|
+
started_at TEXT NOT NULL,
|
|
1637
|
+
finished_at TEXT NOT NULL,
|
|
1638
|
+
UNIQUE (request_id, attempt_number)
|
|
1639
|
+
);
|
|
1640
|
+
|
|
1641
|
+
CREATE TABLE evidence_snapshots (
|
|
1642
|
+
id TEXT PRIMARY KEY,
|
|
1643
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1644
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
1645
|
+
evidence_reference_id TEXT REFERENCES evidence_references(id) ON DELETE SET NULL,
|
|
1646
|
+
fetch_request_id TEXT REFERENCES evidence_fetch_requests(id) ON DELETE SET NULL,
|
|
1647
|
+
r2_object_key TEXT NOT NULL UNIQUE,
|
|
1648
|
+
content_type TEXT NOT NULL,
|
|
1649
|
+
size_bytes INTEGER NOT NULL CHECK (size_bytes >= 0),
|
|
1650
|
+
digest TEXT NOT NULL,
|
|
1651
|
+
encryption_key_reference TEXT,
|
|
1652
|
+
retention_class TEXT NOT NULL,
|
|
1653
|
+
access_policy_json TEXT NOT NULL,
|
|
1654
|
+
source_observed_at TEXT,
|
|
1655
|
+
created_by_type TEXT NOT NULL,
|
|
1656
|
+
created_by_id TEXT NOT NULL,
|
|
1657
|
+
created_at TEXT NOT NULL,
|
|
1658
|
+
deleted_at TEXT
|
|
1659
|
+
);
|
|
1660
|
+
|
|
1661
|
+
CREATE TABLE evidence_access_events (
|
|
1662
|
+
id TEXT PRIMARY KEY,
|
|
1663
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1664
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
1665
|
+
evidence_reference_id TEXT REFERENCES evidence_references(id) ON DELETE SET NULL,
|
|
1666
|
+
snapshot_id TEXT REFERENCES evidence_snapshots(id) ON DELETE SET NULL,
|
|
1667
|
+
actor_type TEXT NOT NULL,
|
|
1668
|
+
actor_id TEXT NOT NULL,
|
|
1669
|
+
purpose_code TEXT NOT NULL,
|
|
1670
|
+
request_id TEXT NOT NULL,
|
|
1671
|
+
accessed_at TEXT NOT NULL
|
|
1672
|
+
);
|
|
1673
|
+
|
|
1674
|
+
CREATE TABLE operations_incidents (
|
|
1675
|
+
id TEXT PRIMARY KEY,
|
|
1676
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1677
|
+
incident_key TEXT NOT NULL,
|
|
1678
|
+
severity TEXT NOT NULL CHECK (severity IN ('info', 'low', 'medium', 'high', 'critical')),
|
|
1679
|
+
category TEXT NOT NULL,
|
|
1680
|
+
state TEXT NOT NULL CHECK (state IN ('open', 'acknowledged', 'mitigated', 'resolved')),
|
|
1681
|
+
title TEXT NOT NULL,
|
|
1682
|
+
summary TEXT NOT NULL,
|
|
1683
|
+
entity_type TEXT,
|
|
1684
|
+
entity_id TEXT,
|
|
1685
|
+
occurrence_count INTEGER NOT NULL DEFAULT 1 CHECK (occurrence_count >= 1),
|
|
1686
|
+
first_seen_at TEXT NOT NULL,
|
|
1687
|
+
last_seen_at TEXT NOT NULL,
|
|
1688
|
+
acknowledged_by TEXT,
|
|
1689
|
+
acknowledged_at TEXT,
|
|
1690
|
+
resolved_by TEXT,
|
|
1691
|
+
resolved_at TEXT,
|
|
1692
|
+
resolution_summary TEXT,
|
|
1693
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
1694
|
+
UNIQUE (installation_id, incident_key)
|
|
1695
|
+
);
|
|
1696
|
+
|
|
1697
|
+
CREATE TABLE reconciliation_runs (
|
|
1698
|
+
id TEXT PRIMARY KEY,
|
|
1699
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1700
|
+
reconciliation_kind TEXT NOT NULL,
|
|
1701
|
+
state TEXT NOT NULL CHECK (state IN ('running', 'succeeded', 'failed', 'partial')),
|
|
1702
|
+
cursor_json TEXT NOT NULL DEFAULT '{}',
|
|
1703
|
+
scanned_count INTEGER NOT NULL DEFAULT 0 CHECK (scanned_count >= 0),
|
|
1704
|
+
repaired_count INTEGER NOT NULL DEFAULT 0 CHECK (repaired_count >= 0),
|
|
1705
|
+
incident_count INTEGER NOT NULL DEFAULT 0 CHECK (incident_count >= 0),
|
|
1706
|
+
error_code TEXT,
|
|
1707
|
+
started_at TEXT NOT NULL,
|
|
1708
|
+
finished_at TEXT
|
|
1709
|
+
);
|
|
1710
|
+
|
|
1711
|
+
CREATE TABLE repair_actions (
|
|
1712
|
+
id TEXT PRIMARY KEY,
|
|
1713
|
+
reconciliation_run_id TEXT REFERENCES reconciliation_runs(id) ON DELETE SET NULL,
|
|
1714
|
+
incident_id TEXT REFERENCES operations_incidents(id) ON DELETE SET NULL,
|
|
1715
|
+
action_type TEXT NOT NULL,
|
|
1716
|
+
entity_type TEXT NOT NULL,
|
|
1717
|
+
entity_id TEXT NOT NULL,
|
|
1718
|
+
operation_key TEXT NOT NULL UNIQUE,
|
|
1719
|
+
state TEXT NOT NULL CHECK (state IN ('planned', 'applied', 'failed', 'skipped')),
|
|
1720
|
+
before_json TEXT,
|
|
1721
|
+
after_json TEXT,
|
|
1722
|
+
error_code TEXT,
|
|
1723
|
+
planned_by TEXT NOT NULL,
|
|
1724
|
+
planned_at TEXT NOT NULL,
|
|
1725
|
+
applied_at TEXT
|
|
1726
|
+
);
|
|
1727
|
+
|
|
1728
|
+
CREATE TABLE security_events (
|
|
1729
|
+
id TEXT PRIMARY KEY,
|
|
1730
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1731
|
+
event_type TEXT NOT NULL,
|
|
1732
|
+
severity TEXT NOT NULL CHECK (severity IN ('info', 'low', 'medium', 'high', 'critical')),
|
|
1733
|
+
actor_type TEXT,
|
|
1734
|
+
actor_id TEXT,
|
|
1735
|
+
source_key_hash TEXT,
|
|
1736
|
+
entity_type TEXT,
|
|
1737
|
+
entity_id TEXT,
|
|
1738
|
+
details_json TEXT NOT NULL,
|
|
1739
|
+
created_at TEXT NOT NULL
|
|
1740
|
+
);
|
|
1741
|
+
|
|
1742
|
+
CREATE TABLE export_jobs (
|
|
1743
|
+
id TEXT PRIMARY KEY,
|
|
1744
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1745
|
+
requested_by TEXT NOT NULL,
|
|
1746
|
+
export_type TEXT NOT NULL CHECK (export_type IN ('reports_csv', 'reports_ndjson', 'audit_ndjson', 'configuration')),
|
|
1747
|
+
filters_json TEXT NOT NULL,
|
|
1748
|
+
redaction_policy_json TEXT NOT NULL,
|
|
1749
|
+
state TEXT NOT NULL CHECK (state IN ('pending', 'running', 'ready', 'failed', 'expired', 'deleted')),
|
|
1750
|
+
r2_object_key TEXT,
|
|
1751
|
+
digest TEXT,
|
|
1752
|
+
size_bytes INTEGER CHECK (size_bytes IS NULL OR size_bytes >= 0),
|
|
1753
|
+
row_count INTEGER CHECK (row_count IS NULL OR row_count >= 0),
|
|
1754
|
+
error_code TEXT,
|
|
1755
|
+
requested_at TEXT NOT NULL,
|
|
1756
|
+
ready_at TEXT,
|
|
1757
|
+
expires_at TEXT,
|
|
1758
|
+
deleted_at TEXT
|
|
1759
|
+
, idempotency_key TEXT);
|
|
1760
|
+
|
|
1761
|
+
CREATE TABLE backup_manifests (
|
|
1762
|
+
id TEXT PRIMARY KEY,
|
|
1763
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1764
|
+
environment TEXT NOT NULL,
|
|
1765
|
+
schema_version INTEGER NOT NULL CHECK (schema_version >= 1),
|
|
1766
|
+
application_version TEXT NOT NULL,
|
|
1767
|
+
d1_export_reference TEXT NOT NULL,
|
|
1768
|
+
d1_digest TEXT NOT NULL,
|
|
1769
|
+
r2_manifest_reference TEXT,
|
|
1770
|
+
r2_manifest_digest TEXT,
|
|
1771
|
+
encryption_metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
1772
|
+
state TEXT NOT NULL CHECK (state IN ('planned', 'running', 'complete', 'failed', 'verified')),
|
|
1773
|
+
created_by TEXT NOT NULL,
|
|
1774
|
+
created_at TEXT NOT NULL,
|
|
1775
|
+
completed_at TEXT,
|
|
1776
|
+
verified_at TEXT
|
|
1777
|
+
);
|
|
1778
|
+
|
|
1779
|
+
CREATE TABLE deletion_proofs (
|
|
1780
|
+
id TEXT PRIMARY KEY,
|
|
1781
|
+
deletion_request_id TEXT NOT NULL REFERENCES deletion_requests(id) ON DELETE CASCADE,
|
|
1782
|
+
proof_json TEXT NOT NULL,
|
|
1783
|
+
proof_digest TEXT NOT NULL,
|
|
1784
|
+
created_at TEXT NOT NULL,
|
|
1785
|
+
UNIQUE (deletion_request_id)
|
|
1786
|
+
);
|
|
1787
|
+
|
|
1788
|
+
CREATE TABLE connection_attempts (
|
|
1789
|
+
id TEXT PRIMARY KEY,
|
|
1790
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1791
|
+
connection_version_id TEXT NOT NULL REFERENCES connection_versions(id),
|
|
1792
|
+
component_run_id TEXT REFERENCES component_runs(id) ON DELETE SET NULL,
|
|
1793
|
+
action_proposal_id TEXT REFERENCES action_proposals(id) ON DELETE SET NULL,
|
|
1794
|
+
operation_id TEXT NOT NULL,
|
|
1795
|
+
attempt_number INTEGER NOT NULL CHECK (attempt_number >= 1),
|
|
1796
|
+
method TEXT NOT NULL,
|
|
1797
|
+
destination_origin TEXT NOT NULL,
|
|
1798
|
+
destination_path_hash TEXT NOT NULL,
|
|
1799
|
+
request_digest TEXT NOT NULL,
|
|
1800
|
+
response_status INTEGER,
|
|
1801
|
+
response_digest TEXT,
|
|
1802
|
+
response_class TEXT NOT NULL CHECK (response_class IN (
|
|
1803
|
+
'success', 'retryable', 'permanent', 'timeout', 'circuit_open', 'denied', 'invalid'
|
|
1804
|
+
)),
|
|
1805
|
+
error_code TEXT,
|
|
1806
|
+
started_at TEXT NOT NULL,
|
|
1807
|
+
finished_at TEXT NOT NULL,
|
|
1808
|
+
UNIQUE (operation_id, attempt_number)
|
|
1809
|
+
);
|
|
1810
|
+
|
|
1811
|
+
CREATE TABLE component_cache_entries (
|
|
1812
|
+
id TEXT PRIMARY KEY,
|
|
1813
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1814
|
+
component_version_id TEXT NOT NULL REFERENCES component_versions(id) ON DELETE CASCADE,
|
|
1815
|
+
subject_key_hash TEXT NOT NULL,
|
|
1816
|
+
input_digest TEXT NOT NULL,
|
|
1817
|
+
finding_id TEXT NOT NULL REFERENCES findings(id) ON DELETE CASCADE,
|
|
1818
|
+
output_json TEXT NOT NULL,
|
|
1819
|
+
output_digest TEXT NOT NULL,
|
|
1820
|
+
created_at TEXT NOT NULL,
|
|
1821
|
+
expires_at TEXT NOT NULL,
|
|
1822
|
+
UNIQUE (component_version_id, subject_key_hash, input_digest)
|
|
1823
|
+
);
|
|
1824
|
+
|
|
1825
|
+
CREATE TABLE operator_invitations (
|
|
1826
|
+
id TEXT PRIMARY KEY,
|
|
1827
|
+
email TEXT NOT NULL COLLATE NOCASE,
|
|
1828
|
+
role TEXT NOT NULL CHECK (role IN (
|
|
1829
|
+
'administrator', 'workflow_author', 'reviewer', 'appeal_reviewer',
|
|
1830
|
+
'quality_reviewer', 'operations', 'auditor'
|
|
1831
|
+
)),
|
|
1832
|
+
token_hash TEXT NOT NULL UNIQUE,
|
|
1833
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'accepted', 'revoked')),
|
|
1834
|
+
invited_by TEXT NOT NULL,
|
|
1835
|
+
accepted_by TEXT REFERENCES operator_users(id),
|
|
1836
|
+
expires_at TEXT NOT NULL,
|
|
1837
|
+
accepted_at TEXT,
|
|
1838
|
+
revoked_at TEXT,
|
|
1839
|
+
created_at TEXT NOT NULL
|
|
1840
|
+
);
|
|
1841
|
+
|
|
1842
|
+
CREATE TABLE workflow_ai_runs (
|
|
1843
|
+
id TEXT PRIMARY KEY,
|
|
1844
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1845
|
+
report_id TEXT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
|
|
1846
|
+
workflow_run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE,
|
|
1847
|
+
step_run_id TEXT NOT NULL REFERENCES workflow_step_runs(id) ON DELETE CASCADE,
|
|
1848
|
+
component_version_id TEXT REFERENCES component_versions(id),
|
|
1849
|
+
agent_version_id TEXT REFERENCES agent_versions(id),
|
|
1850
|
+
authority_mode TEXT NOT NULL CHECK (authority_mode IN ('shadow', 'assist', 'bounded_auto')),
|
|
1851
|
+
provider TEXT NOT NULL,
|
|
1852
|
+
model TEXT NOT NULL,
|
|
1853
|
+
prompt_version_id TEXT,
|
|
1854
|
+
output_schema_digest TEXT NOT NULL,
|
|
1855
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'succeeded', 'invalid', 'failed', 'timed_out')),
|
|
1856
|
+
input_digest TEXT NOT NULL,
|
|
1857
|
+
output_json TEXT,
|
|
1858
|
+
output_digest TEXT,
|
|
1859
|
+
validation_errors_json TEXT NOT NULL DEFAULT '[]',
|
|
1860
|
+
input_units INTEGER CHECK (input_units IS NULL OR input_units >= 0),
|
|
1861
|
+
output_units INTEGER CHECK (output_units IS NULL OR output_units >= 0),
|
|
1862
|
+
estimated_cost_microusd INTEGER NOT NULL DEFAULT 0 CHECK (estimated_cost_microusd >= 0),
|
|
1863
|
+
provider_request_id TEXT,
|
|
1864
|
+
started_at TEXT NOT NULL,
|
|
1865
|
+
finished_at TEXT,
|
|
1866
|
+
UNIQUE (step_run_id, component_version_id, agent_version_id)
|
|
1867
|
+
);
|
|
1868
|
+
|
|
1869
|
+
CREATE TABLE connection_execution_leases (
|
|
1870
|
+
id TEXT PRIMARY KEY,
|
|
1871
|
+
connection_version_id TEXT NOT NULL REFERENCES connection_versions(id) ON DELETE CASCADE,
|
|
1872
|
+
operation_id TEXT NOT NULL,
|
|
1873
|
+
attempt_number INTEGER NOT NULL CHECK (attempt_number >= 1),
|
|
1874
|
+
expires_at TEXT NOT NULL,
|
|
1875
|
+
created_at TEXT NOT NULL,
|
|
1876
|
+
UNIQUE (operation_id, attempt_number)
|
|
1877
|
+
);
|
|
1878
|
+
|
|
1879
|
+
CREATE TABLE prompt_versions (
|
|
1880
|
+
id TEXT PRIMARY KEY,
|
|
1881
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1882
|
+
prompt_key TEXT NOT NULL,
|
|
1883
|
+
version INTEGER NOT NULL CHECK (version >= 1),
|
|
1884
|
+
name TEXT NOT NULL,
|
|
1885
|
+
template_text TEXT NOT NULL,
|
|
1886
|
+
variable_schema_json TEXT NOT NULL DEFAULT '{"type":"object"}',
|
|
1887
|
+
prompt_digest TEXT NOT NULL,
|
|
1888
|
+
status TEXT NOT NULL DEFAULT 'published' CHECK (status IN ('published', 'retired')),
|
|
1889
|
+
published_at TEXT NOT NULL,
|
|
1890
|
+
retired_at TEXT,
|
|
1891
|
+
created_by TEXT NOT NULL,
|
|
1892
|
+
created_at TEXT NOT NULL,
|
|
1893
|
+
UNIQUE (installation_id, prompt_key, version),
|
|
1894
|
+
UNIQUE (installation_id, prompt_digest)
|
|
1895
|
+
);
|
|
1896
|
+
|
|
1897
|
+
CREATE TABLE ai_registry_mutations (
|
|
1898
|
+
idempotency_key TEXT PRIMARY KEY,
|
|
1899
|
+
action TEXT NOT NULL,
|
|
1900
|
+
actor_id TEXT NOT NULL,
|
|
1901
|
+
target_id TEXT NOT NULL,
|
|
1902
|
+
response_json TEXT NOT NULL,
|
|
1903
|
+
created_at TEXT NOT NULL
|
|
1904
|
+
);
|
|
1905
|
+
|
|
1906
|
+
CREATE TABLE configuration_drafts (
|
|
1907
|
+
id TEXT PRIMARY KEY,
|
|
1908
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1909
|
+
configuration_type TEXT NOT NULL CHECK (configuration_type IN ('form', 'policy', 'template', 'routing_rules')),
|
|
1910
|
+
configuration_key TEXT NOT NULL,
|
|
1911
|
+
content_json TEXT NOT NULL,
|
|
1912
|
+
content_digest TEXT NOT NULL,
|
|
1913
|
+
validation_json TEXT NOT NULL DEFAULT '{"valid":false,"errors":[{"code":"not_validated"}]}',
|
|
1914
|
+
validation_status TEXT NOT NULL DEFAULT 'not_validated' CHECK (validation_status IN ('not_validated', 'valid', 'invalid')),
|
|
1915
|
+
revision INTEGER NOT NULL DEFAULT 1 CHECK (revision >= 1),
|
|
1916
|
+
last_published_version_id TEXT,
|
|
1917
|
+
created_by TEXT NOT NULL,
|
|
1918
|
+
updated_by TEXT NOT NULL,
|
|
1919
|
+
created_at TEXT NOT NULL,
|
|
1920
|
+
updated_at TEXT NOT NULL,
|
|
1921
|
+
UNIQUE (installation_id, configuration_type, configuration_key)
|
|
1922
|
+
);
|
|
1923
|
+
|
|
1924
|
+
CREATE TABLE assistant_drafts (
|
|
1925
|
+
id TEXT PRIMARY KEY,
|
|
1926
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1927
|
+
session_id TEXT NOT NULL REFERENCES assistant_sessions(id) ON DELETE CASCADE,
|
|
1928
|
+
principal_id TEXT NOT NULL,
|
|
1929
|
+
draft_type TEXT NOT NULL CHECK (draft_type IN ('workflow', 'form', 'policy', 'template', 'routing_rules')),
|
|
1930
|
+
target_id TEXT,
|
|
1931
|
+
title TEXT NOT NULL,
|
|
1932
|
+
content_json TEXT NOT NULL,
|
|
1933
|
+
content_digest TEXT NOT NULL,
|
|
1934
|
+
status TEXT NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'adopted', 'expired')),
|
|
1935
|
+
idempotency_key TEXT NOT NULL,
|
|
1936
|
+
created_at TEXT NOT NULL,
|
|
1937
|
+
adopted_at TEXT,
|
|
1938
|
+
adopted_target_id TEXT,
|
|
1939
|
+
UNIQUE (session_id, idempotency_key)
|
|
1940
|
+
);
|
|
1941
|
+
|
|
1942
|
+
CREATE TABLE integration_api_keys (
|
|
1943
|
+
id TEXT PRIMARY KEY,
|
|
1944
|
+
integration_id TEXT NOT NULL REFERENCES application_integrations(id) ON DELETE CASCADE,
|
|
1945
|
+
key_id TEXT NOT NULL UNIQUE,
|
|
1946
|
+
key_hash TEXT NOT NULL UNIQUE,
|
|
1947
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'revoked', 'expired')),
|
|
1948
|
+
valid_from TEXT NOT NULL,
|
|
1949
|
+
expires_at TEXT,
|
|
1950
|
+
created_by TEXT NOT NULL,
|
|
1951
|
+
created_at TEXT NOT NULL,
|
|
1952
|
+
revoked_by TEXT,
|
|
1953
|
+
revoked_at TEXT
|
|
1954
|
+
);
|
|
1955
|
+
|
|
1956
|
+
CREATE TABLE saved_views (
|
|
1957
|
+
id TEXT PRIMARY KEY,
|
|
1958
|
+
installation_id TEXT NOT NULL REFERENCES installations(id) ON DELETE CASCADE,
|
|
1959
|
+
principal_id TEXT NOT NULL,
|
|
1960
|
+
name TEXT NOT NULL,
|
|
1961
|
+
filters_json TEXT NOT NULL,
|
|
1962
|
+
created_at TEXT NOT NULL,
|
|
1963
|
+
updated_at TEXT NOT NULL,
|
|
1964
|
+
UNIQUE (installation_id, principal_id, name)
|
|
1965
|
+
);
|
|
1966
|
+
|
|
1967
|
+
PRAGMA defer_foreign_keys = ON;
|
|
1968
|
+
|
|
1969
|
+
INSERT INTO "installations" ("id", "display_name", "default_locale", "anonymous_reporting_enabled", "created_at", "updated_at", "timezone", "settings_json") VALUES ('default', 'Safest Resolve', 'en', 1, '2026-09-02T00:46:58.042Z', '2026-09-02T00:46:58.875Z', 'UTC', '{}');
|
|
1970
|
+
|
|
1971
|
+
INSERT INTO "application_integrations" ("id", "installation_id", "name", "key_id", "allowed_origins_json", "enabled", "created_at", "updated_at", "scopes_json", "channel_mode", "form_version_id", "context_schema_json") VALUES ('default', 'default', 'Default integration', 'default', '["http://localhost:8787","http://localhost:8788"]', 1, '2026-09-02T00:46:58.042Z', '2026-09-02T00:46:58.042Z', '["submit_reports","mint_context_tokens"]', 'contextual', NULL, '{"version":1,"allow_unknown":true,"fields":[]}');
|
|
1972
|
+
|
|
1973
|
+
INSERT INTO "report_form_versions" ("id", "installation_id", "form_key", "version", "title", "description", "target_types_json", "reasons_json", "fields_json", "consent_notice", "published_at", "retired_at", "created_by", "created_at") VALUES ('general-v1', 'default', 'general', 1, 'Report a safety concern', 'Tell the service owner about abuse or a safety concern.', '["message","profile","listing","account","file","transaction","service"]', '[{"code":"harassment","label":"Harassment"},{"code":"spam","label":"Spam or scam"},{"code":"threat","label":"Threat or immediate danger"},{"code":"other","label":"Something else"}]', '[{"key":"details","label":"What happened?","type":"long_text","required":true,"max_length":4000}]', 'Your report will be shared with authorized safety reviewers and handled according to the service privacy policy.', '2026-09-02T00:46:58.042Z', NULL, 'system', '2026-09-02T00:46:58.042Z');
|
|
1974
|
+
|
|
1975
|
+
INSERT INTO "policy_versions" ("id", "installation_id", "policy_key", "version", "title", "rules_json", "published_at", "created_by", "created_at") VALUES ('general-policy-v1', 'default', 'general', 1, 'General safety policy', '[{"code":"GENERAL-1","title":"Customer review required"}]', '2026-09-02T00:46:58.042Z', 'system', '2026-09-02T00:46:58.042Z');
|
|
1976
|
+
|
|
1977
|
+
INSERT INTO "queue_definitions" ("id", "installation_id", "queue_key", "name", "queue_kind", "enabled", "created_at", "updated_at", "description", "purpose", "status", "position", "active_version_id", "created_by") VALUES ('urgent-human', 'default', 'urgent-human', 'Urgent human', 'human', 1, '2026-09-02T00:46:58.042Z', '2026-09-02T00:46:58.042Z', 'Protected, uncertain, urgent, or high-impact reports requiring human review.', 'reports', 'active', 10, 'urgent-human-v1', 'system');
|
|
1978
|
+
INSERT INTO "queue_definitions" ("id", "installation_id", "queue_key", "name", "queue_kind", "enabled", "created_at", "updated_at", "description", "purpose", "status", "position", "active_version_id", "created_by") VALUES ('standard-human', 'default', 'standard-human', 'Standard human', 'human', 1, '2026-09-02T00:46:58.042Z', '2026-09-02T00:46:58.042Z', 'General reports requiring a human decision.', 'reports', 'active', 20, 'standard-human-v1', 'system');
|
|
1979
|
+
INSERT INTO "queue_definitions" ("id", "installation_id", "queue_key", "name", "queue_kind", "enabled", "created_at", "updated_at", "description", "purpose", "status", "position", "active_version_id", "created_by") VALUES ('low-priority-ai', 'default', 'low-priority-ai', 'Low-priority AI', 'ai', 1, '2026-09-02T00:46:58.042Z', '2026-09-02T00:46:58.042Z', 'Bounded low-priority automation with mandatory human fallback.', 'reports', 'active', 30, 'low-priority-ai-v1', 'system');
|
|
1980
|
+
INSERT INTO "queue_definitions" ("id", "installation_id", "queue_key", "name", "queue_kind", "enabled", "created_at", "updated_at", "description", "purpose", "status", "position", "active_version_id", "created_by") VALUES ('appeals', 'default', 'appeals', 'Appeals', 'appeal', 1, '2026-09-02T00:46:58.042Z', '2026-09-02T00:46:58.042Z', 'Human-only review of contested decisions.', 'appeals', 'active', 40, 'appeals-v1', 'system');
|
|
1981
|
+
INSERT INTO "queue_definitions" ("id", "installation_id", "queue_key", "name", "queue_kind", "enabled", "created_at", "updated_at", "description", "purpose", "status", "position", "active_version_id", "created_by") VALUES ('operations', 'default', 'operations', 'Operations', 'operations', 1, '2026-09-02T00:46:58.042Z', '2026-09-02T00:46:58.042Z', 'Delivery failures and operational recovery work.', 'operations', 'active', 50, 'operations-v1', 'system');
|
|
1982
|
+
|
|
1983
|
+
INSERT INTO "queue_versions" ("id", "queue_id", "version", "mode", "priority", "response_sla_minutes", "resolution_sla_minutes", "claim_ttl_minutes", "fallback_queue_id", "configuration_json", "published_at", "created_by", "created_at", "management_mode", "routing_criteria_json", "reviewer_instructions", "ai_instructions", "enrichment_requirements_json", "ai_bounds_json", "retired_at") VALUES ('urgent-human-v1', 'urgent-human', 1, 'off', 100, 15, 240, 15, NULL, '{}', '2026-09-02T00:46:58.042Z', 'system', '2026-09-02T00:46:58.042Z', 'human', '{"match":"all","conditions":[]}', 'Review promptly. Treat the submission as an allegation, preserve uncertainty, and do not delegate the final decision to AI.', NULL, '[]', '{}', NULL);
|
|
1984
|
+
INSERT INTO "queue_versions" ("id", "queue_id", "version", "mode", "priority", "response_sla_minutes", "resolution_sla_minutes", "claim_ttl_minutes", "fallback_queue_id", "configuration_json", "published_at", "created_by", "created_at", "management_mode", "routing_criteria_json", "reviewer_instructions", "ai_instructions", "enrichment_requirements_json", "ai_bounds_json", "retired_at") VALUES ('standard-human-v1', 'standard-human', 1, 'off', 50, 1440, 10080, 15, NULL, '{}', '2026-09-02T00:46:58.042Z', 'system', '2026-09-02T00:46:58.042Z', 'human', '{"match":"all","conditions":[]}', 'Review the allegation and referenced evidence against the published customer policy. Record the evidence considered and rationale.', NULL, '[]', '{}', NULL);
|
|
1985
|
+
INSERT INTO "queue_versions" ("id", "queue_id", "version", "mode", "priority", "response_sla_minutes", "resolution_sla_minutes", "claim_ttl_minutes", "fallback_queue_id", "configuration_json", "published_at", "created_by", "created_at", "management_mode", "routing_criteria_json", "reviewer_instructions", "ai_instructions", "enrichment_requirements_json", "ai_bounds_json", "retired_at") VALUES ('low-priority-ai-v1', 'low-priority-ai', 1, 'shadow', 20, 1440, 10080, 15, 'standard-human', '{"allowed_outcomes":[],"protected_categories":[],"daily_volume_budget":0}', '2026-09-02T00:46:58.042Z', 'system', '2026-09-02T00:46:58.042Z', 'ai', '{"match":"all","conditions":[]}', 'Review AI output and all referenced evidence before accepting or changing the recommendation.', 'Assess only eligible low-priority reports against the published policy. Escalate uncertainty, missing evidence, protected cases, failures, and out-of-bound outcomes to a human.', '[]', '{"allowed_outcomes":[],"confidence_threshold":0.85,"max_follow_up_turns":1,"autonomous_actions":false}', NULL);
|
|
1986
|
+
INSERT INTO "queue_versions" ("id", "queue_id", "version", "mode", "priority", "response_sla_minutes", "resolution_sla_minutes", "claim_ttl_minutes", "fallback_queue_id", "configuration_json", "published_at", "created_by", "created_at", "management_mode", "routing_criteria_json", "reviewer_instructions", "ai_instructions", "enrichment_requirements_json", "ai_bounds_json", "retired_at") VALUES ('appeals-v1', 'appeals', 1, 'off', 60, 1440, 10080, 30, NULL, '{}', '2026-09-02T00:46:58.042Z', 'system', '2026-09-02T00:46:58.042Z', 'human', '{"match":"all","conditions":[]}', 'A human appeal reviewer must independently assess the contested decision and record a reasoned outcome.', NULL, '[]', '{}', NULL);
|
|
1987
|
+
INSERT INTO "queue_versions" ("id", "queue_id", "version", "mode", "priority", "response_sla_minutes", "resolution_sla_minutes", "claim_ttl_minutes", "fallback_queue_id", "configuration_json", "published_at", "created_by", "created_at", "management_mode", "routing_criteria_json", "reviewer_instructions", "ai_instructions", "enrichment_requirements_json", "ai_bounds_json", "retired_at") VALUES ('operations-v1', 'operations', 1, 'off', 80, 60, 1440, 30, NULL, '{}', '2026-09-02T00:46:58.042Z', 'system', '2026-09-02T00:46:58.042Z', 'human', '{"match":"all","conditions":[]}', 'Investigate the failed job, preserve accepted reports, and record any recovery action.', NULL, '[]', '{}', NULL);
|
|
1988
|
+
|
|
1989
|
+
INSERT INTO "routing_rule_versions" ("id", "installation_id", "version", "rules_json", "fixture_results_json", "published_at", "created_by", "created_at") VALUES ('default-routing-v1', 'default', 1, '{"default_queue_id":"standard-human","safeguard_queue_id":"urgent-human","rules":[],"fixtures":[],"intake_enrichments":[]}', '{"valid":true,"tested_at":"migration"}', '2026-09-02T00:47:05.861Z', 'system', '2026-09-02T00:47:05.861Z');
|
|
1990
|
+
|
|
1991
|
+
INSERT INTO "message_template_versions" ("id", "installation_id", "template_key", "version", "audience", "purpose", "locale", "body_template", "published_at", "created_by", "created_at", "automation_allowed", "variables_schema_json") VALUES ('reporter-follow-up-v1', 'default', 'reporter-follow-up', 1, 'reporter', 'follow_up', 'en', '{{message}}', '2026-09-02T00:46:58.477Z', 'system', '2026-09-02T00:46:58.477Z', 0, '{}');
|
|
1992
|
+
INSERT INTO "message_template_versions" ("id", "installation_id", "template_key", "version", "audience", "purpose", "locale", "body_template", "published_at", "created_by", "created_at", "automation_allowed", "variables_schema_json") VALUES ('reporter-outcome-v1', 'default', 'reporter-outcome', 1, 'reporter', 'outcome', 'en', '{{message}}', '2026-09-02T00:46:58.477Z', 'system', '2026-09-02T00:46:58.477Z', 0, '{}');
|
|
1993
|
+
INSERT INTO "message_template_versions" ("id", "installation_id", "template_key", "version", "audience", "purpose", "locale", "body_template", "published_at", "created_by", "created_at", "automation_allowed", "variables_schema_json") VALUES ('affected-user-notice-v1', 'default', 'affected-user-notice', 1, 'affected_user', 'affected_user_notice', 'en', '{{message}}', '2026-09-02T00:46:58.477Z', 'system', '2026-09-02T00:46:58.477Z', 0, '{}');
|
|
1994
|
+
INSERT INTO "message_template_versions" ("id", "installation_id", "template_key", "version", "audience", "purpose", "locale", "body_template", "published_at", "created_by", "created_at", "automation_allowed", "variables_schema_json") VALUES ('appeal-outcome-v1', 'default', 'appeal-outcome', 1, 'affected_user', 'appeal_outcome', 'en', '{{message}}', '2026-09-02T00:46:58.477Z', 'system', '2026-09-02T00:46:58.477Z', 0, '{}');
|
|
1995
|
+
INSERT INTO "message_template_versions" ("id", "installation_id", "template_key", "version", "audience", "purpose", "locale", "body_template", "published_at", "created_by", "created_at", "automation_allowed", "variables_schema_json") VALUES ('ai-more-context-v1', 'default', 'ai-more-context', 1, 'reporter', 'follow_up', 'en', 'Automated review needs one more detail: {{missing_item}}. Reply here, or request review by a person.', '2026-09-02T00:46:59.302Z', 'system', '2026-09-02T00:46:59.302Z', 1, '{"missing_item":{"type":"string","minLength":3,"maxLength":160}}');
|
|
1996
|
+
INSERT INTO "message_template_versions" ("id", "installation_id", "template_key", "version", "audience", "purpose", "locale", "body_template", "published_at", "created_by", "created_at", "automation_allowed", "variables_schema_json") VALUES ('ai-no-violation-v1', 'default', 'ai-no-violation', 1, 'reporter', 'outcome', 'en', 'Automated review did not find a violation under {{policy_code}}. You may request review by a person.', '2026-09-02T00:46:59.302Z', 'system', '2026-09-02T00:46:59.302Z', 1, '{"policy_code":{"type":"string","minLength":1,"maxLength":100}}');
|
|
1997
|
+
INSERT INTO "message_template_versions" ("id", "installation_id", "template_key", "version", "audience", "purpose", "locale", "body_template", "published_at", "created_by", "created_at", "automation_allowed", "variables_schema_json") VALUES ('ai-out-of-scope-v1', 'default', 'ai-out-of-scope', 1, 'reporter', 'outcome', 'en', 'This report is outside the scope of {{policy_code}}. You may request review by a person.', '2026-09-02T00:46:59.302Z', 'system', '2026-09-02T00:46:59.302Z', 1, '{"policy_code":{"type":"string","minLength":1,"maxLength":100}}');
|
|
1998
|
+
|
|
1999
|
+
INSERT INTO "ai_queue_config_versions" ("id", "queue_id", "version", "mode", "enabled", "provider", "model", "input_cost_microusd_per_million", "output_cost_microusd_per_million", "prompt_version", "policy_version_id", "eligible_form_versions_json", "eligible_sources_json", "eligible_reason_codes_json", "eligible_target_types_json", "allowed_fields_json", "allowed_outcomes_json", "allowed_action_codes_json", "allowed_template_ids_json", "confidence_threshold", "max_follow_up_turns", "max_wait_hours", "daily_report_budget", "daily_cost_budget_microusd", "quality_sample_rate", "fallback_queue_id", "pause_state", "published_at", "retired_at", "created_by", "created_at", "idempotency_key", "minimum_shadow_runs", "minimum_quality_reviews", "maximum_failure_rate", "maximum_disagreement_rate", "pause_reason", "paused_at", "queue_version_id") VALUES ('low-priority-ai-v1', 'low-priority-ai', 1, 'shadow', 0, 'workers_ai', '@cf/meta/llama-3.1-8b-instruct-fast', 0, 0, 'safest-low-priority-v1', 'general-policy-v1', '["general-v1"]', '["widget","public_page","server_api"]', '["spam"]', '["message","profile","listing","account"]', '["answers.details","target.type","evidence.references"]', '["out_of_scope","insufficient_information","no_violation_found","escalate_to_human"]', '[]', '["ai-more-context-v1","ai-no-violation-v1","ai-out-of-scope-v1"]', 0.85, 1, 72, 100, 1000000, 0.1, 'standard-human', 'ready', '2026-09-02T00:46:59.302Z', NULL, 'system', '2026-09-02T00:46:59.302Z', 'seed:low-priority-ai-v1', 25, 5, 0.05, 0.1, NULL, NULL, 'low-priority-ai-v1');
|
|
2000
|
+
|
|
2001
|
+
INSERT INTO "routing_agent_versions" ("id", "installation_id", "version", "enabled", "rollout_mode", "provider", "model", "instructions", "candidate_queue_ids_json", "safeguard_queue_id", "default_queue_id", "confidence_threshold", "allowed_fields_json", "published_at", "created_by", "created_at", "idempotency_key") VALUES ('report-router-v1', 'default', 1, 0, 'off', 'workers_ai', '@cf/meta/llama-3.1-8b-instruct-fast', 'Choose only among the supplied eligible queue identifiers. Route uncertainty or protected cases to a human. Do not decide the report.', '["urgent-human","standard-human","low-priority-ai"]', 'urgent-human', 'standard-human', 0.85, '["reason_code","source","target_type","answers.details","trusted_facts"]', '2026-09-02T00:47:00.813Z', 'system', '2026-09-02T00:47:00.813Z', 'seed:report-router-v1');
|
|
2002
|
+
|
|
2003
|
+
INSERT INTO "installation_features" ("installation_id", "feature_key", "state", "capability_json", "checked_at", "error_code", "revision") VALUES ('default', 'database', 'ready', '{}', '2026-09-02T00:47:05.486Z', NULL, 1);
|
|
2004
|
+
INSERT INTO "installation_features" ("installation_id", "feature_key", "state", "capability_json", "checked_at", "error_code", "revision") VALUES ('default', 'workflow_runtime', 'setup_required', '{}', '2026-09-02T00:47:05.486Z', NULL, 1);
|
|
2005
|
+
INSERT INTO "installation_features" ("installation_id", "feature_key", "state", "capability_json", "checked_at", "error_code", "revision") VALUES ('default', 'workers_ai', 'setup_required', '{}', '2026-09-02T00:47:05.486Z', NULL, 1);
|
|
2006
|
+
INSERT INTO "installation_features" ("installation_id", "feature_key", "state", "capability_json", "checked_at", "error_code", "revision") VALUES ('default', 'object_storage', 'setup_required', '{}', '2026-09-02T00:47:05.486Z', NULL, 1);
|
|
2007
|
+
INSERT INTO "installation_features" ("installation_id", "feature_key", "state", "capability_json", "checked_at", "error_code", "revision") VALUES ('default', 'queues', 'setup_required', '{}', '2026-09-02T00:47:05.486Z', NULL, 1);
|
|
2008
|
+
INSERT INTO "installation_features" ("installation_id", "feature_key", "state", "capability_json", "checked_at", "error_code", "revision") VALUES ('default', 'email', 'disabled', '{}', '2026-09-02T00:47:05.486Z', NULL, 1);
|
|
2009
|
+
|
|
2010
|
+
INSERT INTO "component_definitions" ("id", "installation_id", "component_key", "name", "description", "component_kind", "effect_class", "owner_kind", "status", "active_version_id", "created_by", "created_at", "updated_at") VALUES ('safest-builtin-phishing-url', 'default', 'safest-builtin-phishing-url', 'Phishing URL specialist', 'Deterministic, read-only URL normalization and phishing-risk signals. It never fetches the submitted URL and records unavailable reputation/content checks as uncertainty.', 'specialist_agent', 'read_only', 'safest', 'active', 'safest-builtin-phishing-url-v1', 'system', '2026-09-02T00:47:06.045Z', '2026-09-02T00:47:06.046Z');
|
|
2011
|
+
|
|
2012
|
+
INSERT INTO "component_versions" ("id", "definition_id", "version", "implementation_kind", "implementation_reference", "input_schema_json", "output_schema_json", "allowed_input_fields_json", "data_classifications_json", "connection_version_id", "risk_class", "timeout_policy_json", "retry_policy_json", "cache_policy_json", "concurrency_policy_json", "budget_policy_json", "approval_policy_json", "tool_manifest_json", "compatibility_json", "package_digest", "signature_metadata_json", "published_at", "retired_at", "created_by", "created_at") VALUES ('safest-builtin-phishing-url-v1', 'safest-builtin-phishing-url', 1, 'specialist_agent', 'phishing-url-v1', '{"type":"object","additionalProperties":false,"required":["url"],"properties":{"url":{"type":"string","minLength":1,"maxLength":2048}}}', '{"type":"object","additionalProperties":false,"required":["normalized_url","normalized_url_hash","hostname_hash","scheme","signals","conclusion","summary","uncertainty","confidence"],"properties":{"normalized_url":{"type":"string"},"normalized_url_hash":{"type":"string"},"hostname_hash":{"type":"string"},"scheme":{"type":"string","enum":["http","https"]},"signals":{"type":"array","items":{"type":"string"}},"conclusion":{"type":"string","enum":["likely_phishing","suspicious","no_phishing_signal","unavailable","escalate"]},"summary":{"type":"string"},"uncertainty":{"type":"array","items":{"type":"string"}},"confidence":{"type":"number","minimum":0,"maximum":1}}}', '["target.customer_url","answers.url"]', '["report_operational","potentially_sensitive_url"]', NULL, 'low', '{"timeout_ms":1500}', '{"maximum_attempts":1}', '{"enabled":true,"ttl_seconds":3600,"key_fields":["url"]}', '{"maximum_concurrency":20}', '{"metric":"calls","maximum_per_day":10000}', '{}', '["url_parser","hostname_heuristics"]', '{"fixture_evidence":{"passed":true,"validated_by":"safest_release","fixtures":["suspicious-login-url"]},"network_access":false,"runtime_protocol":"1"}', 'sha256:a2072d7111273ad5038ae0f2e11c3e3e227972a56b8ed71162a5f402d889829d', '{"publisher":"safest","source":"built_in","digest_basis":"src/component-executor.ts"}', '2026-09-02T00:47:06.046Z', NULL, 'system', '2026-09-02T00:47:06.046Z');
|
|
2013
|
+
|
|
2014
|
+
INSERT INTO "component_fixtures" ("id", "component_version_id", "name", "input_json", "expected_json", "expected_status", "created_by", "created_at") VALUES ('safest-builtin-phishing-url-v1-fixture-suspicious', 'safest-builtin-phishing-url-v1', 'suspicious-login-url', '{"url":"http://login.verify.example.com/account"}', '{"normalized_url":"http://login.verify.example.com/account","normalized_url_hash":"sha256:f19ea3e9f98e298edbff77f8bd16194a45dc0b8677fc43ef1430904cd91a8355","hostname_hash":"sha256:852ead493ae4fd09da4de58d1f1ba7f9f96a464fc73662f110fb8a1044ebd249","scheme":"http","signals":["credential_lure_term","plaintext_transport"],"conclusion":"suspicious","summary":"Observed 2 deterministic phishing-risk signal(s).","uncertainty":["dns_reputation_and_content_not_checked"],"confidence":0.69}', 'succeeded', 'system', '2026-09-02T00:47:06.046Z');
|
|
2015
|
+
|
|
2016
|
+
INSERT INTO "component_test_runs" ("id", "component_version_id", "fixture_id", "status", "output_json", "error_code", "started_by", "started_at", "finished_at") VALUES ('safest-builtin-phishing-url-v1-test-suspicious', 'safest-builtin-phishing-url-v1', 'safest-builtin-phishing-url-v1-fixture-suspicious', 'passed', '{"mode":"simulated","validated_by":"safest_release","network_access":false}', NULL, 'system', '2026-09-02T00:47:06.046Z', '2026-09-02T00:47:06.046Z');
|
|
2017
|
+
|
|
2018
|
+
INSERT INTO "workflow_definitions" ("id", "installation_id", "workflow_key", "name", "description", "purpose", "status", "active_version_id", "created_by", "created_at", "updated_at") VALUES ('standard-manual-review', 'default', 'standard-manual-review', 'Standard manual review', 'Compatibility workflow representing the existing human review path.', 'report', 'active', 'standard-manual-review-v1', 'system:migration', '2026-09-02T00:47:02.128Z', '2026-09-02T00:47:02.128Z');
|
|
2019
|
+
|
|
2020
|
+
INSERT INTO "workflow_artifacts" ("id", "installation_id", "compiler_version", "compatibility_date", "graph_digest", "source_digest", "bundle_digest", "manifest_digest", "bundle_r2_key", "inline_source_text", "bundle_size_bytes", "capability_manifest_json", "compiler_warnings_json", "signature_metadata_json", "status", "created_at", "verified_at") VALUES ('standard-manual-review-artifact-v1', 'default', 'migration-seed-v1', '2026-08-28', 'sha256:standard-manual-review-graph-v1', 'sha256:standard-manual-review-source-v1', 'sha256:standard-manual-review-bundle-v1', 'sha256:standard-manual-review-manifest-v1', NULL, 'export const migrationSeed = true;', 34, '{"version":1,"capabilities":["task.create","decision.record","message.send","action.propose"]}', '["Seed artifact is replaced by a compiler-produced artifact before primary activation."]', NULL, 'quarantined', '2026-09-02T00:47:02.128Z', NULL);
|
|
2021
|
+
|
|
2022
|
+
INSERT INTO "workflow_versions" ("id", "workflow_id", "version", "graph_json", "graph_digest", "input_schema_json", "output_schema_json", "authority_mode", "dependency_manifest_json", "capability_manifest_json", "artifact_id", "compiler_version", "test_evidence_json", "published_by", "published_at", "retired_at") VALUES ('standard-manual-review-v1', 'standard-manual-review', 1, '{"schema_version":"1","purpose":"report","entry_node_id":"start","nodes":[{"id":"start","kind":"start","name":"Start","input_mapping":{},"config":{}},{"id":"review","kind":"human_task","name":"Manual review","input_mapping":{},"config":{"task_type":"review","queue_id":"run-queue","response_schema":{"type":"object"}}},{"id":"decision","kind":"decision","name":"Record decision","input_mapping":{},"error_port":"error","config":{"policy_version_id":"general-policy-v1"}},{"id":"end","kind":"end","name":"Resolved","input_mapping":{},"config":{"terminal_code":"resolved"}}],"edges":[{"id":"e1","from":{"node_id":"start","port":"success"},"to":{"node_id":"review","port":"input"}},{"id":"e2","from":{"node_id":"review","port":"completed"},"to":{"node_id":"decision","port":"input"}},{"id":"e3","from":{"node_id":"review","port":"timeout"},"to":{"node_id":"decision","port":"input"}},{"id":"e4","from":{"node_id":"decision","port":"recorded"},"to":{"node_id":"end","port":"input"}},{"id":"e5","from":{"node_id":"decision","port":"error"},"to":{"node_id":"end","port":"input"}}],"input_schema":{"type":"object"},"terminal_codes":["resolved"],"default_policies":{}}', 'sha256:standard-manual-review-graph-v1', '{"type":"object"}', '{"type":"object"}', 'assist', '{"components":[],"connections":[],"policies":[],"templates":[],"models":[],"agents":[],"workflows":[],"compiler":"migration-seed-v1"}', '{"version":1,"capabilities":["task.create","decision.record","message.send","action.propose"]}', 'standard-manual-review-artifact-v1', 'migration-seed-v1', '{"passed":false,"reason":"compatibility_seed_requires_compiler_republish"}', 'system:migration', '2026-09-02T00:47:02.128Z', NULL);
|
|
2023
|
+
|
|
2024
|
+
CREATE INDEX action_proposals_delivery_due_idx
|
|
2025
|
+
ON action_proposals(state, delivery_terminal, next_attempt_at, id);
|
|
2026
|
+
|
|
2027
|
+
CREATE INDEX action_proposals_report_idx
|
|
2028
|
+
ON action_proposals(report_id, created_at DESC, id DESC);
|
|
2029
|
+
|
|
2030
|
+
CREATE INDEX action_proposals_state_idx
|
|
2031
|
+
ON action_proposals(state, updated_at, id);
|
|
2032
|
+
|
|
2033
|
+
CREATE INDEX agent_definitions_admin_idx
|
|
2034
|
+
ON agent_definitions(installation_id, status, agent_kind, name, id);
|
|
2035
|
+
|
|
2036
|
+
CREATE INDEX ai_quality_samples_work_idx
|
|
2037
|
+
ON ai_quality_samples(state, claim_expires_at, selected_at, id);
|
|
2038
|
+
|
|
2039
|
+
CREATE INDEX ai_queue_config_active_idx
|
|
2040
|
+
ON ai_queue_config_versions(queue_id, enabled, pause_state, published_at, retired_at, version DESC);
|
|
2041
|
+
|
|
2042
|
+
CREATE UNIQUE INDEX ai_queue_config_queue_version_idx
|
|
2043
|
+
ON ai_queue_config_versions(queue_version_id)
|
|
2044
|
+
WHERE queue_version_id IS NOT NULL;
|
|
2045
|
+
|
|
2046
|
+
CREATE INDEX ai_runs_config_status_idx ON ai_runs(config_version_id, status, started_at DESC, id DESC);
|
|
2047
|
+
|
|
2048
|
+
CREATE INDEX ai_runs_report_idx ON ai_runs(report_id, started_at DESC, id DESC);
|
|
2049
|
+
|
|
2050
|
+
CREATE INDEX analyst_sessions_presence_idx
|
|
2051
|
+
ON analyst_sessions(last_seen_at DESC, actor_id, id);
|
|
2052
|
+
|
|
2053
|
+
CREATE INDEX analyst_sessions_report_idx
|
|
2054
|
+
ON analyst_sessions(active_report_id, last_seen_at DESC, id);
|
|
2055
|
+
|
|
2056
|
+
CREATE UNIQUE INDEX appeal_decisions_idempotency_idx
|
|
2057
|
+
ON appeal_decisions(appeal_id, idempotency_key) WHERE idempotency_key IS NOT NULL;
|
|
2058
|
+
|
|
2059
|
+
CREATE UNIQUE INDEX appeals_idempotency_idx ON appeals(report_id, idempotency_key) WHERE idempotency_key IS NOT NULL;
|
|
2060
|
+
|
|
2061
|
+
CREATE INDEX appeals_queue_state_idx ON appeals(queue_id, state, submitted_at ASC, id ASC);
|
|
2062
|
+
|
|
2063
|
+
CREATE INDEX assistant_drafts_principal_idx
|
|
2064
|
+
ON assistant_drafts(principal_id, status, created_at DESC, id DESC);
|
|
2065
|
+
|
|
2066
|
+
CREATE UNIQUE INDEX assistant_messages_idempotency_idx
|
|
2067
|
+
ON assistant_messages(session_id, idempotency_key) WHERE idempotency_key IS NOT NULL;
|
|
2068
|
+
|
|
2069
|
+
CREATE INDEX assistant_messages_session_idx
|
|
2070
|
+
ON assistant_messages(session_id, created_at, id);
|
|
2071
|
+
|
|
2072
|
+
CREATE UNIQUE INDEX assistant_sessions_idempotency_idx
|
|
2073
|
+
ON assistant_sessions(principal_id, idempotency_key) WHERE idempotency_key IS NOT NULL;
|
|
2074
|
+
|
|
2075
|
+
CREATE INDEX assistant_sessions_principal_idx
|
|
2076
|
+
ON assistant_sessions(installation_id, principal_id, status, updated_at DESC, id DESC);
|
|
2077
|
+
|
|
2078
|
+
CREATE INDEX assistant_tool_calls_session_idx
|
|
2079
|
+
ON assistant_tool_calls(session_id, started_at DESC, id DESC);
|
|
2080
|
+
|
|
2081
|
+
CREATE INDEX audit_entries_target_idx
|
|
2082
|
+
ON audit_entries(target_type, target_id, sequence DESC);
|
|
2083
|
+
|
|
2084
|
+
CREATE INDEX audit_events_pending_idx ON audit_events(chained_at, created_at, id);
|
|
2085
|
+
|
|
2086
|
+
CREATE INDEX background_jobs_reconcile_idx ON background_jobs(state, available_at, id);
|
|
2087
|
+
|
|
2088
|
+
CREATE INDEX backup_manifests_created_idx
|
|
2089
|
+
ON backup_manifests(installation_id, created_at DESC, id DESC);
|
|
2090
|
+
|
|
2091
|
+
CREATE INDEX budget_policies_scope_idx
|
|
2092
|
+
ON budget_policies(installation_id, scope_type, scope_id, metric, retired_at, published_at DESC, id);
|
|
2093
|
+
|
|
2094
|
+
CREATE INDEX budget_reservations_expiry_idx
|
|
2095
|
+
ON budget_reservations(status, expires_at, id);
|
|
2096
|
+
|
|
2097
|
+
CREATE INDEX case_messages_conversation_idx
|
|
2098
|
+
ON case_messages(conversation_id, created_at, id);
|
|
2099
|
+
|
|
2100
|
+
CREATE UNIQUE INDEX case_messages_idempotency_idx ON case_messages(report_id, idempotency_key) WHERE idempotency_key IS NOT NULL;
|
|
2101
|
+
|
|
2102
|
+
CREATE INDEX case_messages_report_audience_idx
|
|
2103
|
+
ON case_messages(report_id, audience, created_at ASC, id ASC);
|
|
2104
|
+
|
|
2105
|
+
CREATE INDEX component_cache_entries_expiry_idx
|
|
2106
|
+
ON component_cache_entries(expires_at, id);
|
|
2107
|
+
|
|
2108
|
+
CREATE INDEX component_definitions_admin_idx
|
|
2109
|
+
ON component_definitions(installation_id, status, component_kind, effect_class, name, id);
|
|
2110
|
+
|
|
2111
|
+
CREATE INDEX component_runs_due_idx
|
|
2112
|
+
ON component_runs(state, updated_at, id);
|
|
2113
|
+
|
|
2114
|
+
CREATE INDEX component_runs_report_idx
|
|
2115
|
+
ON component_runs(report_id, created_at DESC, id DESC);
|
|
2116
|
+
|
|
2117
|
+
CREATE INDEX component_test_runs_version_idx
|
|
2118
|
+
ON component_test_runs(component_version_id, started_at DESC, id DESC);
|
|
2119
|
+
|
|
2120
|
+
CREATE INDEX component_versions_connection_idx
|
|
2121
|
+
ON component_versions(connection_version_id, definition_id, id);
|
|
2122
|
+
|
|
2123
|
+
CREATE INDEX component_versions_lookup_idx
|
|
2124
|
+
ON component_versions(definition_id, version DESC, id);
|
|
2125
|
+
|
|
2126
|
+
CREATE INDEX configuration_drafts_type_idx
|
|
2127
|
+
ON configuration_drafts(installation_id, configuration_type, configuration_key);
|
|
2128
|
+
|
|
2129
|
+
CREATE INDEX connection_attempts_component_idx
|
|
2130
|
+
ON connection_attempts(component_run_id, attempt_number, id);
|
|
2131
|
+
|
|
2132
|
+
CREATE INDEX connection_attempts_connection_idx
|
|
2133
|
+
ON connection_attempts(connection_version_id, started_at DESC, id DESC);
|
|
2134
|
+
|
|
2135
|
+
CREATE INDEX connection_credentials_refresh_idx
|
|
2136
|
+
ON connection_credentials(status, expires_at, id);
|
|
2137
|
+
|
|
2138
|
+
CREATE INDEX connection_definitions_admin_idx
|
|
2139
|
+
ON connection_definitions(installation_id, status, kind, name, id);
|
|
2140
|
+
|
|
2141
|
+
CREATE INDEX connection_execution_leases_expiry_idx
|
|
2142
|
+
ON connection_execution_leases(connection_version_id, expires_at, id);
|
|
2143
|
+
|
|
2144
|
+
CREATE INDEX connection_health_probe_idx
|
|
2145
|
+
ON connection_health(state, next_probe_at, connection_version_id);
|
|
2146
|
+
|
|
2147
|
+
CREATE INDEX connection_oauth_states_expiry_idx
|
|
2148
|
+
ON connection_oauth_states(expires_at, consumed_at, id);
|
|
2149
|
+
|
|
2150
|
+
CREATE INDEX connection_versions_lookup_idx
|
|
2151
|
+
ON connection_versions(connection_id, version DESC, id);
|
|
2152
|
+
|
|
2153
|
+
CREATE INDEX conversations_report_idx
|
|
2154
|
+
ON conversations(report_id, audience, id);
|
|
2155
|
+
|
|
2156
|
+
CREATE INDEX dead_letter_items_incident_idx
|
|
2157
|
+
ON dead_letter_items(incident_id, state, last_seen_at DESC, id DESC);
|
|
2158
|
+
|
|
2159
|
+
CREATE INDEX dead_letter_items_report_idx
|
|
2160
|
+
ON dead_letter_items(report_id, last_seen_at DESC, id DESC);
|
|
2161
|
+
|
|
2162
|
+
CREATE INDEX dead_letter_items_state_idx
|
|
2163
|
+
ON dead_letter_items(state, last_seen_at DESC, id DESC);
|
|
2164
|
+
|
|
2165
|
+
CREATE INDEX decision_action_outbox_due_idx
|
|
2166
|
+
ON decision_action_outbox(status, next_attempt_at, id);
|
|
2167
|
+
|
|
2168
|
+
CREATE INDEX decision_action_outbox_reconcile_idx
|
|
2169
|
+
ON decision_action_outbox(terminal, status, next_attempt_at, lease_expires_at, id);
|
|
2170
|
+
|
|
2171
|
+
CREATE UNIQUE INDEX decisions_idempotency_idx ON decisions(report_id, idempotency_key) WHERE idempotency_key IS NOT NULL;
|
|
2172
|
+
|
|
2173
|
+
CREATE INDEX decisions_report_idx ON decisions(report_id, created_at DESC, id DESC);
|
|
2174
|
+
|
|
2175
|
+
CREATE INDEX deletion_requests_report_state_idx
|
|
2176
|
+
ON deletion_requests(report_id, state, requested_at, id);
|
|
2177
|
+
|
|
2178
|
+
CREATE INDEX deletion_requests_state_idx ON deletion_requests(state, requested_at, id);
|
|
2179
|
+
|
|
2180
|
+
CREATE INDEX duplicate_group_members_report_idx
|
|
2181
|
+
ON duplicate_group_members(report_id, group_id);
|
|
2182
|
+
|
|
2183
|
+
CREATE INDEX duplicate_groups_activity_idx
|
|
2184
|
+
ON duplicate_groups(installation_id, state, last_seen_at DESC, id DESC);
|
|
2185
|
+
|
|
2186
|
+
CREATE INDEX email_deliveries_due_idx
|
|
2187
|
+
ON email_deliveries(state, next_attempt_at, id);
|
|
2188
|
+
|
|
2189
|
+
CREATE INDEX email_deliveries_message_idx
|
|
2190
|
+
ON email_deliveries(message_id, created_at, id);
|
|
2191
|
+
|
|
2192
|
+
CREATE INDEX evidence_access_events_actor_idx
|
|
2193
|
+
ON evidence_access_events(actor_id, accessed_at DESC, id DESC);
|
|
2194
|
+
|
|
2195
|
+
CREATE INDEX evidence_access_events_report_idx
|
|
2196
|
+
ON evidence_access_events(report_id, accessed_at DESC, id DESC);
|
|
2197
|
+
|
|
2198
|
+
CREATE INDEX evidence_fetch_requests_due_idx
|
|
2199
|
+
ON evidence_fetch_requests(state, next_attempt_at, id);
|
|
2200
|
+
|
|
2201
|
+
CREATE INDEX evidence_fetch_requests_report_idx
|
|
2202
|
+
ON evidence_fetch_requests(report_id, created_at DESC, id DESC);
|
|
2203
|
+
|
|
2204
|
+
CREATE INDEX evidence_snapshots_report_idx
|
|
2205
|
+
ON evidence_snapshots(report_id, created_at DESC, id DESC);
|
|
2206
|
+
|
|
2207
|
+
CREATE UNIQUE INDEX export_jobs_idempotency_idx
|
|
2208
|
+
ON export_jobs(installation_id, requested_by, idempotency_key)
|
|
2209
|
+
WHERE idempotency_key IS NOT NULL;
|
|
2210
|
+
|
|
2211
|
+
CREATE INDEX export_jobs_state_idx
|
|
2212
|
+
ON export_jobs(installation_id, state, requested_at DESC, id DESC);
|
|
2213
|
+
|
|
2214
|
+
CREATE INDEX findings_report_idx
|
|
2215
|
+
ON findings(report_id, created_at DESC, id DESC);
|
|
2216
|
+
|
|
2217
|
+
CREATE INDEX findings_run_idx
|
|
2218
|
+
ON findings(run_id, step_run_id, created_at, id);
|
|
2219
|
+
|
|
2220
|
+
CREATE INDEX findings_shadow_comparison_idx
|
|
2221
|
+
ON findings(run_id, status, created_at DESC, id DESC);
|
|
2222
|
+
|
|
2223
|
+
CREATE UNIQUE INDEX human_task_claims_one_active_idx
|
|
2224
|
+
ON human_task_claims(task_id) WHERE released_at IS NULL;
|
|
2225
|
+
|
|
2226
|
+
CREATE INDEX human_task_claims_operator_idx
|
|
2227
|
+
ON human_task_claims(operator_id, released_at, expires_at, task_id);
|
|
2228
|
+
|
|
2229
|
+
CREATE INDEX human_tasks_report_idx
|
|
2230
|
+
ON human_tasks(report_id, created_at DESC, id DESC);
|
|
2231
|
+
|
|
2232
|
+
CREATE INDEX human_tasks_work_idx
|
|
2233
|
+
ON human_tasks(state, queue_id, due_at, created_at, id);
|
|
2234
|
+
|
|
2235
|
+
CREATE INDEX infrastructure_owner_sessions_expiry_idx
|
|
2236
|
+
ON infrastructure_owner_sessions(revoked_at, expires_at, id);
|
|
2237
|
+
|
|
2238
|
+
CREATE INDEX infrastructure_owner_sessions_user_idx
|
|
2239
|
+
ON infrastructure_owner_sessions(user_id, revoked_at, expires_at DESC, id);
|
|
2240
|
+
|
|
2241
|
+
CREATE INDEX installation_features_state_idx
|
|
2242
|
+
ON installation_features(installation_id, state, feature_key);
|
|
2243
|
+
|
|
2244
|
+
CREATE INDEX intake_decisions_campaign_idx
|
|
2245
|
+
ON intake_decisions(installation_id, campaign_fingerprint, created_at DESC, id);
|
|
2246
|
+
|
|
2247
|
+
CREATE INDEX intake_decisions_installation_idx
|
|
2248
|
+
ON intake_decisions(installation_id, created_at DESC, id DESC);
|
|
2249
|
+
|
|
2250
|
+
CREATE INDEX intake_rate_limits_expiry_idx ON intake_rate_limits(window_start, updated_at);
|
|
2251
|
+
|
|
2252
|
+
CREATE INDEX integration_api_keys_auth_idx
|
|
2253
|
+
ON integration_api_keys(integration_id, status, valid_from, expires_at, id);
|
|
2254
|
+
|
|
2255
|
+
CREATE UNIQUE INDEX legal_holds_one_active_idx ON legal_holds(report_id) WHERE state = 'active';
|
|
2256
|
+
|
|
2257
|
+
CREATE INDEX legal_holds_state_idx ON legal_holds(state, created_at, id);
|
|
2258
|
+
|
|
2259
|
+
CREATE INDEX model_aliases_admin_idx
|
|
2260
|
+
ON model_aliases(installation_id, status, name, id);
|
|
2261
|
+
|
|
2262
|
+
CREATE UNIQUE INDEX notices_idempotency_idx ON notices(report_id, audience, idempotency_key) WHERE idempotency_key IS NOT NULL;
|
|
2263
|
+
|
|
2264
|
+
CREATE INDEX notification_outbox_due_idx ON notification_outbox(status, next_attempt_at, id);
|
|
2265
|
+
|
|
2266
|
+
CREATE INDEX notification_outbox_reconcile_idx
|
|
2267
|
+
ON notification_outbox(terminal, status, next_attempt_at, lease_expires_at, id);
|
|
2268
|
+
|
|
2269
|
+
CREATE INDEX operations_incidents_state_idx
|
|
2270
|
+
ON operations_incidents(installation_id, state, severity, last_seen_at DESC, id DESC);
|
|
2271
|
+
|
|
2272
|
+
CREATE UNIQUE INDEX operator_invitations_pending_email_idx
|
|
2273
|
+
ON operator_invitations(email) WHERE status = 'pending';
|
|
2274
|
+
|
|
2275
|
+
CREATE INDEX operator_invitations_status_idx
|
|
2276
|
+
ON operator_invitations(status, expires_at, created_at DESC, id);
|
|
2277
|
+
|
|
2278
|
+
CREATE INDEX operator_users_status_idx
|
|
2279
|
+
ON operator_users(status, email, id);
|
|
2280
|
+
|
|
2281
|
+
CREATE INDEX owner_setup_rate_limits_expiry_idx
|
|
2282
|
+
ON owner_setup_rate_limits(window_start, updated_at);
|
|
2283
|
+
|
|
2284
|
+
CREATE INDEX owner_setup_tokens_expiry_idx
|
|
2285
|
+
ON owner_setup_tokens(status, expires_at, created_at DESC, id);
|
|
2286
|
+
|
|
2287
|
+
CREATE UNIQUE INDEX owner_setup_tokens_pending_email_purpose_idx
|
|
2288
|
+
ON owner_setup_tokens(email, purpose)
|
|
2289
|
+
WHERE status = 'pending';
|
|
2290
|
+
|
|
2291
|
+
CREATE INDEX prompt_versions_lookup_idx
|
|
2292
|
+
ON prompt_versions(installation_id, prompt_key, status, version DESC, id);
|
|
2293
|
+
|
|
2294
|
+
CREATE UNIQUE INDEX quality_reviews_idempotency_idx ON quality_reviews(idempotency_key);
|
|
2295
|
+
|
|
2296
|
+
CREATE INDEX queue_definitions_admin_idx
|
|
2297
|
+
ON queue_definitions(purpose, status, position, name, id);
|
|
2298
|
+
|
|
2299
|
+
CREATE INDEX queue_versions_policy_idx
|
|
2300
|
+
ON queue_versions(queue_id, published_at DESC, version DESC, id);
|
|
2301
|
+
|
|
2302
|
+
CREATE UNIQUE INDEX queue_workflow_pins_one_active_idx
|
|
2303
|
+
ON queue_workflow_pins(queue_id, mode) WHERE deactivated_at IS NULL;
|
|
2304
|
+
|
|
2305
|
+
CREATE INDEX queue_workflow_pins_version_idx
|
|
2306
|
+
ON queue_workflow_pins(workflow_version_id, deactivated_at, queue_id);
|
|
2307
|
+
|
|
2308
|
+
CREATE INDEX reconciliation_runs_kind_idx
|
|
2309
|
+
ON reconciliation_runs(installation_id, reconciliation_kind, started_at DESC, id DESC);
|
|
2310
|
+
|
|
2311
|
+
CREATE INDEX report_contexts_expiry_idx
|
|
2312
|
+
ON report_contexts(expires_at, used_at, id);
|
|
2313
|
+
|
|
2314
|
+
CREATE INDEX report_contexts_integration_idx
|
|
2315
|
+
ON report_contexts(integration_id, created_at DESC, id);
|
|
2316
|
+
|
|
2317
|
+
CREATE UNIQUE INDEX report_queue_assignments_one_active_idx
|
|
2318
|
+
ON report_queue_assignments(report_id) WHERE ended_at IS NULL;
|
|
2319
|
+
|
|
2320
|
+
CREATE INDEX report_queue_assignments_queue_idx
|
|
2321
|
+
ON report_queue_assignments(queue_id, ended_at, assigned_at, report_id);
|
|
2322
|
+
|
|
2323
|
+
CREATE INDEX report_state_history_report_idx
|
|
2324
|
+
ON report_state_history(report_id, created_at ASC, id ASC);
|
|
2325
|
+
|
|
2326
|
+
CREATE INDEX report_targets_reference_idx
|
|
2327
|
+
ON report_targets(target_type, target_reference, report_id);
|
|
2328
|
+
|
|
2329
|
+
CREATE INDEX reports_duplicate_group_idx
|
|
2330
|
+
ON reports(duplicate_group_id, received_at DESC, id DESC);
|
|
2331
|
+
|
|
2332
|
+
CREATE INDEX reports_queue_state_priority_idx
|
|
2333
|
+
ON reports(queue_id, state, priority DESC, received_at ASC, id ASC);
|
|
2334
|
+
|
|
2335
|
+
CREATE INDEX reports_routing_status_idx
|
|
2336
|
+
ON reports(routing_status, received_at ASC, id ASC);
|
|
2337
|
+
|
|
2338
|
+
CREATE INDEX reports_target_time_idx
|
|
2339
|
+
ON reports(installation_id, received_at DESC, id DESC);
|
|
2340
|
+
|
|
2341
|
+
CREATE INDEX retention_jobs_state_idx ON retention_jobs(state, started_at DESC, id DESC);
|
|
2342
|
+
|
|
2343
|
+
CREATE INDEX role_bindings_principal_idx
|
|
2344
|
+
ON role_bindings(installation_id, principal_type, principal_id, revoked_at, role);
|
|
2345
|
+
|
|
2346
|
+
CREATE INDEX routing_agent_runs_report_idx
|
|
2347
|
+
ON routing_agent_runs(report_id, started_at DESC, id DESC);
|
|
2348
|
+
|
|
2349
|
+
CREATE INDEX routing_agent_versions_active_idx
|
|
2350
|
+
ON routing_agent_versions(installation_id, published_at DESC, version DESC, id);
|
|
2351
|
+
|
|
2352
|
+
CREATE INDEX saved_views_principal_idx
|
|
2353
|
+
ON saved_views(installation_id, principal_id, updated_at DESC, id DESC);
|
|
2354
|
+
|
|
2355
|
+
CREATE INDEX security_events_type_idx
|
|
2356
|
+
ON security_events(installation_id, event_type, created_at DESC, id DESC);
|
|
2357
|
+
|
|
2358
|
+
CREATE UNIQUE INDEX shadow_comparisons_one_per_shadow_run_idx
|
|
2359
|
+
ON shadow_comparisons(shadow_run_id);
|
|
2360
|
+
|
|
2361
|
+
CREATE INDEX shadow_comparisons_status_idx
|
|
2362
|
+
ON shadow_comparisons(status, severity, created_at, id);
|
|
2363
|
+
|
|
2364
|
+
CREATE UNIQUE INDEX workflow_ai_runs_agent_once_idx
|
|
2365
|
+
ON workflow_ai_runs(step_run_id, agent_version_id)
|
|
2366
|
+
WHERE agent_version_id IS NOT NULL;
|
|
2367
|
+
|
|
2368
|
+
CREATE UNIQUE INDEX workflow_ai_runs_component_once_idx
|
|
2369
|
+
ON workflow_ai_runs(step_run_id, component_version_id)
|
|
2370
|
+
WHERE component_version_id IS NOT NULL;
|
|
2371
|
+
|
|
2372
|
+
CREATE INDEX workflow_ai_runs_report_idx
|
|
2373
|
+
ON workflow_ai_runs(report_id, started_at DESC, id DESC);
|
|
2374
|
+
|
|
2375
|
+
CREATE INDEX workflow_ai_runs_run_idx
|
|
2376
|
+
ON workflow_ai_runs(workflow_run_id, step_run_id, id);
|
|
2377
|
+
|
|
2378
|
+
CREATE INDEX workflow_artifacts_status_idx
|
|
2379
|
+
ON workflow_artifacts(installation_id, status, created_at DESC, id DESC);
|
|
2380
|
+
|
|
2381
|
+
CREATE INDEX workflow_definitions_admin_idx
|
|
2382
|
+
ON workflow_definitions(installation_id, status, purpose, name, id);
|
|
2383
|
+
|
|
2384
|
+
CREATE INDEX workflow_dependencies_version_idx
|
|
2385
|
+
ON workflow_dependencies(dependency_type, dependency_version_id, workflow_version_id);
|
|
2386
|
+
|
|
2387
|
+
CREATE INDEX workflow_dispatch_outbox_due_idx
|
|
2388
|
+
ON workflow_dispatch_outbox(state, available_at, id);
|
|
2389
|
+
|
|
2390
|
+
CREATE INDEX workflow_event_inbox_delivery_idx
|
|
2391
|
+
ON workflow_event_inbox(delivered_at, received_at, run_id, id);
|
|
2392
|
+
|
|
2393
|
+
CREATE UNIQUE INDEX workflow_run_links_parent_node_idx
|
|
2394
|
+
ON workflow_run_links(parent_run_id, node_id) WHERE node_id IS NOT NULL;
|
|
2395
|
+
|
|
2396
|
+
CREATE INDEX workflow_runs_instance_idx
|
|
2397
|
+
ON workflow_runs(cloudflare_instance_id, id);
|
|
2398
|
+
|
|
2399
|
+
CREATE UNIQUE INDEX workflow_runs_one_active_primary_idx
|
|
2400
|
+
ON workflow_runs(report_id)
|
|
2401
|
+
WHERE report_id IS NOT NULL AND run_kind = 'primary'
|
|
2402
|
+
AND state IN ('created', 'dispatch_pending', 'queued', 'running', 'waiting', 'paused', 'repair_required');
|
|
2403
|
+
|
|
2404
|
+
CREATE INDEX workflow_runs_report_idx
|
|
2405
|
+
ON workflow_runs(report_id, created_at DESC, id DESC);
|
|
2406
|
+
|
|
2407
|
+
CREATE UNIQUE INDEX workflow_runs_report_pin_once_idx
|
|
2408
|
+
ON workflow_runs(report_id, pin_id) WHERE report_id IS NOT NULL AND pin_id IS NOT NULL;
|
|
2409
|
+
|
|
2410
|
+
CREATE INDEX workflow_runs_state_idx
|
|
2411
|
+
ON workflow_runs(state, updated_at, id);
|
|
2412
|
+
|
|
2413
|
+
CREATE INDEX workflow_step_attempts_retry_idx
|
|
2414
|
+
ON workflow_step_attempts(status, retry_at, id);
|
|
2415
|
+
|
|
2416
|
+
CREATE INDEX workflow_step_runs_run_idx
|
|
2417
|
+
ON workflow_step_runs(run_id, updated_at, node_id, occurrence);
|
|
2418
|
+
|
|
2419
|
+
CREATE INDEX workflow_step_runs_waiting_idx
|
|
2420
|
+
ON workflow_step_runs(state, waiting_at, run_id, id);
|
|
2421
|
+
|
|
2422
|
+
CREATE INDEX workflow_test_runs_workflow_idx
|
|
2423
|
+
ON workflow_test_runs(workflow_id, started_at DESC, id DESC);
|
|
2424
|
+
|
|
2425
|
+
CREATE INDEX workflow_versions_lookup_idx
|
|
2426
|
+
ON workflow_versions(workflow_id, version DESC, id);
|
|
2427
|
+
|
|
2428
|
+
CREATE INDEX workflow_waits_due_idx
|
|
2429
|
+
ON workflow_waits(state, deadline_at, run_id, id);
|
|
2430
|
+
|
|
2431
|
+
CREATE TRIGGER report_participants_reject_portal_insert
|
|
2432
|
+
BEFORE INSERT ON report_participants
|
|
2433
|
+
WHEN NEW.contact_mode = 'portal'
|
|
2434
|
+
BEGIN
|
|
2435
|
+
SELECT RAISE(ABORT, 'portal contact mode has been removed');
|
|
2436
|
+
END;
|
|
2437
|
+
|
|
2438
|
+
CREATE TRIGGER report_participants_reject_portal_update
|
|
2439
|
+
BEFORE UPDATE OF contact_mode ON report_participants
|
|
2440
|
+
WHEN NEW.contact_mode = 'portal'
|
|
2441
|
+
BEGIN
|
|
2442
|
+
SELECT RAISE(ABORT, 'portal contact mode has been removed');
|
|
2443
|
+
END;
|
|
2444
|
+
|
|
2445
|
+
PRAGMA defer_foreign_keys = OFF;
|
|
2446
|
+
|