proofscan 0.1.0 → 0.2.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.
Files changed (71) hide show
  1. package/README.md +210 -60
  2. package/dist/cli.js +5 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/archive.d.ts +6 -0
  5. package/dist/commands/archive.d.ts.map +1 -0
  6. package/dist/commands/archive.js +245 -0
  7. package/dist/commands/archive.js.map +1 -0
  8. package/dist/commands/index.d.ts +2 -0
  9. package/dist/commands/index.d.ts.map +1 -1
  10. package/dist/commands/index.js +2 -0
  11. package/dist/commands/index.js.map +1 -1
  12. package/dist/commands/monitor.d.ts +1 -1
  13. package/dist/commands/monitor.d.ts.map +1 -1
  14. package/dist/commands/monitor.js +33 -21
  15. package/dist/commands/monitor.js.map +1 -1
  16. package/dist/commands/scan.d.ts.map +1 -1
  17. package/dist/commands/scan.js +4 -0
  18. package/dist/commands/scan.js.map +1 -1
  19. package/dist/commands/sessions.d.ts +6 -0
  20. package/dist/commands/sessions.d.ts.map +1 -0
  21. package/dist/commands/sessions.js +203 -0
  22. package/dist/commands/sessions.js.map +1 -0
  23. package/dist/db/connection.d.ts +28 -0
  24. package/dist/db/connection.d.ts.map +1 -0
  25. package/dist/db/connection.js +123 -0
  26. package/dist/db/connection.js.map +1 -0
  27. package/dist/db/events-store.d.ts +56 -0
  28. package/dist/db/events-store.d.ts.map +1 -0
  29. package/dist/db/events-store.js +269 -0
  30. package/dist/db/events-store.js.map +1 -0
  31. package/dist/db/index.d.ts +6 -0
  32. package/dist/db/index.d.ts.map +1 -0
  33. package/dist/db/index.js +6 -0
  34. package/dist/db/index.js.map +1 -0
  35. package/dist/db/proofs-store.d.ts +56 -0
  36. package/dist/db/proofs-store.d.ts.map +1 -0
  37. package/dist/db/proofs-store.js +116 -0
  38. package/dist/db/proofs-store.js.map +1 -0
  39. package/dist/db/schema.d.ts +8 -0
  40. package/dist/db/schema.d.ts.map +1 -0
  41. package/dist/db/schema.js +76 -0
  42. package/dist/db/schema.js.map +1 -0
  43. package/dist/db/types.d.ts +64 -0
  44. package/dist/db/types.d.ts.map +1 -0
  45. package/dist/db/types.js +5 -0
  46. package/dist/db/types.js.map +1 -0
  47. package/dist/index.d.ts +14 -6
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +15 -6
  50. package/dist/index.js.map +1 -1
  51. package/dist/scanner/index.d.ts +3 -2
  52. package/dist/scanner/index.d.ts.map +1 -1
  53. package/dist/scanner/index.js +66 -51
  54. package/dist/scanner/index.js.map +1 -1
  55. package/dist/types/config.d.ts +7 -0
  56. package/dist/types/config.d.ts.map +1 -1
  57. package/dist/types/config.js +5 -0
  58. package/dist/types/config.js.map +1 -1
  59. package/dist/types/events.d.ts +1 -17
  60. package/dist/types/events.d.ts.map +1 -1
  61. package/dist/types/events.js +1 -0
  62. package/dist/types/events.js.map +1 -1
  63. package/package.json +5 -2
  64. package/dist/events/index.d.ts +0 -2
  65. package/dist/events/index.d.ts.map +0 -1
  66. package/dist/events/index.js +0 -2
  67. package/dist/events/index.js.map +0 -1
  68. package/dist/events/store.d.ts +0 -25
  69. package/dist/events/store.d.ts.map +0 -1
  70. package/dist/events/store.js +0 -91
  71. package/dist/events/store.js.map +0 -1
