@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.
- package/LICENSE +21 -0
- package/README.md +287 -0
- package/dist/commands/connect.d.ts +8 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +33 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +176 -0
- package/dist/commands/init.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/install-hook.d.ts +9 -0
- package/dist/commands/install-hook.d.ts.map +1 -0
- package/dist/commands/install-hook.js +98 -0
- package/dist/commands/install-hook.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/reset.d.ts +3 -0
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +95 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +107 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +13 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +205 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/firebase/client.d.ts +35 -0
- package/dist/firebase/client.d.ts.map +1 -0
- package/dist/firebase/client.js +317 -0
- package/dist/firebase/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -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/parser/jsonl.d.ts +6 -0
- package/dist/parser/jsonl.d.ts.map +1 -0
- package/dist/parser/jsonl.js +305 -0
- package/dist/parser/jsonl.js.map +1 -0
- package/dist/parser/titles.d.ts +14 -0
- package/dist/parser/titles.d.ts.map +1 -0
- package/dist/parser/titles.js +258 -0
- package/dist/parser/titles.js.map +1 -0
- package/dist/types.d.ts +216 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +46 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +106 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/device.d.ts +32 -0
- package/dist/utils/device.d.ts.map +1 -0
- package/dist/utils/device.js +132 -0
- package/dist/utils/device.js.map +1 -0
- 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 +206 -0
- package/dist/utils/firebase-json.js.map +1 -0
- package/dist/utils/pricing.d.ts +29 -0
- package/dist/utils/pricing.d.ts.map +1 -0
- package/dist/utils/pricing.js +66 -0
- package/dist/utils/pricing.js.map +1 -0
- package/package.json +56 -0
|
@@ -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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../src/parser/jsonl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAIV,aAAa,EAOd,MAAM,aAAa,CAAC;AAIrB;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA0BpF"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as readline from 'readline';
|
|
3
|
+
import { generateTitle } from './titles.js';
|
|
4
|
+
import { calculateCost } from '../utils/pricing.js';
|
|
5
|
+
/**
|
|
6
|
+
* Parse a single JSONL file and extract session data
|
|
7
|
+
*/
|
|
8
|
+
export async function parseJsonlFile(filePath) {
|
|
9
|
+
const entries = [];
|
|
10
|
+
const fileStream = fs.createReadStream(filePath);
|
|
11
|
+
const rl = readline.createInterface({
|
|
12
|
+
input: fileStream,
|
|
13
|
+
crlfDelay: Infinity,
|
|
14
|
+
});
|
|
15
|
+
for await (const line of rl) {
|
|
16
|
+
if (line.trim()) {
|
|
17
|
+
try {
|
|
18
|
+
const entry = JSON.parse(line);
|
|
19
|
+
entries.push(entry);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Skip malformed lines
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (entries.length === 0) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return buildSession(filePath, entries);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build a ParsedSession from JSONL entries
|
|
34
|
+
*/
|
|
35
|
+
function buildSession(filePath, entries) {
|
|
36
|
+
// Extract session ID from filename
|
|
37
|
+
const sessionId = extractSessionId(filePath);
|
|
38
|
+
if (!sessionId)
|
|
39
|
+
return null;
|
|
40
|
+
// Find summary entries
|
|
41
|
+
const summaries = entries.filter((e) => e.type === 'summary');
|
|
42
|
+
const summary = summaries.length > 0 ? summaries[summaries.length - 1].summary : null;
|
|
43
|
+
// Find all messages
|
|
44
|
+
const messages = entries.filter((e) => e.type === 'user' || e.type === 'assistant' || e.type === 'system');
|
|
45
|
+
if (messages.length === 0) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
// Extract metadata from first message
|
|
49
|
+
const firstMessage = messages[0];
|
|
50
|
+
const projectPath = firstMessage.cwd || extractProjectPath(filePath);
|
|
51
|
+
const projectName = extractProjectName(projectPath);
|
|
52
|
+
const gitBranch = firstMessage.gitBranch || null;
|
|
53
|
+
const claudeVersion = firstMessage.version || null;
|
|
54
|
+
// Parse all messages
|
|
55
|
+
const parsedMessages = [];
|
|
56
|
+
let toolCallCount = 0;
|
|
57
|
+
let userMessageCount = 0;
|
|
58
|
+
let assistantMessageCount = 0;
|
|
59
|
+
for (const msg of messages) {
|
|
60
|
+
// Skip meta messages
|
|
61
|
+
if (msg.isMeta)
|
|
62
|
+
continue;
|
|
63
|
+
const parsed = parseMessage(msg, sessionId);
|
|
64
|
+
if (parsed) {
|
|
65
|
+
parsedMessages.push(parsed);
|
|
66
|
+
toolCallCount += parsed.toolCalls.length;
|
|
67
|
+
if (msg.type === 'user')
|
|
68
|
+
userMessageCount++;
|
|
69
|
+
if (msg.type === 'assistant')
|
|
70
|
+
assistantMessageCount++;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Extract usage data from raw messages
|
|
74
|
+
const usageEntries = [];
|
|
75
|
+
for (const msg of messages) {
|
|
76
|
+
if (msg.isMeta)
|
|
77
|
+
continue;
|
|
78
|
+
if (msg.message?.model && msg.message?.usage) {
|
|
79
|
+
usageEntries.push({
|
|
80
|
+
model: msg.message.model,
|
|
81
|
+
usage: msg.message.usage,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Aggregate usage stats
|
|
86
|
+
let usage;
|
|
87
|
+
if (usageEntries.length > 0) {
|
|
88
|
+
const totalInputTokens = usageEntries.reduce((sum, e) => sum + (e.usage.input_tokens ?? 0), 0);
|
|
89
|
+
const totalOutputTokens = usageEntries.reduce((sum, e) => sum + (e.usage.output_tokens ?? 0), 0);
|
|
90
|
+
const cacheCreationTokens = usageEntries.reduce((sum, e) => sum + (e.usage.cache_creation_input_tokens ?? 0), 0);
|
|
91
|
+
const cacheReadTokens = usageEntries.reduce((sum, e) => sum + (e.usage.cache_read_input_tokens ?? 0), 0);
|
|
92
|
+
// Count turns per model to find primary model
|
|
93
|
+
const modelCounts = new Map();
|
|
94
|
+
for (const e of usageEntries) {
|
|
95
|
+
modelCounts.set(e.model, (modelCounts.get(e.model) ?? 0) + 1);
|
|
96
|
+
}
|
|
97
|
+
const modelsUsed = [...modelCounts.keys()];
|
|
98
|
+
const primaryModel = [...modelsUsed].sort((a, b) => (modelCounts.get(b) ?? 0) - (modelCounts.get(a) ?? 0))[0] ?? 'unknown';
|
|
99
|
+
usage = {
|
|
100
|
+
totalInputTokens,
|
|
101
|
+
totalOutputTokens,
|
|
102
|
+
cacheCreationTokens,
|
|
103
|
+
cacheReadTokens,
|
|
104
|
+
estimatedCostUsd: calculateCost(usageEntries),
|
|
105
|
+
modelsUsed,
|
|
106
|
+
primaryModel,
|
|
107
|
+
usageSource: 'jsonl',
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (parsedMessages.length === 0) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
// Get timestamps
|
|
114
|
+
const timestamps = parsedMessages.map((m) => m.timestamp.getTime());
|
|
115
|
+
const startedAt = new Date(Math.min(...timestamps));
|
|
116
|
+
const endedAt = new Date(Math.max(...timestamps));
|
|
117
|
+
// Build session object
|
|
118
|
+
const session = {
|
|
119
|
+
id: sessionId,
|
|
120
|
+
projectPath,
|
|
121
|
+
projectName,
|
|
122
|
+
summary,
|
|
123
|
+
generatedTitle: null,
|
|
124
|
+
titleSource: null,
|
|
125
|
+
sessionCharacter: null,
|
|
126
|
+
startedAt,
|
|
127
|
+
endedAt,
|
|
128
|
+
messageCount: parsedMessages.length,
|
|
129
|
+
userMessageCount,
|
|
130
|
+
assistantMessageCount,
|
|
131
|
+
toolCallCount,
|
|
132
|
+
gitBranch,
|
|
133
|
+
claudeVersion,
|
|
134
|
+
messages: parsedMessages,
|
|
135
|
+
usage,
|
|
136
|
+
};
|
|
137
|
+
// Generate smart title (no longer depends on insights)
|
|
138
|
+
const titleResult = generateTitle(session);
|
|
139
|
+
return {
|
|
140
|
+
...session,
|
|
141
|
+
generatedTitle: titleResult.title,
|
|
142
|
+
titleSource: titleResult.source,
|
|
143
|
+
sessionCharacter: titleResult.character,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Parse a single message entry
|
|
148
|
+
*/
|
|
149
|
+
function parseMessage(msg, sessionId) {
|
|
150
|
+
// Skip messages without proper structure
|
|
151
|
+
if (!msg.message || !msg.message.content) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const content = extractTextContent(msg.message.content);
|
|
155
|
+
const thinking = extractThinkingContent(msg.message.content);
|
|
156
|
+
const toolCalls = extractToolCalls(msg.message.content);
|
|
157
|
+
const toolResults = extractToolResults(msg.message.content);
|
|
158
|
+
// Skip empty messages (but keep if there's thinking or tool results)
|
|
159
|
+
if (!content && toolCalls.length === 0 && !thinking && toolResults.length === 0) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
// Per-message usage (assistant messages only)
|
|
163
|
+
let usage = null;
|
|
164
|
+
if (msg.type === 'assistant' && msg.message.model && msg.message.usage) {
|
|
165
|
+
const u = msg.message.usage;
|
|
166
|
+
const model = msg.message.model;
|
|
167
|
+
const inputTokens = u.input_tokens ?? 0;
|
|
168
|
+
const outputTokens = u.output_tokens ?? 0;
|
|
169
|
+
const cacheCreationTokens = u.cache_creation_input_tokens ?? 0;
|
|
170
|
+
const cacheReadTokens = u.cache_read_input_tokens ?? 0;
|
|
171
|
+
const costEntries = [{ model, usage: u }];
|
|
172
|
+
const estimatedCostUsd = calculateCost(costEntries);
|
|
173
|
+
usage = {
|
|
174
|
+
inputTokens,
|
|
175
|
+
outputTokens,
|
|
176
|
+
cacheCreationTokens,
|
|
177
|
+
cacheReadTokens,
|
|
178
|
+
model,
|
|
179
|
+
estimatedCostUsd,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
id: msg.uuid,
|
|
184
|
+
sessionId,
|
|
185
|
+
type: msg.type,
|
|
186
|
+
content,
|
|
187
|
+
thinking,
|
|
188
|
+
toolCalls,
|
|
189
|
+
toolResults,
|
|
190
|
+
usage,
|
|
191
|
+
timestamp: new Date(msg.timestamp),
|
|
192
|
+
parentId: msg.parentUuid || null,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Extract text content from message content
|
|
197
|
+
*/
|
|
198
|
+
function extractTextContent(content) {
|
|
199
|
+
if (typeof content === 'string') {
|
|
200
|
+
return content;
|
|
201
|
+
}
|
|
202
|
+
const textParts = [];
|
|
203
|
+
for (const part of content) {
|
|
204
|
+
if (part.type === 'text' && part.text) {
|
|
205
|
+
textParts.push(part.text);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return textParts.join('\n');
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Extract tool calls from message content
|
|
212
|
+
*/
|
|
213
|
+
function extractToolCalls(content) {
|
|
214
|
+
if (typeof content === 'string') {
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
const toolCalls = [];
|
|
218
|
+
for (const part of content) {
|
|
219
|
+
if (part.type === 'tool_use' && part.name) {
|
|
220
|
+
toolCalls.push({
|
|
221
|
+
id: part.id || '', // capture tool_use_id
|
|
222
|
+
name: part.name,
|
|
223
|
+
input: part.input || {},
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return toolCalls;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Extract thinking content from assistant messages
|
|
231
|
+
*/
|
|
232
|
+
function extractThinkingContent(content) {
|
|
233
|
+
if (typeof content === 'string')
|
|
234
|
+
return null;
|
|
235
|
+
const thinkingParts = [];
|
|
236
|
+
for (const part of content) {
|
|
237
|
+
if (part.type === 'thinking' && part.thinking) {
|
|
238
|
+
thinkingParts.push(part.thinking);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return thinkingParts.length > 0 ? thinkingParts.join('\n') : null;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Extract tool results from user messages
|
|
245
|
+
*/
|
|
246
|
+
function extractToolResults(content) {
|
|
247
|
+
if (typeof content === 'string')
|
|
248
|
+
return [];
|
|
249
|
+
const results = [];
|
|
250
|
+
for (const part of content) {
|
|
251
|
+
if (part.type === 'tool_result' && part.tool_use_id) {
|
|
252
|
+
let output;
|
|
253
|
+
if (typeof part.content === 'string') {
|
|
254
|
+
output = part.content;
|
|
255
|
+
}
|
|
256
|
+
else if (Array.isArray(part.content)) {
|
|
257
|
+
output = part.content
|
|
258
|
+
.filter(sub => sub.type === 'text' && sub.text)
|
|
259
|
+
.map(sub => sub.text)
|
|
260
|
+
.join('\n');
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
output = '';
|
|
264
|
+
}
|
|
265
|
+
results.push({
|
|
266
|
+
toolUseId: part.tool_use_id,
|
|
267
|
+
output,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return results;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Extract session ID from file path
|
|
275
|
+
*/
|
|
276
|
+
function extractSessionId(filePath) {
|
|
277
|
+
const filename = filePath.split('/').pop();
|
|
278
|
+
if (!filename)
|
|
279
|
+
return null;
|
|
280
|
+
// Handle both UUID.jsonl and agent-*.jsonl formats
|
|
281
|
+
const match = filename.match(/^([a-f0-9-]+|agent-[a-f0-9]+)\.jsonl$/);
|
|
282
|
+
return match ? match[1] : null;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Extract project path from file path
|
|
286
|
+
*/
|
|
287
|
+
function extractProjectPath(filePath) {
|
|
288
|
+
// File path format: ~/.claude/projects/-Users-name-path-to-project/session.jsonl
|
|
289
|
+
const parts = filePath.split('/');
|
|
290
|
+
const projectDirIndex = parts.findIndex((p) => p === 'projects');
|
|
291
|
+
if (projectDirIndex >= 0 && projectDirIndex < parts.length - 1) {
|
|
292
|
+
const encodedPath = parts[projectDirIndex + 1];
|
|
293
|
+
// Convert -Users-name-path to /Users/name/path
|
|
294
|
+
return encodedPath.replace(/^-/, '/').replace(/-/g, '/');
|
|
295
|
+
}
|
|
296
|
+
return filePath;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Extract project name from project path
|
|
300
|
+
*/
|
|
301
|
+
function extractProjectName(projectPath) {
|
|
302
|
+
const parts = projectPath.split('/').filter(Boolean);
|
|
303
|
+
return parts[parts.length - 1] || 'unknown';
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=jsonl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../src/parser/jsonl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ParsedSession, SessionCharacter, GeneratedTitle } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a smart title for a session
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateTitle(session: ParsedSession): GeneratedTitle;
|
|
6
|
+
/**
|
|
7
|
+
* Detect the session's character based on patterns
|
|
8
|
+
*/
|
|
9
|
+
export declare function detectSessionCharacter(session: ParsedSession): SessionCharacter | null;
|
|
10
|
+
/**
|
|
11
|
+
* Clean and format a title
|
|
12
|
+
*/
|
|
13
|
+
export declare function cleanTitle(raw: string): string;
|
|
14
|
+
//# sourceMappingURL=titles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"titles.d.ts","sourceRoot":"","sources":["../../src/parser/titles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAEb,gBAAgB,EAEhB,cAAc,EACf,MAAM,aAAa,CAAC;AAkBrB;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,CA8CpE;AA6DD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,gBAAgB,GAAG,IAAI,CAgEtF;AAsFD;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiB9C"}
|