@code-insights/cli 3.0.3 → 3.1.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 (134) hide show
  1. package/dashboard-dist/assets/index-CuCBzQyQ.js +548 -0
  2. package/dashboard-dist/dist/assets/index-BMhL7wL8.css +1 -0
  3. package/dashboard-dist/dist/assets/index-BuJps5yp.js +548 -0
  4. package/dashboard-dist/dist/assets/index-CuCBzQyQ.js +548 -0
  5. package/dashboard-dist/dist/favicon.svg +4 -0
  6. package/dashboard-dist/dist/index.html +33 -0
  7. package/dashboard-dist/index.html +1 -1
  8. package/dist/commands/connect.d.ts +5 -0
  9. package/dist/commands/connect.d.ts.map +1 -0
  10. package/dist/commands/connect.js +39 -0
  11. package/dist/commands/connect.js.map +1 -0
  12. package/dist/commands/insights.d.ts +13 -0
  13. package/dist/commands/insights.d.ts.map +1 -0
  14. package/dist/commands/insights.js +87 -0
  15. package/dist/commands/insights.js.map +1 -0
  16. package/dist/commands/link.d.ts +8 -0
  17. package/dist/commands/link.d.ts.map +1 -0
  18. package/dist/commands/link.js +39 -0
  19. package/dist/commands/link.js.map +1 -0
  20. package/dist/commands/stats/data/cache.d.ts +29 -0
  21. package/dist/commands/stats/data/cache.d.ts.map +1 -0
  22. package/dist/commands/stats/data/cache.js +197 -0
  23. package/dist/commands/stats/data/cache.js.map +1 -0
  24. package/dist/commands/stats/data/firestore.d.ts +13 -0
  25. package/dist/commands/stats/data/firestore.d.ts.map +1 -0
  26. package/dist/commands/stats/data/firestore.js +170 -0
  27. package/dist/commands/stats/data/firestore.js.map +1 -0
  28. package/dist/commands/sync.d.ts.map +1 -1
  29. package/dist/commands/sync.js +20 -4
  30. package/dist/commands/sync.js.map +1 -1
  31. package/dist/db/schema.d.ts +1 -0
  32. package/dist/db/schema.d.ts.map +1 -1
  33. package/dist/db/schema.js +1 -0
  34. package/dist/db/schema.js.map +1 -1
  35. package/dist/firebase/client.d.ts +45 -0
  36. package/dist/firebase/client.d.ts.map +1 -0
  37. package/dist/firebase/client.js +344 -0
  38. package/dist/firebase/client.js.map +1 -0
  39. package/dist/index.js +0 -0
  40. package/dist/parser/insights.d.ts +7 -0
  41. package/dist/parser/insights.d.ts.map +1 -0
  42. package/dist/parser/insights.js +271 -0
  43. package/dist/parser/insights.js.map +1 -0
  44. package/dist/providers/codex.js +31 -0
  45. package/dist/providers/codex.js.map +1 -1
  46. package/dist/providers/copilot-cli.js +14 -2
  47. package/dist/providers/copilot-cli.js.map +1 -1
  48. package/dist/providers/cursor.js +44 -2
  49. package/dist/providers/cursor.js.map +1 -1
  50. package/dist/utils/firebase-json.d.ts +87 -0
  51. package/dist/utils/firebase-json.d.ts.map +1 -0
  52. package/dist/utils/firebase-json.js +207 -0
  53. package/dist/utils/firebase-json.js.map +1 -0
  54. package/dist/utils/telemetry.d.ts.map +1 -1
  55. package/dist/utils/telemetry.js +28 -3
  56. package/dist/utils/telemetry.js.map +1 -1
  57. package/package.json +3 -1
  58. package/server-dist/dist/index.d.ts +20 -0
  59. package/server-dist/dist/index.d.ts.map +1 -0
  60. package/server-dist/dist/index.js +102 -0
  61. package/server-dist/dist/index.js.map +1 -0
  62. package/server-dist/dist/llm/analysis.d.ts +80 -0
  63. package/server-dist/dist/llm/analysis.d.ts.map +1 -0
  64. package/server-dist/dist/llm/analysis.js +509 -0
  65. package/server-dist/dist/llm/analysis.js.map +1 -0
  66. package/server-dist/dist/llm/client.d.ts +27 -0
  67. package/server-dist/dist/llm/client.d.ts.map +1 -0
  68. package/server-dist/dist/llm/client.js +71 -0
  69. package/server-dist/dist/llm/client.js.map +1 -0
  70. package/server-dist/dist/llm/index.d.ts +7 -0
  71. package/server-dist/dist/llm/index.d.ts.map +1 -0
  72. package/server-dist/dist/llm/index.js +5 -0
  73. package/server-dist/dist/llm/index.js.map +1 -0
  74. package/server-dist/dist/llm/prompts.d.ts +73 -0
  75. package/server-dist/dist/llm/prompts.d.ts.map +1 -0
  76. package/server-dist/dist/llm/prompts.js +242 -0
  77. package/server-dist/dist/llm/prompts.js.map +1 -0
  78. package/server-dist/dist/llm/providers/anthropic.d.ts +3 -0
  79. package/server-dist/dist/llm/providers/anthropic.d.ts.map +1 -0
  80. package/server-dist/dist/llm/providers/anthropic.js +45 -0
  81. package/server-dist/dist/llm/providers/anthropic.js.map +1 -0
  82. package/server-dist/dist/llm/providers/gemini.d.ts +3 -0
  83. package/server-dist/dist/llm/providers/gemini.d.ts.map +1 -0
  84. package/server-dist/dist/llm/providers/gemini.js +51 -0
  85. package/server-dist/dist/llm/providers/gemini.js.map +1 -0
  86. package/server-dist/dist/llm/providers/ollama.d.ts +12 -0
  87. package/server-dist/dist/llm/providers/ollama.d.ts.map +1 -0
  88. package/server-dist/dist/llm/providers/ollama.js +61 -0
  89. package/server-dist/dist/llm/providers/ollama.js.map +1 -0
  90. package/server-dist/dist/llm/providers/openai.d.ts +3 -0
  91. package/server-dist/dist/llm/providers/openai.d.ts.map +1 -0
  92. package/server-dist/dist/llm/providers/openai.js +39 -0
  93. package/server-dist/dist/llm/providers/openai.js.map +1 -0
  94. package/server-dist/dist/llm/types.d.ts +22 -0
  95. package/server-dist/dist/llm/types.d.ts.map +1 -0
  96. package/server-dist/dist/llm/types.js +5 -0
  97. package/server-dist/dist/llm/types.js.map +1 -0
  98. package/server-dist/dist/routes/analysis.d.ts +4 -0
  99. package/server-dist/dist/routes/analysis.d.ts.map +1 -0
  100. package/server-dist/dist/routes/analysis.js +103 -0
  101. package/server-dist/dist/routes/analysis.js.map +1 -0
  102. package/server-dist/dist/routes/analytics.d.ts +4 -0
  103. package/server-dist/dist/routes/analytics.d.ts.map +1 -0
  104. package/server-dist/dist/routes/analytics.js +47 -0
  105. package/server-dist/dist/routes/analytics.js.map +1 -0
  106. package/server-dist/dist/routes/config.d.ts +4 -0
  107. package/server-dist/dist/routes/config.d.ts.map +1 -0
  108. package/server-dist/dist/routes/config.js +108 -0
  109. package/server-dist/dist/routes/config.js.map +1 -0
  110. package/server-dist/dist/routes/export.d.ts +4 -0
  111. package/server-dist/dist/routes/export.d.ts.map +1 -0
  112. package/server-dist/dist/routes/export.js +52 -0
  113. package/server-dist/dist/routes/export.js.map +1 -0
  114. package/server-dist/dist/routes/insights.d.ts +4 -0
  115. package/server-dist/dist/routes/insights.d.ts.map +1 -0
  116. package/server-dist/dist/routes/insights.js +80 -0
  117. package/server-dist/dist/routes/insights.js.map +1 -0
  118. package/server-dist/dist/routes/messages.d.ts +4 -0
  119. package/server-dist/dist/routes/messages.d.ts.map +1 -0
  120. package/server-dist/dist/routes/messages.js +19 -0
  121. package/server-dist/dist/routes/messages.js.map +1 -0
  122. package/server-dist/dist/routes/projects.d.ts +4 -0
  123. package/server-dist/dist/routes/projects.d.ts.map +1 -0
  124. package/server-dist/dist/routes/projects.js +32 -0
  125. package/server-dist/dist/routes/projects.js.map +1 -0
  126. package/server-dist/dist/routes/sessions.d.ts +4 -0
  127. package/server-dist/dist/routes/sessions.d.ts.map +1 -0
  128. package/server-dist/dist/routes/sessions.js +65 -0
  129. package/server-dist/dist/routes/sessions.js.map +1 -0
  130. package/server-dist/dist/utils.d.ts +6 -0
  131. package/server-dist/dist/utils.d.ts.map +1 -0
  132. package/server-dist/dist/utils.js +9 -0
  133. package/server-dist/dist/utils.js.map +1 -0
  134. /package/dashboard-dist/{assets → dist/assets}/index-CUWKxcRo.js +0 -0
