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.
Files changed (60) hide show
  1. package/README.md +73 -22
  2. package/dist/adapters/claude-code/adapter.d.ts.map +1 -1
  3. package/dist/adapters/claude-code/adapter.js +30 -3
  4. package/dist/adapters/claude-code/adapter.js.map +1 -1
  5. package/dist/adapters/codex/adapter.d.ts +1 -0
  6. package/dist/adapters/codex/adapter.d.ts.map +1 -1
  7. package/dist/adapters/codex/adapter.js +27 -0
  8. package/dist/adapters/codex/adapter.js.map +1 -1
  9. package/dist/adapters/copilot/adapter.d.ts +29 -0
  10. package/dist/adapters/copilot/adapter.d.ts.map +1 -0
  11. package/dist/adapters/copilot/adapter.js +501 -0
  12. package/dist/adapters/copilot/adapter.js.map +1 -0
  13. package/dist/adapters/cursor/adapter.d.ts.map +1 -1
  14. package/dist/adapters/cursor/adapter.js +17 -7
  15. package/dist/adapters/cursor/adapter.js.map +1 -1
  16. package/dist/adapters/droid/adapter.d.ts +27 -0
  17. package/dist/adapters/droid/adapter.d.ts.map +1 -0
  18. package/dist/adapters/droid/adapter.js +507 -0
  19. package/dist/adapters/droid/adapter.js.map +1 -0
  20. package/dist/adapters/gemini/adapter.d.ts +29 -0
  21. package/dist/adapters/gemini/adapter.d.ts.map +1 -0
  22. package/dist/adapters/gemini/adapter.js +456 -0
  23. package/dist/adapters/gemini/adapter.js.map +1 -0
  24. package/dist/adapters/index.d.ts.map +1 -1
  25. package/dist/adapters/index.js +8 -0
  26. package/dist/adapters/index.js.map +1 -1
  27. package/dist/adapters/opencode/adapter.d.ts +32 -0
  28. package/dist/adapters/opencode/adapter.d.ts.map +1 -0
  29. package/dist/adapters/opencode/adapter.js +643 -0
  30. package/dist/adapters/opencode/adapter.js.map +1 -0
  31. package/dist/cli/index.js +213 -42
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/core/compression.d.ts.map +1 -1
  34. package/dist/core/compression.js +12 -0
  35. package/dist/core/compression.js.map +1 -1
  36. package/dist/core/launcher.d.ts +20 -0
  37. package/dist/core/launcher.d.ts.map +1 -0
  38. package/dist/core/launcher.js +87 -0
  39. package/dist/core/launcher.js.map +1 -0
  40. package/dist/core/prompt-builder.d.ts.map +1 -1
  41. package/dist/core/prompt-builder.js +15 -0
  42. package/dist/core/prompt-builder.js.map +1 -1
  43. package/dist/core/registry.d.ts.map +1 -1
  44. package/dist/core/registry.js +48 -0
  45. package/dist/core/registry.js.map +1 -1
  46. package/dist/core/session-cache.d.ts +17 -0
  47. package/dist/core/session-cache.d.ts.map +1 -0
  48. package/dist/core/session-cache.js +59 -0
  49. package/dist/core/session-cache.js.map +1 -0
  50. package/dist/core/tool-summarizer.d.ts +40 -0
  51. package/dist/core/tool-summarizer.d.ts.map +1 -0
  52. package/dist/core/tool-summarizer.js +73 -0
  53. package/dist/core/tool-summarizer.js.map +1 -0
  54. package/dist/core/validation.d.ts +21 -2
  55. package/dist/core/validation.d.ts.map +1 -1
  56. package/dist/core/validation.js +6 -1
  57. package/dist/core/validation.js.map +1 -1
  58. package/dist/types/index.d.ts +7 -1
  59. package/dist/types/index.d.ts.map +1 -1
  60. 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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAS3D,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC7C,OAAO,GAAY,SAAS,CAAC;IAE7B,IAAY,WAAW;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,EAAE,CAAC,UAAU,CAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAC1D,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,WAAoB;QACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAA+C,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzB,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YAED,IAAI,WAAW,IAAI,SAAS,CAAC,gBAAgB,EAAE,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAC9D,SAAS;gBACX,CAAC;YACH,CAAC;iBAAM,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;gBACtD,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC;YACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;YACzD,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;gBAC5C,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;gBACtC,CAAC,CAAC,CAAC,CAAC;YACN,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/D,MAAM,YAAY,GAChB,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,SAAS,CAAC;gBAC5C,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;YAEjE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,SAAS,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;YAEnE,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,SAAS;gBACb,SAAS;gBACT,YAAY;gBACZ,YAAY;gBACZ,WAAW,EAAE,SAAS,CAAC,gBAAgB;gBACvC,OAAO;gBACP,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,gBAAoC,CAAC;QACzC,IAAI,oBAAoB,GAAG,EAAE,CAAC;QAE9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACzD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;gBAClC,KAAK,EAAE,gBAAgB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;gBAC1D,SAAS,EAAE,QAAQ;aACpB,CAAC,CAAC;YAEH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,SAAS;gBACX,CAAC;gBAED,IAAI,KAAmB,CAAC;gBACxB,IAAI,CAAC;oBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;gBAC9C,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;gBAED,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC3D,IAAI,CAAC,gBAAgB,IAAI,SAAS,EAAE,CAAC;oBACnC,gBAAgB,GAAG,SAAS,CAAC;gBAC/B,CAAC;gBAED,WAAW,IAAI,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;gBAElD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBACnC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oBACjE,IAAI,KAAK,EAAE,CAAC;wBACV,cAAc,CAAC,IAAI,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;oBAClD,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBAClC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAC9B,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,kBAAkB,CACzB,CAAC;oBACF,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,SAAS;oBACX,CAAC;oBACD,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,MAAM;wBACZ,OAAO;wBACP,SAAS;qBACV,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBAED,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;oBACvC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAChD,IAAI,OAAO,EAAE,CAAC;wBACZ,QAAQ,CAAC,IAAI,CAAC;4BACZ,IAAI,EAAE,WAAW;4BACjB,OAAO;4BACP,SAAS;yBACV,CAAC,CAAC;wBACH,oBAAoB,GAAG,OAAO,CAAC;oBACjC,CAAC;oBAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;wBACvC,SAAS;oBACX,CAAC;oBAED,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;wBACzC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;4BAC5C,SAAS;wBACX,CAAC;wBACD,MAAM,IAAI,GAAG,OAAkC,CAAC;wBAChD,MAAM,QAAQ,GACZ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC;wBAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC;wBACvD,QAAQ,CAAC,IAAI,CAAC;4BACZ,IAAI,EAAE,MAAM;4BACZ,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,IAAI,EAAE,CAAC;4BAC1C,QAAQ;4BACR,SAAS;yBACV,CAAC,CAAC;wBAEH,SAAS,CAAC,MAAM,CACd,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAC1B,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CACnC,CAAC;wBAEF,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;wBACvD,IAAI,MAAM,EAAE,CAAC;4BACX,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;wBACvC,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,SAAS,EACP,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,SAAS,CAAC;oBAC5C,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,SAAS,CAAC;aAC/C,CAAC,CAAC;YACH,oBAAoB,GAAG,SAAS,CAAC,OAAO,CAAC;QAC3C,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChE,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;QAElF,MAAM,OAAO,GAAoB;YAC/B,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC3D,gBAAgB;YAChB,OAAO,EAAE;gBACP,GAAG,cAAc;gBACjB,IAAI,EAAE,cAAc,CAAC,IAAI,IAAI,WAAW;gBACxC,IAAI,EAAE,cAAc,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;aACxD;YACD,YAAY,EAAE;gBACZ,YAAY,EAAE,QAAQ,CAAC,MAAM;gBAC7B,eAAe,EAAE,WAAW;gBAC5B,QAAQ;aACT;YACD,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YAC9C,SAAS;YACT,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,IAAI,EAAE;gBACJ,WAAW,EAAE,QAAQ,CAAC,eAAe;gBACrC,SAAS,EAAE,QAAQ,CAAC,cAAc;gBAClC,SAAS,EAAE,EAAE;gBACb,UAAU,EAAE,oBAAoB;oBAC9B,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBACpC,CAAC,CAAC,SAAS;gBACb,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B;YACD,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE;SACvC,CAAC;QAEF,OAAO,eAAe,CAAC,OAAO,CAAoB,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAAoB;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACtD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,WAAW;gBACT,CAAC,CAAC,0CAA0C,WAAW,EAAE;gBACzD,CAAC,CAAC,2BAA2B,CAChC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,SAAiB;QAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACtD,IACE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;YACrB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,EAClD,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzB,SAAS;YACX,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAC3D,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACtC,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,UAAkB;QAElB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC;YAC7C,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC;YAC/C,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;YACvC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC;YACvE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;YACzC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC;YAC7C,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC;SAC9C,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAa;QACnC,MAAM,WAAW,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,CAGrC,CAAC;YACF,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;YAChD,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC9B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACzC,OAAO,MAAiC,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAEO,eAAe,CAAC,KAAa;QACnC,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,QAA4B,CAAC;QACjC,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,MAAM,UAAU,GAAG,GAAG,EAAE;YACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACnD,QAAQ,GAAG,SAAS,CAAC;YACrB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,CAAC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC5C,SAAS;gBACX,CAAC;gBACD,UAAU,EAAE,CAAC;YACf,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;gBAClB,QAAQ,GAAG,GAAG,CAAC;gBACf,SAAS;YACX,CAAC;YAED,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,UAAU,EAAE,CAAC;QACb,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,WAAW,CAAC,KAAa;QAC/B,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;YACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,UAAkB;QAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,gBAAgB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YAC1D,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QAEH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YACD,IAAI,KAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACxE,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,sBAAsB,CAAC,KAAmB;QAChD,MAAM,KAAK,GACT,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YACrE,CAAC,KAAK,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;gBACvD,CAAC,CAAC,KAAK,CAAC,UAAU;gBAClB,CAAC,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,KAAK,GACT,IAAI,CAAC,QAAQ,CACV,KAAiC,CAAC,YAAY;YAC5C,KAAiC,CAAC,WAAW;YAC7C,KAAiC,CAAC,aAAa,CACnD,IAAI,CAAC,CAAC;QACT,MAAM,MAAM,GACV,IAAI,CAAC,QAAQ,CACV,KAAiC,CAAC,aAAa;YAC7C,KAAiC,CAAC,YAAY;YAC9C,KAAiC,CAAC,iBAAiB,CACvD,IAAI,CAAC,CAAC;QACT,OAAO,KAAK,GAAG,MAAM,CAAC;IACxB,CAAC;IAEO,WAAW,CAAC,QAAgB;QAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1C,IACE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5B,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC3B,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC5B,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IACE,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC3B,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC3B,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC3B,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAChE,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,aAAa,CAAC,QAAgB,EAAE,IAAa;QACnD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,GAAG,IAA+B,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAC/B,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,MAAM,CACb,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,kBAAkB,CACxB,WAAmB,EACnB,KAAc;QAEd,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,KAAgC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAC/B,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,MAAM,CACf,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,UAAU,GACd,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC/C,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAClD,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,UAAU,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAC3B,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,OAAO,CAChB,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,IAAI;YACJ,QAAQ,EAAE,GAAG,IAAI,SAAS;SAC3B,CAAC;IACJ,CAAC;IAEO,kBAAkB,CAAC,KAAc;QACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC;IAEO,wBAAwB,CAAC,KAAa;QAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC;IAEO,QAAQ,CAAC,KAAc;QAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,WAAW,CAAC,GAAG,MAAiB;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC9C,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,WAAW,CAAC,KAAyB;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAEO,gBAAgB,CAAC,KAAc;QACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,CAAS,EAAE,CAAS;QACrC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAEO,MAAM,CAAC,MAAgB;QAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,SAAS;YACX,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -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;AAIjD,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;IAkE1D;;OAEG;YACW,iBAAiB;IAgE/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA6B7B;;OAEG;YACW,oBAAoB;IAkD5B,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"}
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
  }