aspectcode 0.3.3 → 0.3.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.
Files changed (87) hide show
  1. package/dist/config.d.ts +11 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js.map +1 -1
  4. package/dist/main.d.ts.map +1 -1
  5. package/dist/main.js +2 -0
  6. package/dist/main.js.map +1 -1
  7. package/dist/optimize.d.ts +1 -0
  8. package/dist/optimize.d.ts.map +1 -1
  9. package/dist/optimize.js +81 -2
  10. package/dist/optimize.js.map +1 -1
  11. package/dist/pipeline.d.ts.map +1 -1
  12. package/dist/pipeline.js +4 -0
  13. package/dist/pipeline.js.map +1 -1
  14. package/dist/ui/Dashboard.d.ts +5 -2
  15. package/dist/ui/Dashboard.d.ts.map +1 -1
  16. package/dist/ui/Dashboard.js +77 -17
  17. package/dist/ui/Dashboard.js.map +1 -1
  18. package/dist/ui/store.d.ts +20 -1
  19. package/dist/ui/store.d.ts.map +1 -1
  20. package/dist/ui/store.js +16 -0
  21. package/dist/ui/store.js.map +1 -1
  22. package/dist/ui/theme.d.ts +3 -3
  23. package/dist/ui/theme.js +3 -3
  24. package/dist/ui/theme.js.map +1 -1
  25. package/node_modules/@aspectcode/core/package.json +0 -3
  26. package/node_modules/@aspectcode/emitters/package.json +1 -4
  27. package/node_modules/@aspectcode/evaluator/dist/diagnosis.d.ts +33 -0
  28. package/node_modules/@aspectcode/evaluator/dist/diagnosis.d.ts.map +1 -0
  29. package/node_modules/@aspectcode/evaluator/dist/diagnosis.js +172 -0
  30. package/node_modules/@aspectcode/evaluator/dist/diagnosis.js.map +1 -0
  31. package/node_modules/@aspectcode/evaluator/dist/harvest/aider.d.ts +23 -0
  32. package/node_modules/@aspectcode/evaluator/dist/harvest/aider.d.ts.map +1 -0
  33. package/node_modules/@aspectcode/evaluator/dist/harvest/aider.js +125 -0
  34. package/node_modules/@aspectcode/evaluator/dist/harvest/aider.js.map +1 -0
  35. package/node_modules/@aspectcode/evaluator/dist/harvest/claudeCode.d.ts +17 -0
  36. package/node_modules/@aspectcode/evaluator/dist/harvest/claudeCode.d.ts.map +1 -0
  37. package/node_modules/@aspectcode/evaluator/dist/harvest/claudeCode.js +223 -0
  38. package/node_modules/@aspectcode/evaluator/dist/harvest/claudeCode.js.map +1 -0
  39. package/node_modules/@aspectcode/evaluator/dist/harvest/cline.d.ts +17 -0
  40. package/node_modules/@aspectcode/evaluator/dist/harvest/cline.d.ts.map +1 -0
  41. package/node_modules/@aspectcode/evaluator/dist/harvest/cline.js +179 -0
  42. package/node_modules/@aspectcode/evaluator/dist/harvest/cline.js.map +1 -0
  43. package/node_modules/@aspectcode/evaluator/dist/harvest/common.d.ts +39 -0
  44. package/node_modules/@aspectcode/evaluator/dist/harvest/common.d.ts.map +1 -0
  45. package/node_modules/@aspectcode/evaluator/dist/harvest/common.js +170 -0
  46. package/node_modules/@aspectcode/evaluator/dist/harvest/common.js.map +1 -0
  47. package/node_modules/@aspectcode/evaluator/dist/harvest/export.d.ts +23 -0
  48. package/node_modules/@aspectcode/evaluator/dist/harvest/export.d.ts.map +1 -0
  49. package/node_modules/@aspectcode/evaluator/dist/harvest/export.js +98 -0
  50. package/node_modules/@aspectcode/evaluator/dist/harvest/export.js.map +1 -0
  51. package/node_modules/@aspectcode/evaluator/dist/harvest/index.d.ts +29 -0
  52. package/node_modules/@aspectcode/evaluator/dist/harvest/index.d.ts.map +1 -0
  53. package/node_modules/@aspectcode/evaluator/dist/harvest/index.js +94 -0
  54. package/node_modules/@aspectcode/evaluator/dist/harvest/index.js.map +1 -0
  55. package/node_modules/@aspectcode/evaluator/dist/harvest/vscodeDb.d.ts +37 -0
  56. package/node_modules/@aspectcode/evaluator/dist/harvest/vscodeDb.d.ts.map +1 -0
  57. package/node_modules/@aspectcode/evaluator/dist/harvest/vscodeDb.js +473 -0
  58. package/node_modules/@aspectcode/evaluator/dist/harvest/vscodeDb.js.map +1 -0
  59. package/node_modules/@aspectcode/evaluator/dist/index.d.ts +48 -0
  60. package/node_modules/@aspectcode/evaluator/dist/index.d.ts.map +1 -0
  61. package/node_modules/@aspectcode/evaluator/dist/index.js +75 -0
  62. package/node_modules/@aspectcode/evaluator/dist/index.js.map +1 -0
  63. package/node_modules/@aspectcode/evaluator/dist/probes.d.ts +38 -0
  64. package/node_modules/@aspectcode/evaluator/dist/probes.d.ts.map +1 -0
  65. package/node_modules/@aspectcode/evaluator/dist/probes.js +229 -0
  66. package/node_modules/@aspectcode/evaluator/dist/probes.js.map +1 -0
  67. package/node_modules/@aspectcode/evaluator/dist/runner.d.ts +34 -0
  68. package/node_modules/@aspectcode/evaluator/dist/runner.d.ts.map +1 -0
  69. package/node_modules/@aspectcode/evaluator/dist/runner.js +183 -0
  70. package/node_modules/@aspectcode/evaluator/dist/runner.js.map +1 -0
  71. package/node_modules/@aspectcode/evaluator/dist/types.d.ts +176 -0
  72. package/node_modules/@aspectcode/evaluator/dist/types.d.ts.map +1 -0
  73. package/node_modules/@aspectcode/evaluator/dist/types.js +9 -0
  74. package/node_modules/@aspectcode/evaluator/dist/types.js.map +1 -0
  75. package/node_modules/@aspectcode/evaluator/package.json +41 -0
  76. package/node_modules/@aspectcode/optimizer/dist/agent.d.ts +10 -7
  77. package/node_modules/@aspectcode/optimizer/dist/agent.d.ts.map +1 -1
  78. package/node_modules/@aspectcode/optimizer/dist/agent.js +13 -9
  79. package/node_modules/@aspectcode/optimizer/dist/agent.js.map +1 -1
  80. package/node_modules/@aspectcode/optimizer/dist/prompts.d.ts.map +1 -1
  81. package/node_modules/@aspectcode/optimizer/dist/prompts.js +26 -15
  82. package/node_modules/@aspectcode/optimizer/dist/prompts.js.map +1 -1
  83. package/node_modules/@aspectcode/optimizer/dist/types.d.ts +6 -0
  84. package/node_modules/@aspectcode/optimizer/dist/types.d.ts.map +1 -1
  85. package/node_modules/@aspectcode/optimizer/dist/types.js.map +1 -1
  86. package/node_modules/@aspectcode/optimizer/package.json +1 -4
  87. package/package.json +6 -3
