@hardkas/query-store 0.1.0
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/LICENSE +21 -0
- package/dist/backend.d.ts +69 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +104 -0
- package/dist/backend.js.map +1 -0
- package/dist/db.d.ts +14 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +82 -0
- package/dist/db.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +14 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +146 -0
- package/dist/indexer.js.map +1 -0
- package/dist/schema.d.ts +3 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +79 -0
- package/dist/schema.js.map +1 -0
- package/package.json +43 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Javier Rodriguez
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { HardkasStore } from "./db.js";
|
|
2
|
+
export interface ArtifactDocument {
|
|
3
|
+
readonly contentHash: string;
|
|
4
|
+
readonly schema: string;
|
|
5
|
+
readonly version: string;
|
|
6
|
+
readonly kind: string;
|
|
7
|
+
readonly networkId: string;
|
|
8
|
+
readonly createdAt: string | null;
|
|
9
|
+
readonly txId: string | null;
|
|
10
|
+
readonly artifactId: string;
|
|
11
|
+
readonly payload: unknown;
|
|
12
|
+
}
|
|
13
|
+
export interface EventDocument {
|
|
14
|
+
readonly eventId: string;
|
|
15
|
+
readonly kind: string;
|
|
16
|
+
readonly domain: string;
|
|
17
|
+
readonly workflowId: string;
|
|
18
|
+
readonly correlationId: string;
|
|
19
|
+
readonly causationId: string | null;
|
|
20
|
+
readonly txId: string | null;
|
|
21
|
+
readonly artifactId: string | null;
|
|
22
|
+
readonly networkId: string;
|
|
23
|
+
readonly timestamp: string | null;
|
|
24
|
+
readonly payload: unknown;
|
|
25
|
+
}
|
|
26
|
+
export interface LineageEdgeDocument {
|
|
27
|
+
readonly lineageId: string;
|
|
28
|
+
readonly parentArtifactId: string;
|
|
29
|
+
readonly childArtifactId: string;
|
|
30
|
+
readonly edgeKind: string;
|
|
31
|
+
readonly createdAt: string | null;
|
|
32
|
+
}
|
|
33
|
+
export interface QueryBackend {
|
|
34
|
+
isReady(): boolean;
|
|
35
|
+
findArtifacts(filters?: {
|
|
36
|
+
schema?: string;
|
|
37
|
+
mode?: string;
|
|
38
|
+
networkId?: string;
|
|
39
|
+
}): Promise<ArtifactDocument[]>;
|
|
40
|
+
getArtifact(idOrHash: string): Promise<ArtifactDocument | null>;
|
|
41
|
+
getEvents(filters?: {
|
|
42
|
+
kind?: string;
|
|
43
|
+
txId?: string;
|
|
44
|
+
}): Promise<EventDocument[]>;
|
|
45
|
+
getLineageEdges(filters?: {
|
|
46
|
+
parentHash?: string;
|
|
47
|
+
childHash?: string;
|
|
48
|
+
}): Promise<LineageEdgeDocument[]>;
|
|
49
|
+
}
|
|
50
|
+
export declare class SqliteQueryBackend implements QueryBackend {
|
|
51
|
+
private store;
|
|
52
|
+
constructor(store: HardkasStore);
|
|
53
|
+
isReady(): boolean;
|
|
54
|
+
findArtifacts(filters?: {
|
|
55
|
+
schema?: string;
|
|
56
|
+
mode?: string;
|
|
57
|
+
networkId?: string;
|
|
58
|
+
}): Promise<ArtifactDocument[]>;
|
|
59
|
+
getArtifact(idOrHash: string): Promise<ArtifactDocument | null>;
|
|
60
|
+
getEvents(filters?: {
|
|
61
|
+
kind?: string;
|
|
62
|
+
txId?: string;
|
|
63
|
+
}): Promise<EventDocument[]>;
|
|
64
|
+
getLineageEdges(filters?: {
|
|
65
|
+
parentHash?: string;
|
|
66
|
+
childHash?: string;
|
|
67
|
+
}): Promise<LineageEdgeDocument[]>;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/backend.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export class SqliteQueryBackend {
|
|
2
|
+
store;
|
|
3
|
+
constructor(store) {
|
|
4
|
+
this.store = store;
|
|
5
|
+
}
|
|
6
|
+
isReady() {
|
|
7
|
+
return this.store.getDatabase() !== null;
|
|
8
|
+
}
|
|
9
|
+
async findArtifacts(filters) {
|
|
10
|
+
const db = this.store.getDatabase();
|
|
11
|
+
let query = "SELECT * FROM artifacts WHERE 1=1";
|
|
12
|
+
const params = [];
|
|
13
|
+
if (filters?.schema) {
|
|
14
|
+
query += " AND schema = ?";
|
|
15
|
+
params.push(filters.schema);
|
|
16
|
+
}
|
|
17
|
+
if (filters?.mode) {
|
|
18
|
+
query += " AND mode = ?";
|
|
19
|
+
params.push(filters.mode);
|
|
20
|
+
}
|
|
21
|
+
if (filters?.networkId) {
|
|
22
|
+
query += " AND network_id = ?";
|
|
23
|
+
params.push(filters.networkId);
|
|
24
|
+
}
|
|
25
|
+
const rows = db.prepare(query).all(...params);
|
|
26
|
+
return rows.map(r => ({
|
|
27
|
+
contentHash: r.content_hash,
|
|
28
|
+
schema: r.schema,
|
|
29
|
+
version: r.version,
|
|
30
|
+
kind: r.kind,
|
|
31
|
+
networkId: r.network_id,
|
|
32
|
+
createdAt: r.created_at,
|
|
33
|
+
txId: r.tx_id,
|
|
34
|
+
artifactId: r.artifact_id,
|
|
35
|
+
payload: JSON.parse(r.raw_json)
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
async getArtifact(idOrHash) {
|
|
39
|
+
const db = this.store.getDatabase();
|
|
40
|
+
const row = db.prepare("SELECT * FROM artifacts WHERE artifact_id = ? OR content_hash = ?").get(idOrHash, idOrHash);
|
|
41
|
+
if (!row)
|
|
42
|
+
return null;
|
|
43
|
+
return {
|
|
44
|
+
contentHash: row.content_hash,
|
|
45
|
+
schema: row.schema,
|
|
46
|
+
version: row.version,
|
|
47
|
+
kind: row.kind,
|
|
48
|
+
networkId: row.network_id,
|
|
49
|
+
createdAt: row.created_at,
|
|
50
|
+
txId: row.tx_id,
|
|
51
|
+
artifactId: row.artifact_id,
|
|
52
|
+
payload: JSON.parse(row.raw_json)
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async getEvents(filters) {
|
|
56
|
+
const db = this.store.getDatabase();
|
|
57
|
+
let query = "SELECT * FROM events WHERE 1=1";
|
|
58
|
+
const params = [];
|
|
59
|
+
if (filters?.kind) {
|
|
60
|
+
query += " AND kind = ?";
|
|
61
|
+
params.push(filters.kind);
|
|
62
|
+
}
|
|
63
|
+
if (filters?.txId) {
|
|
64
|
+
query += " AND tx_id = ?";
|
|
65
|
+
params.push(filters.txId);
|
|
66
|
+
}
|
|
67
|
+
const rows = db.prepare(query).all(...params);
|
|
68
|
+
return rows.map(r => ({
|
|
69
|
+
eventId: r.event_id,
|
|
70
|
+
kind: r.kind,
|
|
71
|
+
domain: r.domain,
|
|
72
|
+
workflowId: r.workflow_id,
|
|
73
|
+
correlationId: r.correlation_id,
|
|
74
|
+
causationId: r.causation_id,
|
|
75
|
+
txId: r.tx_id,
|
|
76
|
+
artifactId: r.artifact_id,
|
|
77
|
+
networkId: r.network_id,
|
|
78
|
+
timestamp: r.timestamp,
|
|
79
|
+
payload: JSON.parse(r.raw_json).payload
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
async getLineageEdges(filters) {
|
|
83
|
+
const db = this.store.getDatabase();
|
|
84
|
+
let query = "SELECT * FROM lineage_edges WHERE 1=1";
|
|
85
|
+
const params = [];
|
|
86
|
+
if (filters?.parentHash) {
|
|
87
|
+
query += " AND parent_hash = ?";
|
|
88
|
+
params.push(filters.parentHash);
|
|
89
|
+
}
|
|
90
|
+
if (filters?.childHash) {
|
|
91
|
+
query += " AND child_hash = ?";
|
|
92
|
+
params.push(filters.childHash);
|
|
93
|
+
}
|
|
94
|
+
const rows = db.prepare(query).all(...params);
|
|
95
|
+
return rows.map(r => ({
|
|
96
|
+
lineageId: r.lineage_id,
|
|
97
|
+
parentArtifactId: r.parent_artifact_id,
|
|
98
|
+
childArtifactId: r.child_artifact_id,
|
|
99
|
+
edgeKind: r.edge_kind,
|
|
100
|
+
createdAt: r.created_at
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
export declare class HardkasStore {
|
|
3
|
+
private db;
|
|
4
|
+
private readonly dbPath;
|
|
5
|
+
constructor(options?: {
|
|
6
|
+
dbPath?: string;
|
|
7
|
+
memory?: boolean;
|
|
8
|
+
});
|
|
9
|
+
connect(): void;
|
|
10
|
+
disconnect(): void;
|
|
11
|
+
getDatabase(): DatabaseSync;
|
|
12
|
+
private initialize;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAA6B;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO;IAQxD,OAAO;IAcP,UAAU;IAOV,WAAW,IAAI,YAAY;IAOlC,OAAO,CAAC,UAAU;CA4CnB"}
|
package/dist/db.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import { DDL, SCHEMA_VERSION } from "./schema.js";
|
|
5
|
+
export class HardkasStore {
|
|
6
|
+
db = null;
|
|
7
|
+
dbPath;
|
|
8
|
+
constructor(options = {}) {
|
|
9
|
+
if (options.memory) {
|
|
10
|
+
this.dbPath = ":memory:";
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
this.dbPath = options.dbPath || path.join(process.cwd(), ".hardkas", "store.db");
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
connect() {
|
|
17
|
+
if (this.db)
|
|
18
|
+
return;
|
|
19
|
+
if (this.dbPath !== ":memory:") {
|
|
20
|
+
const dir = path.dirname(this.dbPath);
|
|
21
|
+
if (!fs.existsSync(dir)) {
|
|
22
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
this.db = new DatabaseSync(this.dbPath);
|
|
26
|
+
this.initialize();
|
|
27
|
+
}
|
|
28
|
+
disconnect() {
|
|
29
|
+
if (this.db) {
|
|
30
|
+
this.db.close();
|
|
31
|
+
this.db = null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
getDatabase() {
|
|
35
|
+
if (!this.db) {
|
|
36
|
+
throw new Error("Store not connected. Call connect() first.");
|
|
37
|
+
}
|
|
38
|
+
return this.db;
|
|
39
|
+
}
|
|
40
|
+
initialize() {
|
|
41
|
+
if (!this.db)
|
|
42
|
+
return;
|
|
43
|
+
// Enable WAL mode for better concurrency
|
|
44
|
+
this.db.exec("PRAGMA journal_mode = WAL;");
|
|
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;
|
|
52
|
+
try {
|
|
53
|
+
const row = stmt.get();
|
|
54
|
+
if (row) {
|
|
55
|
+
version = parseInt(row.value, 10);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
// Ignore if table was just created
|
|
60
|
+
}
|
|
61
|
+
if (version === 0) {
|
|
62
|
+
const insert = this.db.prepare("INSERT INTO metadata (key, value) VALUES ('version', ?)");
|
|
63
|
+
insert.run(SCHEMA_VERSION.toString());
|
|
64
|
+
}
|
|
65
|
+
else if (version !== SCHEMA_VERSION) {
|
|
66
|
+
console.warn(`Schema version mismatch (expected ${SCHEMA_VERSION}, got ${version}). Developer Preview: Recreating schema.`);
|
|
67
|
+
// Developer Preview Migration: Drop and Recreate
|
|
68
|
+
this.db.exec("PRAGMA foreign_keys = OFF;");
|
|
69
|
+
this.db.exec("DROP TABLE IF EXISTS artifacts;");
|
|
70
|
+
this.db.exec("DROP TABLE IF EXISTS lineage_edges;");
|
|
71
|
+
this.db.exec("DROP TABLE IF EXISTS events;");
|
|
72
|
+
this.db.exec("DROP TABLE IF EXISTS traces;");
|
|
73
|
+
this.db.exec("DROP TABLE IF EXISTS metadata;");
|
|
74
|
+
this.db.exec("PRAGMA foreign_keys = ON;");
|
|
75
|
+
// Re-initialize
|
|
76
|
+
this.db.exec(DDL);
|
|
77
|
+
const insert = this.db.prepare("INSERT INTO metadata (key, value) VALUES ('version', ?)");
|
|
78
|
+
insert.run(SCHEMA_VERSION.toString());
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
export interface IndexerOptions {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class HardkasIndexer {
|
|
6
|
+
private db;
|
|
7
|
+
private hardkasDir;
|
|
8
|
+
constructor(db: DatabaseSync, options?: IndexerOptions);
|
|
9
|
+
sync(): void;
|
|
10
|
+
private syncArtifacts;
|
|
11
|
+
private syncEvents;
|
|
12
|
+
private syncTraces;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=indexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAe;IACzB,OAAO,CAAC,UAAU,CAAS;gBAEf,EAAE,EAAE,YAAY,EAAE,OAAO,GAAE,cAAmB;IAKnD,IAAI;IAeX,OAAO,CAAC,aAAa;IA8ErB,OAAO,CAAC,UAAU;IA6ClB,OAAO,CAAC,UAAU;CAkCnB"}
|
package/dist/indexer.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { calculateContentHash } from "@hardkas/artifacts";
|
|
4
|
+
import { validateEventEnvelope } from "@hardkas/core";
|
|
5
|
+
export class HardkasIndexer {
|
|
6
|
+
db;
|
|
7
|
+
hardkasDir;
|
|
8
|
+
constructor(db, options = {}) {
|
|
9
|
+
this.db = db;
|
|
10
|
+
this.hardkasDir = path.join(options.cwd || process.cwd(), ".hardkas");
|
|
11
|
+
}
|
|
12
|
+
sync() {
|
|
13
|
+
if (!fs.existsSync(this.hardkasDir))
|
|
14
|
+
return;
|
|
15
|
+
this.db.exec("BEGIN TRANSACTION;");
|
|
16
|
+
try {
|
|
17
|
+
this.syncArtifacts();
|
|
18
|
+
this.syncEvents();
|
|
19
|
+
this.syncTraces();
|
|
20
|
+
this.db.exec("COMMIT;");
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
this.db.exec("ROLLBACK;");
|
|
24
|
+
throw e;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
syncArtifacts() {
|
|
28
|
+
const walk = (dir) => {
|
|
29
|
+
let results = [];
|
|
30
|
+
if (!fs.existsSync(dir))
|
|
31
|
+
return results;
|
|
32
|
+
const list = fs.readdirSync(dir);
|
|
33
|
+
for (const file of list) {
|
|
34
|
+
const filePath = path.join(dir, file);
|
|
35
|
+
const stat = fs.statSync(filePath);
|
|
36
|
+
if (stat.isDirectory()) {
|
|
37
|
+
results = results.concat(walk(filePath));
|
|
38
|
+
}
|
|
39
|
+
else if (file.endsWith(".json") && !file.endsWith("events.jsonl") && file !== "state.json") {
|
|
40
|
+
results.push(filePath);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return results;
|
|
44
|
+
};
|
|
45
|
+
const files = walk(this.hardkasDir);
|
|
46
|
+
const insertArtifact = this.db.prepare(`
|
|
47
|
+
INSERT OR IGNORE INTO artifacts
|
|
48
|
+
(artifact_id, content_hash, schema, version, kind, network_id, tx_id, created_at, raw_json)
|
|
49
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
50
|
+
`);
|
|
51
|
+
const insertEdge = this.db.prepare(`
|
|
52
|
+
INSERT OR IGNORE INTO lineage_edges (lineage_id, parent_artifact_id, child_artifact_id, edge_kind, created_at)
|
|
53
|
+
VALUES (?, ?, ?, ?, ?)
|
|
54
|
+
`);
|
|
55
|
+
const artifactsWithLineage = [];
|
|
56
|
+
// Pass 1: Index Artifacts
|
|
57
|
+
for (const file of files) {
|
|
58
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
59
|
+
try {
|
|
60
|
+
const parsed = JSON.parse(content);
|
|
61
|
+
if (!parsed.schema || !parsed.version || !parsed.artifactId)
|
|
62
|
+
continue;
|
|
63
|
+
const hash = parsed.contentHash || calculateContentHash(parsed);
|
|
64
|
+
insertArtifact.run(parsed.artifactId, hash, parsed.schema, parsed.version, parsed.kind || parsed.schema, parsed.networkId || "unknown", parsed.txId || null, parsed.createdAt || null, content);
|
|
65
|
+
if (parsed.lineage && parsed.lineage.parentArtifactId) {
|
|
66
|
+
artifactsWithLineage.push(parsed);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
// Skip invalid JSON
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Pass 2: Index Lineage Edges (after artifacts are present)
|
|
74
|
+
for (const parsed of artifactsWithLineage) {
|
|
75
|
+
try {
|
|
76
|
+
insertEdge.run(parsed.lineage.lineageId || "legacy-lineage", parsed.lineage.parentArtifactId, parsed.artifactId, "derived", parsed.createdAt || null);
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
// Ignore edge errors (e.g. FK violation if parent missing from disk)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
syncEvents() {
|
|
84
|
+
const eventsPath = path.join(this.hardkasDir, "events.jsonl");
|
|
85
|
+
if (!fs.existsSync(eventsPath))
|
|
86
|
+
return;
|
|
87
|
+
const content = fs.readFileSync(eventsPath, "utf-8");
|
|
88
|
+
const lines = content.split("\n").filter(l => l.trim() !== "");
|
|
89
|
+
const stmt = this.db.prepare("SELECT COUNT(*) as count FROM events");
|
|
90
|
+
const result = stmt.get();
|
|
91
|
+
const existingCount = result.count;
|
|
92
|
+
if (lines.length <= existingCount)
|
|
93
|
+
return;
|
|
94
|
+
const newLines = lines.slice(existingCount);
|
|
95
|
+
const insertEvent = this.db.prepare(`
|
|
96
|
+
INSERT OR IGNORE INTO events
|
|
97
|
+
(event_id, kind, domain, timestamp, workflow_id, correlation_id, causation_id, tx_id, artifact_id, network_id, raw_json)
|
|
98
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
99
|
+
`);
|
|
100
|
+
for (const line of newLines) {
|
|
101
|
+
try {
|
|
102
|
+
const parsed = JSON.parse(line);
|
|
103
|
+
if (!validateEventEnvelope(parsed))
|
|
104
|
+
continue;
|
|
105
|
+
insertEvent.run(parsed.eventId, parsed.kind, parsed.domain, parsed.timestamp || null, parsed.workflowId, parsed.correlationId, parsed.causationId || null, parsed.txId || null, parsed.artifactId || null, parsed.networkId, line);
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
// Skip invalid line
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
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)
|
|
142
|
+
`);
|
|
143
|
+
upsertTrace.run();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const SCHEMA_VERSION = 2;
|
|
2
|
+
export declare const DDL = "\nCREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS artifacts (\n artifact_id TEXT PRIMARY KEY,\n content_hash TEXT NOT NULL,\n schema TEXT NOT NULL,\n version TEXT NOT NULL,\n kind TEXT NOT NULL,\n network_id TEXT NOT NULL,\n tx_id TEXT,\n created_at TEXT,\n raw_json TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_artifacts_content_hash ON artifacts(content_hash);\nCREATE INDEX IF NOT EXISTS idx_artifacts_schema ON artifacts(schema);\nCREATE INDEX IF NOT EXISTS idx_artifacts_kind ON artifacts(kind);\nCREATE INDEX IF NOT EXISTS idx_artifacts_network_id ON artifacts(network_id);\nCREATE INDEX IF NOT EXISTS idx_artifacts_tx_id ON artifacts(tx_id);\nCREATE INDEX IF NOT EXISTS idx_artifacts_created_at ON artifacts(created_at);\n\nCREATE TABLE IF NOT EXISTS lineage_edges (\n lineage_id TEXT NOT NULL,\n parent_artifact_id TEXT NOT NULL,\n child_artifact_id TEXT NOT NULL,\n edge_kind TEXT NOT NULL,\n created_at TEXT,\n PRIMARY KEY (parent_artifact_id, child_artifact_id),\n FOREIGN KEY (parent_artifact_id) REFERENCES artifacts(artifact_id),\n FOREIGN KEY (child_artifact_id) REFERENCES artifacts(artifact_id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_lineage_parent ON lineage_edges(parent_artifact_id);\nCREATE INDEX IF NOT EXISTS idx_lineage_child ON lineage_edges(child_artifact_id);\nCREATE INDEX IF NOT EXISTS idx_lineage_id ON lineage_edges(lineage_id);\n\nCREATE TABLE IF NOT EXISTS events (\n event_id TEXT PRIMARY KEY,\n kind TEXT NOT NULL,\n domain TEXT NOT NULL,\n timestamp TEXT,\n workflow_id TEXT NOT NULL,\n correlation_id TEXT NOT NULL,\n causation_id TEXT,\n tx_id TEXT,\n artifact_id TEXT,\n network_id TEXT NOT NULL,\n raw_json TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind);\nCREATE INDEX IF NOT EXISTS idx_events_domain ON events(domain);\nCREATE INDEX IF NOT EXISTS idx_events_workflow_id ON events(workflow_id);\nCREATE INDEX IF NOT EXISTS idx_events_correlation_id ON events(correlation_id);\nCREATE INDEX IF NOT EXISTS idx_events_causation_id ON events(causation_id);\nCREATE INDEX IF NOT EXISTS idx_events_tx_id ON events(tx_id);\nCREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);\nCREATE INDEX IF NOT EXISTS idx_events_network_id ON events(network_id);\nCREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n\nCREATE TABLE IF NOT EXISTS traces (\n trace_id TEXT PRIMARY KEY,\n workflow_id TEXT UNIQUE NOT NULL,\n root_event_id TEXT,\n status TEXT NOT NULL,\n started_at TEXT,\n ended_at TEXT,\n FOREIGN KEY (root_event_id) REFERENCES events(event_id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_traces_workflow_id ON traces(workflow_id);\nCREATE INDEX IF NOT EXISTS idx_traces_status ON traces(status);\n";
|
|
3
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,eAAO,MAAM,GAAG,iwFA4Ef,CAAC"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export const SCHEMA_VERSION = 2;
|
|
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
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_content_hash ON artifacts(content_hash);
|
|
21
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_schema ON artifacts(schema);
|
|
22
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_kind ON artifacts(kind);
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_network_id ON artifacts(network_id);
|
|
24
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_tx_id ON artifacts(tx_id);
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_created_at ON artifacts(created_at);
|
|
26
|
+
|
|
27
|
+
CREATE TABLE IF NOT EXISTS lineage_edges (
|
|
28
|
+
lineage_id TEXT NOT NULL,
|
|
29
|
+
parent_artifact_id TEXT NOT NULL,
|
|
30
|
+
child_artifact_id TEXT NOT NULL,
|
|
31
|
+
edge_kind TEXT NOT NULL,
|
|
32
|
+
created_at TEXT,
|
|
33
|
+
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)
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
CREATE INDEX IF NOT EXISTS idx_lineage_parent ON lineage_edges(parent_artifact_id);
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_lineage_child ON lineage_edges(child_artifact_id);
|
|
40
|
+
CREATE INDEX IF NOT EXISTS idx_lineage_id ON lineage_edges(lineage_id);
|
|
41
|
+
|
|
42
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
43
|
+
event_id TEXT PRIMARY KEY,
|
|
44
|
+
kind TEXT NOT NULL,
|
|
45
|
+
domain TEXT NOT NULL,
|
|
46
|
+
timestamp TEXT,
|
|
47
|
+
workflow_id TEXT NOT NULL,
|
|
48
|
+
correlation_id TEXT NOT NULL,
|
|
49
|
+
causation_id TEXT,
|
|
50
|
+
tx_id TEXT,
|
|
51
|
+
artifact_id TEXT,
|
|
52
|
+
network_id TEXT NOT NULL,
|
|
53
|
+
raw_json TEXT NOT NULL
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind);
|
|
57
|
+
CREATE INDEX IF NOT EXISTS idx_events_domain ON events(domain);
|
|
58
|
+
CREATE INDEX IF NOT EXISTS idx_events_workflow_id ON events(workflow_id);
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_events_correlation_id ON events(correlation_id);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_events_causation_id ON events(causation_id);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_events_tx_id ON events(tx_id);
|
|
62
|
+
CREATE INDEX IF NOT EXISTS idx_events_artifact_id ON events(artifact_id);
|
|
63
|
+
CREATE INDEX IF NOT EXISTS idx_events_network_id ON events(network_id);
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
|
|
65
|
+
|
|
66
|
+
CREATE TABLE IF NOT EXISTS traces (
|
|
67
|
+
trace_id TEXT PRIMARY KEY,
|
|
68
|
+
workflow_id TEXT UNIQUE NOT NULL,
|
|
69
|
+
root_event_id TEXT,
|
|
70
|
+
status TEXT NOT NULL,
|
|
71
|
+
started_at TEXT,
|
|
72
|
+
ended_at TEXT,
|
|
73
|
+
FOREIGN KEY (root_event_id) REFERENCES events(event_id)
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
CREATE INDEX IF NOT EXISTS idx_traces_workflow_id ON traces(workflow_id);
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_traces_status ON traces(status);
|
|
78
|
+
`;
|
|
79
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4ElB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hardkas/query-store",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@hardkas/artifacts": "0.1.0",
|
|
12
|
+
"@hardkas/core": "0.1.0"
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"tsup": "^8.3.5",
|
|
16
|
+
"tsx": "^4.19.2",
|
|
17
|
+
"typescript": "^5.7.2",
|
|
18
|
+
"vitest": "^2.1.8",
|
|
19
|
+
"@types/node": "^22.10.0"
|
|
20
|
+
},
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"author": "Javier Rodriguez",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "git+https://github.com/jrodrg92/Hardkas.git",
|
|
26
|
+
"directory": "packages/query-store"
|
|
27
|
+
},
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/jrodrg92/Hardkas/issues"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://github.com/jrodrg92/Hardkas/tree/main/packages/query-store#readme",
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"LICENSE",
|
|
35
|
+
"README.md"
|
|
36
|
+
],
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsc",
|
|
39
|
+
"test": "node --import tsx --test test/*.test.ts",
|
|
40
|
+
"typecheck": "tsc --noEmit",
|
|
41
|
+
"lint": "eslint ."
|
|
42
|
+
}
|
|
43
|
+
}
|