@code-insights/cli 3.5.0 → 3.5.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 +11 -0
- package/dashboard-dist/dist/assets/index-CFvScypR.css +1 -0
- package/dashboard-dist/dist/assets/index-CyMrlee5.js +592 -0
- package/dashboard-dist/dist/favicon.svg +18 -0
- package/dashboard-dist/dist/index.html +33 -0
- package/package.json +2 -2
- package/server-dist/dist/index.d.ts +20 -0
- package/server-dist/dist/index.d.ts.map +1 -0
- package/server-dist/dist/index.js +109 -0
- package/server-dist/dist/index.js.map +1 -0
- package/server-dist/dist/llm/analysis.d.ts +84 -0
- package/server-dist/dist/llm/analysis.d.ts.map +1 -0
- package/server-dist/dist/llm/analysis.js +550 -0
- package/server-dist/dist/llm/analysis.js.map +1 -0
- package/server-dist/dist/llm/client.d.ts +27 -0
- package/server-dist/dist/llm/client.d.ts.map +1 -0
- package/server-dist/dist/llm/client.js +71 -0
- package/server-dist/dist/llm/client.js.map +1 -0
- package/server-dist/dist/llm/index.d.ts +7 -0
- package/server-dist/dist/llm/index.d.ts.map +1 -0
- package/server-dist/dist/llm/index.js +5 -0
- package/server-dist/dist/llm/index.js.map +1 -0
- package/server-dist/dist/llm/prompts.d.ts +109 -0
- package/server-dist/dist/llm/prompts.d.ts.map +1 -0
- package/server-dist/dist/llm/prompts.js +381 -0
- package/server-dist/dist/llm/prompts.js.map +1 -0
- package/server-dist/dist/llm/providers/anthropic.d.ts +3 -0
- package/server-dist/dist/llm/providers/anthropic.d.ts.map +1 -0
- package/server-dist/dist/llm/providers/anthropic.js +45 -0
- package/server-dist/dist/llm/providers/anthropic.js.map +1 -0
- package/server-dist/dist/llm/providers/gemini.d.ts +3 -0
- package/server-dist/dist/llm/providers/gemini.d.ts.map +1 -0
- package/server-dist/dist/llm/providers/gemini.js +51 -0
- package/server-dist/dist/llm/providers/gemini.js.map +1 -0
- package/server-dist/dist/llm/providers/ollama.d.ts +12 -0
- package/server-dist/dist/llm/providers/ollama.d.ts.map +1 -0
- package/server-dist/dist/llm/providers/ollama.js +61 -0
- package/server-dist/dist/llm/providers/ollama.js.map +1 -0
- package/server-dist/dist/llm/providers/openai.d.ts +3 -0
- package/server-dist/dist/llm/providers/openai.d.ts.map +1 -0
- package/server-dist/dist/llm/providers/openai.js +40 -0
- package/server-dist/dist/llm/providers/openai.js.map +1 -0
- package/server-dist/dist/llm/types.d.ts +22 -0
- package/server-dist/dist/llm/types.d.ts.map +1 -0
- package/server-dist/dist/llm/types.js +5 -0
- package/server-dist/dist/llm/types.js.map +1 -0
- package/server-dist/dist/routes/analysis.d.ts +4 -0
- package/server-dist/dist/routes/analysis.d.ts.map +1 -0
- package/server-dist/dist/routes/analysis.js +370 -0
- package/server-dist/dist/routes/analysis.js.map +1 -0
- package/server-dist/dist/routes/analytics.d.ts +4 -0
- package/server-dist/dist/routes/analytics.d.ts.map +1 -0
- package/server-dist/dist/routes/analytics.js +57 -0
- package/server-dist/dist/routes/analytics.js.map +1 -0
- package/server-dist/dist/routes/config.d.ts +4 -0
- package/server-dist/dist/routes/config.d.ts.map +1 -0
- package/server-dist/dist/routes/config.js +108 -0
- package/server-dist/dist/routes/config.js.map +1 -0
- package/server-dist/dist/routes/export.d.ts +4 -0
- package/server-dist/dist/routes/export.d.ts.map +1 -0
- package/server-dist/dist/routes/export.js +52 -0
- package/server-dist/dist/routes/export.js.map +1 -0
- package/server-dist/dist/routes/insights.d.ts +4 -0
- package/server-dist/dist/routes/insights.d.ts.map +1 -0
- package/server-dist/dist/routes/insights.js +80 -0
- package/server-dist/dist/routes/insights.js.map +1 -0
- package/server-dist/dist/routes/messages.d.ts +4 -0
- package/server-dist/dist/routes/messages.d.ts.map +1 -0
- package/server-dist/dist/routes/messages.js +19 -0
- package/server-dist/dist/routes/messages.js.map +1 -0
- package/server-dist/dist/routes/projects.d.ts +4 -0
- package/server-dist/dist/routes/projects.d.ts.map +1 -0
- package/server-dist/dist/routes/projects.js +32 -0
- package/server-dist/dist/routes/projects.js.map +1 -0
- package/server-dist/dist/routes/sessions.d.ts +4 -0
- package/server-dist/dist/routes/sessions.d.ts.map +1 -0
- package/server-dist/dist/routes/sessions.js +65 -0
- package/server-dist/dist/routes/sessions.js.map +1 -0
- package/server-dist/dist/routes/telemetry.d.ts +4 -0
- package/server-dist/dist/routes/telemetry.d.ts.map +1 -0
- package/server-dist/dist/routes/telemetry.js +21 -0
- package/server-dist/dist/routes/telemetry.js.map +1 -0
- package/server-dist/dist/utils.d.ts +6 -0
- package/server-dist/dist/utils.d.ts.map +1 -0
- package/server-dist/dist/utils.js +9 -0
- package/server-dist/dist/utils.js.map +1 -0
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
// Core analysis engine — server-side.
|
|
2
|
+
// Ported from web repo (src/lib/llm/analysis.ts) with SQLite persistence replacing Firestore.
|
|
3
|
+
// Key differences from web repo:
|
|
4
|
+
// - Uses SQLiteMessageRow instead of web Message type
|
|
5
|
+
// - Writes insights directly to SQLite via getDb() (not Firestore)
|
|
6
|
+
// - Abort handling uses error.name === 'AbortError' (not DOMException)
|
|
7
|
+
// - Uses session's existing project_id from SQLite (not re-derived hash)
|
|
8
|
+
import { randomUUID } from 'crypto';
|
|
9
|
+
import { getDb } from '@code-insights/cli/db/client';
|
|
10
|
+
import { createLLMClient, isLLMConfigured } from './client.js';
|
|
11
|
+
import { SESSION_ANALYSIS_SYSTEM_PROMPT, generateSessionAnalysisPrompt, formatMessagesForAnalysis, parseAnalysisResponse, PROMPT_QUALITY_SYSTEM_PROMPT, generatePromptQualityPrompt, parsePromptQualityResponse, } from './prompts.js';
|
|
12
|
+
// Maximum tokens to send to LLM (leaving room for response)
|
|
13
|
+
const MAX_INPUT_TOKENS = 80000;
|
|
14
|
+
const ANALYSIS_VERSION = '3.0.0';
|
|
15
|
+
/**
|
|
16
|
+
* Analyze a session and generate insights, saving them to SQLite.
|
|
17
|
+
*/
|
|
18
|
+
export async function analyzeSession(session, messages, options) {
|
|
19
|
+
if (!isLLMConfigured()) {
|
|
20
|
+
return {
|
|
21
|
+
success: false,
|
|
22
|
+
insights: [],
|
|
23
|
+
error: 'LLM not configured. Run `code-insights config llm` to configure a provider.',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (messages.length === 0) {
|
|
27
|
+
return {
|
|
28
|
+
success: false,
|
|
29
|
+
insights: [],
|
|
30
|
+
error: 'No messages found for this session.',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const client = createLLMClient();
|
|
35
|
+
const formattedMessages = formatMessagesForAnalysis(messages);
|
|
36
|
+
const estimatedTokens = client.estimateTokens(formattedMessages);
|
|
37
|
+
let analysisResponse;
|
|
38
|
+
let totalInputTokens = 0;
|
|
39
|
+
let totalOutputTokens = 0;
|
|
40
|
+
if (estimatedTokens > MAX_INPUT_TOKENS) {
|
|
41
|
+
// Chunk the messages and analyze separately
|
|
42
|
+
const chunks = chunkMessages(messages, client.estimateTokens.bind(client));
|
|
43
|
+
const chunkResponses = [];
|
|
44
|
+
const totalChunks = chunks.length;
|
|
45
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
46
|
+
const chunk = chunks[i];
|
|
47
|
+
options?.onProgress?.({ phase: 'analyzing', currentChunk: i + 1, totalChunks });
|
|
48
|
+
const chunkFormatted = formatMessagesForAnalysis(chunk);
|
|
49
|
+
const prompt = generateSessionAnalysisPrompt(session.project_name, session.summary, chunkFormatted);
|
|
50
|
+
const response = await client.chat([
|
|
51
|
+
{ role: 'system', content: SESSION_ANALYSIS_SYSTEM_PROMPT },
|
|
52
|
+
{ role: 'user', content: prompt },
|
|
53
|
+
], { signal: options?.signal });
|
|
54
|
+
if (response.usage) {
|
|
55
|
+
totalInputTokens += response.usage.inputTokens;
|
|
56
|
+
totalOutputTokens += response.usage.outputTokens;
|
|
57
|
+
}
|
|
58
|
+
const parsed = parseAnalysisResponse(response.content);
|
|
59
|
+
if (parsed.success)
|
|
60
|
+
chunkResponses.push(parsed.data);
|
|
61
|
+
}
|
|
62
|
+
if (chunkResponses.length === 0) {
|
|
63
|
+
return {
|
|
64
|
+
success: false,
|
|
65
|
+
insights: [],
|
|
66
|
+
error: 'All chunks failed to parse LLM response',
|
|
67
|
+
error_type: 'json_parse_error',
|
|
68
|
+
usage: { inputTokens: totalInputTokens, outputTokens: totalOutputTokens },
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
analysisResponse = mergeAnalysisResponses(chunkResponses);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
options?.onProgress?.({ phase: 'analyzing', currentChunk: 1, totalChunks: 1 });
|
|
75
|
+
const prompt = generateSessionAnalysisPrompt(session.project_name, session.summary, formattedMessages);
|
|
76
|
+
const response = await client.chat([
|
|
77
|
+
{ role: 'system', content: SESSION_ANALYSIS_SYSTEM_PROMPT },
|
|
78
|
+
{ role: 'user', content: prompt },
|
|
79
|
+
], { signal: options?.signal });
|
|
80
|
+
if (response.usage) {
|
|
81
|
+
totalInputTokens = response.usage.inputTokens;
|
|
82
|
+
totalOutputTokens = response.usage.outputTokens;
|
|
83
|
+
}
|
|
84
|
+
const parsed = parseAnalysisResponse(response.content);
|
|
85
|
+
if (!parsed.success) {
|
|
86
|
+
return {
|
|
87
|
+
success: false,
|
|
88
|
+
insights: [],
|
|
89
|
+
error: 'Failed to parse LLM response. Please try again.',
|
|
90
|
+
error_type: parsed.error.error_type,
|
|
91
|
+
response_length: parsed.error.response_length,
|
|
92
|
+
response_preview: parsed.error.response_preview,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
analysisResponse = parsed.data;
|
|
96
|
+
}
|
|
97
|
+
options?.onProgress?.({ phase: 'saving' });
|
|
98
|
+
const insights = convertToInsightRows(analysisResponse, session);
|
|
99
|
+
// Save new insights first, then delete old non-prompt-quality insights
|
|
100
|
+
// (safe order: if save fails, old data is preserved)
|
|
101
|
+
saveInsightsToDb(insights);
|
|
102
|
+
deleteSessionInsights(session.id, {
|
|
103
|
+
excludeTypes: ['prompt_quality'],
|
|
104
|
+
excludeIds: insights.map(i => i.id),
|
|
105
|
+
});
|
|
106
|
+
// Update session character if LLM classified it
|
|
107
|
+
if (analysisResponse.session_character) {
|
|
108
|
+
const db = getDb();
|
|
109
|
+
db.prepare('UPDATE sessions SET session_character = ? WHERE id = ?')
|
|
110
|
+
.run(analysisResponse.session_character, session.id);
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
success: true,
|
|
114
|
+
insights,
|
|
115
|
+
usage: { inputTokens: totalInputTokens, outputTokens: totalOutputTokens },
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
120
|
+
return { success: false, insights: [], error: 'Analysis cancelled', error_type: 'abort' };
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
success: false,
|
|
124
|
+
insights: [],
|
|
125
|
+
error: error instanceof Error ? error.message : 'Analysis failed',
|
|
126
|
+
error_type: 'api_error',
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Analyze prompt quality for a session.
|
|
132
|
+
*/
|
|
133
|
+
export async function analyzePromptQuality(session, messages, options) {
|
|
134
|
+
if (!isLLMConfigured()) {
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
insights: [],
|
|
138
|
+
error: 'LLM not configured. Run `code-insights config llm` to configure a provider.',
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (messages.length === 0) {
|
|
142
|
+
return {
|
|
143
|
+
success: false,
|
|
144
|
+
insights: [],
|
|
145
|
+
error: 'No messages found for this session.',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const userMessages = messages.filter(m => m.type === 'user');
|
|
149
|
+
if (userMessages.length < 2) {
|
|
150
|
+
return {
|
|
151
|
+
success: false,
|
|
152
|
+
insights: [],
|
|
153
|
+
error: 'Not enough user messages to analyze prompt quality (need at least 2).',
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
const client = createLLMClient();
|
|
158
|
+
const formattedMessages = formatMessagesForAnalysis(messages);
|
|
159
|
+
let analysisInput = formattedMessages;
|
|
160
|
+
const estimatedTokens = client.estimateTokens(formattedMessages);
|
|
161
|
+
if (estimatedTokens > MAX_INPUT_TOKENS) {
|
|
162
|
+
const targetLength = Math.floor((MAX_INPUT_TOKENS / estimatedTokens) * formattedMessages.length * 0.8);
|
|
163
|
+
analysisInput = formattedMessages.slice(0, targetLength) + '\n\n[... conversation truncated for analysis ...]';
|
|
164
|
+
}
|
|
165
|
+
const prompt = generatePromptQualityPrompt(session.project_name, analysisInput, messages.length);
|
|
166
|
+
options?.onProgress?.({ phase: 'analyzing' });
|
|
167
|
+
const response = await client.chat([
|
|
168
|
+
{ role: 'system', content: PROMPT_QUALITY_SYSTEM_PROMPT },
|
|
169
|
+
{ role: 'user', content: prompt },
|
|
170
|
+
], { signal: options?.signal });
|
|
171
|
+
const parsed = parsePromptQualityResponse(response.content);
|
|
172
|
+
if (!parsed.success) {
|
|
173
|
+
return {
|
|
174
|
+
success: false,
|
|
175
|
+
insights: [],
|
|
176
|
+
error: 'Failed to parse prompt quality analysis. Please try again.',
|
|
177
|
+
error_type: parsed.error.error_type,
|
|
178
|
+
response_length: parsed.error.response_length,
|
|
179
|
+
response_preview: parsed.error.response_preview,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
options?.onProgress?.({ phase: 'saving' });
|
|
183
|
+
const insight = convertPromptQualityToInsightRow(parsed.data, session);
|
|
184
|
+
// Save new insight, then delete old prompt_quality insights
|
|
185
|
+
saveInsightsToDb([insight]);
|
|
186
|
+
deleteSessionInsights(session.id, {
|
|
187
|
+
includeOnlyTypes: ['prompt_quality'],
|
|
188
|
+
excludeIds: [insight.id],
|
|
189
|
+
});
|
|
190
|
+
return {
|
|
191
|
+
success: true,
|
|
192
|
+
insights: [insight],
|
|
193
|
+
usage: response.usage ? {
|
|
194
|
+
inputTokens: response.usage.inputTokens,
|
|
195
|
+
outputTokens: response.usage.outputTokens,
|
|
196
|
+
} : undefined,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
201
|
+
return { success: false, insights: [], error: 'Analysis cancelled', error_type: 'abort' };
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
success: false,
|
|
205
|
+
insights: [],
|
|
206
|
+
error: error instanceof Error ? error.message : 'Prompt quality analysis failed',
|
|
207
|
+
error_type: 'api_error',
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Find recurring patterns across multiple insights and write bidirectional links to SQLite.
|
|
213
|
+
*/
|
|
214
|
+
export async function findRecurringInsights(insights) {
|
|
215
|
+
if (!isLLMConfigured()) {
|
|
216
|
+
return { success: false, groups: [], updatedCount: 0, error: 'LLM not configured.' };
|
|
217
|
+
}
|
|
218
|
+
const candidates = insights
|
|
219
|
+
.filter(i => i.type !== 'summary' && i.type !== 'prompt_quality')
|
|
220
|
+
.slice(0, 200);
|
|
221
|
+
if (candidates.length < 2) {
|
|
222
|
+
return {
|
|
223
|
+
success: false,
|
|
224
|
+
groups: [],
|
|
225
|
+
updatedCount: 0,
|
|
226
|
+
error: 'Need at least 2 non-summary insights to find patterns.',
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
try {
|
|
230
|
+
const client = createLLMClient();
|
|
231
|
+
const insightData = candidates.map(i => ({
|
|
232
|
+
id: i.id,
|
|
233
|
+
type: i.type === 'technique' ? 'learning' : i.type,
|
|
234
|
+
title: i.title,
|
|
235
|
+
summary: i.summary.slice(0, 150),
|
|
236
|
+
projectName: i.project_name,
|
|
237
|
+
sessionId: i.session_id,
|
|
238
|
+
}));
|
|
239
|
+
const prompt = `Analyze these insights from coding sessions and find groups of semantically similar or duplicate insights — ones that express the same learning or decision even if worded differently.
|
|
240
|
+
|
|
241
|
+
RULES:
|
|
242
|
+
- Only group insights that are genuinely about the same concept/topic
|
|
243
|
+
- Insights in a group should be from DIFFERENT sessions (same sessionId = not recurring)
|
|
244
|
+
- A group must have at least 2 insights
|
|
245
|
+
- An insight can only belong to one group
|
|
246
|
+
- Provide a brief "theme" describing what the group shares
|
|
247
|
+
- If no recurring patterns exist, return an empty groups array
|
|
248
|
+
|
|
249
|
+
INSIGHTS:
|
|
250
|
+
${JSON.stringify(insightData, null, 2)}
|
|
251
|
+
|
|
252
|
+
Respond with valid JSON only:
|
|
253
|
+
{
|
|
254
|
+
"groups": [
|
|
255
|
+
{
|
|
256
|
+
"insightIds": ["insight_abc", "insight_def"],
|
|
257
|
+
"theme": "Brief description of the shared concept"
|
|
258
|
+
}
|
|
259
|
+
]
|
|
260
|
+
}`;
|
|
261
|
+
const response = await client.chat([
|
|
262
|
+
{
|
|
263
|
+
role: 'system',
|
|
264
|
+
content: 'You are an expert at identifying recurring patterns and themes across software development insights. You find semantically similar insights even when they are worded differently. Respond with valid JSON only.',
|
|
265
|
+
},
|
|
266
|
+
{ role: 'user', content: prompt },
|
|
267
|
+
]);
|
|
268
|
+
const jsonMatch = response.content.match(/\{[\s\S]*\}/);
|
|
269
|
+
if (!jsonMatch) {
|
|
270
|
+
return { success: false, groups: [], updatedCount: 0, error: 'Failed to parse recurring insights response.' };
|
|
271
|
+
}
|
|
272
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
273
|
+
const groups = parsed.groups || [];
|
|
274
|
+
const validIds = new Set(candidates.map(i => i.id));
|
|
275
|
+
const validGroups = groups
|
|
276
|
+
.map(g => ({
|
|
277
|
+
...g,
|
|
278
|
+
insightIds: g.insightIds.filter(id => validIds.has(id)),
|
|
279
|
+
}))
|
|
280
|
+
.filter(g => g.insightIds.length >= 2);
|
|
281
|
+
if (validGroups.length === 0) {
|
|
282
|
+
return {
|
|
283
|
+
success: true,
|
|
284
|
+
groups: [],
|
|
285
|
+
updatedCount: 0,
|
|
286
|
+
usage: response.usage
|
|
287
|
+
? { inputTokens: response.usage.inputTokens, outputTokens: response.usage.outputTokens }
|
|
288
|
+
: undefined,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
// Build bidirectional links
|
|
292
|
+
const linkMap = new Map();
|
|
293
|
+
for (const group of validGroups) {
|
|
294
|
+
for (const id of group.insightIds) {
|
|
295
|
+
const others = group.insightIds.filter(otherId => otherId !== id);
|
|
296
|
+
const existing = linkMap.get(id) || [];
|
|
297
|
+
linkMap.set(id, [...new Set([...existing, ...others])]);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// Write links to SQLite
|
|
301
|
+
const db = getDb();
|
|
302
|
+
const updateLinks = db.prepare(`UPDATE insights SET linked_insight_ids = ? WHERE id = ?`);
|
|
303
|
+
for (const [insightId, linkedIds] of linkMap.entries()) {
|
|
304
|
+
updateLinks.run(JSON.stringify(linkedIds), insightId);
|
|
305
|
+
}
|
|
306
|
+
return {
|
|
307
|
+
success: true,
|
|
308
|
+
groups: validGroups,
|
|
309
|
+
updatedCount: linkMap.size,
|
|
310
|
+
usage: response.usage
|
|
311
|
+
? { inputTokens: response.usage.inputTokens, outputTokens: response.usage.outputTokens }
|
|
312
|
+
: undefined,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
return {
|
|
317
|
+
success: false,
|
|
318
|
+
groups: [],
|
|
319
|
+
updatedCount: 0,
|
|
320
|
+
error: error instanceof Error ? error.message : 'Failed to find recurring insights',
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// --- Internal helpers ---
|
|
325
|
+
function chunkMessages(messages, estimateTokens) {
|
|
326
|
+
const chunks = [];
|
|
327
|
+
let currentChunk = [];
|
|
328
|
+
let currentTokens = 0;
|
|
329
|
+
const chunkLimit = MAX_INPUT_TOKENS * 0.8;
|
|
330
|
+
for (const message of messages) {
|
|
331
|
+
let toolResults = [];
|
|
332
|
+
try {
|
|
333
|
+
toolResults = message.tool_results ? JSON.parse(message.tool_results) : [];
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
toolResults = [];
|
|
337
|
+
}
|
|
338
|
+
const messageText = [
|
|
339
|
+
message.content,
|
|
340
|
+
message.thinking?.slice(0, 1000) ?? '',
|
|
341
|
+
...toolResults.map(r => (r.output || '').slice(0, 500)),
|
|
342
|
+
].join(' ');
|
|
343
|
+
const messageTokens = estimateTokens(messageText);
|
|
344
|
+
if (currentTokens + messageTokens > chunkLimit && currentChunk.length > 0) {
|
|
345
|
+
chunks.push(currentChunk);
|
|
346
|
+
currentChunk = [];
|
|
347
|
+
currentTokens = 0;
|
|
348
|
+
}
|
|
349
|
+
currentChunk.push(message);
|
|
350
|
+
currentTokens += messageTokens;
|
|
351
|
+
}
|
|
352
|
+
if (currentChunk.length > 0) {
|
|
353
|
+
chunks.push(currentChunk);
|
|
354
|
+
}
|
|
355
|
+
return chunks;
|
|
356
|
+
}
|
|
357
|
+
function mergeAnalysisResponses(responses) {
|
|
358
|
+
if (responses.length === 0) {
|
|
359
|
+
return {
|
|
360
|
+
summary: { title: 'Analysis failed', content: '', bullets: [] },
|
|
361
|
+
decisions: [],
|
|
362
|
+
learnings: [],
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
if (responses.length === 1)
|
|
366
|
+
return responses[0];
|
|
367
|
+
const merged = {
|
|
368
|
+
session_character: responses.find(r => r.session_character)?.session_character,
|
|
369
|
+
summary: responses[0].summary,
|
|
370
|
+
decisions: [],
|
|
371
|
+
learnings: [],
|
|
372
|
+
};
|
|
373
|
+
for (const response of responses) {
|
|
374
|
+
merged.decisions.push(...response.decisions);
|
|
375
|
+
merged.learnings.push(...response.learnings);
|
|
376
|
+
}
|
|
377
|
+
merged.decisions = deduplicateByTitle(merged.decisions).slice(0, 3);
|
|
378
|
+
merged.learnings = deduplicateByTitle(merged.learnings).slice(0, 5);
|
|
379
|
+
return merged;
|
|
380
|
+
}
|
|
381
|
+
function deduplicateByTitle(items) {
|
|
382
|
+
const seen = new Set();
|
|
383
|
+
return items.filter((item) => {
|
|
384
|
+
const normalized = item.title.toLowerCase().trim();
|
|
385
|
+
if (seen.has(normalized))
|
|
386
|
+
return false;
|
|
387
|
+
seen.add(normalized);
|
|
388
|
+
return true;
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
function convertToInsightRows(response, session) {
|
|
392
|
+
const insights = [];
|
|
393
|
+
const now = new Date().toISOString();
|
|
394
|
+
insights.push({
|
|
395
|
+
id: randomUUID(),
|
|
396
|
+
session_id: session.id,
|
|
397
|
+
project_id: session.project_id,
|
|
398
|
+
project_name: session.project_name,
|
|
399
|
+
type: 'summary',
|
|
400
|
+
title: response.summary.title,
|
|
401
|
+
content: response.summary.content,
|
|
402
|
+
summary: response.summary.content,
|
|
403
|
+
bullets: JSON.stringify(response.summary.bullets),
|
|
404
|
+
confidence: 0.9,
|
|
405
|
+
source: 'llm',
|
|
406
|
+
metadata: response.summary.outcome
|
|
407
|
+
? JSON.stringify({ outcome: response.summary.outcome })
|
|
408
|
+
: null,
|
|
409
|
+
timestamp: session.ended_at,
|
|
410
|
+
created_at: now,
|
|
411
|
+
scope: 'session',
|
|
412
|
+
analysis_version: ANALYSIS_VERSION,
|
|
413
|
+
});
|
|
414
|
+
for (const decision of response.decisions) {
|
|
415
|
+
const confidence = decision.confidence ?? 85;
|
|
416
|
+
if (confidence < 70)
|
|
417
|
+
continue;
|
|
418
|
+
const content = decision.situation && decision.choice
|
|
419
|
+
? `${decision.situation} → ${decision.choice}`
|
|
420
|
+
: decision.choice || decision.situation || decision.title;
|
|
421
|
+
const altBullets = (decision.alternatives || [])
|
|
422
|
+
.filter(a => a && typeof a === 'object' && a.option)
|
|
423
|
+
.map(a => `${a.option}: ${a.rejected_because || 'no reason given'}`);
|
|
424
|
+
insights.push({
|
|
425
|
+
id: randomUUID(),
|
|
426
|
+
session_id: session.id,
|
|
427
|
+
project_id: session.project_id,
|
|
428
|
+
project_name: session.project_name,
|
|
429
|
+
type: 'decision',
|
|
430
|
+
title: decision.title,
|
|
431
|
+
content,
|
|
432
|
+
summary: (decision.choice || content).slice(0, 200),
|
|
433
|
+
bullets: JSON.stringify(altBullets),
|
|
434
|
+
confidence: confidence / 100,
|
|
435
|
+
source: 'llm',
|
|
436
|
+
metadata: JSON.stringify({
|
|
437
|
+
situation: decision.situation,
|
|
438
|
+
choice: decision.choice,
|
|
439
|
+
reasoning: decision.reasoning,
|
|
440
|
+
alternatives: decision.alternatives,
|
|
441
|
+
trade_offs: decision.trade_offs,
|
|
442
|
+
revisit_when: decision.revisit_when,
|
|
443
|
+
evidence: decision.evidence,
|
|
444
|
+
}),
|
|
445
|
+
timestamp: session.ended_at,
|
|
446
|
+
created_at: now,
|
|
447
|
+
scope: 'session',
|
|
448
|
+
analysis_version: ANALYSIS_VERSION,
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
for (const learning of response.learnings) {
|
|
452
|
+
const confidence = learning.confidence ?? 80;
|
|
453
|
+
if (confidence < 70)
|
|
454
|
+
continue;
|
|
455
|
+
const content = learning.takeaway || learning.title;
|
|
456
|
+
insights.push({
|
|
457
|
+
id: randomUUID(),
|
|
458
|
+
session_id: session.id,
|
|
459
|
+
project_id: session.project_id,
|
|
460
|
+
project_name: session.project_name,
|
|
461
|
+
type: 'learning',
|
|
462
|
+
title: learning.title,
|
|
463
|
+
content,
|
|
464
|
+
summary: content.slice(0, 200),
|
|
465
|
+
bullets: JSON.stringify([]),
|
|
466
|
+
confidence: confidence / 100,
|
|
467
|
+
source: 'llm',
|
|
468
|
+
metadata: JSON.stringify({
|
|
469
|
+
symptom: learning.symptom,
|
|
470
|
+
root_cause: learning.root_cause,
|
|
471
|
+
takeaway: learning.takeaway,
|
|
472
|
+
applies_when: learning.applies_when,
|
|
473
|
+
evidence: learning.evidence,
|
|
474
|
+
}),
|
|
475
|
+
timestamp: session.ended_at,
|
|
476
|
+
created_at: now,
|
|
477
|
+
scope: 'session',
|
|
478
|
+
analysis_version: ANALYSIS_VERSION,
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
return insights;
|
|
482
|
+
}
|
|
483
|
+
function convertPromptQualityToInsightRow(response, session) {
|
|
484
|
+
const now = new Date().toISOString();
|
|
485
|
+
return {
|
|
486
|
+
id: randomUUID(),
|
|
487
|
+
session_id: session.id,
|
|
488
|
+
project_id: session.project_id,
|
|
489
|
+
project_name: session.project_name,
|
|
490
|
+
type: 'prompt_quality',
|
|
491
|
+
title: `Prompt Efficiency: ${response.efficiencyScore}/100`,
|
|
492
|
+
content: response.overallAssessment,
|
|
493
|
+
summary: response.overallAssessment,
|
|
494
|
+
bullets: JSON.stringify(response.tips),
|
|
495
|
+
confidence: 0.85,
|
|
496
|
+
source: 'llm',
|
|
497
|
+
metadata: JSON.stringify({
|
|
498
|
+
efficiencyScore: response.efficiencyScore,
|
|
499
|
+
wastedTurns: response.wastedTurns,
|
|
500
|
+
antiPatterns: response.antiPatterns,
|
|
501
|
+
sessionTraits: response.sessionTraits,
|
|
502
|
+
potentialMessageReduction: response.potentialMessageReduction,
|
|
503
|
+
}),
|
|
504
|
+
timestamp: session.ended_at,
|
|
505
|
+
created_at: now,
|
|
506
|
+
scope: 'session',
|
|
507
|
+
analysis_version: ANALYSIS_VERSION,
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Write insight rows to SQLite using prepared statements.
|
|
512
|
+
*/
|
|
513
|
+
function saveInsightsToDb(insights) {
|
|
514
|
+
const db = getDb();
|
|
515
|
+
const insert = db.prepare(`
|
|
516
|
+
INSERT OR REPLACE INTO insights (
|
|
517
|
+
id, session_id, project_id, project_name, type, title, content,
|
|
518
|
+
summary, bullets, confidence, source, metadata, timestamp,
|
|
519
|
+
created_at, scope, analysis_version
|
|
520
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
521
|
+
`);
|
|
522
|
+
const insertMany = db.transaction((rows) => {
|
|
523
|
+
for (const row of rows) {
|
|
524
|
+
insert.run(row.id, row.session_id, row.project_id, row.project_name, row.type, row.title, row.content, row.summary, row.bullets, row.confidence, row.source, row.metadata, row.timestamp, row.created_at, row.scope, row.analysis_version);
|
|
525
|
+
}
|
|
526
|
+
});
|
|
527
|
+
insertMany(insights);
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Delete insights for a session, with optional type and ID exclusions.
|
|
531
|
+
*/
|
|
532
|
+
function deleteSessionInsights(sessionId, opts) {
|
|
533
|
+
const db = getDb();
|
|
534
|
+
const conditions = ['session_id = ?'];
|
|
535
|
+
const params = [sessionId];
|
|
536
|
+
if (opts.excludeTypes && opts.excludeTypes.length > 0) {
|
|
537
|
+
conditions.push(`type NOT IN (${opts.excludeTypes.map(() => '?').join(', ')})`);
|
|
538
|
+
params.push(...opts.excludeTypes);
|
|
539
|
+
}
|
|
540
|
+
if (opts.includeOnlyTypes && opts.includeOnlyTypes.length > 0) {
|
|
541
|
+
conditions.push(`type IN (${opts.includeOnlyTypes.map(() => '?').join(', ')})`);
|
|
542
|
+
params.push(...opts.includeOnlyTypes);
|
|
543
|
+
}
|
|
544
|
+
if (opts.excludeIds && opts.excludeIds.length > 0) {
|
|
545
|
+
conditions.push(`id NOT IN (${opts.excludeIds.map(() => '?').join(', ')})`);
|
|
546
|
+
params.push(...opts.excludeIds);
|
|
547
|
+
}
|
|
548
|
+
db.prepare(`DELETE FROM insights WHERE ${conditions.join(' AND ')}`).run(...params);
|
|
549
|
+
}
|
|
550
|
+
//# sourceMappingURL=analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/llm/analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { LLMClient } from './types.js';
|
|
2
|
+
import type { LLMProviderConfig } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Load LLM config from the CLI config file.
|
|
5
|
+
*/
|
|
6
|
+
export declare function loadLLMConfig(): LLMProviderConfig | null;
|
|
7
|
+
/**
|
|
8
|
+
* Check if LLM is configured.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isLLMConfigured(): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Create an LLM client from the current config.
|
|
13
|
+
* Throws if LLM is not configured.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createLLMClient(): LLMClient;
|
|
16
|
+
/**
|
|
17
|
+
* Create an LLM client from a specific config object (used for testing).
|
|
18
|
+
*/
|
|
19
|
+
export declare function createClientFromConfig(config: LLMProviderConfig): LLMClient;
|
|
20
|
+
/**
|
|
21
|
+
* Test LLM connectivity with the given config.
|
|
22
|
+
*/
|
|
23
|
+
export declare function testLLMConfig(config: LLMProviderConfig): Promise<{
|
|
24
|
+
success: boolean;
|
|
25
|
+
error?: string;
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/llm/client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMpD;;GAEG;AACH,wBAAgB,aAAa,IAAI,iBAAiB,GAAG,IAAI,CAGxD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAKzC;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,SAAS,CAM3C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAa3E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAW5G"}
|