@code-insights/cli 3.0.3 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dashboard-dist/assets/{index-CUWKxcRo.js → index-BuJps5yp.js} +40 -40
- package/dashboard-dist/index.html +1 -1
- package/dist/commands/connect.d.ts +5 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +39 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/insights.d.ts +13 -0
- package/dist/commands/insights.d.ts.map +1 -0
- package/dist/commands/insights.js +87 -0
- package/dist/commands/insights.js.map +1 -0
- package/dist/commands/link.d.ts +8 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +39 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/stats/data/cache.d.ts +29 -0
- package/dist/commands/stats/data/cache.d.ts.map +1 -0
- package/dist/commands/stats/data/cache.js +197 -0
- package/dist/commands/stats/data/cache.js.map +1 -0
- package/dist/commands/stats/data/firestore.d.ts +13 -0
- package/dist/commands/stats/data/firestore.d.ts.map +1 -0
- package/dist/commands/stats/data/firestore.js +170 -0
- package/dist/commands/stats/data/firestore.js.map +1 -0
- package/dist/commands/sync.d.ts +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +52 -23
- package/dist/commands/sync.js.map +1 -1
- package/dist/db/schema.d.ts +1 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +1 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/db/write.d.ts +5 -0
- package/dist/db/write.d.ts.map +1 -1
- package/dist/db/write.js +11 -0
- package/dist/db/write.js.map +1 -1
- package/dist/firebase/client.d.ts +45 -0
- package/dist/firebase/client.d.ts.map +1 -0
- package/dist/firebase/client.js +344 -0
- package/dist/firebase/client.js.map +1 -0
- package/dist/index.js +0 -0
- package/dist/parser/insights.d.ts +7 -0
- package/dist/parser/insights.d.ts.map +1 -0
- package/dist/parser/insights.js +271 -0
- package/dist/parser/insights.js.map +1 -0
- package/dist/providers/codex.js +31 -0
- package/dist/providers/codex.js.map +1 -1
- package/dist/providers/copilot-cli.js +14 -2
- package/dist/providers/copilot-cli.js.map +1 -1
- package/dist/providers/cursor.js +44 -2
- package/dist/providers/cursor.js.map +1 -1
- package/dist/utils/firebase-json.d.ts +87 -0
- package/dist/utils/firebase-json.d.ts.map +1 -0
- package/dist/utils/firebase-json.js +207 -0
- package/dist/utils/firebase-json.js.map +1 -0
- package/dist/utils/telemetry.d.ts.map +1 -1
- package/dist/utils/telemetry.js +28 -3
- package/dist/utils/telemetry.js.map +1 -1
- package/package.json +3 -1
- package/server-dist/index.d.ts +9 -1
- package/server-dist/index.d.ts.map +1 -1
- package/server-dist/index.js +15 -5
- package/server-dist/index.js.map +1 -1
|
@@ -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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"}
|