@aicqtools/provenance 1.0.0-alpha.5 → 1.0.0-alpha.7
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/dist/session-readers/cursor.d.ts +25 -3
- package/dist/session-readers/cursor.d.ts.map +1 -1
- package/dist/session-readers/cursor.js +374 -29
- package/dist/session-readers/cursor.js.map +1 -1
- package/dist/session-readers/index.d.ts +1 -1
- package/dist/session-readers/index.d.ts.map +1 -1
- package/dist/session-readers/index.js +1 -1
- package/dist/session-readers/index.js.map +1 -1
- package/package.json +4 -2
|
@@ -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
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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;
|
|
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
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
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
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
161
|
+
db?.close();
|
|
44
162
|
}
|
|
45
163
|
catch {
|
|
46
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
55
|
-
if (m.mtimeMs > mostRecent)
|
|
56
|
-
mostRecent = m.mtimeMs;
|
|
218
|
+
bubbleRows = bubblesByPrefix.all(`bubbleId:${composerId}:%`);
|
|
57
219
|
}
|
|
58
220
|
catch {
|
|
59
|
-
|
|
221
|
+
bubbleRows = [];
|
|
60
222
|
}
|
|
223
|
+
conversation = bubbleRows.map((b) => parseJsonValue(b.value)).filter((v) => asObj(v) !== null);
|
|
61
224
|
}
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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":"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"}
|
|
@@ -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,
|
|
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,
|
|
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.
|
|
3
|
+
"version": "1.0.0-alpha.7",
|
|
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
|
-
"
|
|
40
|
+
"better-sqlite3": "^11.7.0",
|
|
41
|
+
"@aicqtools/core": "1.0.0-alpha.7"
|
|
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"
|