@varveai/adit-core 0.2.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.
Files changed (90) hide show
  1. package/LICENSE +21 -0
  2. package/dist/config/index.d.ts +29 -0
  3. package/dist/config/index.d.ts.map +1 -0
  4. package/dist/config/index.js +107 -0
  5. package/dist/config/index.js.map +1 -0
  6. package/dist/db/connection.d.ts +9 -0
  7. package/dist/db/connection.d.ts.map +1 -0
  8. package/dist/db/connection.js +48 -0
  9. package/dist/db/connection.js.map +1 -0
  10. package/dist/db/diffs.d.ts +22 -0
  11. package/dist/db/diffs.d.ts.map +1 -0
  12. package/dist/db/diffs.js +37 -0
  13. package/dist/db/diffs.js.map +1 -0
  14. package/dist/db/env-snapshots.d.ts +29 -0
  15. package/dist/db/env-snapshots.d.ts.map +1 -0
  16. package/dist/db/env-snapshots.js +57 -0
  17. package/dist/db/env-snapshots.js.map +1 -0
  18. package/dist/db/events.d.ts +91 -0
  19. package/dist/db/events.d.ts.map +1 -0
  20. package/dist/db/events.js +260 -0
  21. package/dist/db/events.js.map +1 -0
  22. package/dist/db/index.d.ts +10 -0
  23. package/dist/db/index.d.ts.map +1 -0
  24. package/dist/db/index.js +10 -0
  25. package/dist/db/index.js.map +1 -0
  26. package/dist/db/migrations.d.ts +13 -0
  27. package/dist/db/migrations.d.ts.map +1 -0
  28. package/dist/db/migrations.js +237 -0
  29. package/dist/db/migrations.js.map +1 -0
  30. package/dist/db/plans.d.ts +21 -0
  31. package/dist/db/plans.d.ts.map +1 -0
  32. package/dist/db/plans.js +52 -0
  33. package/dist/db/plans.js.map +1 -0
  34. package/dist/db/sessions.d.ts +23 -0
  35. package/dist/db/sessions.d.ts.map +1 -0
  36. package/dist/db/sessions.js +57 -0
  37. package/dist/db/sessions.js.map +1 -0
  38. package/dist/db/sync-state.d.ts +21 -0
  39. package/dist/db/sync-state.d.ts.map +1 -0
  40. package/dist/db/sync-state.js +36 -0
  41. package/dist/db/sync-state.js.map +1 -0
  42. package/dist/db/transcript-uploads.d.ts +57 -0
  43. package/dist/db/transcript-uploads.d.ts.map +1 -0
  44. package/dist/db/transcript-uploads.js +132 -0
  45. package/dist/db/transcript-uploads.js.map +1 -0
  46. package/dist/index.d.ts +17 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +17 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/perf/perf-log.d.ts +105 -0
  51. package/dist/perf/perf-log.d.ts.map +1 -0
  52. package/dist/perf/perf-log.js +280 -0
  53. package/dist/perf/perf-log.js.map +1 -0
  54. package/dist/security/content-redaction.d.ts +105 -0
  55. package/dist/security/content-redaction.d.ts.map +1 -0
  56. package/dist/security/content-redaction.js +365 -0
  57. package/dist/security/content-redaction.js.map +1 -0
  58. package/dist/sync/index.d.ts +3 -0
  59. package/dist/sync/index.d.ts.map +1 -0
  60. package/dist/sync/index.js +3 -0
  61. package/dist/sync/index.js.map +1 -0
  62. package/dist/sync/ulid.d.ts +15 -0
  63. package/dist/sync/ulid.d.ts.map +1 -0
  64. package/dist/sync/ulid.js +34 -0
  65. package/dist/sync/ulid.js.map +1 -0
  66. package/dist/sync/vclock.d.ts +33 -0
  67. package/dist/sync/vclock.d.ts.map +1 -0
  68. package/dist/sync/vclock.js +69 -0
  69. package/dist/sync/vclock.js.map +1 -0
  70. package/dist/types/environment.d.ts +53 -0
  71. package/dist/types/environment.d.ts.map +1 -0
  72. package/dist/types/environment.js +8 -0
  73. package/dist/types/environment.js.map +1 -0
  74. package/dist/types/events.d.ts +88 -0
  75. package/dist/types/events.d.ts.map +1 -0
  76. package/dist/types/events.js +40 -0
  77. package/dist/types/events.js.map +1 -0
  78. package/dist/types/index.d.ts +6 -0
  79. package/dist/types/index.d.ts.map +1 -0
  80. package/dist/types/index.js +2 -0
  81. package/dist/types/index.js.map +1 -0
  82. package/dist/types/plan.d.ts +30 -0
  83. package/dist/types/plan.d.ts.map +1 -0
  84. package/dist/types/plan.js +8 -0
  85. package/dist/types/plan.js.map +1 -0
  86. package/dist/types/session.d.ts +44 -0
  87. package/dist/types/session.d.ts.map +1 -0
  88. package/dist/types/session.js +8 -0
  89. package/dist/types/session.js.map +1 -0
  90. package/package.json +29 -0
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Event CRUD operations.
3
+ *
4
+ * Events are the heart of ADIT's timeline. Every action is recorded
5
+ * as an event with full context.
6
+ */
7
+ const INSERT_SQL = `
8
+ INSERT INTO events (
9
+ id, session_id, parent_event_id, sequence, event_type, actor,
10
+ prompt_text, cot_text, response_text,
11
+ tool_name, tool_input_json, tool_output_json,
12
+ checkpoint_sha, checkpoint_ref, diff_stat_json,
13
+ git_branch, git_head_sha, env_snapshot_id,
14
+ started_at, ended_at, status, error_json, labels_json, plan_task_id,
15
+ client_id, vclock_json
16
+ ) VALUES (
17
+ ?, ?, ?, ?, ?, ?,
18
+ ?, ?, ?,
19
+ ?, ?, ?,
20
+ ?, ?, ?,
21
+ ?, ?, ?,
22
+ ?, ?, ?, ?, ?, ?,
23
+ ?, ?
24
+ )
25
+ `;
26
+ /**
27
+ * Atomically allocate a sequence number and insert an event in a single
28
+ * transaction. This prevents the TOCTOU race in the old allocateSequence +
29
+ * insertEvent two-step pattern where concurrent hook processes could read
30
+ * the same MAX(sequence) and produce duplicate sequence numbers.
31
+ */
32
+ const INSERT_WITH_SEQ_SQL = `
33
+ INSERT INTO events (
34
+ id, session_id, parent_event_id, sequence, event_type, actor,
35
+ prompt_text, cot_text, response_text,
36
+ tool_name, tool_input_json, tool_output_json,
37
+ checkpoint_sha, checkpoint_ref, diff_stat_json,
38
+ git_branch, git_head_sha, env_snapshot_id,
39
+ started_at, ended_at, status, error_json, labels_json, plan_task_id,
40
+ client_id, vclock_json
41
+ ) VALUES (
42
+ ?, ?, ?,
43
+ (SELECT COALESCE(MAX(sequence), 0) + 1 FROM events WHERE session_id = ?),
44
+ ?, ?,
45
+ ?, ?, ?,
46
+ ?, ?, ?,
47
+ ?, ?, ?,
48
+ ?, ?, ?,
49
+ ?, ?, ?, ?, ?, ?,
50
+ ?, ?
51
+ )
52
+ `;
53
+ export function insertEvent(db, input) {
54
+ db.prepare(INSERT_SQL).run(input.id, input.sessionId, input.parentEventId ?? null, input.sequence, input.eventType, input.actor, input.promptText ?? null, input.cotText ?? null, input.responseText ?? null, input.toolName ?? null, input.toolInputJson ?? null, input.toolOutputJson ?? null, input.checkpointSha ?? null, input.checkpointRef ?? null, input.diffStatJson ?? null, input.gitBranch ?? null, input.gitHeadSha ?? null, input.envSnapshotId ?? null, input.startedAt, input.endedAt ?? null, input.status ?? "running", input.errorJson ?? null, input.labelsJson ?? null, input.planTaskId ?? null, input.clientId ?? null, input.vclockJson);
55
+ }
56
+ /**
57
+ * Insert an event with an atomically-allocated sequence number.
58
+ *
59
+ * Prefer this over the separate allocateSequence + insertEvent pattern
60
+ * to avoid duplicate sequence numbers under concurrent hook processes.
61
+ */
62
+ export function insertEventAutoSeq(db, input) {
63
+ db.prepare(INSERT_WITH_SEQ_SQL).run(input.id, input.sessionId, input.parentEventId ?? null, input.sessionId, // for the sub-select
64
+ input.eventType, input.actor, input.promptText ?? null, input.cotText ?? null, input.responseText ?? null, input.toolName ?? null, input.toolInputJson ?? null, input.toolOutputJson ?? null, input.checkpointSha ?? null, input.checkpointRef ?? null, input.diffStatJson ?? null, input.gitBranch ?? null, input.gitHeadSha ?? null, input.envSnapshotId ?? null, input.startedAt, input.endedAt ?? null, input.status ?? "running", input.errorJson ?? null, input.labelsJson ?? null, input.planTaskId ?? null, input.clientId ?? null, input.vclockJson);
65
+ }
66
+ export function getEventById(db, id) {
67
+ const row = db.prepare("SELECT * FROM events WHERE id = ?").get(id);
68
+ return row ? rowToEvent(row) : null;
69
+ }
70
+ export function queryEvents(db, opts) {
71
+ const conditions = ["deleted_at IS NULL"];
72
+ const params = [];
73
+ if (opts.sessionId) {
74
+ conditions.push("session_id = ?");
75
+ params.push(opts.sessionId);
76
+ }
77
+ if (opts.eventType) {
78
+ conditions.push("event_type = ?");
79
+ params.push(opts.eventType);
80
+ }
81
+ if (opts.actor) {
82
+ conditions.push("actor = ?");
83
+ params.push(opts.actor);
84
+ }
85
+ if (opts.status) {
86
+ conditions.push("status = ?");
87
+ params.push(opts.status);
88
+ }
89
+ if (opts.hasCheckpoint) {
90
+ conditions.push("checkpoint_sha IS NOT NULL");
91
+ }
92
+ if (opts.gitBranch) {
93
+ conditions.push("git_branch = ?");
94
+ params.push(opts.gitBranch);
95
+ }
96
+ if (opts.afterSequence !== undefined) {
97
+ conditions.push("sequence > ?");
98
+ params.push(opts.afterSequence);
99
+ }
100
+ const where = conditions.join(" AND ");
101
+ const limit = opts.limit ?? 50;
102
+ params.push(limit);
103
+ const rows = db
104
+ .prepare(`SELECT * FROM events WHERE ${where} ORDER BY started_at DESC LIMIT ?`)
105
+ .all(...params);
106
+ return rows.map(rowToEvent);
107
+ }
108
+ export function getEventsBySession(db, sessionId, limit = 100) {
109
+ const rows = db
110
+ .prepare("SELECT * FROM events WHERE session_id = ? AND deleted_at IS NULL ORDER BY sequence ASC LIMIT ?")
111
+ .all(sessionId, limit);
112
+ return rows.map(rowToEvent);
113
+ }
114
+ export function updateEventStatus(db, id, status, endedAt, errorJson) {
115
+ const now = endedAt ?? new Date().toISOString();
116
+ db.prepare("UPDATE events SET status = ?, ended_at = ?, error_json = ? WHERE id = ?").run(status, now, errorJson ?? null, id);
117
+ }
118
+ export function updateEventCheckpoint(db, id, checkpointSha, checkpointRef, diffStatJson) {
119
+ db.prepare("UPDATE events SET checkpoint_sha = ?, checkpoint_ref = ?, diff_stat_json = ? WHERE id = ?").run(checkpointSha, checkpointRef, diffStatJson, id);
120
+ }
121
+ export function updateEventLabels(db, id, labelsJson, vclockJson) {
122
+ db.prepare("UPDATE events SET labels_json = ?, vclock_json = ? WHERE id = ?").run(labelsJson, vclockJson, id);
123
+ }
124
+ export function allocateSequence(db, sessionId) {
125
+ const row = db
126
+ .prepare("SELECT COALESCE(MAX(sequence), 0) as max_seq FROM events WHERE session_id = ?")
127
+ .get(sessionId);
128
+ return row.max_seq + 1;
129
+ }
130
+ export function searchEvents(db, query, limit = 20) {
131
+ const pattern = `%${query}%`;
132
+ const rows = db
133
+ .prepare(`SELECT * FROM events
134
+ WHERE deleted_at IS NULL
135
+ AND (prompt_text LIKE ? OR cot_text LIKE ? OR response_text LIKE ? OR tool_name LIKE ?)
136
+ ORDER BY started_at DESC
137
+ LIMIT ?`)
138
+ .all(pattern, pattern, pattern, pattern, limit);
139
+ return rows.map(rowToEvent);
140
+ }
141
+ export function getLatestCheckpointEvent(db, sessionId) {
142
+ let sql = "SELECT * FROM events WHERE checkpoint_sha IS NOT NULL AND deleted_at IS NULL";
143
+ const params = [];
144
+ if (sessionId) {
145
+ sql += " AND session_id = ?";
146
+ params.push(sessionId);
147
+ }
148
+ sql += " ORDER BY sequence DESC LIMIT 1";
149
+ const row = db.prepare(sql).get(...params);
150
+ return row ? rowToEvent(row) : null;
151
+ }
152
+ /**
153
+ * Find the most recent checkpoint event on a given git branch.
154
+ *
155
+ * Orders by started_at DESC to get the latest checkpoint regardless
156
+ * of session boundaries.
157
+ */
158
+ export function getLatestCheckpointByBranch(db, branch) {
159
+ const row = db
160
+ .prepare(`SELECT * FROM events
161
+ WHERE checkpoint_sha IS NOT NULL
162
+ AND git_branch = ?
163
+ AND deleted_at IS NULL
164
+ ORDER BY started_at DESC LIMIT 1`)
165
+ .get(branch);
166
+ return row ? rowToEvent(row) : null;
167
+ }
168
+ /**
169
+ * Find recent checkpoint events across all branches, excluding a specific branch.
170
+ *
171
+ * Used as a fallback when the current branch has no checkpoints — typically
172
+ * after a squash merge where the feature branch's checkpoints are recorded
173
+ * under the old branch name that no longer exists.
174
+ *
175
+ * Returns checkpoints ordered by started_at DESC so the most recent comes first.
176
+ */
177
+ export function getRecentCheckpointsExcludingBranch(db, excludeBranch, limit = 10) {
178
+ const rows = db
179
+ .prepare(`SELECT * FROM events
180
+ WHERE checkpoint_sha IS NOT NULL
181
+ AND git_branch != ?
182
+ AND deleted_at IS NULL
183
+ ORDER BY started_at DESC LIMIT ?`)
184
+ .all(excludeBranch, limit);
185
+ return rows.map(rowToEvent);
186
+ }
187
+ /**
188
+ * Delete all events and associated diffs for a project.
189
+ * Respects foreign key order: diffs → events.
190
+ * Returns the number of events deleted.
191
+ */
192
+ export function clearEvents(db, projectId) {
193
+ const deleteAll = db.transaction(() => {
194
+ // Delete diffs that belong to events in this project's sessions
195
+ db.prepare(`DELETE FROM diffs WHERE event_id IN (
196
+ SELECT e.id FROM events e
197
+ JOIN sessions s ON e.session_id = s.id
198
+ WHERE s.project_id = ?
199
+ )`).run(projectId);
200
+ // Delete env_snapshots that belong to this project's sessions
201
+ db.prepare(`DELETE FROM env_snapshots WHERE session_id IN (
202
+ SELECT id FROM sessions WHERE project_id = ?
203
+ )`).run(projectId);
204
+ // Delete events
205
+ const result = db
206
+ .prepare(`DELETE FROM events WHERE session_id IN (
207
+ SELECT id FROM sessions WHERE project_id = ?
208
+ )`)
209
+ .run(projectId);
210
+ // Delete sessions
211
+ db.prepare(`DELETE FROM sessions WHERE project_id = ?`).run(projectId);
212
+ // Clear sync state (cursors are invalid after clearing events)
213
+ db.prepare(`DELETE FROM sync_state`).run();
214
+ return result.changes;
215
+ });
216
+ return deleteAll();
217
+ }
218
+ /**
219
+ * Count total events for a project.
220
+ */
221
+ export function countEvents(db, projectId) {
222
+ const row = db
223
+ .prepare(`SELECT COUNT(*) as cnt FROM events e
224
+ JOIN sessions s ON e.session_id = s.id
225
+ WHERE s.project_id = ?`)
226
+ .get(projectId);
227
+ return row.cnt;
228
+ }
229
+ function rowToEvent(row) {
230
+ return {
231
+ id: row.id,
232
+ sessionId: row.session_id,
233
+ parentEventId: row.parent_event_id ?? null,
234
+ sequence: row.sequence,
235
+ eventType: row.event_type,
236
+ actor: row.actor,
237
+ promptText: row.prompt_text ?? null,
238
+ cotText: row.cot_text ?? null,
239
+ responseText: row.response_text ?? null,
240
+ toolName: row.tool_name ?? null,
241
+ toolInputJson: row.tool_input_json ?? null,
242
+ toolOutputJson: row.tool_output_json ?? null,
243
+ checkpointSha: row.checkpoint_sha ?? null,
244
+ checkpointRef: row.checkpoint_ref ?? null,
245
+ diffStatJson: row.diff_stat_json ?? null,
246
+ gitBranch: row.git_branch ?? null,
247
+ gitHeadSha: row.git_head_sha ?? null,
248
+ envSnapshotId: row.env_snapshot_id ?? null,
249
+ startedAt: row.started_at,
250
+ endedAt: row.ended_at ?? null,
251
+ status: row.status,
252
+ errorJson: row.error_json ?? null,
253
+ labelsJson: row.labels_json ?? null,
254
+ planTaskId: row.plan_task_id ?? null,
255
+ clientId: row.client_id ?? null,
256
+ vclockJson: row.vclock_json,
257
+ deletedAt: row.deleted_at ?? null,
258
+ };
259
+ }
260
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/db/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { openDatabase, closeDatabase } from "./connection.js";
2
+ export { migrations } from "./migrations.js";
3
+ export { insertSession, getSessionById, getActiveSession, getSessionByPlatformSessionId, endSession, listSessions, type CreateSessionInput, } from "./sessions.js";
4
+ export { insertEvent, insertEventAutoSeq, getEventById, queryEvents, getEventsBySession, updateEventStatus, updateEventCheckpoint, updateEventLabels, allocateSequence, searchEvents, getLatestCheckpointEvent, getLatestCheckpointByBranch, getRecentCheckpointsExcludingBranch, clearEvents, countEvents, type InsertEventInput, type EventQueryOptions, } from "./events.js";
5
+ export { insertDiff, getDiffByEventId, getDiffText, type DiffRecord, } from "./diffs.js";
6
+ export { insertPlan, getPlanById, listPlans, getChildPlans, updatePlanStatus, updatePlanContent, type CreatePlanInput, } from "./plans.js";
7
+ export { insertEnvSnapshot, getEnvSnapshotById, getLatestEnvSnapshot, listEnvSnapshots, type CreateEnvSnapshotInput, } from "./env-snapshots.js";
8
+ export { getSyncState, upsertSyncState, clearSyncState, type SyncState, } from "./sync-state.js";
9
+ export { upsertTranscriptUpload, getTranscriptUpload, getTranscriptUploadById, listPendingTranscriptUploads, markTranscriptUploaded, markTranscriptUploadFailed, resetTranscriptUpload, countActiveTranscriptUploads, type TranscriptUpload, type TranscriptUploadStatus, type UpsertTranscriptUploadInput, } from "./transcript-uploads.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,6BAA6B,EAC7B,UAAU,EACV,YAAY,EACZ,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,wBAAwB,EACxB,2BAA2B,EAC3B,mCAAmC,EACnC,WAAW,EACX,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,sBAAsB,GAC5B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,EACd,KAAK,SAAS,GACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,EAC5B,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,GACjC,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { openDatabase, closeDatabase } from "./connection.js";
2
+ export { migrations } from "./migrations.js";
3
+ export { insertSession, getSessionById, getActiveSession, getSessionByPlatformSessionId, endSession, listSessions, } from "./sessions.js";
4
+ export { insertEvent, insertEventAutoSeq, getEventById, queryEvents, getEventsBySession, updateEventStatus, updateEventCheckpoint, updateEventLabels, allocateSequence, searchEvents, getLatestCheckpointEvent, getLatestCheckpointByBranch, getRecentCheckpointsExcludingBranch, clearEvents, countEvents, } from "./events.js";
5
+ export { insertDiff, getDiffByEventId, getDiffText, } from "./diffs.js";
6
+ export { insertPlan, getPlanById, listPlans, getChildPlans, updatePlanStatus, updatePlanContent, } from "./plans.js";
7
+ export { insertEnvSnapshot, getEnvSnapshotById, getLatestEnvSnapshot, listEnvSnapshots, } from "./env-snapshots.js";
8
+ export { getSyncState, upsertSyncState, clearSyncState, } from "./sync-state.js";
9
+ export { upsertTranscriptUpload, getTranscriptUpload, getTranscriptUploadById, listPendingTranscriptUploads, markTranscriptUploaded, markTranscriptUploadFailed, resetTranscriptUpload, countActiveTranscriptUploads, } from "./transcript-uploads.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,6BAA6B,EAC7B,UAAU,EACV,YAAY,GAEb,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,wBAAwB,EACxB,2BAA2B,EAC3B,mCAAmC,EACnC,WAAW,EACX,WAAW,GAGZ,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,WAAW,GAEZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,GAEf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,EAC5B,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,4BAA4B,GAI7B,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * SQLite schema migrations for ADIT.
3
+ *
4
+ * Migrations are applied in order. Each migration has an id and SQL.
5
+ * The migrations table tracks which have been applied.
6
+ */
7
+ export interface Migration {
8
+ id: number;
9
+ name: string;
10
+ sql: string;
11
+ }
12
+ export declare const migrations: Migration[];
13
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,UAAU,EAAE,SAAS,EAqOjC,CAAC"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * SQLite schema migrations for ADIT.
3
+ *
4
+ * Migrations are applied in order. Each migration has an id and SQL.
5
+ * The migrations table tracks which have been applied.
6
+ */
7
+ export const migrations = [
8
+ {
9
+ id: 1,
10
+ name: "create_sessions",
11
+ sql: `
12
+ CREATE TABLE IF NOT EXISTS sessions (
13
+ id TEXT PRIMARY KEY,
14
+ project_id TEXT NOT NULL,
15
+ client_id TEXT NOT NULL,
16
+ session_type TEXT NOT NULL DEFAULT 'interactive',
17
+ platform TEXT NOT NULL DEFAULT 'other',
18
+ started_at TEXT NOT NULL,
19
+ ended_at TEXT,
20
+ status TEXT NOT NULL DEFAULT 'active',
21
+ metadata_json TEXT,
22
+ vclock_json TEXT NOT NULL,
23
+ deleted_at TEXT
24
+ );
25
+
26
+ CREATE INDEX IF NOT EXISTS idx_sessions_project
27
+ ON sessions(project_id);
28
+ CREATE INDEX IF NOT EXISTS idx_sessions_status
29
+ ON sessions(status) WHERE deleted_at IS NULL;
30
+ `,
31
+ },
32
+ {
33
+ id: 2,
34
+ name: "create_events",
35
+ sql: `
36
+ CREATE TABLE IF NOT EXISTS events (
37
+ id TEXT PRIMARY KEY,
38
+ session_id TEXT NOT NULL REFERENCES sessions(id),
39
+ parent_event_id TEXT REFERENCES events(id),
40
+ sequence INTEGER NOT NULL,
41
+ event_type TEXT NOT NULL,
42
+ actor TEXT NOT NULL,
43
+
44
+ prompt_text TEXT,
45
+ cot_text TEXT,
46
+ response_text TEXT,
47
+
48
+ tool_name TEXT,
49
+ tool_input_json TEXT,
50
+ tool_output_json TEXT,
51
+
52
+ checkpoint_sha TEXT,
53
+ checkpoint_ref TEXT,
54
+ diff_stat_json TEXT,
55
+
56
+ git_branch TEXT,
57
+ git_head_sha TEXT,
58
+ env_snapshot_id TEXT,
59
+
60
+ started_at TEXT NOT NULL,
61
+ ended_at TEXT,
62
+ status TEXT NOT NULL DEFAULT 'running',
63
+ error_json TEXT,
64
+ labels_json TEXT,
65
+ plan_task_id TEXT,
66
+
67
+ vclock_json TEXT NOT NULL,
68
+ deleted_at TEXT
69
+ );
70
+
71
+ CREATE INDEX IF NOT EXISTS idx_events_session
72
+ ON events(session_id, sequence);
73
+ CREATE INDEX IF NOT EXISTS idx_events_type
74
+ ON events(event_type) WHERE deleted_at IS NULL;
75
+ CREATE INDEX IF NOT EXISTS idx_events_checkpoint
76
+ ON events(checkpoint_sha) WHERE checkpoint_sha IS NOT NULL;
77
+ CREATE INDEX IF NOT EXISTS idx_events_actor
78
+ ON events(actor) WHERE deleted_at IS NULL;
79
+ `,
80
+ },
81
+ {
82
+ id: 3,
83
+ name: "create_env_snapshots",
84
+ sql: `
85
+ CREATE TABLE IF NOT EXISTS env_snapshots (
86
+ id TEXT PRIMARY KEY,
87
+ session_id TEXT NOT NULL REFERENCES sessions(id),
88
+ git_branch TEXT NOT NULL,
89
+ git_head_sha TEXT NOT NULL,
90
+ modified_files TEXT,
91
+ dep_lock_hash TEXT,
92
+ dep_lock_path TEXT,
93
+ env_vars_json TEXT,
94
+ node_version TEXT,
95
+ python_version TEXT,
96
+ os_info TEXT,
97
+ captured_at TEXT NOT NULL,
98
+ vclock_json TEXT NOT NULL,
99
+ deleted_at TEXT
100
+ );
101
+
102
+ CREATE INDEX IF NOT EXISTS idx_env_session
103
+ ON env_snapshots(session_id);
104
+ `,
105
+ },
106
+ {
107
+ id: 4,
108
+ name: "create_plans",
109
+ sql: `
110
+ CREATE TABLE IF NOT EXISTS plans (
111
+ id TEXT PRIMARY KEY,
112
+ project_id TEXT NOT NULL,
113
+ plan_type TEXT NOT NULL,
114
+ parent_plan_id TEXT REFERENCES plans(id),
115
+ title TEXT NOT NULL,
116
+ content_md TEXT NOT NULL,
117
+ status TEXT NOT NULL DEFAULT 'draft',
118
+ created_at TEXT NOT NULL,
119
+ updated_at TEXT,
120
+ vclock_json TEXT NOT NULL,
121
+ deleted_at TEXT
122
+ );
123
+
124
+ CREATE INDEX IF NOT EXISTS idx_plans_project
125
+ ON plans(project_id);
126
+ CREATE INDEX IF NOT EXISTS idx_plans_type
127
+ ON plans(plan_type) WHERE deleted_at IS NULL;
128
+ `,
129
+ },
130
+ {
131
+ id: 5,
132
+ name: "create_diffs",
133
+ sql: `
134
+ CREATE TABLE IF NOT EXISTS diffs (
135
+ id TEXT PRIMARY KEY,
136
+ event_id TEXT NOT NULL REFERENCES events(id),
137
+ diff_text TEXT NOT NULL,
138
+ file_filter TEXT,
139
+ created_at TEXT NOT NULL
140
+ );
141
+
142
+ CREATE INDEX IF NOT EXISTS idx_diffs_event
143
+ ON diffs(event_id);
144
+ `,
145
+ },
146
+ {
147
+ id: 6,
148
+ name: "add_env_snapshot_enrichment",
149
+ sql: `
150
+ ALTER TABLE env_snapshots ADD COLUMN container_info TEXT;
151
+ ALTER TABLE env_snapshots ADD COLUMN runtime_versions_json TEXT;
152
+ ALTER TABLE env_snapshots ADD COLUMN shell_info TEXT;
153
+ ALTER TABLE env_snapshots ADD COLUMN system_resources_json TEXT;
154
+ ALTER TABLE env_snapshots ADD COLUMN package_manager_json TEXT;
155
+ `,
156
+ },
157
+ {
158
+ id: 7,
159
+ name: "create_sync_state",
160
+ sql: `
161
+ CREATE TABLE IF NOT EXISTS sync_state (
162
+ server_url TEXT PRIMARY KEY,
163
+ client_id TEXT NOT NULL,
164
+ last_synced_event_id TEXT,
165
+ last_synced_at TEXT,
166
+ sync_version INTEGER NOT NULL DEFAULT 0
167
+ );
168
+ `,
169
+ },
170
+ {
171
+ id: 8,
172
+ name: "create_transcript_uploads",
173
+ sql: `
174
+ CREATE TABLE IF NOT EXISTS transcript_uploads (
175
+ id TEXT PRIMARY KEY,
176
+ session_id TEXT NOT NULL,
177
+ transcript_path TEXT NOT NULL,
178
+ server_url TEXT NOT NULL,
179
+ uploaded_bytes INTEGER NOT NULL DEFAULT 0,
180
+ file_size_bytes INTEGER NOT NULL DEFAULT 0,
181
+ status TEXT NOT NULL DEFAULT 'pending',
182
+ failure_count INTEGER NOT NULL DEFAULT 0,
183
+ last_error TEXT,
184
+ server_version TEXT,
185
+ created_at TEXT NOT NULL,
186
+ updated_at TEXT NOT NULL
187
+ );
188
+
189
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_transcript_path_server
190
+ ON transcript_uploads(transcript_path, server_url);
191
+ CREATE INDEX IF NOT EXISTS idx_transcript_status
192
+ ON transcript_uploads(status) WHERE status IN ('pending', 'uploading');
193
+ CREATE INDEX IF NOT EXISTS idx_transcript_session
194
+ ON transcript_uploads(session_id);
195
+ `,
196
+ },
197
+ {
198
+ id: 9,
199
+ name: "add_events_client_id_and_started_at_index",
200
+ sql: `
201
+ ALTER TABLE events ADD COLUMN client_id TEXT;
202
+
203
+ CREATE INDEX IF NOT EXISTS idx_events_started_at
204
+ ON events(started_at) WHERE deleted_at IS NULL;
205
+ `,
206
+ },
207
+ {
208
+ id: 10,
209
+ name: "add_sessions_platform_session_id",
210
+ sql: `
211
+ ALTER TABLE sessions ADD COLUMN platform_session_id TEXT;
212
+
213
+ CREATE INDEX IF NOT EXISTS idx_sessions_platform_session_id
214
+ ON sessions(platform_session_id) WHERE platform_session_id IS NOT NULL;
215
+ `,
216
+ },
217
+ {
218
+ id: 11,
219
+ name: "create_project_link_cache",
220
+ sql: `
221
+ CREATE TABLE IF NOT EXISTS project_link_cache (
222
+ project_id TEXT NOT NULL,
223
+ server_url TEXT NOT NULL,
224
+ confirmed_project_id TEXT,
225
+ last_commit_sha TEXT,
226
+ last_branch_sync_at TEXT,
227
+ last_doc_sync_at TEXT,
228
+ doc_hashes_json TEXT DEFAULT '{}',
229
+ qualified INTEGER DEFAULT 0,
230
+ initialized_at TEXT NOT NULL,
231
+ updated_at TEXT NOT NULL,
232
+ PRIMARY KEY (project_id, server_url)
233
+ );
234
+ `,
235
+ },
236
+ ];
237
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,CAAC,MAAM,UAAU,GAAgB;IACrC;QACE,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,iBAAiB;QACvB,GAAG,EAAE;;;;;;;;;;;;;;;;;;;KAmBJ;KACF;IACD;QACE,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,eAAe;QACrB,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4CJ;KACF;IACD;QACE,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,sBAAsB;QAC5B,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;KAoBJ;KACF;IACD;QACE,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,cAAc;QACpB,GAAG,EAAE;;;;;;;;;;;;;;;;;;;KAmBJ;KACF;IACD;QACE,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,cAAc;QACpB,GAAG,EAAE;;;;;;;;;;;KAWJ;KACF;IACD;QACE,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,6BAA6B;QACnC,GAAG,EAAE;;;;;;KAMJ;KACF;IACD;QACE,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,mBAAmB;QACzB,GAAG,EAAE;;;;;;;;KAQJ;KACF;IACD;QACE,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,2BAA2B;QACjC,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;KAsBJ;KACF;IACD;QACE,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,2CAA2C;QACjD,GAAG,EAAE;;;;;KAKJ;KACF;IACD;QACE,EAAE,EAAE,EAAE;QACN,IAAI,EAAE,kCAAkC;QACxC,GAAG,EAAE;;;;;KAKJ;KACF;IACD;QACE,EAAE,EAAE,EAAE;QACN,IAAI,EAAE,2BAA2B;QACjC,GAAG,EAAE;;;;;;;;;;;;;;KAcJ;KACF;CACF,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Plan CRUD operations (SpecFlow artifacts).
3
+ */
4
+ import type Database from "better-sqlite3";
5
+ import type { AditPlan, PlanType, PlanStatus } from "../types/index.js";
6
+ export interface CreatePlanInput {
7
+ id: string;
8
+ projectId: string;
9
+ planType: PlanType;
10
+ parentPlanId?: string | null;
11
+ title: string;
12
+ contentMd: string;
13
+ vclockJson: string;
14
+ }
15
+ export declare function insertPlan(db: Database.Database, input: CreatePlanInput): void;
16
+ export declare function getPlanById(db: Database.Database, id: string): AditPlan | null;
17
+ export declare function listPlans(db: Database.Database, projectId: string, planType?: PlanType): AditPlan[];
18
+ export declare function getChildPlans(db: Database.Database, parentPlanId: string): AditPlan[];
19
+ export declare function updatePlanStatus(db: Database.Database, id: string, status: PlanStatus, vclockJson: string): void;
20
+ export declare function updatePlanContent(db: Database.Database, id: string, contentMd: string, vclockJson: string): void;
21
+ //# sourceMappingURL=plans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../src/db/plans.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,eAAe,GACrB,IAAI,CAaN;AAED,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,EAAE,EAAE,MAAM,GACT,QAAQ,GAAG,IAAI,CAKjB;AAED,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,QAAQ,GAClB,QAAQ,EAAE,CAaZ;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,YAAY,EAAE,MAAM,GACnB,QAAQ,EAAE,CAOZ;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,MAAM,GACjB,IAAI,CAIN;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,IAAI,CAIN"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Plan CRUD operations (SpecFlow artifacts).
3
+ */
4
+ export function insertPlan(db, input) {
5
+ db.prepare(`
6
+ INSERT INTO plans (id, project_id, plan_type, parent_plan_id, title, content_md, created_at, vclock_json)
7
+ VALUES (?, ?, ?, ?, ?, ?, datetime('now'), ?)
8
+ `).run(input.id, input.projectId, input.planType, input.parentPlanId ?? null, input.title, input.contentMd, input.vclockJson);
9
+ }
10
+ export function getPlanById(db, id) {
11
+ const row = db.prepare("SELECT * FROM plans WHERE id = ?").get(id);
12
+ return row ? rowToPlan(row) : null;
13
+ }
14
+ export function listPlans(db, projectId, planType) {
15
+ let sql = "SELECT * FROM plans WHERE project_id = ? AND deleted_at IS NULL";
16
+ const params = [projectId];
17
+ if (planType) {
18
+ sql += " AND plan_type = ?";
19
+ params.push(planType);
20
+ }
21
+ sql += " ORDER BY created_at DESC";
22
+ const rows = db.prepare(sql).all(...params);
23
+ return rows.map(rowToPlan);
24
+ }
25
+ export function getChildPlans(db, parentPlanId) {
26
+ const rows = db
27
+ .prepare("SELECT * FROM plans WHERE parent_plan_id = ? AND deleted_at IS NULL ORDER BY created_at ASC")
28
+ .all(parentPlanId);
29
+ return rows.map(rowToPlan);
30
+ }
31
+ export function updatePlanStatus(db, id, status, vclockJson) {
32
+ db.prepare("UPDATE plans SET status = ?, updated_at = datetime('now'), vclock_json = ? WHERE id = ?").run(status, vclockJson, id);
33
+ }
34
+ export function updatePlanContent(db, id, contentMd, vclockJson) {
35
+ db.prepare("UPDATE plans SET content_md = ?, updated_at = datetime('now'), vclock_json = ? WHERE id = ?").run(contentMd, vclockJson, id);
36
+ }
37
+ function rowToPlan(row) {
38
+ return {
39
+ id: row.id,
40
+ projectId: row.project_id,
41
+ planType: row.plan_type,
42
+ parentPlanId: row.parent_plan_id ?? null,
43
+ title: row.title,
44
+ contentMd: row.content_md,
45
+ status: row.status,
46
+ createdAt: row.created_at,
47
+ updatedAt: row.updated_at ?? null,
48
+ vclockJson: row.vclock_json,
49
+ deletedAt: row.deleted_at ?? null,
50
+ };
51
+ }
52
+ //# sourceMappingURL=plans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plans.js","sourceRoot":"","sources":["../../src/db/plans.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,MAAM,UAAU,UAAU,CACxB,EAAqB,EACrB,KAAsB;IAEtB,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CACJ,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,YAAY,IAAI,IAAI,EAC1B,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,UAAU,CACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,EAAqB,EACrB,EAAU;IAEV,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,EAAE,CAEpD,CAAC;IACd,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,EAAqB,EACrB,SAAiB,EACjB,QAAmB;IAEnB,IAAI,GAAG,GACL,iEAAiE,CAAC;IACpE,MAAM,MAAM,GAAc,CAAC,SAAS,CAAC,CAAC;IAEtC,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,IAAI,oBAAoB,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IACD,GAAG,IAAI,2BAA2B,CAAC;IAEnC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAA8B,CAAC;IACzE,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,EAAqB,EACrB,YAAoB;IAEpB,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN,6FAA6F,CAC9F;SACA,GAAG,CAAC,YAAY,CAA8B,CAAC;IAClD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,EAAqB,EACrB,EAAU,EACV,MAAkB,EAClB,UAAkB;IAElB,EAAE,CAAC,OAAO,CACR,yFAAyF,CAC1F,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,EAAqB,EACrB,EAAU,EACV,SAAiB,EACjB,UAAkB;IAElB,EAAE,CAAC,OAAO,CACR,6FAA6F,CAC9F,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,SAAS,CAAC,GAA4B;IAC7C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAY;QACpB,SAAS,EAAE,GAAG,CAAC,UAAoB;QACnC,QAAQ,EAAE,GAAG,CAAC,SAAqB;QACnC,YAAY,EAAG,GAAG,CAAC,cAAyB,IAAI,IAAI;QACpD,KAAK,EAAE,GAAG,CAAC,KAAe;QAC1B,SAAS,EAAE,GAAG,CAAC,UAAoB;QACnC,MAAM,EAAE,GAAG,CAAC,MAAoB;QAChC,SAAS,EAAE,GAAG,CAAC,UAAoB;QACnC,SAAS,EAAG,GAAG,CAAC,UAAqB,IAAI,IAAI;QAC7C,UAAU,EAAE,GAAG,CAAC,WAAqB;QACrC,SAAS,EAAG,GAAG,CAAC,UAAqB,IAAI,IAAI;KAC9C,CAAC;AACJ,CAAC"}