@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 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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"}
@@ -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
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,OAAO,YAAY;IACf,EAAE,GAAwB,IAAI,CAAC;IACtB,MAAM,CAAS;IAEhC,YAAY,UAAiD,EAAE;QAC7D,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAEM,OAAO;QACZ,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO;QAEpB,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,EAAE,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEM,UAAU;QACf,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAEM,WAAW;QAChB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QAErB,yCAAyC;QACzC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC7C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAE1C,eAAe;QACf,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAElB,gBAAgB;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC;QACjF,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAmC,CAAC;YACxD,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,mCAAmC;QACrC,CAAC;QAED,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;YAC1F,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,qCAAqC,cAAc,SAAS,OAAO,0CAA0C,CAAC,CAAC;YAE5H,iDAAiD;YACjD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC3C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAChD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACpD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC7C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC7C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC/C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAE1C,gBAAgB;YAChB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;YAC1F,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export * from "./schema.js";
2
+ export * from "./db.js";
3
+ export * from "./indexer.js";
4
+ export * from "./backend.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,5 @@
1
+ export * from "./schema.js";
2
+ export * from "./db.js";
3
+ export * from "./indexer.js";
4
+ export * from "./backend.js";
5
+ //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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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"}
@@ -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
+ }