@codemieai/code 0.0.21 → 0.0.23

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 (58) hide show
  1. package/dist/agents/codemie-code/agent.d.ts.map +1 -1
  2. package/dist/agents/codemie-code/agent.js +17 -1
  3. package/dist/agents/codemie-code/agent.js.map +1 -1
  4. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  5. package/dist/agents/core/AgentCLI.js +11 -8
  6. package/dist/agents/core/AgentCLI.js.map +1 -1
  7. package/dist/agents/core/BaseMetricsAdapter.d.ts +20 -1
  8. package/dist/agents/core/BaseMetricsAdapter.d.ts.map +1 -1
  9. package/dist/agents/core/BaseMetricsAdapter.js +77 -1
  10. package/dist/agents/core/BaseMetricsAdapter.js.map +1 -1
  11. package/dist/agents/plugins/claude.metrics.d.ts +0 -12
  12. package/dist/agents/plugins/claude.metrics.d.ts.map +1 -1
  13. package/dist/agents/plugins/claude.metrics.js +2 -68
  14. package/dist/agents/plugins/claude.metrics.js.map +1 -1
  15. package/dist/agents/plugins/gemini.metrics.d.ts +92 -0
  16. package/dist/agents/plugins/gemini.metrics.d.ts.map +1 -0
  17. package/dist/agents/plugins/gemini.metrics.js +423 -0
  18. package/dist/agents/plugins/gemini.metrics.js.map +1 -0
  19. package/dist/agents/plugins/gemini.plugin.d.ts +3 -0
  20. package/dist/agents/plugins/gemini.plugin.d.ts.map +1 -1
  21. package/dist/agents/plugins/gemini.plugin.js +9 -4
  22. package/dist/agents/plugins/gemini.plugin.js.map +1 -1
  23. package/dist/cli/commands/auth.js +9 -0
  24. package/dist/cli/commands/auth.js.map +1 -1
  25. package/dist/cli/commands/list.d.ts.map +1 -1
  26. package/dist/cli/commands/list.js +11 -0
  27. package/dist/cli/commands/list.js.map +1 -1
  28. package/dist/cli/commands/profile.js +9 -0
  29. package/dist/cli/commands/profile.js.map +1 -1
  30. package/dist/cli/commands/setup.js +3 -2
  31. package/dist/cli/commands/setup.js.map +1 -1
  32. package/dist/frameworks/plugins/bmad.plugin.d.ts +5 -1
  33. package/dist/frameworks/plugins/bmad.plugin.d.ts.map +1 -1
  34. package/dist/frameworks/plugins/bmad.plugin.js +33 -16
  35. package/dist/frameworks/plugins/bmad.plugin.js.map +1 -1
  36. package/dist/metrics/MetricsOrchestrator.d.ts.map +1 -1
  37. package/dist/metrics/MetricsOrchestrator.js +8 -0
  38. package/dist/metrics/MetricsOrchestrator.js.map +1 -1
  39. package/dist/metrics/types.d.ts +1 -0
  40. package/dist/metrics/types.d.ts.map +1 -1
  41. package/dist/metrics/utils/git.d.ts +13 -0
  42. package/dist/metrics/utils/git.d.ts.map +1 -0
  43. package/dist/metrics/utils/git.js +37 -0
  44. package/dist/metrics/utils/git.js.map +1 -0
  45. package/dist/providers/integration/setup-ui.d.ts.map +1 -1
  46. package/dist/providers/integration/setup-ui.js +8 -1
  47. package/dist/providers/integration/setup-ui.js.map +1 -1
  48. package/dist/providers/plugins/ollama/ollama.models.d.ts +3 -3
  49. package/dist/providers/plugins/ollama/ollama.models.d.ts.map +1 -1
  50. package/dist/providers/plugins/ollama/ollama.models.js +5 -12
  51. package/dist/providers/plugins/ollama/ollama.models.js.map +1 -1
  52. package/dist/providers/plugins/ollama/ollama.setup-steps.d.ts.map +1 -1
  53. package/dist/providers/plugins/ollama/ollama.setup-steps.js +7 -1
  54. package/dist/providers/plugins/ollama/ollama.setup-steps.js.map +1 -1
  55. package/dist/providers/plugins/ollama/ollama.template.d.ts.map +1 -1
  56. package/dist/providers/plugins/ollama/ollama.template.js +2 -35
  57. package/dist/providers/plugins/ollama/ollama.template.js.map +1 -1
  58. package/package.json +1 -1
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Gemini Metrics Adapter
3
+ *
4
+ * Implements metrics support for Gemini CLI agent.
5
+ * Handles Gemini-specific file formats (JSON) and parsing logic.
6
+ */
7
+ import { BaseMetricsAdapter } from '../core/BaseMetricsAdapter.js';
8
+ import type { MetricSnapshot, MetricDelta, UserPrompt } from '../../metrics/types.js';
9
+ import type { AgentMetadata } from '../core/types.js';
10
+ export declare class GeminiMetricsAdapter extends BaseMetricsAdapter {
11
+ private lastProjectHash;
12
+ constructor(metadata: AgentMetadata);
13
+ /**
14
+ * Extract projectHash from Gemini session file path
15
+ * Path format: ~/.gemini/tmp/{projectHash}/chats/session-*.json
16
+ */
17
+ private extractProjectHashFromPath;
18
+ /**
19
+ * Check if file matches Gemini session pattern
20
+ * Pattern: ~/.gemini/tmp/{projectHash}/chats/session-{date}-{id}.json
21
+ * Note: Gemini uses JSON format, not JSONL
22
+ * Flexible hex ID matching (8+ chars) to support future format changes
23
+ */
24
+ matchesSessionPattern(path: string): boolean;
25
+ /**
26
+ * Extract session ID from Gemini file path
27
+ * Example: ~/.gemini/tmp/abc123/chats/session-2025-12-17T11-51-e5279324.json → session-2025-12-17T11-51-e5279324
28
+ */
29
+ extractSessionId(path: string): string;
30
+ /**
31
+ * Parse Gemini session file (JSON format) and extract metrics
32
+ * Each message in the messages array contains a conversation turn
33
+ */
34
+ parseSessionFile(path: string): Promise<MetricSnapshot>;
35
+ /**
36
+ * Parse session file and extract incremental delta records
37
+ * Returns array of delta records for turns with token usage
38
+ *
39
+ * @param path - Path to Gemini session file
40
+ * @param processedRecordIds - Set of record IDs already written to metrics
41
+ * @param attachedUserPromptTexts - Set of user prompt texts already attached (persisted from sync state)
42
+ */
43
+ parseIncrementalMetrics(path: string, processedRecordIds?: Set<string>, attachedUserPromptTexts?: Set<string>): Promise<{
44
+ deltas: MetricDelta[];
45
+ lastLine: number;
46
+ newlyAttachedPrompts: string[];
47
+ }>;
48
+ /**
49
+ * Get user prompts for a specific session
50
+ * Gemini stores user prompts in logs.json in project directories
51
+ *
52
+ * @param sessionId - Gemini session ID
53
+ * @param fromTimestamp - Start timestamp (Unix ms) - optional
54
+ * @param toTimestamp - End timestamp (Unix ms) - optional
55
+ * @returns Array of user prompts
56
+ */
57
+ getUserPrompts(sessionId: string, fromTimestamp?: number, toTimestamp?: number): Promise<UserPrompt[]>;
58
+ /**
59
+ * Find user prompt by timestamp with fuzzy matching
60
+ * Finds the closest user prompt within the tolerance window
61
+ *
62
+ * @param userPrompts - Array of user prompts from logs.json
63
+ * @param targetTimestamp - Target timestamp to match (Unix ms)
64
+ * @param toleranceMs - Tolerance window in milliseconds (default: 1000ms = ±1s)
65
+ * @returns Closest matching user prompt or undefined
66
+ */
67
+ private findUserPromptByTimestamp;
68
+ /**
69
+ * Extract file operation details from tool input
70
+ *
71
+ * @param toolName - Tool name (read_file, write_file, etc.)
72
+ * @param input - Tool input parameters
73
+ */
74
+ private extractFileOperation;
75
+ /**
76
+ * Gemini uses object-based watermark (message ID tracking)
77
+ */
78
+ getWatermarkStrategy(): 'hash' | 'line' | 'object';
79
+ /**
80
+ * Gemini initialization delay: 500ms (same as Claude)
81
+ */
82
+ getInitDelay(): number;
83
+ /**
84
+ * Override getDataPaths to handle dynamic projectHash pattern
85
+ * Pattern: ~/.gemini/tmp/{projectHash}/chats/
86
+ */
87
+ getDataPaths(): {
88
+ sessionsDir: string;
89
+ settingsDir?: string;
90
+ };
91
+ }
92
+ //# sourceMappingURL=gemini.metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.metrics.d.ts","sourceRoot":"","sources":["../../../src/agents/plugins/gemini.metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EAIX,UAAU,EACX,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,qBAAa,oBAAqB,SAAQ,kBAAkB;IAE1D,OAAO,CAAC,eAAe,CAAuB;gBAElC,QAAQ,EAAE,aAAa;IAInC;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAKlC;;;;;OAKG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI5C;;;OAGG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKtC;;;OAGG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuG7D;;;;;;;OAOG;IACG,uBAAuB,CAC3B,IAAI,EAAE,MAAM,EACZ,kBAAkB,GAAE,GAAG,CAAC,MAAM,CAAa,EAC3C,uBAAuB,GAAE,GAAG,CAAC,MAAM,CAAa,GAC/C,OAAO,CAAC;QACT,MAAM,EAAE,WAAW,EAAE,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,oBAAoB,EAAE,MAAM,EAAE,CAAC;KAChC,CAAC;IA8IF;;;;;;;;OAQG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,UAAU,EAAE,CAAC;IAuExB;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAmBjC;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAoC5B;;OAEG;IACH,oBAAoB,IAAI,MAAM,GAAG,MAAM,GAAG,QAAQ;IAIlD;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;;OAGG;IACH,YAAY,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;CAU9D"}
@@ -0,0 +1,423 @@
1
+ /**
2
+ * Gemini Metrics Adapter
3
+ *
4
+ * Implements metrics support for Gemini CLI agent.
5
+ * Handles Gemini-specific file formats (JSON) and parsing logic.
6
+ */
7
+ import { readFile } from 'fs/promises';
8
+ import { join } from 'path';
9
+ import { homedir } from 'os';
10
+ import { existsSync } from 'fs';
11
+ import { BaseMetricsAdapter } from '../core/BaseMetricsAdapter.js';
12
+ import { logger } from '../../utils/logger.js';
13
+ export class GeminiMetricsAdapter extends BaseMetricsAdapter {
14
+ // Cache projectHash from last parsed session to optimize getUserPrompts()
15
+ lastProjectHash = null;
16
+ constructor(metadata) {
17
+ super('gemini', metadata);
18
+ }
19
+ /**
20
+ * Extract projectHash from Gemini session file path
21
+ * Path format: ~/.gemini/tmp/{projectHash}/chats/session-*.json
22
+ */
23
+ extractProjectHashFromPath(path) {
24
+ const match = path.match(/\.gemini\/tmp\/([^/]+)\/chats\//);
25
+ return match ? match[1] : null;
26
+ }
27
+ /**
28
+ * Check if file matches Gemini session pattern
29
+ * Pattern: ~/.gemini/tmp/{projectHash}/chats/session-{date}-{id}.json
30
+ * Note: Gemini uses JSON format, not JSONL
31
+ * Flexible hex ID matching (8+ chars) to support future format changes
32
+ */
33
+ matchesSessionPattern(path) {
34
+ return /\.gemini\/tmp\/[^/]+\/chats\/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-[a-f0-9]+\.json$/.test(path);
35
+ }
36
+ /**
37
+ * Extract session ID from Gemini file path
38
+ * Example: ~/.gemini/tmp/abc123/chats/session-2025-12-17T11-51-e5279324.json → session-2025-12-17T11-51-e5279324
39
+ */
40
+ extractSessionId(path) {
41
+ const match = path.match(/session-[^/]+\.json$/);
42
+ return match?.[0].replace(/^session-/, '').replace(/\.json$/, '') || '';
43
+ }
44
+ /**
45
+ * Parse Gemini session file (JSON format) and extract metrics
46
+ * Each message in the messages array contains a conversation turn
47
+ */
48
+ async parseSessionFile(path) {
49
+ try {
50
+ // Cache projectHash for getUserPrompts() optimization
51
+ this.lastProjectHash = this.extractProjectHashFromPath(path);
52
+ const content = await readFile(path, 'utf-8');
53
+ const session = JSON.parse(content);
54
+ if (!session.messages || session.messages.length === 0) {
55
+ throw new Error('Empty session file');
56
+ }
57
+ // Aggregate metrics from all messages
58
+ let inputTokens = 0;
59
+ let outputTokens = 0;
60
+ let cacheReadTokens = 0;
61
+ // Track all models
62
+ const modelCalls = new Map();
63
+ // Tool tracking
64
+ const toolCalls = [];
65
+ for (const message of session.messages) {
66
+ // Track models
67
+ if (message.model && message.type === 'gemini') {
68
+ const model = message.model;
69
+ modelCalls.set(model, (modelCalls.get(model) || 0) + 1);
70
+ }
71
+ // Aggregate token usage (only from gemini messages)
72
+ if (message.type === 'gemini' && message.tokens) {
73
+ inputTokens += message.tokens.input || 0;
74
+ // Output = output tokens + thoughts tokens (model's internal reasoning)
75
+ outputTokens += (message.tokens.output || 0) + (message.tokens.thoughts || 0);
76
+ cacheReadTokens += message.tokens.cached || 0; // Gemini "cached" → CodeMie "cacheRead"
77
+ // Extract tool calls
78
+ if (message.toolCalls && Array.isArray(message.toolCalls)) {
79
+ for (const toolCall of message.toolCalls) {
80
+ // Determine status: check 'status' field first, fallback to result.success
81
+ let status = 'error';
82
+ if (toolCall.status) {
83
+ status = toolCall.status === 'success' ? 'success' : 'error';
84
+ }
85
+ else if (toolCall.result && typeof toolCall.result.success === 'boolean') {
86
+ status = toolCall.result.success ? 'success' : 'error';
87
+ }
88
+ toolCalls.push({
89
+ id: toolCall.id,
90
+ name: toolCall.name,
91
+ timestamp: new Date(toolCall.timestamp).getTime(),
92
+ status,
93
+ input: toolCall.args,
94
+ error: status === 'error' ? (toolCall.error || toolCall.result?.message) : undefined,
95
+ fileOperation: this.extractFileOperation(toolCall.name, toolCall.args)
96
+ });
97
+ }
98
+ }
99
+ }
100
+ }
101
+ // Build aggregated tool usage summary
102
+ const toolUsageSummary = this.buildToolUsageSummary(toolCalls);
103
+ // Get all models
104
+ const allModels = Array.from(modelCalls.keys());
105
+ const snapshot = {
106
+ sessionId: session.sessionId || '',
107
+ timestamp: Date.now(),
108
+ tokens: {
109
+ input: inputTokens,
110
+ output: outputTokens,
111
+ cacheRead: cacheReadTokens > 0 ? cacheReadTokens : undefined
112
+ },
113
+ toolCalls,
114
+ toolUsageSummary,
115
+ turnCount: session.messages.length,
116
+ model: allModels.length > 0 ? allModels[0] : undefined,
117
+ metadata: {
118
+ totalInputTokens: inputTokens + cacheReadTokens,
119
+ models: allModels,
120
+ modelCalls: Object.fromEntries(modelCalls)
121
+ }
122
+ };
123
+ logger.debug(`[GeminiMetrics] Parsed session ${session.sessionId}: ${inputTokens} input, ${outputTokens} output, ` +
124
+ `${cacheReadTokens} cache read, ${toolCalls.length} tool calls, ${allModels.length} models`);
125
+ return snapshot;
126
+ }
127
+ catch (error) {
128
+ logger.error(`[GeminiMetrics] Failed to parse session file: ${path}`, error);
129
+ throw error;
130
+ }
131
+ }
132
+ /**
133
+ * Parse session file and extract incremental delta records
134
+ * Returns array of delta records for turns with token usage
135
+ *
136
+ * @param path - Path to Gemini session file
137
+ * @param processedRecordIds - Set of record IDs already written to metrics
138
+ * @param attachedUserPromptTexts - Set of user prompt texts already attached (persisted from sync state)
139
+ */
140
+ async parseIncrementalMetrics(path, processedRecordIds = new Set(), attachedUserPromptTexts = new Set()) {
141
+ try {
142
+ // Cache projectHash for getUserPrompts() optimization
143
+ this.lastProjectHash = this.extractProjectHashFromPath(path);
144
+ const content = await readFile(path, 'utf-8');
145
+ const session = JSON.parse(content);
146
+ if (!session.messages || session.messages.length === 0) {
147
+ return { deltas: [], lastLine: 0, newlyAttachedPrompts: [] };
148
+ }
149
+ // Load user prompts from logs.json
150
+ const userPrompts = await this.getUserPrompts(session.sessionId);
151
+ // Build map by messageId (sequential 0, 1, 2...) for reliable correlation
152
+ const userPromptsByMessageId = new Map();
153
+ for (const prompt of userPrompts) {
154
+ // logs.json has messageId field (sequential) - extract from metadata if available
155
+ const messageId = prompt.messageId;
156
+ if (typeof messageId === 'number') {
157
+ userPromptsByMessageId.set(messageId, prompt);
158
+ }
159
+ }
160
+ // Track initial size to determine newly attached prompts
161
+ const initialAttachedCount = attachedUserPromptTexts.size;
162
+ const deltas = [];
163
+ let lastUserPrompt;
164
+ let userMessageIndex = 0; // Track sequential user message count
165
+ for (const message of session.messages) {
166
+ // Skip already processed messages
167
+ if (processedRecordIds.has(message.id)) {
168
+ continue;
169
+ }
170
+ // Track user prompts by sequential message index
171
+ if (message.type === 'user') {
172
+ // Try to match by messageId first (most reliable)
173
+ lastUserPrompt = userPromptsByMessageId.get(userMessageIndex);
174
+ // Fallback: find by closest timestamp within ±1000ms window
175
+ if (!lastUserPrompt && userPrompts.length > 0) {
176
+ const timestamp = new Date(message.timestamp).getTime();
177
+ lastUserPrompt = this.findUserPromptByTimestamp(userPrompts, timestamp, 1000);
178
+ }
179
+ userMessageIndex++;
180
+ }
181
+ // Create delta for gemini messages with tokens
182
+ if (message.type === 'gemini' && message.tokens) {
183
+ const tools = {};
184
+ const toolStatus = {};
185
+ const fileOperations = [];
186
+ let apiErrorMessage;
187
+ // Extract tool usage
188
+ if (message.toolCalls && Array.isArray(message.toolCalls)) {
189
+ for (const toolCall of message.toolCalls) {
190
+ const toolName = toolCall.name;
191
+ tools[toolName] = (tools[toolName] || 0) + 1;
192
+ if (!toolStatus[toolName]) {
193
+ toolStatus[toolName] = { success: 0, failure: 0 };
194
+ }
195
+ // Determine status: check 'status' field first, fallback to result.success
196
+ let isSuccess = false;
197
+ if (toolCall.status) {
198
+ isSuccess = toolCall.status === 'success';
199
+ }
200
+ else if (toolCall.result && typeof toolCall.result.success === 'boolean') {
201
+ isSuccess = toolCall.result.success;
202
+ }
203
+ if (isSuccess) {
204
+ toolStatus[toolName].success++;
205
+ const fileOp = this.extractFileOperation(toolName, toolCall.args);
206
+ if (fileOp) {
207
+ fileOperations.push(fileOp);
208
+ }
209
+ }
210
+ else {
211
+ toolStatus[toolName].failure++;
212
+ if (!apiErrorMessage && (toolCall.error || toolCall.result?.message)) {
213
+ apiErrorMessage = toolCall.error || toolCall.result?.message;
214
+ }
215
+ }
216
+ }
217
+ }
218
+ // Include user prompt if available and not already attached
219
+ const userPrompts = [];
220
+ if (lastUserPrompt && lastUserPrompt.display && !attachedUserPromptTexts.has(lastUserPrompt.display)) {
221
+ userPrompts.push({
222
+ count: 1,
223
+ text: lastUserPrompt.display
224
+ });
225
+ attachedUserPromptTexts.add(lastUserPrompt.display);
226
+ lastUserPrompt = undefined;
227
+ }
228
+ // Create delta record
229
+ const delta = {
230
+ recordId: message.id,
231
+ sessionId: '', // Set by caller (MetricsOrchestrator)
232
+ agentSessionId: session.sessionId || '',
233
+ timestamp: message.timestamp,
234
+ gitBranch: undefined,
235
+ tokens: {
236
+ input: message.tokens.input || 0,
237
+ // Output = output tokens + thoughts tokens (model's internal reasoning)
238
+ output: (message.tokens.output || 0) + (message.tokens.thoughts || 0),
239
+ cacheRead: message.tokens.cached > 0 ? message.tokens.cached : undefined
240
+ },
241
+ tools,
242
+ toolStatus: Object.keys(toolStatus).length > 0 ? toolStatus : undefined,
243
+ fileOperations: fileOperations.length > 0 ? fileOperations : undefined,
244
+ userPrompts: userPrompts.length > 0 ? userPrompts : undefined,
245
+ apiErrorMessage,
246
+ models: message.model ? [message.model] : undefined
247
+ };
248
+ deltas.push(delta);
249
+ }
250
+ }
251
+ // Calculate newly attached prompts
252
+ const newlyAttachedPrompts = Array.from(attachedUserPromptTexts).slice(initialAttachedCount);
253
+ return {
254
+ deltas,
255
+ lastLine: session.messages.length,
256
+ newlyAttachedPrompts
257
+ };
258
+ }
259
+ catch (error) {
260
+ logger.error(`[GeminiMetrics] Failed to parse incremental metrics: ${path}`, error);
261
+ throw error;
262
+ }
263
+ }
264
+ /**
265
+ * Get user prompts for a specific session
266
+ * Gemini stores user prompts in logs.json in project directories
267
+ *
268
+ * @param sessionId - Gemini session ID
269
+ * @param fromTimestamp - Start timestamp (Unix ms) - optional
270
+ * @param toTimestamp - End timestamp (Unix ms) - optional
271
+ * @returns Array of user prompts
272
+ */
273
+ async getUserPrompts(sessionId, fromTimestamp, toTimestamp) {
274
+ try {
275
+ if (!this.metadata?.dataPaths?.home) {
276
+ return [];
277
+ }
278
+ const home = this.metadata.dataPaths.home.replace('~', homedir());
279
+ // Scan all project directories in ~/.gemini/tmp/
280
+ const tmpDir = join(home, 'tmp');
281
+ if (!existsSync(tmpDir)) {
282
+ return [];
283
+ }
284
+ // Use cached projectHash from parseSessionFile/parseIncrementalMetrics call
285
+ // This is always available when getUserPrompts is called from normal flow
286
+ if (!this.lastProjectHash) {
287
+ logger.debug('[GeminiMetrics] No projectHash available - cannot determine logs.json location');
288
+ return [];
289
+ }
290
+ const logsPath = join(tmpDir, this.lastProjectHash, 'logs.json');
291
+ if (!existsSync(logsPath)) {
292
+ return [];
293
+ }
294
+ try {
295
+ const content = await readFile(logsPath, 'utf-8');
296
+ const logs = JSON.parse(content);
297
+ // Validate logs structure
298
+ if (!Array.isArray(logs)) {
299
+ logger.debug(`[GeminiMetrics] Invalid logs.json format in ${this.lastProjectHash}: not an array`);
300
+ return [];
301
+ }
302
+ const prompts = logs
303
+ .filter((log) => {
304
+ // Validate log entry has required fields
305
+ if (!log || !log.sessionId || !log.timestamp || !log.message) {
306
+ return false;
307
+ }
308
+ return log.sessionId === sessionId;
309
+ })
310
+ .filter((log) => {
311
+ const ts = new Date(log.timestamp).getTime();
312
+ if (isNaN(ts))
313
+ return false; // Invalid timestamp
314
+ if (fromTimestamp && ts < fromTimestamp)
315
+ return false;
316
+ if (toTimestamp && ts > toTimestamp)
317
+ return false;
318
+ return true;
319
+ })
320
+ .map((log) => ({
321
+ display: log.message,
322
+ timestamp: new Date(log.timestamp).getTime(),
323
+ project: '', // workingDirectory comes from MetricsSession
324
+ sessionId: log.sessionId,
325
+ messageId: log.messageId // Preserve messageId for correlation
326
+ }));
327
+ return prompts;
328
+ }
329
+ catch (parseError) {
330
+ // JSON parse failed or file read error
331
+ logger.debug(`[GeminiMetrics] Failed to parse logs.json in ${this.lastProjectHash}:`, parseError);
332
+ return [];
333
+ }
334
+ }
335
+ catch (error) {
336
+ logger.debug(`[GeminiMetrics] Failed to get user prompts:`, error);
337
+ return [];
338
+ }
339
+ }
340
+ /**
341
+ * Find user prompt by timestamp with fuzzy matching
342
+ * Finds the closest user prompt within the tolerance window
343
+ *
344
+ * @param userPrompts - Array of user prompts from logs.json
345
+ * @param targetTimestamp - Target timestamp to match (Unix ms)
346
+ * @param toleranceMs - Tolerance window in milliseconds (default: 1000ms = ±1s)
347
+ * @returns Closest matching user prompt or undefined
348
+ */
349
+ findUserPromptByTimestamp(userPrompts, targetTimestamp, toleranceMs = 1000) {
350
+ let closestPrompt;
351
+ let closestDiff = Infinity;
352
+ for (const prompt of userPrompts) {
353
+ const diff = Math.abs(prompt.timestamp - targetTimestamp);
354
+ if (diff <= toleranceMs && diff < closestDiff) {
355
+ closestDiff = diff;
356
+ closestPrompt = prompt;
357
+ }
358
+ }
359
+ return closestPrompt;
360
+ }
361
+ /**
362
+ * Extract file operation details from tool input
363
+ *
364
+ * @param toolName - Tool name (read_file, write_file, etc.)
365
+ * @param input - Tool input parameters
366
+ */
367
+ extractFileOperation(toolName, input) {
368
+ // Map Gemini tool names to operation types
369
+ const typeMap = {
370
+ 'read_file': 'read',
371
+ 'write_file': 'write',
372
+ 'replace': 'edit',
373
+ 'glob': 'glob',
374
+ 'search_file_content': 'grep',
375
+ 'list_directory': 'glob' // Directory listing mapped to glob (similar operation)
376
+ };
377
+ const type = typeMap[toolName];
378
+ if (!type)
379
+ return undefined;
380
+ const fileOp = { type };
381
+ // Handle file_path (most tools) or dir_path (list_directory)
382
+ const path = input?.file_path || input?.dir_path;
383
+ if (path) {
384
+ fileOp.path = path;
385
+ fileOp.format = this.extractFormat(path);
386
+ fileOp.language = this.detectLanguage(path);
387
+ }
388
+ if (input?.pattern) {
389
+ fileOp.pattern = input.pattern;
390
+ }
391
+ // Line counts for write operations
392
+ if (toolName === 'write_file' && input?.content) {
393
+ fileOp.linesAdded = input.content.split('\n').length;
394
+ }
395
+ return fileOp;
396
+ }
397
+ /**
398
+ * Gemini uses object-based watermark (message ID tracking)
399
+ */
400
+ getWatermarkStrategy() {
401
+ return 'object';
402
+ }
403
+ /**
404
+ * Gemini initialization delay: 500ms (same as Claude)
405
+ */
406
+ getInitDelay() {
407
+ return 500;
408
+ }
409
+ /**
410
+ * Override getDataPaths to handle dynamic projectHash pattern
411
+ * Pattern: ~/.gemini/tmp/{projectHash}/chats/
412
+ */
413
+ getDataPaths() {
414
+ const home = this.metadata?.dataPaths?.home?.replace('~', homedir()) || join(homedir(), '.gemini');
415
+ // Return tmp directory - FileSnapshotter will scan subdirectories
416
+ // Pattern matching in matchesSessionPattern() handles the rest
417
+ return {
418
+ sessionsDir: join(home, 'tmp'),
419
+ settingsDir: home
420
+ };
421
+ }
422
+ }
423
+ //# sourceMappingURL=gemini.metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.metrics.js","sourceRoot":"","sources":["../../../src/agents/plugins/gemini.metrics.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { AgentMetadata } from '../core/types.js';
2
2
  import { BaseAgentAdapter } from '../core/BaseAgentAdapter.js';
3
+ import type { AgentMetricsSupport } from '../../metrics/types.js';
3
4
  /**
4
5
  * Gemini CLI Plugin Metadata
5
6
  */
@@ -8,6 +9,8 @@ export declare const GeminiPluginMetadata: AgentMetadata;
8
9
  * Gemini CLI Adapter
9
10
  */
10
11
  export declare class GeminiPlugin extends BaseAgentAdapter {
12
+ private metricsAdapter;
11
13
  constructor();
14
+ getMetricsAdapter(): AgentMetricsSupport;
12
15
  }
13
16
  //# sourceMappingURL=gemini.plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.plugin.d.ts","sourceRoot":"","sources":["../../../src/agents/plugins/gemini.plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AA6C/D;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,aA2ClC,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAa,SAAQ,gBAAgB;;CAIjD"}
1
+ {"version":3,"file":"gemini.plugin.d.ts","sourceRoot":"","sources":["../../../src/agents/plugins/gemini.plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAM/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAyClE;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAyClC,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAa,SAAQ,gBAAgB;IAChD,OAAO,CAAC,cAAc,CAAsB;;IAO5C,iBAAiB,IAAI,mBAAmB;CAGzC"}
@@ -3,6 +3,7 @@ import { mkdir, writeFile } from 'fs/promises';
3
3
  import { existsSync } from 'fs';
4
4
  import { join } from 'path';
5
5
  import { homedir } from 'os';
6
+ import { GeminiMetricsAdapter } from './gemini.metrics.js';
6
7
  // Define metadata first (used by both lifecycle and analytics)
7
8
  const metadata = {
8
9
  name: 'gemini',
@@ -17,10 +18,10 @@ const metadata = {
17
18
  },
18
19
  supportedProviders: ['ai-run-sso', 'litellm'],
19
20
  blockedModelPatterns: [/^claude/i, /^gpt/i], // Gemini models only
20
- recommendedModels: ['gemini-2.5-flash', 'gemini-2.5-pro'],
21
+ recommendedModels: ['gemini-3-pro'],
21
22
  ssoConfig: {
22
23
  enabled: true,
23
- clientType: 'gemini-cli'
24
+ clientType: 'codemie-gemini'
24
25
  },
25
26
  flagMappings: {
26
27
  '--task': {
@@ -70,15 +71,19 @@ export const GeminiPluginMetadata = {
70
71
  }
71
72
  return env;
72
73
  }
73
- },
74
- // Analytics adapter (uses same metadata - DRY principle!)
74
+ }
75
75
  };
76
76
  /**
77
77
  * Gemini CLI Adapter
78
78
  */
79
79
  export class GeminiPlugin extends BaseAgentAdapter {
80
+ metricsAdapter;
80
81
  constructor() {
81
82
  super(GeminiPluginMetadata);
83
+ this.metricsAdapter = new GeminiMetricsAdapter(GeminiPluginMetadata);
84
+ }
85
+ getMetricsAdapter() {
86
+ return this.metricsAdapter;
82
87
  }
83
88
  }
84
89
  //# sourceMappingURL=gemini.plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.plugin.js","sourceRoot":"","sources":["../../../src/agents/plugins/gemini.plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gemini.plugin.js","sourceRoot":"","sources":["../../../src/agents/plugins/gemini.plugin.ts"],"names":[],"mappings":"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"}
@@ -84,6 +84,15 @@ async function handleLogin(url) {
84
84
  spinner.succeed(chalk.green('SSO authentication successful'));
85
85
  console.log(chalk.cyan(`🔗 Connected to: ${codeMieUrl}`));
86
86
  console.log(chalk.cyan(`🔑 Credentials stored securely`));
87
+ console.log('');
88
+ console.log(chalk.bold(' Next Steps:'));
89
+ console.log('');
90
+ console.log(' ' + chalk.white('• Check auth status:') + ' ' + chalk.cyan('codemie auth status'));
91
+ console.log(' ' + chalk.white('• Refresh token:') + ' ' + chalk.cyan('codemie auth refresh'));
92
+ console.log(' ' + chalk.white('• Create profile:') + ' ' + chalk.cyan('codemie setup'));
93
+ console.log(' ' + chalk.white('• Verify system:') + ' ' + chalk.cyan('codemie doctor'));
94
+ console.log(' ' + chalk.white('• Explore more:') + ' ' + chalk.cyan('codemie --help'));
95
+ console.log('');
87
96
  }
88
97
  else {
89
98
  spinner.fail(chalk.red('SSO authentication failed'));