proofscan 0.2.0 → 0.3.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/README.md +205 -281
- package/dist/cli.d.ts +15 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +129 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/explore.d.ts +9 -0
- package/dist/commands/explore.d.ts.map +1 -0
- package/dist/commands/explore.js +345 -0
- package/dist/commands/explore.js.map +1 -0
- package/dist/commands/index.d.ts +4 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +6 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +108 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/tree.d.ts +7 -0
- package/dist/commands/tree.d.ts.map +1 -0
- package/dist/commands/tree.js +184 -0
- package/dist/commands/tree.js.map +1 -0
- package/dist/commands/view.d.ts +9 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +143 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/eventline/index.d.ts +8 -0
- package/dist/eventline/index.d.ts.map +1 -0
- package/dist/eventline/index.js +8 -0
- package/dist/eventline/index.js.map +1 -0
- package/dist/eventline/normalizer.d.ts +61 -0
- package/dist/eventline/normalizer.d.ts.map +1 -0
- package/dist/eventline/normalizer.js +298 -0
- package/dist/eventline/normalizer.js.map +1 -0
- package/dist/eventline/schema-discovery.d.ts +79 -0
- package/dist/eventline/schema-discovery.d.ts.map +1 -0
- package/dist/eventline/schema-discovery.js +154 -0
- package/dist/eventline/schema-discovery.js.map +1 -0
- package/dist/eventline/store.d.ts +88 -0
- package/dist/eventline/store.d.ts.map +1 -0
- package/dist/eventline/store.js +358 -0
- package/dist/eventline/store.js.map +1 -0
- package/dist/eventline/types.d.ts +88 -0
- package/dist/eventline/types.d.ts.map +1 -0
- package/dist/eventline/types.js +67 -0
- package/dist/eventline/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventLine Normalizer - converts raw DB events to normalized EventLine format
|
|
3
|
+
*
|
|
4
|
+
* This layer absorbs schema differences and provides a consistent interface
|
|
5
|
+
* for view/tree/explore commands.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Parse ISO8601 timestamp to epoch milliseconds
|
|
9
|
+
*/
|
|
10
|
+
export function parseTimestamp(ts) {
|
|
11
|
+
if (ts === null || ts === undefined)
|
|
12
|
+
return 0;
|
|
13
|
+
// Already milliseconds
|
|
14
|
+
if (typeof ts === 'number') {
|
|
15
|
+
// If it looks like seconds (< year 2100 as ms would be ~4e12)
|
|
16
|
+
if (ts < 4e12 && ts > 1e9) {
|
|
17
|
+
return ts * 1000;
|
|
18
|
+
}
|
|
19
|
+
return ts;
|
|
20
|
+
}
|
|
21
|
+
// ISO8601 string
|
|
22
|
+
const date = new Date(ts);
|
|
23
|
+
return isNaN(date.getTime()) ? 0 : date.getTime();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Map old direction format to new → / ← format
|
|
27
|
+
*/
|
|
28
|
+
export function normalizeDirection(direction, kind) {
|
|
29
|
+
if (!direction) {
|
|
30
|
+
// Infer from kind if possible
|
|
31
|
+
if (kind === 'request')
|
|
32
|
+
return '→';
|
|
33
|
+
if (kind === 'response')
|
|
34
|
+
return '←';
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
// Map known formats
|
|
38
|
+
const dir = direction.toLowerCase();
|
|
39
|
+
if (dir === 'client_to_server' || dir === 'outbound' || dir === 'out' || dir === 'send') {
|
|
40
|
+
return '→';
|
|
41
|
+
}
|
|
42
|
+
if (dir === 'server_to_client' || dir === 'inbound' || dir === 'in' || dir === 'receive') {
|
|
43
|
+
return '←';
|
|
44
|
+
}
|
|
45
|
+
if (dir === '→' || dir === '->')
|
|
46
|
+
return '→';
|
|
47
|
+
if (dir === '←' || dir === '<-')
|
|
48
|
+
return '←';
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Map old kind format to new 6-type format
|
|
53
|
+
*/
|
|
54
|
+
export function normalizeKind(kind) {
|
|
55
|
+
if (!kind)
|
|
56
|
+
return 'notify';
|
|
57
|
+
const k = kind.toLowerCase();
|
|
58
|
+
if (k === 'request' || k === 'req')
|
|
59
|
+
return 'req';
|
|
60
|
+
if (k === 'response' || k === 'res')
|
|
61
|
+
return 'res';
|
|
62
|
+
if (k === 'notification' || k === 'notify')
|
|
63
|
+
return 'notify';
|
|
64
|
+
if (k === 'error' || k === 'err')
|
|
65
|
+
return 'error';
|
|
66
|
+
if (k === 'session_start' || k === 'transport_event' && k.includes('connect'))
|
|
67
|
+
return 'session_start';
|
|
68
|
+
if (k === 'session_end')
|
|
69
|
+
return 'session_end';
|
|
70
|
+
// transport_event → treat as notify
|
|
71
|
+
if (k === 'transport_event')
|
|
72
|
+
return 'notify';
|
|
73
|
+
return 'notify';
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Extract method/label from raw JSON or columns
|
|
77
|
+
*/
|
|
78
|
+
export function extractLabel(rawJson, method, kind, dbKind) {
|
|
79
|
+
// Use explicit method if available
|
|
80
|
+
if (method)
|
|
81
|
+
return method;
|
|
82
|
+
// Try to extract from raw JSON
|
|
83
|
+
if (rawJson) {
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(rawJson);
|
|
86
|
+
if (parsed.method)
|
|
87
|
+
return parsed.method;
|
|
88
|
+
// For responses, label as "response" if no method
|
|
89
|
+
if (parsed.result !== undefined || parsed.error !== undefined) {
|
|
90
|
+
return 'response';
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Ignore parse errors
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Fallback labels
|
|
98
|
+
if (kind === 'session_start')
|
|
99
|
+
return 'session start';
|
|
100
|
+
if (kind === 'session_end')
|
|
101
|
+
return 'session end';
|
|
102
|
+
// Transport events
|
|
103
|
+
if (dbKind === 'transport_event') {
|
|
104
|
+
return '[transport]';
|
|
105
|
+
}
|
|
106
|
+
// For notify without method, show kind
|
|
107
|
+
if (kind === 'notify')
|
|
108
|
+
return '[notification]';
|
|
109
|
+
if (kind === 'req')
|
|
110
|
+
return '[request]';
|
|
111
|
+
if (kind === 'res')
|
|
112
|
+
return '[response]';
|
|
113
|
+
if (kind === 'error')
|
|
114
|
+
return '[error]';
|
|
115
|
+
return '(unknown)';
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Extract RPC ID from raw JSON or column
|
|
119
|
+
*/
|
|
120
|
+
export function extractRpcId(rawJson, rpcId) {
|
|
121
|
+
// Use explicit rpc_id if available
|
|
122
|
+
if (rpcId !== null && rpcId !== undefined)
|
|
123
|
+
return rpcId;
|
|
124
|
+
// Try to extract from raw JSON
|
|
125
|
+
if (rawJson) {
|
|
126
|
+
try {
|
|
127
|
+
const parsed = JSON.parse(rawJson);
|
|
128
|
+
if (parsed.id !== undefined)
|
|
129
|
+
return parsed.id;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Ignore parse errors
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Determine status from various sources
|
|
139
|
+
*/
|
|
140
|
+
export function determineStatus(rawJson, success, kind) {
|
|
141
|
+
// Explicit success column
|
|
142
|
+
if (success === 1)
|
|
143
|
+
return 'OK';
|
|
144
|
+
if (success === 0)
|
|
145
|
+
return 'ERR';
|
|
146
|
+
// Check raw JSON for error
|
|
147
|
+
if (rawJson) {
|
|
148
|
+
try {
|
|
149
|
+
const parsed = JSON.parse(rawJson);
|
|
150
|
+
if (parsed.error)
|
|
151
|
+
return 'ERR';
|
|
152
|
+
if (parsed.result !== undefined)
|
|
153
|
+
return 'OK';
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Ignore parse errors
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Default based on kind
|
|
160
|
+
if (kind === 'error')
|
|
161
|
+
return 'ERR';
|
|
162
|
+
if (kind === 'res')
|
|
163
|
+
return 'OK';
|
|
164
|
+
if (kind === 'req')
|
|
165
|
+
return 'OK';
|
|
166
|
+
return '-';
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Extract error code from raw JSON or column
|
|
170
|
+
*/
|
|
171
|
+
export function extractErrorCode(rawJson, errorCode) {
|
|
172
|
+
// Use explicit error_code if available
|
|
173
|
+
if (errorCode !== null && errorCode !== undefined)
|
|
174
|
+
return errorCode;
|
|
175
|
+
// Try to extract from raw JSON
|
|
176
|
+
if (rawJson) {
|
|
177
|
+
try {
|
|
178
|
+
const parsed = JSON.parse(rawJson);
|
|
179
|
+
if (parsed.error?.code)
|
|
180
|
+
return parsed.error.code;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Ignore parse errors
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Calculate size in bytes
|
|
190
|
+
*/
|
|
191
|
+
export function calculateSize(rawJson) {
|
|
192
|
+
if (!rawJson)
|
|
193
|
+
return undefined;
|
|
194
|
+
return new TextEncoder().encode(rawJson).length;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Normalize a single raw Event to EventLine
|
|
198
|
+
*/
|
|
199
|
+
export function normalizeEvent(event, session, rpcCall) {
|
|
200
|
+
const kind = normalizeKind(event.kind);
|
|
201
|
+
const direction = normalizeDirection(event.direction, event.kind);
|
|
202
|
+
const label = extractLabel(event.raw_json, rpcCall?.method, kind, event.kind);
|
|
203
|
+
const rpcId = extractRpcId(event.raw_json, event.rpc_id);
|
|
204
|
+
const status = determineStatus(event.raw_json, rpcCall?.success, kind);
|
|
205
|
+
const errorCode = extractErrorCode(event.raw_json, rpcCall?.error_code);
|
|
206
|
+
const sizeBytes = calculateSize(event.raw_json);
|
|
207
|
+
// Calculate latency from RPC call if available
|
|
208
|
+
let latencyMs;
|
|
209
|
+
if (rpcCall && rpcCall.request_ts && rpcCall.response_ts && kind === 'res') {
|
|
210
|
+
const reqTs = parseTimestamp(rpcCall.request_ts);
|
|
211
|
+
const resTs = parseTimestamp(rpcCall.response_ts);
|
|
212
|
+
if (reqTs && resTs) {
|
|
213
|
+
latencyMs = resTs - reqTs;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const eventLine = {
|
|
217
|
+
ts_ms: parseTimestamp(event.ts),
|
|
218
|
+
kind,
|
|
219
|
+
direction,
|
|
220
|
+
label,
|
|
221
|
+
connector_id: session?.connector_id,
|
|
222
|
+
session_id: event.session_id,
|
|
223
|
+
rpc_id: rpcId,
|
|
224
|
+
status,
|
|
225
|
+
error_code: errorCode,
|
|
226
|
+
latency_ms: latencyMs,
|
|
227
|
+
size_bytes: sizeBytes,
|
|
228
|
+
raw_json: event.raw_json || undefined,
|
|
229
|
+
};
|
|
230
|
+
return eventLine;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Create session_start EventLine from Session
|
|
234
|
+
*/
|
|
235
|
+
export function createSessionStartEvent(session) {
|
|
236
|
+
return {
|
|
237
|
+
ts_ms: parseTimestamp(session.started_at),
|
|
238
|
+
kind: 'session_start',
|
|
239
|
+
direction: undefined,
|
|
240
|
+
label: 'session start',
|
|
241
|
+
connector_id: session.connector_id,
|
|
242
|
+
session_id: session.session_id,
|
|
243
|
+
status: '-',
|
|
244
|
+
meta: {
|
|
245
|
+
connector: session.connector_id,
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Create session_end EventLine from Session
|
|
251
|
+
*/
|
|
252
|
+
export function createSessionEndEvent(session, stats) {
|
|
253
|
+
if (!session.ended_at) {
|
|
254
|
+
// Session still running
|
|
255
|
+
return {
|
|
256
|
+
ts_ms: Date.now(),
|
|
257
|
+
kind: 'session_end',
|
|
258
|
+
direction: undefined,
|
|
259
|
+
label: 'session running',
|
|
260
|
+
connector_id: session.connector_id,
|
|
261
|
+
session_id: session.session_id,
|
|
262
|
+
status: '-',
|
|
263
|
+
meta: { running: true },
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const startMs = parseTimestamp(session.started_at);
|
|
267
|
+
const endMs = parseTimestamp(session.ended_at);
|
|
268
|
+
const durationMs = endMs - startMs;
|
|
269
|
+
const status = session.exit_reason === 'normal' ? 'OK' : 'ERR';
|
|
270
|
+
return {
|
|
271
|
+
ts_ms: endMs,
|
|
272
|
+
kind: 'session_end',
|
|
273
|
+
direction: undefined,
|
|
274
|
+
label: 'session end',
|
|
275
|
+
connector_id: session.connector_id,
|
|
276
|
+
session_id: session.session_id,
|
|
277
|
+
status,
|
|
278
|
+
latency_ms: durationMs, // Reuse latency_ms for session duration
|
|
279
|
+
meta: {
|
|
280
|
+
exit_reason: session.exit_reason,
|
|
281
|
+
rpc_count: stats?.rpc_count || session.rpc_count,
|
|
282
|
+
event_count: stats?.event_count || session.event_count,
|
|
283
|
+
error_count: stats?.error_count,
|
|
284
|
+
duration_ms: durationMs,
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Normalize a batch of events with related data
|
|
290
|
+
*/
|
|
291
|
+
export function normalizeEvents(events, sessions, rpcCalls) {
|
|
292
|
+
return events.map(event => {
|
|
293
|
+
const session = sessions.get(event.session_id);
|
|
294
|
+
const rpcCall = event.rpc_id ? rpcCalls.get(`${event.session_id}:${event.rpc_id}`) : undefined;
|
|
295
|
+
return normalizeEvent(event, session, rpcCall);
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=normalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizer.js","sourceRoot":"","sources":["../../src/eventline/normalizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database schema discovery - auto-detect table structure
|
|
3
|
+
*
|
|
4
|
+
* This allows the EventLine normalization to work even if the schema
|
|
5
|
+
* changes slightly, by discovering available columns at runtime.
|
|
6
|
+
*/
|
|
7
|
+
import type Database from 'better-sqlite3';
|
|
8
|
+
export interface TableInfo {
|
|
9
|
+
name: string;
|
|
10
|
+
columns: ColumnInfo[];
|
|
11
|
+
}
|
|
12
|
+
export interface ColumnInfo {
|
|
13
|
+
cid: number;
|
|
14
|
+
name: string;
|
|
15
|
+
type: string;
|
|
16
|
+
notnull: number;
|
|
17
|
+
dflt_value: string | null;
|
|
18
|
+
pk: number;
|
|
19
|
+
}
|
|
20
|
+
export interface SchemaInfo {
|
|
21
|
+
tables: Map<string, TableInfo>;
|
|
22
|
+
version: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Discover database schema using PRAGMA commands
|
|
26
|
+
*/
|
|
27
|
+
export declare function discoverSchema(db: Database.Database): SchemaInfo;
|
|
28
|
+
/**
|
|
29
|
+
* Check if a table has a specific column
|
|
30
|
+
*/
|
|
31
|
+
export declare function hasColumn(schema: SchemaInfo, tableName: string, columnName: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Get column names for a table
|
|
34
|
+
*/
|
|
35
|
+
export declare function getColumnNames(schema: SchemaInfo, tableName: string): string[];
|
|
36
|
+
/**
|
|
37
|
+
* Find timestamp column - tries common naming patterns
|
|
38
|
+
*/
|
|
39
|
+
export declare function findTimestampColumn(schema: SchemaInfo, tableName: string): string | null;
|
|
40
|
+
/**
|
|
41
|
+
* Find direction column - tries common naming patterns
|
|
42
|
+
*/
|
|
43
|
+
export declare function findDirectionColumn(schema: SchemaInfo, tableName: string): string | null;
|
|
44
|
+
/**
|
|
45
|
+
* Find kind column - tries common naming patterns
|
|
46
|
+
*/
|
|
47
|
+
export declare function findKindColumn(schema: SchemaInfo, tableName: string): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Find raw JSON column
|
|
50
|
+
*/
|
|
51
|
+
export declare function findRawJsonColumn(schema: SchemaInfo, tableName: string): string | null;
|
|
52
|
+
/**
|
|
53
|
+
* Column mapping for known schema versions
|
|
54
|
+
*/
|
|
55
|
+
export interface ColumnMapping {
|
|
56
|
+
timestamp: string;
|
|
57
|
+
direction?: string;
|
|
58
|
+
kind?: string;
|
|
59
|
+
rawJson?: string;
|
|
60
|
+
sessionId?: string;
|
|
61
|
+
connectorId?: string;
|
|
62
|
+
rpcId?: string;
|
|
63
|
+
method?: string;
|
|
64
|
+
success?: string;
|
|
65
|
+
errorCode?: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Build column mapping for events table
|
|
69
|
+
*/
|
|
70
|
+
export declare function buildEventsMapping(schema: SchemaInfo): ColumnMapping | null;
|
|
71
|
+
/**
|
|
72
|
+
* Build column mapping for sessions table
|
|
73
|
+
*/
|
|
74
|
+
export declare function buildSessionsMapping(schema: SchemaInfo): ColumnMapping | null;
|
|
75
|
+
/**
|
|
76
|
+
* Build column mapping for rpc_calls table
|
|
77
|
+
*/
|
|
78
|
+
export declare function buildRpcCallsMapping(schema: SchemaInfo): ColumnMapping | null;
|
|
79
|
+
//# sourceMappingURL=schema-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-discovery.d.ts","sourceRoot":"","sources":["../../src/eventline/schema-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,UAAU,CAkBhE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAI5F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAI9E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWxF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWxF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWnF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWtF;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI,CAe3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI,CAY7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI,CAe7E"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database schema discovery - auto-detect table structure
|
|
3
|
+
*
|
|
4
|
+
* This allows the EventLine normalization to work even if the schema
|
|
5
|
+
* changes slightly, by discovering available columns at runtime.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Discover database schema using PRAGMA commands
|
|
9
|
+
*/
|
|
10
|
+
export function discoverSchema(db) {
|
|
11
|
+
const tables = new Map();
|
|
12
|
+
// Get all tables
|
|
13
|
+
const tableList = db.prepare(`
|
|
14
|
+
SELECT name FROM sqlite_master
|
|
15
|
+
WHERE type = 'table' AND name NOT LIKE 'sqlite_%'
|
|
16
|
+
`).all();
|
|
17
|
+
for (const { name } of tableList) {
|
|
18
|
+
const columns = db.prepare(`PRAGMA table_info('${name}')`).all();
|
|
19
|
+
tables.set(name, { name, columns });
|
|
20
|
+
}
|
|
21
|
+
// Get user_version
|
|
22
|
+
const version = db.pragma('user_version', { simple: true });
|
|
23
|
+
return { tables, version };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if a table has a specific column
|
|
27
|
+
*/
|
|
28
|
+
export function hasColumn(schema, tableName, columnName) {
|
|
29
|
+
const table = schema.tables.get(tableName);
|
|
30
|
+
if (!table)
|
|
31
|
+
return false;
|
|
32
|
+
return table.columns.some(c => c.name === columnName);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get column names for a table
|
|
36
|
+
*/
|
|
37
|
+
export function getColumnNames(schema, tableName) {
|
|
38
|
+
const table = schema.tables.get(tableName);
|
|
39
|
+
if (!table)
|
|
40
|
+
return [];
|
|
41
|
+
return table.columns.map(c => c.name);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Find timestamp column - tries common naming patterns
|
|
45
|
+
*/
|
|
46
|
+
export function findTimestampColumn(schema, tableName) {
|
|
47
|
+
const candidates = ['ts_ms', 'ts', 'timestamp', 'created_at', 'started_at', 'time'];
|
|
48
|
+
const table = schema.tables.get(tableName);
|
|
49
|
+
if (!table)
|
|
50
|
+
return null;
|
|
51
|
+
for (const candidate of candidates) {
|
|
52
|
+
if (table.columns.some(c => c.name === candidate)) {
|
|
53
|
+
return candidate;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Find direction column - tries common naming patterns
|
|
60
|
+
*/
|
|
61
|
+
export function findDirectionColumn(schema, tableName) {
|
|
62
|
+
const candidates = ['direction', 'dir', 'flow'];
|
|
63
|
+
const table = schema.tables.get(tableName);
|
|
64
|
+
if (!table)
|
|
65
|
+
return null;
|
|
66
|
+
for (const candidate of candidates) {
|
|
67
|
+
if (table.columns.some(c => c.name === candidate)) {
|
|
68
|
+
return candidate;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Find kind column - tries common naming patterns
|
|
75
|
+
*/
|
|
76
|
+
export function findKindColumn(schema, tableName) {
|
|
77
|
+
const candidates = ['kind', 'type', 'event_type', 'msg_type'];
|
|
78
|
+
const table = schema.tables.get(tableName);
|
|
79
|
+
if (!table)
|
|
80
|
+
return null;
|
|
81
|
+
for (const candidate of candidates) {
|
|
82
|
+
if (table.columns.some(c => c.name === candidate)) {
|
|
83
|
+
return candidate;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Find raw JSON column
|
|
90
|
+
*/
|
|
91
|
+
export function findRawJsonColumn(schema, tableName) {
|
|
92
|
+
const candidates = ['raw_json', 'raw', 'payload', 'data', 'body', 'content'];
|
|
93
|
+
const table = schema.tables.get(tableName);
|
|
94
|
+
if (!table)
|
|
95
|
+
return null;
|
|
96
|
+
for (const candidate of candidates) {
|
|
97
|
+
if (table.columns.some(c => c.name === candidate)) {
|
|
98
|
+
return candidate;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Build column mapping for events table
|
|
105
|
+
*/
|
|
106
|
+
export function buildEventsMapping(schema) {
|
|
107
|
+
const tableName = 'events';
|
|
108
|
+
const table = schema.tables.get(tableName);
|
|
109
|
+
if (!table)
|
|
110
|
+
return null;
|
|
111
|
+
const cols = getColumnNames(schema, tableName);
|
|
112
|
+
return {
|
|
113
|
+
timestamp: cols.includes('ts') ? 'ts' : (findTimestampColumn(schema, tableName) || 'ts'),
|
|
114
|
+
direction: cols.includes('direction') ? 'direction' : findDirectionColumn(schema, tableName) || undefined,
|
|
115
|
+
kind: cols.includes('kind') ? 'kind' : findKindColumn(schema, tableName) || undefined,
|
|
116
|
+
rawJson: cols.includes('raw_json') ? 'raw_json' : findRawJsonColumn(schema, tableName) || undefined,
|
|
117
|
+
sessionId: cols.includes('session_id') ? 'session_id' : undefined,
|
|
118
|
+
rpcId: cols.includes('rpc_id') ? 'rpc_id' : undefined,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Build column mapping for sessions table
|
|
123
|
+
*/
|
|
124
|
+
export function buildSessionsMapping(schema) {
|
|
125
|
+
const tableName = 'sessions';
|
|
126
|
+
const table = schema.tables.get(tableName);
|
|
127
|
+
if (!table)
|
|
128
|
+
return null;
|
|
129
|
+
const cols = getColumnNames(schema, tableName);
|
|
130
|
+
return {
|
|
131
|
+
timestamp: cols.includes('started_at') ? 'started_at' : (findTimestampColumn(schema, tableName) || 'created_at'),
|
|
132
|
+
connectorId: cols.includes('connector_id') ? 'connector_id' : undefined,
|
|
133
|
+
sessionId: cols.includes('session_id') ? 'session_id' : undefined,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Build column mapping for rpc_calls table
|
|
138
|
+
*/
|
|
139
|
+
export function buildRpcCallsMapping(schema) {
|
|
140
|
+
const tableName = 'rpc_calls';
|
|
141
|
+
const table = schema.tables.get(tableName);
|
|
142
|
+
if (!table)
|
|
143
|
+
return null;
|
|
144
|
+
const cols = getColumnNames(schema, tableName);
|
|
145
|
+
return {
|
|
146
|
+
timestamp: cols.includes('request_ts') ? 'request_ts' : (findTimestampColumn(schema, tableName) || 'ts'),
|
|
147
|
+
sessionId: cols.includes('session_id') ? 'session_id' : undefined,
|
|
148
|
+
rpcId: cols.includes('rpc_id') ? 'rpc_id' : undefined,
|
|
149
|
+
method: cols.includes('method') ? 'method' : undefined,
|
|
150
|
+
success: cols.includes('success') ? 'success' : undefined,
|
|
151
|
+
errorCode: cols.includes('error_code') ? 'error_code' : undefined,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=schema-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-discovery.js","sourceRoot":"","sources":["../../src/eventline/schema-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventLine Store - unified data access layer
|
|
3
|
+
*
|
|
4
|
+
* This provides a higher-level API for fetching EventLine data,
|
|
5
|
+
* abstracting away the underlying database structure.
|
|
6
|
+
*/
|
|
7
|
+
import type { EventLine, TreeNode } from './types.js';
|
|
8
|
+
import type { Event, SessionWithStats, RpcCall, Proof } from '../db/types.js';
|
|
9
|
+
import { type SchemaInfo } from './schema-discovery.js';
|
|
10
|
+
export interface ViewOptions {
|
|
11
|
+
limit?: number;
|
|
12
|
+
since?: string | number;
|
|
13
|
+
errors?: boolean;
|
|
14
|
+
method?: string;
|
|
15
|
+
connector?: string;
|
|
16
|
+
session?: string;
|
|
17
|
+
includeSessionEvents?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface TreeOptions {
|
|
20
|
+
sessions?: number;
|
|
21
|
+
rpc?: number;
|
|
22
|
+
session?: string;
|
|
23
|
+
rpcAll?: boolean;
|
|
24
|
+
method?: string;
|
|
25
|
+
status?: 'ok' | 'err' | 'all';
|
|
26
|
+
compact?: boolean;
|
|
27
|
+
idsOnly?: boolean;
|
|
28
|
+
since?: string | number;
|
|
29
|
+
}
|
|
30
|
+
export declare class EventLineStore {
|
|
31
|
+
private eventsStore;
|
|
32
|
+
private proofsStore;
|
|
33
|
+
private configDir;
|
|
34
|
+
private schemaInfo?;
|
|
35
|
+
constructor(configDir: string);
|
|
36
|
+
/**
|
|
37
|
+
* Discover and cache schema info
|
|
38
|
+
*/
|
|
39
|
+
getSchema(): SchemaInfo;
|
|
40
|
+
/**
|
|
41
|
+
* Parse "since" parameter to epoch ms
|
|
42
|
+
*/
|
|
43
|
+
private parseSince;
|
|
44
|
+
/**
|
|
45
|
+
* Get recent events as EventLines (for view command)
|
|
46
|
+
*/
|
|
47
|
+
getRecentEvents(options?: ViewOptions): EventLine[];
|
|
48
|
+
/**
|
|
49
|
+
* Build tree structure for connector → session → rpc
|
|
50
|
+
*/
|
|
51
|
+
buildTree(options?: TreeOptions): TreeNode[];
|
|
52
|
+
/**
|
|
53
|
+
* Get all connectors
|
|
54
|
+
*/
|
|
55
|
+
getConnectors(): Array<{
|
|
56
|
+
id: string;
|
|
57
|
+
session_count: number;
|
|
58
|
+
latest_session?: string;
|
|
59
|
+
}>;
|
|
60
|
+
/**
|
|
61
|
+
* Get sessions for a connector
|
|
62
|
+
*/
|
|
63
|
+
getSessions(connectorId?: string, limit?: number): SessionWithStats[];
|
|
64
|
+
/**
|
|
65
|
+
* Get RPC calls for a session
|
|
66
|
+
*/
|
|
67
|
+
getRpcCalls(sessionId: string): RpcCall[];
|
|
68
|
+
/**
|
|
69
|
+
* Get events for a session
|
|
70
|
+
*/
|
|
71
|
+
getSessionEvents(sessionId: string, limit?: number): EventLine[];
|
|
72
|
+
/**
|
|
73
|
+
* Get raw event details
|
|
74
|
+
*/
|
|
75
|
+
getRawEvent(sessionId: string, rpcId: string): {
|
|
76
|
+
request?: Event;
|
|
77
|
+
response?: Event;
|
|
78
|
+
} | null;
|
|
79
|
+
/**
|
|
80
|
+
* Get proofs for a session
|
|
81
|
+
*/
|
|
82
|
+
getProofs(sessionId: string): Proof[];
|
|
83
|
+
/**
|
|
84
|
+
* Get session by ID (supports partial match)
|
|
85
|
+
*/
|
|
86
|
+
findSession(partialId: string): SessionWithStats | null;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/eventline/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,KAAK,EAAW,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAC,CAAa;gBAEpB,SAAS,EAAE,MAAM;IAM7B;;OAEG;IACH,SAAS,IAAI,UAAU;IAQvB;;OAEG;IACH,OAAO,CAAC,UAAU;IAwBlB;;OAEG;IACH,eAAe,CAAC,OAAO,GAAE,WAAgB,GAAG,SAAS,EAAE;IA2GvD;;OAEG;IACH,SAAS,CAAC,OAAO,GAAE,WAAgB,GAAG,QAAQ,EAAE;IA2JhD;;OAEG;IACH,aAAa,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAetF;;OAEG;IACH,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAOrE;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;IAIzC;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE;IAkBhE;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,CAAC,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;KAAE,GAAG,IAAI;IAW3F;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE;IAIrC;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;CAMxD"}
|