minovative-mind-cli 2.3.2 → 2.3.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.
@@ -134,7 +134,24 @@ export async function handleSlashCommand(command, context) {
134
134
  const prevUsage = context.chatSessionState?.previousUsageMetadata;
135
135
  const currentModel = chat.getModel();
136
136
  const globalModel = getGlobalActiveModel();
137
- const displayModel = globalModel === 'auto' ? `Auto (Last turn: ${currentModel})` : currentModel;
137
+ const modelUsageCounts = context.chatSessionState?.modelUsageCounts || {};
138
+ const modelsUsed = Object.keys(modelUsageCounts);
139
+ let modelStatsStr = '';
140
+ if (modelsUsed.length > 0) {
141
+ const totalTurns = Object.values(modelUsageCounts).reduce((a, b) => a + b, 0);
142
+ const parts = modelsUsed.map((m) => {
143
+ const percent = Math.round((modelUsageCounts[m] / totalTurns) * 100);
144
+ return `${m} ${percent}%`;
145
+ });
146
+ modelStatsStr = parts.join(', ');
147
+ }
148
+ let displayModel = '';
149
+ if (globalModel === 'auto') {
150
+ displayModel = modelStatsStr ? `Auto (${modelStatsStr})` : `Auto (Last turn: ${currentModel})`;
151
+ }
152
+ else {
153
+ displayModel = modelStatsStr || currentModel;
154
+ }
138
155
  const autoApprove = getApprovalMode() === 'skip-all' ? 'Enabled' : 'Disabled';
139
156
  const subAgents = isSubAgentsEnabled() ? 'Enabled' : 'Disabled';
140
157
  const planMode = context.isPlanMode ? 'Enabled' : 'Disabled';
@@ -405,6 +422,7 @@ export async function handleSlashCommand(command, context) {
405
422
  chatSessionState.totalOutputTokens = session.totalOutputTokens || 0;
406
423
  chatSessionState.latestUsageMetadata = session.latestUsageMetadata;
407
424
  chatSessionState.previousUsageMetadata = session.previousUsageMetadata;
425
+ chatSessionState.modelUsageCounts = session.modelUsageCounts || {};
408
426
  chat.setSessionInfo(session.id, workspaceRoot);
409
427
  }
410
428
  process.stdout.write('\x1B[2J\x1B[3J\x1B[H'); // Hard clear screen and scrollback
@@ -18,6 +18,7 @@ export interface SlashCommandContext {
18
18
  totalOutputTokens: number;
19
19
  latestUsageMetadata?: any;
20
20
  previousUsageMetadata?: any;
21
+ modelUsageCounts?: Record<string, number>;
21
22
  };
22
23
  }
23
24
  export interface SlashCommandResult {
@@ -57,6 +57,7 @@ export declare function executeSingleTurn(workspaceRoot: string, userInput: stri
57
57
  totalOutputTokens: number;
58
58
  latestUsageMetadata?: any;
59
59
  previousUsageMetadata?: any;
60
+ modelUsageCounts?: Record<string, number>;
60
61
  }, isPlanMode: boolean, cachedContextResult?: any): Promise<{
61
62
  planModeReturn?: string;
62
63
  contextResult?: any;
@@ -86,7 +86,7 @@ export async function startAgentLoop(workspaceRoot, version) {
86
86
  chatHistoryService.init(workspaceRoot);
87
87
  const chat = createSharedChatSession();
88
88
  const inputHandler = new AsyncInputHandler();
89
- const chatSessionState = { id: crypto.randomUUID(), title: '', totalTokens: 0, totalInputTokens: 0, totalOutputTokens: 0 };
89
+ const chatSessionState = { id: crypto.randomUUID(), title: '', totalTokens: 0, totalInputTokens: 0, totalOutputTokens: 0, modelUsageCounts: {} };
90
90
  chat.setSessionInfo(chatSessionState.id, workspaceRoot);
91
91
  const sessionInputHistory = [];
92
92
  let isRawPasteMode = false;
@@ -115,6 +115,9 @@ export async function startAgentLoop(workspaceRoot, version) {
115
115
  chatSessionState.totalTokens = 0;
116
116
  chatSessionState.totalInputTokens = 0;
117
117
  chatSessionState.totalOutputTokens = 0;
118
+ chatSessionState.modelUsageCounts = {};
119
+ chatSessionState.latestUsageMetadata = undefined;
120
+ chatSessionState.previousUsageMetadata = undefined;
118
121
  chat.setSessionInfo(chatSessionState.id, workspaceRoot);
119
122
  }
120
123
  inputHandler.stop();
@@ -377,6 +380,12 @@ export async function executeSingleTurn(workspaceRoot, userInput, chat, inputHan
377
380
  }
378
381
  // Print Usage Stats
379
382
  const usage = getAndResetTurnUsage();
383
+ chatSessionState.modelUsageCounts = chatSessionState.modelUsageCounts || {};
384
+ if (usage.modelsUsed) {
385
+ for (const [m, count] of Object.entries(usage.modelsUsed)) {
386
+ chatSessionState.modelUsageCounts[m] = (chatSessionState.modelUsageCounts[m] || 0) + count;
387
+ }
388
+ }
380
389
  chatSessionState.previousUsageMetadata = chatSessionState.latestUsageMetadata;
381
390
  chatSessionState.latestUsageMetadata = usage;
382
391
  chatSessionState.totalTokens += usage.totalTokenCount;
@@ -433,6 +442,7 @@ export async function executeSingleTurn(workspaceRoot, userInput, chat, inputHan
433
442
  subAgents: isSubAgentsEnabled(),
434
443
  latestUsageMetadata: chatSessionState.latestUsageMetadata,
435
444
  previousUsageMetadata: chatSessionState.previousUsageMetadata,
445
+ modelUsageCounts: chatSessionState.modelUsageCounts,
436
446
  })
437
447
  .catch((e) => debugLog('Failed to auto-save session: ' + e));
438
448
  }
