@blackbox_ai/blackbox-cli-core 0.0.9 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/README.md +11 -183
  2. package/dist/index.d.ts +2 -1
  3. package/dist/index.js +2 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/blackbox/blackboxOAuth2.js +17 -1
  6. package/dist/src/blackbox/blackboxOAuth2.js.map +1 -1
  7. package/dist/src/code_assist/oauth2.js +15 -3
  8. package/dist/src/code_assist/oauth2.js.map +1 -1
  9. package/dist/src/config/blackboxModels.d.ts +3 -2
  10. package/dist/src/config/blackboxModels.js +262 -33
  11. package/dist/src/config/blackboxModels.js.map +1 -1
  12. package/dist/src/config/config.d.ts +65 -0
  13. package/dist/src/config/config.js +282 -17
  14. package/dist/src/config/config.js.map +1 -1
  15. package/dist/src/config/models.d.ts +1 -1
  16. package/dist/src/config/models.js +1 -1
  17. package/dist/src/config/models.js.map +1 -1
  18. package/dist/src/config/multiAgentModels.d.ts +63 -0
  19. package/dist/src/config/multiAgentModels.js +194 -0
  20. package/dist/src/config/multiAgentModels.js.map +1 -0
  21. package/dist/src/core/client.js +8 -2
  22. package/dist/src/core/client.js.map +1 -1
  23. package/dist/src/core/contentGenerator.d.ts +1 -0
  24. package/dist/src/core/contentGenerator.js +57 -7
  25. package/dist/src/core/contentGenerator.js.map +1 -1
  26. package/dist/src/core/encryptedClientFactory.d.ts +17 -0
  27. package/dist/src/core/encryptedClientFactory.js +92 -0
  28. package/dist/src/core/encryptedClientFactory.js.map +1 -0
  29. package/dist/src/core/encryptedContentGenerator.d.ts +47 -0
  30. package/dist/src/core/encryptedContentGenerator.js +445 -0
  31. package/dist/src/core/encryptedContentGenerator.js.map +1 -0
  32. package/dist/src/core/encryptedGeminiClient.d.ts +59 -0
  33. package/dist/src/core/encryptedGeminiClient.js +177 -0
  34. package/dist/src/core/encryptedGeminiClient.js.map +1 -0
  35. package/dist/src/core/encryptedGeminiClientBridge.d.ts +107 -0
  36. package/dist/src/core/encryptedGeminiClientBridge.js +808 -0
  37. package/dist/src/core/encryptedGeminiClientBridge.js.map +1 -0
  38. package/dist/src/core/encryptedGeminiClientWrapper.d.ts +129 -0
  39. package/dist/src/core/encryptedGeminiClientWrapper.js +305 -0
  40. package/dist/src/core/encryptedGeminiClientWrapper.js.map +1 -0
  41. package/dist/src/core/encryptedTurn.d.ts +40 -0
  42. package/dist/src/core/encryptedTurn.js +114 -0
  43. package/dist/src/core/encryptedTurn.js.map +1 -0
  44. package/dist/src/core/logger.d.ts +21 -0
  45. package/dist/src/core/logger.js +110 -0
  46. package/dist/src/core/logger.js.map +1 -1
  47. package/dist/src/core/openaiContentGenerator/constants.d.ts +2 -0
  48. package/dist/src/core/openaiContentGenerator/constants.js +2 -0
  49. package/dist/src/core/openaiContentGenerator/constants.js.map +1 -1
  50. package/dist/src/core/openaiContentGenerator/converter.d.ts +16 -1
  51. package/dist/src/core/openaiContentGenerator/converter.js +135 -4
  52. package/dist/src/core/openaiContentGenerator/converter.js.map +1 -1
  53. package/dist/src/core/openaiContentGenerator/pipeline.js +6 -2
  54. package/dist/src/core/openaiContentGenerator/pipeline.js.map +1 -1
  55. package/dist/src/core/openaiContentGenerator/provider/default.js +10 -1
  56. package/dist/src/core/openaiContentGenerator/provider/default.js.map +1 -1
  57. package/dist/src/core/prompts.d.ts +17 -0
  58. package/dist/src/core/prompts.js +347 -19
  59. package/dist/src/core/prompts.js.map +1 -1
  60. package/dist/src/core/tokenLimits.d.ts +1 -0
  61. package/dist/src/core/tokenLimits.js +37 -2
  62. package/dist/src/core/tokenLimits.js.map +1 -1
  63. package/dist/src/core/tokenLimits.test.js +36 -1
  64. package/dist/src/core/tokenLimits.test.js.map +1 -1
  65. package/dist/src/encrypt/attestation.d.ts +5 -0
  66. package/dist/src/encrypt/attestation.js +100 -0
  67. package/dist/src/encrypt/attestation.js.map +1 -0
  68. package/dist/src/encrypt/client.d.ts +14 -0
  69. package/dist/src/encrypt/client.js +132 -0
  70. package/dist/src/encrypt/client.js.map +1 -0
  71. package/dist/src/encrypt/config.d.ts +22 -0
  72. package/dist/src/encrypt/config.js +43 -0
  73. package/dist/src/encrypt/config.js.map +1 -0
  74. package/dist/src/encrypt/crypto-utils.d.ts +57 -0
  75. package/dist/src/encrypt/crypto-utils.js +257 -0
  76. package/dist/src/encrypt/crypto-utils.js.map +1 -0
  77. package/dist/src/encrypt/history-manager.d.ts +43 -0
  78. package/dist/src/encrypt/history-manager.js +164 -0
  79. package/dist/src/encrypt/history-manager.js.map +1 -0
  80. package/dist/src/encrypt/minimax-template.d.ts +73 -0
  81. package/dist/src/encrypt/minimax-template.js +276 -0
  82. package/dist/src/encrypt/minimax-template.js.map +1 -0
  83. package/dist/src/encrypt/sessions.d.ts +17 -0
  84. package/dist/src/encrypt/sessions.js +221 -0
  85. package/dist/src/encrypt/sessions.js.map +1 -0
  86. package/dist/src/encrypt/streaming-client.d.ts +29 -0
  87. package/dist/src/encrypt/streaming-client.js +232 -0
  88. package/dist/src/encrypt/streaming-client.js.map +1 -0
  89. package/dist/src/encrypt/tool-formatter.d.ts +36 -0
  90. package/dist/src/encrypt/tool-formatter.js +353 -0
  91. package/dist/src/encrypt/tool-formatter.js.map +1 -0
  92. package/dist/src/encrypt/tool-parser.d.ts +93 -0
  93. package/dist/src/encrypt/tool-parser.js +567 -0
  94. package/dist/src/encrypt/tool-parser.js.map +1 -0
  95. package/dist/src/encrypt/types.d.ts +81 -0
  96. package/dist/src/encrypt/types.js +2 -0
  97. package/dist/src/encrypt/types.js.map +1 -0
  98. package/dist/src/generated/git-commit.d.ts +3 -3
  99. package/dist/src/generated/git-commit.js +3 -3
  100. package/dist/src/ide/ide-client.js +9 -19
  101. package/dist/src/ide/ide-client.js.map +1 -1
  102. package/dist/src/index.d.ts +15 -0
  103. package/dist/src/index.js +15 -0
  104. package/dist/src/index.js.map +1 -1
  105. package/dist/src/mcp/oauth-provider.js +2 -6
  106. package/dist/src/mcp/oauth-provider.js.map +1 -1
  107. package/dist/src/mcp/oauth-token-storage.d.ts +7 -0
  108. package/dist/src/mcp/oauth-token-storage.js +24 -0
  109. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  110. package/dist/src/services/EncryptedChatService.d.ts +80 -0
  111. package/dist/src/services/EncryptedChatService.js +202 -0
  112. package/dist/src/services/EncryptedChatService.js.map +1 -0
  113. package/dist/src/services/StatsHistoryService.d.ts +131 -0
  114. package/dist/src/services/StatsHistoryService.js +427 -0
  115. package/dist/src/services/StatsHistoryService.js.map +1 -0
  116. package/dist/src/services/checkpointApiService.d.ts +101 -0
  117. package/dist/src/services/checkpointApiService.js +215 -0
  118. package/dist/src/services/checkpointApiService.js.map +1 -0
  119. package/dist/src/services/environmentSanitization.d.ts +24 -0
  120. package/dist/src/services/environmentSanitization.js +152 -0
  121. package/dist/src/services/environmentSanitization.js.map +1 -0
  122. package/dist/src/telemetry/blackbox-logger/blackbox-logger.d.ts +2 -6
  123. package/dist/src/telemetry/blackbox-logger/blackbox-logger.js +29 -135
  124. package/dist/src/telemetry/blackbox-logger/blackbox-logger.js.map +1 -1
  125. package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.js +1 -1
  126. package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.js.map +1 -1
  127. package/dist/src/telemetry/uiTelemetry.d.ts +8 -0
  128. package/dist/src/telemetry/uiTelemetry.js +17 -0
  129. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  130. package/dist/src/tools/browser-interactive.d.ts +63 -0
  131. package/dist/src/tools/browser-interactive.js +394 -0
  132. package/dist/src/tools/browser-interactive.js.map +1 -0
  133. package/dist/src/tools/browser_use.d.ts +22 -1
  134. package/dist/src/tools/browser_use.js +403 -23
  135. package/dist/src/tools/browser_use.js.map +1 -1
  136. package/dist/src/tools/data-file-constants.d.ts +17 -0
  137. package/dist/src/tools/data-file-constants.js +30 -0
  138. package/dist/src/tools/data-file-constants.js.map +1 -0
  139. package/dist/src/tools/edit.js +44 -7
  140. package/dist/src/tools/edit.js.map +1 -1
  141. package/dist/src/tools/ls.js +40 -6
  142. package/dist/src/tools/ls.js.map +1 -1
  143. package/dist/src/tools/ls.test.js +4 -4
  144. package/dist/src/tools/ls.test.js.map +1 -1
  145. package/dist/src/tools/mcp-client-manager.d.ts +28 -2
  146. package/dist/src/tools/mcp-client-manager.js +62 -4
  147. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  148. package/dist/src/tools/mcp-client.d.ts +5 -3
  149. package/dist/src/tools/mcp-client.js +39 -11
  150. package/dist/src/tools/mcp-client.js.map +1 -1
  151. package/dist/src/tools/mcp-tool.d.ts +3 -1
  152. package/dist/src/tools/mcp-tool.js +37 -9
  153. package/dist/src/tools/mcp-tool.js.map +1 -1
  154. package/dist/src/tools/memoryTool.d.ts +14 -4
  155. package/dist/src/tools/memoryTool.js +98 -39
  156. package/dist/src/tools/memoryTool.js.map +1 -1
  157. package/dist/src/tools/read-data-file.d.ts +31 -0
  158. package/dist/src/tools/read-data-file.js +469 -0
  159. package/dist/src/tools/read-data-file.js.map +1 -0
  160. package/dist/src/tools/read-file.js +64 -5
  161. package/dist/src/tools/read-file.js.map +1 -1
  162. package/dist/src/tools/read-file.test.js +40 -6
  163. package/dist/src/tools/read-file.test.js.map +1 -1
  164. package/dist/src/tools/shell.d.ts +3 -1
  165. package/dist/src/tools/shell.js +25 -4
  166. package/dist/src/tools/shell.js.map +1 -1
  167. package/dist/src/tools/skill.d.ts +34 -0
  168. package/dist/src/tools/skill.js +143 -0
  169. package/dist/src/tools/skill.js.map +1 -0
  170. package/dist/src/tools/sql_db.d.ts +101 -0
  171. package/dist/src/tools/sql_db.js +1033 -0
  172. package/dist/src/tools/sql_db.js.map +1 -0
  173. package/dist/src/tools/sql_db_configure.d.ts +18 -0
  174. package/dist/src/tools/sql_db_configure.js +96 -0
  175. package/dist/src/tools/sql_db_configure.js.map +1 -0
  176. package/dist/src/tools/taskCompletion.d.ts +29 -0
  177. package/dist/src/tools/taskCompletion.js +231 -0
  178. package/dist/src/tools/taskCompletion.js.map +1 -0
  179. package/dist/src/tools/tool-error.d.ts +3 -1
  180. package/dist/src/tools/tool-error.js +3 -0
  181. package/dist/src/tools/tool-error.js.map +1 -1
  182. package/dist/src/tools/tool-names.d.ts +8 -0
  183. package/dist/src/tools/tool-names.js +8 -0
  184. package/dist/src/tools/tool-names.js.map +1 -1
  185. package/dist/src/tools/tool-registry.d.ts +22 -0
  186. package/dist/src/tools/tool-registry.js +41 -1
  187. package/dist/src/tools/tool-registry.js.map +1 -1
  188. package/dist/src/tools/tools.d.ts +18 -2
  189. package/dist/src/tools/tools.js +3 -0
  190. package/dist/src/tools/tools.js.map +1 -1
  191. package/dist/src/tools/web-fetch.js +24 -4
  192. package/dist/src/tools/web-fetch.js.map +1 -1
  193. package/dist/src/tools/web-search.js +160 -2
  194. package/dist/src/tools/web-search.js.map +1 -1
  195. package/dist/src/tools/workspace-error-helper.d.ts +9 -0
  196. package/dist/src/tools/workspace-error-helper.js +43 -0
  197. package/dist/src/tools/workspace-error-helper.js.map +1 -0
  198. package/dist/src/tools/workspace-error-helper.test.js +85 -0
  199. package/dist/src/tools/workspace-error-helper.test.js.map +1 -0
  200. package/dist/src/tools/write-file.js +42 -7
  201. package/dist/src/tools/write-file.js.map +1 -1
  202. package/dist/src/utils/environmentContext.js +3 -1
  203. package/dist/src/utils/environmentContext.js.map +1 -1
  204. package/dist/src/utils/environmentContext.test.js +3 -2
  205. package/dist/src/utils/environmentContext.test.js.map +1 -1
  206. package/dist/src/utils/fetch.d.ts +3 -1
  207. package/dist/src/utils/fetch.js +35 -2
  208. package/dist/src/utils/fetch.js.map +1 -1
  209. package/dist/src/utils/fileUtils.js +30 -3
  210. package/dist/src/utils/fileUtils.js.map +1 -1
  211. package/dist/src/utils/filesearch/fileSearch.d.ts +2 -0
  212. package/dist/src/utils/filesearch/fileSearch.js +38 -7
  213. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  214. package/dist/src/utils/git-worktree-utils.d.ts +56 -0
  215. package/dist/src/utils/git-worktree-utils.js +176 -0
  216. package/dist/src/utils/git-worktree-utils.js.map +1 -0
  217. package/dist/src/utils/imageCompression.d.ts +34 -0
  218. package/dist/src/utils/imageCompression.js +170 -0
  219. package/dist/src/utils/imageCompression.js.map +1 -0
  220. package/dist/src/utils/messageTruncator.d.ts +51 -0
  221. package/dist/src/utils/messageTruncator.js +346 -0
  222. package/dist/src/utils/messageTruncator.js.map +1 -0
  223. package/dist/src/utils/pathReader.js +26 -6
  224. package/dist/src/utils/pathReader.js.map +1 -1
  225. package/dist/src/utils/skill.d.ts +65 -0
  226. package/dist/src/utils/skill.js +241 -0
  227. package/dist/src/utils/skill.js.map +1 -0
  228. package/dist/src/utils/textCleaning.d.ts +51 -0
  229. package/dist/src/utils/textCleaning.js +327 -0
  230. package/dist/src/utils/textCleaning.js.map +1 -0
  231. package/dist/tsconfig.tsbuildinfo +1 -1
  232. package/package.json +16 -2
  233. package/dist/src/tools/mcp-client-manager.test.js +0 -39
  234. package/dist/src/tools/mcp-client-manager.test.js.map +0 -1
  235. package/dist/src/tools/mcp-client.test.d.ts +0 -6
  236. package/dist/src/tools/mcp-client.test.js +0 -454
  237. package/dist/src/tools/mcp-client.test.js.map +0 -1
  238. package/dist/src/tools/mcp-tool.test.d.ts +0 -6
  239. package/dist/src/tools/mcp-tool.test.js +0 -576
  240. package/dist/src/tools/mcp-tool.test.js.map +0 -1
  241. package/dist/src/tools/memoryTool.test.d.ts +0 -6
  242. package/dist/src/tools/memoryTool.test.js +0 -420
  243. package/dist/src/tools/memoryTool.test.js.map +0 -1
  244. package/dist/src/tools/tool-registry.test.d.ts +0 -6
  245. package/dist/src/tools/tool-registry.test.js +0 -332
  246. package/dist/src/tools/tool-registry.test.js.map +0 -1
  247. /package/dist/src/tools/{mcp-client-manager.test.d.ts → workspace-error-helper.test.d.ts} +0 -0
