@aicqtools/provenance 1.0.0-alpha.4 → 1.0.0-alpha.6

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.
@@ -1,19 +1,28 @@
1
+ import type { AiPromptRecord, AiSession } from '../types.js';
1
2
  import type { SessionReader, SessionReaderResult } from './types.js';
2
3
  export interface CursorReaderOptions {
3
4
  readonly home?: string;
4
5
  readonly platformOverride?: NodeJS.Platform;
5
6
  readonly appDataOverride?: string;
6
7
  readonly maxWorkspaces?: number;
8
+ readonly maxDatabases?: number;
7
9
  }
8
10
  export declare function getCursorWorkspaceStorageDir(opts: {
9
11
  home: string;
10
12
  platform: NodeJS.Platform;
11
13
  appData?: string;
12
14
  }): string | null;
15
+ export declare function getCursorGlobalStorageDir(opts: {
16
+ home: string;
17
+ platform: NodeJS.Platform;
18
+ appData?: string;
19
+ }): string | null;
13
20
  /**
14
- * Detects Cursor usage by scanning workspaceStorage for `state.vscdb`.
15
- * Beta-lite scope: detection only prompt extraction lands in v1.0 stable
16
- * when the SQLite schema stabilizes across Cursor versions.
21
+ * Reads Cursor AI-chat history from `state.vscdb` (SQLite) — workspace storage
22
+ * (`ItemTable`) and global storage (`ItemTable` + `cursorDiskKV`). Best-effort:
23
+ * Cursor's schema shifts between versions, so unrecognized/changed shapes degrade
24
+ * to detection-only (a single `cursor-detected-*` session, no prompts) and the
25
+ * reader never throws (per-file isolation policy).
17
26
  */
