@code-insights/cli 3.0.2 → 3.0.3
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 +12 -0
- package/dashboard-dist/index.html +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dashboard-dist/assets/index-CuCBzQyQ.js +0 -548
- package/dashboard-dist/dist/assets/index-BMhL7wL8.css +0 -1
- package/dashboard-dist/dist/assets/index-CuCBzQyQ.js +0 -548
- package/dashboard-dist/dist/favicon.svg +0 -4
- package/dashboard-dist/dist/index.html +0 -33
- package/dist/commands/connect.d.ts +0 -5
- package/dist/commands/connect.d.ts.map +0 -1
- package/dist/commands/connect.js +0 -39
- package/dist/commands/connect.js.map +0 -1
- package/dist/commands/insights.d.ts +0 -13
- package/dist/commands/insights.d.ts.map +0 -1
- package/dist/commands/insights.js +0 -87
- package/dist/commands/insights.js.map +0 -1
- package/dist/commands/link.d.ts +0 -8
- package/dist/commands/link.d.ts.map +0 -1
- package/dist/commands/link.js +0 -39
- package/dist/commands/link.js.map +0 -1
- package/dist/commands/stats/data/cache.d.ts +0 -29
- package/dist/commands/stats/data/cache.d.ts.map +0 -1
- package/dist/commands/stats/data/cache.js +0 -197
- package/dist/commands/stats/data/cache.js.map +0 -1
- package/dist/commands/stats/data/firestore.d.ts +0 -13
- package/dist/commands/stats/data/firestore.d.ts.map +0 -1
- package/dist/commands/stats/data/firestore.js +0 -170
- package/dist/commands/stats/data/firestore.js.map +0 -1
- package/dist/firebase/client.d.ts +0 -45
- package/dist/firebase/client.d.ts.map +0 -1
- package/dist/firebase/client.js +0 -344
- package/dist/firebase/client.js.map +0 -1
- package/dist/parser/insights.d.ts +0 -7
- package/dist/parser/insights.d.ts.map +0 -1
- package/dist/parser/insights.js +0 -271
- package/dist/parser/insights.js.map +0 -1
- package/dist/utils/firebase-json.d.ts +0 -87
- package/dist/utils/firebase-json.d.ts.map +0 -1
- package/dist/utils/firebase-json.js +0 -207
- package/dist/utils/firebase-json.js.map +0 -1
- package/server-dist/dist/index.d.ts +0 -12
- package/server-dist/dist/index.d.ts.map +0 -1
- package/server-dist/dist/index.js +0 -92
- package/server-dist/dist/index.js.map +0 -1
- package/server-dist/dist/llm/analysis.d.ts +0 -80
- package/server-dist/dist/llm/analysis.d.ts.map +0 -1
- package/server-dist/dist/llm/analysis.js +0 -509
- package/server-dist/dist/llm/analysis.js.map +0 -1
- package/server-dist/dist/llm/client.d.ts +0 -27
- package/server-dist/dist/llm/client.d.ts.map +0 -1
- package/server-dist/dist/llm/client.js +0 -71
- package/server-dist/dist/llm/client.js.map +0 -1
- package/server-dist/dist/llm/index.d.ts +0 -7
- package/server-dist/dist/llm/index.d.ts.map +0 -1
- package/server-dist/dist/llm/index.js +0 -5
- package/server-dist/dist/llm/index.js.map +0 -1
- package/server-dist/dist/llm/prompts.d.ts +0 -73
- package/server-dist/dist/llm/prompts.d.ts.map +0 -1
- package/server-dist/dist/llm/prompts.js +0 -242
- package/server-dist/dist/llm/prompts.js.map +0 -1
- package/server-dist/dist/llm/providers/anthropic.d.ts +0 -3
- package/server-dist/dist/llm/providers/anthropic.d.ts.map +0 -1
- package/server-dist/dist/llm/providers/anthropic.js +0 -45
- package/server-dist/dist/llm/providers/anthropic.js.map +0 -1
- package/server-dist/dist/llm/providers/gemini.d.ts +0 -3
- package/server-dist/dist/llm/providers/gemini.d.ts.map +0 -1
- package/server-dist/dist/llm/providers/gemini.js +0 -51
- package/server-dist/dist/llm/providers/gemini.js.map +0 -1
- package/server-dist/dist/llm/providers/ollama.d.ts +0 -12
- package/server-dist/dist/llm/providers/ollama.d.ts.map +0 -1
- package/server-dist/dist/llm/providers/ollama.js +0 -61
- package/server-dist/dist/llm/providers/ollama.js.map +0 -1
- package/server-dist/dist/llm/providers/openai.d.ts +0 -3
- package/server-dist/dist/llm/providers/openai.d.ts.map +0 -1
- package/server-dist/dist/llm/providers/openai.js +0 -39
- package/server-dist/dist/llm/providers/openai.js.map +0 -1
- package/server-dist/dist/llm/types.d.ts +0 -22
- package/server-dist/dist/llm/types.d.ts.map +0 -1
- package/server-dist/dist/llm/types.js +0 -5
- package/server-dist/dist/llm/types.js.map +0 -1
- package/server-dist/dist/routes/analysis.d.ts +0 -4
- package/server-dist/dist/routes/analysis.d.ts.map +0 -1
- package/server-dist/dist/routes/analysis.js +0 -103
- package/server-dist/dist/routes/analysis.js.map +0 -1
- package/server-dist/dist/routes/analytics.d.ts +0 -4
- package/server-dist/dist/routes/analytics.d.ts.map +0 -1
- package/server-dist/dist/routes/analytics.js +0 -47
- package/server-dist/dist/routes/analytics.js.map +0 -1
- package/server-dist/dist/routes/config.d.ts +0 -4
- package/server-dist/dist/routes/config.d.ts.map +0 -1
- package/server-dist/dist/routes/config.js +0 -108
- package/server-dist/dist/routes/config.js.map +0 -1
- package/server-dist/dist/routes/export.d.ts +0 -4
- package/server-dist/dist/routes/export.d.ts.map +0 -1
- package/server-dist/dist/routes/export.js +0 -52
- package/server-dist/dist/routes/export.js.map +0 -1
- package/server-dist/dist/routes/insights.d.ts +0 -4
- package/server-dist/dist/routes/insights.d.ts.map +0 -1
- package/server-dist/dist/routes/insights.js +0 -80
- package/server-dist/dist/routes/insights.js.map +0 -1
- package/server-dist/dist/routes/messages.d.ts +0 -4
- package/server-dist/dist/routes/messages.d.ts.map +0 -1
- package/server-dist/dist/routes/messages.js +0 -19
- package/server-dist/dist/routes/messages.js.map +0 -1
- package/server-dist/dist/routes/projects.d.ts +0 -4
- package/server-dist/dist/routes/projects.d.ts.map +0 -1
- package/server-dist/dist/routes/projects.js +0 -32
- package/server-dist/dist/routes/projects.js.map +0 -1
- package/server-dist/dist/routes/sessions.d.ts +0 -4
- package/server-dist/dist/routes/sessions.d.ts.map +0 -1
- package/server-dist/dist/routes/sessions.js +0 -65
- package/server-dist/dist/routes/sessions.js.map +0 -1
- package/server-dist/dist/utils.d.ts +0 -6
- package/server-dist/dist/utils.d.ts.map +0 -1
- package/server-dist/dist/utils.js +0 -9
- package/server-dist/dist/utils.js.map +0 -1
- /package/dashboard-dist/{dist/assets → assets}/index-CUWKxcRo.js +0 -0
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
// ──────────────────────────────────────────────────────
|
|
2
|
-
// Firestore data source for stats commands
|
|
3
|
-
// ──────────────────────────────────────────────────────
|
|
4
|
-
import admin from 'firebase-admin';
|
|
5
|
-
import { initializeFirebase, getDb, getProjects } from '../../../firebase/client.js';
|
|
6
|
-
import { ProjectNotFoundError, FirestoreIndexError } from './types.js';
|
|
7
|
-
import { findSimilarNames } from './fuzzy-match.js';
|
|
8
|
-
// ──────────────────────────────────────────────────────
|
|
9
|
-
// Helpers
|
|
10
|
-
// ──────────────────────────────────────────────────────
|
|
11
|
-
/** Checks if error is a Firestore FAILED_PRECONDITION (missing composite index) */
|
|
12
|
-
function isFirestoreIndexError(error) {
|
|
13
|
-
if (typeof error === 'object' && error !== null && 'code' in error) {
|
|
14
|
-
return error.code === 9;
|
|
15
|
-
}
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
/** Extracts the Firebase console index-creation URL from an error message */
|
|
19
|
-
function extractIndexUrl(error) {
|
|
20
|
-
if (typeof error === 'object' && error !== null && 'message' in error) {
|
|
21
|
-
const message = error.message;
|
|
22
|
-
const match = message.match(/(https:\/\/console\.firebase\.google\.com\/[^\s"]+)/);
|
|
23
|
-
return match ? match[1] : null;
|
|
24
|
-
}
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
// ──────────────────────────────────────────────────────
|
|
28
|
-
// Document mapper
|
|
29
|
-
// ──────────────────────────────────────────────────────
|
|
30
|
-
/** Maps a Firestore document to the universal SessionRow shape */
|
|
31
|
-
function docToSessionRow(doc) {
|
|
32
|
-
const data = doc.data();
|
|
33
|
-
if (!data)
|
|
34
|
-
throw new Error(`Session document ${doc.id} has no data`);
|
|
35
|
-
return {
|
|
36
|
-
id: doc.id,
|
|
37
|
-
projectId: data.projectId,
|
|
38
|
-
projectName: data.projectName,
|
|
39
|
-
startedAt: data.startedAt?.toDate() ?? new Date(),
|
|
40
|
-
endedAt: data.endedAt?.toDate() ?? new Date(),
|
|
41
|
-
messageCount: data.messageCount ?? 0,
|
|
42
|
-
userMessageCount: data.userMessageCount ?? 0,
|
|
43
|
-
assistantMessageCount: data.assistantMessageCount ?? 0,
|
|
44
|
-
toolCallCount: data.toolCallCount ?? 0,
|
|
45
|
-
estimatedCostUsd: data.estimatedCostUsd,
|
|
46
|
-
totalInputTokens: data.totalInputTokens,
|
|
47
|
-
totalOutputTokens: data.totalOutputTokens,
|
|
48
|
-
cacheCreationTokens: data.cacheCreationTokens,
|
|
49
|
-
cacheReadTokens: data.cacheReadTokens,
|
|
50
|
-
primaryModel: data.primaryModel,
|
|
51
|
-
modelsUsed: data.modelsUsed,
|
|
52
|
-
generatedTitle: data.generatedTitle,
|
|
53
|
-
customTitle: data.customTitle,
|
|
54
|
-
summary: data.summary,
|
|
55
|
-
sessionCharacter: data.sessionCharacter,
|
|
56
|
-
sourceTool: data.sourceTool,
|
|
57
|
-
usageSource: data.usageSource,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
// ──────────────────────────────────────────────────────
|
|
61
|
-
// FirestoreDataSource
|
|
62
|
-
// ──────────────────────────────────────────────────────
|
|
63
|
-
export class FirestoreDataSource {
|
|
64
|
-
config;
|
|
65
|
-
name = 'firestore';
|
|
66
|
-
constructor(config) {
|
|
67
|
-
this.config = config;
|
|
68
|
-
}
|
|
69
|
-
async prepare(flags) {
|
|
70
|
-
initializeFirebase(this.config);
|
|
71
|
-
if (!flags.noSync) {
|
|
72
|
-
try {
|
|
73
|
-
const { runSync } = await import('../../sync.js');
|
|
74
|
-
const result = await runSync({ quiet: true });
|
|
75
|
-
if (result.syncedCount > 0) {
|
|
76
|
-
return { message: `Synced ${result.syncedCount} new sessions`, dataChanged: true };
|
|
77
|
-
}
|
|
78
|
-
return { message: 'Up to date', dataChanged: false };
|
|
79
|
-
}
|
|
80
|
-
catch {
|
|
81
|
-
return { message: 'Sync failed (showing cached data)', dataChanged: false };
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return { message: 'Sync skipped', dataChanged: false };
|
|
85
|
-
}
|
|
86
|
-
async getSessions(opts) {
|
|
87
|
-
const firestore = getDb();
|
|
88
|
-
let query = firestore.collection('sessions');
|
|
89
|
-
if (opts.projectId) {
|
|
90
|
-
query = query.where('projectId', '==', opts.projectId);
|
|
91
|
-
}
|
|
92
|
-
if (opts.sourceTool) {
|
|
93
|
-
query = query.where('sourceTool', '==', opts.sourceTool);
|
|
94
|
-
}
|
|
95
|
-
if (opts.periodStart) {
|
|
96
|
-
query = query.where('startedAt', '>=', admin.firestore.Timestamp.fromDate(opts.periodStart));
|
|
97
|
-
}
|
|
98
|
-
query = query.orderBy('startedAt', 'desc');
|
|
99
|
-
try {
|
|
100
|
-
const snapshot = await query.get();
|
|
101
|
-
return snapshot.docs.map(docToSessionRow);
|
|
102
|
-
}
|
|
103
|
-
catch (error) {
|
|
104
|
-
if (isFirestoreIndexError(error)) {
|
|
105
|
-
const url = extractIndexUrl(error);
|
|
106
|
-
throw new FirestoreIndexError(url
|
|
107
|
-
? `Missing Firestore index. Create it here: ${url}`
|
|
108
|
-
: 'Missing Firestore composite index. Check the error details in Firebase console.', url ?? '');
|
|
109
|
-
}
|
|
110
|
-
throw error;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
async getUsageStats() {
|
|
114
|
-
const firestore = getDb();
|
|
115
|
-
const doc = await firestore.collection('stats').doc('usage').get();
|
|
116
|
-
if (!doc.exists)
|
|
117
|
-
return null;
|
|
118
|
-
const data = doc.data();
|
|
119
|
-
return {
|
|
120
|
-
totalInputTokens: data.totalInputTokens ?? 0,
|
|
121
|
-
totalOutputTokens: data.totalOutputTokens ?? 0,
|
|
122
|
-
cacheCreationTokens: data.cacheCreationTokens ?? 0,
|
|
123
|
-
cacheReadTokens: data.cacheReadTokens ?? 0,
|
|
124
|
-
estimatedCostUsd: data.estimatedCostUsd ?? 0,
|
|
125
|
-
sessionsWithUsage: data.sessionsWithUsage ?? 0,
|
|
126
|
-
lastUpdatedAt: data.lastUpdatedAt?.toDate() ?? new Date(),
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
async resolveProjectId(name) {
|
|
130
|
-
const projects = await getProjects();
|
|
131
|
-
// Exact match (case-insensitive)
|
|
132
|
-
const exact = projects.find((p) => p.name.toLowerCase() === name.toLowerCase());
|
|
133
|
-
if (exact)
|
|
134
|
-
return { projectId: exact.id, projectName: exact.name };
|
|
135
|
-
// Substring match
|
|
136
|
-
const substring = projects.filter((p) => p.name.toLowerCase().includes(name.toLowerCase()));
|
|
137
|
-
if (substring.length === 1)
|
|
138
|
-
return { projectId: substring[0].id, projectName: substring[0].name };
|
|
139
|
-
// No match — throw with suggestions
|
|
140
|
-
const suggestions = findSimilarNames(name, projects.map((p) => p.name));
|
|
141
|
-
throw new ProjectNotFoundError(`Project "${name}" not found.`, name, projects.map((p) => ({ name: p.name })), suggestions);
|
|
142
|
-
}
|
|
143
|
-
async getLastSession(opts) {
|
|
144
|
-
const firestore = getDb();
|
|
145
|
-
let query = firestore.collection('sessions');
|
|
146
|
-
if (opts?.sourceTool) {
|
|
147
|
-
query = query.where('sourceTool', '==', opts.sourceTool);
|
|
148
|
-
}
|
|
149
|
-
if (opts?.projectId) {
|
|
150
|
-
query = query.where('projectId', '==', opts.projectId);
|
|
151
|
-
}
|
|
152
|
-
query = query.orderBy('startedAt', 'desc').limit(1);
|
|
153
|
-
try {
|
|
154
|
-
const snapshot = await query.get();
|
|
155
|
-
if (snapshot.empty)
|
|
156
|
-
return null;
|
|
157
|
-
return docToSessionRow(snapshot.docs[0]);
|
|
158
|
-
}
|
|
159
|
-
catch (error) {
|
|
160
|
-
if (isFirestoreIndexError(error)) {
|
|
161
|
-
const url = extractIndexUrl(error);
|
|
162
|
-
throw new FirestoreIndexError(url
|
|
163
|
-
? `Missing Firestore index. Create it here: ${url}`
|
|
164
|
-
: 'Missing Firestore composite index. Check the error details in Firebase console.', url ?? '');
|
|
165
|
-
}
|
|
166
|
-
throw error;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
//# sourceMappingURL=firestore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"firestore.js","sourceRoot":"","sources":["../../../../src/commands/stats/data/firestore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import admin from 'firebase-admin';
|
|
2
|
-
import type { ClaudeInsightConfig, ParsedSession, Project } from '../types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Initialize Firebase Admin SDK
|
|
5
|
-
*/
|
|
6
|
-
export declare function initializeFirebase(config: ClaudeInsightConfig): void;
|
|
7
|
-
/**
|
|
8
|
-
* Get Firestore instance
|
|
9
|
-
*/
|
|
10
|
-
export declare function getDb(): admin.firestore.Firestore;
|
|
11
|
-
/**
|
|
12
|
-
* Upload a session to Firestore
|
|
13
|
-
*/
|
|
14
|
-
export declare function uploadSession(session: ParsedSession, isForceSync?: boolean): Promise<void>;
|
|
15
|
-
/**
|
|
16
|
-
* Upload messages to Firestore for LLM analysis
|
|
17
|
-
*/
|
|
18
|
-
export declare function uploadMessages(session: ParsedSession): Promise<void>;
|
|
19
|
-
/**
|
|
20
|
-
* Check if a session already exists
|
|
21
|
-
*/
|
|
22
|
-
export declare function sessionExists(sessionId: string): Promise<boolean>;
|
|
23
|
-
/**
|
|
24
|
-
* Get all projects
|
|
25
|
-
*/
|
|
26
|
-
export declare function getProjects(): Promise<Project[]>;
|
|
27
|
-
/**
|
|
28
|
-
* Get recent sessions
|
|
29
|
-
*/
|
|
30
|
-
export declare function getRecentSessions(limit?: number): Promise<ParsedSession[]>;
|
|
31
|
-
/**
|
|
32
|
-
* Recalculate usage stats from all sessions in Firestore.
|
|
33
|
-
* Used after --force sync to reconcile totals.
|
|
34
|
-
*/
|
|
35
|
-
export declare function recalculateUsageStats(): Promise<{
|
|
36
|
-
sessionsWithUsage: number;
|
|
37
|
-
totalTokens: number;
|
|
38
|
-
estimatedCostUsd: number;
|
|
39
|
-
}>;
|
|
40
|
-
/**
|
|
41
|
-
* Get per-tool session counts grouped by project.
|
|
42
|
-
* Uses select() to only fetch projectId and sourceTool fields (efficient).
|
|
43
|
-
*/
|
|
44
|
-
export declare function getProjectToolCounts(): Promise<Map<string, Map<string, number>>>;
|
|
45
|
-
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/firebase/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAK/E;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAmBpE;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,SAAS,CAKjD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkG9F;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;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAsBtF"}
|
package/dist/firebase/client.js
DELETED
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
import admin from 'firebase-admin';
|
|
2
|
-
import { generateStableProjectId, getDeviceInfo } from '../utils/device.js';
|
|
3
|
-
let db = null;
|
|
4
|
-
/**
|
|
5
|
-
* Initialize Firebase Admin SDK
|
|
6
|
-
*/
|
|
7
|
-
export function initializeFirebase(config) {
|
|
8
|
-
if (!config.firebase) {
|
|
9
|
-
throw new Error('Firebase credentials not configured. Run `code-insights init` to set up.');
|
|
10
|
-
}
|
|
11
|
-
if (admin.apps.length > 0) {
|
|
12
|
-
db = admin.firestore();
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
admin.initializeApp({
|
|
16
|
-
credential: admin.credential.cert({
|
|
17
|
-
projectId: config.firebase.projectId,
|
|
18
|
-
clientEmail: config.firebase.clientEmail,
|
|
19
|
-
privateKey: config.firebase.privateKey.replace(/\\n/g, '\n'),
|
|
20
|
-
}),
|
|
21
|
-
});
|
|
22
|
-
db = admin.firestore();
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Get Firestore instance
|
|
26
|
-
*/
|
|
27
|
-
export function getDb() {
|
|
28
|
-
if (!db) {
|
|
29
|
-
throw new Error('Firebase not initialized. Call initializeFirebase first.');
|
|
30
|
-
}
|
|
31
|
-
return db;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Upload a session to Firestore
|
|
35
|
-
*/
|
|
36
|
-
export async function uploadSession(session, isForceSync = false) {
|
|
37
|
-
const firestore = getDb();
|
|
38
|
-
// Generate stable project ID (prefers git remote URL)
|
|
39
|
-
const { projectId, source: projectIdSource, gitRemoteUrl } = generateStableProjectId(session.projectPath);
|
|
40
|
-
// Get device info for multi-device support
|
|
41
|
-
const deviceInfo = getDeviceInfo();
|
|
42
|
-
// Check if session already exists (for idempotent session count)
|
|
43
|
-
const sessionRef = firestore.collection('sessions').doc(session.id);
|
|
44
|
-
const existingSession = await sessionRef.get();
|
|
45
|
-
const isNewSession = !existingSession.exists;
|
|
46
|
-
const batch = firestore.batch();
|
|
47
|
-
// Upsert project
|
|
48
|
-
const projectRef = firestore.collection('projects').doc(projectId);
|
|
49
|
-
batch.set(projectRef, {
|
|
50
|
-
name: session.projectName,
|
|
51
|
-
path: session.projectPath,
|
|
52
|
-
gitRemoteUrl: gitRemoteUrl,
|
|
53
|
-
projectIdSource: projectIdSource,
|
|
54
|
-
lastActivity: admin.firestore.Timestamp.fromDate(session.endedAt),
|
|
55
|
-
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
|
56
|
-
}, { merge: true });
|
|
57
|
-
// Only increment session count for NEW sessions (idempotent)
|
|
58
|
-
if (isNewSession) {
|
|
59
|
-
const incrementFields = {
|
|
60
|
-
sessionCount: admin.firestore.FieldValue.increment(1),
|
|
61
|
-
};
|
|
62
|
-
if (!isForceSync && session.usage) {
|
|
63
|
-
incrementFields.totalInputTokens = admin.firestore.FieldValue.increment(session.usage.totalInputTokens);
|
|
64
|
-
incrementFields.totalOutputTokens = admin.firestore.FieldValue.increment(session.usage.totalOutputTokens);
|
|
65
|
-
incrementFields.cacheCreationTokens = admin.firestore.FieldValue.increment(session.usage.cacheCreationTokens);
|
|
66
|
-
incrementFields.cacheReadTokens = admin.firestore.FieldValue.increment(session.usage.cacheReadTokens);
|
|
67
|
-
incrementFields.estimatedCostUsd = admin.firestore.FieldValue.increment(session.usage.estimatedCostUsd);
|
|
68
|
-
}
|
|
69
|
-
batch.update(projectRef, incrementFields);
|
|
70
|
-
}
|
|
71
|
-
// Upload session with device info
|
|
72
|
-
batch.set(sessionRef, {
|
|
73
|
-
projectId: projectId,
|
|
74
|
-
projectName: session.projectName,
|
|
75
|
-
projectPath: session.projectPath,
|
|
76
|
-
gitRemoteUrl: gitRemoteUrl,
|
|
77
|
-
summary: session.summary,
|
|
78
|
-
generatedTitle: session.generatedTitle,
|
|
79
|
-
titleSource: session.titleSource,
|
|
80
|
-
sessionCharacter: session.sessionCharacter,
|
|
81
|
-
startedAt: admin.firestore.Timestamp.fromDate(session.startedAt),
|
|
82
|
-
endedAt: admin.firestore.Timestamp.fromDate(session.endedAt),
|
|
83
|
-
messageCount: session.messageCount,
|
|
84
|
-
userMessageCount: session.userMessageCount,
|
|
85
|
-
assistantMessageCount: session.assistantMessageCount,
|
|
86
|
-
toolCallCount: session.toolCallCount,
|
|
87
|
-
gitBranch: session.gitBranch,
|
|
88
|
-
claudeVersion: session.claudeVersion,
|
|
89
|
-
sourceTool: session.sourceTool ?? 'claude-code',
|
|
90
|
-
// Device info for multi-device tracking
|
|
91
|
-
deviceId: deviceInfo.deviceId,
|
|
92
|
-
deviceHostname: deviceInfo.hostname,
|
|
93
|
-
devicePlatform: deviceInfo.platform,
|
|
94
|
-
syncedAt: admin.firestore.FieldValue.serverTimestamp(),
|
|
95
|
-
// Usage stats (conditional — absent for older sessions without token data)
|
|
96
|
-
...(session.usage ? {
|
|
97
|
-
totalInputTokens: session.usage.totalInputTokens,
|
|
98
|
-
totalOutputTokens: session.usage.totalOutputTokens,
|
|
99
|
-
cacheCreationTokens: session.usage.cacheCreationTokens,
|
|
100
|
-
cacheReadTokens: session.usage.cacheReadTokens,
|
|
101
|
-
estimatedCostUsd: session.usage.estimatedCostUsd,
|
|
102
|
-
modelsUsed: session.usage.modelsUsed,
|
|
103
|
-
primaryModel: session.usage.primaryModel,
|
|
104
|
-
usageSource: session.usage.usageSource,
|
|
105
|
-
} : {}),
|
|
106
|
-
});
|
|
107
|
-
// Atomically increment usage stats for new sessions (non-force only)
|
|
108
|
-
if (isNewSession && !isForceSync && session.usage) {
|
|
109
|
-
const statsRef = firestore.collection('stats').doc('usage');
|
|
110
|
-
batch.set(statsRef, {
|
|
111
|
-
totalInputTokens: admin.firestore.FieldValue.increment(session.usage.totalInputTokens),
|
|
112
|
-
totalOutputTokens: admin.firestore.FieldValue.increment(session.usage.totalOutputTokens),
|
|
113
|
-
cacheCreationTokens: admin.firestore.FieldValue.increment(session.usage.cacheCreationTokens),
|
|
114
|
-
cacheReadTokens: admin.firestore.FieldValue.increment(session.usage.cacheReadTokens),
|
|
115
|
-
estimatedCostUsd: admin.firestore.FieldValue.increment(session.usage.estimatedCostUsd),
|
|
116
|
-
sessionsWithUsage: admin.firestore.FieldValue.increment(1),
|
|
117
|
-
lastUpdatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
|
118
|
-
}, { merge: true });
|
|
119
|
-
}
|
|
120
|
-
await batch.commit();
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Upload messages to Firestore for LLM analysis
|
|
124
|
-
*/
|
|
125
|
-
export async function uploadMessages(session) {
|
|
126
|
-
if (session.messages.length === 0)
|
|
127
|
-
return;
|
|
128
|
-
const firestore = getDb();
|
|
129
|
-
const batches = [];
|
|
130
|
-
let currentBatch = firestore.batch();
|
|
131
|
-
let operationCount = 0;
|
|
132
|
-
for (const message of session.messages) {
|
|
133
|
-
const messageRef = firestore.collection('messages').doc(message.id);
|
|
134
|
-
currentBatch.set(messageRef, {
|
|
135
|
-
sessionId: message.sessionId,
|
|
136
|
-
type: message.type,
|
|
137
|
-
content: truncateContent(message.content, 10000),
|
|
138
|
-
thinking: message.thinking
|
|
139
|
-
? truncateContent(message.thinking, 5000)
|
|
140
|
-
: null,
|
|
141
|
-
toolCalls: message.toolCalls.map((tc) => ({
|
|
142
|
-
id: tc.id,
|
|
143
|
-
name: tc.name,
|
|
144
|
-
input: JSON.stringify(tc.input).slice(0, 1000),
|
|
145
|
-
})),
|
|
146
|
-
toolResults: message.toolResults.map((tr) => ({
|
|
147
|
-
toolUseId: tr.toolUseId,
|
|
148
|
-
output: truncateContent(tr.output, 2000),
|
|
149
|
-
})),
|
|
150
|
-
timestamp: admin.firestore.Timestamp.fromDate(message.timestamp),
|
|
151
|
-
parentId: message.parentId,
|
|
152
|
-
// Per-message usage (assistant messages only)
|
|
153
|
-
...(message.usage ? {
|
|
154
|
-
usage: {
|
|
155
|
-
inputTokens: message.usage.inputTokens,
|
|
156
|
-
outputTokens: message.usage.outputTokens,
|
|
157
|
-
cacheCreationTokens: message.usage.cacheCreationTokens,
|
|
158
|
-
cacheReadTokens: message.usage.cacheReadTokens,
|
|
159
|
-
model: message.usage.model,
|
|
160
|
-
estimatedCostUsd: message.usage.estimatedCostUsd,
|
|
161
|
-
},
|
|
162
|
-
} : {}),
|
|
163
|
-
});
|
|
164
|
-
operationCount++;
|
|
165
|
-
if (operationCount >= 500) {
|
|
166
|
-
batches.push(currentBatch);
|
|
167
|
-
currentBatch = firestore.batch();
|
|
168
|
-
operationCount = 0;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
if (operationCount > 0) {
|
|
172
|
-
batches.push(currentBatch);
|
|
173
|
-
}
|
|
174
|
-
await Promise.all(batches.map((batch) => batch.commit()));
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Check if a session already exists
|
|
178
|
-
*/
|
|
179
|
-
export async function sessionExists(sessionId) {
|
|
180
|
-
const firestore = getDb();
|
|
181
|
-
const doc = await firestore.collection('sessions').doc(sessionId).get();
|
|
182
|
-
return doc.exists;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Get all projects
|
|
186
|
-
*/
|
|
187
|
-
export async function getProjects() {
|
|
188
|
-
const firestore = getDb();
|
|
189
|
-
const snapshot = await firestore.collection('projects').orderBy('lastActivity', 'desc').get();
|
|
190
|
-
return snapshot.docs.map((doc) => {
|
|
191
|
-
const data = doc.data();
|
|
192
|
-
return {
|
|
193
|
-
id: doc.id,
|
|
194
|
-
name: data.name,
|
|
195
|
-
path: data.path,
|
|
196
|
-
sessionCount: data.sessionCount || 0,
|
|
197
|
-
lastActivity: data.lastActivity?.toDate() || new Date(),
|
|
198
|
-
createdAt: data.createdAt?.toDate() || new Date(),
|
|
199
|
-
};
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Get recent sessions
|
|
204
|
-
*/
|
|
205
|
-
export async function getRecentSessions(limit = 10) {
|
|
206
|
-
const firestore = getDb();
|
|
207
|
-
const snapshot = await firestore
|
|
208
|
-
.collection('sessions')
|
|
209
|
-
.orderBy('endedAt', 'desc')
|
|
210
|
-
.limit(limit)
|
|
211
|
-
.get();
|
|
212
|
-
return snapshot.docs.map((doc) => {
|
|
213
|
-
const data = doc.data();
|
|
214
|
-
return {
|
|
215
|
-
id: doc.id,
|
|
216
|
-
projectPath: data.projectPath,
|
|
217
|
-
projectName: data.projectName,
|
|
218
|
-
summary: data.summary,
|
|
219
|
-
startedAt: data.startedAt?.toDate() || new Date(),
|
|
220
|
-
endedAt: data.endedAt?.toDate() || new Date(),
|
|
221
|
-
messageCount: data.messageCount,
|
|
222
|
-
userMessageCount: data.userMessageCount,
|
|
223
|
-
assistantMessageCount: data.assistantMessageCount,
|
|
224
|
-
toolCallCount: data.toolCallCount,
|
|
225
|
-
messages: [],
|
|
226
|
-
insights: [],
|
|
227
|
-
gitBranch: data.gitBranch,
|
|
228
|
-
claudeVersion: data.claudeVersion,
|
|
229
|
-
generatedTitle: data.generatedTitle || null,
|
|
230
|
-
titleSource: data.titleSource || null,
|
|
231
|
-
sessionCharacter: data.sessionCharacter || null,
|
|
232
|
-
};
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Recalculate usage stats from all sessions in Firestore.
|
|
237
|
-
* Used after --force sync to reconcile totals.
|
|
238
|
-
*/
|
|
239
|
-
export async function recalculateUsageStats() {
|
|
240
|
-
const firestore = getDb();
|
|
241
|
-
// Query all sessions that have usage data
|
|
242
|
-
const snapshot = await firestore
|
|
243
|
-
.collection('sessions')
|
|
244
|
-
.where('usageSource', '==', 'jsonl')
|
|
245
|
-
.get();
|
|
246
|
-
// Aggregate global + per-project totals
|
|
247
|
-
const global = {
|
|
248
|
-
totalInputTokens: 0,
|
|
249
|
-
totalOutputTokens: 0,
|
|
250
|
-
cacheCreationTokens: 0,
|
|
251
|
-
cacheReadTokens: 0,
|
|
252
|
-
estimatedCostUsd: 0,
|
|
253
|
-
sessionsWithUsage: 0,
|
|
254
|
-
};
|
|
255
|
-
const perProject = {};
|
|
256
|
-
for (const doc of snapshot.docs) {
|
|
257
|
-
const data = doc.data();
|
|
258
|
-
global.totalInputTokens += data.totalInputTokens ?? 0;
|
|
259
|
-
global.totalOutputTokens += data.totalOutputTokens ?? 0;
|
|
260
|
-
global.cacheCreationTokens += data.cacheCreationTokens ?? 0;
|
|
261
|
-
global.cacheReadTokens += data.cacheReadTokens ?? 0;
|
|
262
|
-
global.estimatedCostUsd += data.estimatedCostUsd ?? 0;
|
|
263
|
-
global.sessionsWithUsage++;
|
|
264
|
-
const pid = data.projectId;
|
|
265
|
-
if (pid) {
|
|
266
|
-
if (!perProject[pid]) {
|
|
267
|
-
perProject[pid] = {
|
|
268
|
-
totalInputTokens: 0,
|
|
269
|
-
totalOutputTokens: 0,
|
|
270
|
-
cacheCreationTokens: 0,
|
|
271
|
-
cacheReadTokens: 0,
|
|
272
|
-
estimatedCostUsd: 0,
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
perProject[pid].totalInputTokens += data.totalInputTokens ?? 0;
|
|
276
|
-
perProject[pid].totalOutputTokens += data.totalOutputTokens ?? 0;
|
|
277
|
-
perProject[pid].cacheCreationTokens += data.cacheCreationTokens ?? 0;
|
|
278
|
-
perProject[pid].cacheReadTokens += data.cacheReadTokens ?? 0;
|
|
279
|
-
perProject[pid].estimatedCostUsd += data.estimatedCostUsd ?? 0;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
// Write global stats (overwrite, not merge)
|
|
283
|
-
const statsRef = firestore.collection('stats').doc('usage');
|
|
284
|
-
await statsRef.set({
|
|
285
|
-
...global,
|
|
286
|
-
lastUpdatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
|
287
|
-
});
|
|
288
|
-
// Update each project's usage fields
|
|
289
|
-
const batches = [];
|
|
290
|
-
let currentBatch = firestore.batch();
|
|
291
|
-
let opCount = 0;
|
|
292
|
-
for (const [projectId, usage] of Object.entries(perProject)) {
|
|
293
|
-
const projectRef = firestore.collection('projects').doc(projectId);
|
|
294
|
-
currentBatch.set(projectRef, usage, { merge: true });
|
|
295
|
-
opCount++;
|
|
296
|
-
if (opCount >= 500) {
|
|
297
|
-
batches.push(currentBatch);
|
|
298
|
-
currentBatch = firestore.batch();
|
|
299
|
-
opCount = 0;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
if (opCount > 0)
|
|
303
|
-
batches.push(currentBatch);
|
|
304
|
-
await Promise.all(batches.map(b => b.commit()));
|
|
305
|
-
const totalTokens = global.totalInputTokens + global.totalOutputTokens
|
|
306
|
-
+ global.cacheCreationTokens + global.cacheReadTokens;
|
|
307
|
-
return {
|
|
308
|
-
sessionsWithUsage: global.sessionsWithUsage,
|
|
309
|
-
totalTokens,
|
|
310
|
-
estimatedCostUsd: global.estimatedCostUsd,
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Get per-tool session counts grouped by project.
|
|
315
|
-
* Uses select() to only fetch projectId and sourceTool fields (efficient).
|
|
316
|
-
*/
|
|
317
|
-
export async function getProjectToolCounts() {
|
|
318
|
-
const firestore = getDb();
|
|
319
|
-
const snapshot = await firestore
|
|
320
|
-
.collection('sessions')
|
|
321
|
-
.select('projectId', 'sourceTool')
|
|
322
|
-
.get();
|
|
323
|
-
const counts = new Map();
|
|
324
|
-
for (const doc of snapshot.docs) {
|
|
325
|
-
const data = doc.data();
|
|
326
|
-
const projectId = data.projectId;
|
|
327
|
-
const sourceTool = data.sourceTool || 'claude-code';
|
|
328
|
-
if (!counts.has(projectId)) {
|
|
329
|
-
counts.set(projectId, new Map());
|
|
330
|
-
}
|
|
331
|
-
const toolMap = counts.get(projectId);
|
|
332
|
-
toolMap.set(sourceTool, (toolMap.get(sourceTool) || 0) + 1);
|
|
333
|
-
}
|
|
334
|
-
return counts;
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* Truncate content to max length
|
|
338
|
-
*/
|
|
339
|
-
function truncateContent(content, maxLength) {
|
|
340
|
-
if (content.length <= maxLength)
|
|
341
|
-
return content;
|
|
342
|
-
return content.slice(0, maxLength - 20) + '\n... [truncated]';
|
|
343
|
-
}
|
|
344
|
-
//# sourceMappingURL=client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/firebase/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|