@hardkas/query-store 0.2.2-alpha → 0.3.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend.d.ts +47 -4
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +76 -5
- package/dist/backend.js.map +1 -1
- package/dist/db.d.ts +20 -3
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +105 -35
- package/dist/db.js.map +1 -1
- package/dist/indexer.d.ts +51 -3
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js +309 -90
- package/dist/indexer.js.map +1 -1
- package/dist/migrations.d.ts +42 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +195 -0
- package/dist/migrations.js.map +1 -0
- package/dist/schema.d.ts +20 -2
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +1 -78
- package/dist/schema.js.map +1 -1
- package/package.json +8 -5
package/dist/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,31 @@ export interface QueryBackend {
|
|
|
46
50
|
parentHash?: string;
|
|
47
51
|
childHash?: string;
|
|
48
52
|
}): Promise<LineageEdgeDocument[]>;
|
|
53
|
+
getStoreStatus(): Promise<string>;
|
|
54
|
+
doctor(): Promise<any>;
|
|
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[]>;
|
|
65
|
+
findReceipts(filters?: {
|
|
66
|
+
status?: string;
|
|
67
|
+
networkId?: string;
|
|
68
|
+
}): Promise<ArtifactDocument[]>;
|
|
69
|
+
findTraces(filters?: {
|
|
70
|
+
txId?: string;
|
|
71
|
+
}): Promise<ArtifactDocument[]>;
|
|
49
72
|
}
|
|
50
73
|
export declare class SqliteQueryBackend implements QueryBackend {
|
|
51
74
|
private store;
|
|
52
75
|
constructor(store: HardkasStore);
|
|
53
76
|
isReady(): boolean;
|
|
77
|
+
kind(): "sqlite";
|
|
54
78
|
findArtifacts(filters?: {
|
|
55
79
|
schema?: string;
|
|
56
80
|
mode?: string;
|
|
@@ -65,5 +89,24 @@ export declare class SqliteQueryBackend implements QueryBackend {
|
|
|
65
89
|
parentHash?: string;
|
|
66
90
|
childHash?: string;
|
|
67
91
|
}): Promise<LineageEdgeDocument[]>;
|
|
92
|
+
findReceipts(filters?: {
|
|
93
|
+
status?: string;
|
|
94
|
+
networkId?: string;
|
|
95
|
+
}): Promise<ArtifactDocument[]>;
|
|
96
|
+
findTraces(filters?: {
|
|
97
|
+
txId?: string;
|
|
98
|
+
}): Promise<ArtifactDocument[]>;
|
|
99
|
+
getStoreStatus(): Promise<string>;
|
|
100
|
+
doctor(): Promise<any>;
|
|
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[]>;
|
|
68
111
|
}
|
|
69
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;
|
|
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";
|
|
@@ -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.mode || "unknown"),
|
|
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.mode || "unknown"),
|
|
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,85 @@ 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.mode || "unknown"),
|
|
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
|
+
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
|
+
};
|
|
152
|
+
}
|
|
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();
|
|
159
|
+
const { HardkasIndexer } = await import("./indexer.js");
|
|
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();
|
|
173
|
+
}
|
|
103
174
|
}
|
|
104
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,14 +1,62 @@
|
|
|
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[];
|
|
20
|
+
}
|
|
21
|
+
export interface DoctorReport {
|
|
22
|
+
ok: boolean;
|
|
23
|
+
staleArtifacts: number;
|
|
24
|
+
zombieArtifacts: number;
|
|
25
|
+
corruptedFiles: string[];
|
|
26
|
+
orphanEdges: number;
|
|
27
|
+
lastIndexedAt: string | null;
|
|
4
28
|
}
|
|
5
29
|
export declare class HardkasIndexer {
|
|
6
30
|
private db;
|
|
7
31
|
private hardkasDir;
|
|
8
|
-
|
|
9
|
-
|
|
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
|
+
*/
|
|
46
|
+
/**
|
|
47
|
+
* Complete wipe and rebuild of the index.
|
|
48
|
+
* Atomic across wipe and first sync.
|
|
49
|
+
*/
|
|
50
|
+
rebuild(): Promise<SyncResult>;
|
|
51
|
+
private _wipeInternal;
|
|
52
|
+
/**
|
|
53
|
+
* Diagnostic check of the index integrity and freshness.
|
|
54
|
+
*/
|
|
55
|
+
doctor(): DoctorReport;
|
|
10
56
|
private syncArtifacts;
|
|
11
57
|
private syncEvents;
|
|
12
58
|
private syncTraces;
|
|
59
|
+
private cleanupZombies;
|
|
60
|
+
private walk;
|
|
13
61
|
}
|
|
14
62
|
//# 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":"
|
|
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"}
|