@code-insights/cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +287 -0
  3. package/dist/commands/connect.d.ts +8 -0
  4. package/dist/commands/connect.d.ts.map +1 -0
  5. package/dist/commands/connect.js +33 -0
  6. package/dist/commands/connect.js.map +1 -0
  7. package/dist/commands/init.d.ts +9 -0
  8. package/dist/commands/init.d.ts.map +1 -0
  9. package/dist/commands/init.js +176 -0
  10. package/dist/commands/init.js.map +1 -0
  11. package/dist/commands/insights.d.ts +13 -0
  12. package/dist/commands/insights.d.ts.map +1 -0
  13. package/dist/commands/insights.js +87 -0
  14. package/dist/commands/insights.js.map +1 -0
  15. package/dist/commands/install-hook.d.ts +9 -0
  16. package/dist/commands/install-hook.d.ts.map +1 -0
  17. package/dist/commands/install-hook.js +98 -0
  18. package/dist/commands/install-hook.js.map +1 -0
  19. package/dist/commands/link.d.ts +8 -0
  20. package/dist/commands/link.d.ts.map +1 -0
  21. package/dist/commands/link.js +39 -0
  22. package/dist/commands/link.js.map +1 -0
  23. package/dist/commands/reset.d.ts +3 -0
  24. package/dist/commands/reset.d.ts.map +1 -0
  25. package/dist/commands/reset.js +95 -0
  26. package/dist/commands/reset.js.map +1 -0
  27. package/dist/commands/status.d.ts +5 -0
  28. package/dist/commands/status.d.ts.map +1 -0
  29. package/dist/commands/status.js +107 -0
  30. package/dist/commands/status.js.map +1 -0
  31. package/dist/commands/sync.d.ts +13 -0
  32. package/dist/commands/sync.d.ts.map +1 -0
  33. package/dist/commands/sync.js +205 -0
  34. package/dist/commands/sync.js.map +1 -0
  35. package/dist/firebase/client.d.ts +35 -0
  36. package/dist/firebase/client.d.ts.map +1 -0
  37. package/dist/firebase/client.js +317 -0
  38. package/dist/firebase/client.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +48 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/parser/insights.d.ts +7 -0
  44. package/dist/parser/insights.d.ts.map +1 -0
  45. package/dist/parser/insights.js +271 -0
  46. package/dist/parser/insights.js.map +1 -0
  47. package/dist/parser/jsonl.d.ts +6 -0
  48. package/dist/parser/jsonl.d.ts.map +1 -0
  49. package/dist/parser/jsonl.js +305 -0
  50. package/dist/parser/jsonl.js.map +1 -0
  51. package/dist/parser/titles.d.ts +14 -0
  52. package/dist/parser/titles.d.ts.map +1 -0
  53. package/dist/parser/titles.js +258 -0
  54. package/dist/parser/titles.js.map +1 -0
  55. package/dist/types.d.ts +216 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +3 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/utils/config.d.ts +46 -0
  60. package/dist/utils/config.d.ts.map +1 -0
  61. package/dist/utils/config.js +106 -0
  62. package/dist/utils/config.js.map +1 -0
  63. package/dist/utils/device.d.ts +32 -0
  64. package/dist/utils/device.d.ts.map +1 -0
  65. package/dist/utils/device.js +132 -0
  66. package/dist/utils/device.js.map +1 -0
  67. package/dist/utils/firebase-json.d.ts +87 -0
  68. package/dist/utils/firebase-json.d.ts.map +1 -0
  69. package/dist/utils/firebase-json.js +206 -0
  70. package/dist/utils/firebase-json.js.map +1 -0
  71. package/dist/utils/pricing.d.ts +29 -0
  72. package/dist/utils/pricing.d.ts.map +1 -0
  73. package/dist/utils/pricing.js +66 -0
  74. package/dist/utils/pricing.js.map +1 -0
  75. package/package.json +56 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { ClaudeInsightConfig, ParsedSession, Project } from '../types.js';
