braindump 0.5.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -22
- package/dist/adapters/claude-code/adapter.d.ts.map +1 -1
- package/dist/adapters/claude-code/adapter.js +30 -3
- package/dist/adapters/claude-code/adapter.js.map +1 -1
- package/dist/adapters/codex/adapter.d.ts +1 -0
- package/dist/adapters/codex/adapter.d.ts.map +1 -1
- package/dist/adapters/codex/adapter.js +27 -0
- package/dist/adapters/codex/adapter.js.map +1 -1
- package/dist/adapters/copilot/adapter.d.ts +29 -0
- package/dist/adapters/copilot/adapter.d.ts.map +1 -0
- package/dist/adapters/copilot/adapter.js +501 -0
- package/dist/adapters/copilot/adapter.js.map +1 -0
- package/dist/adapters/cursor/adapter.d.ts.map +1 -1
- package/dist/adapters/cursor/adapter.js +17 -7
- package/dist/adapters/cursor/adapter.js.map +1 -1
- package/dist/adapters/droid/adapter.d.ts +27 -0
- package/dist/adapters/droid/adapter.d.ts.map +1 -0
- package/dist/adapters/droid/adapter.js +507 -0
- package/dist/adapters/droid/adapter.js.map +1 -0
- package/dist/adapters/gemini/adapter.d.ts +29 -0
- package/dist/adapters/gemini/adapter.d.ts.map +1 -0
- package/dist/adapters/gemini/adapter.js +456 -0
- package/dist/adapters/gemini/adapter.js.map +1 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/opencode/adapter.d.ts +32 -0
- package/dist/adapters/opencode/adapter.d.ts.map +1 -0
- package/dist/adapters/opencode/adapter.js +643 -0
- package/dist/adapters/opencode/adapter.js.map +1 -0
- package/dist/cli/index.js +213 -42
- package/dist/cli/index.js.map +1 -1
- package/dist/core/compression.d.ts.map +1 -1
- package/dist/core/compression.js +12 -0
- package/dist/core/compression.js.map +1 -1
- package/dist/core/launcher.d.ts +20 -0
- package/dist/core/launcher.d.ts.map +1 -0
- package/dist/core/launcher.js +87 -0
- package/dist/core/launcher.js.map +1 -0
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +15 -0
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +48 -0
- package/dist/core/registry.js.map +1 -1
- package/dist/core/session-cache.d.ts +17 -0
- package/dist/core/session-cache.d.ts.map +1 -0
- package/dist/core/session-cache.js +59 -0
- package/dist/core/session-cache.js.map +1 -0
- package/dist/core/tool-summarizer.d.ts +40 -0
- package/dist/core/tool-summarizer.d.ts.map +1 -0
- package/dist/core/tool-summarizer.js +73 -0
- package/dist/core/tool-summarizer.js.map +1 -0
- package/dist/core/validation.d.ts +21 -2
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +6 -1
- package/dist/core/validation.js.map +1 -1
- package/dist/types/index.d.ts +7 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +7 -1
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { createReadStream } from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import readline from "node:readline";
|
|
6
|
+
import { BaseAdapter } from "../base-adapter.js";
|
|
7
|
+
import { analyzeConversation } from "../../core/conversation-analyzer.js";
|
|
8
|
+
import { extractProjectContext } from "../../core/project-context.js";
|
|
9
|
+
import { SummaryCollector } from "../../core/tool-summarizer.js";
|
|
10
|
+
import { validateSession } from "../../core/validation.js";
|
|
11
|
+
export class CopilotAdapter extends BaseAdapter {
|
|
12
|
+
agentId = "copilot";
|
|
13
|
+
get sessionsDir() {
|
|
14
|
+
return path.join(os.homedir(), ".copilot", "session-state");
|
|
15
|
+
}
|
|
16
|
+
async detect() {
|
|
17
|
+
if (!fs.existsSync(this.sessionsDir)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const entries = fs.readdirSync(this.sessionsDir, { withFileTypes: true });
|
|
21
|
+
return entries.some((entry) => {
|
|
22
|
+
if (!entry.isDirectory()) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return fs.existsSync(path.join(this.sessionsDir, entry.name, "workspace.yaml"));
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async listSessions(projectPath) {
|
|
29
|
+
if (!fs.existsSync(this.sessionsDir)) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
const sessions = [];
|
|
33
|
+
const entries = fs.readdirSync(this.sessionsDir, { withFileTypes: true });
|
|
34
|
+
for (const entry of entries) {
|
|
35
|
+
if (!entry.isDirectory()) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const sessionDir = path.join(this.sessionsDir, entry.name);
|
|
39
|
+
const workspace = await this.readWorkspaceYaml(sessionDir);
|
|
40
|
+
if (!workspace) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (projectPath && workspace.workingDirectory) {
|
|
44
|
+
if (!this.pathsEqual(projectPath, workspace.workingDirectory)) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else if (projectPath && !workspace.workingDirectory) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const sessionId = workspace.sessionId || entry.name;
|
|
52
|
+
const eventsPath = path.join(sessionDir, "events.jsonl");
|
|
53
|
+
const messageCount = fs.existsSync(eventsPath)
|
|
54
|
+
? await this.countMessages(eventsPath)
|
|
55
|
+
: 0;
|
|
56
|
+
const startedAt = this.normalizeTimestamp(workspace.createdAt);
|
|
57
|
+
const lastActiveAt = this.normalizeTimestamp(workspace.updatedAt) ??
|
|
58
|
+
this.normalizeTimestampFromMs(fs.statSync(sessionDir).mtimeMs);
|
|
59
|
+
const preview = this.trimPreview(workspace.summary);
|
|
60
|
+
const sortValue = Date.parse(lastActiveAt ?? startedAt ?? "") || 0;
|
|
61
|
+
sessions.push({
|
|
62
|
+
id: sessionId,
|
|
63
|
+
startedAt,
|
|
64
|
+
lastActiveAt,
|
|
65
|
+
messageCount,
|
|
66
|
+
projectPath: workspace.workingDirectory,
|
|
67
|
+
preview,
|
|
68
|
+
sortValue,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
sessions.sort((a, b) => b.sortValue - a.sortValue);
|
|
72
|
+
return sessions.map(({ sortValue, ...session }) => session);
|
|
73
|
+
}
|
|
74
|
+
async capture(sessionId) {
|
|
75
|
+
const sessionDir = await this.findSessionDir(sessionId);
|
|
76
|
+
if (!sessionDir) {
|
|
77
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
78
|
+
}
|
|
79
|
+
const workspace = await this.readWorkspaceYaml(sessionDir);
|
|
80
|
+
if (!workspace) {
|
|
81
|
+
throw new Error(`Missing workspace.yaml for session: ${sessionId}`);
|
|
82
|
+
}
|
|
83
|
+
const messages = [];
|
|
84
|
+
const fileChanges = new Map();
|
|
85
|
+
const collector = new SummaryCollector();
|
|
86
|
+
const extraDecisions = [];
|
|
87
|
+
let totalTokens = 0;
|
|
88
|
+
let sessionStartedAt;
|
|
89
|
+
let lastAssistantMessage = "";
|
|
90
|
+
const eventsPath = path.join(sessionDir, "events.jsonl");
|
|
91
|
+
if (fs.existsSync(eventsPath)) {
|
|
92
|
+
const rl = readline.createInterface({
|
|
93
|
+
input: createReadStream(eventsPath, { encoding: "utf-8" }),
|
|
94
|
+
crlfDelay: Infinity,
|
|
95
|
+
});
|
|
96
|
+
for await (const line of rl) {
|
|
97
|
+
const trimmed = line.trim();
|
|
98
|
+
if (!trimmed) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
let event;
|
|
102
|
+
try {
|
|
103
|
+
event = JSON.parse(trimmed);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const timestamp = this.normalizeTimestamp(event.timestamp);
|
|
109
|
+
if (!sessionStartedAt && timestamp) {
|
|
110
|
+
sessionStartedAt = timestamp;
|
|
111
|
+
}
|
|
112
|
+
totalTokens += this.extractEventTokenCount(event);
|
|
113
|
+
if (event.type === "session.start") {
|
|
114
|
+
const model = this.firstString(event.selectedModel, event.model);
|
|
115
|
+
if (model) {
|
|
116
|
+
extraDecisions.push(`Selected model: ${model}`);
|
|
117
|
+
}
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (event.type === "user.message") {
|
|
121
|
+
const content = this.firstString(event.content, event.transformedContent);
|
|
122
|
+
if (!content) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
messages.push({
|
|
126
|
+
role: "user",
|
|
127
|
+
content,
|
|
128
|
+
timestamp,
|
|
129
|
+
});
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (event.type === "assistant.message") {
|
|
133
|
+
const content = this.firstString(event.content);
|
|
134
|
+
if (content) {
|
|
135
|
+
messages.push({
|
|
136
|
+
role: "assistant",
|
|
137
|
+
content,
|
|
138
|
+
timestamp,
|
|
139
|
+
});
|
|
140
|
+
lastAssistantMessage = content;
|
|
141
|
+
}
|
|
142
|
+
if (!Array.isArray(event.toolRequests)) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
for (const request of event.toolRequests) {
|
|
146
|
+
if (!request || typeof request !== "object") {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const tool = request;
|
|
150
|
+
const toolName = this.firstString(tool.name, tool.toolName, tool.id) || "Tool";
|
|
151
|
+
const args = tool.args ?? tool.arguments ?? tool.input;
|
|
152
|
+
messages.push({
|
|
153
|
+
role: "tool",
|
|
154
|
+
content: this.serializeUnknown(args ?? {}),
|
|
155
|
+
toolName,
|
|
156
|
+
timestamp,
|
|
157
|
+
});
|
|
158
|
+
collector.record(this.summaryName(toolName), this.summarySample(toolName, args));
|
|
159
|
+
const change = this.fileChangeFromTool(toolName, args);
|
|
160
|
+
if (change) {
|
|
161
|
+
fileChanges.set(change.path, change);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (messages.length === 0 && workspace.summary) {
|
|
168
|
+
messages.push({
|
|
169
|
+
role: "assistant",
|
|
170
|
+
content: workspace.summary,
|
|
171
|
+
timestamp: this.normalizeTimestamp(workspace.updatedAt) ||
|
|
172
|
+
this.normalizeTimestamp(workspace.createdAt),
|
|
173
|
+
});
|
|
174
|
+
lastAssistantMessage = workspace.summary;
|
|
175
|
+
}
|
|
176
|
+
const projectPath = workspace.workingDirectory || process.cwd();
|
|
177
|
+
const projectContext = await extractProjectContext(projectPath);
|
|
178
|
+
const analysis = analyzeConversation(messages);
|
|
179
|
+
const decisions = this.unique([...(analysis.decisions || []), ...extraDecisions]);
|
|
180
|
+
const session = {
|
|
181
|
+
version: "1.0",
|
|
182
|
+
source: this.agentId,
|
|
183
|
+
capturedAt: new Date().toISOString(),
|
|
184
|
+
sessionId: workspace.sessionId || path.basename(sessionDir),
|
|
185
|
+
sessionStartedAt,
|
|
186
|
+
project: {
|
|
187
|
+
...projectContext,
|
|
188
|
+
path: projectContext.path || projectPath,
|
|
189
|
+
name: projectContext.name || path.basename(projectPath),
|
|
190
|
+
},
|
|
191
|
+
conversation: {
|
|
192
|
+
messageCount: messages.length,
|
|
193
|
+
estimatedTokens: totalTokens,
|
|
194
|
+
messages,
|
|
195
|
+
},
|
|
196
|
+
filesChanged: Array.from(fileChanges.values()),
|
|
197
|
+
decisions,
|
|
198
|
+
blockers: analysis.blockers,
|
|
199
|
+
task: {
|
|
200
|
+
description: analysis.taskDescription,
|
|
201
|
+
completed: analysis.completedSteps,
|
|
202
|
+
remaining: [],
|
|
203
|
+
inProgress: lastAssistantMessage
|
|
204
|
+
? lastAssistantMessage.slice(0, 200)
|
|
205
|
+
: undefined,
|
|
206
|
+
blockers: analysis.blockers,
|
|
207
|
+
},
|
|
208
|
+
toolActivity: collector.getSummaries(),
|
|
209
|
+
};
|
|
210
|
+
return validateSession(session);
|
|
211
|
+
}
|
|
212
|
+
async captureLatest(projectPath) {
|
|
213
|
+
const sessions = await this.listSessions(projectPath);
|
|
214
|
+
if (sessions.length === 0) {
|
|
215
|
+
throw new Error(projectPath
|
|
216
|
+
? `No Copilot sessions found for project: ${projectPath}`
|
|
217
|
+
: "No Copilot sessions found");
|
|
218
|
+
}
|
|
219
|
+
return this.capture(sessions[0].id);
|
|
220
|
+
}
|
|
221
|
+
async findSessionDir(sessionId) {
|
|
222
|
+
if (!fs.existsSync(this.sessionsDir)) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
const direct = path.join(this.sessionsDir, sessionId);
|
|
226
|
+
if (fs.existsSync(direct) &&
|
|
227
|
+
fs.existsSync(path.join(direct, "workspace.yaml"))) {
|
|
228
|
+
return direct;
|
|
229
|
+
}
|
|
230
|
+
const entries = fs.readdirSync(this.sessionsDir, { withFileTypes: true });
|
|
231
|
+
for (const entry of entries) {
|
|
232
|
+
if (!entry.isDirectory()) {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const sessionDir = path.join(this.sessionsDir, entry.name);
|
|
236
|
+
const workspace = await this.readWorkspaceYaml(sessionDir);
|
|
237
|
+
if (!workspace?.sessionId) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
if (workspace.sessionId === sessionId) {
|
|
241
|
+
return sessionDir;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
async readWorkspaceYaml(sessionDir) {
|
|
247
|
+
const workspacePath = path.join(sessionDir, "workspace.yaml");
|
|
248
|
+
if (!fs.existsSync(workspacePath)) {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
const raw = fs.readFileSync(workspacePath, "utf-8");
|
|
252
|
+
const parsed = await this.parseYaml(raw);
|
|
253
|
+
if (!parsed) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
sessionId: this.firstString(parsed.sessionId),
|
|
258
|
+
repository: this.firstString(parsed.repository),
|
|
259
|
+
branch: this.firstString(parsed.branch),
|
|
260
|
+
workingDirectory: this.firstString(parsed.workingDirectory, parsed.cwd),
|
|
261
|
+
summary: this.firstString(parsed.summary),
|
|
262
|
+
createdAt: this.firstString(parsed.createdAt),
|
|
263
|
+
updatedAt: this.firstString(parsed.updatedAt),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
async parseYaml(input) {
|
|
267
|
+
const yamlPackage = "yaml";
|
|
268
|
+
try {
|
|
269
|
+
const mod = (await import(yamlPackage));
|
|
270
|
+
const parseFn = mod.parse ?? mod.default?.parse;
|
|
271
|
+
if (parseFn) {
|
|
272
|
+
const parsed = parseFn(input);
|
|
273
|
+
if (parsed && typeof parsed === "object") {
|
|
274
|
+
return parsed;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
// Fallback parser below.
|
|
280
|
+
}
|
|
281
|
+
return this.parseSimpleYaml(input);
|
|
282
|
+
}
|
|
283
|
+
parseSimpleYaml(input) {
|
|
284
|
+
const result = {};
|
|
285
|
+
const lines = input.replace(/\r\n/g, "\n").split("\n");
|
|
286
|
+
let blockKey;
|
|
287
|
+
const blockLines = [];
|
|
288
|
+
const flushBlock = () => {
|
|
289
|
+
if (!blockKey) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
result[blockKey] = blockLines.join("\n").trimEnd();
|
|
293
|
+
blockKey = undefined;
|
|
294
|
+
blockLines.length = 0;
|
|
295
|
+
};
|
|
296
|
+
for (const line of lines) {
|
|
297
|
+
if (blockKey) {
|
|
298
|
+
if (/^\s+/.test(line)) {
|
|
299
|
+
blockLines.push(line.replace(/^\s{2}/, ""));
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
flushBlock();
|
|
303
|
+
}
|
|
304
|
+
const trimmed = line.trim();
|
|
305
|
+
if (!trimmed || trimmed.startsWith("#")) {
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
const match = line.match(/^([A-Za-z0-9_]+):\s*(.*)$/);
|
|
309
|
+
if (!match) {
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
const key = match[1];
|
|
313
|
+
const value = match[2];
|
|
314
|
+
if (value === "|") {
|
|
315
|
+
blockKey = key;
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
result[key] = this.stripQuotes(value.trim());
|
|
319
|
+
}
|
|
320
|
+
flushBlock();
|
|
321
|
+
return result;
|
|
322
|
+
}
|
|
323
|
+
stripQuotes(value) {
|
|
324
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
325
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
326
|
+
return value.slice(1, -1);
|
|
327
|
+
}
|
|
328
|
+
return value;
|
|
329
|
+
}
|
|
330
|
+
async countMessages(eventsPath) {
|
|
331
|
+
let count = 0;
|
|
332
|
+
const rl = readline.createInterface({
|
|
333
|
+
input: createReadStream(eventsPath, { encoding: "utf-8" }),
|
|
334
|
+
crlfDelay: Infinity,
|
|
335
|
+
});
|
|
336
|
+
for await (const line of rl) {
|
|
337
|
+
const trimmed = line.trim();
|
|
338
|
+
if (!trimmed) {
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
let event;
|
|
342
|
+
try {
|
|
343
|
+
event = JSON.parse(trimmed);
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (event.type === "user.message" || event.type === "assistant.message") {
|
|
349
|
+
count++;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return count;
|
|
353
|
+
}
|
|
354
|
+
extractEventTokenCount(event) {
|
|
355
|
+
const usage = (event.usage && typeof event.usage === "object" ? event.usage : null) ||
|
|
356
|
+
(event.tokenUsage && typeof event.tokenUsage === "object"
|
|
357
|
+
? event.tokenUsage
|
|
358
|
+
: null);
|
|
359
|
+
if (!usage) {
|
|
360
|
+
return 0;
|
|
361
|
+
}
|
|
362
|
+
const input = this.toNumber(usage.input_tokens ??
|
|
363
|
+
usage.inputTokens ??
|
|
364
|
+
usage.prompt_tokens) || 0;
|
|
365
|
+
const output = this.toNumber(usage.output_tokens ??
|
|
366
|
+
usage.outputTokens ??
|
|
367
|
+
usage.completion_tokens) || 0;
|
|
368
|
+
return input + output;
|
|
369
|
+
}
|
|
370
|
+
summaryName(toolName) {
|
|
371
|
+
const normalized = toolName.toLowerCase();
|
|
372
|
+
if (normalized.includes("write") ||
|
|
373
|
+
normalized.includes("edit") ||
|
|
374
|
+
normalized.includes("patch")) {
|
|
375
|
+
return "Edit";
|
|
376
|
+
}
|
|
377
|
+
if (normalized.includes("read") ||
|
|
378
|
+
normalized.includes("grep") ||
|
|
379
|
+
normalized.includes("glob")) {
|
|
380
|
+
return "Read";
|
|
381
|
+
}
|
|
382
|
+
if (normalized.includes("bash") || normalized.includes("shell")) {
|
|
383
|
+
return "Bash";
|
|
384
|
+
}
|
|
385
|
+
return "Tool";
|
|
386
|
+
}
|
|
387
|
+
summarySample(toolName, args) {
|
|
388
|
+
if (!args || typeof args !== "object") {
|
|
389
|
+
return toolName;
|
|
390
|
+
}
|
|
391
|
+
const input = args;
|
|
392
|
+
const filePath = this.firstString(input.path, input.file_path, input.filePath, input.target);
|
|
393
|
+
const command = this.firstString(input.command);
|
|
394
|
+
if (command) {
|
|
395
|
+
return command;
|
|
396
|
+
}
|
|
397
|
+
if (filePath) {
|
|
398
|
+
return `${toolName} ${filePath}`;
|
|
399
|
+
}
|
|
400
|
+
return toolName;
|
|
401
|
+
}
|
|
402
|
+
fileChangeFromTool(toolNameRaw, input) {
|
|
403
|
+
if (!input || typeof input !== "object") {
|
|
404
|
+
return null;
|
|
405
|
+
}
|
|
406
|
+
const payload = input;
|
|
407
|
+
const filePath = this.firstString(payload.path, payload.file_path, payload.filePath, payload.target);
|
|
408
|
+
if (!filePath) {
|
|
409
|
+
return null;
|
|
410
|
+
}
|
|
411
|
+
const name = toolNameRaw.toLowerCase();
|
|
412
|
+
const changeType = name.includes("create") || name.includes("write")
|
|
413
|
+
? "created"
|
|
414
|
+
: name.includes("delete") || name.includes("remove")
|
|
415
|
+
? "deleted"
|
|
416
|
+
: "modified";
|
|
417
|
+
const diff = this.firstString(payload.content, payload.new_content, payload.patch, payload.diff, payload.command);
|
|
418
|
+
const ext = path.extname(filePath).slice(1);
|
|
419
|
+
return {
|
|
420
|
+
path: filePath,
|
|
421
|
+
changeType,
|
|
422
|
+
diff,
|
|
423
|
+
language: ext || undefined,
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
normalizeTimestamp(value) {
|
|
427
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
428
|
+
return undefined;
|
|
429
|
+
}
|
|
430
|
+
const ts = Date.parse(value);
|
|
431
|
+
if (Number.isNaN(ts)) {
|
|
432
|
+
return undefined;
|
|
433
|
+
}
|
|
434
|
+
return new Date(ts).toISOString();
|
|
435
|
+
}
|
|
436
|
+
normalizeTimestampFromMs(value) {
|
|
437
|
+
if (!Number.isFinite(value)) {
|
|
438
|
+
return undefined;
|
|
439
|
+
}
|
|
440
|
+
return new Date(value).toISOString();
|
|
441
|
+
}
|
|
442
|
+
toNumber(value) {
|
|
443
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
444
|
+
return value;
|
|
445
|
+
}
|
|
446
|
+
if (typeof value === "string") {
|
|
447
|
+
const parsed = Number(value);
|
|
448
|
+
if (Number.isFinite(parsed)) {
|
|
449
|
+
return parsed;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
return undefined;
|
|
453
|
+
}
|
|
454
|
+
firstString(...values) {
|
|
455
|
+
for (const value of values) {
|
|
456
|
+
if (typeof value === "string" && value.trim()) {
|
|
457
|
+
return value.trim();
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return undefined;
|
|
461
|
+
}
|
|
462
|
+
trimPreview(value) {
|
|
463
|
+
if (!value) {
|
|
464
|
+
return undefined;
|
|
465
|
+
}
|
|
466
|
+
const singleLine = value.replace(/\s+/g, " ").trim();
|
|
467
|
+
if (!singleLine) {
|
|
468
|
+
return undefined;
|
|
469
|
+
}
|
|
470
|
+
return singleLine.slice(0, 200);
|
|
471
|
+
}
|
|
472
|
+
serializeUnknown(value) {
|
|
473
|
+
if (typeof value === "string") {
|
|
474
|
+
return value;
|
|
475
|
+
}
|
|
476
|
+
try {
|
|
477
|
+
return JSON.stringify(value);
|
|
478
|
+
}
|
|
479
|
+
catch {
|
|
480
|
+
return String(value);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
pathsEqual(a, b) {
|
|
484
|
+
const normalize = (value) => path.resolve(value).replace(/[\\/]+/g, "/").toLowerCase();
|
|
485
|
+
return normalize(a) === normalize(b);
|
|
486
|
+
}
|
|
487
|
+
unique(values) {
|
|
488
|
+
const seen = new Set();
|
|
489
|
+
const output = [];
|
|
490
|
+
for (const value of values) {
|
|
491
|
+
const trimmed = value.trim();
|
|
492
|
+
if (!trimmed || seen.has(trimmed)) {
|
|
493
|
+
continue;
|
|
494
|
+
}
|
|
495
|
+
seen.add(trimmed);
|
|
496
|
+
output.push(trimmed);
|
|
497
|
+
}
|
|
498
|
+
return output;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/copilot/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/cursor/adapter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/cursor/adapter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKjD,OAAO,KAAK,EACV,OAAO,EACP,eAAe,EAGf,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAE9B;;;GAGG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,EAAE,OAAO,CAAY;IAE5B,OAAO,CAAC,oBAAoB,CAAqB;IACjD,OAAO,CAAC,aAAa,CAA4B;IAEjD,OAAO,KAAK,mBAAmB,GAM9B;IAED;;;OAGG;IACH,OAAO,KAAK,YAAY,GAMvB;IAED,OAAO,CAAC,0BAA0B;IAuClC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAwC3B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IASrB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IA2B1B,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAqH1D,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAmE1D;;OAEG;YACW,iBAAiB;IAoE/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiC7B;;OAEG;YACW,oBAAoB;IAoD5B,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAYnE,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,aAAa;IAcrB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA0F3B,OAAO,CAAC,wBAAwB;IA8ChC,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,+BAA+B;IA0CvC,OAAO,CAAC,yBAAyB;IA2BjC,OAAO,CAAC,kBAAkB;IAiG1B,OAAO,CAAC,qBAAqB;IAkC7B,OAAO,CAAC,WAAW;IA6DnB,OAAO,CAAC,OAAO;IAuBf,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,wBAAwB;IAkBhC,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,oBAAoB;CAc7B"}
|
|
@@ -7,6 +7,7 @@ import { BaseAdapter } from "../base-adapter.js";
|
|
|
7
7
|
import { analyzeConversation } from "../../core/conversation-analyzer.js";
|
|
8
8
|
import { extractProjectContext } from "../../core/project-context.js";
|
|
9
9
|
import { validateSession } from "../../core/validation.js";
|
|
10
|
+
import { SummaryCollector } from "../../core/tool-summarizer.js";
|
|
10
11
|
/**
|
|
11
12
|
* Adapter for Cursor sessions.
|
|
12
13
|
* Reads SQLite databases from workspaceStorage/<hash>/state.vscdb
|
|
@@ -247,24 +248,25 @@ export class CursorAdapter extends BaseAdapter {
|
|
|
247
248
|
const projectPath = this.readWorkspaceProjectPath(workspaceDir) || process.cwd();
|
|
248
249
|
const messages = [];
|
|
249
250
|
const fileChanges = new Map();
|
|
251
|
+
const collector = new SummaryCollector();
|
|
250
252
|
let totalTokens = 0;
|
|
251
253
|
let sessionStartedAt;
|
|
252
254
|
let lastAssistantMessage = "";
|
|
253
255
|
const db = this.openDatabase(dbPath);
|
|
254
256
|
try {
|
|
255
257
|
const bubbleRows = this.readBubbleRows(db, composerId);
|
|
256
|
-
this.collectParsedMessages(bubbleRows.map((r) => r.value), messages, fileChanges, (t) => { totalTokens += t; }, (ts) => { if (!sessionStartedAt)
|
|
258
|
+
this.collectParsedMessages(bubbleRows.map((r) => r.value), messages, fileChanges, collector, (t) => { totalTokens += t; }, (ts) => { if (!sessionStartedAt)
|
|
257
259
|
sessionStartedAt = ts; }, (msg) => { lastAssistantMessage = msg; });
|
|
258
260
|
if (messages.length === 0) {
|
|
259
261
|
const composerData = this.getJsonValue(db, `composerData:${composerId}`);
|
|
260
262
|
const fallbackPayloads = this.extractMessagesFromComposerData(composerData, composerId);
|
|
261
|
-
this.collectParsedMessages(fallbackPayloads, messages, fileChanges, (t) => { totalTokens += t; }, (ts) => { if (!sessionStartedAt)
|
|
263
|
+
this.collectParsedMessages(fallbackPayloads, messages, fileChanges, collector, (t) => { totalTokens += t; }, (ts) => { if (!sessionStartedAt)
|
|
262
264
|
sessionStartedAt = ts; }, (msg) => { lastAssistantMessage = msg; });
|
|
263
265
|
}
|
|
264
266
|
if (messages.length === 0) {
|
|
265
267
|
const legacy = this.getJsonValue(db, "workbench.panel.aichat.view.aichat.chatdata");
|
|
266
268
|
const legacyPayloads = this.extractMessagesFromLegacy(legacy, composerId);
|
|
267
|
-
this.collectParsedMessages(legacyPayloads, messages, fileChanges, (t) => { totalTokens += t; }, (ts) => { if (!sessionStartedAt)
|
|
269
|
+
this.collectParsedMessages(legacyPayloads, messages, fileChanges, collector, (t) => { totalTokens += t; }, (ts) => { if (!sessionStartedAt)
|
|
268
270
|
sessionStartedAt = ts; }, (msg) => { lastAssistantMessage = msg; });
|
|
269
271
|
}
|
|
270
272
|
}
|
|
@@ -275,7 +277,7 @@ export class CursorAdapter extends BaseAdapter {
|
|
|
275
277
|
if (messages.length === 0 && this.globalDbPath) {
|
|
276
278
|
return this.captureFromGlobal(composerId, sessionId, projectPath);
|
|
277
279
|
}
|
|
278
|
-
return this.buildCapturedSession(sessionId, messages, fileChanges, totalTokens, sessionStartedAt, lastAssistantMessage, projectPath);
|
|
280
|
+
return this.buildCapturedSession(sessionId, messages, fileChanges, totalTokens, sessionStartedAt, lastAssistantMessage, projectPath, collector);
|
|
279
281
|
}
|
|
280
282
|
/**
|
|
281
283
|
* Capture a session from the global Cursor DB (cursorDiskKV table).
|
|
@@ -288,6 +290,7 @@ export class CursorAdapter extends BaseAdapter {
|
|
|
288
290
|
const db = this.openDatabase(dbPath);
|
|
289
291
|
const messages = [];
|
|
290
292
|
const fileChanges = new Map();
|
|
293
|
+
const collector = new SummaryCollector();
|
|
291
294
|
let totalTokens = 0;
|
|
292
295
|
let sessionStartedAt;
|
|
293
296
|
let lastAssistantMessage = "";
|
|
@@ -319,6 +322,9 @@ export class CursorAdapter extends BaseAdapter {
|
|
|
319
322
|
}
|
|
320
323
|
for (const tm of parsed.toolMessages) {
|
|
321
324
|
messages.push(tm);
|
|
325
|
+
if (tm.toolName) {
|
|
326
|
+
collector.record(tm.toolName, tm.toolName.toLowerCase());
|
|
327
|
+
}
|
|
322
328
|
}
|
|
323
329
|
for (const fc of parsed.fileChanges) {
|
|
324
330
|
fileChanges.set(fc.path, fc);
|
|
@@ -330,12 +336,12 @@ export class CursorAdapter extends BaseAdapter {
|
|
|
330
336
|
db.close();
|
|
331
337
|
}
|
|
332
338
|
const projectPath = fallbackProjectPath || globalProjectPath || process.cwd();
|
|
333
|
-
return this.buildCapturedSession(sessionId, messages, fileChanges, totalTokens, sessionStartedAt, lastAssistantMessage, projectPath);
|
|
339
|
+
return this.buildCapturedSession(sessionId, messages, fileChanges, totalTokens, sessionStartedAt, lastAssistantMessage, projectPath, collector);
|
|
334
340
|
}
|
|
335
341
|
/**
|
|
336
342
|
* Helper to collect parsed messages from payloads into the output arrays.
|
|
337
343
|
*/
|
|
338
|
-
collectParsedMessages(payloads, messages, fileChanges, addTokens, setStartedAt, setLastAssistant) {
|
|
344
|
+
collectParsedMessages(payloads, messages, fileChanges, collector, addTokens, setStartedAt, setLastAssistant) {
|
|
339
345
|
for (const payload of payloads) {
|
|
340
346
|
const parsed = this.parseCursorPayload(payload);
|
|
341
347
|
if (parsed.message) {
|
|
@@ -349,6 +355,9 @@ export class CursorAdapter extends BaseAdapter {
|
|
|
349
355
|
}
|
|
350
356
|
for (const toolMessage of parsed.toolMessages) {
|
|
351
357
|
messages.push(toolMessage);
|
|
358
|
+
if (toolMessage.toolName) {
|
|
359
|
+
collector.record(toolMessage.toolName, toolMessage.toolName.toLowerCase());
|
|
360
|
+
}
|
|
352
361
|
}
|
|
353
362
|
for (const change of parsed.fileChanges) {
|
|
354
363
|
fileChanges.set(change.path, change);
|
|
@@ -359,7 +368,7 @@ export class CursorAdapter extends BaseAdapter {
|
|
|
359
368
|
/**
|
|
360
369
|
* Build the final CapturedSession object.
|
|
361
370
|
*/
|
|
362
|
-
async buildCapturedSession(sessionId, messages, fileChanges, totalTokens, sessionStartedAt, lastAssistantMessage, projectPath) {
|
|
371
|
+
async buildCapturedSession(sessionId, messages, fileChanges, totalTokens, sessionStartedAt, lastAssistantMessage, projectPath, collector) {
|
|
363
372
|
messages.sort((a, b) => {
|
|
364
373
|
const aTime = a.timestamp || "";
|
|
365
374
|
const bTime = b.timestamp || "";
|
|
@@ -395,6 +404,7 @@ export class CursorAdapter extends BaseAdapter {
|
|
|
395
404
|
: undefined,
|
|
396
405
|
blockers: analysis.blockers,
|
|
397
406
|
},
|
|
407
|
+
toolActivity: collector?.getSummaries(),
|
|
398
408
|
};
|
|
399
409
|
return validateSession(session);
|
|
400
410
|
}
|