@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.
- package/dist/agents/codemie-code/agent.d.ts.map +1 -1
- package/dist/agents/codemie-code/agent.js +17 -1
- package/dist/agents/codemie-code/agent.js.map +1 -1
- package/dist/agents/core/AgentCLI.d.ts.map +1 -1
- package/dist/agents/core/AgentCLI.js +11 -8
- package/dist/agents/core/AgentCLI.js.map +1 -1
- package/dist/agents/core/BaseMetricsAdapter.d.ts +20 -1
- package/dist/agents/core/BaseMetricsAdapter.d.ts.map +1 -1
- package/dist/agents/core/BaseMetricsAdapter.js +77 -1
- package/dist/agents/core/BaseMetricsAdapter.js.map +1 -1
- package/dist/agents/plugins/claude.metrics.d.ts +0 -12
- package/dist/agents/plugins/claude.metrics.d.ts.map +1 -1
- package/dist/agents/plugins/claude.metrics.js +2 -68
- package/dist/agents/plugins/claude.metrics.js.map +1 -1
- package/dist/agents/plugins/gemini.metrics.d.ts +92 -0
- package/dist/agents/plugins/gemini.metrics.d.ts.map +1 -0
- package/dist/agents/plugins/gemini.metrics.js +423 -0
- package/dist/agents/plugins/gemini.metrics.js.map +1 -0
- package/dist/agents/plugins/gemini.plugin.d.ts +3 -0
- package/dist/agents/plugins/gemini.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/gemini.plugin.js +9 -4
- package/dist/agents/plugins/gemini.plugin.js.map +1 -1
- package/dist/cli/commands/auth.js +9 -0
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/list.d.ts.map +1 -1
- package/dist/cli/commands/list.js +11 -0
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/profile.js +9 -0
- package/dist/cli/commands/profile.js.map +1 -1
- package/dist/cli/commands/setup.js +3 -2
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/frameworks/plugins/bmad.plugin.d.ts +5 -1
- package/dist/frameworks/plugins/bmad.plugin.d.ts.map +1 -1
- package/dist/frameworks/plugins/bmad.plugin.js +33 -16
- package/dist/frameworks/plugins/bmad.plugin.js.map +1 -1
- package/dist/metrics/MetricsOrchestrator.d.ts.map +1 -1
- package/dist/metrics/MetricsOrchestrator.js +8 -0
- package/dist/metrics/MetricsOrchestrator.js.map +1 -1
- package/dist/metrics/types.d.ts +1 -0
- package/dist/metrics/types.d.ts.map +1 -1
- package/dist/metrics/utils/git.d.ts +13 -0
- package/dist/metrics/utils/git.d.ts.map +1 -0
- package/dist/metrics/utils/git.js +37 -0
- package/dist/metrics/utils/git.js.map +1 -0
- package/dist/providers/integration/setup-ui.d.ts.map +1 -1
- package/dist/providers/integration/setup-ui.js +8 -1
- package/dist/providers/integration/setup-ui.js.map +1 -1
- package/dist/providers/plugins/ollama/ollama.models.d.ts +3 -3
- package/dist/providers/plugins/ollama/ollama.models.d.ts.map +1 -1
- package/dist/providers/plugins/ollama/ollama.models.js +5 -12
- package/dist/providers/plugins/ollama/ollama.models.js.map +1 -1
- package/dist/providers/plugins/ollama/ollama.setup-steps.d.ts.map +1 -1
- package/dist/providers/plugins/ollama/ollama.setup-steps.js +7 -1
- package/dist/providers/plugins/ollama/ollama.setup-steps.js.map +1 -1
- package/dist/providers/plugins/ollama/ollama.template.d.ts.map +1 -1
- package/dist/providers/plugins/ollama/ollama.template.js +2 -35
- package/dist/providers/plugins/ollama/ollama.template.js.map +1 -1
- 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;
|
|
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-
|
|
21
|
+
recommendedModels: ['gemini-3-pro'],
|
|
21
22
|
ssoConfig: {
|
|
22
23
|
enabled: true,
|
|
23
|
-
clientType: 'gemini
|
|
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":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
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'));
|