@@ -0,0 +1,427 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { promises as fs } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import { homedir } from 'node:os';
9
+ /**
10
+ * Service for managing persistent storage of session statistics
11
+ */
12
+ export class StatsHistoryService {
13
+ static instance = null;
14
+ statsFilePath;
15
+ data = null;
16
+ savePromise = null;
17
+ constructor() {
18
+ const blackboxDir = join(homedir(), '.blackboxcli');
19
+ this.statsFilePath = join(blackboxDir, 'stats-history.json');
20
+ }
21
+ /**
22
+ * Get singleton instance
23
+ */
24
+ static getInstance() {
25
+ if (!StatsHistoryService.instance) {
26
+ StatsHistoryService.instance = new StatsHistoryService();
27
+ }
28
+ return StatsHistoryService.instance;
29
+ }
30
+ /**
31
+ * Initialize the service by loading existing data
32
+ */
33
+ async initialize() {
34
+ try {
35
+ await this.loadData();
36
+ }
37
+ catch {
38
+ // If file doesn't exist or is corrupted, start fresh
39
+ this.data = this.createEmptyData();
40
+ }
41
+ }
42
+ /**
43
+ * Load data from disk
44
+ */
45
+ async loadData() {
46
+ const content = await fs.readFile(this.statsFilePath, 'utf-8');
47
+ this.data = JSON.parse(content);
48
+ // Validate and migrate if needed
49
+ if (!this.data || !this.data.version) {
50
+ this.data = this.createEmptyData();
51
+ }
52
+ // Migrate old data without totalCost field
53
+ if (this.data.aggregated && this.data.aggregated.totalCost === undefined) {
54
+ this.data.aggregated.totalCost = 0;
55
+ // Recalculate total cost from existing sessions
56
+ for (const session of this.data.sessions) {
57
+ if (session.cost !== undefined) {
58
+ this.data.aggregated.totalCost += session.cost;
59
+ }
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Create empty data structure
65
+ */
66
+ createEmptyData() {
67
+ return {
68
+ sessions: [],
69
+ aggregated: {
70
+ totalSessions: 0,
71
+ totalDuration: 0,
72
+ totalCost: 0,
73
+ allTimeMetrics: this.createEmptyMetrics(),
74
+ },
75
+ version: '1.0.0',
76
+ };
77
+ }
78
+ /**
79
+ * Create empty metrics structure
80
+ */
81
+ createEmptyMetrics() {
82
+ return {
83
+ models: {},
84
+ tools: {
85
+ totalCalls: 0,
86
+ totalSuccess: 0,
87
+ totalFail: 0,
88
+ totalDurationMs: 0,
89
+ totalDecisions: {
90
+ accept: 0,
91
+ reject: 0,
92
+ modify: 0,
93
+ auto_accept: 0,
94
+ },
95
+ byName: {},
96
+ },
97
+ files: {
98
+ totalLinesAdded: 0,
99
+ totalLinesRemoved: 0,
100
+ },
101
+ };
102
+ }
103
+ /**
104
+ * Save current session to history
105
+ */
106
+ async saveSession(sessionData) {
107
+ if (!this.data) {
108
+ await this.initialize();
109
+ }
110
+ const entry = {
111
+ sessionId: sessionData.sessionId,
112
+ startTime: sessionData.startTime.toISOString(),
113
+ endTime: sessionData.endTime.toISOString(),
114
+ duration: sessionData.endTime.getTime() - sessionData.startTime.getTime(),
115
+ metrics: sessionData.metrics,
116
+ promptCount: sessionData.promptCount,
117
+ cost: sessionData.cost,
118
+ };
119
+ this.data.sessions.push(entry);
120
+ this.updateAggregatedStats(entry);
121
+ // Save to disk (debounced)
122
+ await this.saveData();
123
+ }
124
+ /**
125
+ * Update aggregated statistics
126
+ */
127
+ updateAggregatedStats(entry) {
128
+ const agg = this.data.aggregated;
129
+ agg.totalSessions++;
130
+ agg.totalDuration += entry.duration;
131
+ if (entry.cost !== undefined) {
132
+ agg.totalCost += entry.cost;
133
+ }
134
+ // Aggregate model metrics
135
+ for (const [modelName, modelMetrics] of Object.entries(entry.metrics.models)) {
136
+ if (!agg.allTimeMetrics.models[modelName]) {
137
+ agg.allTimeMetrics.models[modelName] = {
138
+ api: { totalRequests: 0, totalErrors: 0, totalLatencyMs: 0 },
139
+ tokens: { prompt: 0, candidates: 0, total: 0, cached: 0, thoughts: 0, tool: 0 },
140
+ };
141
+ }
142
+ const aggModel = agg.allTimeMetrics.models[modelName];
143
+ aggModel.api.totalRequests += modelMetrics.api.totalRequests;
144
+ aggModel.api.totalErrors += modelMetrics.api.totalErrors;
145
+ aggModel.api.totalLatencyMs += modelMetrics.api.totalLatencyMs;
146
+ aggModel.tokens.prompt += modelMetrics.tokens.prompt;
147
+ aggModel.tokens.candidates += modelMetrics.tokens.candidates;
148
+ aggModel.tokens.total += modelMetrics.tokens.total;
149
+ aggModel.tokens.cached += modelMetrics.tokens.cached;
150
+ aggModel.tokens.thoughts += modelMetrics.tokens.thoughts;
151
+ aggModel.tokens.tool += modelMetrics.tokens.tool;
152
+ }
153
+ // Aggregate tool metrics
154
+ const aggTools = agg.allTimeMetrics.tools;
155
+ aggTools.totalCalls += entry.metrics.tools.totalCalls;
156
+ aggTools.totalSuccess += entry.metrics.tools.totalSuccess;
157
+ aggTools.totalFail += entry.metrics.tools.totalFail;
158
+ aggTools.totalDurationMs += entry.metrics.tools.totalDurationMs;
159
+ aggTools.totalDecisions.accept += entry.metrics.tools.totalDecisions.accept;
160
+ aggTools.totalDecisions.reject += entry.metrics.tools.totalDecisions.reject;
161
+ aggTools.totalDecisions.modify += entry.metrics.tools.totalDecisions.modify;
162
+ aggTools.totalDecisions.auto_accept += entry.metrics.tools.totalDecisions.auto_accept;
163
+ for (const [toolName, toolStats] of Object.entries(entry.metrics.tools.byName)) {
164
+ if (!aggTools.byName[toolName]) {
165
+ aggTools.byName[toolName] = {
166
+ count: 0,
167
+ success: 0,
168
+ fail: 0,
169
+ durationMs: 0,
170
+ decisions: { accept: 0, reject: 0, modify: 0, auto_accept: 0 },
171
+ };
172
+ }
173
+ const aggTool = aggTools.byName[toolName];
174
+ aggTool.count += toolStats.count;
175
+ aggTool.success += toolStats.success;
176
+ aggTool.fail += toolStats.fail;
177
+ aggTool.durationMs += toolStats.durationMs;
178
+ aggTool.decisions.accept += toolStats.decisions.accept;
179
+ aggTool.decisions.reject += toolStats.decisions.reject;
180
+ aggTool.decisions.modify += toolStats.decisions.modify;
181
+ aggTool.decisions.auto_accept += toolStats.decisions.auto_accept;
182
+ }
183
+ // Aggregate file metrics
184
+ agg.allTimeMetrics.files.totalLinesAdded += entry.metrics.files.totalLinesAdded;
185
+ agg.allTimeMetrics.files.totalLinesRemoved += entry.metrics.files.totalLinesRemoved;
186
+ }
187
+ /**
188
+ * Save data to disk with debouncing
189
+ */
190
+ async saveData() {
191
+ // If a save is already in progress, wait for it
192
+ if (this.savePromise) {
193
+ await this.savePromise;
194
+ }
195
+ this.savePromise = this.performSave();
196
+ await this.savePromise;
197
+ this.savePromise = null;
198
+ }
199
+ /**
200
+ * Perform the actual save operation
201
+ */
202
+ async performSave() {
203
+ try {
204
+ const content = JSON.stringify(this.data, null, 2);
205
+ await fs.writeFile(this.statsFilePath, content, 'utf-8');
206
+ }
207
+ catch (error) {
208
+ console.error('Failed to save stats history:', error);
209
+ throw error;
210
+ }
211
+ }
212
+ /**
213
+ * Get sessions with optional filtering
214
+ */
215
+ async getSessions(filter) {
216
+ if (!this.data) {
217
+ await this.initialize();
218
+ }
219
+ let sessions = [...this.data.sessions];
220
+ // Apply date filters
221
+ if (filter?.startDate) {
222
+ const startTime = filter.startDate.getTime();
223
+ sessions = sessions.filter(s => new Date(s.startTime).getTime() >= startTime);
224
+ }
225
+ if (filter?.endDate) {
226
+ const endTime = filter.endDate.getTime();
227
+ sessions = sessions.filter(s => new Date(s.endTime).getTime() <= endTime);
228
+ }
229
+ // Sort by start time (most recent first)
230
+ sessions.sort((a, b) => new Date(b.startTime).getTime() - new Date(a.startTime).getTime());
231
+ // Apply pagination
232
+ const offset = filter?.offset || 0;
233
+ const limit = filter?.limit || sessions.length;
234
+ return sessions.slice(offset, offset + limit);
235
+ }
236
+ /**
237
+ * Get aggregated all-time statistics
238
+ */
239
+ async getAggregatedStats() {
240
+ if (!this.data) {
241
+ await this.initialize();
242
+ }
243
+ return this.data.aggregated;
244
+ }
245
+ /**
246
+ * Calculate trends over a specified period
247
+ */
248
+ async getTrends(period) {
249
+ if (!this.data) {
250
+ await this.initialize();
251
+ }
252
+ const sessions = this.data.sessions;
253
+ if (sessions.length === 0) {
254
+ return [];
255
+ }
256
+ // Group sessions by period
257
+ const groups = new Map();
258
+ for (const session of sessions) {
259
+ const date = new Date(session.startTime);
260
+ let key;
261
+ switch (period) {
262
+ case 'daily':
263
+ key = date.toISOString().split('T')[0];
264
+ break;
265
+ case 'weekly': {
266
+ const weekStart = new Date(date);
267
+ weekStart.setDate(date.getDate() - date.getDay());
268
+ key = weekStart.toISOString().split('T')[0];
269
+ break;
270
+ }
271
+ case 'monthly':
272
+ key = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;
273
+ break;
274
+ default:
275
+ key = date.toISOString().split('T')[0];
276
+ break;
277
+ }
278
+ if (!groups.has(key)) {
279
+ groups.set(key, []);
280
+ }
281
+ groups.get(key).push(session);
282
+ }
283
+ // Calculate averages for each period
284
+ const trends = [];
285
+ for (const [key, periodSessions] of groups.entries()) {
286
+ const avgMetrics = this.calculateAverageMetrics(periodSessions);
287
+ const avgDuration = periodSessions.reduce((sum, s) => sum + s.duration, 0) / periodSessions.length;
288
+ trends.push({
289
+ period,
290
+ startDate: key,
291
+ endDate: key,
292
+ sessionCount: periodSessions.length,
293
+ avgDuration,
294
+ avgMetrics,
295
+ });
296
+ }
297
+ return trends.sort((a, b) => b.startDate.localeCompare(a.startDate));
298
+ }
299
+ /**
300
+ * Calculate average metrics across sessions
301
+ */
302
+ calculateAverageMetrics(sessions) {
303
+ if (sessions.length === 0) {
304
+ return this.createEmptyMetrics();
305
+ }
306
+ const avgMetrics = this.createEmptyMetrics();
307
+ const count = sessions.length;
308
+ // Average model metrics
309
+ const modelCounts = new Map();
310
+ for (const session of sessions) {
311
+ for (const [modelName, modelMetrics] of Object.entries(session.metrics.models)) {
312
+ if (!avgMetrics.models[modelName]) {
313
+ avgMetrics.models[modelName] = {
314
+ api: { totalRequests: 0, totalErrors: 0, totalLatencyMs: 0 },
315
+ tokens: { prompt: 0, candidates: 0, total: 0, cached: 0, thoughts: 0, tool: 0 },
316
+ };
317
+ modelCounts.set(modelName, 0);
318
+ }
319
+ const avg = avgMetrics.models[modelName];
320
+ avg.api.totalRequests += modelMetrics.api.totalRequests;
321
+ avg.api.totalErrors += modelMetrics.api.totalErrors;
322
+ avg.api.totalLatencyMs += modelMetrics.api.totalLatencyMs;
323
+ avg.tokens.prompt += modelMetrics.tokens.prompt;
324
+ avg.tokens.candidates += modelMetrics.tokens.candidates;
325
+ avg.tokens.total += modelMetrics.tokens.total;
326
+ avg.tokens.cached += modelMetrics.tokens.cached;
327
+ avg.tokens.thoughts += modelMetrics.tokens.thoughts;
328
+ avg.tokens.tool += modelMetrics.tokens.tool;
329
+ modelCounts.set(modelName, modelCounts.get(modelName) + 1);
330
+ }
331
+ }
332
+ // Divide by count to get averages
333
+ for (const [modelName, modelCount] of modelCounts.entries()) {
334
+ const avg = avgMetrics.models[modelName];
335
+ avg.api.totalRequests = Math.round(avg.api.totalRequests / modelCount);
336
+ avg.api.totalErrors = Math.round(avg.api.totalErrors / modelCount);
337
+ avg.api.totalLatencyMs = Math.round(avg.api.totalLatencyMs / modelCount);
338
+ avg.tokens.prompt = Math.round(avg.tokens.prompt / modelCount);
339
+ avg.tokens.candidates = Math.round(avg.tokens.candidates / modelCount);
340
+ avg.tokens.total = Math.round(avg.tokens.total / modelCount);
341
+ avg.tokens.cached = Math.round(avg.tokens.cached / modelCount);
342
+ avg.tokens.thoughts = Math.round(avg.tokens.thoughts / modelCount);
343
+ avg.tokens.tool = Math.round(avg.tokens.tool / modelCount);
344
+ }
345
+ // Average tool metrics
346
+ for (const session of sessions) {
347
+ avgMetrics.tools.totalCalls += session.metrics.tools.totalCalls;
348
+ avgMetrics.tools.totalSuccess += session.metrics.tools.totalSuccess;
349
+ avgMetrics.tools.totalFail += session.metrics.tools.totalFail;
350
+ avgMetrics.tools.totalDurationMs += session.metrics.tools.totalDurationMs;
351
+ avgMetrics.files.totalLinesAdded += session.metrics.files.totalLinesAdded;
352
+ avgMetrics.files.totalLinesRemoved += session.metrics.files.totalLinesRemoved;
353
+ }
354
+ avgMetrics.tools.totalCalls = Math.round(avgMetrics.tools.totalCalls / count);
355
+ avgMetrics.tools.totalSuccess = Math.round(avgMetrics.tools.totalSuccess / count);
356
+ avgMetrics.tools.totalFail = Math.round(avgMetrics.tools.totalFail / count);
357
+ avgMetrics.tools.totalDurationMs = Math.round(avgMetrics.tools.totalDurationMs / count);
358
+ avgMetrics.files.totalLinesAdded = Math.round(avgMetrics.files.totalLinesAdded / count);
359
+ avgMetrics.files.totalLinesRemoved = Math.round(avgMetrics.files.totalLinesRemoved / count);
360
+ return avgMetrics;
361
+ }
362
+ /**
363
+ * Get comparison between current session and historical average
364
+ */
365
+ async getCurrentVsHistorical(currentMetrics) {
366
+ if (!this.data) {
367
+ await this.initialize();
368
+ }
369
+ const sessions = this.data.sessions;
370
+ if (sessions.length === 0) {
371
+ return {
372
+ current: currentMetrics,
373
+ historical: this.createEmptyMetrics(),
374
+ percentDiff: { apiCalls: 0, tokens: 0, toolCalls: 0, linesChanged: 0 },
375
+ };
376
+ }
377
+ const historical = this.calculateAverageMetrics(sessions);
378
+ // Calculate percentage differences
379
+ const currentApiCalls = Object.values(currentMetrics.models).reduce((sum, m) => sum + m.api.totalRequests, 0);
380
+ const historicalApiCalls = Object.values(historical.models).reduce((sum, m) => sum + m.api.totalRequests, 0);
381
+ const apiCallsDiff = historicalApiCalls > 0
382
+ ? ((currentApiCalls - historicalApiCalls) / historicalApiCalls) * 100
383
+ : 0;
384
+ const currentTokens = Object.values(currentMetrics.models).reduce((sum, m) => sum + m.tokens.total, 0);
385
+ const historicalTokens = Object.values(historical.models).reduce((sum, m) => sum + m.tokens.total, 0);
386
+ const tokensDiff = historicalTokens > 0
387
+ ? ((currentTokens - historicalTokens) / historicalTokens) * 100
388
+ : 0;
389
+ const toolCallsDiff = historical.tools.totalCalls > 0
390
+ ? ((currentMetrics.tools.totalCalls - historical.tools.totalCalls) / historical.tools.totalCalls) * 100
391
+ : 0;
392
+ const currentLines = currentMetrics.files.totalLinesAdded + currentMetrics.files.totalLinesRemoved;
393
+ const historicalLines = historical.files.totalLinesAdded + historical.files.totalLinesRemoved;
394
+ const linesDiff = historicalLines > 0
395
+ ? ((currentLines - historicalLines) / historicalLines) * 100
396
+ : 0;
397
+ return {
398
+ current: currentMetrics,
399
+ historical,
400
+ percentDiff: {
401
+ apiCalls: Math.round(apiCallsDiff),
402
+ tokens: Math.round(tokensDiff),
403
+ toolCalls: Math.round(toolCallsDiff),
404
+ linesChanged: Math.round(linesDiff),
405
+ },
406
+ };
407
+ }
408
+ /**
409
+ * Export all data as JSON
410
+ */
411
+ async exportData() {
412
+ if (!this.data) {
413
+ await this.initialize();
414
+ }
415
+ return JSON.parse(JSON.stringify(this.data));
416
+ }
417
+ /**
418
+ * Clear all historical data (for testing or user request)
419
+ */
420
+ async clearHistory() {
421
+ this.data = this.createEmptyData();
422
+ await this.saveData();
423
+ }
424
+ }
425
+ // Export singleton instance
426
+ export const statsHistoryService = StatsHistoryService.getInstance();
427
+ //# sourceMappingURL=StatsHistoryService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatsHistoryService.js","sourceRoot":"","sources":["../../../src/services/StatsHistoryService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Service for fetching conversation checkpoints from the public API
8
+ * Uses Blackbox API key for authentication
9
+ */
10
+ export interface CheckpointData {
11
+ tag: string;
12
+ timestamp: string;
13
+ filePath: string;
14
+ projectHash: string;
15
+ resumeCommand: string;
16
+ content: unknown;
17
+ createdAt: string;
18
+ }
19
+ export interface TaskSummary {
20
+ id: string;
21
+ prompt: string;
22
+ repoUrl?: string;
23
+ selectedAgent?: string;
24
+ selectedModel?: string;
25
+ status: string;
26
+ branchName?: string;
27
+ createdAt: string;
28
+ updatedAt: string;
29
+ completedAt?: string;
30
+ latestCheckpoint?: {
31
+ tag: string;
32
+ timestamp: string;
33
+ projectHash: string;
34
+ resumeCommand: string;
35
+ createdAt: string;
36
+ };
37
+ }
38
+ export interface CheckpointApiResponse {
39
+ success: boolean;
40
+ task?: TaskSummary;
41
+ checkpoint?: CheckpointData;
42
+ checkpointHistory?: CheckpointData[];
43
+ message?: string;
44
+ error?: string;
45
+ }
46
+ export interface TaskListResponse {
47
+ success: boolean;
48
+ count?: number;
49
+ total?: number;
50
+ limit?: number;
51
+ offset?: number;
52
+ tasks?: TaskSummary[];
53
+ message?: string;
54
+ error?: string;
55
+ }
56
+ export declare class CheckpointApiService {
57
+ private readonly apiBaseUrl;
58
+ private readonly apiKey;
59
+ constructor(apiKey?: string);
60
+ /**
61
+ * Check if the service is configured with a valid API key
62
+ */
63
+ isConfigured(): boolean;
64
+ /**
65
+ * Normalize checkpoint tag to API format
66
+ * Supports:
67
+ * - "cloud-task-<taskId>" -> returns as-is
68
+ * - "<taskId>" -> converts to "cloud-task-<taskId>"
69
+ *
70
+ * @param tag - The checkpoint tag
71
+ * @returns Normalized tag in "cloud-task-<taskId>" format
72
+ */
73
+ private normalizeTag;
74
+ /**
75
+ * List all tasks with checkpoints for the authenticated user
76
+ * @param filters - Optional filters (status, limit, offset)
77
+ * @returns List of tasks with checkpoint summaries
78
+ */
79
+ listTasks(filters?: {
80
+ status?: string;
81
+ limit?: number;
82
+ offset?: number;
83
+ }): Promise<TaskSummary[]>;
84
+ /**
85
+ * Fetch checkpoint data from the public API
86
+ * @param tag - The checkpoint tag (e.g., "cloud-task-abc123" or just "abc123")
87
+ * @returns Checkpoint data or null if not found
88
+ */
89
+ fetchCheckpointByTag(tag: string): Promise<CheckpointData | null>;
90
+ /**
91
+ * Fetch task info by ID (without checkpoint content)
92
+ * @param taskId - The task ID (e.g., "abc123" or "cloud-task-abc123")
93
+ * @returns Task summary or null if not found
94
+ */
95
+ fetchTaskById(taskId: string): Promise<TaskSummary | null>;
96
+ /**
97
+ * Test the API connection and authentication
98
+ * @returns true if connection is successful, false otherwise
99
+ */
100
+ testConnection(): Promise<boolean>;
101
+ }