@hardkas/query-store 0.2.2-alpha → 0.3.0-alpha
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/dist/backend.d.ts +47 -4
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +76 -5
- package/dist/backend.js.map +1 -1
- package/dist/db.d.ts +20 -3
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +105 -35
- package/dist/db.js.map +1 -1
- package/dist/indexer.d.ts +51 -3
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js +309 -90
- package/dist/indexer.js.map +1 -1
- package/dist/migrations.d.ts +42 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +195 -0
- package/dist/migrations.js.map +1 -0
- package/dist/schema.d.ts +20 -2
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +1 -78
- package/dist/schema.js.map +1 -1
- package/package.json +8 -5
package/dist/indexer.js
CHANGED
|
@@ -1,146 +1,365 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const { DatabaseSync } = require("node:sqlite");
|
|
6
|
+
import { calculateContentHash, verifyArtifactIntegrity } from "@hardkas/artifacts";
|
|
7
|
+
import { validateEventEnvelope, formatCorruptionIssue } from "@hardkas/core";
|
|
5
8
|
export class HardkasIndexer {
|
|
6
9
|
db;
|
|
7
10
|
hardkasDir;
|
|
11
|
+
strict;
|
|
8
12
|
constructor(db, options = {}) {
|
|
9
13
|
this.db = db;
|
|
10
14
|
this.hardkasDir = path.join(options.cwd || process.cwd(), ".hardkas");
|
|
15
|
+
this.strict = options.strict || false;
|
|
11
16
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Performs an incremental sync of the index.
|
|
19
|
+
* Transactional.
|
|
20
|
+
*/
|
|
21
|
+
async sync() {
|
|
22
|
+
const result = {
|
|
23
|
+
schema: "hardkas.queryRebuild.v1",
|
|
24
|
+
ok: true,
|
|
25
|
+
artifacts: { scanned: 0, indexed: 0, duplicates: 0, corrupted: 0 },
|
|
26
|
+
events: { scanned: 0, indexed: 0, duplicates: 0, corrupted: 0 },
|
|
27
|
+
warnings: [],
|
|
28
|
+
errors: [],
|
|
29
|
+
issues: []
|
|
30
|
+
};
|
|
31
|
+
if (!fs.existsSync(this.hardkasDir)) {
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
// HardKAS Policy: Do not nest transactions.
|
|
35
|
+
// Sync handles its own transaction.
|
|
15
36
|
this.db.exec("BEGIN TRANSACTION;");
|
|
16
37
|
try {
|
|
17
|
-
this.
|
|
18
|
-
this.syncEvents();
|
|
19
|
-
this.syncTraces();
|
|
38
|
+
await this._syncInternal(result);
|
|
20
39
|
this.db.exec("COMMIT;");
|
|
21
40
|
}
|
|
22
41
|
catch (e) {
|
|
23
42
|
this.db.exec("ROLLBACK;");
|
|
24
|
-
|
|
43
|
+
result.ok = false;
|
|
44
|
+
result.errors.push(`Sync failed: ${e.message}`);
|
|
45
|
+
if (this.strict)
|
|
46
|
+
throw e;
|
|
25
47
|
}
|
|
48
|
+
return result;
|
|
26
49
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Internal indexing logic without transaction management.
|
|
52
|
+
*/
|
|
53
|
+
async _syncInternal(result) {
|
|
54
|
+
await this.syncArtifacts(result);
|
|
55
|
+
this.syncEvents(result);
|
|
56
|
+
this.syncTraces();
|
|
57
|
+
this.cleanupZombies();
|
|
58
|
+
// Mark last sync
|
|
59
|
+
this.db.prepare("INSERT OR REPLACE INTO metadata (key, value) VALUES (?, ?)")
|
|
60
|
+
.run("last_indexed_at", new Date().toISOString());
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Complete wipe and rebuild of the index.
|
|
64
|
+
*/
|
|
65
|
+
/**
|
|
66
|
+
* Complete wipe and rebuild of the index.
|
|
67
|
+
* Atomic across wipe and first sync.
|
|
68
|
+
*/
|
|
69
|
+
async rebuild() {
|
|
70
|
+
const result = {
|
|
71
|
+
schema: "hardkas.queryRebuild.v1",
|
|
72
|
+
ok: true,
|
|
73
|
+
artifacts: { scanned: 0, indexed: 0, duplicates: 0, corrupted: 0 },
|
|
74
|
+
events: { scanned: 0, indexed: 0, duplicates: 0, corrupted: 0 },
|
|
75
|
+
warnings: [],
|
|
76
|
+
errors: [],
|
|
77
|
+
issues: []
|
|
78
|
+
};
|
|
79
|
+
this.db.exec("BEGIN TRANSACTION;");
|
|
80
|
+
try {
|
|
81
|
+
// 1. Wipe
|
|
82
|
+
this._wipeInternal();
|
|
83
|
+
// 2. Full Sync (using internal logic to avoid nested transaction)
|
|
84
|
+
if (fs.existsSync(this.hardkasDir)) {
|
|
85
|
+
await this._syncInternal(result);
|
|
42
86
|
}
|
|
43
|
-
|
|
87
|
+
this.db.exec("COMMIT;");
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
this.db.exec("ROLLBACK;");
|
|
91
|
+
result.ok = false;
|
|
92
|
+
result.errors.push(`Rebuild failed: ${e.message}`);
|
|
93
|
+
if (this.strict)
|
|
94
|
+
throw e;
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
_wipeInternal() {
|
|
99
|
+
this.db.exec("DELETE FROM traces;");
|
|
100
|
+
this.db.exec("DELETE FROM events;");
|
|
101
|
+
this.db.exec("DELETE FROM lineage_edges;");
|
|
102
|
+
this.db.exec("DELETE FROM artifacts;");
|
|
103
|
+
this.db.exec("DELETE FROM metadata WHERE key = 'last_indexed_at';");
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Diagnostic check of the index integrity and freshness.
|
|
107
|
+
*/
|
|
108
|
+
doctor() {
|
|
109
|
+
const report = {
|
|
110
|
+
ok: true,
|
|
111
|
+
staleArtifacts: 0,
|
|
112
|
+
zombieArtifacts: 0,
|
|
113
|
+
corruptedFiles: [],
|
|
114
|
+
orphanEdges: 0,
|
|
115
|
+
lastIndexedAt: null
|
|
44
116
|
};
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
117
|
+
// 1. Check last indexed
|
|
118
|
+
const lastIdx = this.db.prepare("SELECT value FROM metadata WHERE key = 'last_indexed_at'").get();
|
|
119
|
+
report.lastIndexedAt = lastIdx?.value || null;
|
|
120
|
+
// 2. Check for zombie rows (rows with no file or mismatched mtime)
|
|
121
|
+
const rows = this.db.prepare("SELECT artifact_id, file_path, file_mtime_ms FROM artifacts").all();
|
|
122
|
+
for (const row of rows) {
|
|
123
|
+
if (!row.file_path || !fs.existsSync(row.file_path)) {
|
|
124
|
+
report.zombieArtifacts++;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const stat = fs.statSync(row.file_path);
|
|
128
|
+
if (stat.mtimeMs !== row.file_mtime_ms) {
|
|
129
|
+
report.staleArtifacts++;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// 3. Check for orphan edges
|
|
134
|
+
const orphans = this.db.prepare(`
|
|
135
|
+
SELECT COUNT(*) as count FROM lineage_edges
|
|
136
|
+
WHERE parent_artifact_id NOT IN (SELECT artifact_id FROM artifacts)
|
|
137
|
+
OR child_artifact_id NOT IN (SELECT artifact_id FROM artifacts)
|
|
138
|
+
`).get();
|
|
139
|
+
report.orphanEdges = orphans.count;
|
|
140
|
+
report.ok = report.staleArtifacts === 0 && report.zombieArtifacts === 0 && report.orphanEdges === 0;
|
|
141
|
+
return report;
|
|
142
|
+
}
|
|
143
|
+
async syncArtifacts(result) {
|
|
144
|
+
// Sort files to ensure deterministic indexing order
|
|
145
|
+
const files = this.walk(this.hardkasDir).sort();
|
|
146
|
+
const indexedAt = new Date().toISOString();
|
|
147
|
+
const upsertArtifact = this.db.prepare(`
|
|
148
|
+
INSERT INTO artifacts
|
|
149
|
+
(artifact_id, content_hash, schema, version, kind, mode, network_id, tx_id, created_at, raw_json, file_path, file_mtime_ms, indexed_at)
|
|
150
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
151
|
+
ON CONFLICT(artifact_id) DO UPDATE SET
|
|
152
|
+
content_hash = excluded.content_hash,
|
|
153
|
+
schema = excluded.schema,
|
|
154
|
+
version = excluded.version,
|
|
155
|
+
kind = excluded.kind,
|
|
156
|
+
mode = excluded.mode,
|
|
157
|
+
network_id = excluded.network_id,
|
|
158
|
+
tx_id = excluded.tx_id,
|
|
159
|
+
created_at = excluded.created_at,
|
|
160
|
+
raw_json = excluded.raw_json,
|
|
161
|
+
file_path = excluded.file_path,
|
|
162
|
+
file_mtime_ms = excluded.file_mtime_ms,
|
|
163
|
+
indexed_at = excluded.indexed_at
|
|
50
164
|
`);
|
|
51
|
-
const insertEdge = this.db.prepare(`
|
|
52
|
-
INSERT OR
|
|
53
|
-
VALUES (?, ?, ?, ?, ?)
|
|
165
|
+
const insertEdge = this.db.prepare(`
|
|
166
|
+
INSERT OR REPLACE INTO lineage_edges (lineage_id, parent_artifact_id, child_artifact_id, edge_kind, created_at)
|
|
167
|
+
VALUES (?, ?, ?, ?, ?)
|
|
54
168
|
`);
|
|
55
|
-
const
|
|
56
|
-
// Pass 1: Index Artifacts
|
|
169
|
+
const artifactsToLink = [];
|
|
57
170
|
for (const file of files) {
|
|
58
|
-
|
|
171
|
+
result.artifacts.scanned++;
|
|
172
|
+
const stat = fs.statSync(file);
|
|
59
173
|
try {
|
|
174
|
+
const verification = await verifyArtifactIntegrity(file);
|
|
175
|
+
if (!verification.ok) {
|
|
176
|
+
result.artifacts.corrupted++;
|
|
177
|
+
verification.issues.forEach(issue => {
|
|
178
|
+
const corruptionIssue = {
|
|
179
|
+
code: issue.code,
|
|
180
|
+
severity: issue.severity === "warning" ? "warning" : "error",
|
|
181
|
+
message: issue.message,
|
|
182
|
+
path: file
|
|
183
|
+
};
|
|
184
|
+
result.issues.push(corruptionIssue);
|
|
185
|
+
result.warnings.push(formatCorruptionIssue(corruptionIssue));
|
|
186
|
+
});
|
|
187
|
+
if (this.strict) {
|
|
188
|
+
throw new Error(`Strict mode: corrupted artifact in ${file}`);
|
|
189
|
+
}
|
|
190
|
+
continue; // Skip corrupted artifact
|
|
191
|
+
}
|
|
192
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
60
193
|
const parsed = JSON.parse(content);
|
|
61
|
-
|
|
62
|
-
|
|
194
|
+
// Artifact ID is required for indexing
|
|
195
|
+
const artifactId = parsed.artifactId || parsed.contentHash || calculateContentHash(parsed);
|
|
63
196
|
const hash = parsed.contentHash || calculateContentHash(parsed);
|
|
64
|
-
|
|
197
|
+
upsertArtifact.run(artifactId, hash, parsed.schema, parsed.version, parsed.kind || parsed.schema, parsed.mode || "unknown", parsed.networkId || "unknown", parsed.txId || null, parsed.createdAt || null, content, file, stat.mtimeMs, indexedAt);
|
|
198
|
+
result.artifacts.indexed++;
|
|
65
199
|
if (parsed.lineage && parsed.lineage.parentArtifactId) {
|
|
66
|
-
|
|
200
|
+
artifactsToLink.push(parsed);
|
|
67
201
|
}
|
|
68
202
|
}
|
|
69
203
|
catch (e) {
|
|
70
|
-
|
|
204
|
+
result.artifacts.corrupted++;
|
|
205
|
+
const code = e instanceof SyntaxError ? "ARTIFACT_JSON_INVALID" : "ARTIFACT_ID_INVALID";
|
|
206
|
+
const corruptionIssue = {
|
|
207
|
+
code: code,
|
|
208
|
+
severity: "error",
|
|
209
|
+
message: e.message,
|
|
210
|
+
path: file
|
|
211
|
+
};
|
|
212
|
+
result.issues.push(corruptionIssue);
|
|
213
|
+
if (this.strict)
|
|
214
|
+
throw e;
|
|
215
|
+
result.warnings.push(formatCorruptionIssue(corruptionIssue));
|
|
71
216
|
}
|
|
72
217
|
}
|
|
73
|
-
// Pass 2:
|
|
74
|
-
for (const parsed of
|
|
218
|
+
// Pass 2: Lineage Edges (Now all artifact IDs exist)
|
|
219
|
+
for (const parsed of artifactsToLink) {
|
|
75
220
|
try {
|
|
76
|
-
insertEdge.run(parsed.lineage.lineageId || "legacy-lineage", parsed.lineage.parentArtifactId, parsed.artifactId, "derived", parsed.createdAt || null);
|
|
221
|
+
insertEdge.run(parsed.lineage.lineageId || "legacy-lineage", parsed.lineage.parentArtifactId, parsed.artifactId || parsed.contentHash, "derived", parsed.createdAt || null);
|
|
77
222
|
}
|
|
78
223
|
catch (e) {
|
|
79
|
-
|
|
224
|
+
result.warnings.push(`Failed to link lineage for ${parsed.artifactId}: ${e.message}`);
|
|
80
225
|
}
|
|
81
226
|
}
|
|
82
227
|
}
|
|
83
|
-
syncEvents() {
|
|
228
|
+
syncEvents(result) {
|
|
84
229
|
const eventsPath = path.join(this.hardkasDir, "events.jsonl");
|
|
85
230
|
if (!fs.existsSync(eventsPath))
|
|
86
231
|
return;
|
|
232
|
+
const stat = fs.statSync(eventsPath);
|
|
233
|
+
const indexedAt = new Date().toISOString();
|
|
87
234
|
const content = fs.readFileSync(eventsPath, "utf-8");
|
|
88
|
-
const lines = content.split("\n")
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
235
|
+
const lines = content.split("\n");
|
|
236
|
+
const upsertEvent = this.db.prepare(`
|
|
237
|
+
INSERT INTO events
|
|
238
|
+
(event_id, kind, domain, timestamp, workflow_id, correlation_id, causation_id, tx_id, artifact_id, network_id, raw_json, file_path, file_mtime_ms, indexed_at)
|
|
239
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
240
|
+
ON CONFLICT(event_id) DO UPDATE SET
|
|
241
|
+
kind = excluded.kind,
|
|
242
|
+
domain = excluded.domain,
|
|
243
|
+
timestamp = excluded.timestamp,
|
|
244
|
+
workflow_id = excluded.workflow_id,
|
|
245
|
+
correlation_id = excluded.correlation_id,
|
|
246
|
+
causation_id = excluded.causation_id,
|
|
247
|
+
tx_id = excluded.tx_id,
|
|
248
|
+
artifact_id = excluded.artifact_id,
|
|
249
|
+
network_id = excluded.network_id,
|
|
250
|
+
raw_json = excluded.raw_json,
|
|
251
|
+
file_path = excluded.file_path,
|
|
252
|
+
file_mtime_ms = excluded.file_mtime_ms,
|
|
253
|
+
indexed_at = excluded.indexed_at
|
|
99
254
|
`);
|
|
100
|
-
for (
|
|
255
|
+
for (let i = 0; i < lines.length; i++) {
|
|
256
|
+
const line = lines[i].trim();
|
|
257
|
+
if (line === "")
|
|
258
|
+
continue;
|
|
259
|
+
result.events.scanned++;
|
|
260
|
+
const lineNum = i + 1;
|
|
101
261
|
try {
|
|
102
262
|
const parsed = JSON.parse(line);
|
|
103
|
-
if (!validateEventEnvelope(parsed))
|
|
263
|
+
if (!validateEventEnvelope(parsed)) {
|
|
264
|
+
const issue = {
|
|
265
|
+
code: "EVENT_SCHEMA_INVALID",
|
|
266
|
+
severity: "error",
|
|
267
|
+
message: "Invalid event envelope structure",
|
|
268
|
+
path: eventsPath,
|
|
269
|
+
lineNumber: lineNum
|
|
270
|
+
};
|
|
271
|
+
result.issues.push(issue);
|
|
272
|
+
result.events.corrupted++;
|
|
273
|
+
if (this.strict)
|
|
274
|
+
throw new Error(formatCorruptionIssue(issue));
|
|
275
|
+
result.warnings.push(formatCorruptionIssue(issue));
|
|
104
276
|
continue;
|
|
105
|
-
|
|
277
|
+
}
|
|
278
|
+
upsertEvent.run(parsed.eventId, parsed.kind, parsed.domain, parsed.timestamp || null, parsed.workflowId, parsed.correlationId, parsed.causationId || null, parsed.txId || null, parsed.artifactId || null, parsed.networkId, line, eventsPath, stat.mtimeMs, indexedAt);
|
|
279
|
+
result.events.indexed++;
|
|
106
280
|
}
|
|
107
281
|
catch (e) {
|
|
108
|
-
|
|
282
|
+
result.events.corrupted++;
|
|
283
|
+
const issue = {
|
|
284
|
+
code: e instanceof SyntaxError ? "EVENT_JSON_INVALID" : "EVENT_LINE_CORRUPT",
|
|
285
|
+
severity: "error",
|
|
286
|
+
message: e.message,
|
|
287
|
+
path: eventsPath,
|
|
288
|
+
lineNumber: lineNum
|
|
289
|
+
};
|
|
290
|
+
result.issues.push(issue);
|
|
291
|
+
if (this.strict) {
|
|
292
|
+
throw new Error(formatCorruptionIssue(issue));
|
|
293
|
+
}
|
|
294
|
+
result.warnings.push(formatCorruptionIssue(issue));
|
|
109
295
|
}
|
|
110
296
|
}
|
|
111
297
|
}
|
|
112
298
|
syncTraces() {
|
|
113
|
-
const upsertTrace = this.db.prepare(`
|
|
114
|
-
INSERT INTO traces (trace_id, workflow_id, root_event_id, status, started_at, ended_at)
|
|
115
|
-
SELECT
|
|
116
|
-
'trace-' || workflow_id as trace_id,
|
|
117
|
-
workflow_id,
|
|
118
|
-
event_id as root_event_id,
|
|
119
|
-
CASE
|
|
120
|
-
WHEN kind = 'workflow.completed' THEN 'completed'
|
|
121
|
-
WHEN kind = 'workflow.failed' THEN 'failed'
|
|
122
|
-
ELSE 'running'
|
|
123
|
-
END as status,
|
|
124
|
-
timestamp as started_at,
|
|
125
|
-
CASE
|
|
126
|
-
WHEN kind IN ('workflow.completed', 'workflow.failed') THEN timestamp
|
|
127
|
-
ELSE NULL
|
|
128
|
-
END as ended_at
|
|
129
|
-
FROM events
|
|
130
|
-
WHERE kind LIKE 'workflow.%'
|
|
131
|
-
ON CONFLICT(workflow_id) DO UPDATE SET
|
|
132
|
-
status = CASE
|
|
133
|
-
WHEN excluded.status IN ('completed', 'failed') THEN excluded.status
|
|
134
|
-
ELSE traces.status
|
|
135
|
-
END,
|
|
136
|
-
ended_at = CASE
|
|
137
|
-
WHEN excluded.status IN ('completed', 'failed') THEN excluded.ended_at
|
|
138
|
-
ELSE traces.ended_at
|
|
139
|
-
END,
|
|
140
|
-
root_event_id = COALESCE(traces.root_event_id, excluded.root_event_id),
|
|
141
|
-
started_at = COALESCE(traces.started_at, excluded.started_at)
|
|
299
|
+
const upsertTrace = this.db.prepare(`
|
|
300
|
+
INSERT INTO traces (trace_id, workflow_id, root_event_id, status, started_at, ended_at)
|
|
301
|
+
SELECT
|
|
302
|
+
'trace-' || workflow_id as trace_id,
|
|
303
|
+
workflow_id,
|
|
304
|
+
event_id as root_event_id,
|
|
305
|
+
CASE
|
|
306
|
+
WHEN kind = 'workflow.completed' THEN 'completed'
|
|
307
|
+
WHEN kind = 'workflow.failed' THEN 'failed'
|
|
308
|
+
ELSE 'running'
|
|
309
|
+
END as status,
|
|
310
|
+
timestamp as started_at,
|
|
311
|
+
CASE
|
|
312
|
+
WHEN kind IN ('workflow.completed', 'workflow.failed') THEN timestamp
|
|
313
|
+
ELSE NULL
|
|
314
|
+
END as ended_at
|
|
315
|
+
FROM events
|
|
316
|
+
WHERE kind LIKE 'workflow.%'
|
|
317
|
+
ON CONFLICT(workflow_id) DO UPDATE SET
|
|
318
|
+
status = CASE
|
|
319
|
+
WHEN excluded.status IN ('completed', 'failed') THEN excluded.status
|
|
320
|
+
ELSE traces.status
|
|
321
|
+
END,
|
|
322
|
+
ended_at = CASE
|
|
323
|
+
WHEN excluded.status IN ('completed', 'failed') THEN excluded.ended_at
|
|
324
|
+
ELSE traces.ended_at
|
|
325
|
+
END,
|
|
326
|
+
root_event_id = COALESCE(traces.root_event_id, excluded.root_event_id),
|
|
327
|
+
started_at = COALESCE(traces.started_at, excluded.started_at)
|
|
142
328
|
`);
|
|
143
329
|
upsertTrace.run();
|
|
144
330
|
}
|
|
331
|
+
cleanupZombies() {
|
|
332
|
+
const rows = this.db.prepare("SELECT artifact_id, file_path FROM artifacts").all();
|
|
333
|
+
const deleteArtifact = this.db.prepare("DELETE FROM artifacts WHERE artifact_id = ?");
|
|
334
|
+
for (const row of rows) {
|
|
335
|
+
if (!row.file_path || !fs.existsSync(row.file_path)) {
|
|
336
|
+
deleteArtifact.run(row.artifact_id);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
// Events cleanup (if file gone, all events gone)
|
|
340
|
+
const eventsPath = path.join(this.hardkasDir, "events.jsonl");
|
|
341
|
+
if (!fs.existsSync(eventsPath)) {
|
|
342
|
+
this.db.exec("DELETE FROM events;");
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
walk(dir) {
|
|
346
|
+
let results = [];
|
|
347
|
+
if (!fs.existsSync(dir))
|
|
348
|
+
return results;
|
|
349
|
+
const list = fs.readdirSync(dir);
|
|
350
|
+
for (const file of list) {
|
|
351
|
+
const filePath = path.join(dir, file);
|
|
352
|
+
const stat = fs.statSync(filePath);
|
|
353
|
+
if (stat.isDirectory()) {
|
|
354
|
+
if (file === "node_modules" || file === ".git")
|
|
355
|
+
continue;
|
|
356
|
+
results = results.concat(this.walk(filePath));
|
|
357
|
+
}
|
|
358
|
+
else if (file.endsWith(".json") && !file.endsWith("events.jsonl") && file !== "state.json") {
|
|
359
|
+
results.push(filePath);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return results;
|
|
363
|
+
}
|
|
145
364
|
}
|
|
146
365
|
//# sourceMappingURL=indexer.js.map
|
package/dist/indexer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface Migration {
|
|
2
|
+
version: number;
|
|
3
|
+
name: string;
|
|
4
|
+
checksum: string;
|
|
5
|
+
up(db: any): void;
|
|
6
|
+
}
|
|
7
|
+
export interface MigrationHistoryEntry {
|
|
8
|
+
version: number;
|
|
9
|
+
name: string;
|
|
10
|
+
checksum: string;
|
|
11
|
+
applied_at: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class MigrationRunner {
|
|
14
|
+
private db;
|
|
15
|
+
constructor(db: any);
|
|
16
|
+
/**
|
|
17
|
+
* Ensures the migration history table exists.
|
|
18
|
+
*/
|
|
19
|
+
ensureHistoryTable(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Fetches all applied migrations from the history table.
|
|
22
|
+
*/
|
|
23
|
+
getAppliedMigrations(): MigrationHistoryEntry[];
|
|
24
|
+
/**
|
|
25
|
+
* Applies pending migrations in order.
|
|
26
|
+
*/
|
|
27
|
+
migrate(migrations: Migration[]): {
|
|
28
|
+
applied: number;
|
|
29
|
+
status: "ok" | "bootstrapped" | "failed";
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Legacy bootstrap: if the DB is in a known state but has no migration history,
|
|
33
|
+
* we inject the history without running the 'up' logic.
|
|
34
|
+
*/
|
|
35
|
+
bootstrapLegacy(knownVersion: number, migrations: Migration[]): boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Registry of all query-store migrations.
|
|
39
|
+
* Version 1: Initial schema (Baseline v0.2-alpha).
|
|
40
|
+
*/
|
|
41
|
+
export declare const MIGRATIONS: Migration[];
|
|
42
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,GAAG;IAE3B;;OAEG;IACI,kBAAkB,IAAI,IAAI;IAWjC;;OAEG;IACI,oBAAoB,IAAI,qBAAqB,EAAE;IAStD;;OAEG;IACI,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,IAAI,GAAG,cAAc,GAAG,QAAQ,CAAA;KAAE;IAkDtG;;;OAGG;IACI,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO;CAkB/E;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,EA+FjC,CAAC"}
|