@tracebench/adapter-cursor 0.2.2 → 0.2.5
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 +9 -7
- package/dist/db-fixture.d.ts +2 -0
- package/dist/db-fixture.d.ts.map +1 -0
- package/dist/db-fixture.js +75 -0
- package/dist/db-fixture.js.map +1 -0
- package/dist/db-read.d.ts +26 -0
- package/dist/db-read.d.ts.map +1 -0
- package/dist/db-read.js +142 -0
- package/dist/db-read.js.map +1 -0
- package/dist/db-snapshot.d.ts +13 -0
- package/dist/db-snapshot.d.ts.map +1 -0
- package/dist/db-snapshot.js +34 -0
- package/dist/db-snapshot.js.map +1 -0
- package/dist/db-types.d.ts +70 -0
- package/dist/db-types.d.ts.map +1 -0
- package/dist/db-types.js +2 -0
- package/dist/db-types.js.map +1 -0
- package/dist/db-uri.d.ts +8 -0
- package/dist/db-uri.d.ts.map +1 -0
- package/dist/db-uri.js +22 -0
- package/dist/db-uri.js.map +1 -0
- package/dist/discover-db.d.ts +11 -0
- package/dist/discover-db.d.ts.map +1 -0
- package/dist/discover-db.js +19 -0
- package/dist/discover-db.js.map +1 -0
- package/dist/discover.d.ts +13 -1
- package/dist/discover.d.ts.map +1 -1
- package/dist/discover.js +38 -3
- package/dist/discover.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/load-db.d.ts +5 -0
- package/dist/load-db.d.ts.map +1 -0
- package/dist/load-db.js +19 -0
- package/dist/load-db.js.map +1 -0
- package/dist/normalize-db.d.ts +10 -0
- package/dist/normalize-db.d.ts.map +1 -0
- package/dist/normalize-db.js +292 -0
- package/dist/normalize-db.js.map +1 -0
- package/dist/normalize.d.ts.map +1 -1
- package/dist/normalize.js +5 -0
- package/dist/normalize.js.map +1 -1
- package/package.json +3 -3
- package/src/db-fixture.ts +97 -0
- package/src/db-read.ts +199 -0
- package/src/db-snapshot.ts +41 -0
- package/src/db-types.ts +60 -0
- package/src/db-uri.ts +25 -0
- package/src/discover-db.ts +33 -0
- package/src/discover.test.ts +4 -2
- package/src/discover.ts +55 -3
- package/src/index.ts +13 -1
- package/src/load-db.ts +25 -0
- package/src/normalize-db.test.ts +88 -0
- package/src/normalize-db.ts +332 -0
- package/src/normalize.ts +6 -0
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ Cursor's JSONL export does not include:
|
|
|
27
27
|
|
|
28
28
|
The UI still renders `tool_call` events (Read, Write, Bash, Task, etc.) with **input only**.
|
|
29
29
|
|
|
30
|
-
## Phase 2 (
|
|
30
|
+
## Phase 2 (shipped): Composer SQLite (`state.vscdb`)
|
|
31
31
|
|
|
32
32
|
Full Composer / Ask history lives in Cursor's VS Code–style SQLite DBs. Paths by OS:
|
|
33
33
|
|
|
@@ -41,14 +41,16 @@ Per-workspace index (Cursor ≤2.6): `<User>/workspaceStorage/<id>/state.vscdb`
|
|
|
41
41
|
|
|
42
42
|
**Read WAL consistently:** copy `state.vscdb`, `state.vscdb-wal`, and `state.vscdb-shm` together.
|
|
43
43
|
|
|
44
|
-
Phase 2
|
|
44
|
+
Phase 2:
|
|
45
45
|
|
|
46
|
-
1.
|
|
47
|
-
2.
|
|
48
|
-
3.
|
|
49
|
-
4.
|
|
46
|
+
1. Snapshots `state.vscdb` (+ `-wal`/`-shm`) for consistent reads while Cursor is open.
|
|
47
|
+
2. Lists composers with stored bubbles; loads `composerData:{id}` and ordered `bubbleId:{id}:{bubbleId}` rows.
|
|
48
|
+
3. Normalizes bubbles into `CanonicalEvent` — `tool_call` + `tool_result` (via `toolFormerData`), thinking (`capabilityType` 30), real timestamps, model id.
|
|
49
|
+
4. Dedupes with JSONL: when `composerId` matches an agent-transcript folder UUID, the DB entry replaces JSONL.
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
Discovery merges both sources automatically. DB sessions use virtual paths `cursor-db:{composerId}@{globalDbPath}`.
|
|
52
|
+
|
|
53
|
+
CLI: `tracebench --cursor-user-data-dir <path>` overrides the OS-default Cursor `User/` directory (see `defaultCursorUserDataDir()` in `src/paths.ts`).
|
|
52
54
|
|
|
53
55
|
## SSH / WSL
|
|
54
56
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-fixture.d.ts","sourceRoot":"","sources":["../src/db-fixture.ts"],"names":[],"mappings":"AAGA,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CA6F1D"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/** Build a minimal Cursor state.vscdb for tests. */
|
|
2
|
+
import { SqliteDatabase } from '@tracebench/core';
|
|
3
|
+
export function createMinimalCursorDb(dbPath) {
|
|
4
|
+
const db = new SqliteDatabase(dbPath);
|
|
5
|
+
db.exec(`
|
|
6
|
+
CREATE TABLE ItemTable (key TEXT PRIMARY KEY, value TEXT);
|
|
7
|
+
CREATE TABLE cursorDiskKV (key TEXT PRIMARY KEY, value TEXT);
|
|
8
|
+
`);
|
|
9
|
+
const composerId = 'aaaa-bbbb-cccc-dddd-eeeeeeeeeeee';
|
|
10
|
+
const userBubbleId = '11111111-1111-1111-1111-111111111111';
|
|
11
|
+
const thinkBubbleId = '22222222-2222-2222-2222-222222222222';
|
|
12
|
+
const toolBubbleId = '33333333-3333-3333-3333-333333333333';
|
|
13
|
+
db.prepare('INSERT INTO ItemTable (key, value) VALUES (?, ?)').run('composer.composerHeaders', JSON.stringify({
|
|
14
|
+
allComposers: [
|
|
15
|
+
{
|
|
16
|
+
type: 'head',
|
|
17
|
+
composerId,
|
|
18
|
+
name: 'Fixture composer chat',
|
|
19
|
+
lastUpdatedAt: 1_770_000_000_000,
|
|
20
|
+
createdAt: 1_769_999_000_000,
|
|
21
|
+
workspaceIdentifier: {
|
|
22
|
+
uri: { fsPath: '/Users/me/code/fixture' },
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
}));
|
|
27
|
+
db.prepare('INSERT INTO cursorDiskKV (key, value) VALUES (?, ?)').run(`composerData:${composerId}`, JSON.stringify({
|
|
28
|
+
composerId,
|
|
29
|
+
name: 'Fixture composer chat',
|
|
30
|
+
createdAt: 1_769_999_000_000,
|
|
31
|
+
lastUpdatedAt: 1_770_000_000_000,
|
|
32
|
+
unifiedMode: 'agent',
|
|
33
|
+
modelConfig: { modelName: 'composer-2.5' },
|
|
34
|
+
fullConversationHeadersOnly: [
|
|
35
|
+
{ bubbleId: userBubbleId, type: 1 },
|
|
36
|
+
{ bubbleId: thinkBubbleId, type: 2 },
|
|
37
|
+
{ bubbleId: toolBubbleId, type: 2 },
|
|
38
|
+
],
|
|
39
|
+
workspaceIdentifier: {
|
|
40
|
+
uri: { fsPath: '/Users/me/code/fixture' },
|
|
41
|
+
},
|
|
42
|
+
}));
|
|
43
|
+
db.prepare('INSERT INTO cursorDiskKV (key, value) VALUES (?, ?)').run(`bubbleId:${composerId}:${userBubbleId}`, JSON.stringify({
|
|
44
|
+
bubbleId: userBubbleId,
|
|
45
|
+
type: 1,
|
|
46
|
+
text: '<user_query>\nSummarize the fixture DB session\n</user_query>',
|
|
47
|
+
createdAt: '2026-05-18T10:00:00.000Z',
|
|
48
|
+
}));
|
|
49
|
+
db.prepare('INSERT INTO cursorDiskKV (key, value) VALUES (?, ?)').run(`bubbleId:${composerId}:${thinkBubbleId}`, JSON.stringify({
|
|
50
|
+
bubbleId: thinkBubbleId,
|
|
51
|
+
type: 2,
|
|
52
|
+
capabilityType: 30,
|
|
53
|
+
thinking: { text: 'Planning fixture response.' },
|
|
54
|
+
thinkingDurationMs: 50,
|
|
55
|
+
createdAt: '2026-05-18T10:00:01.000Z',
|
|
56
|
+
}));
|
|
57
|
+
const toolCallId = 'tool_fixture_call_001';
|
|
58
|
+
db.prepare('INSERT INTO cursorDiskKV (key, value) VALUES (?, ?)').run(`bubbleId:${composerId}:${toolBubbleId}`, JSON.stringify({
|
|
59
|
+
bubbleId: toolBubbleId,
|
|
60
|
+
type: 2,
|
|
61
|
+
capabilityType: 15,
|
|
62
|
+
createdAt: '2026-05-18T10:00:02.000Z',
|
|
63
|
+
modelInfo: { modelName: 'composer-2.5' },
|
|
64
|
+
tokenCount: { inputTokens: 10, outputTokens: 20 },
|
|
65
|
+
toolFormerData: {
|
|
66
|
+
toolCallId,
|
|
67
|
+
name: 'read_file',
|
|
68
|
+
status: 'completed',
|
|
69
|
+
params: JSON.stringify({ path: '/Users/me/code/fixture/README.md' }),
|
|
70
|
+
result: JSON.stringify({ output: '# Fixture\n', rejected: false }),
|
|
71
|
+
},
|
|
72
|
+
}));
|
|
73
|
+
db.close();
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=db-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-fixture.js","sourceRoot":"","sources":["../src/db-fixture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ComposerDataRow, ConversationHeader, CursorBubble } from './db-types.js';
|
|
2
|
+
export interface ComposerListEntry {
|
|
3
|
+
composerId: string;
|
|
4
|
+
name: string | null;
|
|
5
|
+
subtitle: string | null;
|
|
6
|
+
projectPath: string | null;
|
|
7
|
+
createdAtMs: number | null;
|
|
8
|
+
lastUpdatedAtMs: number | null;
|
|
9
|
+
unifiedMode: string | null;
|
|
10
|
+
modelName: string | null;
|
|
11
|
+
bubbleCount: number;
|
|
12
|
+
/** Number of bubbles listed in fullConversationHeadersOnly (may be 0 for agent sessions). */
|
|
13
|
+
headerBubbleCount: number;
|
|
14
|
+
}
|
|
15
|
+
/** List composers that have at least one stored bubble. */
|
|
16
|
+
export declare function listComposersWithBubbles(dbPath: string): ComposerListEntry[];
|
|
17
|
+
export interface LoadedComposer {
|
|
18
|
+
composerId: string;
|
|
19
|
+
data: ComposerDataRow | null;
|
|
20
|
+
headers: ConversationHeader[];
|
|
21
|
+
bubbles: CursorBubble[];
|
|
22
|
+
}
|
|
23
|
+
export declare function loadComposerFromDb(dbPath: string, composerId: string): LoadedComposer | null;
|
|
24
|
+
/** DB mtime for incremental indexing (main file only). */
|
|
25
|
+
export declare function cursorDbMtimeMs(dbPath: string): number;
|
|
26
|
+
//# sourceMappingURL=db-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-read.d.ts","sourceRoot":"","sources":["../src/db-read.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EAEf,kBAAkB,EAClB,YAAY,EACb,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,6FAA6F;IAC7F,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAuBD,2DAA2D;AAC3D,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAuE5E;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,cAAc,GAAG,IAAI,CA0DvB;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMtD"}
|
package/dist/db-read.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// Read Composer sessions from Cursor's global state.vscdb.
|
|
2
|
+
import { statSync } from 'node:fs';
|
|
3
|
+
import { SqliteDatabase } from '@tracebench/core';
|
|
4
|
+
import { snapshotCursorDb, releaseDbSnapshot } from './db-snapshot.js';
|
|
5
|
+
function parseJson(raw) {
|
|
6
|
+
if (raw == null)
|
|
7
|
+
return null;
|
|
8
|
+
const s = typeof raw === 'string' ? raw : raw.toString('utf8');
|
|
9
|
+
if (!s)
|
|
10
|
+
return null;
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(s);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function workspacePath(ws) {
|
|
19
|
+
return ws?.uri?.fsPath ?? ws?.uri?.path ?? null;
|
|
20
|
+
}
|
|
21
|
+
function openReadonly(dbPath) {
|
|
22
|
+
return new SqliteDatabase(dbPath, { readonly: true, fileMustExist: true });
|
|
23
|
+
}
|
|
24
|
+
/** List composers that have at least one stored bubble. */
|
|
25
|
+
export function listComposersWithBubbles(dbPath) {
|
|
26
|
+
const snap = snapshotCursorDb(dbPath);
|
|
27
|
+
if (!snap)
|
|
28
|
+
return [];
|
|
29
|
+
try {
|
|
30
|
+
const db = openReadonly(snap.dbPath);
|
|
31
|
+
const headersRaw = db
|
|
32
|
+
.prepare('SELECT value FROM ItemTable WHERE key = ?')
|
|
33
|
+
.get('composer.composerHeaders');
|
|
34
|
+
const headers = parseJson(headersRaw?.value);
|
|
35
|
+
const headerById = new Map();
|
|
36
|
+
for (const h of headers?.allComposers ?? []) {
|
|
37
|
+
if (h.composerId)
|
|
38
|
+
headerById.set(h.composerId, h);
|
|
39
|
+
}
|
|
40
|
+
const bubbleCounts = new Map();
|
|
41
|
+
const rows = db
|
|
42
|
+
.prepare(`SELECT key FROM cursorDiskKV WHERE key LIKE 'bubbleId:%'`)
|
|
43
|
+
.all();
|
|
44
|
+
for (const { key } of rows) {
|
|
45
|
+
const parts = key.split(':');
|
|
46
|
+
if (parts.length < 3)
|
|
47
|
+
continue;
|
|
48
|
+
const composerId = parts[1];
|
|
49
|
+
bubbleCounts.set(composerId, (bubbleCounts.get(composerId) ?? 0) + 1);
|
|
50
|
+
}
|
|
51
|
+
const composerIds = [...bubbleCounts.keys()];
|
|
52
|
+
const out = [];
|
|
53
|
+
const dataStmt = db.prepare('SELECT value FROM cursorDiskKV WHERE key = ?');
|
|
54
|
+
for (const composerId of composerIds) {
|
|
55
|
+
const dataRow = dataStmt.get(`composerData:${composerId}`);
|
|
56
|
+
const data = parseJson(dataRow?.value);
|
|
57
|
+
const header = headerById.get(composerId);
|
|
58
|
+
const name = data?.name ?? header?.name ?? header?.subtitle ?? data?.subtitle ?? null;
|
|
59
|
+
const projectPath = workspacePath(data?.workspaceIdentifier) ??
|
|
60
|
+
workspacePath(header?.workspaceIdentifier);
|
|
61
|
+
out.push({
|
|
62
|
+
composerId,
|
|
63
|
+
name: name ?? null,
|
|
64
|
+
subtitle: data?.subtitle ?? header?.subtitle ?? null,
|
|
65
|
+
projectPath,
|
|
66
|
+
createdAtMs: data?.createdAt ?? header?.createdAt ?? null,
|
|
67
|
+
lastUpdatedAtMs: data?.lastUpdatedAt ?? header?.lastUpdatedAt ?? null,
|
|
68
|
+
unifiedMode: data?.unifiedMode ?? header?.unifiedMode ?? null,
|
|
69
|
+
modelName: data?.modelConfig?.modelName ?? null,
|
|
70
|
+
bubbleCount: bubbleCounts.get(composerId) ?? 0,
|
|
71
|
+
headerBubbleCount: data?.fullConversationHeadersOnly?.length ?? 0,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
db.close();
|
|
75
|
+
out.sort((a, b) => (b.lastUpdatedAtMs ?? 0) - (a.lastUpdatedAtMs ?? 0));
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
releaseDbSnapshot(snap);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function loadComposerFromDb(dbPath, composerId) {
|
|
83
|
+
const snap = snapshotCursorDb(dbPath);
|
|
84
|
+
if (!snap)
|
|
85
|
+
return null;
|
|
86
|
+
try {
|
|
87
|
+
const db = openReadonly(snap.dbPath);
|
|
88
|
+
const dataRow = db
|
|
89
|
+
.prepare('SELECT value FROM cursorDiskKV WHERE key = ?')
|
|
90
|
+
.get(`composerData:${composerId}`);
|
|
91
|
+
const data = parseJson(dataRow?.value);
|
|
92
|
+
const headerList = data?.fullConversationHeadersOnly ?? [];
|
|
93
|
+
const bubbles = [];
|
|
94
|
+
const bubbleStmt = db.prepare('SELECT value FROM cursorDiskKV WHERE key = ?');
|
|
95
|
+
const prefix = `bubbleId:${composerId}:`;
|
|
96
|
+
if (headerList.length > 0) {
|
|
97
|
+
for (const h of headerList) {
|
|
98
|
+
const row = bubbleStmt.get(`${prefix}${h.bubbleId}`);
|
|
99
|
+
const bubble = parseJson(row?.value);
|
|
100
|
+
if (bubble)
|
|
101
|
+
bubbles.push(bubble);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
const all = db
|
|
106
|
+
.prepare(`SELECT key, value FROM cursorDiskKV WHERE key LIKE ?`)
|
|
107
|
+
.all(`${prefix}%`);
|
|
108
|
+
for (const row of all) {
|
|
109
|
+
const bubble = parseJson(row.value);
|
|
110
|
+
if (bubble)
|
|
111
|
+
bubbles.push(bubble);
|
|
112
|
+
}
|
|
113
|
+
bubbles.sort((a, b) => {
|
|
114
|
+
const ta = a.createdAt ? Date.parse(a.createdAt) : 0;
|
|
115
|
+
const tb = b.createdAt ? Date.parse(b.createdAt) : 0;
|
|
116
|
+
return ta - tb;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
db.close();
|
|
120
|
+
if (bubbles.length === 0 && !data)
|
|
121
|
+
return null;
|
|
122
|
+
return {
|
|
123
|
+
composerId,
|
|
124
|
+
data,
|
|
125
|
+
headers: headerList,
|
|
126
|
+
bubbles,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
releaseDbSnapshot(snap);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** DB mtime for incremental indexing (main file only). */
|
|
134
|
+
export function cursorDbMtimeMs(dbPath) {
|
|
135
|
+
try {
|
|
136
|
+
return statSync(dbPath).mtimeMs;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=db-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-read.js","sourceRoot":"","sources":["../src/db-read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface DbSnapshot {
|
|
2
|
+
/** Path to the copied main DB file (inside a temp dir). */
|
|
3
|
+
dbPath: string;
|
|
4
|
+
/** Temp directory holding the snapshot; call `releaseDbSnapshot` when done. */
|
|
5
|
+
tempDir: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Snapshot `state.vscdb` (and `-wal`/`-shm` when present) into a temp directory.
|
|
9
|
+
* Returns null when the main DB file does not exist.
|
|
10
|
+
*/
|
|
11
|
+
export declare function snapshotCursorDb(mainDbPath: string): DbSnapshot | null;
|
|
12
|
+
export declare function releaseDbSnapshot(snapshot: DbSnapshot | null): void;
|
|
13
|
+
//# sourceMappingURL=db-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-snapshot.d.ts","sourceRoot":"","sources":["../src/db-snapshot.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CActE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAOnE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Copy Cursor's state.vscdb (+ WAL sidecars) for consistent reads while Cursor is running.
|
|
2
|
+
import { copyFileSync, existsSync, mkdtempSync, rmSync } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { basename, join } from 'node:path';
|
|
5
|
+
/**
|
|
6
|
+
* Snapshot `state.vscdb` (and `-wal`/`-shm` when present) into a temp directory.
|
|
7
|
+
* Returns null when the main DB file does not exist.
|
|
8
|
+
*/
|
|
9
|
+
export function snapshotCursorDb(mainDbPath) {
|
|
10
|
+
if (!existsSync(mainDbPath))
|
|
11
|
+
return null;
|
|
12
|
+
const tempDir = mkdtempSync(join(tmpdir(), 'tracebench-cursor-db-'));
|
|
13
|
+
const base = basename(mainDbPath);
|
|
14
|
+
const dir = join(mainDbPath, '..');
|
|
15
|
+
copyFileSync(mainDbPath, join(tempDir, base));
|
|
16
|
+
const wal = join(dir, `${base}-wal`);
|
|
17
|
+
const shm = join(dir, `${base}-shm`);
|
|
18
|
+
if (existsSync(wal))
|
|
19
|
+
copyFileSync(wal, join(tempDir, `${base}-wal`));
|
|
20
|
+
if (existsSync(shm))
|
|
21
|
+
copyFileSync(shm, join(tempDir, `${base}-shm`));
|
|
22
|
+
return { dbPath: join(tempDir, base), tempDir };
|
|
23
|
+
}
|
|
24
|
+
export function releaseDbSnapshot(snapshot) {
|
|
25
|
+
if (!snapshot)
|
|
26
|
+
return;
|
|
27
|
+
try {
|
|
28
|
+
rmSync(snapshot.tempDir, { recursive: true, force: true });
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// ignore cleanup failures
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=db-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-snapshot.js","sourceRoot":"","sources":["../src/db-snapshot.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAS3C;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAEnC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;IACrE,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;IAErE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAA2B;IAC3D,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,IAAI,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export interface ComposerHeaderEntry {
|
|
2
|
+
type?: string;
|
|
3
|
+
composerId: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
subtitle?: string;
|
|
6
|
+
lastUpdatedAt?: number;
|
|
7
|
+
createdAt?: number;
|
|
8
|
+
unifiedMode?: string;
|
|
9
|
+
isArchived?: boolean;
|
|
10
|
+
workspaceIdentifier?: {
|
|
11
|
+
uri?: {
|
|
12
|
+
fsPath?: string;
|
|
13
|
+
path?: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface ConversationHeader {
|
|
18
|
+
bubbleId: string;
|
|
19
|
+
type: number;
|
|
20
|
+
}
|
|
21
|
+
export interface ComposerDataRow {
|
|
22
|
+
composerId: string;
|
|
23
|
+
name?: string;
|
|
24
|
+
subtitle?: string;
|
|
25
|
+
createdAt?: number;
|
|
26
|
+
lastUpdatedAt?: number;
|
|
27
|
+
unifiedMode?: string;
|
|
28
|
+
status?: string;
|
|
29
|
+
fullConversationHeadersOnly?: ConversationHeader[];
|
|
30
|
+
workspaceIdentifier?: {
|
|
31
|
+
uri?: {
|
|
32
|
+
fsPath?: string;
|
|
33
|
+
path?: string;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
modelConfig?: {
|
|
37
|
+
modelName?: string;
|
|
38
|
+
};
|
|
39
|
+
isArchived?: boolean;
|
|
40
|
+
isDraft?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface CursorBubble {
|
|
43
|
+
bubbleId?: string;
|
|
44
|
+
type?: number;
|
|
45
|
+
text?: string;
|
|
46
|
+
richText?: string;
|
|
47
|
+
createdAt?: string;
|
|
48
|
+
capabilityType?: number;
|
|
49
|
+
thinking?: {
|
|
50
|
+
text?: string;
|
|
51
|
+
};
|
|
52
|
+
thinkingDurationMs?: number;
|
|
53
|
+
modelInfo?: {
|
|
54
|
+
modelName?: string;
|
|
55
|
+
};
|
|
56
|
+
tokenCount?: {
|
|
57
|
+
inputTokens?: number;
|
|
58
|
+
outputTokens?: number;
|
|
59
|
+
};
|
|
60
|
+
toolFormerData?: {
|
|
61
|
+
toolCallId?: string;
|
|
62
|
+
name?: string;
|
|
63
|
+
status?: string;
|
|
64
|
+
rawArgs?: string;
|
|
65
|
+
params?: string;
|
|
66
|
+
result?: string;
|
|
67
|
+
additionalData?: Record<string, unknown>;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=db-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-types.d.ts","sourceRoot":"","sources":["../src/db-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mBAAmB,CAAC,EAAE;QACpB,GAAG,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1C,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2BAA2B,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACnD,mBAAmB,CAAC,EAAE;QACpB,GAAG,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1C,CAAC;IACF,WAAW,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,UAAU,CAAC,EAAE;QACX,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,cAAc,CAAC,EAAE;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC1C,CAAC;CACH"}
|
package/dist/db-types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-types.js","sourceRoot":"","sources":["../src/db-types.ts"],"names":[],"mappings":""}
|
package/dist/db-uri.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Stable raw_path for a Composer session loaded from SQLite. */
|
|
2
|
+
export declare function composerDbUri(composerId: string, globalDbPath: string): string;
|
|
3
|
+
export declare function parseComposerDbUri(rawPath: string): {
|
|
4
|
+
composerId: string;
|
|
5
|
+
globalDbPath: string;
|
|
6
|
+
} | null;
|
|
7
|
+
export declare function isComposerDbUri(rawPath: string): boolean;
|
|
8
|
+
//# sourceMappingURL=db-uri.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-uri.d.ts","sourceRoot":"","sources":["../src/db-uri.ts"],"names":[],"mappings":"AAIA,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,GACd;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASrD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExD"}
|
package/dist/db-uri.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Virtual paths for Composer DB sessions (indexed by tracebench as raw_path).
|
|
2
|
+
const PREFIX = 'cursor-db:';
|
|
3
|
+
/** Stable raw_path for a Composer session loaded from SQLite. */
|
|
4
|
+
export function composerDbUri(composerId, globalDbPath) {
|
|
5
|
+
return `${PREFIX}${composerId}@${globalDbPath}`;
|
|
6
|
+
}
|
|
7
|
+
export function parseComposerDbUri(rawPath) {
|
|
8
|
+
if (!rawPath.startsWith(PREFIX))
|
|
9
|
+
return null;
|
|
10
|
+
const rest = rawPath.slice(PREFIX.length);
|
|
11
|
+
const at = rest.lastIndexOf('@');
|
|
12
|
+
if (at <= 0)
|
|
13
|
+
return null;
|
|
14
|
+
return {
|
|
15
|
+
composerId: rest.slice(0, at),
|
|
16
|
+
globalDbPath: rest.slice(at + 1),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function isComposerDbUri(rawPath) {
|
|
20
|
+
return rawPath.startsWith(PREFIX);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=db-uri.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-uri.js","sourceRoot":"","sources":["../src/db-uri.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAE9E,MAAM,MAAM,GAAG,YAAY,CAAC;AAE5B,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,YAAoB;IACpE,OAAO,GAAG,MAAM,GAAG,UAAU,IAAI,YAAY,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAe;IAEf,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7B,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface DiscoveredComposerSession {
|
|
2
|
+
session_id: string;
|
|
3
|
+
file_path: string;
|
|
4
|
+
global_db_path: string;
|
|
5
|
+
project_path: string | null;
|
|
6
|
+
name: string | null;
|
|
7
|
+
size: number;
|
|
8
|
+
mtime_ms: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function discoverComposerSessions(globalDbPath?: string): DiscoveredComposerSession[];
|
|
11
|
+
//# sourceMappingURL=discover-db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-db.d.ts","sourceRoot":"","sources":["../src/discover-db.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,wBAAwB,CACtC,YAAY,CAAC,EAAE,MAAM,GACpB,yBAAyB,EAAE,CAc7B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Discover Cursor Composer sessions from global state.vscdb.
|
|
2
|
+
import { defaultCursorGlobalDbPath } from './paths.js';
|
|
3
|
+
import { listComposersWithBubbles, cursorDbMtimeMs } from './db-read.js';
|
|
4
|
+
import { composerDbUri } from './db-uri.js';
|
|
5
|
+
export function discoverComposerSessions(globalDbPath) {
|
|
6
|
+
const dbPath = globalDbPath ?? defaultCursorGlobalDbPath();
|
|
7
|
+
const dbMtime = cursorDbMtimeMs(dbPath);
|
|
8
|
+
const composers = listComposersWithBubbles(dbPath);
|
|
9
|
+
return composers.map((c) => ({
|
|
10
|
+
session_id: c.composerId,
|
|
11
|
+
file_path: composerDbUri(c.composerId, dbPath),
|
|
12
|
+
global_db_path: dbPath,
|
|
13
|
+
project_path: c.projectPath,
|
|
14
|
+
name: c.name,
|
|
15
|
+
size: c.bubbleCount,
|
|
16
|
+
mtime_ms: c.lastUpdatedAtMs ?? dbMtime,
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=discover-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-db.js","sourceRoot":"","sources":["../src/discover-db.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAY5C,MAAM,UAAU,wBAAwB,CACtC,YAAqB;IAErB,MAAM,MAAM,GAAG,YAAY,IAAI,yBAAyB,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAEnD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3B,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC;QAC9C,cAAc,EAAE,MAAM;QACtB,YAAY,EAAE,CAAC,CAAC,WAAW;QAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,WAAW;QACnB,QAAQ,EAAE,CAAC,CAAC,eAAe,IAAI,OAAO;KACvC,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/dist/discover.d.ts
CHANGED
|
@@ -5,7 +5,19 @@ export interface DiscoveredCursorSession {
|
|
|
5
5
|
encoded_project_dir: string;
|
|
6
6
|
size: number;
|
|
7
7
|
mtime_ms: number;
|
|
8
|
+
/** Present when loaded from Composer SQLite instead of JSONL. */
|
|
9
|
+
source?: 'jsonl' | 'composer_db';
|
|
8
10
|
}
|
|
9
11
|
export { defaultCursorProjectsRoot as defaultProjectsRoot };
|
|
10
|
-
export
|
|
12
|
+
export interface DiscoverSessionsOptions {
|
|
13
|
+
/** Override ~/.cursor/projects */
|
|
14
|
+
projectsRoot?: string;
|
|
15
|
+
/** Override global state.vscdb path; set to false to skip DB discovery. */
|
|
16
|
+
globalDbPath?: string | false;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Discover agent-transcript JSONL sessions and Composer DB sessions.
|
|
20
|
+
* When the same composerId exists in both, the DB entry wins (richer events).
|
|
21
|
+
*/
|
|
22
|
+
export declare function discoverSessions(rootOrOpts?: string | DiscoverSessionsOptions): DiscoveredCursorSession[];
|
|
11
23
|
//# sourceMappingURL=discover.d.ts.map
|
package/dist/discover.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAGvD,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;CAClC;AAED,OAAO,EAAE,yBAAyB,IAAI,mBAAmB,EAAE,CAAC;AAsC5D,MAAM,WAAW,uBAAuB;IACtC,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC/B;AAoBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,uBAAuB,GAC5C,uBAAuB,EAAE,CAmC3B"}
|
package/dist/discover.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { readdirSync, statSync } from 'node:fs';
|
|
9
9
|
import { join, basename } from 'node:path';
|
|
10
10
|
import { defaultCursorProjectsRoot } from './paths.js';
|
|
11
|
+
import { discoverComposerSessions } from './discover-db.js';
|
|
11
12
|
export { defaultCursorProjectsRoot as defaultProjectsRoot };
|
|
12
13
|
function walkJsonl(dir, encodedProjectDir, out) {
|
|
13
14
|
let entries;
|
|
@@ -43,8 +44,7 @@ function walkJsonl(dir, encodedProjectDir, out) {
|
|
|
43
44
|
});
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
-
const base = root ?? defaultCursorProjectsRoot();
|
|
47
|
+
function discoverJsonlSessions(base) {
|
|
48
48
|
const out = [];
|
|
49
49
|
let projectDirs;
|
|
50
50
|
try {
|
|
@@ -59,7 +59,42 @@ export function discoverSessions(root) {
|
|
|
59
59
|
const transcriptsDir = join(base, dir, 'agent-transcripts');
|
|
60
60
|
walkJsonl(transcriptsDir, dir, out);
|
|
61
61
|
}
|
|
62
|
-
|
|
62
|
+
for (const s of out)
|
|
63
|
+
s.source = 'jsonl';
|
|
63
64
|
return out;
|
|
64
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Discover agent-transcript JSONL sessions and Composer DB sessions.
|
|
68
|
+
* When the same composerId exists in both, the DB entry wins (richer events).
|
|
69
|
+
*/
|
|
70
|
+
export function discoverSessions(rootOrOpts) {
|
|
71
|
+
const opts = typeof rootOrOpts === 'string' ? { projectsRoot: rootOrOpts } : (rootOrOpts ?? {});
|
|
72
|
+
const base = opts.projectsRoot ?? defaultCursorProjectsRoot();
|
|
73
|
+
const jsonl = discoverJsonlSessions(base);
|
|
74
|
+
if (opts.globalDbPath === false) {
|
|
75
|
+
jsonl.sort((a, b) => b.mtime_ms - a.mtime_ms);
|
|
76
|
+
return jsonl;
|
|
77
|
+
}
|
|
78
|
+
let dbSessions = [];
|
|
79
|
+
try {
|
|
80
|
+
dbSessions = discoverComposerSessions(opts.globalDbPath === undefined ? undefined : opts.globalDbPath).map((d) => ({
|
|
81
|
+
session_id: d.session_id,
|
|
82
|
+
file_path: d.file_path,
|
|
83
|
+
encoded_project_dir: '',
|
|
84
|
+
size: d.size,
|
|
85
|
+
mtime_ms: d.mtime_ms,
|
|
86
|
+
source: 'composer_db',
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
dbSessions = [];
|
|
91
|
+
}
|
|
92
|
+
const dbIds = new Set(dbSessions.map((s) => s.session_id));
|
|
93
|
+
const merged = [
|
|
94
|
+
...dbSessions,
|
|
95
|
+
...jsonl.filter((s) => !dbIds.has(s.session_id)),
|
|
96
|
+
];
|
|
97
|
+
merged.sort((a, b) => b.mtime_ms - a.mtime_ms);
|
|
98
|
+
return merged;
|
|
99
|
+
}
|
|
65
100
|
//# sourceMappingURL=discover.js.map
|
package/dist/discover.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,UAAU;AACV,2DAA2D;AAC3D,0DAA0D;AAC1D,4DAA4D;AAC5D,oDAAoD;AAEpD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
|