@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,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,6 @@
1
+ import type { ParsedSession } from '../types.js';
2
+ /**
3
+ * Parse a single JSONL file and extract session data
4
+ */
5
+ export declare function parseJsonlFile(filePath: string): Promise<ParsedSession | null>;
6
+ //# sourceMappingURL=jsonl.d.ts.map
@@ -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"}