18
27
  export declare class CursorSessionReader implements SessionReader {
19
28
  readonly id = "cursor";
@@ -21,7 +30,20 @@ export declare class CursorSessionReader implements SessionReader {
21
30
  private readonly platform;
22
31
  private readonly appData;
23
32
  private readonly maxWorkspaces;
33
+ private readonly maxDatabases;
24
34
  constructor(opts?: CursorReaderOptions);
25
35
  read(_cwd: string): Promise<SessionReaderResult>;
36
+ private collectVscdbCandidates;
26
37
  }
38
+ interface NormalizeResult {
39
+ readonly sessions: AiSession[];
40
+ readonly prompts: AiPromptRecord[];
41
+ }
42
+ /**
43
+ * Probes known Cursor chat-payload shapes in order; the first probe yielding at
44
+ * least one non-empty prompt wins. Loose type-guards only — never assume a key
45
+ * exists, ignore unknown fields, never throw.
46
+ */
47
+ export declare function normalizeCursorChat(raw: unknown, dbMtimeMs: number): NormalizeResult;
48
+ export {};
27
49
  //# sourceMappingURL=cursor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/session-readers/cursor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC5C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,GAAG,IAAI,CAShB;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,QAAQ,CAAC,EAAE,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,IAAI,GAAE,mBAAwB;IAOpC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAsCvD"}
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/session-readers/cursor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC5C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAcD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,GAAG,IAAI,CAShB;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,GAAG,IAAI,CAShB;AAOD;;;;;;GAMG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,QAAQ,CAAC,EAAE,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,IAAI,GAAE,mBAAwB;IAQpC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAqBxC,sBAAsB;CA0CrC;AAED,UAAU,eAAe;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;CACpC;AA8GD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,CAyBpF"}
@@ -1,7 +1,18 @@
1
+ import Database from 'better-sqlite3';
1
2
  import { existsSync } from 'node:fs';
2
3
  import { readdir, stat } from 'node:fs/promises';
3
4
  import { homedir, platform } from 'node:os';
4
5
  import { join, posix, win32 } from 'node:path';
6
+ /** ItemTable keys that hold Cursor AI-chat payloads, newest-Cursor-first. */
7
+ const CURSOR_CHAT_KEYS = [
8
+ 'workbench.panel.aichat.view.aichat.chatdata',
9
+ 'aiService.prompts',
10
+ 'composer.composerData',
11
+ 'workbench.panel.composerChatViewPane.composer.composerData',
12
+ ];
13
+ const MAX_PROMPTS_PER_DB = 500;
14
+ const MAX_COMPOSER_ROWS = 200;
15
+ const MAX_BUBBLE_ROWS = 1000;
5
16
  export function getCursorWorkspaceStorageDir(opts) {
6
17
  if (opts.platform === 'win32') {
7
18
  if (!opts.appData)
@@ -13,10 +24,23 @@ export function getCursorWorkspaceStorageDir(opts) {
13
24
  }
14
25
  return posix.join(opts.home, '.config', 'Cursor', 'User', 'workspaceStorage');
15
26
  }
27
+ export function getCursorGlobalStorageDir(opts) {
28
+ if (opts.platform === 'win32') {
29
+ if (!opts.appData)
30
+ return null;
31
+ return win32.join(opts.appData, 'Cursor', 'User', 'globalStorage');
32
+ }
33
+ if (opts.platform === 'darwin') {
34
+ return posix.join(opts.home, 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage');
35
+ }
36
+ return posix.join(opts.home, '.config', 'Cursor', 'User', 'globalStorage');
37
+ }
16
38
  /**
17
- * Detects Cursor usage by scanning workspaceStorage for `state.vscdb`.
18
- * Beta-lite scope: detection only prompt extraction lands in v1.0 stable
19
- * when the SQLite schema stabilizes across Cursor versions.
39
+ * Reads Cursor AI-chat history from `state.vscdb` (SQLite) — workspace storage
40
+ * (`ItemTable`) and global storage (`ItemTable` + `cursorDiskKV`). Best-effort:
41
+ * Cursor's schema shifts between versions, so unrecognized/changed shapes degrade
42
+ * to detection-only (a single `cursor-detected-*` session, no prompts) and the
43
+ * reader never throws (per-file isolation policy).
20
44
  */
21
45
  export class CursorSessionReader {
22
46
  id = 'cursor';
@@ -24,51 +48,372 @@ export class CursorSessionReader {
24
48
  platform;
25
49
  appData;
26
50
  maxWorkspaces;
51
+ maxDatabases;
27
52
  constructor(opts = {}) {
28
53
  this.home = opts.home ?? homedir();
29
54
  this.platform = opts.platformOverride ?? platform();
30
55
  this.appData = opts.appDataOverride ?? process.env['APPDATA'];
31
56
  this.maxWorkspaces = opts.maxWorkspaces ?? 50;
57
+ this.maxDatabases = opts.maxDatabases ?? 20;
32
58
  }
33
59
  async read(_cwd) {
34
- const dir = getCursorWorkspaceStorageDir({
60
+ const candidates = await this.collectVscdbCandidates();
61
+ if (candidates.length === 0)
62
+ return { sessions: [], prompts: [] };
63
+ for (const candidate of candidates) {
64
+ const extracted = extractFromVscdb(candidate.path, candidate.mtimeMs);
65
+ if (extracted && extracted.prompts.length > 0)
66
+ return extracted;
67
+ }
68
+ // Cursor is present but no recognizable chat payload — keep the historical
69
+ // detection-only contract so downstream Article 50 / AI-BOM still records usage.
70
+ const mostRecent = candidates[0];
71
+ const session = {
72
+ sessionId: `cursor-detected-${mostRecent.mtimeMs}`,
73
+ tool: 'cursor',
74
+ model: 'unknown',
75
+ startedAt: new Date(mostRecent.mtimeMs).toISOString(),
76
+ };
77
+ return { sessions: [session], prompts: [] };
78
+ }
79
+ async collectVscdbCandidates() {
80
+ const results = [];
81
+ const dirOpts = {
35
82
  home: this.home,
36
83
  platform: this.platform,
37
84
  ...(this.appData ? { appData: this.appData } : {}),
38
- });
39
- if (!dir || !existsSync(dir))
40
- return { sessions: [], prompts: [] };
41
- let workspaces;
85
+ };
86
+ const wsDir = getCursorWorkspaceStorageDir(dirOpts);
87
+ if (wsDir && existsSync(wsDir)) {
88
+ let workspaces = [];
89
+ try {
90
+ workspaces = (await readdir(wsDir)).slice(0, this.maxWorkspaces);
91
+ }
92
+ catch {
93
+ workspaces = [];
94
+ }
95
+ for (const ws of workspaces) {
96
+ const dbPath = join(wsDir, ws, 'state.vscdb');
97
+ if (!existsSync(dbPath))
98
+ continue;
99
+ try {
100
+ results.push({ path: dbPath, mtimeMs: (await stat(dbPath)).mtimeMs });
101
+ }
102
+ catch {
103
+ continue;
104
+ }
105
+ }
106
+ }
107
+ const gsDir = getCursorGlobalStorageDir(dirOpts);
108
+ if (gsDir) {
109
+ const gdbPath = join(gsDir, 'state.vscdb');
110
+ if (existsSync(gdbPath)) {
111
+ try {
112
+ results.push({ path: gdbPath, mtimeMs: (await stat(gdbPath)).mtimeMs });
113
+ }
114
+ catch {
115
+ /* ignore */
116
+ }
117
+ }
118
+ }
119
+ results.sort((a, b) => b.mtimeMs - a.mtimeMs);
120
+ return results.slice(0, this.maxDatabases);
121
+ }
122
+ }
123
+ const EMPTY = { sessions: [], prompts: [] };
124
+ function extractFromVscdb(dbPath, dbMtimeMs) {
125
+ let db;
126
+ try {
127
+ db = new Database(dbPath, { readonly: true, fileMustExist: true });
128
+ db.pragma('query_only = true');
129
+ const sessions = [];
130
+ const prompts = [];
131
+ const absorb = (n) => {
132
+ if (n.prompts.length === 0)
133
+ return;
134
+ sessions.push(...n.sessions);
135
+ prompts.push(...n.prompts);
136
+ };
137
+ if (tableExists(db, 'ItemTable')) {
138
+ const stmt = db.prepare('SELECT value FROM ItemTable WHERE key = ?');
139
+ for (const key of CURSOR_CHAT_KEYS) {
140
+ if (prompts.length >= MAX_PROMPTS_PER_DB)
141
+ break;
142
+ const row = stmt.get(key);
143
+ const raw = parseJsonValue(row?.value);
144
+ if (raw === undefined)
145
+ continue;
146
+ absorb(normalizeCursorChat(raw, dbMtimeMs));
147
+ }
148
+ }
149
+ if (prompts.length === 0 && tableExists(db, 'cursorDiskKV')) {
150
+ absorb(extractFromDiskKv(db, dbMtimeMs));
151
+ }
152
+ if (prompts.length === 0)
153
+ return null;
154
+ return { sessions, prompts: prompts.slice(0, MAX_PROMPTS_PER_DB) };
155
+ }
156
+ catch {
157
+ return null;
158
+ }
159
+ finally {
42
160
  try {
43
- workspaces = (await readdir(dir)).slice(0, this.maxWorkspaces);
161
+ db?.close();
44
162
  }
45
163
  catch {
46
- return { sessions: [], prompts: [] };
164
+ /* ignore */
165
+ }
166
+ }
167
+ }
168
+ /** Newer Cursor: global `cursorDiskKV` holds `composerData:<id>` headers + `bubbleId:<id>:<bid>` rows. */
169
+ function extractFromDiskKv(db, dbMtimeMs) {
170
+ const sessions = [];
171
+ const prompts = [];
172
+ let composerRows;
173
+ try {
174
+ composerRows = db
175
+ .prepare(`SELECT key, value FROM cursorDiskKV WHERE key LIKE 'composerData:%' LIMIT ${MAX_COMPOSER_ROWS}`)
176
+ .all();
177
+ }
178
+ catch {
179
+ return EMPTY;
180
+ }
181
+ const bubbleByExactKey = db.prepare('SELECT value FROM cursorDiskKV WHERE key = ?');
182
+ const bubblesByPrefix = db.prepare(`SELECT value FROM cursorDiskKV WHERE key LIKE ? LIMIT ${MAX_BUBBLE_ROWS}`);
183
+ for (const r of composerRows) {
184
+ if (prompts.length >= MAX_PROMPTS_PER_DB)
185
+ break;
186
+ const raw = parseJsonValue(r.value);
187
+ const obj = asObj(raw);
188
+ if (!obj)
189
+ continue;
190
+ const composerId = r.key.slice('composerData:'.length) || `c${dbMtimeMs}`;
191
+ // (a) inline conversation array (older Cursor)
192
+ if (Array.isArray(obj['conversation'])) {
193
+ const n = normalizeCursorChat({ ...obj, composerId }, dbMtimeMs);
194
+ sessions.push(...n.sessions);
195
+ prompts.push(...n.prompts);
196
+ continue;
47
197
  }
48
- let mostRecent = 0;
49
- for (const ws of workspaces) {
50
- const dbPath = join(dir, ws, 'state.vscdb');
51
- if (!existsSync(dbPath))
52
- continue;
198
+ // (b) headers list bubbleIds in order; bubbles live in separate rows
199
+ const headers = asArray(obj['fullConversationHeadersOnly']).length > 0
200
+ ? asArray(obj['fullConversationHeadersOnly'])
201
+ : asArray(obj['conversationHeaders']);
202
+ let conversation;
203
+ if (headers.length > 0) {
204
+ conversation = [];
205
+ for (const h of headers) {
206
+ const bid = str(asObj(h)?.['bubbleId']);
207
+ if (!bid)
208
+ continue;
209
+ const brow = bubbleByExactKey.get(`bubbleId:${composerId}:${bid}`);
210
+ const bval = parseJsonValue(brow?.value);
211
+ if (asObj(bval))
212
+ conversation.push(bval);
213
+ }
214
+ }
215
+ else {
216
+ let bubbleRows;
53
217
  try {
54
- const m = await stat(dbPath);
55
- if (m.mtimeMs > mostRecent)
56
- mostRecent = m.mtimeMs;
218
+ bubbleRows = bubblesByPrefix.all(`bubbleId:${composerId}:%`);
57
219
  }
58
220
  catch {
59
- continue;
221
+ bubbleRows = [];
60
222
  }
223
+ conversation = bubbleRows.map((b) => parseJsonValue(b.value)).filter((v) => asObj(v) !== null);
61
224
  }
62
- if (mostRecent === 0)
63
- return { sessions: [], prompts: [] };
64
- const startedAt = new Date(mostRecent).toISOString();
65
- const session = {
66
- sessionId: `cursor-detected-${mostRecent}`,
67
- tool: 'cursor',
68
- model: 'unknown',
69
- startedAt,
70
- };
71
- return { sessions: [session], prompts: [] };
225
+ if (conversation.length === 0)
226
+ continue;
227
+ const n = normalizeCursorChat({ composerId, conversation, createdAt: obj['createdAt'] }, dbMtimeMs);
228
+ sessions.push(...n.sessions);
229
+ prompts.push(...n.prompts);
230
+ }
231
+ return { sessions, prompts };
232
+ }
233
+ /**
234
+ * Probes known Cursor chat-payload shapes in order; the first probe yielding at
235
+ * least one non-empty prompt wins. Loose type-guards only — never assume a key
236
+ * exists, ignore unknown fields, never throw.
237
+ */
238
+ export function normalizeCursorChat(raw, dbMtimeMs) {
239
+ let value = raw;
240
+ if (typeof value === 'string') {
241
+ try {
242
+ value = JSON.parse(value);
243
+ }
244
+ catch {
245
+ return EMPTY;
246
+ }
247
+ }
248
+ const probes = [
249
+ tryShapeFlatPrompts, // `aiService.prompts` — Array<{ text }>
250
+ tryShapeTabs, // `chatdata` — { tabs: [{ bubbles: [...] }] }
251
+ tryShapeConversation, // composer record — { composerId?, conversation: [...] }
252
+ tryShapeAllComposers, // { allComposers: [{ conversation: [...] }] }
253
+ ];
254
+ for (const probe of probes) {
255
+ try {
256
+ const result = probe(value, dbMtimeMs);
257
+ if (result.prompts.length > 0)
258
+ return result;
259
+ }
260
+ catch {
261
+ /* try next shape */
262
+ }
263
+ }
264
+ return EMPTY;
265
+ }
266
+ function tryShapeFlatPrompts(value, dbMtimeMs) {
267
+ if (!Array.isArray(value) || value.length === 0)
268
+ return EMPTY;
269
+ const sessionId = `cursor-prompts-${dbMtimeMs}`;
270
+ const timestamp = new Date(dbMtimeMs).toISOString();
271
+ const prompts = [];
272
+ for (const item of value) {
273
+ const text = (str(asObj(item)?.['text']) ?? str(item))?.trim();
274
+ if (!text)
275
+ continue;
276
+ prompts.push({ sessionId, index: prompts.length, prompt: text, timestamp });
277
+ }
278
+ if (prompts.length === 0)
279
+ return EMPTY;
280
+ return { sessions: [{ sessionId, tool: 'cursor', model: 'unknown', startedAt: timestamp }], prompts };
281
+ }
282
+ function tryShapeTabs(value, dbMtimeMs) {
283
+ const tabs = asArray(asObj(value)?.['tabs']);
284
+ if (tabs.length === 0)
285
+ return EMPTY;
286
+ const sessions = [];
287
+ const prompts = [];
288
+ let tabIndex = 0;
289
+ for (const tab of tabs) {
290
+ const t = asObj(tab);
291
+ if (!t)
292
+ continue;
293
+ const bubbles = asArray(t['bubbles']);
294
+ if (bubbles.length === 0)
295
+ continue;
296
+ const sessionId = `cursor-${str(t['tabId']) ?? `tab${tabIndex}`}`;
297
+ const startedAt = isoFromMs(num(t['lastSendTime']), dbMtimeMs);
298
+ const { paired, model } = pairBubbles(bubbles, sessionId, startedAt);
299
+ if (paired.length === 0)
300
+ continue;
301
+ sessions.push({ sessionId, tool: 'cursor', model: model ?? 'unknown', startedAt });
302
+ prompts.push(...paired);
303
+ tabIndex++;
304
+ }
305
+ return { sessions, prompts };
306
+ }
307
+ function tryShapeConversation(value, dbMtimeMs) {
308
+ const root = asObj(value);
309
+ if (!root)
310
+ return EMPTY;
311
+ const conv = asArray(root['conversation']);
312
+ if (conv.length === 0)
313
+ return EMPTY;
314
+ const sessionId = `cursor-${str(root['composerId']) ?? `c${dbMtimeMs}`}`;
315
+ const startedAt = isoFromMs(num(root['createdAt']) ?? num(root['lastUpdatedAt']), dbMtimeMs);
316
+ const { paired, model } = pairBubbles(conv, sessionId, startedAt);
317
+ if (paired.length === 0)
318
+ return EMPTY;
319
+ return { sessions: [{ sessionId, tool: 'cursor', model: model ?? 'unknown', startedAt }], prompts: paired };
320
+ }
321
+ function tryShapeAllComposers(value, dbMtimeMs) {
322
+ const root = asObj(value);
323
+ if (!root)
324
+ return EMPTY;
325
+ const composers = [...asArray(root['allComposers']), ...asArray(root['composers'])];
326
+ if (composers.length === 0)
327
+ return EMPTY;
328
+ const sessions = [];
329
+ const prompts = [];
330
+ for (const c of composers) {
331
+ const o = asObj(c);
332
+ if (!o || !Array.isArray(o['conversation']))
333
+ continue;
334
+ const r = tryShapeConversation(o, dbMtimeMs);
335
+ sessions.push(...r.sessions);
336
+ prompts.push(...r.prompts);
72
337
  }
338
+ return { sessions, prompts };
339
+ }
340
+ function isUserBubble(type) {
341
+ return type === 'user' || type === 1 || type === '1';
342
+ }
343
+ function isAiBubble(type) {
344
+ return type === 'ai' || type === 'assistant' || type === 2 || type === '2';
345
+ }
346
+ function pairBubbles(bubbles, sessionId, timestamp) {
347
+ const paired = [];
348
+ let model;
349
+ let pendingUser;
350
+ const flush = (response) => {
351
+ if (pendingUser === undefined)
352
+ return;
353
+ const prompt = pendingUser.trim();
354
+ pendingUser = undefined;
355
+ if (prompt.length === 0)
356
+ return;
357
+ paired.push(response ? { sessionId, index: paired.length, prompt, timestamp, response } : { sessionId, index: paired.length, prompt, timestamp });
358
+ };
359
+ for (const bubble of bubbles) {
360
+ const o = asObj(bubble);
361
+ if (!o)
362
+ continue;
363
+ const text = str(o['text']) ?? str(o['richText']);
364
+ if (!model)
365
+ model = str(o['modelType']) ?? str(o['model']);
366
+ if (isUserBubble(o['type'])) {
367
+ flush(); // a prior pending user with no response
368
+ pendingUser = text ?? '';
369
+ }
370
+ else if (isAiBubble(o['type'])) {
371
+ flush(text);
372
+ }
373
+ }
374
+ flush();
375
+ return model ? { paired, model } : { paired };
376
+ }
377
+ function tableExists(db, name) {
378
+ try {
379
+ return db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?").get(name) !== undefined;
380
+ }
381
+ catch {
382
+ return false;
383
+ }
384
+ }
385
+ function parseJsonValue(value) {
386
+ if (value == null)
387
+ return undefined;
388
+ let text;
389
+ if (typeof value === 'string')
390
+ text = value;
391
+ else if (Buffer.isBuffer(value))
392
+ text = value.toString('utf-8');
393
+ else if (value instanceof Uint8Array)
394
+ text = Buffer.from(value).toString('utf-8');
395
+ else
396
+ return undefined;
397
+ try {
398
+ return JSON.parse(text);
399
+ }
400
+ catch {
401
+ return undefined;
402
+ }
403
+ }
404
+ function asObj(v) {
405
+ return typeof v === 'object' && v !== null && !Array.isArray(v) ? v : null;
406
+ }
407
+ function asArray(v) {
408
+ return Array.isArray(v) ? v : [];
409
+ }
410
+ function str(v) {
411
+ return typeof v === 'string' && v.length > 0 ? v : undefined;
412
+ }
413
+ function num(v) {
414
+ return typeof v === 'number' && Number.isFinite(v) ? v : undefined;
415
+ }
416
+ function isoFromMs(ms, fallbackMs) {
417
+ return new Date(ms !== undefined && ms > 0 ? ms : fallbackMs).toISOString();
73
418
  }
74
419
  //# sourceMappingURL=cursor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/session-readers/cursor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/session-readers/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAY/C,6EAA6E;AAC7E,MAAM,gBAAgB,GAAG;IACvB,6CAA6C;IAC7C,mBAAmB;IACnB,uBAAuB;IACvB,4DAA4D;CACpD,CAAC;AAEX,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,MAAM,UAAU,4BAA4B,CAAC,IAI5C;IACC,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACvG,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAIzC;IACC,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;AAC7E,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,OAAO,mBAAmB;IACrB,EAAE,GAAG,QAAQ,CAAC;IACN,IAAI,CAAS;IACb,QAAQ,CAAkB;IAC1B,OAAO,CAAqB;IAC5B,aAAa,CAAS;IACtB,YAAY,CAAS;IAEtC,YAAY,OAA4B,EAAE;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,IAAI,QAAQ,EAAE,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACvD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAElE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;YACtE,IAAI,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,SAAS,CAAC;QAClE,CAAC;QAED,2EAA2E;QAC3E,iFAAiF;QACjF,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAmB,CAAC;QACnD,MAAM,OAAO,GAAc;YACzB,SAAS,EAAE,mBAAmB,UAAU,CAAC,OAAO,EAAE;YAClD,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;SACtD,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,sBAAsB;QAClC,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD,CAAC;QAEF,MAAM,KAAK,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,UAAU,GAAa,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,UAAU,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACnE,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU,GAAG,EAAE,CAAC;YAClB,CAAC;YACD,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;gBAC9C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,SAAS;gBAClC,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBACxE,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAC3C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1E,CAAC;gBAAC,MAAM,CAAC;oBACP,YAAY;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;CACF;AAOD,MAAM,KAAK,GAAoB,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAE7D,SAAS,gBAAgB,CAAC,MAAc,EAAE,SAAiB;IACzD,IAAI,EAAiC,CAAC;IACtC,IAAI,CAAC;QACH,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAE/B,MAAM,QAAQ,GAAgB,EAAE,CAAC;QACjC,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,CAAC,CAAkB,EAAQ,EAAE;YAC1C,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACnC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC;QAEF,IAAI,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;YACrE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;gBACnC,IAAI,OAAO,CAAC,MAAM,IAAI,kBAAkB;oBAAE,MAAM;gBAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAoC,CAAC;gBAC7D,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACvC,IAAI,GAAG,KAAK,SAAS;oBAAE,SAAS;gBAChC,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,EAAE,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,EAAE,EAAE,KAAK,EAAE,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,0GAA0G;AAC1G,SAAS,iBAAiB,CAAC,EAAqB,EAAE,SAAiB;IACjE,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,IAAI,YAAqD,CAAC;IAC1D,IAAI,CAAC;QACH,YAAY,GAAG,EAAE;aACd,OAAO,CAAC,6EAA6E,iBAAiB,EAAE,CAAC;aACzG,GAAG,EAA6C,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;IACpF,MAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAAC,yDAAyD,eAAe,EAAE,CAAC,CAAC;IAE/G,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,kBAAkB;YAAE,MAAM;QAChD,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;QAE1E,+CAA+C;QAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,mBAAmB,CAAC,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;YACjE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,qEAAqE;QACrE,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;YACpD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC7C,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC1C,IAAI,YAAuB,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,YAAY,GAAG,EAAE,CAAC;YAClB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;gBACxC,IAAI,CAAC,GAAG;oBAAE,SAAS;gBACnB,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,YAAY,UAAU,IAAI,GAAG,EAAE,CAAoC,CAAC;gBACtG,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACzC,IAAI,KAAK,CAAC,IAAI,CAAC;oBAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,UAAsC,CAAC;YAC3C,IAAI,CAAC;gBACH,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,UAAU,IAAI,CAA+B,CAAC;YAC7F,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU,GAAG,EAAE,CAAC;YAClB,CAAC;YACD,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACxC,MAAM,CAAC,GAAG,mBAAmB,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACpG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAY,EAAE,SAAiB;IACjE,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAuD;QACjE,mBAAmB,EAAE,wCAAwC;QAC7D,YAAY,EAAE,8CAA8C;QAC5D,oBAAoB,EAAE,yDAAyD;QAC/E,oBAAoB,EAAE,8CAA8C;KACrE,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACvC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,MAAM,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,SAAiB;IAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,SAAS,GAAG,kBAAkB,SAAS,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QAC/D,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;AACxG,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,SAAiB;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,QAAQ,EAAE,EAAE,CAAC;QAClE,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC/D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACrE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACxB,QAAQ,EAAE,CAAC;IACb,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,SAAiB;IAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,SAAS,EAAE,EAAE,CAAC;IACzE,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7F,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC9G,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,SAAiB;IAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACpF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YAAE,SAAS;QACtD,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAC,IAAa;IACjC,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC;AACvD,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC/B,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC;AAC7E,CAAC;AAED,SAAS,WAAW,CAClB,OAA2B,EAC3B,SAAiB,EACjB,SAAiB;IAEjB,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,IAAI,KAAyB,CAAC;IAC9B,IAAI,WAA+B,CAAC;IAEpC,MAAM,KAAK,GAAG,CAAC,QAAiB,EAAQ,EAAE;QACxC,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO;QACtC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QAClC,WAAW,GAAG,SAAS,CAAC;QACxB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,MAAM,CAAC,IAAI,CACT,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CACrI,CAAC;IACJ,CAAC,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK;YAAE,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3D,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC5B,KAAK,EAAE,CAAC,CAAC,wCAAwC;YACjD,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;QAC3B,CAAC;aAAM,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAAC,EAAqB,EAAE,IAAY;IACtD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;IAC7G,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,IAAI,IAAY,CAAC;IACjB,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,IAAI,GAAG,KAAK,CAAC;SACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAC3D,IAAI,KAAK,YAAY,UAAU;QAAE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;;QAC7E,OAAO,SAAS,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,CAAU;IACvB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1G,CAAC;AAED,SAAS,OAAO,CAAC,CAAU;IACzB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,GAAG,CAAC,CAAU;IACrB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC;AAED,SAAS,GAAG,CAAC,CAAU;IACrB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC;AAED,SAAS,SAAS,CAAC,EAAsB,EAAE,UAAkB;IAC3D,OAAO,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;AAC9E,CAAC"}
@@ -2,7 +2,7 @@ export type { SessionReader, SessionReaderResult } from './types.js';
2
2
  export { ManualSessionReader } from './manual.js';
3
3
  export { ClaudeCodeSessionReader, encodeClaudeProjectId } from './claude-code.js';
4
4
  export type { ClaudeCodeReaderOptions } from './claude-code.js';
5
- export { CursorSessionReader, getCursorWorkspaceStorageDir } from './cursor.js';
5
+ export { CursorSessionReader, getCursorWorkspaceStorageDir, getCursorGlobalStorageDir, normalizeCursorChat, } from './cursor.js';
6
6
  export type { CursorReaderOptions } from './cursor.js';
7
7
  export { CompositeSessionReader } from './composite.js';
8
8
  export { createReader } from './factory.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session-readers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAClF,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session-readers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAClF,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export { ManualSessionReader } from './manual.js';
2
2
  export { ClaudeCodeSessionReader, encodeClaudeProjectId } from './claude-code.js';
3
- export { CursorSessionReader, getCursorWorkspaceStorageDir } from './cursor.js';
3
+ export { CursorSessionReader, getCursorWorkspaceStorageDir, getCursorGlobalStorageDir, normalizeCursorChat, } from './cursor.js';
4
4
  export { CompositeSessionReader } from './composite.js';
5
5
  export { createReader } from './factory.js';
6
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session-readers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAElF,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAEhF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session-readers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAElF,OAAO,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aicqtools/provenance",
3
- "version": "1.0.0-alpha.4",
3
+ "version": "1.0.0-alpha.6",
4
4
  "type": "module",
5
5
  "description": "AI code provenance tracker — Git pre-commit capture, CycloneDX 1.6 AI-BOM emitter, EU AI Act Article 50 reporter.",
6
6
  "keywords": [
@@ -37,7 +37,8 @@
37
37
  "access": "public"
38
38
  },
39
39
  "dependencies": {
40
- "@aicqtools/core": "1.0.0-alpha.4"
40
+ "better-sqlite3": "^11.7.0",
41
+ "@aicqtools/core": "1.0.0-alpha.6"
41
42
  },
42
43
  "peerDependencies": {
43
44
  "puppeteer": ">=22.0.0"
@@ -48,6 +49,7 @@
48
49
  }
49
50
  },
50
51
  "devDependencies": {
52
+ "@types/better-sqlite3": "^7.6.12",
51
53
  "@types/node": "^22.10.0",
52
54
  "typescript": "^5.7.2",
53
55
  "vitest": "^2.1.8"