@@ -511,6 +521,12 @@ export async function executeSingleTurn(workspaceRoot, userInput, chat, inputHan
511
521
  changeLogger.markComplete();
512
522
  }
513
523
  if (usage) {
524
+ chatSessionState.modelUsageCounts = chatSessionState.modelUsageCounts || {};
525
+ if (usage.modelsUsed) {
526
+ for (const [m, count] of Object.entries(usage.modelsUsed)) {
527
+ chatSessionState.modelUsageCounts[m] = (chatSessionState.modelUsageCounts[m] || 0) + count;
528
+ }
529
+ }
514
530
  chatSessionState.previousUsageMetadata = chatSessionState.latestUsageMetadata;
515
531
  chatSessionState.latestUsageMetadata = usage;
516
532
  chatSessionState.totalTokens += usage.totalTokenCount || 0;
@@ -541,6 +557,7 @@ export async function executeSingleTurn(workspaceRoot, userInput, chat, inputHan
541
557
  subAgents: isSubAgentsEnabled(),
542
558
  latestUsageMetadata: chatSessionState.latestUsageMetadata,
543
559
  previousUsageMetadata: chatSessionState.previousUsageMetadata,
560
+ modelUsageCounts: chatSessionState.modelUsageCounts,
544
561
  });
545
562
  }
546
563
  catch (e) {
@@ -564,6 +581,7 @@ export async function executeSingleTurn(workspaceRoot, userInput, chat, inputHan
564
581
  subAgents: isSubAgentsEnabled(),
565
582
  latestUsageMetadata: chatSessionState.latestUsageMetadata,
566
583
  previousUsageMetadata: chatSessionState.previousUsageMetadata,
584
+ modelUsageCounts: chatSessionState.modelUsageCounts,
567
585
  })
568
586
  .catch((e) => debugLog('Failed to auto-save session: ' + e));
569
587
  }
@@ -35,6 +35,8 @@ export interface ChatSessionData {
35
35
  latestUsageMetadata?: any;
36
36
  /** Optional metadata about the token usage from the turn prior to the last turn. */
37
37
  previousUsageMetadata?: any;
38
+ /** Optional map tracking the number of turns each model was used during the session. */
39
+ modelUsageCounts?: Record<string, number>;
38
40
  }
39
41
  /**
40
42
  * Service responsible for managing the persistence, retrieval, and deletion of chat session histories.
@@ -21,6 +21,7 @@ export declare function getAndResetTurnUsage(): {
21
21
  totalTokenCount: number;
22
22
  creditsUsed: number;
23
23
  remainingBalance: number | undefined;
24
+ modelsUsed: Record<string, number>;
24
25
  };
25
26
  export declare function peekTurnUsage(): {
26
27
  promptTokens: number;
@@ -29,6 +30,7 @@ export declare function peekTurnUsage(): {
29
30
  totalTokenCount: number;
30
31
  creditsUsed: number;
31
32
  remainingBalance: number | undefined;
33
+ modelsUsed: Record<string, number>;
32
34
  };
33
35
  /**
34
36
  * Client service interacting directly with the serverless Gemini proxy endpoint.
@@ -39,7 +39,8 @@ let globalSessionAccumulatedUsage = {
39
39
  cachedTokens: 0,
40
40
  totalTokenCount: 0,
41
41
  creditsUsed: 0,
42
- remainingBalance: undefined
42
+ remainingBalance: undefined,
43
+ modelsUsed: {}
43
44
  };
44
45
  export function getAndResetTurnUsage() {
45
46
  const current = { ...globalSessionAccumulatedUsage };
@@ -49,7 +50,8 @@ export function getAndResetTurnUsage() {
49
50
  cachedTokens: 0,
50
51
  totalTokenCount: 0,
51
52
  creditsUsed: 0,
52
- remainingBalance: undefined
53
+ remainingBalance: undefined,
54
+ modelsUsed: {}
53
55
  };
54
56
  return current;
55
57
  }
@@ -190,6 +192,7 @@ export class ProxyClient {
190
192
  if (data.usage.remainingBalance !== undefined) {
191
193
  globalSessionAccumulatedUsage.remainingBalance = data.usage.remainingBalance;
192
194
  }
195
+ globalSessionAccumulatedUsage.modelsUsed[modelName] = (globalSessionAccumulatedUsage.modelsUsed[modelName] || 0) + 1;
193
196
  }
194
197
  if (data.groundingMetadata) {
195
198
  groundingMetadata = data.groundingMetadata;
@@ -65,5 +65,5 @@
65
65
  ]
66
66
  }
67
67
  },
68
- "version": "2.3.2"
68
+ "version": "2.3.3"
69
69
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "minovative-mind-cli",
3
3
  "description": "An automated AI agent powered by Vertex AI that helps you write software",
4
- "version": "2.3.2",
4
+ "version": "2.3.3",
5
5
  "author": "Daniel Ward",
6
6
  "bin": {
7
7
  "minovative-mind-cli": "bin/run.js"