@@ -0,0 +1,473 @@
1
+ "use strict";
2
+ /**
3
+ * SQLite-based prompt harvester for VS Code forks (Copilot Chat, Cursor, Windsurf).
4
+ *
5
+ * All three store conversations in `state.vscdb` — a SQLite database with an
6
+ * `ItemTable(key TEXT, value TEXT)` key-value schema. The difference is which
7
+ * keys hold the conversation data and the JSON shape within.
8
+ *
9
+ * `better-sqlite3` is an optional dependency. If unavailable, these
10
+ * harvesters gracefully return empty arrays.
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.harvestCopilotChat = harvestCopilotChat;
47
+ exports.harvestCursor = harvestCursor;
48
+ exports.harvestWindsurf = harvestWindsurf;
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ const os = __importStar(require("os"));
52
+ const common_1 = require("./common");
53
+ // ── SQLite availability check ───────────────────────────────
54
+ let Database;
55
+ function loadSqlite() {
56
+ if (Database !== undefined)
57
+ return Database !== null;
58
+ try {
59
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
60
+ Database = require('better-sqlite3');
61
+ return true;
62
+ }
63
+ catch {
64
+ Database = null;
65
+ return false;
66
+ }
67
+ }
68
+ /**
69
+ * Read a key from a state.vscdb file. Returns undefined if the key
70
+ * doesn't exist or the DB can't be opened.
71
+ */
72
+ function readVscdbKey(dbPath, key) {
73
+ if (!loadSqlite() || !fs.existsSync(dbPath))
74
+ return undefined;
75
+ let db;
76
+ try {
77
+ db = new Database(dbPath, { readonly: true, fileMustExist: true });
78
+ const row = db.prepare('SELECT value FROM ItemTable WHERE key = ?').get(key);
79
+ return row?.value ?? undefined;
80
+ }
81
+ catch {
82
+ return undefined;
83
+ }
84
+ finally {
85
+ db?.close();
86
+ }
87
+ }
88
+ /**
89
+ * Read ALL keys matching a pattern from a state.vscdb file.
90
+ */
91
+ function readVscdbKeysLike(dbPath, pattern) {
92
+ if (!loadSqlite() || !fs.existsSync(dbPath))
93
+ return [];
94
+ let db;
95
+ try {
96
+ db = new Database(dbPath, { readonly: true, fileMustExist: true });
97
+ return db.prepare('SELECT key, value FROM ItemTable WHERE key LIKE ?').all(pattern);
98
+ }
99
+ catch {
100
+ return [];
101
+ }
102
+ finally {
103
+ db?.close();
104
+ }
105
+ }
106
+ // ── Copilot Chat ────────────────────────────────────────────
107
+ /**
108
+ * Harvest prompts from GitHub Copilot Chat conversations.
109
+ */
110
+ async function harvestCopilotChat(root, options) {
111
+ const log = options?.log ?? common_1.noopLogger;
112
+ const max = options?.max ?? common_1.DEFAULT_MAX_PER_SOURCE;
113
+ if (!loadSqlite()) {
114
+ log.debug('copilot-chat: better-sqlite3 not available, skipping');
115
+ return [];
116
+ }
117
+ const prompts = [];
118
+ // Strategy 1: Check workspace storage state.vscdb files
119
+ const wsStorageBase = (0, common_1.vscodeWorkspaceStoragePath)();
120
+ if (fs.existsSync(wsStorageBase)) {
121
+ try {
122
+ const workspaces = fs.readdirSync(wsStorageBase);
123
+ for (const ws of workspaces) {
124
+ const dbPath = path.join(wsStorageBase, ws, 'state.vscdb');
125
+ const parsed = parseCopilotFromVscdb(dbPath, root, log);
126
+ prompts.push(...parsed);
127
+ }
128
+ }
129
+ catch (err) {
130
+ log.debug(`copilot-chat: failed scanning workspace storage: ${err}`);
131
+ }
132
+ }
133
+ // Strategy 2: Check older extension-based storage
134
+ const globalStorageDir = path.join(getVscodeDataDir(), 'User', 'globalStorage', 'github.copilot-chat');
135
+ const conversationsFile = path.join(globalStorageDir, 'conversations.json');
136
+ if (fs.existsSync(conversationsFile)) {
137
+ try {
138
+ const content = fs.readFileSync(conversationsFile, 'utf-8');
139
+ const data = JSON.parse(content);
140
+ const parsed = parseCopilotConversationsJson(data, root);
141
+ prompts.push(...parsed);
142
+ }
143
+ catch (err) {
144
+ log.debug(`copilot-chat: failed parsing conversations.json: ${err}`);
145
+ }
146
+ }
147
+ log.debug(`copilot-chat: parsed ${prompts.length} conversation turns`);
148
+ return (0, common_1.filterRecent)(prompts, options?.since, max);
149
+ }
150
+ function parseCopilotFromVscdb(dbPath, root, _log) {
151
+ // Try known keys for chat sessions
152
+ const keyPatterns = ['interactive.sessions', 'chat.workspaceState', '%chat%'];
153
+ const prompts = [];
154
+ for (const pattern of keyPatterns) {
155
+ let rows;
156
+ if (pattern.includes('%')) {
157
+ rows = readVscdbKeysLike(dbPath, pattern);
158
+ }
159
+ else {
160
+ const value = readVscdbKey(dbPath, pattern);
161
+ rows = value ? [{ key: pattern, value }] : [];
162
+ }
163
+ for (const row of rows) {
164
+ try {
165
+ const data = JSON.parse(row.value);
166
+ const parsed = parseCopilotSessionData(data, root);
167
+ prompts.push(...parsed);
168
+ }
169
+ catch {
170
+ // Unparseable value, skip
171
+ }
172
+ }
173
+ }
174
+ return prompts;
175
+ }
176
+ function parseCopilotSessionData(data, root) {
177
+ const prompts = [];
178
+ // Handle array of sessions or single session
179
+ const sessions = Array.isArray(data) ? data : [data];
180
+ for (const session of sessions) {
181
+ const requests = session.requests || session.entries || [];
182
+ for (const req of requests) {
183
+ const userText = req.message || req.text || req.prompt || '';
184
+ const assistantText = req.response?.value || req.response?.text || req.result?.text || '';
185
+ if (!userText || !assistantText)
186
+ continue;
187
+ const fileRefs = [];
188
+ if (Array.isArray(req.references)) {
189
+ for (const ref of req.references) {
190
+ if (ref.uri && typeof ref.uri === 'string') {
191
+ // Extract path from file:// URI
192
+ const filePath = ref.uri.replace(/^file:\/\/\//, '').replace(/\\/g, '/');
193
+ fileRefs.push(filePath);
194
+ }
195
+ }
196
+ }
197
+ const allText = userText + '\n' + assistantText;
198
+ prompts.push({
199
+ source: 'copilot-chat',
200
+ timestamp: req.timestamp ? new Date(req.timestamp).toISOString() : undefined,
201
+ userPrompt: userText,
202
+ assistantResponse: assistantText,
203
+ filesReferenced: [...new Set([...(0, common_1.extractFilePaths)(allText, root), ...fileRefs])],
204
+ });
205
+ }
206
+ }
207
+ return prompts;
208
+ }
209
+ function parseCopilotConversationsJson(data, root) {
210
+ // Older format: { sessions: [{ requests: [...] }] } or just an array
211
+ if (data.sessions)
212
+ return parseCopilotSessionData(data.sessions, root);
213
+ if (Array.isArray(data))
214
+ return parseCopilotSessionData(data, root);
215
+ return [];
216
+ }
217
+ // ── Cursor ──────────────────────────────────────────────────
218
+ /**
219
+ * Harvest prompts from Cursor's conversation history.
220
+ */
221
+ async function harvestCursor(root, options) {
222
+ const log = options?.log ?? common_1.noopLogger;
223
+ const max = options?.max ?? common_1.DEFAULT_MAX_PER_SOURCE;
224
+ if (!loadSqlite()) {
225
+ log.debug('cursor: better-sqlite3 not available, skipping');
226
+ return [];
227
+ }
228
+ const [globalDb, wsStorageBase] = (0, common_1.vscodeForkStoragePaths)('Cursor');
229
+ const prompts = [];
230
+ // Check global state.vscdb
231
+ const globalParsed = parseCursorDb(globalDb, root, log);
232
+ prompts.push(...globalParsed);
233
+ // Check workspace storage state.vscdb files
234
+ if (fs.existsSync(wsStorageBase)) {
235
+ try {
236
+ const workspaces = fs.readdirSync(wsStorageBase);
237
+ for (const ws of workspaces) {
238
+ const dbPath = path.join(wsStorageBase, ws, 'state.vscdb');
239
+ const parsed = parseCursorDb(dbPath, root, log);
240
+ prompts.push(...parsed);
241
+ }
242
+ }
243
+ catch (err) {
244
+ log.debug(`cursor: failed scanning workspace storage: ${err}`);
245
+ }
246
+ }
247
+ log.debug(`cursor: parsed ${prompts.length} conversation turns`);
248
+ return (0, common_1.filterRecent)(prompts, options?.since, max);
249
+ }
250
+ function parseCursorDb(dbPath, root, log) {
251
+ const prompts = [];
252
+ // Try known keys for Cursor chat data
253
+ const chatKeys = ['composerData', 'aiChat.panelChats', 'workbench.panel.chat'];
254
+ for (const key of chatKeys) {
255
+ const value = readVscdbKey(dbPath, key);
256
+ if (!value)
257
+ continue;
258
+ try {
259
+ const data = JSON.parse(value);
260
+ if (key === 'composerData') {
261
+ prompts.push(...parseCursorComposer(data, root));
262
+ }
263
+ else {
264
+ prompts.push(...parseCursorPanelChats(data, root));
265
+ }
266
+ }
267
+ catch (err) {
268
+ log.debug(`cursor: failed parsing key ${key}: ${err}`);
269
+ }
270
+ }
271
+ return prompts;
272
+ }
273
+ function parseCursorComposer(data, root) {
274
+ const prompts = [];
275
+ const composers = data.allComposers || data.composers || [];
276
+ for (const composer of composers) {
277
+ const conversation = composer.conversation || [];
278
+ for (let i = 0; i < conversation.length; i++) {
279
+ const msg = conversation[i];
280
+ // type 1 = user, type 2 = assistant
281
+ if (msg.type !== 1)
282
+ continue;
283
+ const next = conversation[i + 1];
284
+ if (!next || next.type !== 2)
285
+ continue;
286
+ const userText = msg.text || '';
287
+ const assistantText = next.text || '';
288
+ if (!userText || !assistantText)
289
+ continue;
290
+ const fileRefs = extractCursorContextFiles(msg.context);
291
+ const allText = userText + '\n' + assistantText;
292
+ prompts.push({
293
+ source: 'cursor',
294
+ userPrompt: userText,
295
+ assistantResponse: assistantText,
296
+ filesReferenced: [...new Set([...(0, common_1.extractFilePaths)(allText, root), ...fileRefs])],
297
+ });
298
+ i++; // Skip the assistant message
299
+ }
300
+ }
301
+ return prompts;
302
+ }
303
+ function parseCursorPanelChats(data, root) {
304
+ const prompts = [];
305
+ const panels = data.panelChats || data.chats || [];
306
+ for (const panel of panels) {
307
+ if (panel.isDeleted)
308
+ continue;
309
+ const messages = panel.messages || [];
310
+ for (let i = 0; i < messages.length; i++) {
311
+ const msg = messages[i];
312
+ if (msg.role !== 'user')
313
+ continue;
314
+ const next = messages[i + 1];
315
+ if (!next || next.role !== 'assistant')
316
+ continue;
317
+ const userText = msg.content || '';
318
+ const assistantText = next.content || '';
319
+ if (!userText || !assistantText)
320
+ continue;
321
+ const fileRefs = extractCursorContextFiles(next.context);
322
+ const timestamp = msg.timestamp
323
+ ? new Date(msg.timestamp).toISOString()
324
+ : undefined;
325
+ const allText = userText + '\n' + assistantText;
326
+ prompts.push({
327
+ source: 'cursor',
328
+ timestamp,
329
+ userPrompt: userText,
330
+ assistantResponse: assistantText,
331
+ filesReferenced: [...new Set([...(0, common_1.extractFilePaths)(allText, root), ...fileRefs])],
332
+ });
333
+ i++; // Skip the assistant message
334
+ }
335
+ }
336
+ return prompts;
337
+ }
338
+ function extractCursorContextFiles(context) {
339
+ if (!context)
340
+ return [];
341
+ const files = [];
342
+ if (Array.isArray(context.files)) {
343
+ for (const f of context.files) {
344
+ if (typeof f === 'string')
345
+ files.push(f.replace(/\\/g, '/'));
346
+ }
347
+ }
348
+ if (Array.isArray(context.selections)) {
349
+ for (const s of context.selections) {
350
+ if (s.uri && typeof s.uri === 'string') {
351
+ files.push(s.uri.replace(/^file:\/\/\//, '').replace(/\\/g, '/'));
352
+ }
353
+ }
354
+ }
355
+ return files;
356
+ }
357
+ // ── Windsurf ────────────────────────────────────────────────
358
+ /**
359
+ * Harvest prompts from Windsurf's conversation history.
360
+ */
361
+ async function harvestWindsurf(root, options) {
362
+ const log = options?.log ?? common_1.noopLogger;
363
+ const max = options?.max ?? common_1.DEFAULT_MAX_PER_SOURCE;
364
+ if (!loadSqlite()) {
365
+ log.debug('windsurf: better-sqlite3 not available, skipping');
366
+ return [];
367
+ }
368
+ const prompts = [];
369
+ // Try both "Windsurf" and "Codeium" (legacy name)
370
+ for (const appName of ['Windsurf', 'Codeium']) {
371
+ const [globalDb, wsStorageBase] = (0, common_1.vscodeForkStoragePaths)(appName);
372
+ // Check global state.vscdb
373
+ const globalParsed = parseWindsurfDb(globalDb, root, log);
374
+ prompts.push(...globalParsed);
375
+ // Check workspace storage
376
+ if (fs.existsSync(wsStorageBase)) {
377
+ try {
378
+ const workspaces = fs.readdirSync(wsStorageBase);
379
+ for (const ws of workspaces) {
380
+ const dbPath = path.join(wsStorageBase, ws, 'state.vscdb');
381
+ const parsed = parseWindsurfDb(dbPath, root, log);
382
+ prompts.push(...parsed);
383
+ }
384
+ }
385
+ catch (err) {
386
+ log.debug(`windsurf: failed scanning ${appName} workspace storage: ${err}`);
387
+ }
388
+ }
389
+ }
390
+ log.debug(`windsurf: parsed ${prompts.length} conversation turns`);
391
+ return (0, common_1.filterRecent)(prompts, options?.since, max);
392
+ }
393
+ function parseWindsurfDb(dbPath, root, log) {
394
+ const prompts = [];
395
+ // Try known keys for Windsurf/Cascade conversations
396
+ const candidates = ['cascadeHistory', 'cascade.conversations'];
397
+ for (const key of candidates) {
398
+ const value = readVscdbKey(dbPath, key);
399
+ if (!value)
400
+ continue;
401
+ try {
402
+ const data = JSON.parse(value);
403
+ prompts.push(...parseWindsurfConversations(data, root));
404
+ }
405
+ catch (err) {
406
+ log.debug(`windsurf: failed parsing key ${key}: ${err}`);
407
+ }
408
+ }
409
+ // Also try LIKE query for cascade-related keys
410
+ const likeRows = readVscdbKeysLike(dbPath, '%cascade%');
411
+ for (const row of likeRows) {
412
+ if (candidates.includes(row.key))
413
+ continue; // Already tried
414
+ try {
415
+ const data = JSON.parse(row.value);
416
+ prompts.push(...parseWindsurfConversations(data, root));
417
+ }
418
+ catch {
419
+ // Skip unparseable
420
+ }
421
+ }
422
+ return prompts;
423
+ }
424
+ function parseWindsurfConversations(data, root) {
425
+ const prompts = [];
426
+ // Try multiple possible structures
427
+ const conversations = data.conversations || data.chats || (Array.isArray(data) ? data : [data]);
428
+ for (const conv of conversations) {
429
+ const messages = conv.messages || conv.turns || [];
430
+ for (let i = 0; i < messages.length; i++) {
431
+ const msg = messages[i];
432
+ if (msg.role !== 'user')
433
+ continue;
434
+ const next = messages[i + 1];
435
+ if (!next || next.role !== 'assistant')
436
+ continue;
437
+ const userText = msg.content || msg.text || '';
438
+ const assistantText = next.content || next.text || '';
439
+ if (!userText || !assistantText)
440
+ continue;
441
+ const allText = userText + '\n' + assistantText;
442
+ const timestamp = msg.timestamp
443
+ ? (typeof msg.timestamp === 'number'
444
+ ? new Date(msg.timestamp).toISOString()
445
+ : msg.timestamp)
446
+ : undefined;
447
+ prompts.push({
448
+ source: 'windsurf',
449
+ timestamp,
450
+ userPrompt: userText,
451
+ assistantResponse: assistantText,
452
+ filesReferenced: (0, common_1.extractFilePaths)(allText, root),
453
+ });
454
+ i++; // Skip the assistant message
455
+ }
456
+ }
457
+ return prompts;
458
+ }
459
+ // ── Helpers ─────────────────────────────────────────────────
460
+ function getVscodeDataDir() {
461
+ const platform = os.platform();
462
+ const home = os.homedir();
463
+ if (platform === 'win32') {
464
+ return path.join(process.env.APPDATA || path.join(home, 'AppData', 'Roaming'), 'Code');
465
+ }
466
+ else if (platform === 'darwin') {
467
+ return path.join(home, 'Library', 'Application Support', 'Code');
468
+ }
469
+ else {
470
+ return path.join(home, '.config', 'Code');
471
+ }
472
+ }
473
+ //# sourceMappingURL=vscodeDb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscodeDb.js","sourceRoot":"","sources":["../../src/harvest/vscodeDb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @aspectcode/evaluator — Evidence-based evaluation for AGENTS.md optimization.
3
+ *
4
+ * Replaces arbitrary LLM self-scoring with:
5
+ * 1. Probe-based micro-tests scoped to the knowledge base
6
+ * 2. Prompt history harvesting from AI coding tools
7
+ * 3. Evidence-driven diagnosis and AGENTS.md improvement
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { generateProbes, runProbes, diagnose, harvestPrompts } from '@aspectcode/evaluator';
12
+ *
13
+ * const harvested = await harvestPrompts({ root });
14
+ * const probes = generateProbes({ kb, harvestedPrompts: harvested });
15
+ * const results = await runProbes({ agentsContent, probes, provider });
16
+ * const failures = results.filter(r => !r.passed);
17
+ * if (failures.length > 0) {
18
+ * const diagnosis = await diagnose({ failures, agentsContent, provider });
19
+ * }
20
+ * ```
21
+ */
22
+ export type { Probe, ProbeCategory, ProbeResult, BehaviorResult, Diagnosis, AgentsEdit, HarvestedPrompt, PromptSource, ProbeGeneratorOptions, ProbeRunnerOptions, ProbeEvaluatorOptions, DiagnosisOptions, HarvestOptions, EvaluationResult, LlmProvider, OptLogger, } from './types';
23
+ export { generateProbes } from './probes';
24
+ export { runProbes } from './runner';
25
+ export { diagnose, applyDiagnosisEdits } from './diagnosis';
26
+ export { harvestPrompts, harvestAider, harvestClaudeCode, harvestCline, harvestCopilotChat, harvestCursor, harvestWindsurf, harvestExport, } from './harvest/index';
27
+ import type { EvaluationResult, ProbeRunnerOptions, DiagnosisOptions, ProbeGeneratorOptions } from './types';
28
+ /**
29
+ * Run the full evaluation pipeline: generate probes → run them → diagnose failures.
30
+ *
31
+ * This is a convenience function combining the individual steps.
32
+ * For more control, use the individual functions directly.
33
+ */
34
+ export declare function evaluate(options: {
35
+ /** Probe generation options. */
36
+ probeOptions: ProbeGeneratorOptions;
37
+ /** Current AGENTS.md content. */
38
+ agentsContent: string;
39
+ /** LLM provider for probe execution and diagnosis. */
40
+ provider: ProbeRunnerOptions['provider'];
41
+ /** File contents for context. */
42
+ fileContents?: ReadonlyMap<string, string>;
43
+ /** Logger. */
44
+ log?: DiagnosisOptions['log'];
45
+ /** Abort signal. */
46
+ signal?: AbortSignal;
47
+ }): Promise<EvaluationResult>;
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,YAAY,EACV,KAAK,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,eAAe,EACf,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,SAAS,GACV,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,EACL,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,aAAa,GACd,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAK7G;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IACtC,gCAAgC;IAChC,YAAY,EAAE,qBAAqB,CAAC;IACpC,iCAAiC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACzC,iCAAiC;IACjC,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,cAAc;IACd,GAAG,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC9B,oBAAoB;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqC5B"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ /**
3
+ * @aspectcode/evaluator — Evidence-based evaluation for AGENTS.md optimization.
4
+ *
5
+ * Replaces arbitrary LLM self-scoring with:
6
+ * 1. Probe-based micro-tests scoped to the knowledge base
7
+ * 2. Prompt history harvesting from AI coding tools
8
+ * 3. Evidence-driven diagnosis and AGENTS.md improvement
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { generateProbes, runProbes, diagnose, harvestPrompts } from '@aspectcode/evaluator';
13
+ *
14
+ * const harvested = await harvestPrompts({ root });
15
+ * const probes = generateProbes({ kb, harvestedPrompts: harvested });
16
+ * const results = await runProbes({ agentsContent, probes, provider });
17
+ * const failures = results.filter(r => !r.passed);
18
+ * if (failures.length > 0) {
19
+ * const diagnosis = await diagnose({ failures, agentsContent, provider });
20
+ * }
21
+ * ```
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.harvestExport = exports.harvestWindsurf = exports.harvestCursor = exports.harvestCopilotChat = exports.harvestCline = exports.harvestClaudeCode = exports.harvestAider = exports.harvestPrompts = exports.applyDiagnosisEdits = exports.diagnose = exports.runProbes = exports.generateProbes = void 0;
25
+ exports.evaluate = evaluate;
26
+ // ── Probe generation ────────────────────────────────────────
27
+ var probes_1 = require("./probes");
28
+ Object.defineProperty(exports, "generateProbes", { enumerable: true, get: function () { return probes_1.generateProbes; } });
29
+ // ── Probe execution ─────────────────────────────────────────
30
+ var runner_1 = require("./runner");
31
+ Object.defineProperty(exports, "runProbes", { enumerable: true, get: function () { return runner_1.runProbes; } });
32
+ // ── Diagnosis ───────────────────────────────────────────────
33
+ var diagnosis_1 = require("./diagnosis");
34
+ Object.defineProperty(exports, "diagnose", { enumerable: true, get: function () { return diagnosis_1.diagnose; } });
35
+ Object.defineProperty(exports, "applyDiagnosisEdits", { enumerable: true, get: function () { return diagnosis_1.applyDiagnosisEdits; } });
36
+ // ── Prompt harvesting ───────────────────────────────────────
37
+ var index_1 = require("./harvest/index");
38
+ Object.defineProperty(exports, "harvestPrompts", { enumerable: true, get: function () { return index_1.harvestPrompts; } });
39
+ Object.defineProperty(exports, "harvestAider", { enumerable: true, get: function () { return index_1.harvestAider; } });
40
+ Object.defineProperty(exports, "harvestClaudeCode", { enumerable: true, get: function () { return index_1.harvestClaudeCode; } });
41
+ Object.defineProperty(exports, "harvestCline", { enumerable: true, get: function () { return index_1.harvestCline; } });
42
+ Object.defineProperty(exports, "harvestCopilotChat", { enumerable: true, get: function () { return index_1.harvestCopilotChat; } });
43
+ Object.defineProperty(exports, "harvestCursor", { enumerable: true, get: function () { return index_1.harvestCursor; } });
44
+ Object.defineProperty(exports, "harvestWindsurf", { enumerable: true, get: function () { return index_1.harvestWindsurf; } });
45
+ Object.defineProperty(exports, "harvestExport", { enumerable: true, get: function () { return index_1.harvestExport; } });
46
+ const probes_2 = require("./probes");
47
+ const runner_2 = require("./runner");
48
+ const diagnosis_2 = require("./diagnosis");
49
+ /**
50
+ * Run the full evaluation pipeline: generate probes → run them → diagnose failures.
51
+ *
52
+ * This is a convenience function combining the individual steps.
53
+ * For more control, use the individual functions directly.
54
+ */
55
+ async function evaluate(options) {
56
+ const { probeOptions, agentsContent, provider, fileContents, log, signal } = options;
57
+ // Step 1: Generate probes
58
+ const probes = (0, probes_2.generateProbes)(probeOptions);
59
+ // Step 2: Run probes
60
+ const probeResults = await (0, runner_2.runProbes)(agentsContent, probes, provider, fileContents, log, signal);
61
+ const failures = probeResults.filter((r) => !r.passed);
62
+ // Step 3: Diagnose if there are failures
63
+ let diagnosis;
64
+ if (failures.length > 0) {
65
+ diagnosis = await (0, diagnosis_2.diagnose)(failures, agentsContent, provider, log, signal);
66
+ }
67
+ return {
68
+ probeResults,
69
+ diagnosis,
70
+ passCount: probeResults.length - failures.length,
71
+ failCount: failures.length,
72
+ totalProbes: probeResults.length,
73
+ };
74
+ }
75
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAwDH,4BAkDC;AApFD,+DAA+D;AAC/D,mCAA0C;AAAjC,wGAAA,cAAc,OAAA;AAEvB,+DAA+D;AAC/D,mCAAqC;AAA5B,mGAAA,SAAS,OAAA;AAElB,+DAA+D;AAC/D,yCAA4D;AAAnD,qGAAA,QAAQ,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAEtC,+DAA+D;AAC/D,yCASyB;AARvB,uGAAA,cAAc,OAAA;AACd,qGAAA,YAAY,OAAA;AACZ,0GAAA,iBAAiB,OAAA;AACjB,qGAAA,YAAY,OAAA;AACZ,2GAAA,kBAAkB,OAAA;AAClB,sGAAA,aAAa,OAAA;AACb,wGAAA,eAAe,OAAA;AACf,sGAAA,aAAa,OAAA;AAMf,qCAA0C;AAC1C,qCAAqC;AACrC,2CAAuC;AAEvC;;;;;GAKG;AACI,KAAK,UAAU,QAAQ,CAAC,OAa9B;IACC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAErF,0BAA0B;IAC1B,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,YAAY,CAAC,CAAC;IAE5C,qBAAqB;IACrB,MAAM,YAAY,GAAG,MAAM,IAAA,kBAAS,EAClC,aAAa,EACb,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,GAAG,EACH,MAAM,CACP,CAAC;IAEF,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEvD,yCAAyC;IACzC,IAAI,SAAS,CAAC;IACd,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,SAAS,GAAG,MAAM,IAAA,oBAAQ,EACxB,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,GAAG,EACH,MAAM,CACP,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY;QACZ,SAAS;QACT,SAAS,EAAE,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;QAChD,SAAS,EAAE,QAAQ,CAAC,MAAM;QAC1B,WAAW,EAAE,YAAY,CAAC,MAAM;KACjC,CAAC;AACJ,CAAC"}