2
+ /**
3
+ * Initialize Firebase Admin SDK
4
+ */
5
+ export declare function initializeFirebase(config: ClaudeInsightConfig): void;
6
+ /**
7
+ * Upload a session to Firestore
8
+ */
9
+ export declare function uploadSession(session: ParsedSession, isForceSync?: boolean): Promise<void>;
10
+ /**
11
+ * Upload messages to Firestore for LLM analysis
12
+ */
13
+ export declare function uploadMessages(session: ParsedSession): Promise<void>;
14
+ /**
15
+ * Check if a session already exists
16
+ */
17
+ export declare function sessionExists(sessionId: string): Promise<boolean>;
18
+ /**
19
+ * Get all projects
20
+ */
21
+ export declare function getProjects(): Promise<Project[]>;
22
+ /**
23
+ * Get recent sessions
24
+ */
25
+ export declare function getRecentSessions(limit?: number): Promise<ParsedSession[]>;
26
+ /**
27
+ * Recalculate usage stats from all sessions in Firestore.
28
+ * Used after --force sync to reconcile totals.
29
+ */
30
+ export declare function recalculateUsageStats(): Promise<{
31
+ sessionsWithUsage: number;
32
+ totalTokens: number;
33
+ estimatedCostUsd: number;
34
+ }>;
35
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/firebase/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAK/E;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAepE;AAYD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiG9F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD1E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIvE;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAetD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA8BpF;AAGD;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC,CAwFD"}
@@ -0,0 +1,317 @@
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 (admin.apps.length > 0) {
9
+ db = admin.firestore();
10
+ return;
11
+ }
12
+ admin.initializeApp({
13
+ credential: admin.credential.cert({
14
+ projectId: config.firebase.projectId,
15
+ clientEmail: config.firebase.clientEmail,
16
+ privateKey: config.firebase.privateKey.replace(/\\n/g, '\n'),
17
+ }),
18
+ });
19
+ db = admin.firestore();
20
+ }
21
+ /**
22
+ * Get Firestore instance
23
+ */
24
+ function getDb() {
25
+ if (!db) {
26
+ throw new Error('Firebase not initialized. Call initializeFirebase first.');
27
+ }
28
+ return db;
29
+ }
30
+ /**
31
+ * Upload a session to Firestore
32
+ */
33
+ export async function uploadSession(session, isForceSync = false) {
34
+ const firestore = getDb();
35
+ // Generate stable project ID (prefers git remote URL)
36
+ const { projectId, source: projectIdSource, gitRemoteUrl } = generateStableProjectId(session.projectPath);
37
+ // Get device info for multi-device support
38
+ const deviceInfo = getDeviceInfo();
39
+ // Check if session already exists (for idempotent session count)
40
+ const sessionRef = firestore.collection('sessions').doc(session.id);
41
+ const existingSession = await sessionRef.get();
42
+ const isNewSession = !existingSession.exists;
43
+ const batch = firestore.batch();
44
+ // Upsert project
45
+ const projectRef = firestore.collection('projects').doc(projectId);
46
+ batch.set(projectRef, {
47
+ name: session.projectName,
48
+ path: session.projectPath,
49
+ gitRemoteUrl: gitRemoteUrl,
50
+ projectIdSource: projectIdSource,
51
+ lastActivity: admin.firestore.Timestamp.fromDate(session.endedAt),
52
+ updatedAt: admin.firestore.FieldValue.serverTimestamp(),
53
+ }, { merge: true });
54
+ // Only increment session count for NEW sessions (idempotent)
55
+ if (isNewSession) {
56
+ const incrementFields = {
57
+ sessionCount: admin.firestore.FieldValue.increment(1),
58
+ };
59
+ if (!isForceSync && session.usage) {
60
+ incrementFields.totalInputTokens = admin.firestore.FieldValue.increment(session.usage.totalInputTokens);
61
+ incrementFields.totalOutputTokens = admin.firestore.FieldValue.increment(session.usage.totalOutputTokens);
62
+ incrementFields.cacheCreationTokens = admin.firestore.FieldValue.increment(session.usage.cacheCreationTokens);
63
+ incrementFields.cacheReadTokens = admin.firestore.FieldValue.increment(session.usage.cacheReadTokens);
64
+ incrementFields.estimatedCostUsd = admin.firestore.FieldValue.increment(session.usage.estimatedCostUsd);
65
+ }
66
+ batch.update(projectRef, incrementFields);
67
+ }
68
+ // Upload session with device info
69
+ batch.set(sessionRef, {
70
+ projectId: projectId,
71
+ projectName: session.projectName,
72
+ projectPath: session.projectPath,
73
+ gitRemoteUrl: gitRemoteUrl,
74
+ summary: session.summary,
75
+ generatedTitle: session.generatedTitle,
76
+ titleSource: session.titleSource,
77
+ sessionCharacter: session.sessionCharacter,
78
+ startedAt: admin.firestore.Timestamp.fromDate(session.startedAt),
79
+ endedAt: admin.firestore.Timestamp.fromDate(session.endedAt),
80
+ messageCount: session.messageCount,
81
+ userMessageCount: session.userMessageCount,
82
+ assistantMessageCount: session.assistantMessageCount,
83
+ toolCallCount: session.toolCallCount,
84
+ gitBranch: session.gitBranch,
85
+ claudeVersion: session.claudeVersion,
86
+ // Device info for multi-device tracking
87
+ deviceId: deviceInfo.deviceId,
88
+ deviceHostname: deviceInfo.hostname,
89
+ devicePlatform: deviceInfo.platform,
90
+ syncedAt: admin.firestore.FieldValue.serverTimestamp(),
91
+ // Usage stats (conditional — absent for older sessions without token data)
92
+ ...(session.usage ? {
93
+ totalInputTokens: session.usage.totalInputTokens,
94
+ totalOutputTokens: session.usage.totalOutputTokens,
95
+ cacheCreationTokens: session.usage.cacheCreationTokens,
96
+ cacheReadTokens: session.usage.cacheReadTokens,
97
+ estimatedCostUsd: session.usage.estimatedCostUsd,
98
+ modelsUsed: session.usage.modelsUsed,
99
+ primaryModel: session.usage.primaryModel,
100
+ usageSource: session.usage.usageSource,
101
+ } : {}),
102
+ });
103
+ // Atomically increment usage stats for new sessions (non-force only)
104
+ if (isNewSession && !isForceSync && session.usage) {
105
+ const statsRef = firestore.collection('stats').doc('usage');
106
+ batch.set(statsRef, {
107
+ totalInputTokens: admin.firestore.FieldValue.increment(session.usage.totalInputTokens),
108
+ totalOutputTokens: admin.firestore.FieldValue.increment(session.usage.totalOutputTokens),
109
+ cacheCreationTokens: admin.firestore.FieldValue.increment(session.usage.cacheCreationTokens),
110
+ cacheReadTokens: admin.firestore.FieldValue.increment(session.usage.cacheReadTokens),
111
+ estimatedCostUsd: admin.firestore.FieldValue.increment(session.usage.estimatedCostUsd),
112
+ sessionsWithUsage: admin.firestore.FieldValue.increment(1),
113
+ lastUpdatedAt: admin.firestore.FieldValue.serverTimestamp(),
114
+ }, { merge: true });
115
+ }
116
+ await batch.commit();
117
+ }
118
+ /**
119
+ * Upload messages to Firestore for LLM analysis
120
+ */
121
+ export async function uploadMessages(session) {
122
+ if (session.messages.length === 0)
123
+ return;
124
+ const firestore = getDb();
125
+ const batches = [];
126
+ let currentBatch = firestore.batch();
127
+ let operationCount = 0;
128
+ for (const message of session.messages) {
129
+ const messageRef = firestore.collection('messages').doc(message.id);
130
+ currentBatch.set(messageRef, {
131
+ sessionId: message.sessionId,
132
+ type: message.type,
133
+ content: truncateContent(message.content, 10000),
134
+ thinking: message.thinking
135
+ ? truncateContent(message.thinking, 5000)
136
+ : null,
137
+ toolCalls: message.toolCalls.map((tc) => ({
138
+ id: tc.id,
139
+ name: tc.name,
140
+ input: JSON.stringify(tc.input).slice(0, 1000),
141
+ })),
142
+ toolResults: message.toolResults.map((tr) => ({
143
+ toolUseId: tr.toolUseId,
144
+ output: truncateContent(tr.output, 2000),
145
+ })),
146
+ timestamp: admin.firestore.Timestamp.fromDate(message.timestamp),
147
+ parentId: message.parentId,
148
+ // Per-message usage (assistant messages only)
149
+ ...(message.usage ? {
150
+ usage: {
151
+ inputTokens: message.usage.inputTokens,
152
+ outputTokens: message.usage.outputTokens,
153
+ cacheCreationTokens: message.usage.cacheCreationTokens,
154
+ cacheReadTokens: message.usage.cacheReadTokens,
155
+ model: message.usage.model,
156
+ estimatedCostUsd: message.usage.estimatedCostUsd,
157
+ },
158
+ } : {}),
159
+ });
160
+ operationCount++;
161
+ if (operationCount >= 500) {
162
+ batches.push(currentBatch);
163
+ currentBatch = firestore.batch();
164
+ operationCount = 0;
165
+ }
166
+ }
167
+ if (operationCount > 0) {
168
+ batches.push(currentBatch);
169
+ }
170
+ await Promise.all(batches.map((batch) => batch.commit()));
171
+ }
172
+ /**
173
+ * Check if a session already exists
174
+ */
175
+ export async function sessionExists(sessionId) {
176
+ const firestore = getDb();
177
+ const doc = await firestore.collection('sessions').doc(sessionId).get();
178
+ return doc.exists;
179
+ }
180
+ /**
181
+ * Get all projects
182
+ */
183
+ export async function getProjects() {
184
+ const firestore = getDb();
185
+ const snapshot = await firestore.collection('projects').orderBy('lastActivity', 'desc').get();
186
+ return snapshot.docs.map((doc) => {
187
+ const data = doc.data();
188
+ return {
189
+ id: doc.id,
190
+ name: data.name,
191
+ path: data.path,
192
+ sessionCount: data.sessionCount || 0,
193
+ lastActivity: data.lastActivity?.toDate() || new Date(),
194
+ createdAt: data.createdAt?.toDate() || new Date(),
195
+ };
196
+ });
197
+ }
198
+ /**
199
+ * Get recent sessions
200
+ */
201
+ export async function getRecentSessions(limit = 10) {
202
+ const firestore = getDb();
203
+ const snapshot = await firestore
204
+ .collection('sessions')
205
+ .orderBy('endedAt', 'desc')
206
+ .limit(limit)
207
+ .get();
208
+ return snapshot.docs.map((doc) => {
209
+ const data = doc.data();
210
+ return {
211
+ id: doc.id,
212
+ projectPath: data.projectPath,
213
+ projectName: data.projectName,
214
+ summary: data.summary,
215
+ startedAt: data.startedAt?.toDate() || new Date(),
216
+ endedAt: data.endedAt?.toDate() || new Date(),
217
+ messageCount: data.messageCount,
218
+ userMessageCount: data.userMessageCount,
219
+ assistantMessageCount: data.assistantMessageCount,
220
+ toolCallCount: data.toolCallCount,
221
+ messages: [],
222
+ insights: [],
223
+ gitBranch: data.gitBranch,
224
+ claudeVersion: data.claudeVersion,
225
+ generatedTitle: data.generatedTitle || null,
226
+ titleSource: data.titleSource || null,
227
+ sessionCharacter: data.sessionCharacter || null,
228
+ };
229
+ });
230
+ }
231
+ /**
232
+ * Recalculate usage stats from all sessions in Firestore.
233
+ * Used after --force sync to reconcile totals.
234
+ */
235
+ export async function recalculateUsageStats() {
236
+ const firestore = getDb();
237
+ // Query all sessions that have usage data
238
+ const snapshot = await firestore
239
+ .collection('sessions')
240
+ .where('usageSource', '==', 'jsonl')
241
+ .get();
242
+ // Aggregate global + per-project totals
243
+ const global = {
244
+ totalInputTokens: 0,
245
+ totalOutputTokens: 0,
246
+ cacheCreationTokens: 0,
247
+ cacheReadTokens: 0,
248
+ estimatedCostUsd: 0,
249
+ sessionsWithUsage: 0,
250
+ };
251
+ const perProject = {};
252
+ for (const doc of snapshot.docs) {
253
+ const data = doc.data();
254
+ global.totalInputTokens += data.totalInputTokens ?? 0;
255
+ global.totalOutputTokens += data.totalOutputTokens ?? 0;
256
+ global.cacheCreationTokens += data.cacheCreationTokens ?? 0;
257
+ global.cacheReadTokens += data.cacheReadTokens ?? 0;
258
+ global.estimatedCostUsd += data.estimatedCostUsd ?? 0;
259
+ global.sessionsWithUsage++;
260
+ const pid = data.projectId;
261
+ if (pid) {
262
+ if (!perProject[pid]) {
263
+ perProject[pid] = {
264
+ totalInputTokens: 0,
265
+ totalOutputTokens: 0,
266
+ cacheCreationTokens: 0,
267
+ cacheReadTokens: 0,
268
+ estimatedCostUsd: 0,
269
+ };
270
+ }
271
+ perProject[pid].totalInputTokens += data.totalInputTokens ?? 0;
272
+ perProject[pid].totalOutputTokens += data.totalOutputTokens ?? 0;
273
+ perProject[pid].cacheCreationTokens += data.cacheCreationTokens ?? 0;
274
+ perProject[pid].cacheReadTokens += data.cacheReadTokens ?? 0;
275
+ perProject[pid].estimatedCostUsd += data.estimatedCostUsd ?? 0;
276
+ }
277
+ }
278
+ // Write global stats (overwrite, not merge)
279
+ const statsRef = firestore.collection('stats').doc('usage');
280
+ await statsRef.set({
281
+ ...global,
282
+ lastUpdatedAt: admin.firestore.FieldValue.serverTimestamp(),
283
+ });
284
+ // Update each project's usage fields
285
+ const batches = [];
286
+ let currentBatch = firestore.batch();
287
+ let opCount = 0;
288
+ for (const [projectId, usage] of Object.entries(perProject)) {
289
+ const projectRef = firestore.collection('projects').doc(projectId);
290
+ currentBatch.set(projectRef, usage, { merge: true });
291
+ opCount++;
292
+ if (opCount >= 500) {
293
+ batches.push(currentBatch);
294
+ currentBatch = firestore.batch();
295
+ opCount = 0;
296
+ }
297
+ }
298
+ if (opCount > 0)
299
+ batches.push(currentBatch);
300
+ await Promise.all(batches.map(b => b.commit()));
301
+ const totalTokens = global.totalInputTokens + global.totalOutputTokens
302
+ + global.cacheCreationTokens + global.cacheReadTokens;
303
+ return {
304
+ sessionsWithUsage: global.sessionsWithUsage,
305
+ totalTokens,
306
+ estimatedCostUsd: global.estimatedCostUsd,
307
+ };
308
+ }
309
+ /**
310
+ * Truncate content to max length
311
+ */
312
+ function truncateContent(content, maxLength) {
313
+ if (content.length <= maxLength)
314
+ return content;
315
+ return content.slice(0, maxLength - 20) + '\n... [truncated]';
316
+ }
317
+ //# 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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { initCommand } from './commands/init.js';
4
+ import { syncCommand } from './commands/sync.js';
5
+ import { statusCommand } from './commands/status.js';
6
+ import { installHookCommand, uninstallHookCommand } from './commands/install-hook.js';
7
+ import { connectCommand } from './commands/connect.js';
8
+ import { resetCommand } from './commands/reset.js';
9
+ const program = new Command();
10
+ program
11
+ .name('code-insights')
12
+ .description('Sync your AI coding sessions to Firebase for analysis')
13
+ .version('1.0.0');
14
+ program
15
+ .command('init')
16
+ .description('Configure Code Insights with your Firebase credentials')
17
+ .option('--from-json <path>', 'Path to Firebase service account JSON file')
18
+ .option('--web-config <path>', 'Path to Firebase web SDK config JSON file')
19
+ .action(initCommand);
20
+ program
21
+ .command('sync')
22
+ .description('Sync Claude Code sessions to Firestore')
23
+ .option('-f, --force', 'Force re-sync all sessions')
24
+ .option('-p, --project <name>', 'Only sync sessions from a specific project')
25
+ .option('--dry-run', 'Show what would be synced without making changes')
26
+ .option('-q, --quiet', 'Suppress output (useful for hooks)')
27
+ .option('--regenerate-titles', 'Regenerate titles for all sessions')
28
+ .action(syncCommand);
29
+ program
30
+ .command('status')
31
+ .description('Show Code Insights status and statistics')
32
+ .action(statusCommand);
33
+ program
34
+ .command('install-hook')
35
+ .description('Install Claude Code hook for automatic sync')
36
+ .action(installHookCommand);
37
+ program
38
+ .command('uninstall-hook')
39
+ .description('Remove Claude Code hook')
40
+ .action(uninstallHookCommand);
41
+ program
42
+ .command('connect')
43
+ .description('Generate a URL to connect the web dashboard to your Firebase')
44
+ .option('--no-qr', 'Skip QR code output')
45
+ .action(connectCommand);
46
+ program.addCommand(resetCommand);
47
+ program.parse();
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,uDAAuD,CAAC;KACpE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,oBAAoB,EAAE,4CAA4C,CAAC;KAC1E,MAAM,CAAC,qBAAqB,EAAE,2CAA2C,CAAC;KAC1E,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,aAAa,EAAE,4BAA4B,CAAC;KACnD,MAAM,CAAC,sBAAsB,EAAE,4CAA4C,CAAC;KAC5E,MAAM,CAAC,WAAW,EAAE,kDAAkD,CAAC;KACvE,MAAM,CAAC,aAAa,EAAE,oCAAoC,CAAC;KAC3D,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,CAAC;KACnE,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE9B,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAEhC,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,SAAS,EAAE,qBAAqB,CAAC;KACxC,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -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"}