@hardkas/query-store 0.2.1-alpha → 0.2.2-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/backend.d.ts CHANGED
@@ -1,14 +1,17 @@
1
1
  import { HardkasStore } from "./db.js";
2
+ import { ExecutionMode, NetworkId } from "@hardkas/core";
2
3
  export interface ArtifactDocument {
3
4
  readonly contentHash: string;
4
5
  readonly schema: string;
5
6
  readonly version: string;
6
7
  readonly kind: string;
7
- readonly networkId: string;
8
+ readonly mode: ExecutionMode;
9
+ readonly networkId: NetworkId;
8
10
  readonly createdAt: string | null;
9
11
  readonly txId: string | null;
10
12
  readonly artifactId: string;
11
- readonly payload: unknown;
13
+ readonly path: string;
14
+ readonly payload: any;
12
15
  }
13
16
  export interface EventDocument {
14
17
  readonly eventId: string;
@@ -24,14 +27,15 @@ export interface EventDocument {
24
27
  readonly payload: unknown;
25
28
  }
26
29
  export interface LineageEdgeDocument {
27
- readonly lineageId: string;
28
30
  readonly parentArtifactId: string;
29
31
  readonly childArtifactId: string;
30
- readonly edgeKind: string;
32
+ readonly lineageId: string;
33
+ readonly rule: string;
31
34
  readonly createdAt: string | null;
32
35
  }
33
36
  export interface QueryBackend {
34
37
  isReady(): boolean;
38
+ kind(): "sqlite" | "filesystem";
35
39
  findArtifacts(filters?: {
36
40
  schema?: string;
37
41
  mode?: string;
@@ -46,11 +50,22 @@ export interface QueryBackend {
46
50
  parentHash?: string;
47
51
  childHash?: string;
48
52
  }): Promise<LineageEdgeDocument[]>;
53
+ getStoreStatus(): Promise<string>;
54
+ doctor(): Promise<any>;
55
+ rebuild(): Promise<void>;
56
+ findReceipts(filters?: {
57
+ status?: string;
58
+ networkId?: string;
59
+ }): Promise<ArtifactDocument[]>;
60
+ findTraces(filters?: {
61
+ txId?: string;
62
+ }): Promise<ArtifactDocument[]>;
49
63
  }
50
64
  export declare class SqliteQueryBackend implements QueryBackend {
51
65
  private store;
52
66
  constructor(store: HardkasStore);
53
67
  isReady(): boolean;
68
+ kind(): "sqlite";
54
69
  findArtifacts(filters?: {
55
70
  schema?: string;
56
71
  mode?: string;
@@ -65,5 +80,15 @@ export declare class SqliteQueryBackend implements QueryBackend {
65
80
  parentHash?: string;
66
81
  childHash?: string;
67
82
  }): Promise<LineageEdgeDocument[]>;
83
+ findReceipts(filters?: {
84
+ status?: string;
85
+ networkId?: string;
86
+ }): Promise<ArtifactDocument[]>;
87
+ findTraces(filters?: {
88
+ txId?: string;
89
+ }): Promise<ArtifactDocument[]>;
90
+ getStoreStatus(): Promise<string>;
91
+ doctor(): Promise<any>;
92
+ rebuild(): Promise<void>;
68
93
  }
69
94
  //# sourceMappingURL=backend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
package/dist/backend.js CHANGED
@@ -6,6 +6,9 @@ export class SqliteQueryBackend {
6
6
  isReady() {
7
7
  return this.store.getDatabase() !== null;
8
8
  }
9
+ kind() {
10
+ return "sqlite";
11
+ }
9
12
  async findArtifacts(filters) {
10
13
  const db = this.store.getDatabase();
11
14
  let query = "SELECT * FROM artifacts WHERE 1=1";
@@ -15,7 +18,7 @@ export class SqliteQueryBackend {
15
18
  params.push(filters.schema);
16
19
  }
17
20
  if (filters?.mode) {
18
- query += " AND mode = ?";
21
+ query += " AND kind = ?"; // Note: kind stores mode info in simple schemas
19
22
  params.push(filters.mode);
20
23
  }
21
24
  if (filters?.networkId) {
@@ -28,16 +31,18 @@ export class SqliteQueryBackend {
28
31
  schema: r.schema,
29
32
  version: r.version,
30
33
  kind: r.kind,
34
+ mode: r.kind, // Match mode to kind for now
31
35
  networkId: r.network_id,
32
36
  createdAt: r.created_at,
33
37
  txId: r.tx_id,
34
38
  artifactId: r.artifact_id,
39
+ path: r.file_path || r.artifact_id,
35
40
  payload: JSON.parse(r.raw_json)
36
41
  }));
37
42
  }
38
43
  async getArtifact(idOrHash) {
39
44
  const db = this.store.getDatabase();
40
- const row = db.prepare("SELECT * FROM artifacts WHERE artifact_id = ? OR content_hash = ?").get(idOrHash, idOrHash);
45
+ const row = db.prepare("SELECT * FROM artifacts WHERE artifact_id = ? OR content_hash = ? OR tx_id = ?").get(idOrHash, idOrHash, idOrHash);
41
46
  if (!row)
42
47
  return null;
43
48
  return {
@@ -45,10 +50,12 @@ export class SqliteQueryBackend {
45
50
  schema: row.schema,
46
51
  version: row.version,
47
52
  kind: row.kind,
53
+ mode: row.kind,
48
54
  networkId: row.network_id,
49
55
  createdAt: row.created_at,
50
56
  txId: row.tx_id,
51
57
  artifactId: row.artifact_id,
58
+ path: row.file_path || row.artifact_id,
52
59
  payload: JSON.parse(row.raw_json)
53
60
  };
54
61
  }
@@ -84,21 +91,63 @@ export class SqliteQueryBackend {
84
91
  let query = "SELECT * FROM lineage_edges WHERE 1=1";
85
92
  const params = [];
86
93
  if (filters?.parentHash) {
87
- query += " AND parent_hash = ?";
94
+ query += " AND parent_artifact_id = ?";
88
95
  params.push(filters.parentHash);
89
96
  }
90
97
  if (filters?.childHash) {
91
- query += " AND child_hash = ?";
98
+ query += " AND child_artifact_id = ?";
92
99
  params.push(filters.childHash);
93
100
  }
94
101
  const rows = db.prepare(query).all(...params);
95
102
  return rows.map(r => ({
96
- lineageId: r.lineage_id,
97
103
  parentArtifactId: r.parent_artifact_id,
98
104
  childArtifactId: r.child_artifact_id,
99
- edgeKind: r.edge_kind,
105
+ lineageId: r.lineage_id,
106
+ rule: r.edge_kind,
100
107
  createdAt: r.created_at
101
108
  }));
102
109
  }
110
+ async findReceipts(filters) {
111
+ return this.findArtifacts({ schema: "hardkas.txReceipt", ...filters });
112
+ }
113
+ async findTraces(filters) {
114
+ const db = this.store.getDatabase();
115
+ let query = "SELECT * FROM artifacts WHERE schema = 'hardkas.txTrace'";
116
+ const params = [];
117
+ if (filters?.txId) {
118
+ query += " AND tx_id = ?";
119
+ params.push(filters.txId);
120
+ }
121
+ const rows = db.prepare(query).all(...params);
122
+ return rows.map(r => ({
123
+ contentHash: r.content_hash,
124
+ schema: r.schema,
125
+ version: r.version,
126
+ kind: r.kind,
127
+ mode: r.kind,
128
+ networkId: r.network_id,
129
+ createdAt: r.created_at,
130
+ txId: r.tx_id,
131
+ artifactId: r.artifact_id,
132
+ path: r.file_path || r.artifact_id,
133
+ payload: JSON.parse(r.raw_json)
134
+ }));
135
+ }
136
+ async getStoreStatus() {
137
+ const { HardkasIndexer } = await import("./indexer.js");
138
+ const indexer = new HardkasIndexer(this.store.getDatabase());
139
+ const report = indexer.doctor();
140
+ return report.ok ? "fresh" : "stale";
141
+ }
142
+ async doctor() {
143
+ const { HardkasIndexer } = await import("./indexer.js");
144
+ const indexer = new HardkasIndexer(this.store.getDatabase());
145
+ return indexer.doctor();
146
+ }
147
+ async rebuild() {
148
+ const { HardkasIndexer } = await import("./indexer.js");
149
+ const indexer = new HardkasIndexer(this.store.getDatabase());
150
+ indexer.rebuild();
151
+ }
103
152
  }
104
153
  //# sourceMappingURL=backend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
package/dist/indexer.d.ts CHANGED
@@ -2,13 +2,31 @@ import { DatabaseSync } from "node:sqlite";
2
2
  export interface IndexerOptions {
3
3
  cwd?: string;
4
4
  }
5
+ export interface DoctorReport {
6
+ ok: boolean;
7
+ staleArtifacts: number;
8
+ zombieArtifacts: number;
9
+ corruptedFiles: string[];
10
+ orphanEdges: number;
11
+ lastIndexedAt: string | null;
12
+ }
5
13
  export declare class HardkasIndexer {
6
14
  private db;
7
15
  private hardkasDir;
8
16
  constructor(db: DatabaseSync, options?: IndexerOptions);
9
17
  sync(): void;
18
+ /**
19
+ * Complete wipe and rebuild of the index.
20
+ */
21
+ rebuild(): void;
22
+ /**
23
+ * Diagnostic check of the index integrity and freshness.
24
+ */
25
+ doctor(): DoctorReport;
10
26
  private syncArtifacts;
11
27
  private syncEvents;
12
28
  private syncTraces;
29
+ private cleanupZombies;
30
+ private walk;
13
31
  }
14
32
  //# sourceMappingURL=indexer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAe;IACzB,OAAO,CAAC,UAAU,CAAS;gBAEf,EAAE,EAAE,YAAY,EAAE,OAAO,GAAE,cAAmB;IAKnD,IAAI;IAeX,OAAO,CAAC,aAAa;IA8ErB,OAAO,CAAC,UAAU;IA6ClB,OAAO,CAAC,UAAU;CAkCnB"}
1
+ {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAe;IACzB,OAAO,CAAC,UAAU,CAAS;gBAEf,EAAE,EAAE,YAAY,EAAE,OAAO,GAAE,cAAmB;IAKnD,IAAI;IAqBX;;OAEG;IACI,OAAO;IAgBd;;OAEG;IACI,MAAM,IAAI,YAAY;IAuC7B,OAAO,CAAC,aAAa;IAkFrB,OAAO,CAAC,UAAU;IA+DlB,OAAO,CAAC,UAAU;IAmClB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,IAAI;CAgBb"}
package/dist/indexer.js CHANGED
@@ -17,6 +17,10 @@ export class HardkasIndexer {
17
17
  this.syncArtifacts();
18
18
  this.syncEvents();
19
19
  this.syncTraces();
20
+ this.cleanupZombies();
21
+ // Mark last sync
22
+ this.db.prepare("INSERT OR REPLACE INTO metadata (key, value) VALUES (?, ?)")
23
+ .run("last_indexed_at", new Date().toISOString());
20
24
  this.db.exec("COMMIT;");
21
25
  }
22
26
  catch (e) {
@@ -24,85 +28,154 @@ export class HardkasIndexer {
24
28
  throw e;
25
29
  }
26
30
  }
27
- syncArtifacts() {
28
- const walk = (dir) => {
29
- let results = [];
30
- if (!fs.existsSync(dir))
31
- return results;
32
- const list = fs.readdirSync(dir);
33
- for (const file of list) {
34
- const filePath = path.join(dir, file);
35
- const stat = fs.statSync(filePath);
36
- if (stat.isDirectory()) {
37
- results = results.concat(walk(filePath));
38
- }
39
- else if (file.endsWith(".json") && !file.endsWith("events.jsonl") && file !== "state.json") {
40
- results.push(filePath);
31
+ /**
32
+ * Complete wipe and rebuild of the index.
33
+ */
34
+ rebuild() {
35
+ this.db.exec("BEGIN TRANSACTION;");
36
+ try {
37
+ this.db.exec("DELETE FROM artifacts;");
38
+ this.db.exec("DELETE FROM lineage_edges;");
39
+ this.db.exec("DELETE FROM events;");
40
+ this.db.exec("DELETE FROM traces;");
41
+ this.db.exec("DELETE FROM metadata WHERE key = 'last_indexed_at';");
42
+ this.db.exec("COMMIT;");
43
+ this.sync();
44
+ }
45
+ catch (e) {
46
+ this.db.exec("ROLLBACK;");
47
+ throw e;
48
+ }
49
+ }
50
+ /**
51
+ * Diagnostic check of the index integrity and freshness.
52
+ */
53
+ doctor() {
54
+ const report = {
55
+ ok: true,
56
+ staleArtifacts: 0,
57
+ zombieArtifacts: 0,
58
+ corruptedFiles: [],
59
+ orphanEdges: 0,
60
+ lastIndexedAt: null
61
+ };
62
+ // 1. Check last indexed
63
+ const lastIdx = this.db.prepare("SELECT value FROM metadata WHERE key = 'last_indexed_at'").get();
64
+ report.lastIndexedAt = lastIdx?.value || null;
65
+ // 2. Check for zombie rows (rows with no file or mismatched mtime)
66
+ const rows = this.db.prepare("SELECT artifact_id, file_path, file_mtime_ms FROM artifacts").all();
67
+ for (const row of rows) {
68
+ if (!row.file_path || !fs.existsSync(row.file_path)) {
69
+ report.zombieArtifacts++;
70
+ }
71
+ else {
72
+ const stat = fs.statSync(row.file_path);
73
+ if (stat.mtimeMs !== row.file_mtime_ms) {
74
+ report.staleArtifacts++;
41
75
  }
42
76
  }
43
- return results;
44
- };
45
- const files = walk(this.hardkasDir);
46
- const insertArtifact = this.db.prepare(`
47
- INSERT OR IGNORE INTO artifacts
48
- (artifact_id, content_hash, schema, version, kind, network_id, tx_id, created_at, raw_json)
49
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
77
+ }
78
+ // 3. Check for orphan edges
79
+ const orphans = this.db.prepare(`
80
+ SELECT COUNT(*) as count FROM lineage_edges
81
+ WHERE parent_artifact_id NOT IN (SELECT artifact_id FROM artifacts)
82
+ OR child_artifact_id NOT IN (SELECT artifact_id FROM artifacts)
83
+ `).get();
84
+ report.orphanEdges = orphans.count;
85
+ report.ok = report.staleArtifacts === 0 && report.zombieArtifacts === 0 && report.orphanEdges === 0;
86
+ return report;
87
+ }
88
+ syncArtifacts() {
89
+ const files = this.walk(this.hardkasDir);
90
+ const indexedAt = new Date().toISOString();
91
+ const upsertArtifact = this.db.prepare(`
92
+ INSERT INTO artifacts
93
+ (artifact_id, content_hash, schema, version, kind, network_id, tx_id, created_at, raw_json, file_path, file_mtime_ms, indexed_at)
94
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
95
+ ON CONFLICT(artifact_id) DO UPDATE SET
96
+ content_hash = excluded.content_hash,
97
+ schema = excluded.schema,
98
+ version = excluded.version,
99
+ kind = excluded.kind,
100
+ network_id = excluded.network_id,
101
+ tx_id = excluded.tx_id,
102
+ created_at = excluded.created_at,
103
+ raw_json = excluded.raw_json,
104
+ file_path = excluded.file_path,
105
+ file_mtime_ms = excluded.file_mtime_ms,
106
+ indexed_at = excluded.indexed_at
50
107
  `);
51
- const insertEdge = this.db.prepare(`
52
- INSERT OR IGNORE INTO lineage_edges (lineage_id, parent_artifact_id, child_artifact_id, edge_kind, created_at)
53
- VALUES (?, ?, ?, ?, ?)
108
+ const insertEdge = this.db.prepare(`
109
+ INSERT OR REPLACE INTO lineage_edges (lineage_id, parent_artifact_id, child_artifact_id, edge_kind, created_at)
110
+ VALUES (?, ?, ?, ?, ?)
54
111
  `);
55
- const artifactsWithLineage = [];
56
- // Pass 1: Index Artifacts
112
+ const mtimeStmt = this.db.prepare("SELECT file_mtime_ms FROM artifacts WHERE artifact_id = ?");
113
+ const artifactsToLink = [];
57
114
  for (const file of files) {
115
+ const stat = fs.statSync(file);
116
+ const existing = this.db.prepare("SELECT artifact_id, file_mtime_ms FROM artifacts WHERE file_path = ?").get(file);
117
+ if (existing && existing.file_mtime_ms === stat.mtimeMs) {
118
+ // Still need to track for lineage if we want to be safe, or assume it's already there
119
+ // For simplicity in sync, we'll re-parse lineage for all files or use a more complex cache
120
+ }
58
121
  const content = fs.readFileSync(file, "utf-8");
59
122
  try {
60
123
  const parsed = JSON.parse(content);
61
124
  if (!parsed.schema || !parsed.version || !parsed.artifactId)
62
125
  continue;
63
126
  const hash = parsed.contentHash || calculateContentHash(parsed);
64
- insertArtifact.run(parsed.artifactId, hash, parsed.schema, parsed.version, parsed.kind || parsed.schema, parsed.networkId || "unknown", parsed.txId || null, parsed.createdAt || null, content);
127
+ upsertArtifact.run(parsed.artifactId, hash, parsed.schema, parsed.version, parsed.kind || parsed.schema, parsed.networkId || "unknown", parsed.txId || null, parsed.createdAt || null, content, file, stat.mtimeMs, indexedAt);
65
128
  if (parsed.lineage && parsed.lineage.parentArtifactId) {
66
- artifactsWithLineage.push(parsed);
129
+ artifactsToLink.push(parsed);
67
130
  }
68
131
  }
69
132
  catch (e) {
70
133
  // Skip invalid JSON
71
134
  }
72
135
  }
73
- // Pass 2: Index Lineage Edges (after artifacts are present)
74
- for (const parsed of artifactsWithLineage) {
75
- try {
76
- insertEdge.run(parsed.lineage.lineageId || "legacy-lineage", parsed.lineage.parentArtifactId, parsed.artifactId, "derived", parsed.createdAt || null);
77
- }
78
- catch (e) {
79
- // Ignore edge errors (e.g. FK violation if parent missing from disk)
80
- }
136
+ // Pass 2: Lineage Edges (Now all artifact IDs exist)
137
+ for (const parsed of artifactsToLink) {
138
+ insertEdge.run(parsed.lineage.lineageId || "legacy-lineage", parsed.lineage.parentArtifactId, parsed.artifactId, "derived", parsed.createdAt || null);
81
139
  }
82
140
  }
83
141
  syncEvents() {
84
142
  const eventsPath = path.join(this.hardkasDir, "events.jsonl");
85
143
  if (!fs.existsSync(eventsPath))
86
144
  return;
145
+ const stat = fs.statSync(eventsPath);
146
+ const indexedAt = new Date().toISOString();
147
+ // Check if events file changed
148
+ const existing = this.db.prepare("SELECT file_mtime_ms FROM events WHERE file_path = ? LIMIT 1").get(eventsPath);
149
+ if (existing && existing.file_mtime_ms === stat.mtimeMs) {
150
+ return;
151
+ }
87
152
  const content = fs.readFileSync(eventsPath, "utf-8");
88
153
  const lines = content.split("\n").filter(l => l.trim() !== "");
89
- const stmt = this.db.prepare("SELECT COUNT(*) as count FROM events");
90
- const result = stmt.get();
91
- const existingCount = result.count;
92
- if (lines.length <= existingCount)
93
- return;
94
- const newLines = lines.slice(existingCount);
95
- const insertEvent = this.db.prepare(`
96
- INSERT OR IGNORE INTO events
97
- (event_id, kind, domain, timestamp, workflow_id, correlation_id, causation_id, tx_id, artifact_id, network_id, raw_json)
98
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
154
+ const upsertEvent = this.db.prepare(`
155
+ INSERT INTO events
156
+ (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)
157
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
158
+ ON CONFLICT(event_id) DO UPDATE SET
159
+ kind = excluded.kind,
160
+ domain = excluded.domain,
161
+ timestamp = excluded.timestamp,
162
+ workflow_id = excluded.workflow_id,
163
+ correlation_id = excluded.correlation_id,
164
+ causation_id = excluded.causation_id,
165
+ tx_id = excluded.tx_id,
166
+ artifact_id = excluded.artifact_id,
167
+ network_id = excluded.network_id,
168
+ raw_json = excluded.raw_json,
169
+ file_path = excluded.file_path,
170
+ file_mtime_ms = excluded.file_mtime_ms,
171
+ indexed_at = excluded.indexed_at
99
172
  `);
100
- for (const line of newLines) {
173
+ for (const line of lines) {
101
174
  try {
102
175
  const parsed = JSON.parse(line);
103
176
  if (!validateEventEnvelope(parsed))
104
177
  continue;
105
- insertEvent.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);
178
+ 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);
106
179
  }
107
180
  catch (e) {
108
181
  // Skip invalid line
@@ -110,37 +183,70 @@ export class HardkasIndexer {
110
183
  }
111
184
  }
112
185
  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)
186
+ const upsertTrace = this.db.prepare(`
187
+ INSERT INTO traces (trace_id, workflow_id, root_event_id, status, started_at, ended_at)
188
+ SELECT
189
+ 'trace-' || workflow_id as trace_id,
190
+ workflow_id,
191
+ event_id as root_event_id,
192
+ CASE
193
+ WHEN kind = 'workflow.completed' THEN 'completed'
194
+ WHEN kind = 'workflow.failed' THEN 'failed'
195
+ ELSE 'running'
196
+ END as status,
197
+ timestamp as started_at,
198
+ CASE
199
+ WHEN kind IN ('workflow.completed', 'workflow.failed') THEN timestamp
200
+ ELSE NULL
201
+ END as ended_at
202
+ FROM events
203
+ WHERE kind LIKE 'workflow.%'
204
+ ON CONFLICT(workflow_id) DO UPDATE SET
205
+ status = CASE
206
+ WHEN excluded.status IN ('completed', 'failed') THEN excluded.status
207
+ ELSE traces.status
208
+ END,
209
+ ended_at = CASE
210
+ WHEN excluded.status IN ('completed', 'failed') THEN excluded.ended_at
211
+ ELSE traces.ended_at
212
+ END,
213
+ root_event_id = COALESCE(traces.root_event_id, excluded.root_event_id),
214
+ started_at = COALESCE(traces.started_at, excluded.started_at)
142
215
  `);
143
216
  upsertTrace.run();
144
217
  }
218
+ cleanupZombies() {
219
+ const rows = this.db.prepare("SELECT artifact_id, file_path FROM artifacts").all();
220
+ const deleteArtifact = this.db.prepare("DELETE FROM artifacts WHERE artifact_id = ?");
221
+ for (const row of rows) {
222
+ if (!row.file_path || !fs.existsSync(row.file_path)) {
223
+ deleteArtifact.run(row.artifact_id);
224
+ }
225
+ }
226
+ // Events cleanup (if file gone, all events gone)
227
+ const eventsPath = path.join(this.hardkasDir, "events.jsonl");
228
+ if (!fs.existsSync(eventsPath)) {
229
+ this.db.exec("DELETE FROM events;");
230
+ }
231
+ }
232
+ walk(dir) {
233
+ let results = [];
234
+ if (!fs.existsSync(dir))
235
+ return results;
236
+ const list = fs.readdirSync(dir);
237
+ for (const file of list) {
238
+ const filePath = path.join(dir, file);
239
+ const stat = fs.statSync(filePath);
240
+ if (stat.isDirectory()) {
241
+ if (file === "node_modules" || file === ".git")
242
+ continue;
243
+ results = results.concat(this.walk(filePath));
244
+ }
245
+ else if (file.endsWith(".json") && !file.endsWith("events.jsonl") && file !== "state.json") {
246
+ results.push(filePath);
247
+ }
248
+ }
249
+ return results;
250
+ }
145
251
  }
146
252
  //# sourceMappingURL=indexer.js.map
@@ -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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"}
package/dist/schema.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export declare const SCHEMA_VERSION = 2;
2
- export declare const DDL = "\nCREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS artifacts (\n artifact_id TEXT PRIMARY KEY,\n content_hash TEXT NOT NULL,\n schema TEXT NOT NULL,\n version TEXT NOT NULL,\n kind TEXT NOT NULL,\n network_id TEXT NOT NULL,\n tx_id TEXT,\n created_at TEXT,\n raw_json TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_artifacts_content_hash ON artifacts(content_hash);\nCREATE INDEX IF NOT EXISTS idx_artifacts_schema ON artifacts(schema);\nCREATE INDEX IF NOT EXISTS idx_artifacts_kind ON artifacts(kind);\nCREATE INDEX IF NOT EXISTS idx_artifacts_network_id ON artifacts(network_id);\nCREATE INDEX IF NOT EXISTS idx_artifacts_tx_id ON artifacts(tx_id);\nCREATE INDEX IF NOT EXISTS idx_artifacts_created_at ON artifacts(created_at);\n\nCREATE TABLE IF NOT EXISTS lineage_edges (\n lineage_id TEXT NOT NULL,\n parent_artifact_id TEXT NOT NULL,\n child_artifact_id TEXT NOT NULL,\n edge_kind TEXT NOT NULL,\n created_at TEXT,\n PRIMARY KEY (parent_artifact_id, child_artifact_id),\n FOREIGN KEY (parent_artifact_id) REFERENCES artifacts(artifact_id),\n FOREIGN KEY (child_artifact_id) REFERENCES artifacts(artifact_id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_lineage_parent ON lineage_edges(parent_artifact_id);\nCREATE INDEX IF NOT EXISTS idx_lineage_child ON lineage_edges(child_artifact_id);\nCREATE INDEX IF NOT EXISTS idx_lineage_id ON lineage_edges(lineage_id);\n\nCREATE TABLE IF NOT EXISTS events (\n event_id TEXT PRIMARY KEY,\n kind TEXT NOT NULL,\n domain TEXT NOT NULL,\n timestamp TEXT,\n workflow_id TEXT NOT NULL,\n correlation_id TEXT NOT NULL,\n causation_id TEXT,\n tx_id TEXT,\n artifact_id TEXT,\n network_id TEXT NOT NULL,\n raw_json TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind);\nCREATE INDEX IF NOT EXISTS idx_events_domain ON events(domain);\nCREATE INDEX IF NOT EXISTS idx_events_workflow_id ON events(workflow_id);\nCREATE INDEX IF NOT EXISTS idx_events_correlation_id ON events(correlation_id);\nCREATE INDEX IF NOT EXISTS idx_events_causation_id ON events(causation_id);\nCREATE INDEX IF NOT EXISTS idx_events_tx_id ON events(tx_id);\nCREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);\nCREATE INDEX IF NOT EXISTS idx_events_network_id ON events(network_id);\nCREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n\nCREATE TABLE IF NOT EXISTS traces (\n trace_id TEXT PRIMARY KEY,\n workflow_id TEXT UNIQUE NOT NULL,\n root_event_id TEXT,\n status TEXT NOT NULL,\n started_at TEXT,\n ended_at TEXT,\n FOREIGN KEY (root_event_id) REFERENCES events(event_id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_traces_workflow_id ON traces(workflow_id);\nCREATE INDEX IF NOT EXISTS idx_traces_status ON traces(status);\n";
1
+ export declare const SCHEMA_VERSION = 3;
2
+ export declare const DDL = "\nCREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS artifacts (\n artifact_id TEXT PRIMARY KEY,\n content_hash TEXT NOT NULL,\n schema TEXT NOT NULL,\n version TEXT NOT NULL,\n kind TEXT NOT NULL,\n network_id TEXT NOT NULL,\n tx_id TEXT,\n created_at TEXT,\n raw_json TEXT NOT NULL,\n file_path TEXT,\n file_mtime_ms INTEGER,\n indexed_at TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_artifacts_content_hash ON artifacts(content_hash);\nCREATE INDEX IF NOT EXISTS idx_artifacts_schema ON artifacts(schema);\nCREATE INDEX IF NOT EXISTS idx_artifacts_kind ON artifacts(kind);\nCREATE INDEX IF NOT EXISTS idx_artifacts_network_id ON artifacts(network_id);\nCREATE INDEX IF NOT EXISTS idx_artifacts_tx_id ON artifacts(tx_id);\nCREATE INDEX IF NOT EXISTS idx_artifacts_created_at ON artifacts(created_at);\nCREATE INDEX IF NOT EXISTS idx_artifacts_file_path ON artifacts(file_path);\n\nCREATE TABLE IF NOT EXISTS lineage_edges (\n lineage_id TEXT NOT NULL,\n parent_artifact_id TEXT NOT NULL,\n child_artifact_id TEXT NOT NULL,\n edge_kind TEXT NOT NULL,\n created_at TEXT,\n PRIMARY KEY (parent_artifact_id, child_artifact_id),\n FOREIGN KEY (parent_artifact_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE,\n FOREIGN KEY (child_artifact_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_lineage_parent ON lineage_edges(parent_artifact_id);\nCREATE INDEX IF NOT EXISTS idx_lineage_child ON lineage_edges(child_artifact_id);\nCREATE INDEX IF NOT EXISTS idx_lineage_id ON lineage_edges(lineage_id);\n\nCREATE TABLE IF NOT EXISTS events (\n event_id TEXT PRIMARY KEY,\n kind TEXT NOT NULL,\n domain TEXT NOT NULL,\n timestamp TEXT,\n workflow_id TEXT NOT NULL,\n correlation_id TEXT NOT NULL,\n causation_id TEXT,\n tx_id TEXT,\n artifact_id TEXT,\n network_id TEXT NOT NULL,\n raw_json TEXT NOT NULL,\n file_path TEXT,\n file_mtime_ms INTEGER,\n indexed_at TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind);\nCREATE INDEX IF NOT EXISTS idx_events_domain ON events(domain);\nCREATE INDEX IF NOT EXISTS idx_events_workflow_id ON events(workflow_id);\nCREATE INDEX IF NOT EXISTS idx_events_correlation_id ON events(correlation_id);\nCREATE INDEX IF NOT EXISTS idx_events_causation_id ON events(causation_id);\nCREATE INDEX IF NOT EXISTS idx_events_tx_id ON events(tx_id);\nCREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);\nCREATE INDEX IF NOT EXISTS idx_events_network_id ON events(network_id);\nCREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\nCREATE INDEX IF NOT EXISTS idx_events_file_path ON events(file_path);\n\nCREATE TABLE IF NOT EXISTS traces (\n trace_id TEXT PRIMARY KEY,\n workflow_id TEXT UNIQUE NOT NULL,\n root_event_id TEXT,\n status TEXT NOT NULL,\n started_at TEXT,\n ended_at TEXT,\n FOREIGN KEY (root_event_id) REFERENCES events(event_id) ON DELETE SET NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_traces_workflow_id ON traces(workflow_id);\nCREATE INDEX IF NOT EXISTS idx_traces_status ON traces(status);\n";
3
3
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,eAAO,MAAM,GAAG,iwFA4Ef,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,eAAO,MAAM,GAAG,8kGAoFf,CAAC"}
package/dist/schema.js CHANGED
@@ -1,4 +1,4 @@
1
- export const SCHEMA_VERSION = 2;
1
+ export const SCHEMA_VERSION = 3;
2
2
  export const DDL = `
3
3
  CREATE TABLE IF NOT EXISTS metadata (
4
4
  key TEXT PRIMARY KEY,
@@ -14,7 +14,10 @@ CREATE TABLE IF NOT EXISTS artifacts (
14
14
  network_id TEXT NOT NULL,
15
15
  tx_id TEXT,
16
16
  created_at TEXT,
17
- raw_json TEXT NOT NULL
17
+ raw_json TEXT NOT NULL,
18
+ file_path TEXT,
19
+ file_mtime_ms INTEGER,
20
+ indexed_at TEXT
18
21
  );
19
22
 
20
23
  CREATE INDEX IF NOT EXISTS idx_artifacts_content_hash ON artifacts(content_hash);
@@ -23,6 +26,7 @@ CREATE INDEX IF NOT EXISTS idx_artifacts_kind ON artifacts(kind);
23
26
  CREATE INDEX IF NOT EXISTS idx_artifacts_network_id ON artifacts(network_id);
24
27
  CREATE INDEX IF NOT EXISTS idx_artifacts_tx_id ON artifacts(tx_id);
25
28
  CREATE INDEX IF NOT EXISTS idx_artifacts_created_at ON artifacts(created_at);
29
+ CREATE INDEX IF NOT EXISTS idx_artifacts_file_path ON artifacts(file_path);
26
30
 
27
31
  CREATE TABLE IF NOT EXISTS lineage_edges (
28
32
  lineage_id TEXT NOT NULL,
@@ -31,8 +35,8 @@ CREATE TABLE IF NOT EXISTS lineage_edges (
31
35
  edge_kind TEXT NOT NULL,
32
36
  created_at TEXT,
33
37
  PRIMARY KEY (parent_artifact_id, child_artifact_id),
34
- FOREIGN KEY (parent_artifact_id) REFERENCES artifacts(artifact_id),
35
- FOREIGN KEY (child_artifact_id) REFERENCES artifacts(artifact_id)
38
+ FOREIGN KEY (parent_artifact_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE,
39
+ FOREIGN KEY (child_artifact_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE
36
40
  );
37
41
 
38
42
  CREATE INDEX IF NOT EXISTS idx_lineage_parent ON lineage_edges(parent_artifact_id);
@@ -50,7 +54,10 @@ CREATE TABLE IF NOT EXISTS events (
50
54
  tx_id TEXT,
51
55
  artifact_id TEXT,
52
56
  network_id TEXT NOT NULL,
53
- raw_json TEXT NOT NULL
57
+ raw_json TEXT NOT NULL,
58
+ file_path TEXT,
59
+ file_mtime_ms INTEGER,
60
+ indexed_at TEXT
54
61
  );
55
62
 
56
63
  CREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind);
@@ -62,6 +69,7 @@ CREATE INDEX IF NOT EXISTS idx_events_tx_id ON events(tx_id);
62
69
  CREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);
63
70
  CREATE INDEX IF NOT EXISTS idx_events_network_id ON events(network_id);
64
71
  CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
72
+ CREATE INDEX IF NOT EXISTS idx_events_file_path ON events(file_path);
65
73
 
66
74
  CREATE TABLE IF NOT EXISTS traces (
67
75
  trace_id TEXT PRIMARY KEY,
@@ -70,7 +78,7 @@ CREATE TABLE IF NOT EXISTS traces (
70
78
  status TEXT NOT NULL,
71
79
  started_at TEXT,
72
80
  ended_at TEXT,
73
- FOREIGN KEY (root_event_id) REFERENCES events(event_id)
81
+ FOREIGN KEY (root_event_id) REFERENCES events(event_id) ON DELETE SET NULL
74
82
  );
75
83
 
76
84
  CREATE INDEX IF NOT EXISTS idx_traces_workflow_id ON traces(workflow_id);
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4ElB,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoFlB,CAAC"}
package/package.json CHANGED
@@ -1,15 +1,18 @@
1
1
  {
2
2
  "name": "@hardkas/query-store",
3
- "version": "0.2.1-alpha",
3
+ "version": "0.2.2-alpha.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "exports": {
8
- ".": "./dist/index.js"
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ }
9
12
  },
10
13
  "dependencies": {
11
- "@hardkas/artifacts": "0.2.1-alpha",
12
- "@hardkas/core": "0.2.1-alpha"
14
+ "@hardkas/artifacts": "0.2.2-alpha.1",
15
+ "@hardkas/core": "0.2.2-alpha.1"
13
16
  },
14
17
  "devDependencies": {
15
18
  "tsup": "^8.3.5",