@@ -0,0 +1,269 @@
1
+ /**
2
+ * Events database store - manages sessions, events, and rpc_calls
3
+ */
4
+ import { randomUUID } from 'crypto';
5
+ import { getEventsDb } from './connection.js';
6
+ export class EventsStore {
7
+ configDir;
8
+ constructor(configDir) {
9
+ this.configDir = configDir;
10
+ }
11
+ get db() {
12
+ return getEventsDb(this.configDir);
13
+ }
14
+ // ==================== Sessions ====================
15
+ createSession(connectorId) {
16
+ const session = {
17
+ session_id: randomUUID(),
18
+ connector_id: connectorId,
19
+ started_at: new Date().toISOString(),
20
+ ended_at: null,
21
+ exit_reason: null,
22
+ protected: 0,
23
+ created_at: new Date().toISOString(),
24
+ };
25
+ const stmt = this.db.prepare(`
26
+ INSERT INTO sessions (session_id, connector_id, started_at, ended_at, exit_reason, protected, created_at)
27
+ VALUES (?, ?, ?, ?, ?, ?, ?)
28
+ `);
29
+ stmt.run(session.session_id, session.connector_id, session.started_at, session.ended_at, session.exit_reason, session.protected, session.created_at);
30
+ return session;
31
+ }
32
+ endSession(sessionId, exitReason) {
33
+ const stmt = this.db.prepare(`
34
+ UPDATE sessions SET ended_at = ?, exit_reason = ? WHERE session_id = ?
35
+ `);
36
+ stmt.run(new Date().toISOString(), exitReason, sessionId);
37
+ }
38
+ getSession(sessionId) {
39
+ const stmt = this.db.prepare(`SELECT * FROM sessions WHERE session_id = ?`);
40
+ return stmt.get(sessionId);
41
+ }
42
+ getSessionsByConnector(connectorId, limit) {
43
+ let sql = `
44
+ SELECT s.*,
45
+ (SELECT COUNT(*) FROM events WHERE session_id = s.session_id) as event_count,
46
+ (SELECT COUNT(*) FROM rpc_calls WHERE session_id = s.session_id) as rpc_count
47
+ FROM sessions s
48
+ WHERE s.connector_id = ?
49
+ ORDER BY s.started_at DESC
50
+ `;
51
+ if (limit) {
52
+ sql += ` LIMIT ${limit}`;
53
+ }
54
+ const stmt = this.db.prepare(sql);
55
+ return stmt.all(connectorId);
56
+ }
57
+ getAllSessions(limit) {
58
+ let sql = `
59
+ SELECT s.*,
60
+ (SELECT COUNT(*) FROM events WHERE session_id = s.session_id) as event_count,
61
+ (SELECT COUNT(*) FROM rpc_calls WHERE session_id = s.session_id) as rpc_count
62
+ FROM sessions s
63
+ ORDER BY s.started_at DESC
64
+ `;
65
+ if (limit) {
66
+ sql += ` LIMIT ${limit}`;
67
+ }
68
+ const stmt = this.db.prepare(sql);
69
+ return stmt.all();
70
+ }
71
+ protectSession(sessionId) {
72
+ const stmt = this.db.prepare(`UPDATE sessions SET protected = 1 WHERE session_id = ?`);
73
+ stmt.run(sessionId);
74
+ }
75
+ // ==================== Events ====================
76
+ saveEvent(sessionId, direction, kind, options = {}) {
77
+ const event = {
78
+ event_id: randomUUID(),
79
+ session_id: sessionId,
80
+ rpc_id: options.rpcId || null,
81
+ direction,
82
+ kind,
83
+ ts: new Date().toISOString(),
84
+ raw_json: options.rawJson || null,
85
+ };
86
+ const stmt = this.db.prepare(`
87
+ INSERT INTO events (event_id, session_id, rpc_id, direction, kind, ts, raw_json)
88
+ VALUES (?, ?, ?, ?, ?, ?, ?)
89
+ `);
90
+ stmt.run(event.event_id, event.session_id, event.rpc_id, event.direction, event.kind, event.ts, event.raw_json);
91
+ return event;
92
+ }
93
+ getEventsBySession(sessionId, limit) {
94
+ let sql = `SELECT * FROM events WHERE session_id = ? ORDER BY ts ASC`;
95
+ if (limit) {
96
+ sql += ` LIMIT ${limit}`;
97
+ }
98
+ const stmt = this.db.prepare(sql);
99
+ return stmt.all(sessionId);
100
+ }
101
+ getRecentEventsByConnector(connectorId, limit = 20) {
102
+ const stmt = this.db.prepare(`
103
+ SELECT e.* FROM events e
104
+ JOIN sessions s ON e.session_id = s.session_id
105
+ WHERE s.connector_id = ?
106
+ ORDER BY e.ts DESC
107
+ LIMIT ?
108
+ `);
109
+ const events = stmt.all(connectorId, limit);
110
+ return events.reverse(); // Return in chronological order
111
+ }
112
+ // ==================== RPC Calls ====================
113
+ saveRpcCall(sessionId, rpcId, method) {
114
+ const rpcCall = {
115
+ rpc_id: rpcId,
116
+ session_id: sessionId,
117
+ method,
118
+ request_ts: new Date().toISOString(),
119
+ response_ts: null,
120
+ success: null,
121
+ error_code: null,
122
+ };
123
+ const stmt = this.db.prepare(`
124
+ INSERT INTO rpc_calls (rpc_id, session_id, method, request_ts, response_ts, success, error_code)
125
+ VALUES (?, ?, ?, ?, ?, ?, ?)
126
+ `);
127
+ stmt.run(rpcCall.rpc_id, rpcCall.session_id, rpcCall.method, rpcCall.request_ts, rpcCall.response_ts, rpcCall.success, rpcCall.error_code);
128
+ return rpcCall;
129
+ }
130
+ completeRpcCall(sessionId, rpcId, success, errorCode) {
131
+ const stmt = this.db.prepare(`
132
+ UPDATE rpc_calls
133
+ SET response_ts = ?, success = ?, error_code = ?
134
+ WHERE session_id = ? AND rpc_id = ?
135
+ `);
136
+ stmt.run(new Date().toISOString(), success ? 1 : 0, errorCode || null, sessionId, rpcId);
137
+ }
138
+ getRpcCallsBySession(sessionId) {
139
+ const stmt = this.db.prepare(`
140
+ SELECT * FROM rpc_calls WHERE session_id = ? ORDER BY request_ts ASC
141
+ `);
142
+ return stmt.all(sessionId);
143
+ }
144
+ // ==================== Prune / Archive ====================
145
+ /**
146
+ * Get sessions that can be pruned (not protected)
147
+ */
148
+ getPruneCandidates(options = {}) {
149
+ const { keepLast, before, connectorId } = options;
150
+ const candidates = [];
151
+ // Get all unprotected sessions
152
+ let sql = `
153
+ SELECT s.session_id, s.connector_id, s.started_at, s.protected,
154
+ (SELECT COUNT(*) FROM events WHERE session_id = s.session_id) as event_count
155
+ FROM sessions s
156
+ WHERE s.protected = 0
157
+ `;
158
+ const params = [];
159
+ if (connectorId) {
160
+ sql += ` AND s.connector_id = ?`;
161
+ params.push(connectorId);
162
+ }
163
+ if (before) {
164
+ sql += ` AND s.started_at < ?`;
165
+ params.push(before);
166
+ }
167
+ sql += ` ORDER BY s.started_at DESC`;
168
+ const stmt = this.db.prepare(sql);
169
+ const sessions = stmt.all(...params);
170
+ // Apply keepLast logic per connector
171
+ if (keepLast !== undefined) {
172
+ const byConnector = new Map();
173
+ for (const s of sessions) {
174
+ if (!byConnector.has(s.connector_id)) {
175
+ byConnector.set(s.connector_id, []);
176
+ }
177
+ byConnector.get(s.connector_id).push(s);
178
+ }
179
+ for (const [cid, connectorSessions] of byConnector) {
180
+ // Skip the first N (most recent) sessions
181
+ for (let i = keepLast; i < connectorSessions.length; i++) {
182
+ const s = connectorSessions[i];
183
+ candidates.push({
184
+ ...s,
185
+ reason: `Exceeds keep_last_sessions (${keepLast})`,
186
+ });
187
+ }
188
+ }
189
+ }
190
+ else {
191
+ // If no keepLast, all matched sessions are candidates
192
+ for (const s of sessions) {
193
+ candidates.push({
194
+ ...s,
195
+ reason: before ? `Before ${before}` : 'Manual selection',
196
+ });
197
+ }
198
+ }
199
+ return candidates;
200
+ }
201
+ /**
202
+ * Delete sessions and all related data
203
+ */
204
+ deleteSessions(sessionIds) {
205
+ if (sessionIds.length === 0)
206
+ return 0;
207
+ const transaction = this.db.transaction((ids) => {
208
+ // With CASCADE, deleting sessions will delete events and rpc_calls
209
+ const placeholders = ids.map(() => '?').join(',');
210
+ const stmt = this.db.prepare(`DELETE FROM sessions WHERE session_id IN (${placeholders}) AND protected = 0`);
211
+ const result = stmt.run(...ids);
212
+ return result.changes;
213
+ });
214
+ return transaction(sessionIds);
215
+ }
216
+ /**
217
+ * Clear raw_json from old events (keep metadata)
218
+ */
219
+ clearRawJson(options) {
220
+ let sql = `UPDATE events SET raw_json = NULL WHERE raw_json IS NOT NULL`;
221
+ const params = [];
222
+ if (options.beforeDays !== undefined) {
223
+ const cutoff = new Date();
224
+ cutoff.setDate(cutoff.getDate() - options.beforeDays);
225
+ sql += ` AND ts < ?`;
226
+ params.push(cutoff.toISOString());
227
+ }
228
+ if (options.sessionIds && options.sessionIds.length > 0) {
229
+ const placeholders = options.sessionIds.map(() => '?').join(',');
230
+ sql += ` AND session_id IN (${placeholders})`;
231
+ params.push(...options.sessionIds);
232
+ }
233
+ // Exclude protected sessions
234
+ sql += ` AND session_id NOT IN (SELECT session_id FROM sessions WHERE protected = 1)`;
235
+ const stmt = this.db.prepare(sql);
236
+ const result = stmt.run(...params);
237
+ return result.changes;
238
+ }
239
+ /**
240
+ * Get count of events with raw_json that can be cleared
241
+ */
242
+ countClearableRawJson(beforeDays) {
243
+ const cutoff = new Date();
244
+ cutoff.setDate(cutoff.getDate() - beforeDays);
245
+ const stmt = this.db.prepare(`
246
+ SELECT COUNT(*) as count FROM events
247
+ WHERE raw_json IS NOT NULL
248
+ AND ts < ?
249
+ AND session_id NOT IN (SELECT session_id FROM sessions WHERE protected = 1)
250
+ `);
251
+ const result = stmt.get(cutoff.toISOString());
252
+ return result.count;
253
+ }
254
+ /**
255
+ * Get total size of raw_json data
256
+ */
257
+ getRawJsonSize() {
258
+ const stmt = this.db.prepare(`SELECT SUM(LENGTH(raw_json)) as size FROM events WHERE raw_json IS NOT NULL`);
259
+ const result = stmt.get();
260
+ return result.size || 0;
261
+ }
262
+ /**
263
+ * Vacuum database to reclaim space
264
+ */
265
+ vacuum() {
266
+ this.db.exec('VACUUM');
267
+ }
268
+ }
269
+ //# sourceMappingURL=events-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-store.js","sourceRoot":"","sources":["../../src/db/events-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './types.js';
2
+ export * from './schema.js';
3
+ export * from './connection.js';
4
+ export * from './events-store.js';
5
+ export * from './proofs-store.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './types.js';
2
+ export * from './schema.js';
3
+ export * from './connection.js';
4
+ export * from './events-store.js';
5
+ export * from './proofs-store.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Proofs database store - manages immutable proof records
3
+ */
4
+ import type { Proof } from './types.js';
5
+ export declare class ProofsStore {
6
+ private configDir?;
7
+ constructor(configDir?: string);
8
+ private get db();
9
+ /**
10
+ * Create a new proof record
11
+ */
12
+ createProof(params: {
13
+ connectorId: string;
14
+ sessionId?: string;
15
+ rpcId?: string;
16
+ method?: string;
17
+ payload: string | Buffer;
18
+ hashAlgo?: string;
19
+ inscriberType: string;
20
+ inscriberRef: string;
21
+ artifactUri?: string;
22
+ }): Proof;
23
+ /**
24
+ * Get proof by ID
25
+ */
26
+ getProof(proofId: string): Proof | null;
27
+ /**
28
+ * Get proofs by connector
29
+ */
30
+ getProofsByConnector(connectorId: string, limit?: number): Proof[];
31
+ /**
32
+ * Get proofs by session
33
+ */
34
+ getProofsBySession(sessionId: string): Proof[];
35
+ /**
36
+ * Get all proofs
37
+ */
38
+ getAllProofs(limit?: number): Proof[];
39
+ /**
40
+ * Check if a session has associated proofs
41
+ */
42
+ hasProofsForSession(sessionId: string): boolean;
43
+ /**
44
+ * Get all session IDs that have proofs
45
+ */
46
+ getProtectedSessionIds(): string[];
47
+ /**
48
+ * Count total proofs
49
+ */
50
+ countProofs(): number;
51
+ /**
52
+ * Update artifact URI (e.g., after IPFS upload)
53
+ */
54
+ updateArtifactUri(proofId: string, artifactUri: string): void;
55
+ }
56
+ //# sourceMappingURL=proofs-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proofs-store.d.ts","sourceRoot":"","sources":["../../src/db/proofs-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,SAAS,CAAC,EAAE,MAAM;IAI9B,OAAO,KAAK,EAAE,GAEb;IAED;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,KAAK;IA6CT;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAKvC;;OAEG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE;IASlE;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE;IAO9C;;OAEG;IACH,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE;IASrC;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAM/C;;OAEG;IACH,sBAAsB,IAAI,MAAM,EAAE;IAMlC;;OAEG;IACH,WAAW,IAAI,MAAM;IAMrB;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;CAI9D"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Proofs database store - manages immutable proof records
3
+ */
4
+ import { randomUUID } from 'crypto';
5
+ import { createHash } from 'crypto';
6
+ import { getProofsDb } from './connection.js';
7
+ export class ProofsStore {
8
+ configDir;
9
+ constructor(configDir) {
10
+ this.configDir = configDir;
11
+ }
12
+ get db() {
13
+ return getProofsDb(this.configDir);
14
+ }
15
+ /**
16
+ * Create a new proof record
17
+ */
18
+ createProof(params) {
19
+ const hashAlgo = params.hashAlgo || 'sha256';
20
+ const payloadHash = createHash(hashAlgo)
21
+ .update(typeof params.payload === 'string' ? params.payload : params.payload)
22
+ .digest('hex');
23
+ const proof = {
24
+ proof_id: randomUUID(),
25
+ connector_id: params.connectorId,
26
+ session_id: params.sessionId || null,
27
+ rpc_id: params.rpcId || null,
28
+ method: params.method || null,
29
+ payload_hash: payloadHash,
30
+ hash_algo: hashAlgo,
31
+ inscriber_type: params.inscriberType,
32
+ inscriber_ref: params.inscriberRef,
33
+ artifact_uri: params.artifactUri || null,
34
+ created_at: new Date().toISOString(),
35
+ };
36
+ const stmt = this.db.prepare(`
37
+ INSERT INTO proofs (
38
+ proof_id, connector_id, session_id, rpc_id, method,
39
+ payload_hash, hash_algo, inscriber_type, inscriber_ref,
40
+ artifact_uri, created_at
41
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
42
+ `);
43
+ stmt.run(proof.proof_id, proof.connector_id, proof.session_id, proof.rpc_id, proof.method, proof.payload_hash, proof.hash_algo, proof.inscriber_type, proof.inscriber_ref, proof.artifact_uri, proof.created_at);
44
+ return proof;
45
+ }
46
+ /**
47
+ * Get proof by ID
48
+ */
49
+ getProof(proofId) {
50
+ const stmt = this.db.prepare(`SELECT * FROM proofs WHERE proof_id = ?`);
51
+ return stmt.get(proofId);
52
+ }
53
+ /**
54
+ * Get proofs by connector
55
+ */
56
+ getProofsByConnector(connectorId, limit) {
57
+ let sql = `SELECT * FROM proofs WHERE connector_id = ? ORDER BY created_at DESC`;
58
+ if (limit) {
59
+ sql += ` LIMIT ${limit}`;
60
+ }
61
+ const stmt = this.db.prepare(sql);
62
+ return stmt.all(connectorId);
63
+ }
64
+ /**
65
+ * Get proofs by session
66
+ */
67
+ getProofsBySession(sessionId) {
68
+ const stmt = this.db.prepare(`
69
+ SELECT * FROM proofs WHERE session_id = ? ORDER BY created_at ASC
70
+ `);
71
+ return stmt.all(sessionId);
72
+ }
73
+ /**
74
+ * Get all proofs
75
+ */
76
+ getAllProofs(limit) {
77
+ let sql = `SELECT * FROM proofs ORDER BY created_at DESC`;
78
+ if (limit) {
79
+ sql += ` LIMIT ${limit}`;
80
+ }
81
+ const stmt = this.db.prepare(sql);
82
+ return stmt.all();
83
+ }
84
+ /**
85
+ * Check if a session has associated proofs
86
+ */
87
+ hasProofsForSession(sessionId) {
88
+ const stmt = this.db.prepare(`SELECT COUNT(*) as count FROM proofs WHERE session_id = ?`);
89
+ const result = stmt.get(sessionId);
90
+ return result.count > 0;
91
+ }
92
+ /**
93
+ * Get all session IDs that have proofs
94
+ */
95
+ getProtectedSessionIds() {
96
+ const stmt = this.db.prepare(`SELECT DISTINCT session_id FROM proofs WHERE session_id IS NOT NULL`);
97
+ const results = stmt.all();
98
+ return results.map(r => r.session_id);
99
+ }
100
+ /**
101
+ * Count total proofs
102
+ */
103
+ countProofs() {
104
+ const stmt = this.db.prepare(`SELECT COUNT(*) as count FROM proofs`);
105
+ const result = stmt.get();
106
+ return result.count;
107
+ }
108
+ /**
109
+ * Update artifact URI (e.g., after IPFS upload)
110
+ */
111
+ updateArtifactUri(proofId, artifactUri) {
112
+ const stmt = this.db.prepare(`UPDATE proofs SET artifact_uri = ? WHERE proof_id = ?`);
113
+ stmt.run(artifactUri, proofId);
114
+ }
115
+ }
116
+ //# sourceMappingURL=proofs-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proofs-store.js","sourceRoot":"","sources":["../../src/db/proofs-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Database schema definitions and migrations
3
+ */
4
+ export declare const EVENTS_DB_VERSION = 1;
5
+ export declare const PROOFS_DB_VERSION = 1;
6
+ export declare const EVENTS_DB_SCHEMA = "\n-- Sessions table\nCREATE TABLE IF NOT EXISTS sessions (\n session_id TEXT PRIMARY KEY,\n connector_id TEXT NOT NULL,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n exit_reason TEXT CHECK(exit_reason IN ('normal', 'error', 'killed')),\n protected INTEGER DEFAULT 0,\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_sessions_connector ON sessions(connector_id);\nCREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at);\nCREATE INDEX IF NOT EXISTS idx_sessions_protected ON sessions(protected);\n\n-- RPC calls table\nCREATE TABLE IF NOT EXISTS rpc_calls (\n rpc_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n method TEXT NOT NULL,\n request_ts TEXT NOT NULL,\n response_ts TEXT,\n success INTEGER,\n error_code INTEGER,\n PRIMARY KEY (rpc_id, session_id),\n FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_rpc_calls_session ON rpc_calls(session_id);\nCREATE INDEX IF NOT EXISTS idx_rpc_calls_method ON rpc_calls(method);\n\n-- Events table\nCREATE TABLE IF NOT EXISTS events (\n event_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n rpc_id TEXT,\n direction TEXT NOT NULL CHECK(direction IN ('client_to_server', 'server_to_client')),\n kind TEXT NOT NULL CHECK(kind IN ('request', 'response', 'notification', 'transport_event')),\n ts TEXT NOT NULL,\n raw_json TEXT,\n FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);\nCREATE INDEX IF NOT EXISTS idx_events_ts ON events(ts);\nCREATE INDEX IF NOT EXISTS idx_events_rpc ON events(rpc_id);\n";
7
+ export declare const PROOFS_DB_SCHEMA = "\n-- Proofs table (immutable, never pruned)\nCREATE TABLE IF NOT EXISTS proofs (\n proof_id TEXT PRIMARY KEY,\n connector_id TEXT NOT NULL,\n session_id TEXT,\n rpc_id TEXT,\n method TEXT,\n payload_hash TEXT NOT NULL,\n hash_algo TEXT NOT NULL,\n inscriber_type TEXT NOT NULL,\n inscriber_ref TEXT NOT NULL,\n artifact_uri TEXT,\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_proofs_connector ON proofs(connector_id);\nCREATE INDEX IF NOT EXISTS idx_proofs_session ON proofs(session_id);\nCREATE INDEX IF NOT EXISTS idx_proofs_created ON proofs(created_at);\n";
8
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAGnC,eAAO,MAAM,gBAAgB,woDA+C5B,CAAC;AAGF,eAAO,MAAM,gBAAgB,klBAmB5B,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Database schema definitions and migrations
3
+ */
4
+ export const EVENTS_DB_VERSION = 1;
5
+ export const PROOFS_DB_VERSION = 1;
6
+ // events.db schema
7
+ export const EVENTS_DB_SCHEMA = `
8
+ -- Sessions table
9
+ CREATE TABLE IF NOT EXISTS sessions (
10
+ session_id TEXT PRIMARY KEY,
11
+ connector_id TEXT NOT NULL,
12
+ started_at TEXT NOT NULL,
13
+ ended_at TEXT,
14
+ exit_reason TEXT CHECK(exit_reason IN ('normal', 'error', 'killed')),
15
+ protected INTEGER DEFAULT 0,
16
+ created_at TEXT NOT NULL
17
+ );
18
+
19
+ CREATE INDEX IF NOT EXISTS idx_sessions_connector ON sessions(connector_id);
20
+ CREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at);
21
+ CREATE INDEX IF NOT EXISTS idx_sessions_protected ON sessions(protected);
22
+
23
+ -- RPC calls table
24
+ CREATE TABLE IF NOT EXISTS rpc_calls (
25
+ rpc_id TEXT NOT NULL,
26
+ session_id TEXT NOT NULL,
27
+ method TEXT NOT NULL,
28
+ request_ts TEXT NOT NULL,
29
+ response_ts TEXT,
30
+ success INTEGER,
31
+ error_code INTEGER,
32
+ PRIMARY KEY (rpc_id, session_id),
33
+ FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE CASCADE
34
+ );
35
+
36
+ CREATE INDEX IF NOT EXISTS idx_rpc_calls_session ON rpc_calls(session_id);
37
+ CREATE INDEX IF NOT EXISTS idx_rpc_calls_method ON rpc_calls(method);
38
+
39
+ -- Events table
40
+ CREATE TABLE IF NOT EXISTS events (
41
+ event_id TEXT PRIMARY KEY,
42
+ session_id TEXT NOT NULL,
43
+ rpc_id TEXT,
44
+ direction TEXT NOT NULL CHECK(direction IN ('client_to_server', 'server_to_client')),
45
+ kind TEXT NOT NULL CHECK(kind IN ('request', 'response', 'notification', 'transport_event')),
46
+ ts TEXT NOT NULL,
47
+ raw_json TEXT,
48
+ FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE CASCADE
49
+ );
50
+
51
+ CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);
52
+ CREATE INDEX IF NOT EXISTS idx_events_ts ON events(ts);
53
+ CREATE INDEX IF NOT EXISTS idx_events_rpc ON events(rpc_id);
54
+ `;
55
+ // proofs.db schema
56
+ export const PROOFS_DB_SCHEMA = `
57
+ -- Proofs table (immutable, never pruned)
58
+ CREATE TABLE IF NOT EXISTS proofs (
59
+ proof_id TEXT PRIMARY KEY,
60
+ connector_id TEXT NOT NULL,
61
+ session_id TEXT,
62
+ rpc_id TEXT,
63
+ method TEXT,
64
+ payload_hash TEXT NOT NULL,
65
+ hash_algo TEXT NOT NULL,
66
+ inscriber_type TEXT NOT NULL,
67
+ inscriber_ref TEXT NOT NULL,
68
+ artifact_uri TEXT,
69
+ created_at TEXT NOT NULL
70
+ );
71
+
72
+ CREATE INDEX IF NOT EXISTS idx_proofs_connector ON proofs(connector_id);
73
+ CREATE INDEX IF NOT EXISTS idx_proofs_session ON proofs(session_id);
74
+ CREATE INDEX IF NOT EXISTS idx_proofs_created ON proofs(created_at);
75
+ `;
76
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,mBAAmB;AACnB,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+C/B,CAAC;AAEF,mBAAmB;AACnB,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;CAmB/B,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Database types for Phase2
3
+ */
4
+ export type ExitReason = 'normal' | 'error' | 'killed';
5
+ export type EventDirection = 'client_to_server' | 'server_to_client';
6
+ export type EventKind = 'request' | 'response' | 'notification' | 'transport_event';
7
+ export interface Session {
8
+ session_id: string;
9
+ connector_id: string;
10
+ started_at: string;
11
+ ended_at: string | null;
12
+ exit_reason: ExitReason | null;
13
+ protected: number;
14
+ created_at: string;
15
+ }
16
+ export interface RpcCall {
17
+ rpc_id: string;
18
+ session_id: string;
19
+ method: string;
20
+ request_ts: string;
21
+ response_ts: string | null;
22
+ success: number | null;
23
+ error_code: number | null;
24
+ }
25
+ export interface Event {
26
+ event_id: string;
27
+ session_id: string;
28
+ rpc_id: string | null;
29
+ direction: EventDirection;
30
+ kind: EventKind;
31
+ ts: string;
32
+ raw_json: string | null;
33
+ }
34
+ export interface Proof {
35
+ proof_id: string;
36
+ connector_id: string;
37
+ session_id: string | null;
38
+ rpc_id: string | null;
39
+ method: string | null;
40
+ payload_hash: string;
41
+ hash_algo: string;
42
+ inscriber_type: string;
43
+ inscriber_ref: string;
44
+ artifact_uri: string | null;
45
+ created_at: string;
46
+ }
47
+ export interface SessionWithStats extends Session {
48
+ event_count?: number;
49
+ rpc_count?: number;
50
+ }
51
+ export interface PruneCandidate {
52
+ session_id: string;
53
+ connector_id: string;
54
+ started_at: string;
55
+ event_count: number;
56
+ protected: number;
57
+ reason: string;
58
+ }
59
+ export interface ArchivePlan {
60
+ sessions_to_delete: PruneCandidate[];
61
+ raw_json_to_clear: number;
62
+ estimated_savings_mb: number;
63
+ }
64
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAGvD,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AACrE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,iBAAiB,CAAC;AAGpF,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAGD,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,cAAc,CAAC;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAGD,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,gBAAiB,SAAQ,OAAO;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,kBAAkB,EAAE,cAAc,EAAE,CAAC;IACrC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;CAC9B"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Database types for Phase2
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}