@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 +29 -4
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +55 -6
- package/dist/backend.js.map +1 -1
- package/dist/indexer.d.ts +18 -0
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js +183 -77
- package/dist/indexer.js.map +1 -1
- package/dist/schema.d.ts +2 -2
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +14 -6
- package/dist/schema.js.map +1 -1
- package/package.json +7 -4
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
|
|
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
|
|
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
|
|
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
|
package/dist/backend.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
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
|
|
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
|
|
94
|
+
query += " AND parent_artifact_id = ?";
|
|
88
95
|
params.push(filters.parentHash);
|
|
89
96
|
}
|
|
90
97
|
if (filters?.childHash) {
|
|
91
|
-
query += " AND
|
|
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
|
-
|
|
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
|
package/dist/backend.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"
|
|
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
|
package/dist/indexer.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
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
|
|
56
|
-
|
|
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
|
-
|
|
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
|
-
|
|
129
|
+
artifactsToLink.push(parsed);
|
|
67
130
|
}
|
|
68
131
|
}
|
|
69
132
|
catch (e) {
|
|
70
133
|
// Skip invalid JSON
|
|
71
134
|
}
|
|
72
135
|
}
|
|
73
|
-
// Pass 2:
|
|
74
|
-
for (const parsed of
|
|
75
|
-
|
|
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
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
|
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
|
-
|
|
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
|
package/dist/indexer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAsB,MAAM,eAAe,CAAC;
|
|
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
|
-
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
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -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,
|
|
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 =
|
|
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);
|
package/dist/schema.js.map
CHANGED
|
@@ -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
|
|
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.
|
|
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
|
-
".":
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
}
|
|
9
12
|
},
|
|
10
13
|
"dependencies": {
|
|
11
|
-
"@hardkas/artifacts": "0.2.
|
|
12
|
-
"@hardkas/core": "0.2.
|
|
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",
|