@hardkas/query-store 0.2.2-alpha.1 → 0.4.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 +20 -2
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +30 -8
- 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 +34 -4
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js +160 -47
- 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 -86
- package/dist/schema.js.map +1 -1
- package/package.json +4 -4
package/dist/backend.d.ts
CHANGED
|
@@ -52,7 +52,16 @@ export interface QueryBackend {
|
|
|
52
52
|
}): Promise<LineageEdgeDocument[]>;
|
|
53
53
|
getStoreStatus(): Promise<string>;
|
|
54
54
|
doctor(): Promise<any>;
|
|
55
|
-
|
|
55
|
+
migrate(): Promise<{
|
|
56
|
+
applied: number;
|
|
57
|
+
}>;
|
|
58
|
+
sync(options?: {
|
|
59
|
+
strict?: boolean;
|
|
60
|
+
}): Promise<any>;
|
|
61
|
+
rebuild(options?: {
|
|
62
|
+
strict?: boolean;
|
|
63
|
+
}): Promise<any>;
|
|
64
|
+
executeRawSql(sql: string): Promise<any[]>;
|
|
56
65
|
findReceipts(filters?: {
|
|
57
66
|
status?: string;
|
|
58
67
|
networkId?: string;
|
|
@@ -89,6 +98,15 @@ export declare class SqliteQueryBackend implements QueryBackend {
|
|
|
89
98
|
}): Promise<ArtifactDocument[]>;
|
|
90
99
|
getStoreStatus(): Promise<string>;
|
|
91
100
|
doctor(): Promise<any>;
|
|
92
|
-
|
|
101
|
+
migrate(): Promise<{
|
|
102
|
+
applied: number;
|
|
103
|
+
}>;
|
|
104
|
+
rebuild(options?: {
|
|
105
|
+
strict?: boolean;
|
|
106
|
+
}): Promise<any>;
|
|
107
|
+
sync(options?: {
|
|
108
|
+
strict?: boolean;
|
|
109
|
+
}): Promise<any>;
|
|
110
|
+
executeRawSql(sql: string): Promise<any[]>;
|
|
93
111
|
}
|
|
94
112
|
//# 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;AACvC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAOzD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,IAAI,OAAO,CAAC;IACnB,IAAI,IAAI,QAAQ,GAAG,YAAY,CAAC;IAChC,aAAa,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC7G,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAChE,SAAS,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAChF,eAAe,CAAC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACvG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/backend.js
CHANGED
|
@@ -18,7 +18,7 @@ export class SqliteQueryBackend {
|
|
|
18
18
|
params.push(filters.schema);
|
|
19
19
|
}
|
|
20
20
|
if (filters?.mode) {
|
|
21
|
-
query += " AND
|
|
21
|
+
query += " AND mode = ?";
|
|
22
22
|
params.push(filters.mode);
|
|
23
23
|
}
|
|
24
24
|
if (filters?.networkId) {
|
|
@@ -31,7 +31,7 @@ export class SqliteQueryBackend {
|
|
|
31
31
|
schema: r.schema,
|
|
32
32
|
version: r.version,
|
|
33
33
|
kind: r.kind,
|
|
34
|
-
mode: r.
|
|
34
|
+
mode: (r.mode || "unknown"),
|
|
35
35
|
networkId: r.network_id,
|
|
36
36
|
createdAt: r.created_at,
|
|
37
37
|
txId: r.tx_id,
|
|
@@ -50,7 +50,7 @@ export class SqliteQueryBackend {
|
|
|
50
50
|
schema: row.schema,
|
|
51
51
|
version: row.version,
|
|
52
52
|
kind: row.kind,
|
|
53
|
-
mode: row.
|
|
53
|
+
mode: (row.mode || "unknown"),
|
|
54
54
|
networkId: row.network_id,
|
|
55
55
|
createdAt: row.created_at,
|
|
56
56
|
txId: row.tx_id,
|
|
@@ -124,7 +124,7 @@ export class SqliteQueryBackend {
|
|
|
124
124
|
schema: r.schema,
|
|
125
125
|
version: r.version,
|
|
126
126
|
kind: r.kind,
|
|
127
|
-
mode: r.
|
|
127
|
+
mode: (r.mode || "unknown"),
|
|
128
128
|
networkId: r.network_id,
|
|
129
129
|
createdAt: r.created_at,
|
|
130
130
|
txId: r.tx_id,
|
|
@@ -142,12 +142,34 @@ export class SqliteQueryBackend {
|
|
|
142
142
|
async doctor() {
|
|
143
143
|
const { HardkasIndexer } = await import("./indexer.js");
|
|
144
144
|
const indexer = new HardkasIndexer(this.store.getDatabase());
|
|
145
|
-
|
|
145
|
+
const indexerReport = indexer.doctor();
|
|
146
|
+
const storeHealth = this.store.checkHealth();
|
|
147
|
+
return {
|
|
148
|
+
...indexerReport,
|
|
149
|
+
ok: indexerReport.ok && storeHealth.ok,
|
|
150
|
+
storeIssues: storeHealth.issues
|
|
151
|
+
};
|
|
146
152
|
}
|
|
147
|
-
async
|
|
153
|
+
async migrate() {
|
|
154
|
+
return this.store.migrate();
|
|
155
|
+
}
|
|
156
|
+
async rebuild(options) {
|
|
157
|
+
// Ensure schema is up to date before rebuild
|
|
158
|
+
this.store.migrate();
|
|
148
159
|
const { HardkasIndexer } = await import("./indexer.js");
|
|
149
|
-
const indexer = new HardkasIndexer(this.store.getDatabase());
|
|
150
|
-
indexer.rebuild();
|
|
160
|
+
const indexer = new HardkasIndexer(this.store.getDatabase(), options);
|
|
161
|
+
return indexer.rebuild();
|
|
162
|
+
}
|
|
163
|
+
async sync(options) {
|
|
164
|
+
// Ensure schema is up to date before sync
|
|
165
|
+
this.store.migrate();
|
|
166
|
+
const { HardkasIndexer } = await import("./indexer.js");
|
|
167
|
+
const indexer = new HardkasIndexer(this.store.getDatabase(), options);
|
|
168
|
+
return indexer.sync();
|
|
169
|
+
}
|
|
170
|
+
async executeRawSql(sql) {
|
|
171
|
+
const db = this.store.getDatabase();
|
|
172
|
+
return db.prepare(sql).all();
|
|
151
173
|
}
|
|
152
174
|
}
|
|
153
175
|
//# 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/db.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CorruptionIssue } from "@hardkas/core";
|
|
2
2
|
export declare class HardkasStore {
|
|
3
3
|
private db;
|
|
4
4
|
private readonly dbPath;
|
|
@@ -6,9 +6,26 @@ export declare class HardkasStore {
|
|
|
6
6
|
dbPath?: string;
|
|
7
7
|
memory?: boolean;
|
|
8
8
|
});
|
|
9
|
-
connect(
|
|
9
|
+
connect(options?: {
|
|
10
|
+
autoMigrate?: boolean;
|
|
11
|
+
}): void;
|
|
10
12
|
disconnect(): void;
|
|
11
|
-
getDatabase():
|
|
13
|
+
getDatabase(): any;
|
|
14
|
+
/**
|
|
15
|
+
* Safe migration entry point.
|
|
16
|
+
* Must be called under query-store lock for non-memory DBs.
|
|
17
|
+
*/
|
|
18
|
+
migrate(): {
|
|
19
|
+
applied: number;
|
|
20
|
+
status: string;
|
|
21
|
+
};
|
|
12
22
|
private initialize;
|
|
23
|
+
/**
|
|
24
|
+
* Performs a health check on the store.
|
|
25
|
+
*/
|
|
26
|
+
checkHealth(): {
|
|
27
|
+
ok: boolean;
|
|
28
|
+
issues: CorruptionIssue[];
|
|
29
|
+
};
|
|
13
30
|
}
|
|
14
31
|
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgB,eAAe,EAAE,MAAM,eAAe,CAAC;AAI9D,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO;IAQxD,OAAO,CAAC,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAA2B;IAuBnE,UAAU;IAOV,WAAW,IAAI,GAAG;IAOzB;;;OAGG;IACI,OAAO,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAYrD,OAAO,CAAC,UAAU;IAgBlB;;OAEG;IACI,WAAW,IAAI;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,eAAe,EAAE,CAAA;KAAE;CA0EjE"}
|
package/dist/db.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
const require = createRequire(import.meta.url);
|
|
3
|
+
const { DatabaseSync } = require("node:sqlite");
|
|
2
4
|
import path from "node:path";
|
|
3
5
|
import fs from "node:fs";
|
|
4
|
-
import {
|
|
6
|
+
import { HardkasError } from "@hardkas/core";
|
|
7
|
+
import { MigrationRunner, MIGRATIONS } from "./migrations.js";
|
|
5
8
|
export class HardkasStore {
|
|
6
9
|
db = null;
|
|
7
10
|
dbPath;
|
|
@@ -13,7 +16,7 @@ export class HardkasStore {
|
|
|
13
16
|
this.dbPath = options.dbPath || path.join(process.cwd(), ".hardkas", "store.db");
|
|
14
17
|
}
|
|
15
18
|
}
|
|
16
|
-
connect() {
|
|
19
|
+
connect(options = { autoMigrate: false }) {
|
|
17
20
|
if (this.db)
|
|
18
21
|
return;
|
|
19
22
|
if (this.dbPath !== ":memory:") {
|
|
@@ -23,7 +26,14 @@ export class HardkasStore {
|
|
|
23
26
|
}
|
|
24
27
|
}
|
|
25
28
|
this.db = new DatabaseSync(this.dbPath);
|
|
26
|
-
this.
|
|
29
|
+
this.db.exec("PRAGMA foreign_keys = ON;");
|
|
30
|
+
// Core SQLite tuning
|
|
31
|
+
this.db.exec("PRAGMA journal_mode = WAL;");
|
|
32
|
+
this.db.exec("PRAGMA synchronous = FULL;");
|
|
33
|
+
this.db.exec("PRAGMA foreign_keys = ON;");
|
|
34
|
+
if (options.autoMigrate) {
|
|
35
|
+
this.initialize();
|
|
36
|
+
}
|
|
27
37
|
}
|
|
28
38
|
disconnect() {
|
|
29
39
|
if (this.db) {
|
|
@@ -37,46 +47,106 @@ export class HardkasStore {
|
|
|
37
47
|
}
|
|
38
48
|
return this.db;
|
|
39
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Safe migration entry point.
|
|
52
|
+
* Must be called under query-store lock for non-memory DBs.
|
|
53
|
+
*/
|
|
54
|
+
migrate() {
|
|
55
|
+
if (!this.db)
|
|
56
|
+
throw new Error("Database not connected");
|
|
57
|
+
const runner = new MigrationRunner(this.db);
|
|
58
|
+
// 1. Handle legacy transition (version 1 baseline)
|
|
59
|
+
runner.bootstrapLegacy(1, MIGRATIONS);
|
|
60
|
+
// 2. Run pending migrations
|
|
61
|
+
return runner.migrate(MIGRATIONS);
|
|
62
|
+
}
|
|
40
63
|
initialize() {
|
|
41
64
|
if (!this.db)
|
|
42
65
|
return;
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
this.db.exec("PRAGMA synchronous = NORMAL;");
|
|
46
|
-
this.db.exec("PRAGMA foreign_keys = ON;");
|
|
47
|
-
// Apply schema
|
|
48
|
-
this.db.exec(DDL);
|
|
49
|
-
// Check version
|
|
50
|
-
const stmt = this.db.prepare("SELECT value FROM metadata WHERE key = 'version'");
|
|
51
|
-
let version = 0;
|
|
66
|
+
// We only perform non-destructive initialization here.
|
|
67
|
+
// Full migrations or rebuilds are triggered via migrate() or indexer.
|
|
52
68
|
try {
|
|
53
|
-
|
|
54
|
-
if (row) {
|
|
55
|
-
version = parseInt(row.value, 10);
|
|
56
|
-
}
|
|
69
|
+
this.migrate();
|
|
57
70
|
}
|
|
58
71
|
catch (e) {
|
|
59
|
-
//
|
|
72
|
+
// If auto-migration fails during connect, we log but don't crash
|
|
73
|
+
// unless it's a critical error. The doctor will catch it.
|
|
74
|
+
if (e instanceof HardkasError && e.code === "STORE_MIGRATION_CHECKSUM_MISMATCH") {
|
|
75
|
+
console.error(`\n ❌ ${e.message}`);
|
|
76
|
+
}
|
|
60
77
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Performs a health check on the store.
|
|
81
|
+
*/
|
|
82
|
+
checkHealth() {
|
|
83
|
+
const issues = [];
|
|
84
|
+
if (this.dbPath === ":memory:")
|
|
85
|
+
return { ok: true, issues: [] };
|
|
86
|
+
if (!fs.existsSync(this.dbPath)) {
|
|
87
|
+
issues.push({
|
|
88
|
+
code: "STORE_REBUILD_REQUIRED",
|
|
89
|
+
severity: "error",
|
|
90
|
+
message: "Query store database file is missing.",
|
|
91
|
+
suggestion: "Run 'hardkas query store rebuild' to recreate the read model."
|
|
92
|
+
});
|
|
93
|
+
return { ok: false, issues };
|
|
64
94
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
95
|
+
try {
|
|
96
|
+
const stats = fs.statSync(this.dbPath);
|
|
97
|
+
if (stats.size === 0) {
|
|
98
|
+
issues.push({
|
|
99
|
+
code: "STORE_CORRUPT",
|
|
100
|
+
severity: "error",
|
|
101
|
+
message: "Query store database file is empty.",
|
|
102
|
+
suggestion: "Run 'hardkas query store rebuild'."
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
issues.push({
|
|
108
|
+
code: "STORE_CORRUPT",
|
|
109
|
+
severity: "error",
|
|
110
|
+
message: `Failed to access store database: ${e instanceof Error ? e.message : String(e)}`
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// Migration/Version check
|
|
114
|
+
if (this.db) {
|
|
115
|
+
try {
|
|
116
|
+
const runner = new MigrationRunner(this.db);
|
|
117
|
+
const applied = runner.getAppliedMigrations();
|
|
118
|
+
const appliedMap = new Map(applied.map(m => [m.version, m]));
|
|
119
|
+
const pending = MIGRATIONS.filter((m) => !appliedMap.has(m.version));
|
|
120
|
+
if (pending.length > 0) {
|
|
121
|
+
issues.push({
|
|
122
|
+
code: "STORE_MIGRATION_REQUIRED",
|
|
123
|
+
severity: "warning",
|
|
124
|
+
message: `${pending.length} pending schema migration(s) detected.`,
|
|
125
|
+
suggestion: "Run 'hardkas query store migrate' or 'hardkas query store rebuild'."
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Checksums
|
|
129
|
+
for (const m of MIGRATIONS) {
|
|
130
|
+
const existing = appliedMap.get(m.version);
|
|
131
|
+
if (existing && existing.checksum !== m.checksum) {
|
|
132
|
+
issues.push({
|
|
133
|
+
code: "STORE_MIGRATION_CHECKSUM_MISMATCH",
|
|
134
|
+
severity: "error",
|
|
135
|
+
message: `Integrity violation: Migration ${m.version} checksum changed.`,
|
|
136
|
+
suggestion: "The database schema was modified externally or migrations were edited. A full rebuild is recommended."
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
issues.push({
|
|
143
|
+
code: "STORE_CORRUPT",
|
|
144
|
+
severity: "error",
|
|
145
|
+
message: "Could not read migration history from store database."
|
|
146
|
+
});
|
|
147
|
+
}
|
|
79
148
|
}
|
|
149
|
+
return { ok: issues.length === 0, issues };
|
|
80
150
|
}
|
|
81
151
|
}
|
|
82
152
|
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
package/dist/indexer.d.ts
CHANGED
|
@@ -1,6 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type CorruptionIssue } from "@hardkas/core";
|
|
2
2
|
export interface IndexerOptions {
|
|
3
3
|
cwd?: string;
|
|
4
|
+
strict?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface SyncStats {
|
|
7
|
+
scanned: number;
|
|
8
|
+
indexed: number;
|
|
9
|
+
duplicates: number;
|
|
10
|
+
corrupted: number;
|
|
11
|
+
}
|
|
12
|
+
export interface SyncResult {
|
|
13
|
+
schema: "hardkas.queryRebuild.v1";
|
|
14
|
+
ok: boolean;
|
|
15
|
+
artifacts: SyncStats;
|
|
16
|
+
events: SyncStats;
|
|
17
|
+
warnings: string[];
|
|
18
|
+
errors: string[];
|
|
19
|
+
issues: CorruptionIssue[];
|
|
4
20
|
}
|
|
5
21
|
export interface DoctorReport {
|
|
6
22
|
ok: boolean;
|
|
@@ -13,12 +29,26 @@ export interface DoctorReport {
|
|
|
13
29
|
export declare class HardkasIndexer {
|
|
14
30
|
private db;
|
|
15
31
|
private hardkasDir;
|
|
16
|
-
|
|
17
|
-
|
|
32
|
+
private strict;
|
|
33
|
+
constructor(db: any, options?: IndexerOptions);
|
|
34
|
+
/**
|
|
35
|
+
* Performs an incremental sync of the index.
|
|
36
|
+
* Transactional.
|
|
37
|
+
*/
|
|
38
|
+
sync(): Promise<SyncResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Internal indexing logic without transaction management.
|
|
41
|
+
*/
|
|
42
|
+
private _syncInternal;
|
|
43
|
+
/**
|
|
44
|
+
* Complete wipe and rebuild of the index.
|
|
45
|
+
*/
|
|
18
46
|
/**
|
|
19
47
|
* Complete wipe and rebuild of the index.
|
|
48
|
+
* Atomic across wipe and first sync.
|
|
20
49
|
*/
|
|
21
|
-
rebuild():
|
|
50
|
+
rebuild(): Promise<SyncResult>;
|
|
51
|
+
private _wipeInternal;
|
|
22
52
|
/**
|
|
23
53
|
* Diagnostic check of the index integrity and freshness.
|
|
24
54
|
*/
|
package/dist/indexer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,yBAAyB,CAAC;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;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,CAAM;IAChB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAU;gBAEZ,EAAE,EAAE,GAAG,EAAE,OAAO,GAAE,cAAmB;IAMjD;;;OAGG;IACU,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IA+BxC;;OAEG;YACW,aAAa;IAW3B;;OAEG;IACH;;;OAGG;IACU,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IAgC3C,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACI,MAAM,IAAI,YAAY;YAuCf,aAAa;IAmH3B,OAAO,CAAC,UAAU;IAyFlB,OAAO,CAAC,UAAU;IAmClB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,IAAI;CAgBb"}
|
package/dist/indexer.js
CHANGED
|
@@ -1,51 +1,106 @@
|
|
|
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();
|
|
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());
|
|
38
|
+
await this._syncInternal(result);
|
|
24
39
|
this.db.exec("COMMIT;");
|
|
25
40
|
}
|
|
26
41
|
catch (e) {
|
|
27
42
|
this.db.exec("ROLLBACK;");
|
|
28
|
-
|
|
43
|
+
result.ok = false;
|
|
44
|
+
result.errors.push(`Sync failed: ${e.message}`);
|
|
45
|
+
if (this.strict)
|
|
46
|
+
throw e;
|
|
29
47
|
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
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());
|
|
30
61
|
}
|
|
31
62
|
/**
|
|
32
63
|
* Complete wipe and rebuild of the index.
|
|
33
64
|
*/
|
|
34
|
-
|
|
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
|
+
};
|
|
35
79
|
this.db.exec("BEGIN TRANSACTION;");
|
|
36
80
|
try {
|
|
37
|
-
|
|
38
|
-
this.
|
|
39
|
-
|
|
40
|
-
this.
|
|
41
|
-
|
|
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);
|
|
86
|
+
}
|
|
42
87
|
this.db.exec("COMMIT;");
|
|
43
|
-
this.sync();
|
|
44
88
|
}
|
|
45
89
|
catch (e) {
|
|
46
90
|
this.db.exec("ROLLBACK;");
|
|
47
|
-
|
|
91
|
+
result.ok = false;
|
|
92
|
+
result.errors.push(`Rebuild failed: ${e.message}`);
|
|
93
|
+
if (this.strict)
|
|
94
|
+
throw e;
|
|
48
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';");
|
|
49
104
|
}
|
|
50
105
|
/**
|
|
51
106
|
* Diagnostic check of the index integrity and freshness.
|
|
@@ -85,18 +140,20 @@ export class HardkasIndexer {
|
|
|
85
140
|
report.ok = report.staleArtifacts === 0 && report.zombieArtifacts === 0 && report.orphanEdges === 0;
|
|
86
141
|
return report;
|
|
87
142
|
}
|
|
88
|
-
syncArtifacts() {
|
|
89
|
-
|
|
143
|
+
async syncArtifacts(result) {
|
|
144
|
+
// Sort files to ensure deterministic indexing order
|
|
145
|
+
const files = this.walk(this.hardkasDir).sort();
|
|
90
146
|
const indexedAt = new Date().toISOString();
|
|
91
147
|
const upsertArtifact = this.db.prepare(`
|
|
92
148
|
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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
95
151
|
ON CONFLICT(artifact_id) DO UPDATE SET
|
|
96
152
|
content_hash = excluded.content_hash,
|
|
97
153
|
schema = excluded.schema,
|
|
98
154
|
version = excluded.version,
|
|
99
155
|
kind = excluded.kind,
|
|
156
|
+
mode = excluded.mode,
|
|
100
157
|
network_id = excluded.network_id,
|
|
101
158
|
tx_id = excluded.tx_id,
|
|
102
159
|
created_at = excluded.created_at,
|
|
@@ -109,48 +166,73 @@ export class HardkasIndexer {
|
|
|
109
166
|
INSERT OR REPLACE INTO lineage_edges (lineage_id, parent_artifact_id, child_artifact_id, edge_kind, created_at)
|
|
110
167
|
VALUES (?, ?, ?, ?, ?)
|
|
111
168
|
`);
|
|
112
|
-
const mtimeStmt = this.db.prepare("SELECT file_mtime_ms FROM artifacts WHERE artifact_id = ?");
|
|
113
169
|
const artifactsToLink = [];
|
|
114
170
|
for (const file of files) {
|
|
171
|
+
result.artifacts.scanned++;
|
|
115
172
|
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
|
-
}
|
|
121
|
-
const content = fs.readFileSync(file, "utf-8");
|
|
122
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");
|
|
123
193
|
const parsed = JSON.parse(content);
|
|
124
|
-
|
|
125
|
-
|
|
194
|
+
// Artifact ID is required for indexing
|
|
195
|
+
const artifactId = parsed.artifactId || parsed.contentHash || calculateContentHash(parsed);
|
|
126
196
|
const hash = parsed.contentHash || calculateContentHash(parsed);
|
|
127
|
-
upsertArtifact.run(
|
|
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++;
|
|
128
199
|
if (parsed.lineage && parsed.lineage.parentArtifactId) {
|
|
129
200
|
artifactsToLink.push(parsed);
|
|
130
201
|
}
|
|
131
202
|
}
|
|
132
203
|
catch (e) {
|
|
133
|
-
|
|
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));
|
|
134
216
|
}
|
|
135
217
|
}
|
|
136
218
|
// Pass 2: Lineage Edges (Now all artifact IDs exist)
|
|
137
219
|
for (const parsed of artifactsToLink) {
|
|
138
|
-
|
|
220
|
+
try {
|
|
221
|
+
insertEdge.run(parsed.lineage.lineageId || "legacy-lineage", parsed.lineage.parentArtifactId, parsed.artifactId || parsed.contentHash, "derived", parsed.createdAt || null);
|
|
222
|
+
}
|
|
223
|
+
catch (e) {
|
|
224
|
+
result.warnings.push(`Failed to link lineage for ${parsed.artifactId}: ${e.message}`);
|
|
225
|
+
}
|
|
139
226
|
}
|
|
140
227
|
}
|
|
141
|
-
syncEvents() {
|
|
228
|
+
syncEvents(result) {
|
|
142
229
|
const eventsPath = path.join(this.hardkasDir, "events.jsonl");
|
|
143
230
|
if (!fs.existsSync(eventsPath))
|
|
144
231
|
return;
|
|
145
232
|
const stat = fs.statSync(eventsPath);
|
|
146
233
|
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
|
-
}
|
|
152
234
|
const content = fs.readFileSync(eventsPath, "utf-8");
|
|
153
|
-
const lines = content.split("\n")
|
|
235
|
+
const lines = content.split("\n");
|
|
154
236
|
const upsertEvent = this.db.prepare(`
|
|
155
237
|
INSERT INTO events
|
|
156
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)
|
|
@@ -170,15 +252,46 @@ export class HardkasIndexer {
|
|
|
170
252
|
file_mtime_ms = excluded.file_mtime_ms,
|
|
171
253
|
indexed_at = excluded.indexed_at
|
|
172
254
|
`);
|
|
173
|
-
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;
|
|
174
261
|
try {
|
|
175
262
|
const parsed = JSON.parse(line);
|
|
176
|
-
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));
|
|
177
276
|
continue;
|
|
277
|
+
}
|
|
178
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++;
|
|
179
280
|
}
|
|
180
281
|
catch (e) {
|
|
181
|
-
|
|
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));
|
|
182
295
|
}
|
|
183
296
|
}
|
|
184
297
|
}
|
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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
const require = createRequire(import.meta.url);
|
|
3
|
+
const { DatabaseSync } = require("node:sqlite");
|
|
4
|
+
import { HardkasError } from "@hardkas/core";
|
|
5
|
+
export class MigrationRunner {
|
|
6
|
+
db;
|
|
7
|
+
constructor(db) {
|
|
8
|
+
this.db = db;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Ensures the migration history table exists.
|
|
12
|
+
*/
|
|
13
|
+
ensureHistoryTable() {
|
|
14
|
+
this.db.exec(`
|
|
15
|
+
CREATE TABLE IF NOT EXISTS hardkas_migrations (
|
|
16
|
+
version INTEGER PRIMARY KEY,
|
|
17
|
+
name TEXT NOT NULL,
|
|
18
|
+
checksum TEXT NOT NULL,
|
|
19
|
+
applied_at TEXT NOT NULL
|
|
20
|
+
);
|
|
21
|
+
`);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Fetches all applied migrations from the history table.
|
|
25
|
+
*/
|
|
26
|
+
getAppliedMigrations() {
|
|
27
|
+
try {
|
|
28
|
+
const stmt = this.db.prepare("SELECT * FROM hardkas_migrations ORDER BY version ASC");
|
|
29
|
+
return stmt.all();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Applies pending migrations in order.
|
|
37
|
+
*/
|
|
38
|
+
migrate(migrations) {
|
|
39
|
+
this.ensureHistoryTable();
|
|
40
|
+
const applied = this.getAppliedMigrations();
|
|
41
|
+
const appliedMap = new Map(applied.map(m => [m.version, m]));
|
|
42
|
+
// Check for checksum mismatches in already applied migrations
|
|
43
|
+
for (const m of migrations) {
|
|
44
|
+
const existing = appliedMap.get(m.version);
|
|
45
|
+
if (existing && existing.checksum !== m.checksum) {
|
|
46
|
+
throw new HardkasError("STORE_MIGRATION_CHECKSUM_MISMATCH", `Migration checksum mismatch for version ${m.version} (${m.name}). Expected ${m.checksum}, got ${existing.checksum}.`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const pending = migrations
|
|
50
|
+
.filter(m => !appliedMap.has(m.version))
|
|
51
|
+
.sort((a, b) => a.version - b.version);
|
|
52
|
+
if (pending.length === 0) {
|
|
53
|
+
return { applied: 0, status: "ok" };
|
|
54
|
+
}
|
|
55
|
+
let appliedCount = 0;
|
|
56
|
+
for (const m of pending) {
|
|
57
|
+
try {
|
|
58
|
+
this.db.exec("BEGIN TRANSACTION;");
|
|
59
|
+
m.up(this.db);
|
|
60
|
+
const stmt = this.db.prepare("INSERT INTO hardkas_migrations (version, name, checksum, applied_at) VALUES (?, ?, ?, ?)");
|
|
61
|
+
stmt.run(m.version, m.name, m.checksum, new Date().toISOString());
|
|
62
|
+
this.db.exec("COMMIT;");
|
|
63
|
+
appliedCount++;
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
this.db.exec("ROLLBACK;");
|
|
67
|
+
throw new HardkasError("STORE_MIGRATION_FAILED", `Failed to apply migration ${m.version} (${m.name}): ${e instanceof Error ? e.message : String(e)}`, { cause: e });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { applied: appliedCount, status: "ok" };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Legacy bootstrap: if the DB is in a known state but has no migration history,
|
|
74
|
+
* we inject the history without running the 'up' logic.
|
|
75
|
+
*/
|
|
76
|
+
bootstrapLegacy(knownVersion, migrations) {
|
|
77
|
+
const applied = this.getAppliedMigrations();
|
|
78
|
+
if (applied.length > 0)
|
|
79
|
+
return false; // Already has history
|
|
80
|
+
// Check if it's a known legacy state (e.g. has artifacts table)
|
|
81
|
+
const tables = this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='artifacts'").get();
|
|
82
|
+
if (!tables)
|
|
83
|
+
return false;
|
|
84
|
+
// It's a legacy DB. Inject history for migrations up to knownVersion.
|
|
85
|
+
this.ensureHistoryTable();
|
|
86
|
+
for (const m of migrations) {
|
|
87
|
+
if (m.version <= knownVersion) {
|
|
88
|
+
const stmt = this.db.prepare("INSERT INTO hardkas_migrations (version, name, checksum, applied_at) VALUES (?, ?, ?, ?)");
|
|
89
|
+
stmt.run(m.version, m.name, m.checksum, new Date().toISOString());
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Registry of all query-store migrations.
|
|
97
|
+
* Version 1: Initial schema (Baseline v0.2-alpha).
|
|
98
|
+
*/
|
|
99
|
+
export const MIGRATIONS = [
|
|
100
|
+
{
|
|
101
|
+
version: 1,
|
|
102
|
+
name: "initial_schema",
|
|
103
|
+
checksum: "hardkas_v1_baseline",
|
|
104
|
+
up: (db) => {
|
|
105
|
+
db.exec(`
|
|
106
|
+
CREATE TABLE IF NOT EXISTS metadata (
|
|
107
|
+
key TEXT PRIMARY KEY,
|
|
108
|
+
value TEXT NOT NULL
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
CREATE TABLE IF NOT EXISTS artifacts (
|
|
112
|
+
artifact_id TEXT PRIMARY KEY,
|
|
113
|
+
content_hash TEXT NOT NULL,
|
|
114
|
+
schema TEXT NOT NULL,
|
|
115
|
+
version TEXT NOT NULL,
|
|
116
|
+
kind TEXT NOT NULL,
|
|
117
|
+
mode TEXT NOT NULL DEFAULT 'unknown',
|
|
118
|
+
network_id TEXT NOT NULL,
|
|
119
|
+
tx_id TEXT,
|
|
120
|
+
created_at TEXT,
|
|
121
|
+
raw_json TEXT NOT NULL,
|
|
122
|
+
file_path TEXT,
|
|
123
|
+
file_mtime_ms INTEGER,
|
|
124
|
+
indexed_at TEXT
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_content_hash ON artifacts(content_hash);
|
|
128
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_schema ON artifacts(schema);
|
|
129
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_kind ON artifacts(kind);
|
|
130
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_mode ON artifacts(mode);
|
|
131
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_network_id ON artifacts(network_id);
|
|
132
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_tx_id ON artifacts(tx_id);
|
|
133
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_created_at ON artifacts(created_at);
|
|
134
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_file_path ON artifacts(file_path);
|
|
135
|
+
|
|
136
|
+
CREATE TABLE IF NOT EXISTS lineage_edges (
|
|
137
|
+
lineage_id TEXT NOT NULL,
|
|
138
|
+
parent_artifact_id TEXT NOT NULL,
|
|
139
|
+
child_artifact_id TEXT NOT NULL,
|
|
140
|
+
edge_kind TEXT NOT NULL,
|
|
141
|
+
created_at TEXT,
|
|
142
|
+
PRIMARY KEY (parent_artifact_id, child_artifact_id),
|
|
143
|
+
FOREIGN KEY (parent_artifact_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE,
|
|
144
|
+
FOREIGN KEY (child_artifact_id) REFERENCES artifacts(artifact_id) ON DELETE CASCADE
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
CREATE INDEX IF NOT EXISTS idx_lineage_parent ON lineage_edges(parent_artifact_id);
|
|
148
|
+
CREATE INDEX IF NOT EXISTS idx_lineage_child ON lineage_edges(child_artifact_id);
|
|
149
|
+
CREATE INDEX IF NOT EXISTS idx_lineage_id ON lineage_edges(lineage_id);
|
|
150
|
+
|
|
151
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
152
|
+
event_id TEXT PRIMARY KEY,
|
|
153
|
+
kind TEXT NOT NULL,
|
|
154
|
+
domain TEXT NOT NULL,
|
|
155
|
+
timestamp TEXT,
|
|
156
|
+
workflow_id TEXT NOT NULL,
|
|
157
|
+
correlation_id TEXT NOT NULL,
|
|
158
|
+
causation_id TEXT,
|
|
159
|
+
tx_id TEXT,
|
|
160
|
+
artifact_id TEXT,
|
|
161
|
+
network_id TEXT NOT NULL,
|
|
162
|
+
raw_json TEXT NOT NULL,
|
|
163
|
+
file_path TEXT,
|
|
164
|
+
file_mtime_ms INTEGER,
|
|
165
|
+
indexed_at TEXT
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
CREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind);
|
|
169
|
+
CREATE INDEX IF NOT EXISTS idx_events_domain ON events(domain);
|
|
170
|
+
CREATE INDEX IF NOT EXISTS idx_events_workflow_id ON events(workflow_id);
|
|
171
|
+
CREATE INDEX IF NOT EXISTS idx_events_correlation_id ON events(correlation_id);
|
|
172
|
+
CREATE INDEX IF NOT EXISTS idx_events_causation_id ON events(causation_id);
|
|
173
|
+
CREATE INDEX IF NOT EXISTS idx_events_tx_id ON events(tx_id);
|
|
174
|
+
CREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);
|
|
175
|
+
CREATE INDEX IF NOT EXISTS idx_events_network_id ON events(network_id);
|
|
176
|
+
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
|
|
177
|
+
CREATE INDEX IF NOT EXISTS idx_events_file_path ON events(file_path);
|
|
178
|
+
|
|
179
|
+
CREATE TABLE IF NOT EXISTS traces (
|
|
180
|
+
trace_id TEXT PRIMARY KEY,
|
|
181
|
+
workflow_id TEXT UNIQUE NOT NULL,
|
|
182
|
+
root_event_id TEXT,
|
|
183
|
+
status TEXT NOT NULL,
|
|
184
|
+
started_at TEXT,
|
|
185
|
+
ended_at TEXT,
|
|
186
|
+
FOREIGN KEY (root_event_id) REFERENCES events(event_id) ON DELETE SET NULL
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
CREATE INDEX IF NOT EXISTS idx_traces_workflow_id ON traces(workflow_id);
|
|
190
|
+
CREATE INDEX IF NOT EXISTS idx_traces_status ON traces(status);
|
|
191
|
+
`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
];
|
|
195
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
-
export declare const SCHEMA_VERSION =
|
|
2
|
-
export
|
|
1
|
+
export declare const SCHEMA_VERSION = 1;
|
|
2
|
+
export interface MetadataRow {
|
|
3
|
+
key: string;
|
|
4
|
+
value: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ArtifactRow {
|
|
7
|
+
artifact_id: string;
|
|
8
|
+
content_hash: string;
|
|
9
|
+
schema: string;
|
|
10
|
+
version: string;
|
|
11
|
+
kind: string;
|
|
12
|
+
mode: string;
|
|
13
|
+
network_id: string;
|
|
14
|
+
tx_id?: string;
|
|
15
|
+
created_at?: string;
|
|
16
|
+
raw_json: string;
|
|
17
|
+
file_path?: string;
|
|
18
|
+
file_mtime_ms?: number;
|
|
19
|
+
indexed_at?: string;
|
|
20
|
+
}
|
|
3
21
|
//# 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,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
package/dist/schema.js
CHANGED
|
@@ -1,87 +1,2 @@
|
|
|
1
|
-
export const SCHEMA_VERSION =
|
|
2
|
-
export const DDL = `
|
|
3
|
-
CREATE TABLE IF NOT EXISTS metadata (
|
|
4
|
-
key TEXT PRIMARY KEY,
|
|
5
|
-
value TEXT NOT NULL
|
|
6
|
-
);
|
|
7
|
-
|
|
8
|
-
CREATE TABLE IF NOT EXISTS artifacts (
|
|
9
|
-
artifact_id TEXT PRIMARY KEY,
|
|
10
|
-
content_hash TEXT NOT NULL,
|
|
11
|
-
schema TEXT NOT NULL,
|
|
12
|
-
version TEXT NOT NULL,
|
|
13
|
-
kind TEXT NOT NULL,
|
|
14
|
-
network_id TEXT NOT NULL,
|
|
15
|
-
tx_id TEXT,
|
|
16
|
-
created_at TEXT,
|
|
17
|
-
raw_json TEXT NOT NULL,
|
|
18
|
-
file_path TEXT,
|
|
19
|
-
file_mtime_ms INTEGER,
|
|
20
|
-
indexed_at TEXT
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_content_hash ON artifacts(content_hash);
|
|
24
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_schema ON artifacts(schema);
|
|
25
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_kind ON artifacts(kind);
|
|
26
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_network_id ON artifacts(network_id);
|
|
27
|
-
CREATE INDEX IF NOT EXISTS idx_artifacts_tx_id ON artifacts(tx_id);
|
|
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);
|
|
30
|
-
|
|
31
|
-
CREATE TABLE IF NOT EXISTS lineage_edges (
|
|
32
|
-
lineage_id TEXT NOT NULL,
|
|
33
|
-
parent_artifact_id TEXT NOT NULL,
|
|
34
|
-
child_artifact_id TEXT NOT NULL,
|
|
35
|
-
edge_kind TEXT NOT NULL,
|
|
36
|
-
created_at TEXT,
|
|
37
|
-
PRIMARY KEY (parent_artifact_id, child_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
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
CREATE INDEX IF NOT EXISTS idx_lineage_parent ON lineage_edges(parent_artifact_id);
|
|
43
|
-
CREATE INDEX IF NOT EXISTS idx_lineage_child ON lineage_edges(child_artifact_id);
|
|
44
|
-
CREATE INDEX IF NOT EXISTS idx_lineage_id ON lineage_edges(lineage_id);
|
|
45
|
-
|
|
46
|
-
CREATE TABLE IF NOT EXISTS events (
|
|
47
|
-
event_id TEXT PRIMARY KEY,
|
|
48
|
-
kind TEXT NOT NULL,
|
|
49
|
-
domain TEXT NOT NULL,
|
|
50
|
-
timestamp TEXT,
|
|
51
|
-
workflow_id TEXT NOT NULL,
|
|
52
|
-
correlation_id TEXT NOT NULL,
|
|
53
|
-
causation_id TEXT,
|
|
54
|
-
tx_id TEXT,
|
|
55
|
-
artifact_id TEXT,
|
|
56
|
-
network_id TEXT NOT NULL,
|
|
57
|
-
raw_json TEXT NOT NULL,
|
|
58
|
-
file_path TEXT,
|
|
59
|
-
file_mtime_ms INTEGER,
|
|
60
|
-
indexed_at TEXT
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
CREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind);
|
|
64
|
-
CREATE INDEX IF NOT EXISTS idx_events_domain ON events(domain);
|
|
65
|
-
CREATE INDEX IF NOT EXISTS idx_events_workflow_id ON events(workflow_id);
|
|
66
|
-
CREATE INDEX IF NOT EXISTS idx_events_correlation_id ON events(correlation_id);
|
|
67
|
-
CREATE INDEX IF NOT EXISTS idx_events_causation_id ON events(causation_id);
|
|
68
|
-
CREATE INDEX IF NOT EXISTS idx_events_tx_id ON events(tx_id);
|
|
69
|
-
CREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);
|
|
70
|
-
CREATE INDEX IF NOT EXISTS idx_events_network_id ON events(network_id);
|
|
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);
|
|
73
|
-
|
|
74
|
-
CREATE TABLE IF NOT EXISTS traces (
|
|
75
|
-
trace_id TEXT PRIMARY KEY,
|
|
76
|
-
workflow_id TEXT UNIQUE NOT NULL,
|
|
77
|
-
root_event_id TEXT,
|
|
78
|
-
status TEXT NOT NULL,
|
|
79
|
-
started_at TEXT,
|
|
80
|
-
ended_at TEXT,
|
|
81
|
-
FOREIGN KEY (root_event_id) REFERENCES events(event_id) ON DELETE SET NULL
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
CREATE INDEX IF NOT EXISTS idx_traces_workflow_id ON traces(workflow_id);
|
|
85
|
-
CREATE INDEX IF NOT EXISTS idx_traces_status ON traces(status);
|
|
86
|
-
`;
|
|
1
|
+
export const SCHEMA_VERSION = 1;
|
|
87
2
|
//# sourceMappingURL=schema.js.map
|
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
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hardkas/query-store",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0-alpha",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
}
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@hardkas/
|
|
15
|
-
"@hardkas/
|
|
14
|
+
"@hardkas/core": "0.4.0-alpha",
|
|
15
|
+
"@hardkas/artifacts": "0.4.0-alpha"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"tsup": "^8.3.5",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
],
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "tsc",
|
|
42
|
-
"test": "
|
|
42
|
+
"test": "vitest run",
|
|
43
43
|
"typecheck": "tsc --noEmit",
|
|
44
44
|
"lint": "eslint ."
|
|
45
45
|
}
|