@@ -0,0 +1,344 @@
1
+ import admin from 'firebase-admin';
2
+ import { generateStableProjectId, getDeviceInfo } from '../utils/device.js';
3
+ let db = null;
4
+ /**
5
+ * Initialize Firebase Admin SDK
6
+ */
7
+ export function initializeFirebase(config) {
8
+ if (!config.firebase) {
9
+ throw new Error('Firebase credentials not configured. Run `code-insights init` to set up.');
10
+ }
11
+ if (admin.apps.length > 0) {
12
+ db = admin.firestore();
13
+ return;
14
+ }
15
+ admin.initializeApp({
16
+ credential: admin.credential.cert({
17
+ projectId: config.firebase.projectId,
18
+ clientEmail: config.firebase.clientEmail,
19
+ privateKey: config.firebase.privateKey.replace(/\\n/g, '\n'),
20
+ }),
21
+ });
22
+ db = admin.firestore();
23
+ }
24
+ /**
25
+ * Get Firestore instance
26
+ */
27
+ export function getDb() {
28
+ if (!db) {
29
+ throw new Error('Firebase not initialized. Call initializeFirebase first.');
30
+ }
31
+ return db;
32
+ }
33
+ /**
34
+ * Upload a session to Firestore
35
+ */
36
+ export async function uploadSession(session, isForceSync = false) {
37
+ const firestore = getDb();
38
+ // Generate stable project ID (prefers git remote URL)
39
+ const { projectId, source: projectIdSource, gitRemoteUrl } = generateStableProjectId(session.projectPath);
40
+ // Get device info for multi-device support
41
+ const deviceInfo = getDeviceInfo();
42
+ // Check if session already exists (for idempotent session count)
43
+ const sessionRef = firestore.collection('sessions').doc(session.id);
44
+ const existingSession = await sessionRef.get();
45
+ const isNewSession = !existingSession.exists;
46
+ const batch = firestore.batch();
47
+ // Upsert project
48
+ const projectRef = firestore.collection('projects').doc(projectId);
49
+ batch.set(projectRef, {
50
+ name: session.projectName,
51
+ path: session.projectPath,
52
+ gitRemoteUrl: gitRemoteUrl,
53
+ projectIdSource: projectIdSource,
54
+ lastActivity: admin.firestore.Timestamp.fromDate(session.endedAt),
55
+ updatedAt: admin.firestore.FieldValue.serverTimestamp(),
56
+ }, { merge: true });
57
+ // Only increment session count for NEW sessions (idempotent)
58
+ if (isNewSession) {
59
+ const incrementFields = {
60
+ sessionCount: admin.firestore.FieldValue.increment(1),
61
+ };
62
+ if (!isForceSync && session.usage) {
63
+ incrementFields.totalInputTokens = admin.firestore.FieldValue.increment(session.usage.totalInputTokens);
64
+ incrementFields.totalOutputTokens = admin.firestore.FieldValue.increment(session.usage.totalOutputTokens);
65
+ incrementFields.cacheCreationTokens = admin.firestore.FieldValue.increment(session.usage.cacheCreationTokens);
66
+ incrementFields.cacheReadTokens = admin.firestore.FieldValue.increment(session.usage.cacheReadTokens);
67
+ incrementFields.estimatedCostUsd = admin.firestore.FieldValue.increment(session.usage.estimatedCostUsd);
68
+ }
69
+ batch.update(projectRef, incrementFields);
70
+ }
71
+ // Upload session with device info
72
+ batch.set(sessionRef, {
73
+ projectId: projectId,
74
+ projectName: session.projectName,
75
+ projectPath: session.projectPath,
76
+ gitRemoteUrl: gitRemoteUrl,
77
+ summary: session.summary,
78
+ generatedTitle: session.generatedTitle,
79
+ titleSource: session.titleSource,
80
+ sessionCharacter: session.sessionCharacter,
81
+ startedAt: admin.firestore.Timestamp.fromDate(session.startedAt),
82
+ endedAt: admin.firestore.Timestamp.fromDate(session.endedAt),
83
+ messageCount: session.messageCount,
84
+ userMessageCount: session.userMessageCount,
85
+ assistantMessageCount: session.assistantMessageCount,
86
+ toolCallCount: session.toolCallCount,
87
+ gitBranch: session.gitBranch,
88
+ claudeVersion: session.claudeVersion,
89
+ sourceTool: session.sourceTool ?? 'claude-code',
90
+ // Device info for multi-device tracking
91
+ deviceId: deviceInfo.deviceId,
92
+ deviceHostname: deviceInfo.hostname,
93
+ devicePlatform: deviceInfo.platform,
94
+ syncedAt: admin.firestore.FieldValue.serverTimestamp(),
95
+ // Usage stats (conditional — absent for older sessions without token data)
96
+ ...(session.usage ? {
97
+ totalInputTokens: session.usage.totalInputTokens,
98
+ totalOutputTokens: session.usage.totalOutputTokens,
99
+ cacheCreationTokens: session.usage.cacheCreationTokens,
100
+ cacheReadTokens: session.usage.cacheReadTokens,
101
+ estimatedCostUsd: session.usage.estimatedCostUsd,
102
+ modelsUsed: session.usage.modelsUsed,
103
+ primaryModel: session.usage.primaryModel,
104
+ usageSource: session.usage.usageSource,
105
+ } : {}),
106
+ });
107
+ // Atomically increment usage stats for new sessions (non-force only)
108
+ if (isNewSession && !isForceSync && session.usage) {
109
+ const statsRef = firestore.collection('stats').doc('usage');
110
+ batch.set(statsRef, {
111
+ totalInputTokens: admin.firestore.FieldValue.increment(session.usage.totalInputTokens),
112
+ totalOutputTokens: admin.firestore.FieldValue.increment(session.usage.totalOutputTokens),
113
+ cacheCreationTokens: admin.firestore.FieldValue.increment(session.usage.cacheCreationTokens),
114
+ cacheReadTokens: admin.firestore.FieldValue.increment(session.usage.cacheReadTokens),
115
+ estimatedCostUsd: admin.firestore.FieldValue.increment(session.usage.estimatedCostUsd),
116
+ sessionsWithUsage: admin.firestore.FieldValue.increment(1),
117
+ lastUpdatedAt: admin.firestore.FieldValue.serverTimestamp(),
118
+ }, { merge: true });
119
+ }
120
+ await batch.commit();
121
+ }
122
+ /**
123
+ * Upload messages to Firestore for LLM analysis
124
+ */
125
+ export async function uploadMessages(session) {
126
+ if (session.messages.length === 0)
127
+ return;
128
+ const firestore = getDb();
129
+ const batches = [];
130
+ let currentBatch = firestore.batch();
131
+ let operationCount = 0;
132
+ for (const message of session.messages) {
133
+ const messageRef = firestore.collection('messages').doc(message.id);
134
+ currentBatch.set(messageRef, {
135
+ sessionId: message.sessionId,
136
+ type: message.type,
137
+ content: truncateContent(message.content, 10000),
138
+ thinking: message.thinking
139
+ ? truncateContent(message.thinking, 5000)
140
+ : null,
141
+ toolCalls: message.toolCalls.map((tc) => ({
142
+ id: tc.id,
143
+ name: tc.name,
144
+ input: JSON.stringify(tc.input).slice(0, 1000),
145
+ })),
146
+ toolResults: message.toolResults.map((tr) => ({
147
+ toolUseId: tr.toolUseId,
148
+ output: truncateContent(tr.output, 2000),
149
+ })),
150
+ timestamp: admin.firestore.Timestamp.fromDate(message.timestamp),
151
+ parentId: message.parentId,
152
+ // Per-message usage (assistant messages only)
153
+ ...(message.usage ? {
154
+ usage: {
155
+ inputTokens: message.usage.inputTokens,
156
+ outputTokens: message.usage.outputTokens,
157
+ cacheCreationTokens: message.usage.cacheCreationTokens,
158
+ cacheReadTokens: message.usage.cacheReadTokens,
159
+ model: message.usage.model,
160
+ estimatedCostUsd: message.usage.estimatedCostUsd,
161
+ },
162
+ } : {}),
163
+ });
164
+ operationCount++;
165
+ if (operationCount >= 500) {
166
+ batches.push(currentBatch);
167
+ currentBatch = firestore.batch();
168
+ operationCount = 0;
169
+ }
170
+ }
171
+ if (operationCount > 0) {
172
+ batches.push(currentBatch);
173
+ }
174
+ await Promise.all(batches.map((batch) => batch.commit()));
175
+ }
176
+ /**
177
+ * Check if a session already exists
178
+ */
179
+ export async function sessionExists(sessionId) {
180
+ const firestore = getDb();
181
+ const doc = await firestore.collection('sessions').doc(sessionId).get();
182
+ return doc.exists;
183
+ }
184
+ /**
185
+ * Get all projects
186
+ */
187
+ export async function getProjects() {
188
+ const firestore = getDb();
189
+ const snapshot = await firestore.collection('projects').orderBy('lastActivity', 'desc').get();
190
+ return snapshot.docs.map((doc) => {
191
+ const data = doc.data();
192
+ return {
193
+ id: doc.id,
194
+ name: data.name,
195
+ path: data.path,
196
+ sessionCount: data.sessionCount || 0,
197
+ lastActivity: data.lastActivity?.toDate() || new Date(),
198
+ createdAt: data.createdAt?.toDate() || new Date(),
199
+ };
200
+ });
201
+ }
202
+ /**
203
+ * Get recent sessions
204
+ */
205
+ export async function getRecentSessions(limit = 10) {
206
+ const firestore = getDb();
207
+ const snapshot = await firestore
208
+ .collection('sessions')
209
+ .orderBy('endedAt', 'desc')
210
+ .limit(limit)
211
+ .get();
212
+ return snapshot.docs.map((doc) => {
213
+ const data = doc.data();
214
+ return {
215
+ id: doc.id,
216
+ projectPath: data.projectPath,
217
+ projectName: data.projectName,
218
+ summary: data.summary,
219
+ startedAt: data.startedAt?.toDate() || new Date(),
220
+ endedAt: data.endedAt?.toDate() || new Date(),
221
+ messageCount: data.messageCount,
222
+ userMessageCount: data.userMessageCount,
223
+ assistantMessageCount: data.assistantMessageCount,
224
+ toolCallCount: data.toolCallCount,
225
+ messages: [],
226
+ insights: [],
227
+ gitBranch: data.gitBranch,
228
+ claudeVersion: data.claudeVersion,
229
+ generatedTitle: data.generatedTitle || null,
230
+ titleSource: data.titleSource || null,
231
+ sessionCharacter: data.sessionCharacter || null,
232
+ };
233
+ });
234
+ }
235
+ /**
236
+ * Recalculate usage stats from all sessions in Firestore.
237
+ * Used after --force sync to reconcile totals.
238
+ */
239
+ export async function recalculateUsageStats() {
240
+ const firestore = getDb();
241
+ // Query all sessions that have usage data
242
+ const snapshot = await firestore
243
+ .collection('sessions')
244
+ .where('usageSource', '==', 'jsonl')
245
+ .get();
246
+ // Aggregate global + per-project totals
247
+ const global = {
248
+ totalInputTokens: 0,
249
+ totalOutputTokens: 0,
250
+ cacheCreationTokens: 0,
251
+ cacheReadTokens: 0,
252
+ estimatedCostUsd: 0,
253
+ sessionsWithUsage: 0,
254
+ };
255
+ const perProject = {};
256
+ for (const doc of snapshot.docs) {
257
+ const data = doc.data();
258
+ global.totalInputTokens += data.totalInputTokens ?? 0;
259
+ global.totalOutputTokens += data.totalOutputTokens ?? 0;
260
+ global.cacheCreationTokens += data.cacheCreationTokens ?? 0;
261
+ global.cacheReadTokens += data.cacheReadTokens ?? 0;
262
+ global.estimatedCostUsd += data.estimatedCostUsd ?? 0;
263
+ global.sessionsWithUsage++;
264
+ const pid = data.projectId;
265
+ if (pid) {
266
+ if (!perProject[pid]) {
267
+ perProject[pid] = {
268
+ totalInputTokens: 0,
269
+ totalOutputTokens: 0,
270
+ cacheCreationTokens: 0,
271
+ cacheReadTokens: 0,
272
+ estimatedCostUsd: 0,
273
+ };
274
+ }
275
+ perProject[pid].totalInputTokens += data.totalInputTokens ?? 0;
276
+ perProject[pid].totalOutputTokens += data.totalOutputTokens ?? 0;
277
+ perProject[pid].cacheCreationTokens += data.cacheCreationTokens ?? 0;
278
+ perProject[pid].cacheReadTokens += data.cacheReadTokens ?? 0;
279
+ perProject[pid].estimatedCostUsd += data.estimatedCostUsd ?? 0;
280
+ }
281
+ }
282
+ // Write global stats (overwrite, not merge)
283
+ const statsRef = firestore.collection('stats').doc('usage');
284
+ await statsRef.set({
285
+ ...global,
286
+ lastUpdatedAt: admin.firestore.FieldValue.serverTimestamp(),
287
+ });
288
+ // Update each project's usage fields
289
+ const batches = [];
290
+ let currentBatch = firestore.batch();
291
+ let opCount = 0;
292
+ for (const [projectId, usage] of Object.entries(perProject)) {
293
+ const projectRef = firestore.collection('projects').doc(projectId);
294
+ currentBatch.set(projectRef, usage, { merge: true });
295
+ opCount++;
296
+ if (opCount >= 500) {
297
+ batches.push(currentBatch);
298
+ currentBatch = firestore.batch();
299
+ opCount = 0;
300
+ }
301
+ }
302
+ if (opCount > 0)
303
+ batches.push(currentBatch);
304
+ await Promise.all(batches.map(b => b.commit()));
305
+ const totalTokens = global.totalInputTokens + global.totalOutputTokens
306
+ + global.cacheCreationTokens + global.cacheReadTokens;
307
+ return {
308
+ sessionsWithUsage: global.sessionsWithUsage,
309
+ totalTokens,
310
+ estimatedCostUsd: global.estimatedCostUsd,
311
+ };
312
+ }
313
+ /**
314
+ * Get per-tool session counts grouped by project.
315
+ * Uses select() to only fetch projectId and sourceTool fields (efficient).
316
+ */
317
+ export async function getProjectToolCounts() {
318
+ const firestore = getDb();
319
+ const snapshot = await firestore
320
+ .collection('sessions')
321
+ .select('projectId', 'sourceTool')
322
+ .get();
323
+ const counts = new Map();
324
+ for (const doc of snapshot.docs) {
325
+ const data = doc.data();
326
+ const projectId = data.projectId;
327
+ const sourceTool = data.sourceTool || 'claude-code';
328
+ if (!counts.has(projectId)) {
329
+ counts.set(projectId, new Map());
330
+ }
331
+ const toolMap = counts.get(projectId);
332
+ toolMap.set(sourceTool, (toolMap.get(sourceTool) || 0) + 1);
333
+ }
334
+ return counts;
335
+ }
336
+ /**
337
+ * Truncate content to max length
338
+ */
339
+ function truncateContent(content, maxLength) {
340
+ if (content.length <= maxLength)
341
+ return content;
342
+ return content.slice(0, maxLength - 20) + '\n... [truncated]';
343
+ }
344
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/firebase/client.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
File without changes
@@ -0,0 +1,7 @@
1
+ import type { ParsedSession, Insight, ParsedInsightContent } from '../types.js';
2
+ export declare function parseInsightContent(raw: string): ParsedInsightContent;
3
+ /**
4
+ * Extract insights from a parsed session using pattern matching
5
+ */
6
+ export declare function extractInsights(session: ParsedSession): Insight[];
7
+ //# sourceMappingURL=insights.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights.d.ts","sourceRoot":"","sources":["../../src/parser/insights.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAiB,OAAO,EAAmB,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGhH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAMrE;AAuDD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CA4BjE"}
@@ -0,0 +1,271 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ export function parseInsightContent(raw) {
3
+ const isClaudeInsight = raw.includes('★ Insight') || raw.includes('★Insight');
4
+ if (isClaudeInsight) {
5
+ return parseClaudeFormattedInsight(raw);
6
+ }
7
+ return parseGenericContent(raw);
8
+ }
9
+ function parseClaudeFormattedInsight(raw) {
10
+ let cleaned = raw.replace(/★\s*Insight\s*─*/g, '').replace(/─+/g, '').replace(/\*\*/g, '').trim();
11
+ const lines = cleaned.split('\n').map(l => l.trim()).filter(l => l);
12
+ const title = (lines[0] || '').replace(/:$/, '').trim();
13
+ const bullets = lines.slice(1).filter(l => l.startsWith('-')).map(l => l.replace(/^-\s*/, '').trim());
14
+ const summary = bullets.length > 0 ? `${title}: ${bullets[0]}` : title;
15
+ return { title, summary, bullets, rawContent: raw };
16
+ }
17
+ function parseGenericContent(raw) {
18
+ let cleaned = raw.replace(/\*\*/g, '').replace(/\\"/g, '"').replace(/\\n/g, '\n').trim();
19
+ const lines = cleaned.split('\n').map(l => l.trim()).filter(l => l);
20
+ const title = truncate(lines[0] || cleaned, 100);
21
+ const bullets = lines.slice(1).filter(l => l.startsWith('-') || l.startsWith('•')).map(l => l.replace(/^[-•]\s*/, '').trim());
22
+ return { title, summary: title, bullets, rawContent: raw };
23
+ }
24
+ // Pattern matching rules for different insight types
25
+ const DECISION_PATTERNS = [
26
+ /decided to (.+)/i,
27
+ /chose (.+) over (.+)/i,
28
+ /went with (.+) because (.+)/i,
29
+ /trade-off:?\s*(.+)/i,
30
+ /approach:?\s*(.+)/i,
31
+ /\*\*decision\*\*:?\s*(.+)/i,
32
+ /we('ll| will) use (.+) (for|to|because)/i,
33
+ /let's go with (.+)/i,
34
+ /the (best|right|better) (approach|solution|choice) is (.+)/i,
35
+ ];
36
+ const LEARNING_PATTERNS = [
37
+ /learned that (.+)/i,
38
+ /TIL:?\s*(.+)/i,
39
+ /insight:?\s*(.+)/i,
40
+ /realized (.+)/i,
41
+ /mistake:?\s*(.+)/i,
42
+ /note to self:?\s*(.+)/i,
43
+ /important:?\s*(.+)/i,
44
+ /remember:?\s*(.+)/i,
45
+ /turns out (.+)/i,
46
+ /didn't know (.+)/i,
47
+ ];
48
+ const WORKITEM_SIGNALS = {
49
+ feature: ['added', 'implemented', 'created', 'built', 'new feature', 'introducing'],
50
+ bugfix: ['fixed', 'resolved', 'patched', 'corrected', 'bug fix', 'fixing'],
51
+ refactor: ['refactored', 'restructured', 'reorganized', 'cleaned', 'improved', 'simplified'],
52
+ docs: ['documented', 'documentation', 'readme', 'comments', 'jsdoc'],
53
+ test: ['tested', 'test', 'spec', 'coverage', 'unit test', 'integration test'],
54
+ };
55
+ const WORK_TOOLS = ['Edit', 'Write', 'Bash'];
56
+ /**
57
+ * Extract insights from a parsed session using pattern matching
58
+ */
59
+ export function extractInsights(session) {
60
+ const insights = [];
61
+ const projectId = generateProjectId(session.projectPath);
62
+ // Extract from assistant messages
63
+ for (const message of session.messages) {
64
+ if (message.type === 'assistant') {
65
+ // Check for decisions
66
+ const decisions = extractDecisions(message, session, projectId);
67
+ insights.push(...decisions);
68
+ // Check for learnings
69
+ const learnings = extractLearnings(message, session, projectId);
70
+ insights.push(...learnings);
71
+ // Check for work items from tool calls
72
+ const workItems = extractWorkItems(message, session, projectId);
73
+ insights.push(...workItems);
74
+ }
75
+ }
76
+ // Add effort insight for the session
77
+ const effortInsight = createEffortInsight(session, projectId);
78
+ if (effortInsight) {
79
+ insights.push(effortInsight);
80
+ }
81
+ return insights;
82
+ }
83
+ /**
84
+ * Extract decision insights from a message
85
+ */
86
+ function extractDecisions(message, session, projectId) {
87
+ const insights = [];
88
+ const content = message.content;
89
+ for (const pattern of DECISION_PATTERNS) {
90
+ const match = content.match(pattern);
91
+ if (match) {
92
+ const extractedText = match[1] || match[0];
93
+ // Get surrounding context (up to 200 chars)
94
+ const matchIndex = content.indexOf(match[0]);
95
+ const contextStart = Math.max(0, matchIndex - 100);
96
+ const contextEnd = Math.min(content.length, matchIndex + match[0].length + 100);
97
+ const context = content.slice(contextStart, contextEnd);
98
+ insights.push({
99
+ id: uuidv4(),
100
+ sessionId: session.id,
101
+ projectId,
102
+ projectName: session.projectName,
103
+ type: 'decision',
104
+ title: truncate(extractedText, 100),
105
+ content: context,
106
+ summary: '',
107
+ bullets: [],
108
+ confidence: 0.7,
109
+ source: 'pattern',
110
+ metadata: {
111
+ reasoning: extractedText,
112
+ },
113
+ timestamp: message.timestamp,
114
+ });
115
+ // Only extract first match per pattern to avoid duplicates
116
+ break;
117
+ }
118
+ }
119
+ return insights;
120
+ }
121
+ /**
122
+ * Extract learning insights from a message
123
+ */
124
+ function extractLearnings(message, session, projectId) {
125
+ const insights = [];
126
+ const content = message.content;
127
+ for (const pattern of LEARNING_PATTERNS) {
128
+ const match = content.match(pattern);
129
+ if (match) {
130
+ const extractedText = match[1] || match[0];
131
+ // Get surrounding context
132
+ const matchIndex = content.indexOf(match[0]);
133
+ const contextStart = Math.max(0, matchIndex - 100);
134
+ const contextEnd = Math.min(content.length, matchIndex + match[0].length + 100);
135
+ const context = content.slice(contextStart, contextEnd);
136
+ insights.push({
137
+ id: uuidv4(),
138
+ sessionId: session.id,
139
+ projectId,
140
+ projectName: session.projectName,
141
+ type: 'learning',
142
+ title: truncate(extractedText, 100),
143
+ content: context,
144
+ summary: '',
145
+ bullets: [],
146
+ confidence: 0.6,
147
+ source: 'pattern',
148
+ metadata: {},
149
+ timestamp: message.timestamp,
150
+ });
151
+ break;
152
+ }
153
+ }
154
+ return insights;
155
+ }
156
+ /**
157
+ * Extract work item insights from tool calls
158
+ */
159
+ function extractWorkItems(message, session, projectId) {
160
+ const insights = [];
161
+ // Check for file-modifying tool calls
162
+ const fileEdits = message.toolCalls.filter((tc) => WORK_TOOLS.includes(tc.name));
163
+ if (fileEdits.length === 0) {
164
+ return insights;
165
+ }
166
+ // Extract files modified
167
+ const files = [];
168
+ for (const tc of fileEdits) {
169
+ if (tc.name === 'Edit' || tc.name === 'Write') {
170
+ const filePath = tc.input.file_path;
171
+ if (filePath) {
172
+ files.push(filePath);
173
+ }
174
+ }
175
+ }
176
+ if (files.length === 0) {
177
+ return insights;
178
+ }
179
+ // Determine work type from message content
180
+ const workType = determineWorkType(message.content);
181
+ // Create a consolidated work item for this message
182
+ insights.push({
183
+ id: uuidv4(),
184
+ sessionId: session.id,
185
+ projectId,
186
+ projectName: session.projectName,
187
+ type: 'workitem',
188
+ title: `${capitalizeFirst(workType)}: ${files.length} file(s) modified`,
189
+ content: `Files: ${files.join(', ')}`,
190
+ summary: '',
191
+ bullets: [],
192
+ confidence: 0.9,
193
+ source: 'pattern',
194
+ metadata: {
195
+ files,
196
+ workType,
197
+ },
198
+ timestamp: message.timestamp,
199
+ });
200
+ return insights;
201
+ }
202
+ /**
203
+ * Create an effort insight for the session
204
+ */
205
+ function createEffortInsight(session, projectId) {
206
+ // Calculate session duration in minutes
207
+ const durationMs = session.endedAt.getTime() - session.startedAt.getTime();
208
+ const durationMinutes = Math.round(durationMs / 60000);
209
+ if (durationMinutes < 1) {
210
+ return null;
211
+ }
212
+ return {
213
+ id: uuidv4(),
214
+ sessionId: session.id,
215
+ projectId,
216
+ projectName: session.projectName,
217
+ type: 'effort',
218
+ title: `Session: ${durationMinutes} min, ${session.messageCount} messages`,
219
+ content: `User: ${session.userMessageCount} messages, Assistant: ${session.assistantMessageCount} messages, Tool calls: ${session.toolCallCount}`,
220
+ summary: '',
221
+ bullets: [],
222
+ confidence: 1.0,
223
+ source: 'pattern',
224
+ metadata: {
225
+ duration: durationMinutes,
226
+ },
227
+ timestamp: session.startedAt,
228
+ };
229
+ }
230
+ /**
231
+ * Determine work type from message content
232
+ */
233
+ function determineWorkType(content) {
234
+ const lowerContent = content.toLowerCase();
235
+ for (const [workType, signals] of Object.entries(WORKITEM_SIGNALS)) {
236
+ for (const signal of signals) {
237
+ if (lowerContent.includes(signal)) {
238
+ return workType;
239
+ }
240
+ }
241
+ }
242
+ return 'feature'; // Default
243
+ }
244
+ /**
245
+ * Generate a stable project ID from path
246
+ */
247
+ function generateProjectId(projectPath) {
248
+ // Create a simple hash from the path
249
+ let hash = 0;
250
+ for (let i = 0; i < projectPath.length; i++) {
251
+ const char = projectPath.charCodeAt(i);
252
+ hash = (hash << 5) - hash + char;
253
+ hash = hash & hash;
254
+ }
255
+ return `proj_${Math.abs(hash).toString(16)}`;
256
+ }
257
+ /**
258
+ * Truncate string to max length
259
+ */
260
+ function truncate(str, maxLength) {
261
+ if (str.length <= maxLength)
262
+ return str;
263
+ return str.slice(0, maxLength - 3) + '...';
264
+ }
265
+ /**
266
+ * Capitalize first letter
267
+ */
268
+ function capitalizeFirst(str) {
269
+ return str.charAt(0).toUpperCase() + str.slice(1);
270
+ }
271
+ //# sourceMappingURL=insights.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights.js","sourceRoot":"","sources":["../../src/parser/insights.ts"],"names":[],"mappings":"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"}