@sixb/sqlite 0.0.1
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/LICENSE +21 -0
- package/README.md +57 -0
- package/dist/action-run-storage.d.ts +29 -0
- package/dist/action-run-storage.d.ts.map +1 -0
- package/dist/agents/agent-storage.d.ts +25 -0
- package/dist/agents/agent-storage.d.ts.map +1 -0
- package/dist/agents/index.d.ts +6 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/messages.d.ts +14 -0
- package/dist/agents/messages.d.ts.map +1 -0
- package/dist/agents/rows.d.ts +77 -0
- package/dist/agents/rows.d.ts.map +1 -0
- package/dist/agents/runs.d.ts +26 -0
- package/dist/agents/runs.d.ts.map +1 -0
- package/dist/agents/threads.d.ts +14 -0
- package/dist/agents/threads.d.ts.map +1 -0
- package/dist/auth-storage/access-tokens.d.ts +33 -0
- package/dist/auth-storage/access-tokens.d.ts.map +1 -0
- package/dist/auth-storage/auth-storage.d.ts +46 -0
- package/dist/auth-storage/auth-storage.d.ts.map +1 -0
- package/dist/auth-storage/group-memberships.d.ts +21 -0
- package/dist/auth-storage/group-memberships.d.ts.map +1 -0
- package/dist/auth-storage/identities.d.ts +17 -0
- package/dist/auth-storage/identities.d.ts.map +1 -0
- package/dist/auth-storage/index.d.ts +3 -0
- package/dist/auth-storage/index.d.ts.map +1 -0
- package/dist/auth-storage/invitations.d.ts +28 -0
- package/dist/auth-storage/invitations.d.ts.map +1 -0
- package/dist/auth-storage/magic-links.d.ts +28 -0
- package/dist/auth-storage/magic-links.d.ts.map +1 -0
- package/dist/auth-storage/oidc-attempts.d.ts +18 -0
- package/dist/auth-storage/oidc-attempts.d.ts.map +1 -0
- package/dist/auth-storage/rows.d.ts +134 -0
- package/dist/auth-storage/rows.d.ts.map +1 -0
- package/dist/auth-storage/service-account-group-memberships.d.ts +17 -0
- package/dist/auth-storage/service-account-group-memberships.d.ts.map +1 -0
- package/dist/auth-storage/service-accounts.d.ts +14 -0
- package/dist/auth-storage/service-accounts.d.ts.map +1 -0
- package/dist/auth-storage/sessions.d.ts +55 -0
- package/dist/auth-storage/sessions.d.ts.map +1 -0
- package/dist/auth-storage/shared.d.ts +131 -0
- package/dist/auth-storage/shared.d.ts.map +1 -0
- package/dist/auth-storage/users.d.ts +19 -0
- package/dist/auth-storage/users.d.ts.map +1 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10204 -0
- package/dist/index.js.map +54 -0
- package/dist/latest-run-query.d.ts +22 -0
- package/dist/latest-run-query.d.ts.map +1 -0
- package/dist/migrations.d.ts +18 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/object-query-compiler.d.ts +44 -0
- package/dist/object-query-compiler.d.ts.map +1 -0
- package/dist/object-storage.d.ts +93 -0
- package/dist/object-storage.d.ts.map +1 -0
- package/dist/ontology-storage/commits.d.ts +14 -0
- package/dist/ontology-storage/commits.d.ts.map +1 -0
- package/dist/ontology-storage/index.d.ts +22 -0
- package/dist/ontology-storage/index.d.ts.map +1 -0
- package/dist/ontology-storage/materialization-session.d.ts +49 -0
- package/dist/ontology-storage/materialization-session.d.ts.map +1 -0
- package/dist/ontology-storage/materialization-state.d.ts +63 -0
- package/dist/ontology-storage/materialization-state.d.ts.map +1 -0
- package/dist/ontology-storage/materialization-writer.d.ts +15 -0
- package/dist/ontology-storage/materialization-writer.d.ts.map +1 -0
- package/dist/ontology-storage/materializations.d.ts +32 -0
- package/dist/ontology-storage/materializations.d.ts.map +1 -0
- package/dist/ontology-storage/outbox.d.ts +14 -0
- package/dist/ontology-storage/outbox.d.ts.map +1 -0
- package/dist/ontology-storage/shared.d.ts +91 -0
- package/dist/ontology-storage/shared.d.ts.map +1 -0
- package/dist/ontology-storage/sources.d.ts +26 -0
- package/dist/ontology-storage/sources.d.ts.map +1 -0
- package/dist/pipeline-run-storage.d.ts +26 -0
- package/dist/pipeline-run-storage.d.ts.map +1 -0
- package/dist/projection-run-storage.d.ts +32 -0
- package/dist/projection-run-storage.d.ts.map +1 -0
- package/dist/rules-storage.d.ts +33 -0
- package/dist/rules-storage.d.ts.map +1 -0
- package/dist/run-list-query.d.ts +27 -0
- package/dist/run-list-query.d.ts.map +1 -0
- package/dist/storage-errors.d.ts +2 -0
- package/dist/storage-errors.d.ts.map +1 -0
- package/dist/sync-run-storage.d.ts +23 -0
- package/dist/sync-run-storage.d.ts.map +1 -0
- package/dist/timeseries-storage.d.ts +41 -0
- package/dist/timeseries-storage.d.ts.map +1 -0
- package/dist/transactions.d.ts +15 -0
- package/dist/transactions.d.ts.map +1 -0
- package/dist/tsconfig.json +5 -0
- package/dist/validation.d.ts +5 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/webhook-delivery-storage.d.ts +27 -0
- package/dist/webhook-delivery-storage.d.ts.map +1 -0
- package/dist/webhook-run-storage.d.ts +22 -0
- package/dist/webhook-run-storage.d.ts.map +1 -0
- package/dist/workflow-intervention-storage.d.ts +26 -0
- package/dist/workflow-intervention-storage.d.ts.map +1 -0
- package/dist/workflow-run-storage.d.ts +63 -0
- package/dist/workflow-run-storage.d.ts.map +1 -0
- package/package.json +58 -0
- package/src/action-run-storage.ts +761 -0
- package/src/agents/agent-storage.ts +46 -0
- package/src/agents/index.ts +5 -0
- package/src/agents/messages.ts +162 -0
- package/src/agents/rows.ts +205 -0
- package/src/agents/runs.ts +389 -0
- package/src/agents/threads.ts +133 -0
- package/src/auth-storage/access-tokens.ts +289 -0
- package/src/auth-storage/auth-storage.ts +784 -0
- package/src/auth-storage/group-memberships.ts +52 -0
- package/src/auth-storage/identities.ts +98 -0
- package/src/auth-storage/index.ts +2 -0
- package/src/auth-storage/invitations.ts +258 -0
- package/src/auth-storage/magic-links.ts +149 -0
- package/src/auth-storage/oidc-attempts.ts +109 -0
- package/src/auth-storage/rows.ts +338 -0
- package/src/auth-storage/service-account-group-memberships.ts +161 -0
- package/src/auth-storage/service-accounts.ts +168 -0
- package/src/auth-storage/sessions.ts +230 -0
- package/src/auth-storage/shared.ts +707 -0
- package/src/auth-storage/users.ts +226 -0
- package/src/index.ts +292 -0
- package/src/latest-run-query.ts +49 -0
- package/src/migrations/001-initial-schema.sql +1068 -0
- package/src/migrations.ts +245 -0
- package/src/object-query-compiler.ts +1198 -0
- package/src/object-storage.ts +605 -0
- package/src/ontology-storage/commits.ts +127 -0
- package/src/ontology-storage/index.ts +35 -0
- package/src/ontology-storage/materialization-session.ts +393 -0
- package/src/ontology-storage/materialization-state.ts +901 -0
- package/src/ontology-storage/materialization-writer.ts +394 -0
- package/src/ontology-storage/materializations.ts +838 -0
- package/src/ontology-storage/outbox.ts +237 -0
- package/src/ontology-storage/shared.ts +269 -0
- package/src/ontology-storage/sources.ts +653 -0
- package/src/pipeline-run-storage.ts +506 -0
- package/src/projection-run-storage.ts +592 -0
- package/src/rules-storage.ts +375 -0
- package/src/run-list-query.ts +98 -0
- package/src/sql.d.ts +4 -0
- package/src/storage-errors.ts +3 -0
- package/src/sync-run-storage.ts +299 -0
- package/src/timeseries-storage.ts +212 -0
- package/src/transactions.ts +96 -0
- package/src/validation.ts +30 -0
- package/src/webhook-delivery-storage.ts +272 -0
- package/src/webhook-run-storage.ts +240 -0
- package/src/workflow-intervention-storage.ts +398 -0
- package/src/workflow-run-storage.ts +1148 -0
|
@@ -0,0 +1,1068 @@
|
|
|
1
|
+
CREATE TABLE objects (
|
|
2
|
+
project_id TEXT NOT NULL,
|
|
3
|
+
object_type_id TEXT NOT NULL,
|
|
4
|
+
primary_id TEXT NOT NULL,
|
|
5
|
+
properties TEXT NOT NULL,
|
|
6
|
+
created_at TEXT NOT NULL,
|
|
7
|
+
updated_at TEXT NOT NULL,
|
|
8
|
+
version INTEGER NOT NULL,
|
|
9
|
+
last_commit_id TEXT NOT NULL,
|
|
10
|
+
PRIMARY KEY (project_id, object_type_id, primary_id)
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
CREATE INDEX idx_objects_project_type
|
|
14
|
+
ON objects(project_id, object_type_id);
|
|
15
|
+
CREATE INDEX idx_objects_updated_at
|
|
16
|
+
ON objects(project_id, object_type_id, updated_at);
|
|
17
|
+
CREATE INDEX idx_objects_created_at
|
|
18
|
+
ON objects(project_id, object_type_id, created_at);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE links (
|
|
21
|
+
project_id TEXT NOT NULL,
|
|
22
|
+
source_type_id TEXT NOT NULL,
|
|
23
|
+
source_id TEXT NOT NULL,
|
|
24
|
+
link_id TEXT NOT NULL,
|
|
25
|
+
target_type_id TEXT NOT NULL,
|
|
26
|
+
target_id TEXT NOT NULL,
|
|
27
|
+
properties TEXT,
|
|
28
|
+
created_at TEXT NOT NULL,
|
|
29
|
+
updated_at TEXT NOT NULL,
|
|
30
|
+
last_commit_id TEXT NOT NULL,
|
|
31
|
+
PRIMARY KEY (project_id, source_type_id, source_id, link_id, target_type_id, target_id)
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
CREATE INDEX idx_links_source
|
|
35
|
+
ON links(project_id, source_type_id, source_id);
|
|
36
|
+
CREATE INDEX idx_links_target
|
|
37
|
+
ON links(project_id, target_type_id, target_id);
|
|
38
|
+
|
|
39
|
+
CREATE TABLE timeseries (
|
|
40
|
+
project_id TEXT NOT NULL,
|
|
41
|
+
object_type_id TEXT NOT NULL,
|
|
42
|
+
object_id TEXT NOT NULL,
|
|
43
|
+
property_id TEXT NOT NULL,
|
|
44
|
+
value TEXT NOT NULL,
|
|
45
|
+
unit TEXT,
|
|
46
|
+
at TEXT NOT NULL,
|
|
47
|
+
last_commit_id TEXT NOT NULL,
|
|
48
|
+
-- A telemetry point's identity is (series, at): one value per instant per
|
|
49
|
+
-- series. Appends upsert on this key (ON CONFLICT targets these columns), so
|
|
50
|
+
-- no separate idempotency ledger is needed. This primary-key index also serves
|
|
51
|
+
-- point lookups and latest-value reads (equality on the series prefix +
|
|
52
|
+
-- range/backward scan on `at`), so no additional timeseries indexes.
|
|
53
|
+
PRIMARY KEY (project_id, object_type_id, object_id, property_id, at)
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
CREATE TABLE sync_runs (
|
|
57
|
+
project_id TEXT NOT NULL,
|
|
58
|
+
id TEXT NOT NULL,
|
|
59
|
+
sync_id TEXT NOT NULL,
|
|
60
|
+
dataset_id TEXT NOT NULL,
|
|
61
|
+
mode TEXT NOT NULL CHECK (mode IN ('snapshot', 'append')),
|
|
62
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'succeeded', 'failed', 'cancelled')),
|
|
63
|
+
started_at TEXT NOT NULL,
|
|
64
|
+
finished_at TEXT,
|
|
65
|
+
rows_read INTEGER CHECK (rows_read IS NULL OR rows_read >= 0),
|
|
66
|
+
output_version_id TEXT,
|
|
67
|
+
expected_latest_version_id TEXT,
|
|
68
|
+
commit_message TEXT,
|
|
69
|
+
error_name TEXT,
|
|
70
|
+
error_message TEXT,
|
|
71
|
+
checkpoint TEXT,
|
|
72
|
+
PRIMARY KEY (project_id, id)
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
CREATE INDEX idx_sync_runs_project_started
|
|
76
|
+
ON sync_runs(project_id, started_at DESC);
|
|
77
|
+
CREATE INDEX idx_sync_runs_project_dataset_started
|
|
78
|
+
ON sync_runs(project_id, dataset_id, started_at DESC);
|
|
79
|
+
CREATE INDEX idx_sync_runs_project_sync_started
|
|
80
|
+
ON sync_runs(project_id, sync_id, started_at DESC);
|
|
81
|
+
CREATE INDEX idx_sync_runs_project_status_started
|
|
82
|
+
ON sync_runs(project_id, status, started_at DESC);
|
|
83
|
+
|
|
84
|
+
CREATE TABLE projection_runs (
|
|
85
|
+
project_id TEXT NOT NULL,
|
|
86
|
+
id TEXT NOT NULL,
|
|
87
|
+
projection_id TEXT NOT NULL,
|
|
88
|
+
projection_kind TEXT NOT NULL CHECK (projection_kind IN ('object', 'link', 'telemetry')),
|
|
89
|
+
materialization_protocol TEXT NOT NULL CHECK (materialization_protocol IN ('replacement', 'telemetry')),
|
|
90
|
+
dataset_id TEXT NOT NULL,
|
|
91
|
+
dataset_version_id TEXT NOT NULL,
|
|
92
|
+
dataset_version_created_at TEXT NOT NULL,
|
|
93
|
+
ontology_revision TEXT NOT NULL,
|
|
94
|
+
projection_revision TEXT NOT NULL,
|
|
95
|
+
ownership_hash TEXT NOT NULL,
|
|
96
|
+
object_type_id TEXT,
|
|
97
|
+
source_object_type_id TEXT,
|
|
98
|
+
target_object_type_id TEXT,
|
|
99
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'succeeded', 'failed', 'cancelled')),
|
|
100
|
+
started_at TEXT NOT NULL,
|
|
101
|
+
finished_at TEXT,
|
|
102
|
+
attempt INTEGER NOT NULL CHECK (attempt >= 1),
|
|
103
|
+
execution_token TEXT,
|
|
104
|
+
fixed_batch_size INTEGER CHECK (fixed_batch_size > 0),
|
|
105
|
+
next_batch_ordinal INTEGER CHECK (next_batch_ordinal >= 0),
|
|
106
|
+
next_row_offset INTEGER CHECK (next_row_offset >= 0),
|
|
107
|
+
input_exhausted INTEGER CHECK (input_exhausted IN (0, 1)),
|
|
108
|
+
missing_target_object_type_id TEXT,
|
|
109
|
+
missing_target_object_id TEXT,
|
|
110
|
+
missing_target_batch_ordinal INTEGER CHECK (
|
|
111
|
+
missing_target_batch_ordinal IS NULL OR missing_target_batch_ordinal >= 0
|
|
112
|
+
),
|
|
113
|
+
missing_target_first_seen_at TEXT,
|
|
114
|
+
source_rows_read INTEGER NOT NULL DEFAULT 0 CHECK (source_rows_read >= 0),
|
|
115
|
+
source_rows_skipped INTEGER NOT NULL DEFAULT 0 CHECK (source_rows_skipped >= 0),
|
|
116
|
+
error_message TEXT,
|
|
117
|
+
PRIMARY KEY (project_id, id),
|
|
118
|
+
CHECK (source_rows_skipped <= source_rows_read),
|
|
119
|
+
CHECK ((status = 'running') = (finished_at IS NULL)),
|
|
120
|
+
CHECK ((status = 'running') = (execution_token IS NOT NULL)),
|
|
121
|
+
CHECK ((projection_kind = 'telemetry') = (materialization_protocol = 'telemetry')),
|
|
122
|
+
CHECK (
|
|
123
|
+
(
|
|
124
|
+
projection_kind = 'link'
|
|
125
|
+
AND object_type_id IS NULL
|
|
126
|
+
AND source_object_type_id IS NOT NULL
|
|
127
|
+
AND target_object_type_id IS NOT NULL
|
|
128
|
+
)
|
|
129
|
+
OR
|
|
130
|
+
(
|
|
131
|
+
projection_kind IN ('object', 'telemetry')
|
|
132
|
+
AND object_type_id IS NOT NULL
|
|
133
|
+
AND source_object_type_id IS NULL
|
|
134
|
+
AND target_object_type_id IS NULL
|
|
135
|
+
)
|
|
136
|
+
),
|
|
137
|
+
CHECK (
|
|
138
|
+
(
|
|
139
|
+
materialization_protocol = 'replacement'
|
|
140
|
+
AND fixed_batch_size IS NULL
|
|
141
|
+
AND next_batch_ordinal IS NULL
|
|
142
|
+
AND next_row_offset IS NULL
|
|
143
|
+
AND input_exhausted IS NULL
|
|
144
|
+
)
|
|
145
|
+
OR
|
|
146
|
+
(
|
|
147
|
+
materialization_protocol = 'telemetry'
|
|
148
|
+
AND fixed_batch_size IS NOT NULL
|
|
149
|
+
AND next_batch_ordinal IS NOT NULL
|
|
150
|
+
AND next_row_offset IS NOT NULL
|
|
151
|
+
AND input_exhausted IS NOT NULL
|
|
152
|
+
)
|
|
153
|
+
),
|
|
154
|
+
CHECK (
|
|
155
|
+
(
|
|
156
|
+
missing_target_object_type_id IS NULL
|
|
157
|
+
AND missing_target_object_id IS NULL
|
|
158
|
+
AND missing_target_batch_ordinal IS NULL
|
|
159
|
+
AND missing_target_first_seen_at IS NULL
|
|
160
|
+
)
|
|
161
|
+
OR
|
|
162
|
+
(
|
|
163
|
+
projection_kind = 'telemetry'
|
|
164
|
+
AND missing_target_object_type_id = object_type_id
|
|
165
|
+
AND missing_target_object_id IS NOT NULL
|
|
166
|
+
AND missing_target_batch_ordinal = next_batch_ordinal
|
|
167
|
+
AND missing_target_first_seen_at IS NOT NULL
|
|
168
|
+
)
|
|
169
|
+
),
|
|
170
|
+
CHECK (projection_kind != 'telemetry' OR status != 'succeeded' OR input_exhausted = 1)
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
CREATE INDEX idx_projection_runs_project_started
|
|
174
|
+
ON projection_runs(project_id, started_at DESC);
|
|
175
|
+
CREATE INDEX idx_projection_runs_project_projection_started
|
|
176
|
+
ON projection_runs(project_id, projection_id, started_at DESC);
|
|
177
|
+
CREATE INDEX idx_projection_runs_project_dataset_started
|
|
178
|
+
ON projection_runs(project_id, dataset_id, started_at DESC);
|
|
179
|
+
CREATE INDEX idx_projection_runs_project_version_started
|
|
180
|
+
ON projection_runs(project_id, dataset_version_id, started_at DESC);
|
|
181
|
+
CREATE INDEX idx_projection_runs_project_status_started
|
|
182
|
+
ON projection_runs(project_id, status, started_at DESC);
|
|
183
|
+
CREATE INDEX idx_projection_runs_project_object_type_started
|
|
184
|
+
ON projection_runs(project_id, object_type_id, started_at DESC);
|
|
185
|
+
|
|
186
|
+
-- Ontology tables deliberately omit IF NOT EXISTS. A fresh installation is the only supported
|
|
187
|
+
-- schema for this coordinated breaking release; an untracked legacy schema must fail atomically.
|
|
188
|
+
CREATE TABLE ontology_commits (
|
|
189
|
+
project_id TEXT NOT NULL,
|
|
190
|
+
id TEXT NOT NULL,
|
|
191
|
+
idempotency_key TEXT NOT NULL,
|
|
192
|
+
request_hash TEXT NOT NULL,
|
|
193
|
+
origin_kind TEXT NOT NULL CHECK (origin_kind IN ('action', 'runtime', 'projection', 'telemetry')),
|
|
194
|
+
origin_run_id TEXT,
|
|
195
|
+
origin_batch_ordinal INTEGER CHECK (
|
|
196
|
+
origin_batch_ordinal IS NULL OR origin_batch_ordinal >= 0
|
|
197
|
+
),
|
|
198
|
+
origin TEXT NOT NULL CHECK (json_valid(origin)),
|
|
199
|
+
actor TEXT CHECK (actor IS NULL OR json_valid(actor)),
|
|
200
|
+
ontology_revision TEXT NOT NULL,
|
|
201
|
+
projection_revision TEXT,
|
|
202
|
+
ownership_hash TEXT,
|
|
203
|
+
intent TEXT NOT NULL CHECK (json_valid(intent)),
|
|
204
|
+
result TEXT NOT NULL CHECK (json_valid(result)),
|
|
205
|
+
committed_at TEXT NOT NULL,
|
|
206
|
+
PRIMARY KEY (project_id, id),
|
|
207
|
+
UNIQUE (project_id, idempotency_key),
|
|
208
|
+
CHECK (
|
|
209
|
+
(origin_kind IN ('action', 'projection') AND origin_run_id IS NOT NULL AND origin_batch_ordinal IS NULL)
|
|
210
|
+
OR (origin_kind = 'telemetry' AND (
|
|
211
|
+
(origin_run_id IS NULL AND origin_batch_ordinal IS NULL)
|
|
212
|
+
OR (origin_run_id IS NOT NULL AND origin_batch_ordinal IS NOT NULL)
|
|
213
|
+
))
|
|
214
|
+
OR (origin_kind = 'runtime' AND origin_run_id IS NULL AND origin_batch_ordinal IS NULL)
|
|
215
|
+
)
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
CREATE UNIQUE INDEX idx_ontology_commits_action_origin
|
|
219
|
+
ON ontology_commits(project_id, origin_run_id)
|
|
220
|
+
WHERE origin_kind = 'action';
|
|
221
|
+
CREATE UNIQUE INDEX idx_ontology_commits_projection_origin
|
|
222
|
+
ON ontology_commits(project_id, origin_run_id)
|
|
223
|
+
WHERE origin_kind = 'projection';
|
|
224
|
+
CREATE UNIQUE INDEX idx_ontology_commits_telemetry_origin
|
|
225
|
+
ON ontology_commits(project_id, origin_run_id, origin_batch_ordinal)
|
|
226
|
+
WHERE origin_kind = 'telemetry' AND origin_run_id IS NOT NULL;
|
|
227
|
+
CREATE INDEX idx_ontology_commits_history
|
|
228
|
+
ON ontology_commits(project_id, committed_at, id);
|
|
229
|
+
CREATE INDEX idx_ontology_commits_origin
|
|
230
|
+
ON ontology_commits(project_id, origin_kind, origin_run_id, origin_batch_ordinal);
|
|
231
|
+
|
|
232
|
+
CREATE TABLE ontology_sources (
|
|
233
|
+
project_id TEXT NOT NULL,
|
|
234
|
+
source_id TEXT NOT NULL,
|
|
235
|
+
materialization_id TEXT NOT NULL,
|
|
236
|
+
projection_run_id TEXT NOT NULL,
|
|
237
|
+
projection_kind TEXT NOT NULL CHECK (projection_kind IN ('object', 'link')),
|
|
238
|
+
protocol TEXT NOT NULL CHECK (protocol = 'replacement'),
|
|
239
|
+
status TEXT NOT NULL CHECK (
|
|
240
|
+
status IN ('staging', 'ready', 'active', 'superseded', 'abandoned')
|
|
241
|
+
),
|
|
242
|
+
execution_token TEXT,
|
|
243
|
+
dataset_id TEXT NOT NULL,
|
|
244
|
+
dataset_version_id TEXT NOT NULL,
|
|
245
|
+
dataset_version_created_at TEXT NOT NULL,
|
|
246
|
+
projection_revision TEXT NOT NULL,
|
|
247
|
+
ownership_hash TEXT NOT NULL,
|
|
248
|
+
ontology_revision TEXT NOT NULL,
|
|
249
|
+
root_count INTEGER CHECK (root_count IS NULL OR root_count >= 0),
|
|
250
|
+
assertion_count INTEGER CHECK (assertion_count IS NULL OR assertion_count >= 0),
|
|
251
|
+
created_at TEXT NOT NULL,
|
|
252
|
+
ready_at TEXT,
|
|
253
|
+
activated_at TEXT,
|
|
254
|
+
terminal_at TEXT,
|
|
255
|
+
last_commit_id TEXT,
|
|
256
|
+
updated_at TEXT NOT NULL,
|
|
257
|
+
PRIMARY KEY (project_id, source_id, materialization_id),
|
|
258
|
+
CHECK ((root_count IS NULL) = (assertion_count IS NULL)),
|
|
259
|
+
CHECK ((root_count IS NULL) = (ready_at IS NULL)),
|
|
260
|
+
CHECK ((status IN ('staging', 'ready')) = (execution_token IS NOT NULL)),
|
|
261
|
+
CHECK (
|
|
262
|
+
(status = 'staging' AND ready_at IS NULL)
|
|
263
|
+
OR (status IN ('ready', 'active', 'superseded') AND ready_at IS NOT NULL)
|
|
264
|
+
OR status = 'abandoned'
|
|
265
|
+
),
|
|
266
|
+
CHECK ((status IN ('active', 'superseded')) = (activated_at IS NOT NULL)),
|
|
267
|
+
CHECK ((status IN ('active', 'superseded')) = (last_commit_id IS NOT NULL)),
|
|
268
|
+
CHECK ((status IN ('superseded', 'abandoned')) = (terminal_at IS NOT NULL)),
|
|
269
|
+
CHECK (ready_at IS NULL OR created_at <= ready_at),
|
|
270
|
+
CHECK (activated_at IS NULL OR (ready_at IS NOT NULL AND ready_at <= activated_at)),
|
|
271
|
+
CHECK (terminal_at IS NULL OR created_at <= terminal_at),
|
|
272
|
+
CHECK (terminal_at IS NULL OR ready_at IS NULL OR ready_at <= terminal_at),
|
|
273
|
+
CHECK (terminal_at IS NULL OR activated_at IS NULL OR activated_at <= terminal_at),
|
|
274
|
+
CHECK (created_at <= updated_at)
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
CREATE UNIQUE INDEX idx_ontology_sources_active
|
|
278
|
+
ON ontology_sources(project_id, source_id)
|
|
279
|
+
WHERE status = 'active';
|
|
280
|
+
CREATE UNIQUE INDEX idx_ontology_sources_run_candidate
|
|
281
|
+
ON ontology_sources(project_id, projection_run_id)
|
|
282
|
+
WHERE status IN ('staging', 'ready');
|
|
283
|
+
CREATE INDEX idx_ontology_sources_cleanup
|
|
284
|
+
ON ontology_sources(project_id, status, terminal_at, source_id, materialization_id);
|
|
285
|
+
CREATE INDEX idx_ontology_sources_run
|
|
286
|
+
ON ontology_sources(project_id, projection_run_id);
|
|
287
|
+
|
|
288
|
+
CREATE TABLE ontology_source_rows (
|
|
289
|
+
project_id TEXT NOT NULL,
|
|
290
|
+
source_id TEXT NOT NULL,
|
|
291
|
+
materialization_id TEXT NOT NULL,
|
|
292
|
+
entity_kind TEXT NOT NULL CHECK (entity_kind IN ('object', 'link')),
|
|
293
|
+
entity_key TEXT NOT NULL CHECK (json_valid(entity_key)),
|
|
294
|
+
entity_sort_key TEXT NOT NULL,
|
|
295
|
+
root_kind TEXT NOT NULL CHECK (root_kind IN ('object', 'link')),
|
|
296
|
+
root_key TEXT NOT NULL CHECK (json_valid(root_key)),
|
|
297
|
+
root_sort_key TEXT NOT NULL,
|
|
298
|
+
staging_ordinal INTEGER NOT NULL CHECK (staging_ordinal >= 0),
|
|
299
|
+
root TEXT NOT NULL CHECK (json_valid(root)),
|
|
300
|
+
assertion TEXT NOT NULL CHECK (json_valid(assertion)),
|
|
301
|
+
object_type_id TEXT,
|
|
302
|
+
primary_id TEXT,
|
|
303
|
+
source_type_id TEXT,
|
|
304
|
+
source_primary_id TEXT,
|
|
305
|
+
link_id TEXT,
|
|
306
|
+
target_type_id TEXT,
|
|
307
|
+
target_primary_id TEXT,
|
|
308
|
+
root_object_type_id TEXT,
|
|
309
|
+
root_primary_id TEXT,
|
|
310
|
+
root_source_type_id TEXT,
|
|
311
|
+
root_source_primary_id TEXT,
|
|
312
|
+
root_link_id TEXT,
|
|
313
|
+
root_target_type_id TEXT,
|
|
314
|
+
root_target_primary_id TEXT,
|
|
315
|
+
PRIMARY KEY (project_id, source_id, materialization_id, entity_kind, entity_key),
|
|
316
|
+
FOREIGN KEY (project_id, source_id, materialization_id)
|
|
317
|
+
REFERENCES ontology_sources(project_id, source_id, materialization_id)
|
|
318
|
+
ON DELETE RESTRICT,
|
|
319
|
+
CHECK (
|
|
320
|
+
(entity_kind = 'object' AND object_type_id IS NOT NULL AND primary_id IS NOT NULL
|
|
321
|
+
AND source_type_id IS NULL AND source_primary_id IS NULL AND link_id IS NULL
|
|
322
|
+
AND target_type_id IS NULL AND target_primary_id IS NULL)
|
|
323
|
+
OR
|
|
324
|
+
(entity_kind = 'link' AND object_type_id IS NULL AND primary_id IS NULL
|
|
325
|
+
AND source_type_id IS NOT NULL AND source_primary_id IS NOT NULL AND link_id IS NOT NULL
|
|
326
|
+
AND target_type_id IS NOT NULL AND target_primary_id IS NOT NULL)
|
|
327
|
+
),
|
|
328
|
+
CHECK (
|
|
329
|
+
(root_kind = 'object' AND root_object_type_id IS NOT NULL AND root_primary_id IS NOT NULL
|
|
330
|
+
AND root_source_type_id IS NULL AND root_source_primary_id IS NULL AND root_link_id IS NULL
|
|
331
|
+
AND root_target_type_id IS NULL AND root_target_primary_id IS NULL)
|
|
332
|
+
OR
|
|
333
|
+
(root_kind = 'link' AND root_object_type_id IS NULL AND root_primary_id IS NULL
|
|
334
|
+
AND root_source_type_id IS NOT NULL AND root_source_primary_id IS NOT NULL
|
|
335
|
+
AND root_link_id IS NOT NULL AND root_target_type_id IS NOT NULL
|
|
336
|
+
AND root_target_primary_id IS NOT NULL)
|
|
337
|
+
)
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
CREATE INDEX idx_ontology_source_rows_root
|
|
341
|
+
ON ontology_source_rows(
|
|
342
|
+
project_id, source_id, materialization_id, root_sort_key, staging_ordinal, entity_sort_key
|
|
343
|
+
);
|
|
344
|
+
CREATE INDEX idx_ontology_source_rows_staging_ordinal
|
|
345
|
+
ON ontology_source_rows(project_id, source_id, materialization_id, staging_ordinal);
|
|
346
|
+
CREATE INDEX idx_ontology_source_rows_entity_sort
|
|
347
|
+
ON ontology_source_rows(project_id, source_id, materialization_id, entity_sort_key);
|
|
348
|
+
CREATE INDEX idx_ontology_source_rows_object
|
|
349
|
+
ON ontology_source_rows(project_id, object_type_id, primary_id)
|
|
350
|
+
WHERE entity_kind = 'object';
|
|
351
|
+
CREATE INDEX idx_ontology_source_rows_link_source
|
|
352
|
+
ON ontology_source_rows(
|
|
353
|
+
project_id, source_type_id, source_primary_id, link_id,
|
|
354
|
+
target_type_id, target_primary_id
|
|
355
|
+
)
|
|
356
|
+
WHERE entity_kind = 'link';
|
|
357
|
+
CREATE INDEX idx_ontology_source_rows_link_target
|
|
358
|
+
ON ontology_source_rows(project_id, target_type_id, target_primary_id)
|
|
359
|
+
WHERE entity_kind = 'link';
|
|
360
|
+
|
|
361
|
+
CREATE TABLE ontology_overrides (
|
|
362
|
+
project_id TEXT NOT NULL,
|
|
363
|
+
entity_kind TEXT NOT NULL CHECK (entity_kind IN ('object', 'link')),
|
|
364
|
+
entity_key TEXT NOT NULL CHECK (json_valid(entity_key)),
|
|
365
|
+
entity_sort_key TEXT NOT NULL,
|
|
366
|
+
object_type_id TEXT,
|
|
367
|
+
primary_id TEXT,
|
|
368
|
+
source_type_id TEXT,
|
|
369
|
+
source_primary_id TEXT,
|
|
370
|
+
link_id TEXT,
|
|
371
|
+
target_type_id TEXT,
|
|
372
|
+
target_primary_id TEXT,
|
|
373
|
+
value TEXT NOT NULL CHECK (json_valid(value)),
|
|
374
|
+
last_commit_id TEXT NOT NULL,
|
|
375
|
+
updated_at TEXT NOT NULL,
|
|
376
|
+
PRIMARY KEY (project_id, entity_kind, entity_key),
|
|
377
|
+
CHECK (
|
|
378
|
+
(entity_kind = 'object' AND object_type_id IS NOT NULL AND primary_id IS NOT NULL
|
|
379
|
+
AND source_type_id IS NULL AND source_primary_id IS NULL AND link_id IS NULL
|
|
380
|
+
AND target_type_id IS NULL AND target_primary_id IS NULL)
|
|
381
|
+
OR
|
|
382
|
+
(entity_kind = 'link' AND object_type_id IS NULL AND primary_id IS NULL
|
|
383
|
+
AND source_type_id IS NOT NULL AND source_primary_id IS NOT NULL AND link_id IS NOT NULL
|
|
384
|
+
AND target_type_id IS NOT NULL AND target_primary_id IS NOT NULL)
|
|
385
|
+
)
|
|
386
|
+
);
|
|
387
|
+
|
|
388
|
+
CREATE INDEX idx_ontology_overrides_link_source
|
|
389
|
+
ON ontology_overrides(
|
|
390
|
+
project_id, source_type_id, source_primary_id, link_id,
|
|
391
|
+
target_type_id, target_primary_id
|
|
392
|
+
)
|
|
393
|
+
WHERE entity_kind = 'link';
|
|
394
|
+
CREATE INDEX idx_ontology_overrides_link_target
|
|
395
|
+
ON ontology_overrides(project_id, target_type_id, target_primary_id)
|
|
396
|
+
WHERE entity_kind = 'link';
|
|
397
|
+
CREATE INDEX idx_ontology_overrides_object
|
|
398
|
+
ON ontology_overrides(project_id, object_type_id, primary_id)
|
|
399
|
+
WHERE entity_kind = 'object';
|
|
400
|
+
|
|
401
|
+
CREATE TABLE ontology_outbox (
|
|
402
|
+
project_id TEXT NOT NULL,
|
|
403
|
+
id TEXT NOT NULL,
|
|
404
|
+
commit_id TEXT NOT NULL,
|
|
405
|
+
commit_ordinal INTEGER NOT NULL CHECK (commit_ordinal >= 0),
|
|
406
|
+
envelope TEXT NOT NULL CHECK (json_valid(envelope)),
|
|
407
|
+
available_at TEXT NOT NULL,
|
|
408
|
+
attempts INTEGER NOT NULL DEFAULT 0 CHECK (attempts >= 0),
|
|
409
|
+
lease_id TEXT,
|
|
410
|
+
lease_expires_at TEXT,
|
|
411
|
+
published_at TEXT,
|
|
412
|
+
last_error TEXT,
|
|
413
|
+
created_at TEXT NOT NULL,
|
|
414
|
+
PRIMARY KEY (project_id, id),
|
|
415
|
+
UNIQUE (project_id, commit_id, commit_ordinal),
|
|
416
|
+
CHECK ((lease_id IS NULL) = (lease_expires_at IS NULL))
|
|
417
|
+
);
|
|
418
|
+
|
|
419
|
+
CREATE INDEX idx_ontology_outbox_claim
|
|
420
|
+
ON ontology_outbox(project_id, available_at, lease_expires_at, created_at, commit_id, commit_ordinal)
|
|
421
|
+
WHERE published_at IS NULL;
|
|
422
|
+
CREATE INDEX idx_ontology_outbox_published
|
|
423
|
+
ON ontology_outbox(project_id, published_at, id)
|
|
424
|
+
WHERE published_at IS NOT NULL;
|
|
425
|
+
|
|
426
|
+
CREATE TABLE pipeline_runs (
|
|
427
|
+
project_id TEXT NOT NULL,
|
|
428
|
+
id TEXT NOT NULL,
|
|
429
|
+
pipeline_id TEXT NOT NULL,
|
|
430
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'succeeded', 'failed', 'cancelled')),
|
|
431
|
+
started_at TEXT NOT NULL,
|
|
432
|
+
finished_at TEXT,
|
|
433
|
+
output_dataset_id TEXT,
|
|
434
|
+
output_version_id TEXT,
|
|
435
|
+
error_name TEXT,
|
|
436
|
+
error_message TEXT,
|
|
437
|
+
PRIMARY KEY (project_id, id)
|
|
438
|
+
);
|
|
439
|
+
|
|
440
|
+
CREATE INDEX idx_pipeline_runs_project_started
|
|
441
|
+
ON pipeline_runs(project_id, started_at DESC);
|
|
442
|
+
CREATE INDEX idx_pipeline_runs_project_pipeline_started
|
|
443
|
+
ON pipeline_runs(project_id, pipeline_id, started_at DESC);
|
|
444
|
+
CREATE INDEX idx_pipeline_runs_project_status_started
|
|
445
|
+
ON pipeline_runs(project_id, status, started_at DESC);
|
|
446
|
+
|
|
447
|
+
CREATE TABLE pipeline_step_runs (
|
|
448
|
+
project_id TEXT NOT NULL,
|
|
449
|
+
id TEXT NOT NULL,
|
|
450
|
+
pipeline_run_id TEXT NOT NULL,
|
|
451
|
+
pipeline_id TEXT NOT NULL,
|
|
452
|
+
step_id TEXT NOT NULL,
|
|
453
|
+
dataset_id TEXT NOT NULL,
|
|
454
|
+
mode TEXT NOT NULL CHECK (mode IN ('snapshot', 'append')),
|
|
455
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'succeeded', 'failed', 'cancelled')),
|
|
456
|
+
started_at TEXT NOT NULL,
|
|
457
|
+
finished_at TEXT,
|
|
458
|
+
inputs TEXT NOT NULL,
|
|
459
|
+
output_version_id TEXT,
|
|
460
|
+
rows_written INTEGER CHECK (rows_written IS NULL OR rows_written >= 0),
|
|
461
|
+
error_name TEXT,
|
|
462
|
+
error_message TEXT,
|
|
463
|
+
PRIMARY KEY (project_id, id)
|
|
464
|
+
);
|
|
465
|
+
|
|
466
|
+
CREATE INDEX idx_pipeline_step_runs_project_started
|
|
467
|
+
ON pipeline_step_runs(project_id, started_at DESC);
|
|
468
|
+
CREATE INDEX idx_pipeline_step_runs_project_run_started
|
|
469
|
+
ON pipeline_step_runs(project_id, pipeline_run_id, started_at DESC);
|
|
470
|
+
CREATE INDEX idx_pipeline_step_runs_project_pipeline_started
|
|
471
|
+
ON pipeline_step_runs(project_id, pipeline_id, started_at DESC);
|
|
472
|
+
CREATE INDEX idx_pipeline_step_runs_project_step_started
|
|
473
|
+
ON pipeline_step_runs(project_id, step_id, started_at DESC);
|
|
474
|
+
CREATE INDEX idx_pipeline_step_runs_project_dataset_started
|
|
475
|
+
ON pipeline_step_runs(project_id, dataset_id, started_at DESC);
|
|
476
|
+
CREATE INDEX idx_pipeline_step_runs_project_status_started
|
|
477
|
+
ON pipeline_step_runs(project_id, status, started_at DESC);
|
|
478
|
+
|
|
479
|
+
CREATE TABLE workflow_runs (
|
|
480
|
+
project_id TEXT NOT NULL,
|
|
481
|
+
id TEXT NOT NULL,
|
|
482
|
+
workflow_id TEXT NOT NULL,
|
|
483
|
+
status TEXT NOT NULL CHECK (
|
|
484
|
+
status IN ('queued', 'running', 'waiting', 'succeeded', 'failed', 'cancelled')
|
|
485
|
+
),
|
|
486
|
+
input TEXT NOT NULL,
|
|
487
|
+
queued_at TEXT,
|
|
488
|
+
started_at TEXT NOT NULL,
|
|
489
|
+
finished_at TEXT,
|
|
490
|
+
error TEXT,
|
|
491
|
+
source TEXT,
|
|
492
|
+
attempt INTEGER NOT NULL DEFAULT 0 CHECK (attempt >= 0),
|
|
493
|
+
execution_token TEXT,
|
|
494
|
+
execution_queue_lease_expires_at TEXT,
|
|
495
|
+
requested_by_principal_type TEXT NOT NULL DEFAULT 'system'
|
|
496
|
+
CHECK (requested_by_principal_type IN ('user', 'serviceAccount', 'system')),
|
|
497
|
+
requested_by_principal_id TEXT NOT NULL DEFAULT 'system',
|
|
498
|
+
CHECK ((execution_token IS NULL) = (execution_queue_lease_expires_at IS NULL)),
|
|
499
|
+
PRIMARY KEY (project_id, id)
|
|
500
|
+
);
|
|
501
|
+
|
|
502
|
+
CREATE INDEX idx_workflow_runs_project_started
|
|
503
|
+
ON workflow_runs(project_id, started_at DESC);
|
|
504
|
+
CREATE INDEX idx_workflow_runs_project_workflow_started
|
|
505
|
+
ON workflow_runs(project_id, workflow_id, started_at DESC);
|
|
506
|
+
CREATE INDEX idx_workflow_runs_project_status_started
|
|
507
|
+
ON workflow_runs(project_id, status, started_at DESC);
|
|
508
|
+
|
|
509
|
+
CREATE TABLE workflow_node_runs (
|
|
510
|
+
project_id TEXT NOT NULL,
|
|
511
|
+
id TEXT NOT NULL,
|
|
512
|
+
workflow_run_id TEXT NOT NULL,
|
|
513
|
+
workflow_id TEXT NOT NULL,
|
|
514
|
+
node_index INTEGER NOT NULL CHECK (node_index >= 0),
|
|
515
|
+
node_type TEXT NOT NULL CHECK (node_type IN ('step', 'action', 'intervention', 'agent')),
|
|
516
|
+
node_id TEXT NOT NULL,
|
|
517
|
+
node_key TEXT NOT NULL,
|
|
518
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'waiting', 'succeeded', 'failed', 'cancelled')),
|
|
519
|
+
input TEXT NOT NULL,
|
|
520
|
+
started_at TEXT NOT NULL,
|
|
521
|
+
finished_at TEXT,
|
|
522
|
+
output TEXT,
|
|
523
|
+
error TEXT,
|
|
524
|
+
PRIMARY KEY (project_id, id)
|
|
525
|
+
);
|
|
526
|
+
|
|
527
|
+
CREATE INDEX idx_workflow_node_runs_project_started
|
|
528
|
+
ON workflow_node_runs(project_id, started_at DESC);
|
|
529
|
+
CREATE INDEX idx_workflow_node_runs_project_run_started
|
|
530
|
+
ON workflow_node_runs(project_id, workflow_run_id, started_at DESC);
|
|
531
|
+
CREATE INDEX idx_workflow_node_runs_project_workflow_started
|
|
532
|
+
ON workflow_node_runs(project_id, workflow_id, started_at DESC);
|
|
533
|
+
CREATE INDEX idx_workflow_node_runs_project_node_started
|
|
534
|
+
ON workflow_node_runs(project_id, node_id, started_at DESC);
|
|
535
|
+
CREATE INDEX idx_workflow_node_runs_project_key_started
|
|
536
|
+
ON workflow_node_runs(project_id, node_key, started_at DESC);
|
|
537
|
+
CREATE INDEX idx_workflow_node_runs_project_status_started
|
|
538
|
+
ON workflow_node_runs(project_id, status, started_at DESC);
|
|
539
|
+
|
|
540
|
+
CREATE TABLE IF NOT EXISTS workflow_agent_node_runs (
|
|
541
|
+
project_id TEXT NOT NULL,
|
|
542
|
+
node_run_id TEXT NOT NULL,
|
|
543
|
+
agent_id TEXT NOT NULL,
|
|
544
|
+
status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'succeeded', 'failed', 'cancelled')),
|
|
545
|
+
prompt TEXT NOT NULL,
|
|
546
|
+
execution_principal_type TEXT
|
|
547
|
+
CHECK (execution_principal_type IS NULL OR execution_principal_type = 'serviceAccount'),
|
|
548
|
+
execution_principal_id TEXT,
|
|
549
|
+
model_id TEXT,
|
|
550
|
+
finish_reason TEXT,
|
|
551
|
+
usage TEXT,
|
|
552
|
+
trace TEXT,
|
|
553
|
+
diagnostics TEXT,
|
|
554
|
+
error TEXT,
|
|
555
|
+
attempt INTEGER NOT NULL DEFAULT 0 CHECK (attempt >= 0),
|
|
556
|
+
execution_token TEXT,
|
|
557
|
+
execution_queue_lease_expires_at TEXT,
|
|
558
|
+
created_at TEXT NOT NULL,
|
|
559
|
+
started_at TEXT,
|
|
560
|
+
completed_at TEXT,
|
|
561
|
+
PRIMARY KEY (project_id, node_run_id),
|
|
562
|
+
FOREIGN KEY (project_id, node_run_id)
|
|
563
|
+
REFERENCES workflow_node_runs (project_id, id)
|
|
564
|
+
ON DELETE CASCADE,
|
|
565
|
+
CHECK ((execution_principal_type IS NULL) = (execution_principal_id IS NULL)),
|
|
566
|
+
CHECK ((execution_token IS NULL) = (execution_queue_lease_expires_at IS NULL))
|
|
567
|
+
);
|
|
568
|
+
|
|
569
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_agent_node_runs_project_agent_created
|
|
570
|
+
ON workflow_agent_node_runs(project_id, agent_id, created_at DESC);
|
|
571
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_agent_node_runs_project_status_created
|
|
572
|
+
ON workflow_agent_node_runs(project_id, status, created_at DESC);
|
|
573
|
+
|
|
574
|
+
CREATE TABLE workflow_interventions (
|
|
575
|
+
project_id TEXT NOT NULL,
|
|
576
|
+
id TEXT NOT NULL,
|
|
577
|
+
workflow_id TEXT NOT NULL,
|
|
578
|
+
workflow_run_id TEXT NOT NULL,
|
|
579
|
+
node_run_id TEXT NOT NULL,
|
|
580
|
+
node_index INTEGER NOT NULL CHECK (node_index >= 0),
|
|
581
|
+
node_id TEXT NOT NULL,
|
|
582
|
+
node_key TEXT NOT NULL,
|
|
583
|
+
intervention_id TEXT NOT NULL,
|
|
584
|
+
input TEXT NOT NULL,
|
|
585
|
+
default_response TEXT NOT NULL,
|
|
586
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'submitted', 'cancelled', 'expired')),
|
|
587
|
+
requested_at TEXT NOT NULL,
|
|
588
|
+
expires_at TEXT,
|
|
589
|
+
submitted_at TEXT,
|
|
590
|
+
submitted_by TEXT,
|
|
591
|
+
response TEXT,
|
|
592
|
+
cancelled_at TEXT,
|
|
593
|
+
cancelled_by TEXT,
|
|
594
|
+
expired_at TEXT,
|
|
595
|
+
PRIMARY KEY (project_id, id)
|
|
596
|
+
);
|
|
597
|
+
|
|
598
|
+
CREATE INDEX idx_workflow_interventions_project_requested
|
|
599
|
+
ON workflow_interventions(project_id, requested_at DESC);
|
|
600
|
+
CREATE INDEX idx_workflow_interventions_project_status_requested
|
|
601
|
+
ON workflow_interventions(project_id, status, requested_at DESC);
|
|
602
|
+
CREATE INDEX idx_workflow_interventions_project_workflow_requested
|
|
603
|
+
ON workflow_interventions(project_id, workflow_id, requested_at DESC);
|
|
604
|
+
CREATE INDEX idx_workflow_interventions_project_run_requested
|
|
605
|
+
ON workflow_interventions(project_id, workflow_run_id, requested_at DESC);
|
|
606
|
+
CREATE INDEX idx_workflow_interventions_project_node_run_requested
|
|
607
|
+
ON workflow_interventions(project_id, node_run_id, requested_at DESC);
|
|
608
|
+
CREATE INDEX idx_workflow_interventions_project_node_requested
|
|
609
|
+
ON workflow_interventions(project_id, node_id, requested_at DESC);
|
|
610
|
+
CREATE INDEX idx_workflow_interventions_project_key_requested
|
|
611
|
+
ON workflow_interventions(project_id, node_key, requested_at DESC);
|
|
612
|
+
CREATE INDEX idx_workflow_interventions_project_intervention_requested
|
|
613
|
+
ON workflow_interventions(project_id, intervention_id, requested_at DESC);
|
|
614
|
+
|
|
615
|
+
CREATE TABLE webhook_deliveries (
|
|
616
|
+
project_id TEXT NOT NULL,
|
|
617
|
+
connector_id TEXT NOT NULL,
|
|
618
|
+
webhook_id TEXT NOT NULL,
|
|
619
|
+
idempotency_key TEXT NOT NULL,
|
|
620
|
+
status TEXT NOT NULL CHECK (status IN ('in_progress', 'completed', 'failed')),
|
|
621
|
+
received_at TEXT NOT NULL,
|
|
622
|
+
completed_at TEXT,
|
|
623
|
+
failed_at TEXT,
|
|
624
|
+
error TEXT,
|
|
625
|
+
PRIMARY KEY (project_id, connector_id, webhook_id, idempotency_key)
|
|
626
|
+
);
|
|
627
|
+
|
|
628
|
+
CREATE INDEX idx_webhook_deliveries_project_received
|
|
629
|
+
ON webhook_deliveries(project_id, received_at DESC);
|
|
630
|
+
|
|
631
|
+
CREATE TABLE webhook_runs (
|
|
632
|
+
project_id TEXT NOT NULL,
|
|
633
|
+
id TEXT NOT NULL,
|
|
634
|
+
connector_id TEXT NOT NULL,
|
|
635
|
+
webhook_id TEXT NOT NULL,
|
|
636
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'succeeded', 'failed', 'skipped')),
|
|
637
|
+
method TEXT NOT NULL,
|
|
638
|
+
route TEXT NOT NULL,
|
|
639
|
+
started_at TEXT NOT NULL,
|
|
640
|
+
finished_at TEXT,
|
|
641
|
+
request_body_bytes INTEGER CHECK (request_body_bytes IS NULL OR request_body_bytes >= 0),
|
|
642
|
+
response_status INTEGER CHECK (
|
|
643
|
+
response_status IS NULL OR (response_status >= 100 AND response_status <= 599)
|
|
644
|
+
),
|
|
645
|
+
idempotency_key TEXT,
|
|
646
|
+
delivery_claim_result TEXT CHECK (
|
|
647
|
+
delivery_claim_result IS NULL OR delivery_claim_result IN ('claimed', 'duplicate', 'in_progress')
|
|
648
|
+
),
|
|
649
|
+
error TEXT,
|
|
650
|
+
PRIMARY KEY (project_id, id)
|
|
651
|
+
);
|
|
652
|
+
|
|
653
|
+
CREATE INDEX idx_webhook_runs_project_started
|
|
654
|
+
ON webhook_runs(project_id, started_at DESC);
|
|
655
|
+
CREATE INDEX idx_webhook_runs_project_connector_started
|
|
656
|
+
ON webhook_runs(project_id, connector_id, started_at DESC);
|
|
657
|
+
CREATE INDEX idx_webhook_runs_project_webhook_started
|
|
658
|
+
ON webhook_runs(project_id, connector_id, webhook_id, started_at DESC);
|
|
659
|
+
CREATE INDEX idx_webhook_runs_project_status_started
|
|
660
|
+
ON webhook_runs(project_id, status, started_at DESC);
|
|
661
|
+
CREATE INDEX idx_webhook_runs_project_idempotency
|
|
662
|
+
ON webhook_runs(project_id, idempotency_key);
|
|
663
|
+
|
|
664
|
+
CREATE TABLE rule_states (
|
|
665
|
+
project_id TEXT NOT NULL,
|
|
666
|
+
rule_id TEXT NOT NULL,
|
|
667
|
+
subject_kind TEXT NOT NULL CHECK (subject_kind IN ('object')),
|
|
668
|
+
object_type_id TEXT NOT NULL,
|
|
669
|
+
primary_id TEXT NOT NULL,
|
|
670
|
+
triggered_at TEXT NOT NULL,
|
|
671
|
+
PRIMARY KEY (project_id, rule_id, subject_kind, object_type_id, primary_id)
|
|
672
|
+
);
|
|
673
|
+
|
|
674
|
+
CREATE INDEX idx_rule_states_project_rule
|
|
675
|
+
ON rule_states(project_id, rule_id);
|
|
676
|
+
|
|
677
|
+
CREATE TABLE action_runs (
|
|
678
|
+
project_id TEXT NOT NULL,
|
|
679
|
+
id TEXT NOT NULL,
|
|
680
|
+
action_id TEXT NOT NULL,
|
|
681
|
+
subject_kind TEXT NOT NULL CHECK (subject_kind IN ('none', 'object')),
|
|
682
|
+
object_type_id TEXT,
|
|
683
|
+
primary_id TEXT,
|
|
684
|
+
status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'succeeded', 'failed', 'cancelled')),
|
|
685
|
+
phase TEXT CHECK (
|
|
686
|
+
phase IS NULL OR phase IN (
|
|
687
|
+
'request',
|
|
688
|
+
'enqueue',
|
|
689
|
+
'validation',
|
|
690
|
+
'writeback',
|
|
691
|
+
'edits',
|
|
692
|
+
'commit',
|
|
693
|
+
'effects',
|
|
694
|
+
'cancelled'
|
|
695
|
+
)
|
|
696
|
+
),
|
|
697
|
+
queued_at TEXT NOT NULL,
|
|
698
|
+
started_at TEXT,
|
|
699
|
+
finished_at TEXT,
|
|
700
|
+
params TEXT NOT NULL,
|
|
701
|
+
idempotency_key TEXT NOT NULL,
|
|
702
|
+
writeback_status TEXT CHECK (writeback_status IS NULL OR writeback_status IN ('succeeded', 'failed')),
|
|
703
|
+
writeback_completed_at TEXT,
|
|
704
|
+
writeback_result TEXT,
|
|
705
|
+
writeback_error_name TEXT,
|
|
706
|
+
writeback_error_message TEXT,
|
|
707
|
+
writeback_error_phase TEXT CHECK (
|
|
708
|
+
writeback_error_phase IS NULL OR writeback_error_phase IN (
|
|
709
|
+
'request',
|
|
710
|
+
'enqueue',
|
|
711
|
+
'validation',
|
|
712
|
+
'writeback',
|
|
713
|
+
'edits',
|
|
714
|
+
'commit',
|
|
715
|
+
'effects',
|
|
716
|
+
'cancelled'
|
|
717
|
+
)
|
|
718
|
+
),
|
|
719
|
+
effects_status TEXT CHECK (effects_status IS NULL OR effects_status IN ('succeeded', 'failed')),
|
|
720
|
+
effects_completed_at TEXT,
|
|
721
|
+
effects_error_name TEXT,
|
|
722
|
+
effects_error_message TEXT,
|
|
723
|
+
effects_error_phase TEXT CHECK (
|
|
724
|
+
effects_error_phase IS NULL OR effects_error_phase IN (
|
|
725
|
+
'request',
|
|
726
|
+
'enqueue',
|
|
727
|
+
'validation',
|
|
728
|
+
'writeback',
|
|
729
|
+
'edits',
|
|
730
|
+
'commit',
|
|
731
|
+
'effects',
|
|
732
|
+
'cancelled'
|
|
733
|
+
)
|
|
734
|
+
),
|
|
735
|
+
error_name TEXT,
|
|
736
|
+
error_message TEXT,
|
|
737
|
+
error_phase TEXT CHECK (
|
|
738
|
+
error_phase IS NULL OR error_phase IN (
|
|
739
|
+
'request',
|
|
740
|
+
'enqueue',
|
|
741
|
+
'validation',
|
|
742
|
+
'writeback',
|
|
743
|
+
'edits',
|
|
744
|
+
'commit',
|
|
745
|
+
'effects',
|
|
746
|
+
'cancelled'
|
|
747
|
+
)
|
|
748
|
+
),
|
|
749
|
+
CHECK (
|
|
750
|
+
(subject_kind = 'none' AND object_type_id IS NULL AND primary_id IS NULL)
|
|
751
|
+
OR (subject_kind = 'object' AND object_type_id IS NOT NULL AND primary_id IS NOT NULL)
|
|
752
|
+
),
|
|
753
|
+
PRIMARY KEY (project_id, id)
|
|
754
|
+
);
|
|
755
|
+
|
|
756
|
+
CREATE INDEX idx_action_runs_project_started
|
|
757
|
+
ON action_runs(project_id, COALESCE(started_at, queued_at) DESC);
|
|
758
|
+
CREATE INDEX idx_action_runs_project_action_started
|
|
759
|
+
ON action_runs(project_id, action_id, COALESCE(started_at, queued_at) DESC);
|
|
760
|
+
CREATE INDEX idx_action_runs_project_object_started
|
|
761
|
+
ON action_runs(project_id, object_type_id, primary_id, COALESCE(started_at, queued_at) DESC);
|
|
762
|
+
CREATE INDEX idx_action_runs_project_status_started
|
|
763
|
+
ON action_runs(project_id, status, COALESCE(started_at, queued_at) DESC);
|
|
764
|
+
|
|
765
|
+
CREATE TABLE auth_users (
|
|
766
|
+
project_id TEXT NOT NULL,
|
|
767
|
+
id TEXT NOT NULL,
|
|
768
|
+
email TEXT NOT NULL,
|
|
769
|
+
display_name TEXT,
|
|
770
|
+
avatar_url TEXT,
|
|
771
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'suspended')),
|
|
772
|
+
created_at TEXT NOT NULL,
|
|
773
|
+
updated_at TEXT NOT NULL,
|
|
774
|
+
PRIMARY KEY (project_id, id)
|
|
775
|
+
);
|
|
776
|
+
|
|
777
|
+
CREATE UNIQUE INDEX idx_auth_users_project_email
|
|
778
|
+
ON auth_users(project_id, email);
|
|
779
|
+
CREATE INDEX idx_auth_users_project_status_created
|
|
780
|
+
ON auth_users(project_id, status, created_at DESC);
|
|
781
|
+
CREATE INDEX idx_auth_users_project_created
|
|
782
|
+
ON auth_users(project_id, created_at DESC);
|
|
783
|
+
|
|
784
|
+
CREATE TABLE auth_user_identities (
|
|
785
|
+
project_id TEXT NOT NULL,
|
|
786
|
+
strategy_id TEXT NOT NULL,
|
|
787
|
+
subject TEXT NOT NULL,
|
|
788
|
+
user_id TEXT NOT NULL,
|
|
789
|
+
claims TEXT,
|
|
790
|
+
created_at TEXT NOT NULL,
|
|
791
|
+
updated_at TEXT NOT NULL,
|
|
792
|
+
PRIMARY KEY (project_id, strategy_id, subject)
|
|
793
|
+
);
|
|
794
|
+
|
|
795
|
+
CREATE INDEX idx_auth_user_identities_user
|
|
796
|
+
ON auth_user_identities(project_id, user_id);
|
|
797
|
+
|
|
798
|
+
CREATE TABLE auth_service_accounts (
|
|
799
|
+
project_id TEXT NOT NULL,
|
|
800
|
+
id TEXT NOT NULL,
|
|
801
|
+
name TEXT NOT NULL,
|
|
802
|
+
description TEXT,
|
|
803
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'suspended')),
|
|
804
|
+
created_by_principal_type TEXT CHECK (
|
|
805
|
+
created_by_principal_type IS NULL
|
|
806
|
+
OR created_by_principal_type IN ('user', 'serviceAccount', 'system')
|
|
807
|
+
),
|
|
808
|
+
created_by_principal_id TEXT,
|
|
809
|
+
created_by_session_id TEXT,
|
|
810
|
+
created_at TEXT NOT NULL,
|
|
811
|
+
updated_at TEXT NOT NULL,
|
|
812
|
+
PRIMARY KEY (project_id, id)
|
|
813
|
+
);
|
|
814
|
+
|
|
815
|
+
CREATE INDEX idx_auth_service_accounts_project_status_created
|
|
816
|
+
ON auth_service_accounts(project_id, status, created_at DESC);
|
|
817
|
+
CREATE INDEX idx_auth_service_accounts_project_created
|
|
818
|
+
ON auth_service_accounts(project_id, created_at DESC);
|
|
819
|
+
|
|
820
|
+
CREATE TABLE auth_service_account_group_memberships (
|
|
821
|
+
project_id TEXT NOT NULL,
|
|
822
|
+
service_account_id TEXT NOT NULL,
|
|
823
|
+
group_id TEXT NOT NULL,
|
|
824
|
+
source TEXT NOT NULL CHECK (source IN ('invitation', 'manual', 'agent')),
|
|
825
|
+
created_at TEXT NOT NULL,
|
|
826
|
+
PRIMARY KEY (project_id, service_account_id, group_id)
|
|
827
|
+
);
|
|
828
|
+
|
|
829
|
+
CREATE INDEX idx_auth_service_account_group_memberships_group
|
|
830
|
+
ON auth_service_account_group_memberships(project_id, group_id);
|
|
831
|
+
|
|
832
|
+
CREATE TABLE auth_sessions (
|
|
833
|
+
project_id TEXT NOT NULL,
|
|
834
|
+
id TEXT NOT NULL,
|
|
835
|
+
user_id TEXT NOT NULL,
|
|
836
|
+
strategy_id TEXT NOT NULL,
|
|
837
|
+
audience TEXT NOT NULL DEFAULT 'atlas',
|
|
838
|
+
token_hash TEXT NOT NULL,
|
|
839
|
+
created_at TEXT NOT NULL,
|
|
840
|
+
expires_at TEXT NOT NULL,
|
|
841
|
+
absolute_expires_at TEXT,
|
|
842
|
+
revoked_at TEXT,
|
|
843
|
+
last_seen_at TEXT,
|
|
844
|
+
user_agent TEXT,
|
|
845
|
+
ip_address TEXT,
|
|
846
|
+
PRIMARY KEY (project_id, id)
|
|
847
|
+
);
|
|
848
|
+
|
|
849
|
+
CREATE INDEX idx_auth_sessions_user_active
|
|
850
|
+
ON auth_sessions(project_id, user_id, audience, revoked_at, expires_at);
|
|
851
|
+
CREATE INDEX idx_auth_sessions_token
|
|
852
|
+
ON auth_sessions(project_id, id, token_hash);
|
|
853
|
+
|
|
854
|
+
CREATE TABLE auth_access_tokens (
|
|
855
|
+
project_id TEXT NOT NULL,
|
|
856
|
+
id TEXT NOT NULL,
|
|
857
|
+
name TEXT NOT NULL,
|
|
858
|
+
kind TEXT NOT NULL CHECK (kind IN ('personal', 'serviceAccount')),
|
|
859
|
+
subject_type TEXT NOT NULL CHECK (subject_type IN ('user', 'serviceAccount')),
|
|
860
|
+
subject_id TEXT NOT NULL,
|
|
861
|
+
token_hash TEXT NOT NULL,
|
|
862
|
+
group_ids TEXT,
|
|
863
|
+
created_by_principal_type TEXT CHECK (
|
|
864
|
+
created_by_principal_type IS NULL
|
|
865
|
+
OR created_by_principal_type IN ('user', 'serviceAccount', 'system')
|
|
866
|
+
),
|
|
867
|
+
created_by_principal_id TEXT,
|
|
868
|
+
created_by_session_id TEXT,
|
|
869
|
+
created_at TEXT NOT NULL,
|
|
870
|
+
expires_at TEXT NOT NULL,
|
|
871
|
+
revoked_at TEXT,
|
|
872
|
+
last_used_at TEXT,
|
|
873
|
+
last_used_user_agent TEXT,
|
|
874
|
+
last_used_ip_address TEXT,
|
|
875
|
+
PRIMARY KEY (project_id, id),
|
|
876
|
+
CHECK (
|
|
877
|
+
(kind = 'personal' AND subject_type = 'user')
|
|
878
|
+
OR (kind = 'serviceAccount' AND subject_type = 'serviceAccount')
|
|
879
|
+
)
|
|
880
|
+
);
|
|
881
|
+
|
|
882
|
+
CREATE INDEX idx_auth_access_tokens_lookup
|
|
883
|
+
ON auth_access_tokens(project_id, id, kind, token_hash, revoked_at, expires_at);
|
|
884
|
+
CREATE INDEX idx_auth_access_tokens_subject_created
|
|
885
|
+
ON auth_access_tokens(project_id, subject_type, subject_id, created_at DESC);
|
|
886
|
+
|
|
887
|
+
CREATE TABLE auth_invitations (
|
|
888
|
+
project_id TEXT NOT NULL,
|
|
889
|
+
id TEXT NOT NULL,
|
|
890
|
+
email TEXT NOT NULL,
|
|
891
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'accepted', 'revoked')),
|
|
892
|
+
created_by_principal_type TEXT CHECK (
|
|
893
|
+
created_by_principal_type IS NULL
|
|
894
|
+
OR created_by_principal_type IN ('user', 'serviceAccount', 'system')
|
|
895
|
+
),
|
|
896
|
+
created_by_principal_id TEXT,
|
|
897
|
+
created_by_session_id TEXT,
|
|
898
|
+
created_at TEXT NOT NULL,
|
|
899
|
+
updated_at TEXT NOT NULL,
|
|
900
|
+
expires_at TEXT NOT NULL,
|
|
901
|
+
accepted_at TEXT,
|
|
902
|
+
revoked_at TEXT,
|
|
903
|
+
PRIMARY KEY (project_id, id)
|
|
904
|
+
);
|
|
905
|
+
|
|
906
|
+
CREATE INDEX idx_auth_invitations_project_email
|
|
907
|
+
ON auth_invitations(project_id, email, status, expires_at);
|
|
908
|
+
CREATE INDEX idx_auth_invitations_project_status_created
|
|
909
|
+
ON auth_invitations(project_id, status, created_at DESC);
|
|
910
|
+
|
|
911
|
+
CREATE TABLE auth_invitation_groups (
|
|
912
|
+
project_id TEXT NOT NULL,
|
|
913
|
+
invitation_id TEXT NOT NULL,
|
|
914
|
+
group_id TEXT NOT NULL,
|
|
915
|
+
position INTEGER NOT NULL CHECK (position >= 0),
|
|
916
|
+
PRIMARY KEY (project_id, invitation_id, group_id)
|
|
917
|
+
);
|
|
918
|
+
|
|
919
|
+
CREATE INDEX idx_auth_invitation_groups_group
|
|
920
|
+
ON auth_invitation_groups(project_id, group_id);
|
|
921
|
+
CREATE INDEX idx_auth_invitation_groups_invitation_position
|
|
922
|
+
ON auth_invitation_groups(project_id, invitation_id, position);
|
|
923
|
+
|
|
924
|
+
CREATE TABLE auth_group_memberships (
|
|
925
|
+
project_id TEXT NOT NULL,
|
|
926
|
+
user_id TEXT NOT NULL,
|
|
927
|
+
group_id TEXT NOT NULL,
|
|
928
|
+
source TEXT NOT NULL CHECK (source IN ('invitation', 'manual', 'agent')),
|
|
929
|
+
created_at TEXT NOT NULL,
|
|
930
|
+
PRIMARY KEY (project_id, user_id, group_id)
|
|
931
|
+
);
|
|
932
|
+
|
|
933
|
+
CREATE INDEX idx_auth_group_memberships_group
|
|
934
|
+
ON auth_group_memberships(project_id, group_id);
|
|
935
|
+
|
|
936
|
+
CREATE TABLE auth_magic_links (
|
|
937
|
+
project_id TEXT NOT NULL,
|
|
938
|
+
id TEXT NOT NULL,
|
|
939
|
+
strategy_id TEXT NOT NULL,
|
|
940
|
+
audience TEXT NOT NULL DEFAULT 'atlas',
|
|
941
|
+
email TEXT NOT NULL,
|
|
942
|
+
token_hash TEXT NOT NULL,
|
|
943
|
+
return_to TEXT,
|
|
944
|
+
created_at TEXT NOT NULL,
|
|
945
|
+
expires_at TEXT NOT NULL,
|
|
946
|
+
consumed_at TEXT,
|
|
947
|
+
revoked_at TEXT,
|
|
948
|
+
PRIMARY KEY (project_id, id)
|
|
949
|
+
);
|
|
950
|
+
|
|
951
|
+
CREATE INDEX idx_auth_magic_links_email_active
|
|
952
|
+
ON auth_magic_links(project_id, email, consumed_at, revoked_at, expires_at);
|
|
953
|
+
|
|
954
|
+
CREATE TABLE auth_oidc_authorization_attempts (
|
|
955
|
+
project_id TEXT NOT NULL,
|
|
956
|
+
id TEXT NOT NULL,
|
|
957
|
+
strategy_id TEXT NOT NULL,
|
|
958
|
+
audience TEXT NOT NULL DEFAULT 'atlas',
|
|
959
|
+
state_hash TEXT NOT NULL,
|
|
960
|
+
nonce_hash TEXT NOT NULL,
|
|
961
|
+
code_verifier TEXT NOT NULL,
|
|
962
|
+
return_to TEXT,
|
|
963
|
+
created_at TEXT NOT NULL,
|
|
964
|
+
expires_at TEXT NOT NULL,
|
|
965
|
+
consumed_at TEXT,
|
|
966
|
+
PRIMARY KEY (project_id, id)
|
|
967
|
+
);
|
|
968
|
+
|
|
969
|
+
CREATE INDEX idx_auth_oidc_attempts_active
|
|
970
|
+
ON auth_oidc_authorization_attempts(project_id, strategy_id, consumed_at, expires_at);
|
|
971
|
+
|
|
972
|
+
CREATE TABLE agent_threads (
|
|
973
|
+
project_id TEXT NOT NULL,
|
|
974
|
+
id TEXT NOT NULL,
|
|
975
|
+
agent_id TEXT NOT NULL,
|
|
976
|
+
owner_principal_type TEXT NOT NULL,
|
|
977
|
+
owner_principal_id TEXT NOT NULL,
|
|
978
|
+
title TEXT,
|
|
979
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'archived')),
|
|
980
|
+
active_run_id TEXT,
|
|
981
|
+
last_message_at TEXT,
|
|
982
|
+
message_count INTEGER NOT NULL DEFAULT 0 CHECK (message_count >= 0),
|
|
983
|
+
created_at TEXT NOT NULL,
|
|
984
|
+
updated_at TEXT NOT NULL,
|
|
985
|
+
PRIMARY KEY (project_id, id)
|
|
986
|
+
);
|
|
987
|
+
|
|
988
|
+
CREATE INDEX idx_agent_threads_project_activity
|
|
989
|
+
ON agent_threads(project_id, COALESCE(last_message_at, created_at) DESC);
|
|
990
|
+
CREATE INDEX idx_agent_threads_project_agent_activity
|
|
991
|
+
ON agent_threads(project_id, agent_id, COALESCE(last_message_at, created_at) DESC);
|
|
992
|
+
CREATE INDEX idx_agent_threads_project_status_activity
|
|
993
|
+
ON agent_threads(project_id, status, COALESCE(last_message_at, created_at) DESC);
|
|
994
|
+
CREATE INDEX idx_agent_threads_project_owner_activity
|
|
995
|
+
ON agent_threads(project_id, owner_principal_type, owner_principal_id, COALESCE(last_message_at, created_at) DESC);
|
|
996
|
+
|
|
997
|
+
CREATE TABLE agent_runs (
|
|
998
|
+
project_id TEXT NOT NULL,
|
|
999
|
+
id TEXT NOT NULL,
|
|
1000
|
+
thread_id TEXT NOT NULL,
|
|
1001
|
+
agent_id TEXT NOT NULL,
|
|
1002
|
+
trigger_message_id TEXT NOT NULL,
|
|
1003
|
+
requested_by_principal_type TEXT NOT NULL DEFAULT 'system' CHECK (
|
|
1004
|
+
requested_by_principal_type IN ('user', 'serviceAccount', 'system')
|
|
1005
|
+
),
|
|
1006
|
+
requested_by_principal_id TEXT NOT NULL DEFAULT 'system',
|
|
1007
|
+
execution_principal_type TEXT CHECK (
|
|
1008
|
+
execution_principal_type IS NULL OR execution_principal_type = 'serviceAccount'
|
|
1009
|
+
),
|
|
1010
|
+
execution_principal_id TEXT,
|
|
1011
|
+
status TEXT NOT NULL CHECK (
|
|
1012
|
+
status IN ('queued', 'running', 'succeeded', 'failed', 'cancelled')
|
|
1013
|
+
),
|
|
1014
|
+
model_id TEXT,
|
|
1015
|
+
finish_reason TEXT,
|
|
1016
|
+
usage_input_tokens INTEGER CHECK (usage_input_tokens IS NULL OR usage_input_tokens >= 0),
|
|
1017
|
+
usage_output_tokens INTEGER CHECK (usage_output_tokens IS NULL OR usage_output_tokens >= 0),
|
|
1018
|
+
usage_total_tokens INTEGER CHECK (usage_total_tokens IS NULL OR usage_total_tokens >= 0),
|
|
1019
|
+
usage_reasoning_tokens INTEGER CHECK (usage_reasoning_tokens IS NULL OR usage_reasoning_tokens >= 0),
|
|
1020
|
+
usage_cached_input_tokens INTEGER CHECK (
|
|
1021
|
+
usage_cached_input_tokens IS NULL OR usage_cached_input_tokens >= 0
|
|
1022
|
+
),
|
|
1023
|
+
error TEXT,
|
|
1024
|
+
diagnostics TEXT,
|
|
1025
|
+
attempt INTEGER NOT NULL DEFAULT 0 CHECK (attempt >= 0),
|
|
1026
|
+
execution_token TEXT,
|
|
1027
|
+
execution_queue_lease_expires_at TEXT,
|
|
1028
|
+
created_at TEXT NOT NULL,
|
|
1029
|
+
started_at TEXT,
|
|
1030
|
+
completed_at TEXT,
|
|
1031
|
+
PRIMARY KEY (project_id, id),
|
|
1032
|
+
CHECK (
|
|
1033
|
+
(execution_token IS NULL) = (execution_queue_lease_expires_at IS NULL)
|
|
1034
|
+
)
|
|
1035
|
+
);
|
|
1036
|
+
|
|
1037
|
+
CREATE INDEX idx_agent_runs_project_started
|
|
1038
|
+
ON agent_runs(project_id, COALESCE(started_at, created_at) DESC);
|
|
1039
|
+
CREATE INDEX idx_agent_runs_project_thread_started
|
|
1040
|
+
ON agent_runs(project_id, thread_id, COALESCE(started_at, created_at) DESC);
|
|
1041
|
+
CREATE INDEX idx_agent_runs_project_agent_started
|
|
1042
|
+
ON agent_runs(project_id, agent_id, COALESCE(started_at, created_at) DESC);
|
|
1043
|
+
CREATE INDEX idx_agent_runs_project_status_started
|
|
1044
|
+
ON agent_runs(project_id, status, COALESCE(started_at, created_at) DESC);
|
|
1045
|
+
|
|
1046
|
+
CREATE TABLE agent_messages (
|
|
1047
|
+
project_id TEXT NOT NULL,
|
|
1048
|
+
id TEXT NOT NULL,
|
|
1049
|
+
thread_id TEXT NOT NULL,
|
|
1050
|
+
run_id TEXT,
|
|
1051
|
+
role TEXT NOT NULL CHECK (role IN ('system', 'user', 'assistant')),
|
|
1052
|
+
author_principal_type TEXT CHECK (
|
|
1053
|
+
author_principal_type IS NULL OR author_principal_type IN ('user', 'serviceAccount', 'system')
|
|
1054
|
+
),
|
|
1055
|
+
author_principal_id TEXT,
|
|
1056
|
+
seq INTEGER NOT NULL CHECK (seq >= 1),
|
|
1057
|
+
parts TEXT NOT NULL,
|
|
1058
|
+
metadata TEXT,
|
|
1059
|
+
content_version INTEGER NOT NULL CHECK (content_version >= 1),
|
|
1060
|
+
created_at TEXT NOT NULL,
|
|
1061
|
+
completed_at TEXT,
|
|
1062
|
+
PRIMARY KEY (project_id, id)
|
|
1063
|
+
);
|
|
1064
|
+
|
|
1065
|
+
CREATE UNIQUE INDEX idx_agent_messages_thread_seq
|
|
1066
|
+
ON agent_messages(project_id, thread_id, seq);
|
|
1067
|
+
CREATE INDEX idx_agent_messages_project_thread_role
|
|
1068
|
+
ON agent_messages(project_id, thread_id, role, seq);
|