@vitest-agent/sdk 3.1.1 → 4.0.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 +23 -19
- package/dispatch.d.ts +25 -6
- package/formatters/markdown.js +1 -0
- package/formatters/terminal.js +4 -3
- package/index.d.ts +448 -2341
- package/index.js +10 -68
- package/internal-inject-env.js +5 -7
- package/package.json +3 -19
- package/schemas/run-report-file-1.0.0.json +18 -18
- package/sidecar-dispatch.js +7 -5
- package/utils/format-console.js +9 -10
- package/utils/format-terminal.js +7 -7
- package/utils/posix-path.js +52 -0
- package/utils/test-location.js +11 -5
- package/version.js +17 -0
- package/layers/ConfigLive.js +0 -46
- package/layers/DataReaderLive.js +0 -1923
- package/layers/DataStoreLive.js +0 -1287
- package/layers/DetailResolverLive.js +0 -9
- package/layers/DiscoveryRegistryLive.js +0 -70
- package/layers/EnvironmentDetectorLive.js +0 -21
- package/layers/EnvironmentDetectorTest.js +0 -13
- package/layers/ExecutorResolverLive.js +0 -9
- package/layers/FormatSelectorLive.js +0 -20
- package/layers/HistoryTrackerLive.js +0 -49
- package/layers/HistoryTrackerTest.js +0 -25
- package/layers/LoggerLive.js +0 -64
- package/layers/OutputPipelineLive.js +0 -13
- package/layers/OutputRendererLive.js +0 -28
- package/layers/PathResolutionLive.js +0 -40
- package/layers/PerClientSessionMapLive.js +0 -145
- package/layers/ProjectDiscoveryLive.js +0 -68
- package/layers/ProjectDiscoveryTest.js +0 -12
- package/layers/ProjectIdentityLive.js +0 -96
- package/layers/RunContextLive.js +0 -81
- package/lib/format-triage.js +0 -103
- package/lib/format-wrapup.js +0 -67
- package/migrations/0001_initial.js +0 -824
- package/migrations/0002_test_artifacts.js +0 -30
- package/migrations/index.js +0 -26
- package/migrations/registry_0001_initial.js +0 -39
- package/migrations/session_map_0001_initial.js +0 -38
- package/services/Config.js +0 -15
- package/services/DataReader.js +0 -8
- package/services/DataStore.js +0 -15
- package/services/DetailResolver.js +0 -8
- package/services/DiscoveryRegistry.js +0 -8
- package/services/EnvironmentDetector.js +0 -8
- package/services/ExecutorResolver.js +0 -8
- package/services/FormatSelector.js +0 -8
- package/services/HistoryTracker.js +0 -20
- package/services/OutputRenderer.js +0 -8
- package/services/PerClientSessionMap.js +0 -22
- package/services/ProjectDiscovery.js +0 -8
- package/services/ProjectIdentity.js +0 -63
- package/services/RunContext.js +0 -53
- package/services/idempotency.js +0 -58
- package/sql/assemblers.js +0 -69
- package/testing/layers.js +0 -21
- package/testing.d.ts +0 -1862
- package/testing.js +0 -254
- package/utils/ensure-migrated.js +0 -52
- package/utils/failure-signature.js +0 -34
- package/utils/resolve-data-path.js +0 -65
- package/utils/resolve-project-key-from-cwd.js +0 -53
- package/utils/resolve-workspace-key.js +0 -41
|
@@ -1,824 +0,0 @@
|
|
|
1
|
-
import { Effect } from "effect";
|
|
2
|
-
import { SqlClient } from "effect/unstable/sql/SqlClient";
|
|
3
|
-
|
|
4
|
-
//#region src/migrations/0001_initial.ts
|
|
5
|
-
/** @internal */
|
|
6
|
-
const migration = Effect.gen(function* () {
|
|
7
|
-
const sql = yield* SqlClient;
|
|
8
|
-
yield* sql`PRAGMA journal_mode=WAL`;
|
|
9
|
-
yield* sql`PRAGMA foreign_keys=ON`;
|
|
10
|
-
yield* sql`
|
|
11
|
-
CREATE TABLE files (
|
|
12
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
13
|
-
path TEXT NOT NULL UNIQUE
|
|
14
|
-
)
|
|
15
|
-
`;
|
|
16
|
-
yield* sql`
|
|
17
|
-
CREATE TABLE settings (
|
|
18
|
-
hash TEXT PRIMARY KEY,
|
|
19
|
-
vitest_version TEXT NOT NULL,
|
|
20
|
-
pool TEXT,
|
|
21
|
-
environment TEXT,
|
|
22
|
-
test_timeout INTEGER,
|
|
23
|
-
hook_timeout INTEGER,
|
|
24
|
-
slow_test_threshold INTEGER,
|
|
25
|
-
max_concurrency INTEGER,
|
|
26
|
-
max_workers INTEGER,
|
|
27
|
-
isolate INTEGER CHECK (isolate IN (0, 1)),
|
|
28
|
-
bail INTEGER,
|
|
29
|
-
globals INTEGER CHECK (globals IN (0, 1)),
|
|
30
|
-
file_parallelism INTEGER CHECK (file_parallelism IN (0, 1)),
|
|
31
|
-
sequence_seed INTEGER,
|
|
32
|
-
coverage_provider TEXT,
|
|
33
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
34
|
-
)
|
|
35
|
-
`;
|
|
36
|
-
yield* sql`
|
|
37
|
-
CREATE TABLE settings_env_vars (
|
|
38
|
-
settings_hash TEXT NOT NULL REFERENCES settings(hash) ON DELETE CASCADE,
|
|
39
|
-
key TEXT NOT NULL,
|
|
40
|
-
value TEXT NOT NULL,
|
|
41
|
-
PRIMARY KEY (settings_hash, key)
|
|
42
|
-
)
|
|
43
|
-
`;
|
|
44
|
-
yield* sql`
|
|
45
|
-
CREATE TABLE test_runs (
|
|
46
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
47
|
-
invocation_id TEXT NOT NULL,
|
|
48
|
-
project TEXT NOT NULL,
|
|
49
|
-
settings_hash TEXT NOT NULL REFERENCES settings(hash),
|
|
50
|
-
timestamp TEXT NOT NULL,
|
|
51
|
-
commit_sha TEXT,
|
|
52
|
-
branch TEXT,
|
|
53
|
-
reason TEXT NOT NULL CHECK (reason IN ('passed', 'failed', 'interrupted')),
|
|
54
|
-
duration INTEGER NOT NULL,
|
|
55
|
-
total INTEGER NOT NULL,
|
|
56
|
-
passed INTEGER NOT NULL,
|
|
57
|
-
failed INTEGER NOT NULL,
|
|
58
|
-
skipped INTEGER NOT NULL,
|
|
59
|
-
scoped INTEGER NOT NULL DEFAULT 0 CHECK (scoped IN (0, 1)),
|
|
60
|
-
snapshot_added INTEGER DEFAULT 0,
|
|
61
|
-
snapshot_matched INTEGER DEFAULT 0,
|
|
62
|
-
snapshot_unmatched INTEGER DEFAULT 0,
|
|
63
|
-
snapshot_updated INTEGER DEFAULT 0,
|
|
64
|
-
snapshot_unchecked INTEGER DEFAULT 0,
|
|
65
|
-
snapshot_total INTEGER DEFAULT 0,
|
|
66
|
-
snapshot_failure INTEGER DEFAULT 0 CHECK (snapshot_failure IN (0, 1)),
|
|
67
|
-
snapshot_did_update INTEGER DEFAULT 0 CHECK (snapshot_did_update IN (0, 1)),
|
|
68
|
-
snapshot_files_added INTEGER DEFAULT 0,
|
|
69
|
-
snapshot_files_removed INTEGER DEFAULT 0,
|
|
70
|
-
snapshot_files_unmatched INTEGER DEFAULT 0,
|
|
71
|
-
snapshot_files_updated INTEGER DEFAULT 0,
|
|
72
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
73
|
-
actor_type TEXT NOT NULL DEFAULT 'system' CHECK (actor_type IN ('agent', 'user', 'system')),
|
|
74
|
-
agent_id TEXT,
|
|
75
|
-
conversation_id TEXT,
|
|
76
|
-
git_branch TEXT,
|
|
77
|
-
git_commit_sha TEXT,
|
|
78
|
-
git_dirty INTEGER CHECK (git_dirty IS NULL OR git_dirty IN (0, 1)),
|
|
79
|
-
git_upstream TEXT,
|
|
80
|
-
git_worktree_dir TEXT,
|
|
81
|
-
host_source TEXT,
|
|
82
|
-
host_value TEXT,
|
|
83
|
-
host_metadata TEXT,
|
|
84
|
-
CHECK (
|
|
85
|
-
(actor_type = 'agent' AND agent_id IS NOT NULL)
|
|
86
|
-
OR (actor_type IN ('user', 'system') AND agent_id IS NULL)
|
|
87
|
-
),
|
|
88
|
-
CHECK ((actor_type = 'agent') OR (conversation_id IS NULL))
|
|
89
|
-
)
|
|
90
|
-
`;
|
|
91
|
-
yield* sql`CREATE INDEX idx_test_runs_project ON test_runs(project)`;
|
|
92
|
-
yield* sql`CREATE INDEX idx_test_runs_timestamp ON test_runs(timestamp)`;
|
|
93
|
-
yield* sql`CREATE INDEX idx_test_runs_invocation ON test_runs(invocation_id)`;
|
|
94
|
-
yield* sql`CREATE INDEX idx_test_runs_settings ON test_runs(settings_hash, project)`;
|
|
95
|
-
yield* sql`CREATE INDEX idx_test_runs_agent ON test_runs(agent_id)`;
|
|
96
|
-
yield* sql`CREATE INDEX idx_test_runs_conversation ON test_runs(conversation_id)`;
|
|
97
|
-
yield* sql`CREATE INDEX idx_test_runs_git_commit ON test_runs(git_commit_sha)`;
|
|
98
|
-
yield* sql`CREATE INDEX idx_test_runs_git_branch_created ON test_runs(git_branch, created_at)`;
|
|
99
|
-
yield* sql`CREATE INDEX idx_test_runs_host ON test_runs(host_source, host_value)`;
|
|
100
|
-
yield* sql`
|
|
101
|
-
CREATE TABLE scoped_files (
|
|
102
|
-
run_id INTEGER NOT NULL REFERENCES test_runs(id) ON DELETE CASCADE,
|
|
103
|
-
file_id INTEGER NOT NULL REFERENCES files(id),
|
|
104
|
-
PRIMARY KEY (run_id, file_id)
|
|
105
|
-
)
|
|
106
|
-
`;
|
|
107
|
-
yield* sql`
|
|
108
|
-
CREATE TABLE test_modules (
|
|
109
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
110
|
-
run_id INTEGER NOT NULL REFERENCES test_runs(id) ON DELETE CASCADE,
|
|
111
|
-
file_id INTEGER NOT NULL REFERENCES files(id),
|
|
112
|
-
relative_module_id TEXT NOT NULL,
|
|
113
|
-
state TEXT NOT NULL CHECK (state IN (
|
|
114
|
-
'queued', 'pending', 'passed', 'failed', 'skipped'
|
|
115
|
-
)),
|
|
116
|
-
duration INTEGER,
|
|
117
|
-
environment_setup_duration INTEGER,
|
|
118
|
-
prepare_duration INTEGER,
|
|
119
|
-
collect_duration INTEGER,
|
|
120
|
-
setup_duration INTEGER,
|
|
121
|
-
heap INTEGER,
|
|
122
|
-
UNIQUE(run_id, file_id)
|
|
123
|
-
)
|
|
124
|
-
`;
|
|
125
|
-
yield* sql`CREATE INDEX idx_test_modules_run ON test_modules(run_id)`;
|
|
126
|
-
yield* sql`
|
|
127
|
-
CREATE TABLE test_suites (
|
|
128
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
129
|
-
module_id INTEGER NOT NULL REFERENCES test_modules(id) ON DELETE CASCADE,
|
|
130
|
-
parent_suite_id INTEGER REFERENCES test_suites(id) ON DELETE CASCADE,
|
|
131
|
-
name TEXT NOT NULL,
|
|
132
|
-
full_name TEXT NOT NULL,
|
|
133
|
-
state TEXT NOT NULL CHECK (state IN ('pending', 'passed', 'failed', 'skipped')),
|
|
134
|
-
mode TEXT CHECK (mode IN ('run', 'only', 'skip', 'todo')),
|
|
135
|
-
concurrent INTEGER CHECK (concurrent IN (0, 1)),
|
|
136
|
-
shuffle INTEGER CHECK (shuffle IN (0, 1)),
|
|
137
|
-
retry INTEGER,
|
|
138
|
-
repeats INTEGER,
|
|
139
|
-
location_line INTEGER,
|
|
140
|
-
location_column INTEGER
|
|
141
|
-
)
|
|
142
|
-
`;
|
|
143
|
-
yield* sql`CREATE INDEX idx_test_suites_module ON test_suites(module_id)`;
|
|
144
|
-
yield* sql`
|
|
145
|
-
CREATE TABLE test_cases (
|
|
146
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
147
|
-
module_id INTEGER NOT NULL REFERENCES test_modules(id) ON DELETE CASCADE,
|
|
148
|
-
suite_id INTEGER REFERENCES test_suites(id) ON DELETE CASCADE,
|
|
149
|
-
vitest_id TEXT,
|
|
150
|
-
name TEXT NOT NULL,
|
|
151
|
-
full_name TEXT NOT NULL,
|
|
152
|
-
state TEXT NOT NULL CHECK (state IN ('passed', 'failed', 'skipped', 'pending')),
|
|
153
|
-
classification TEXT CHECK (classification IN (
|
|
154
|
-
'stable', 'new-failure', 'persistent', 'flaky', 'recovered'
|
|
155
|
-
)),
|
|
156
|
-
duration INTEGER,
|
|
157
|
-
start_time INTEGER,
|
|
158
|
-
flaky INTEGER CHECK (flaky IN (0, 1)),
|
|
159
|
-
slow INTEGER CHECK (slow IN (0, 1)),
|
|
160
|
-
retry_count INTEGER DEFAULT 0,
|
|
161
|
-
repeat_count INTEGER DEFAULT 0,
|
|
162
|
-
heap INTEGER,
|
|
163
|
-
mode TEXT CHECK (mode IN ('run', 'only', 'skip', 'todo')),
|
|
164
|
-
each INTEGER CHECK (each IN (0, 1)),
|
|
165
|
-
fails INTEGER CHECK (fails IN (0, 1)),
|
|
166
|
-
concurrent INTEGER CHECK (concurrent IN (0, 1)),
|
|
167
|
-
shuffle INTEGER CHECK (shuffle IN (0, 1)),
|
|
168
|
-
timeout INTEGER,
|
|
169
|
-
skip_note TEXT,
|
|
170
|
-
location_line INTEGER,
|
|
171
|
-
location_column INTEGER,
|
|
172
|
-
created_turn_id INTEGER REFERENCES turns(id) ON DELETE SET NULL
|
|
173
|
-
)
|
|
174
|
-
`;
|
|
175
|
-
yield* sql`CREATE INDEX idx_test_cases_module ON test_cases(module_id)`;
|
|
176
|
-
yield* sql`CREATE INDEX idx_test_cases_suite ON test_cases(suite_id)`;
|
|
177
|
-
yield* sql`CREATE INDEX idx_test_cases_full_name ON test_cases(full_name)`;
|
|
178
|
-
yield* sql`CREATE INDEX idx_test_cases_state ON test_cases(state)`;
|
|
179
|
-
yield* sql`CREATE INDEX idx_test_cases_module_state ON test_cases(module_id, state)`;
|
|
180
|
-
yield* sql`CREATE INDEX idx_test_cases_created_turn ON test_cases(created_turn_id)`;
|
|
181
|
-
yield* sql`
|
|
182
|
-
CREATE TABLE test_errors (
|
|
183
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
184
|
-
run_id INTEGER NOT NULL REFERENCES test_runs(id) ON DELETE CASCADE,
|
|
185
|
-
test_case_id INTEGER REFERENCES test_cases(id) ON DELETE CASCADE,
|
|
186
|
-
test_suite_id INTEGER REFERENCES test_suites(id) ON DELETE CASCADE,
|
|
187
|
-
module_id INTEGER REFERENCES test_modules(id) ON DELETE CASCADE,
|
|
188
|
-
scope TEXT NOT NULL CHECK (scope IN ('test', 'suite', 'module', 'unhandled')),
|
|
189
|
-
name TEXT,
|
|
190
|
-
message TEXT NOT NULL,
|
|
191
|
-
diff TEXT,
|
|
192
|
-
actual TEXT,
|
|
193
|
-
expected TEXT,
|
|
194
|
-
stack TEXT,
|
|
195
|
-
cause_error_id INTEGER REFERENCES test_errors(id),
|
|
196
|
-
ordinal INTEGER NOT NULL DEFAULT 0,
|
|
197
|
-
signature_hash TEXT REFERENCES failure_signatures(signature_hash) ON DELETE SET NULL
|
|
198
|
-
)
|
|
199
|
-
`;
|
|
200
|
-
yield* sql`CREATE INDEX idx_test_errors_run ON test_errors(run_id)`;
|
|
201
|
-
yield* sql`CREATE INDEX idx_test_errors_case ON test_errors(test_case_id)`;
|
|
202
|
-
yield* sql`CREATE INDEX idx_test_errors_name ON test_errors(name)`;
|
|
203
|
-
yield* sql`CREATE INDEX idx_test_errors_scope ON test_errors(run_id, scope)`;
|
|
204
|
-
yield* sql`CREATE INDEX idx_test_errors_signature ON test_errors(signature_hash)`;
|
|
205
|
-
yield* sql`
|
|
206
|
-
CREATE TABLE stack_frames (
|
|
207
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
208
|
-
error_id INTEGER NOT NULL REFERENCES test_errors(id) ON DELETE CASCADE,
|
|
209
|
-
ordinal INTEGER NOT NULL,
|
|
210
|
-
method TEXT,
|
|
211
|
-
file_id INTEGER REFERENCES files(id),
|
|
212
|
-
line INTEGER,
|
|
213
|
-
col INTEGER,
|
|
214
|
-
source_mapped_line INTEGER,
|
|
215
|
-
function_boundary_line INTEGER
|
|
216
|
-
)
|
|
217
|
-
`;
|
|
218
|
-
yield* sql`CREATE INDEX idx_stack_frames_error ON stack_frames(error_id)`;
|
|
219
|
-
yield* sql`
|
|
220
|
-
CREATE TABLE tags (
|
|
221
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
222
|
-
name TEXT NOT NULL UNIQUE
|
|
223
|
-
)
|
|
224
|
-
`;
|
|
225
|
-
yield* sql`
|
|
226
|
-
CREATE TABLE test_case_tags (
|
|
227
|
-
test_case_id INTEGER NOT NULL REFERENCES test_cases(id) ON DELETE CASCADE,
|
|
228
|
-
tag_id INTEGER NOT NULL REFERENCES tags(id) ON DELETE CASCADE,
|
|
229
|
-
PRIMARY KEY (test_case_id, tag_id)
|
|
230
|
-
)
|
|
231
|
-
`;
|
|
232
|
-
yield* sql`
|
|
233
|
-
CREATE TABLE test_suite_tags (
|
|
234
|
-
test_suite_id INTEGER NOT NULL REFERENCES test_suites(id) ON DELETE CASCADE,
|
|
235
|
-
tag_id INTEGER NOT NULL REFERENCES tags(id) ON DELETE CASCADE,
|
|
236
|
-
PRIMARY KEY (test_suite_id, tag_id)
|
|
237
|
-
)
|
|
238
|
-
`;
|
|
239
|
-
yield* sql`
|
|
240
|
-
CREATE TABLE test_annotations (
|
|
241
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
242
|
-
test_case_id INTEGER NOT NULL REFERENCES test_cases(id) ON DELETE CASCADE,
|
|
243
|
-
type TEXT NOT NULL CHECK (type IN ('notice', 'warning', 'error')),
|
|
244
|
-
message TEXT NOT NULL,
|
|
245
|
-
location_file_id INTEGER REFERENCES files(id),
|
|
246
|
-
location_line INTEGER,
|
|
247
|
-
location_column INTEGER,
|
|
248
|
-
attachment_content_type TEXT,
|
|
249
|
-
attachment_path TEXT,
|
|
250
|
-
attachment_body TEXT
|
|
251
|
-
)
|
|
252
|
-
`;
|
|
253
|
-
yield* sql`CREATE INDEX idx_test_annotations_case ON test_annotations(test_case_id)`;
|
|
254
|
-
yield* sql`CREATE INDEX idx_test_annotations_type ON test_annotations(type)`;
|
|
255
|
-
yield* sql`
|
|
256
|
-
CREATE TABLE test_artifacts (
|
|
257
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
258
|
-
test_case_id INTEGER NOT NULL REFERENCES test_cases(id) ON DELETE CASCADE,
|
|
259
|
-
type TEXT NOT NULL,
|
|
260
|
-
message TEXT,
|
|
261
|
-
location_file_id INTEGER REFERENCES files(id),
|
|
262
|
-
location_line INTEGER,
|
|
263
|
-
location_column INTEGER
|
|
264
|
-
)
|
|
265
|
-
`;
|
|
266
|
-
yield* sql`CREATE INDEX idx_test_artifacts_case ON test_artifacts(test_case_id)`;
|
|
267
|
-
yield* sql`
|
|
268
|
-
CREATE TABLE attachments (
|
|
269
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
270
|
-
artifact_id INTEGER REFERENCES test_artifacts(id) ON DELETE CASCADE,
|
|
271
|
-
annotation_id INTEGER REFERENCES test_annotations(id) ON DELETE CASCADE,
|
|
272
|
-
content_type TEXT,
|
|
273
|
-
path TEXT,
|
|
274
|
-
body BLOB,
|
|
275
|
-
CHECK ((artifact_id IS NOT NULL) != (annotation_id IS NOT NULL))
|
|
276
|
-
)
|
|
277
|
-
`;
|
|
278
|
-
yield* sql`
|
|
279
|
-
CREATE TABLE import_durations (
|
|
280
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
281
|
-
module_id INTEGER NOT NULL REFERENCES test_modules(id) ON DELETE CASCADE,
|
|
282
|
-
file_id INTEGER NOT NULL REFERENCES files(id),
|
|
283
|
-
self_time REAL NOT NULL,
|
|
284
|
-
total_time REAL NOT NULL,
|
|
285
|
-
external INTEGER CHECK (external IN (0, 1)),
|
|
286
|
-
importer_file_id INTEGER REFERENCES files(id)
|
|
287
|
-
)
|
|
288
|
-
`;
|
|
289
|
-
yield* sql`CREATE INDEX idx_import_durations_module ON import_durations(module_id)`;
|
|
290
|
-
yield* sql`CREATE INDEX idx_import_durations_time ON import_durations(total_time)`;
|
|
291
|
-
yield* sql`CREATE INDEX idx_import_durations_importer ON import_durations(importer_file_id)`;
|
|
292
|
-
yield* sql`
|
|
293
|
-
CREATE TABLE task_metadata (
|
|
294
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
295
|
-
test_case_id INTEGER REFERENCES test_cases(id) ON DELETE CASCADE,
|
|
296
|
-
test_suite_id INTEGER REFERENCES test_suites(id) ON DELETE CASCADE,
|
|
297
|
-
module_id INTEGER REFERENCES test_modules(id) ON DELETE CASCADE,
|
|
298
|
-
key TEXT NOT NULL,
|
|
299
|
-
value TEXT NOT NULL,
|
|
300
|
-
CHECK (
|
|
301
|
-
(test_case_id IS NOT NULL) + (test_suite_id IS NOT NULL)
|
|
302
|
-
+ (module_id IS NOT NULL) = 1
|
|
303
|
-
)
|
|
304
|
-
)
|
|
305
|
-
`;
|
|
306
|
-
yield* sql`CREATE INDEX idx_task_metadata_key ON task_metadata(key)`;
|
|
307
|
-
yield* sql`
|
|
308
|
-
CREATE TABLE console_logs (
|
|
309
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
310
|
-
run_id INTEGER NOT NULL REFERENCES test_runs(id) ON DELETE CASCADE,
|
|
311
|
-
test_case_id INTEGER REFERENCES test_cases(id) ON DELETE CASCADE,
|
|
312
|
-
content TEXT NOT NULL,
|
|
313
|
-
type TEXT NOT NULL CHECK (type IN ('stdout', 'stderr')),
|
|
314
|
-
timestamp INTEGER NOT NULL,
|
|
315
|
-
origin TEXT
|
|
316
|
-
)
|
|
317
|
-
`;
|
|
318
|
-
yield* sql`CREATE INDEX idx_console_logs_test ON console_logs(test_case_id)`;
|
|
319
|
-
yield* sql`CREATE INDEX idx_console_logs_run ON console_logs(run_id)`;
|
|
320
|
-
yield* sql`
|
|
321
|
-
CREATE TABLE test_history (
|
|
322
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
323
|
-
run_id INTEGER NOT NULL REFERENCES test_runs(id) ON DELETE CASCADE,
|
|
324
|
-
project TEXT NOT NULL,
|
|
325
|
-
module_path TEXT NOT NULL,
|
|
326
|
-
full_name TEXT NOT NULL,
|
|
327
|
-
timestamp TEXT NOT NULL,
|
|
328
|
-
state TEXT NOT NULL CHECK (state IN ('passed', 'failed', 'skipped', 'pending')),
|
|
329
|
-
duration INTEGER,
|
|
330
|
-
flaky INTEGER CHECK (flaky IN (0, 1)),
|
|
331
|
-
retry_count INTEGER DEFAULT 0,
|
|
332
|
-
error_message TEXT,
|
|
333
|
-
UNIQUE(project, module_path, full_name, timestamp)
|
|
334
|
-
)
|
|
335
|
-
`;
|
|
336
|
-
yield* sql`CREATE INDEX idx_test_history_lookup ON test_history(project, module_path, full_name)`;
|
|
337
|
-
yield* sql`CREATE INDEX idx_test_history_full_name ON test_history(full_name, timestamp)`;
|
|
338
|
-
yield* sql`CREATE INDEX idx_test_history_run ON test_history(run_id)`;
|
|
339
|
-
yield* sql`
|
|
340
|
-
CREATE TABLE coverage_baselines (
|
|
341
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
342
|
-
project TEXT NOT NULL,
|
|
343
|
-
kind TEXT NOT NULL DEFAULT 'baseline' CHECK (kind IN (
|
|
344
|
-
'baseline', 'threshold', 'target'
|
|
345
|
-
)),
|
|
346
|
-
metric TEXT NOT NULL CHECK (metric IN (
|
|
347
|
-
'lines', 'functions', 'branches', 'statements'
|
|
348
|
-
)),
|
|
349
|
-
value REAL NOT NULL,
|
|
350
|
-
pattern TEXT NOT NULL DEFAULT '',
|
|
351
|
-
updated_at TEXT NOT NULL,
|
|
352
|
-
UNIQUE(project, kind, metric, pattern)
|
|
353
|
-
)
|
|
354
|
-
`;
|
|
355
|
-
yield* sql`
|
|
356
|
-
CREATE TABLE coverage_trends (
|
|
357
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
358
|
-
run_id INTEGER NOT NULL REFERENCES test_runs(id) ON DELETE CASCADE,
|
|
359
|
-
project TEXT NOT NULL,
|
|
360
|
-
timestamp TEXT NOT NULL,
|
|
361
|
-
lines REAL NOT NULL,
|
|
362
|
-
functions REAL NOT NULL,
|
|
363
|
-
branches REAL NOT NULL,
|
|
364
|
-
statements REAL NOT NULL,
|
|
365
|
-
direction TEXT NOT NULL CHECK (direction IN (
|
|
366
|
-
'improving', 'regressing', 'stable'
|
|
367
|
-
)),
|
|
368
|
-
targets_hash TEXT,
|
|
369
|
-
UNIQUE(project, timestamp)
|
|
370
|
-
)
|
|
371
|
-
`;
|
|
372
|
-
yield* sql`CREATE INDEX idx_coverage_trends_lookup ON coverage_trends(project)`;
|
|
373
|
-
yield* sql`CREATE INDEX idx_coverage_trends_run ON coverage_trends(run_id)`;
|
|
374
|
-
yield* sql`
|
|
375
|
-
CREATE TABLE file_coverage (
|
|
376
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
377
|
-
run_id INTEGER NOT NULL REFERENCES test_runs(id) ON DELETE CASCADE,
|
|
378
|
-
file_id INTEGER NOT NULL REFERENCES files(id),
|
|
379
|
-
statements REAL NOT NULL,
|
|
380
|
-
branches REAL NOT NULL,
|
|
381
|
-
functions REAL NOT NULL,
|
|
382
|
-
lines REAL NOT NULL,
|
|
383
|
-
uncovered_lines TEXT,
|
|
384
|
-
tier TEXT NOT NULL DEFAULT 'below_threshold'
|
|
385
|
-
CHECK (tier IN ('below_threshold', 'below_target'))
|
|
386
|
-
)
|
|
387
|
-
`;
|
|
388
|
-
yield* sql`CREATE INDEX idx_file_coverage_run ON file_coverage(run_id)`;
|
|
389
|
-
yield* sql`CREATE INDEX idx_file_coverage_file ON file_coverage(file_id)`;
|
|
390
|
-
yield* sql`CREATE INDEX idx_file_coverage_run_tier ON file_coverage(run_id, tier)`;
|
|
391
|
-
yield* sql`
|
|
392
|
-
CREATE TABLE source_test_map (
|
|
393
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
394
|
-
source_file_id INTEGER NOT NULL REFERENCES files(id),
|
|
395
|
-
test_module_id INTEGER NOT NULL REFERENCES test_modules(id) ON DELETE CASCADE,
|
|
396
|
-
mapping_type TEXT NOT NULL CHECK (mapping_type IN (
|
|
397
|
-
'convention', 'import_analysis', 'coverage_correlation'
|
|
398
|
-
)),
|
|
399
|
-
UNIQUE(source_file_id, test_module_id, mapping_type)
|
|
400
|
-
)
|
|
401
|
-
`;
|
|
402
|
-
yield* sql`CREATE INDEX idx_source_test_map_source ON source_test_map(source_file_id)`;
|
|
403
|
-
yield* sql`CREATE INDEX idx_source_test_map_module ON source_test_map(test_module_id)`;
|
|
404
|
-
yield* sql`
|
|
405
|
-
CREATE TABLE notes (
|
|
406
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
407
|
-
title TEXT NOT NULL,
|
|
408
|
-
content TEXT NOT NULL,
|
|
409
|
-
scope TEXT NOT NULL CHECK (scope IN (
|
|
410
|
-
'global', 'project', 'module', 'suite', 'test', 'note'
|
|
411
|
-
)),
|
|
412
|
-
project TEXT,
|
|
413
|
-
test_full_name TEXT,
|
|
414
|
-
module_path TEXT,
|
|
415
|
-
parent_note_id INTEGER REFERENCES notes(id) ON DELETE CASCADE,
|
|
416
|
-
created_by TEXT,
|
|
417
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
418
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
419
|
-
expires_at TEXT,
|
|
420
|
-
pinned INTEGER NOT NULL DEFAULT 0 CHECK (pinned IN (0, 1)),
|
|
421
|
-
actor_type TEXT NOT NULL DEFAULT 'system' CHECK (actor_type IN ('agent', 'user', 'system')),
|
|
422
|
-
agent_id TEXT,
|
|
423
|
-
conversation_id TEXT,
|
|
424
|
-
CHECK (
|
|
425
|
-
(actor_type = 'agent' AND agent_id IS NOT NULL)
|
|
426
|
-
OR (actor_type IN ('user', 'system') AND agent_id IS NULL)
|
|
427
|
-
),
|
|
428
|
-
CHECK ((actor_type = 'agent') OR (conversation_id IS NULL))
|
|
429
|
-
)
|
|
430
|
-
`;
|
|
431
|
-
yield* sql`CREATE INDEX idx_notes_scope ON notes(scope)`;
|
|
432
|
-
yield* sql`CREATE INDEX idx_notes_project ON notes(project)`;
|
|
433
|
-
yield* sql`CREATE INDEX idx_notes_test ON notes(test_full_name)`;
|
|
434
|
-
yield* sql`CREATE INDEX idx_notes_module ON notes(module_path)`;
|
|
435
|
-
yield* sql`CREATE INDEX idx_notes_parent ON notes(parent_note_id)`;
|
|
436
|
-
yield* sql`CREATE INDEX idx_notes_created_by ON notes(created_by)`;
|
|
437
|
-
yield* sql`CREATE INDEX idx_notes_agent ON notes(agent_id)`;
|
|
438
|
-
yield* sql`CREATE INDEX idx_notes_conversation ON notes(conversation_id)`;
|
|
439
|
-
yield* sql`
|
|
440
|
-
CREATE TABLE sessions (
|
|
441
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
442
|
-
chat_id TEXT UNIQUE NOT NULL,
|
|
443
|
-
project TEXT NOT NULL,
|
|
444
|
-
cwd TEXT NOT NULL,
|
|
445
|
-
agent_kind TEXT NOT NULL CHECK (agent_kind IN ('main', 'subagent')),
|
|
446
|
-
agent_type TEXT,
|
|
447
|
-
parent_session_id INTEGER REFERENCES sessions(id) ON DELETE SET NULL,
|
|
448
|
-
triage_was_non_empty INTEGER NOT NULL DEFAULT 0 CHECK (triage_was_non_empty IN (0, 1)),
|
|
449
|
-
started_at TEXT NOT NULL,
|
|
450
|
-
ended_at TEXT,
|
|
451
|
-
end_reason TEXT,
|
|
452
|
-
conversation_id TEXT,
|
|
453
|
-
host_kind TEXT
|
|
454
|
-
)
|
|
455
|
-
`;
|
|
456
|
-
yield* sql`CREATE INDEX idx_sessions_project ON sessions(project, started_at DESC)`;
|
|
457
|
-
yield* sql`CREATE INDEX idx_sessions_parent ON sessions(parent_session_id)`;
|
|
458
|
-
yield* sql`CREATE INDEX idx_sessions_conversation ON sessions(conversation_id)`;
|
|
459
|
-
yield* sql`
|
|
460
|
-
CREATE TABLE agents (
|
|
461
|
-
agent_id TEXT PRIMARY KEY,
|
|
462
|
-
session_id INTEGER NOT NULL REFERENCES sessions(id) ON DELETE RESTRICT,
|
|
463
|
-
parent_agent_id TEXT REFERENCES agents(agent_id) ON DELETE RESTRICT,
|
|
464
|
-
conversation_id TEXT,
|
|
465
|
-
agent_type TEXT NOT NULL,
|
|
466
|
-
started_at INTEGER NOT NULL,
|
|
467
|
-
ended_at INTEGER,
|
|
468
|
-
start_git_branch TEXT,
|
|
469
|
-
start_git_commit_sha TEXT,
|
|
470
|
-
start_worktree_dir TEXT,
|
|
471
|
-
idempotency_key TEXT NOT NULL
|
|
472
|
-
) STRICT
|
|
473
|
-
`;
|
|
474
|
-
yield* sql`CREATE INDEX idx_agents_session ON agents(session_id)`;
|
|
475
|
-
yield* sql`CREATE INDEX idx_agents_parent ON agents(parent_agent_id)`;
|
|
476
|
-
yield* sql`CREATE INDEX idx_agents_type ON agents(agent_type)`;
|
|
477
|
-
yield* sql`CREATE INDEX idx_agents_branch ON agents(start_git_branch)`;
|
|
478
|
-
yield* sql`CREATE INDEX idx_agents_conversation ON agents(conversation_id)`;
|
|
479
|
-
yield* sql`CREATE INDEX idx_agents_session_active ON agents(session_id) WHERE ended_at IS NULL`;
|
|
480
|
-
yield* sql`CREATE UNIQUE INDEX uniq_agents_session_idempotency ON agents(session_id, idempotency_key)`;
|
|
481
|
-
yield* sql`
|
|
482
|
-
CREATE TABLE turns (
|
|
483
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
484
|
-
session_id INTEGER NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
485
|
-
turn_no INTEGER NOT NULL,
|
|
486
|
-
type TEXT NOT NULL CHECK (type IN (
|
|
487
|
-
'user_prompt', 'tool_call', 'tool_result', 'file_edit',
|
|
488
|
-
'hook_fire', 'note', 'hypothesis'
|
|
489
|
-
)),
|
|
490
|
-
payload TEXT NOT NULL,
|
|
491
|
-
occurred_at TEXT NOT NULL,
|
|
492
|
-
UNIQUE (session_id, turn_no)
|
|
493
|
-
)
|
|
494
|
-
`;
|
|
495
|
-
yield* sql`CREATE INDEX idx_turns_session ON turns(session_id, turn_no DESC)`;
|
|
496
|
-
yield* sql`CREATE INDEX idx_turns_type ON turns(type, session_id)`;
|
|
497
|
-
yield* sql`
|
|
498
|
-
CREATE TABLE tool_invocations (
|
|
499
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
500
|
-
turn_id INTEGER NOT NULL REFERENCES turns(id) ON DELETE CASCADE,
|
|
501
|
-
tool_name TEXT NOT NULL,
|
|
502
|
-
params_hash TEXT,
|
|
503
|
-
result_summary TEXT,
|
|
504
|
-
duration_ms INTEGER,
|
|
505
|
-
success INTEGER NOT NULL CHECK (success IN (0, 1))
|
|
506
|
-
)
|
|
507
|
-
`;
|
|
508
|
-
yield* sql`CREATE INDEX idx_tool_invocations_turn ON tool_invocations(turn_id)`;
|
|
509
|
-
yield* sql`CREATE INDEX idx_tool_invocations_tool_name ON tool_invocations(tool_name, turn_id)`;
|
|
510
|
-
yield* sql`
|
|
511
|
-
CREATE TABLE file_edits (
|
|
512
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
513
|
-
turn_id INTEGER NOT NULL REFERENCES turns(id) ON DELETE CASCADE,
|
|
514
|
-
file_id INTEGER NOT NULL REFERENCES files(id) ON DELETE CASCADE,
|
|
515
|
-
edit_kind TEXT NOT NULL CHECK (edit_kind IN ('write', 'edit', 'multi_edit')),
|
|
516
|
-
lines_added INTEGER,
|
|
517
|
-
lines_removed INTEGER,
|
|
518
|
-
diff TEXT
|
|
519
|
-
)
|
|
520
|
-
`;
|
|
521
|
-
yield* sql`CREATE INDEX idx_file_edits_turn ON file_edits(turn_id)`;
|
|
522
|
-
yield* sql`CREATE INDEX idx_file_edits_file ON file_edits(file_id, turn_id DESC)`;
|
|
523
|
-
yield* sql`
|
|
524
|
-
CREATE TABLE hypotheses (
|
|
525
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
526
|
-
session_id INTEGER NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
527
|
-
created_turn_id INTEGER REFERENCES turns(id) ON DELETE SET NULL,
|
|
528
|
-
content TEXT NOT NULL,
|
|
529
|
-
cited_test_error_id INTEGER REFERENCES test_errors(id) ON DELETE SET NULL,
|
|
530
|
-
cited_stack_frame_id INTEGER REFERENCES stack_frames(id) ON DELETE SET NULL,
|
|
531
|
-
validated_turn_id INTEGER REFERENCES turns(id) ON DELETE SET NULL,
|
|
532
|
-
validated_at TEXT,
|
|
533
|
-
validation_outcome TEXT CHECK (validation_outcome IS NULL OR validation_outcome IN (
|
|
534
|
-
'confirmed', 'refuted', 'abandoned'
|
|
535
|
-
)),
|
|
536
|
-
actor_type TEXT NOT NULL DEFAULT 'system' CHECK (actor_type IN ('agent', 'user', 'system')),
|
|
537
|
-
agent_id TEXT,
|
|
538
|
-
conversation_id TEXT,
|
|
539
|
-
CHECK (
|
|
540
|
-
(actor_type = 'agent' AND agent_id IS NOT NULL)
|
|
541
|
-
OR (actor_type IN ('user', 'system') AND agent_id IS NULL)
|
|
542
|
-
),
|
|
543
|
-
CHECK ((actor_type = 'agent') OR (conversation_id IS NULL))
|
|
544
|
-
)
|
|
545
|
-
`;
|
|
546
|
-
yield* sql`CREATE INDEX idx_hypotheses_session ON hypotheses(session_id, validated_at)`;
|
|
547
|
-
yield* sql`CREATE INDEX idx_hypotheses_agent ON hypotheses(agent_id)`;
|
|
548
|
-
yield* sql`CREATE INDEX idx_hypotheses_conversation ON hypotheses(conversation_id)`;
|
|
549
|
-
yield* sql`
|
|
550
|
-
CREATE TABLE commits (
|
|
551
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
552
|
-
sha TEXT UNIQUE NOT NULL,
|
|
553
|
-
parent_sha TEXT,
|
|
554
|
-
message TEXT,
|
|
555
|
-
author TEXT,
|
|
556
|
-
committed_at TEXT,
|
|
557
|
-
branch TEXT
|
|
558
|
-
)
|
|
559
|
-
`;
|
|
560
|
-
yield* sql`
|
|
561
|
-
CREATE TABLE run_changed_files (
|
|
562
|
-
run_id INTEGER NOT NULL REFERENCES test_runs(id) ON DELETE CASCADE,
|
|
563
|
-
file_id INTEGER NOT NULL REFERENCES files(id) ON DELETE CASCADE,
|
|
564
|
-
change_kind TEXT NOT NULL CHECK (change_kind IN (
|
|
565
|
-
'added', 'modified', 'deleted', 'renamed', 'untracked-modified'
|
|
566
|
-
)),
|
|
567
|
-
commit_sha TEXT,
|
|
568
|
-
PRIMARY KEY (run_id, file_id)
|
|
569
|
-
)
|
|
570
|
-
`;
|
|
571
|
-
yield* sql`CREATE INDEX idx_run_changed_files_file ON run_changed_files(file_id)`;
|
|
572
|
-
yield* sql`
|
|
573
|
-
CREATE TABLE run_triggers (
|
|
574
|
-
run_id INTEGER PRIMARY KEY REFERENCES test_runs(id) ON DELETE CASCADE,
|
|
575
|
-
trigger TEXT NOT NULL CHECK (trigger IN (
|
|
576
|
-
'cli', 'ide', 'ci', 'agent', 'pre-commit', 'watch'
|
|
577
|
-
)),
|
|
578
|
-
invocation_method TEXT CHECK (invocation_method IS NULL OR invocation_method IN (
|
|
579
|
-
'mcp', 'cli', 'bash', 'ide-runner', 'pre-commit-hook'
|
|
580
|
-
)),
|
|
581
|
-
agent_session_id INTEGER REFERENCES sessions(id) ON DELETE SET NULL,
|
|
582
|
-
watch_trigger_files TEXT
|
|
583
|
-
)
|
|
584
|
-
`;
|
|
585
|
-
yield* sql`CREATE INDEX idx_run_triggers_session ON run_triggers(agent_session_id)`;
|
|
586
|
-
yield* sql`
|
|
587
|
-
CREATE TABLE build_artifacts (
|
|
588
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
589
|
-
run_id INTEGER REFERENCES test_runs(id) ON DELETE CASCADE,
|
|
590
|
-
tool_kind TEXT NOT NULL,
|
|
591
|
-
exit_code INTEGER NOT NULL,
|
|
592
|
-
output TEXT,
|
|
593
|
-
duration_ms INTEGER,
|
|
594
|
-
captured_at TEXT NOT NULL
|
|
595
|
-
)
|
|
596
|
-
`;
|
|
597
|
-
yield* sql`CREATE INDEX idx_build_artifacts_run ON build_artifacts(run_id, tool_kind)`;
|
|
598
|
-
yield* sql`
|
|
599
|
-
CREATE TABLE tdd_tasks (
|
|
600
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
601
|
-
session_id INTEGER NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
602
|
-
goal TEXT NOT NULL,
|
|
603
|
-
run_id TEXT,
|
|
604
|
-
started_at TEXT NOT NULL,
|
|
605
|
-
ended_at TEXT,
|
|
606
|
-
outcome TEXT CHECK (outcome IS NULL OR outcome IN (
|
|
607
|
-
'succeeded', 'blocked', 'abandoned'
|
|
608
|
-
)),
|
|
609
|
-
parent_tdd_task_id INTEGER REFERENCES tdd_tasks(id) ON DELETE SET NULL,
|
|
610
|
-
summary_note_id INTEGER REFERENCES notes(id) ON DELETE SET NULL
|
|
611
|
-
)
|
|
612
|
-
`;
|
|
613
|
-
yield* sql`CREATE INDEX idx_tdd_tasks_session ON tdd_tasks(session_id, ended_at)`;
|
|
614
|
-
yield* sql`CREATE UNIQUE INDEX idx_tdd_tasks_session_run ON tdd_tasks(session_id, run_id) WHERE run_id IS NOT NULL`;
|
|
615
|
-
yield* sql`
|
|
616
|
-
CREATE TABLE tdd_session_goals (
|
|
617
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
618
|
-
session_id INTEGER NOT NULL REFERENCES tdd_tasks(id) ON DELETE CASCADE,
|
|
619
|
-
ordinal INTEGER NOT NULL,
|
|
620
|
-
goal TEXT NOT NULL,
|
|
621
|
-
status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN (
|
|
622
|
-
'pending', 'in_progress', 'done', 'abandoned'
|
|
623
|
-
)),
|
|
624
|
-
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
625
|
-
UNIQUE (session_id, ordinal)
|
|
626
|
-
)
|
|
627
|
-
`;
|
|
628
|
-
yield* sql`CREATE INDEX idx_tdd_session_goals_session ON tdd_session_goals(session_id, id)`;
|
|
629
|
-
yield* sql`CREATE INDEX idx_tdd_session_goals_session_status ON tdd_session_goals(session_id, status)`;
|
|
630
|
-
yield* sql`
|
|
631
|
-
CREATE TABLE tdd_session_behaviors (
|
|
632
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
633
|
-
goal_id INTEGER NOT NULL REFERENCES tdd_session_goals(id) ON DELETE CASCADE,
|
|
634
|
-
ordinal INTEGER NOT NULL,
|
|
635
|
-
behavior TEXT NOT NULL,
|
|
636
|
-
suggested_test_name TEXT,
|
|
637
|
-
status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN (
|
|
638
|
-
'pending', 'in_progress', 'done', 'abandoned'
|
|
639
|
-
)),
|
|
640
|
-
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
641
|
-
UNIQUE (goal_id, ordinal)
|
|
642
|
-
)
|
|
643
|
-
`;
|
|
644
|
-
yield* sql`CREATE INDEX idx_tdd_session_behaviors_goal ON tdd_session_behaviors(goal_id, id)`;
|
|
645
|
-
yield* sql`CREATE INDEX idx_tdd_session_behaviors_goal_status ON tdd_session_behaviors(goal_id, status)`;
|
|
646
|
-
yield* sql`
|
|
647
|
-
CREATE TABLE tdd_behavior_dependencies (
|
|
648
|
-
behavior_id INTEGER NOT NULL REFERENCES tdd_session_behaviors(id) ON DELETE CASCADE,
|
|
649
|
-
depends_on_id INTEGER NOT NULL REFERENCES tdd_session_behaviors(id) ON DELETE CASCADE,
|
|
650
|
-
PRIMARY KEY (behavior_id, depends_on_id),
|
|
651
|
-
CHECK (behavior_id != depends_on_id)
|
|
652
|
-
)
|
|
653
|
-
`;
|
|
654
|
-
yield* sql`CREATE INDEX idx_tdd_behavior_dependencies_depends_on ON tdd_behavior_dependencies(depends_on_id)`;
|
|
655
|
-
yield* sql`
|
|
656
|
-
CREATE TABLE tdd_phases (
|
|
657
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
658
|
-
tdd_task_id INTEGER NOT NULL REFERENCES tdd_tasks(id) ON DELETE CASCADE,
|
|
659
|
-
behavior_id INTEGER REFERENCES tdd_session_behaviors(id) ON DELETE CASCADE,
|
|
660
|
-
phase TEXT NOT NULL CHECK (phase IN (
|
|
661
|
-
'spike', 'red', 'red.triangulate', 'green', 'green.fake-it',
|
|
662
|
-
'refactor', 'extended-red', 'green-without-red'
|
|
663
|
-
)),
|
|
664
|
-
started_at TEXT NOT NULL,
|
|
665
|
-
ended_at TEXT,
|
|
666
|
-
transition_reason TEXT,
|
|
667
|
-
parent_phase_id INTEGER REFERENCES tdd_phases(id) ON DELETE SET NULL,
|
|
668
|
-
actor_type TEXT NOT NULL DEFAULT 'system' CHECK (actor_type IN ('agent', 'user', 'system')),
|
|
669
|
-
agent_id TEXT,
|
|
670
|
-
conversation_id TEXT,
|
|
671
|
-
CHECK (
|
|
672
|
-
(actor_type = 'agent' AND agent_id IS NOT NULL)
|
|
673
|
-
OR (actor_type IN ('user', 'system') AND agent_id IS NULL)
|
|
674
|
-
),
|
|
675
|
-
CHECK ((actor_type = 'agent') OR (conversation_id IS NULL))
|
|
676
|
-
)
|
|
677
|
-
`;
|
|
678
|
-
yield* sql`CREATE INDEX idx_tdd_phases_tdd_task ON tdd_phases(tdd_task_id, started_at DESC)`;
|
|
679
|
-
yield* sql`CREATE INDEX idx_tdd_phases_behavior ON tdd_phases(behavior_id, started_at DESC)`;
|
|
680
|
-
yield* sql`CREATE INDEX idx_tdd_phases_agent ON tdd_phases(agent_id)`;
|
|
681
|
-
yield* sql`CREATE INDEX idx_tdd_phases_conversation ON tdd_phases(conversation_id)`;
|
|
682
|
-
yield* sql`
|
|
683
|
-
CREATE TABLE tdd_artifacts (
|
|
684
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
685
|
-
phase_id INTEGER NOT NULL REFERENCES tdd_phases(id) ON DELETE CASCADE,
|
|
686
|
-
behavior_id INTEGER REFERENCES tdd_session_behaviors(id) ON DELETE CASCADE,
|
|
687
|
-
artifact_kind TEXT NOT NULL CHECK (artifact_kind IN (
|
|
688
|
-
'test_written', 'test_failed_run', 'code_written',
|
|
689
|
-
'test_passed_run', 'refactor', 'test_weakened'
|
|
690
|
-
)),
|
|
691
|
-
file_id INTEGER REFERENCES files(id) ON DELETE SET NULL,
|
|
692
|
-
test_case_id INTEGER REFERENCES test_cases(id) ON DELETE SET NULL,
|
|
693
|
-
test_run_id INTEGER REFERENCES test_runs(id) ON DELETE SET NULL,
|
|
694
|
-
test_first_failure_run_id INTEGER REFERENCES test_runs(id) ON DELETE SET NULL,
|
|
695
|
-
diff_excerpt TEXT,
|
|
696
|
-
recorded_at TEXT NOT NULL,
|
|
697
|
-
suite TEXT NOT NULL DEFAULT 'vitest' CHECK (suite IN ('vitest', 'bats')),
|
|
698
|
-
UNIQUE (phase_id, artifact_kind, file_id, test_run_id)
|
|
699
|
-
)
|
|
700
|
-
`;
|
|
701
|
-
yield* sql`CREATE INDEX idx_tdd_artifacts_phase ON tdd_artifacts(phase_id, recorded_at)`;
|
|
702
|
-
yield* sql`CREATE INDEX idx_tdd_artifacts_behavior ON tdd_artifacts(behavior_id, recorded_at)`;
|
|
703
|
-
yield* sql`
|
|
704
|
-
CREATE TABLE failure_signatures (
|
|
705
|
-
signature_hash TEXT PRIMARY KEY,
|
|
706
|
-
first_seen_run_id INTEGER REFERENCES test_runs(id) ON DELETE SET NULL,
|
|
707
|
-
first_seen_at TEXT NOT NULL,
|
|
708
|
-
last_seen_at TEXT,
|
|
709
|
-
occurrence_count INTEGER NOT NULL DEFAULT 1
|
|
710
|
-
)
|
|
711
|
-
`;
|
|
712
|
-
yield* sql`CREATE INDEX idx_failure_signatures_last_seen ON failure_signatures(last_seen_at DESC)`;
|
|
713
|
-
yield* sql`
|
|
714
|
-
CREATE TABLE hook_executions (
|
|
715
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
716
|
-
run_id INTEGER NOT NULL REFERENCES test_runs(id) ON DELETE CASCADE,
|
|
717
|
-
test_module_id INTEGER REFERENCES test_modules(id) ON DELETE CASCADE,
|
|
718
|
-
test_suite_id INTEGER REFERENCES test_suites(id) ON DELETE CASCADE,
|
|
719
|
-
test_case_id INTEGER REFERENCES test_cases(id) ON DELETE CASCADE,
|
|
720
|
-
hook_kind TEXT NOT NULL CHECK (hook_kind IN (
|
|
721
|
-
'beforeAll', 'beforeEach', 'afterEach', 'afterAll'
|
|
722
|
-
)),
|
|
723
|
-
passed INTEGER NOT NULL CHECK (passed IN (0, 1)),
|
|
724
|
-
duration_ms INTEGER,
|
|
725
|
-
error_id INTEGER REFERENCES test_errors(id) ON DELETE SET NULL,
|
|
726
|
-
CHECK (
|
|
727
|
-
(test_module_id IS NOT NULL) +
|
|
728
|
-
(test_suite_id IS NOT NULL) +
|
|
729
|
-
(test_case_id IS NOT NULL) <= 1
|
|
730
|
-
)
|
|
731
|
-
)
|
|
732
|
-
`;
|
|
733
|
-
yield* sql`CREATE INDEX idx_hook_executions_run ON hook_executions(run_id)`;
|
|
734
|
-
yield* sql`
|
|
735
|
-
CREATE TABLE mcp_idempotent_responses (
|
|
736
|
-
procedure_path TEXT NOT NULL,
|
|
737
|
-
key TEXT NOT NULL,
|
|
738
|
-
result_json TEXT NOT NULL,
|
|
739
|
-
created_at TEXT NOT NULL,
|
|
740
|
-
PRIMARY KEY (procedure_path, key)
|
|
741
|
-
)
|
|
742
|
-
`;
|
|
743
|
-
yield* sql`CREATE INDEX idx_mcp_idempotent_responses_path ON mcp_idempotent_responses(procedure_path, created_at DESC)`;
|
|
744
|
-
yield* sql`
|
|
745
|
-
CREATE VIRTUAL TABLE notes_fts USING fts5(title, content, content='notes', content_rowid='id')
|
|
746
|
-
`;
|
|
747
|
-
yield* sql`
|
|
748
|
-
CREATE TRIGGER notes_ai AFTER INSERT ON notes BEGIN
|
|
749
|
-
INSERT INTO notes_fts(rowid, title, content) VALUES (NEW.id, NEW.title, NEW.content);
|
|
750
|
-
END
|
|
751
|
-
`;
|
|
752
|
-
yield* sql`
|
|
753
|
-
CREATE TRIGGER notes_ad AFTER DELETE ON notes BEGIN
|
|
754
|
-
INSERT INTO notes_fts(notes_fts, rowid, title, content) VALUES('delete', OLD.id, OLD.title, OLD.content);
|
|
755
|
-
END
|
|
756
|
-
`;
|
|
757
|
-
yield* sql`
|
|
758
|
-
CREATE TRIGGER notes_bu BEFORE UPDATE ON notes BEGIN
|
|
759
|
-
INSERT INTO notes_fts(notes_fts, rowid, title, content) VALUES('delete', OLD.id, OLD.title, OLD.content);
|
|
760
|
-
END
|
|
761
|
-
`;
|
|
762
|
-
yield* sql`
|
|
763
|
-
CREATE TRIGGER notes_au AFTER UPDATE ON notes BEGIN
|
|
764
|
-
INSERT INTO notes_fts(rowid, title, content) VALUES (NEW.id, NEW.title, NEW.content);
|
|
765
|
-
END
|
|
766
|
-
`;
|
|
767
|
-
yield* sql`
|
|
768
|
-
CREATE TRIGGER trg_sessions_conv_id_immutable
|
|
769
|
-
AFTER UPDATE ON sessions
|
|
770
|
-
FOR EACH ROW
|
|
771
|
-
WHEN OLD.conversation_id IS NOT NULL AND OLD.conversation_id IS NOT NEW.conversation_id
|
|
772
|
-
BEGIN
|
|
773
|
-
SELECT RAISE(ABORT, 'sessions.conversation_id is immutable');
|
|
774
|
-
END
|
|
775
|
-
`;
|
|
776
|
-
yield* sql`
|
|
777
|
-
CREATE TRIGGER trg_agents_conv_id_immutable
|
|
778
|
-
AFTER UPDATE ON agents
|
|
779
|
-
FOR EACH ROW
|
|
780
|
-
WHEN OLD.conversation_id IS NOT NEW.conversation_id
|
|
781
|
-
BEGIN
|
|
782
|
-
SELECT RAISE(ABORT, 'agents.conversation_id is immutable');
|
|
783
|
-
END
|
|
784
|
-
`;
|
|
785
|
-
yield* sql`
|
|
786
|
-
CREATE TRIGGER trg_test_runs_conv_id_immutable
|
|
787
|
-
AFTER UPDATE ON test_runs
|
|
788
|
-
FOR EACH ROW
|
|
789
|
-
WHEN OLD.conversation_id IS NOT NEW.conversation_id
|
|
790
|
-
BEGIN
|
|
791
|
-
SELECT RAISE(ABORT, 'test_runs.conversation_id is immutable');
|
|
792
|
-
END
|
|
793
|
-
`;
|
|
794
|
-
yield* sql`
|
|
795
|
-
CREATE TRIGGER trg_hypotheses_conv_id_immutable
|
|
796
|
-
AFTER UPDATE ON hypotheses
|
|
797
|
-
FOR EACH ROW
|
|
798
|
-
WHEN OLD.conversation_id IS NOT NEW.conversation_id
|
|
799
|
-
BEGIN
|
|
800
|
-
SELECT RAISE(ABORT, 'hypotheses.conversation_id is immutable');
|
|
801
|
-
END
|
|
802
|
-
`;
|
|
803
|
-
yield* sql`
|
|
804
|
-
CREATE TRIGGER trg_notes_conv_id_immutable
|
|
805
|
-
AFTER UPDATE ON notes
|
|
806
|
-
FOR EACH ROW
|
|
807
|
-
WHEN OLD.conversation_id IS NOT NEW.conversation_id
|
|
808
|
-
BEGIN
|
|
809
|
-
SELECT RAISE(ABORT, 'notes.conversation_id is immutable');
|
|
810
|
-
END
|
|
811
|
-
`;
|
|
812
|
-
yield* sql`
|
|
813
|
-
CREATE TRIGGER trg_tdd_phases_conv_id_immutable
|
|
814
|
-
AFTER UPDATE ON tdd_phases
|
|
815
|
-
FOR EACH ROW
|
|
816
|
-
WHEN OLD.conversation_id IS NOT NEW.conversation_id
|
|
817
|
-
BEGIN
|
|
818
|
-
SELECT RAISE(ABORT, 'tdd_phases.conversation_id is immutable');
|
|
819
|
-
END
|
|
820
|
-
`;
|
|
821
|
-
});
|
|
822
|
-
|
|
823
|
-
//#endregion
|
|
824
|
-
export { migration as default };
|