@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,469 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import path from 'node:path';
7
+ import fs from 'node:fs';
8
+ import { makeRelative, shortenPath } from '../utils/paths.js';
9
+ import { BaseDeclarativeTool, BaseToolInvocation, Kind, ToolConfirmationOutcome, } from './tools.js';
10
+ import { ToolNames } from './tool-names.js';
11
+ import { ToolErrorType } from './tool-error.js';
12
+ import { DATA_FILE_EXTENSIONS } from './data-file-constants.js';
13
+ class ReadDataFileToolInvocation extends BaseToolInvocation {
14
+ config;
15
+ static externalPathAllowlist = new Set();
16
+ constructor(config, params) {
17
+ super(params);
18
+ this.config = config;
19
+ }
20
+ getDescription() {
21
+ const relativePath = makeRelative(this.params.absolute_path, this.config.getTargetDir());
22
+ return `Analyzing data file: ${shortenPath(relativePath)}`;
23
+ }
24
+ toolLocations() {
25
+ return [{ path: this.params.absolute_path }];
26
+ }
27
+ async shouldConfirmExecute(_abortSignal) {
28
+ const workspaceContext = this.config.getWorkspaceContext();
29
+ const filePath = this.params.absolute_path;
30
+ const fileDir = path.dirname(filePath);
31
+ // If the path is inside the workspace, no special confirmation is needed.
32
+ if (workspaceContext.isPathWithinWorkspace(filePath)) {
33
+ return false;
34
+ }
35
+ // If this exact path was already approved in this session, skip confirmation.
36
+ if (ReadDataFileToolInvocation.externalPathAllowlist.has(filePath)) {
37
+ return false;
38
+ }
39
+ const directories = workspaceContext.getDirectories();
40
+ const promptLines = [
41
+ 'The assistant is requesting to read and analyze a data file that is outside the current workspace.',
42
+ '',
43
+ 'Requested data file path:',
44
+ ` ${filePath}`,
45
+ '',
46
+ 'Workspace directories:',
47
+ ...directories.map((dir) => ` ${dir}`),
48
+ '',
49
+ 'If you approve, a sample of the file contents and a derived summary may be sent to the model for this session.',
50
+ '',
51
+ `File directory: ${fileDir}, This directory will also be added to the workspace for this session.`,
52
+ ];
53
+ const confirmationDetails = {
54
+ type: 'info',
55
+ title: 'Confirm External Data File Read',
56
+ prompt: promptLines.join('\n'),
57
+ onConfirm: async (outcome) => {
58
+ if (outcome === ToolConfirmationOutcome.ProceedOnce ||
59
+ outcome === ToolConfirmationOutcome.ProceedAlways ||
60
+ outcome === ToolConfirmationOutcome.ProceedAlwaysServer ||
61
+ outcome === ToolConfirmationOutcome.ProceedAlwaysTool) {
62
+ ReadDataFileToolInvocation.externalPathAllowlist.add(filePath);
63
+ // Treat the approved file's directory as an additional workspace root
64
+ // so future reads there won't require external-path confirmation.
65
+ workspaceContext.addDirectory(fileDir);
66
+ }
67
+ },
68
+ };
69
+ return confirmationDetails;
70
+ }
71
+ /**
72
+ * Parse CSV file into structured data with comprehensive analysis
73
+ */
74
+ async parseCSV(content) {
75
+ const lines = content.trim().split('\n');
76
+ if (lines.length === 0) {
77
+ return {
78
+ fileType: 'CSV',
79
+ data: [],
80
+ summary: 'Empty CSV file',
81
+ rowCount: 0,
82
+ };
83
+ }
84
+ // Simple CSV parser (handles basic cases, not production-grade)
85
+ const parseCSVLine = (line) => {
86
+ const result = [];
87
+ let current = '';
88
+ let inQuotes = false;
89
+ for (let i = 0; i < line.length; i++) {
90
+ const char = line[i];
91
+ if (char === '"') {
92
+ inQuotes = !inQuotes;
93
+ }
94
+ else if (char === ',' && !inQuotes) {
95
+ result.push(current.trim());
96
+ current = '';
97
+ }
98
+ else {
99
+ current += char;
100
+ }
101
+ }
102
+ result.push(current.trim());
103
+ return result;
104
+ };
105
+ const headers = parseCSVLine(lines[0]);
106
+ const totalRows = lines.length - 1;
107
+ // Parse rows, limit display if max_rows is set
108
+ const allDataRows = lines.slice(1);
109
+ const displayMaxRows = this.params.max_rows || 100; // Default to 100 for display
110
+ // Parse data rows
111
+ const allData = allDataRows.map((line) => {
112
+ const values = parseCSVLine(line);
113
+ const row = {};
114
+ headers.forEach((header, index) => {
115
+ row[header] = values[index] || '';
116
+ });
117
+ return row;
118
+ });
119
+ // Data to display (limited if max_rows is set)
120
+ const displayData = displayMaxRows ? allData.slice(0, displayMaxRows) : allData;
121
+ const summaryText = displayMaxRows && totalRows > displayMaxRows
122
+ ? `CSV file with ${headers.length} columns and ${totalRows} rows (showing first ${displayMaxRows} rows)`
123
+ : `CSV file with ${headers.length} columns and ${totalRows} rows`;
124
+ return {
125
+ fileType: 'CSV',
126
+ data: displayData,
127
+ summary: summaryText,
128
+ rowCount: totalRows,
129
+ columnCount: headers.length,
130
+ columns: headers,
131
+ fullDataCount: totalRows,
132
+ };
133
+ }
134
+ /**
135
+ * Parse JSON file with comprehensive analysis
136
+ */
137
+ async parseJSON(content) {
138
+ try {
139
+ const data = JSON.parse(content);
140
+ const isArray = Array.isArray(data);
141
+ const rowCount = isArray ? data.length : undefined;
142
+ let columns;
143
+ if (isArray && data.length > 0 && typeof data[0] === 'object') {
144
+ columns = Object.keys(data[0]);
145
+ }
146
+ const displayMaxRows = this.params.max_rows || 100; // Default to 100 for display
147
+ const limitedData = isArray && displayMaxRows ? data.slice(0, displayMaxRows) : data;
148
+ const summaryText = isArray
149
+ ? displayMaxRows && rowCount && rowCount > displayMaxRows
150
+ ? `JSON array with ${rowCount} items${columns ? ` and ${columns.length} fields` : ''} (showing first ${displayMaxRows} items)`
151
+ : `JSON array with ${rowCount} items${columns ? ` and ${columns.length} fields` : ''}`
152
+ : 'JSON object';
153
+ return {
154
+ fileType: 'JSON',
155
+ data: limitedData,
156
+ summary: summaryText,
157
+ rowCount,
158
+ columnCount: columns?.length,
159
+ columns,
160
+ fullDataCount: rowCount,
161
+ };
162
+ }
163
+ catch (error) {
164
+ throw new Error(`Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`);
165
+ }
166
+ }
167
+ /**
168
+ * Parse TXT file (treat as plain text with line-by-line analysis)
169
+ */
170
+ async parseTXT(content) {
171
+ const lines = content.split('\n');
172
+ const maxRows = this.params.max_rows || 100;
173
+ const limitedLines = lines.slice(0, maxRows);
174
+ return {
175
+ fileType: 'TXT',
176
+ data: limitedLines,
177
+ summary: `Text file with ${lines.length} lines (showing first ${limitedLines.length} lines)`,
178
+ rowCount: lines.length,
179
+ };
180
+ }
181
+ /**
182
+ * Parse XLSX file using xlsx library
183
+ */
184
+ async parseXLSX(filePath) {
185
+ try {
186
+ // Dynamic import to handle optional dependency - use default export
187
+ const { default: XLSX } = await import('xlsx');
188
+ const workbook = XLSX.readFile(filePath);
189
+ const sheetNames = workbook.SheetNames;
190
+ if (sheetNames.length === 0) {
191
+ return {
192
+ fileType: 'XLSX',
193
+ data: [],
194
+ summary: 'Empty Excel file with no sheets',
195
+ sheets: [],
196
+ };
197
+ }
198
+ const maxRows = this.params.max_rows || 100;
199
+ // Parse all sheets and collect their data
200
+ const allSheetsData = {};
201
+ let totalRows = 0;
202
+ let firstSheetColumns = [];
203
+ for (const sheetName of sheetNames) {
204
+ const worksheet = workbook.Sheets[sheetName];
205
+ // Convert to JSON with proper options
206
+ const jsonData = XLSX.utils.sheet_to_json(worksheet, {
207
+ raw: false, // Format numbers and dates
208
+ defval: '', // Default value for empty cells
209
+ });
210
+ allSheetsData[sheetName] = jsonData;
211
+ totalRows += jsonData.length;
212
+ // Get column names from first sheet's first row
213
+ if (sheetName === sheetNames[0] && jsonData.length > 0 &&
214
+ typeof jsonData[0] === 'object' && jsonData[0] !== null) {
215
+ firstSheetColumns = Object.keys(jsonData[0]);
216
+ }
217
+ }
218
+ // For the main data output, show limited rows from the first sheet
219
+ const firstSheetName = sheetNames[0];
220
+ const firstSheetData = allSheetsData[firstSheetName] || [];
221
+ const limitedData = firstSheetData.slice(0, maxRows);
222
+ // Create a summary of all sheets
223
+ const sheetsSummary = sheetNames.map(name => `"${name}" (${allSheetsData[name]?.length || 0} rows)`).join(', ');
224
+ return {
225
+ fileType: 'XLSX',
226
+ data: {
227
+ // Primary data from first sheet (limited)
228
+ firstSheet: limitedData,
229
+ // All sheets data (limited per sheet)
230
+ allSheets: Object.fromEntries(Object.entries(allSheetsData).map(([name, data]) => [
231
+ name,
232
+ data.slice(0, maxRows)
233
+ ])),
234
+ },
235
+ summary: `Excel file with ${sheetNames.length} sheet(s): ${sheetsSummary}. Total ${totalRows} rows across all sheets. First sheet "${firstSheetName}" has ${firstSheetData.length} rows and ${firstSheetColumns.length} columns (showing first ${limitedData.length} rows).`,
236
+ rowCount: firstSheetData.length,
237
+ columnCount: firstSheetColumns.length,
238
+ columns: firstSheetColumns,
239
+ sheets: sheetNames,
240
+ };
241
+ }
242
+ catch (error) {
243
+ if (error.code === 'MODULE_NOT_FOUND' ||
244
+ error.message?.includes('Cannot find module')) {
245
+ return {
246
+ fileType: 'XLSX',
247
+ data: null,
248
+ summary: 'XLSX parsing requires the "xlsx" library. Please install it with: npm install xlsx',
249
+ };
250
+ }
251
+ throw new Error(`Failed to parse XLSX file: ${error instanceof Error ? error.message : String(error)}`);
252
+ }
253
+ }
254
+ /**
255
+ * Parse DOCX file using mammoth library
256
+ */
257
+ async parseDOCX(filePath) {
258
+ try {
259
+ // Dynamic import to handle optional dependency - use default export
260
+ const { default: mammoth } = await import('mammoth');
261
+ const result = await mammoth.extractRawText({ path: filePath });
262
+ const text = result.value;
263
+ // Split into paragraphs
264
+ const paragraphs = text
265
+ .split('\n')
266
+ .map((p) => p.trim())
267
+ .filter((p) => p.length > 0);
268
+ const maxRows = this.params.max_rows || 100;
269
+ const limitedParagraphs = paragraphs.slice(0, maxRows);
270
+ return {
271
+ fileType: 'DOCX',
272
+ data: limitedParagraphs,
273
+ summary: `Word document with ${paragraphs.length} paragraphs (showing first ${limitedParagraphs.length})`,
274
+ rowCount: paragraphs.length,
275
+ };
276
+ }
277
+ catch (error) {
278
+ if (error.code === 'MODULE_NOT_FOUND' ||
279
+ error.message?.includes('Cannot find module')) {
280
+ return {
281
+ fileType: 'DOCX',
282
+ data: null,
283
+ summary: 'DOCX parsing requires the "mammoth" library. Please install it with: npm install mammoth',
284
+ };
285
+ }
286
+ throw new Error(`Failed to parse DOCX file: ${error instanceof Error ? error.message : String(error)}`);
287
+ }
288
+ }
289
+ async execute() {
290
+ const filePath = this.params.absolute_path;
291
+ try {
292
+ // Check if file exists
293
+ if (!fs.existsSync(filePath)) {
294
+ return {
295
+ llmContent: `File not found: ${filePath}`,
296
+ returnDisplay: 'File not found',
297
+ error: {
298
+ message: `File not found: ${filePath}`,
299
+ type: ToolErrorType.FILE_NOT_FOUND,
300
+ },
301
+ };
302
+ }
303
+ // Check if it's a directory
304
+ const stats = await fs.promises.stat(filePath);
305
+ if (stats.isDirectory()) {
306
+ return {
307
+ llmContent: `Path is a directory, not a file: ${filePath}`,
308
+ returnDisplay: 'Path is a directory',
309
+ error: {
310
+ message: `Path is a directory: ${filePath}`,
311
+ type: ToolErrorType.TARGET_IS_DIRECTORY,
312
+ },
313
+ };
314
+ }
315
+ // Get file extension
316
+ const ext = path.extname(filePath).toLowerCase();
317
+ const relativePath = makeRelative(filePath, this.config.getTargetDir());
318
+ let result;
319
+ // Parse based on file type
320
+ switch (ext) {
321
+ case '.csv': {
322
+ const content = await fs.promises.readFile(filePath, 'utf-8');
323
+ result = await this.parseCSV(content);
324
+ break;
325
+ }
326
+ case '.json': {
327
+ const content = await fs.promises.readFile(filePath, 'utf-8');
328
+ result = await this.parseJSON(content);
329
+ break;
330
+ }
331
+ case '.txt': {
332
+ const content = await fs.promises.readFile(filePath, 'utf-8');
333
+ result = await this.parseTXT(content);
334
+ break;
335
+ }
336
+ case '.xlsx':
337
+ case '.xls': {
338
+ result = await this.parseXLSX(filePath);
339
+ break;
340
+ }
341
+ case '.docx':
342
+ case '.doc': {
343
+ result = await this.parseDOCX(filePath);
344
+ break;
345
+ }
346
+ case '.pdf': {
347
+ return {
348
+ llmContent: `PDF files are already supported by the read_file tool. Please use read_file instead for: ${relativePath}`,
349
+ returnDisplay: 'Use read_file for PDF files',
350
+ };
351
+ }
352
+ default: {
353
+ return {
354
+ llmContent: `Unsupported file type: ${ext}. Supported types: .csv, .json, .txt, .xlsx, .xls, .docx, .doc`,
355
+ returnDisplay: `Unsupported file type: ${ext}`,
356
+ error: {
357
+ message: `Unsupported file type: ${ext}`,
358
+ type: ToolErrorType.INVALID_TOOL_PARAMS,
359
+ },
360
+ };
361
+ }
362
+ }
363
+ const fileSize = stats.size;
364
+ const fileSizeMB = (fileSize / (1024 * 1024)).toFixed(2);
365
+ const totalRows = result.fullDataCount || result.rowCount || 0;
366
+ const isArrayData = Array.isArray(result.data);
367
+ const maxResultTokens = 10000;
368
+ const rowsToDisplay = isArrayData ? Math.min(result.data.length, 100) : 'N/A';
369
+ let jsonSampleString = JSON.stringify(Array.isArray(result.data) ? result.data.slice(0, 100) : result.data, null, 2);
370
+ jsonSampleString = (jsonSampleString.length > maxResultTokens * 3) ? jsonSampleString.slice(0, maxResultTokens * 3) + '... [truncated]' : jsonSampleString;
371
+ // Format the output for the LLM
372
+ const llmContent = `
373
+ # Data File: ${relativePath}
374
+ (Absolute Path on this device: ${filePath})
375
+
376
+ ## File Information
377
+ - **Type**: ${result.fileType}
378
+ - **File Size**: ${fileSizeMB} MB
379
+ - **Summary**: ${result.summary}
380
+ ${result.rowCount !== undefined ? `- **Total Rows**: ${result.rowCount}` : ''}
381
+ ${result.fullDataCount !== undefined && result.fullDataCount !== result.rowCount ? `- **Full Dataset Rows**: ${result.fullDataCount}` : ''}
382
+ ${result.columnCount !== undefined ? `- **Columns**: ${result.columnCount}` : ''}
383
+ ${result.columns ? `- **Column Names**: ${result.columns.join(', ')}` : ''}
384
+ ${result.sheets ? `- **Sheets**: ${result.sheets.join(', ')}` : ''}
385
+
386
+ ## Sample Data (First ${rowsToDisplay} rows)
387
+
388
+ **Note:** This is a sample of the data. For complete analysis, write a Python script to read and analyze the entire file.
389
+
390
+ \`\`\`json
391
+ ${jsonSampleString}
392
+ \`\`\`
393
+
394
+ ## Recommendations
395
+ - Write a Python script to analyze the complete dataset (all ${totalRows} rows)
396
+ - Use pandas, numpy, or other data analysis libraries for comprehensive analysis
397
+ - Sample from beginning, middle, and end to detect any structure changes
398
+
399
+ ---
400
+ **IMPORTANT FILE PATH REMINDER:** If you need to read or analyze this file further, use this EXACT absolute path: ${filePath}
401
+ `;
402
+ return {
403
+ llmContent,
404
+ returnDisplay: result.summary,
405
+ };
406
+ }
407
+ catch (error) {
408
+ const errorMessage = error instanceof Error ? error.message : String(error);
409
+ return {
410
+ llmContent: `Error parsing data file: ${errorMessage}`,
411
+ returnDisplay: `Error: ${errorMessage}`,
412
+ error: {
413
+ message: errorMessage,
414
+ type: ToolErrorType.READ_CONTENT_FAILURE,
415
+ },
416
+ };
417
+ }
418
+ }
419
+ }
420
+ /**
421
+ * Tool for reading and parsing data files (CSV, JSON, TXT, XLSX, DOCX)
422
+ */
423
+ export class ReadDataFileTool extends BaseDeclarativeTool {
424
+ config;
425
+ static Name = ToolNames.READ_DATA_FILE;
426
+ constructor(config) {
427
+ super(ReadDataFileTool.Name, 'ReadDataFile', `Reads and parses structured data files (CSV, JSON, TXT, XLSX, DOCX, DOC) and returns the parsed data in a structured format. Use this tool to read data files and extract their content. For analysis, write a Python script to process the complete dataset.`, Kind.Read, {
428
+ properties: {
429
+ absolute_path: {
430
+ description: "The absolute path to the data file to read and parse (e.g., '<PROJECT_ROOT>/data.csv'). Supported file types: .csv, .json, .txt, .xlsx, .xls, .docx, .doc. Relative paths are not supported.",
431
+ type: 'string',
432
+ },
433
+ max_rows: {
434
+ description: 'Optional: Maximum number of rows/items to DISPLAY in the output (default: 100). This only controls how many sample rows are shown. Set higher for more sample data or lower for less.',
435
+ type: 'number',
436
+ },
437
+ },
438
+ required: ['absolute_path'],
439
+ type: 'object',
440
+ });
441
+ this.config = config;
442
+ }
443
+ validateToolParamValues(params) {
444
+ const filePath = params.absolute_path;
445
+ if (filePath.trim() === '') {
446
+ return "The 'absolute_path' parameter must be non-empty.";
447
+ }
448
+ if (!path.isAbsolute(filePath)) {
449
+ return `File path must be absolute, but was relative: ${filePath}. You must provide an absolute path.`;
450
+ }
451
+ // Validate file extension
452
+ const ext = path.extname(filePath).toLowerCase();
453
+ if (!DATA_FILE_EXTENSIONS.includes(ext)) {
454
+ return `Unsupported file type: ${ext}. Supported types: ${DATA_FILE_EXTENSIONS.join(', ')}`;
455
+ }
456
+ if (params.max_rows !== undefined && params.max_rows <= 0) {
457
+ return 'max_rows must be a positive number';
458
+ }
459
+ const fileService = this.config.getFileService();
460
+ if (fileService.shouldGeminiIgnoreFile(params.absolute_path)) {
461
+ return `File path '${filePath}' is ignored by .blackboxignore pattern(s).`;
462
+ }
463
+ return null;
464
+ }
465
+ createInvocation(params) {
466
+ return new ReadDataFileToolInvocation(this.config, params);
467
+ }
468
+ }
469
+ //# sourceMappingURL=read-data-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-data-file.js","sourceRoot":"","sources":["../../../src/tools/read-data-file.ts"],"names":[],"mappings":"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"}
@@ -5,19 +5,28 @@
5
5
  */
6
6
  import path from 'node:path';
7
7
  import { makeRelative, shortenPath } from '../utils/paths.js';
8
- import { BaseDeclarativeTool, BaseToolInvocation, Kind } from './tools.js';
8
+ import { BaseDeclarativeTool, BaseToolInvocation, Kind, ToolConfirmationOutcome, } from './tools.js';
9
9
  import { ToolNames } from './tool-names.js';
10
10
  import { processSingleFileContent, getSpecificMimeType, } from '../utils/fileUtils.js';
11
11
  import { FileOperation } from '../telemetry/metrics.js';
12
12
  import { getProgrammingLanguage } from '../telemetry/telemetry-utils.js';
13
13
  import { logFileOperation } from '../telemetry/loggers.js';
14
14
  import { FileOperationEvent } from '../telemetry/types.js';
15
+ import { DATA_FILE_EXTENSIONS, isDataFile } from './data-file-constants.js';
15
16
  class ReadFileToolInvocation extends BaseToolInvocation {
16
17
  config;
18
+ static sessionAllowlist = new Set();
17
19
  constructor(config, params) {
18
20
  super(params);
19
21
  this.config = config;
20
22
  }
23
+ /**
24
+ * Get combined allowlist (persistent + session-only)
25
+ */
26
+ getAllowlist() {
27
+ const persistentPaths = this.config.getApprovedExternalPaths();
28
+ return new Set([...persistentPaths, ...ReadFileToolInvocation.sessionAllowlist]);
29
+ }
21
30
  getDescription() {
22
31
  const relativePath = makeRelative(this.params.absolute_path, this.config.getTargetDir());
23
32
  return shortenPath(relativePath);
@@ -25,6 +34,56 @@ class ReadFileToolInvocation extends BaseToolInvocation {
25
34
  toolLocations() {
26
35
  return [{ path: this.params.absolute_path, line: this.params.offset }];
27
36
  }
37
+ async shouldConfirmExecute(_abortSignal) {
38
+ const workspaceContext = this.config.getWorkspaceContext();
39
+ const filePath = this.params.absolute_path;
40
+ const fileDir = path.dirname(filePath);
41
+ // If the path is inside the workspace, no special confirmation is needed.
42
+ if (workspaceContext.isPathWithinWorkspace(filePath)) {
43
+ return false;
44
+ }
45
+ // If this exact path was already approved, skip confirmation.
46
+ const allowlist = this.getAllowlist();
47
+ if (allowlist.has(filePath)) {
48
+ return false;
49
+ }
50
+ const directories = workspaceContext.getDirectories();
51
+ const promptLines = [
52
+ 'The assistant is requesting to read a file that is outside the current workspace.',
53
+ '',
54
+ `Requested file path:`,
55
+ ` ${filePath}`,
56
+ '',
57
+ 'Workspace directories:',
58
+ ...directories.map((dir) => ` ${dir}`),
59
+ '',
60
+ 'If you approve, the file contents may be sent to the model for this session.',
61
+ '',
62
+ `File directory: ${fileDir}, This directory will also be added to the workspace for this session.`,
63
+ ];
64
+ const confirmationDetails = {
65
+ type: 'info',
66
+ title: 'Confirm External File Read',
67
+ prompt: promptLines.join('\n'),
68
+ onConfirm: async (outcome) => {
69
+ if (outcome === ToolConfirmationOutcome.ProceedAlways) {
70
+ // Save to persistent storage
71
+ const currentPaths = this.config.getApprovedExternalPaths();
72
+ const newPaths = [...new Set([...currentPaths, filePath])];
73
+ this.config.saveApprovedExternalPaths(newPaths);
74
+ // Add the file's directory to the workspace so future reads there don't prompt.
75
+ workspaceContext.addDirectory(fileDir);
76
+ }
77
+ else if (outcome === ToolConfirmationOutcome.ProceedOnce) {
78
+ // Add to session-only allowlist
79
+ ReadFileToolInvocation.sessionAllowlist.add(filePath);
80
+ // Add the file's directory to the workspace so future reads there don't prompt.
81
+ workspaceContext.addDirectory(fileDir);
82
+ }
83
+ },
84
+ };
85
+ return confirmationDetails;
86
+ }
28
87
  async execute() {
29
88
  const result = await processSingleFileContent(this.params.absolute_path, this.config.getTargetDir(), this.config.getFileSystemService(), this.params.offset, this.params.limit);
30
89
  if (result.error) {
@@ -104,10 +163,10 @@ export class ReadFileTool extends BaseDeclarativeTool {
104
163
  if (!path.isAbsolute(filePath)) {
105
164
  return `File path must be absolute, but was relative: ${filePath}. You must provide an absolute path.`;
106
165
  }
107
- const workspaceContext = this.config.getWorkspaceContext();
108
- if (!workspaceContext.isPathWithinWorkspace(filePath)) {
109
- const directories = workspaceContext.getDirectories();
110
- return `File path must be within one of the workspace directories: ${directories.join(', ')}`;
166
+ // Check if this is a data file that should use read_data_file instead
167
+ if (isDataFile(filePath)) {
168
+ const ext = path.extname(filePath).toLowerCase();
169
+ return `Data files with extension '${ext}' must be read using the 'read_data_file' tool instead of 'read_file'. The read_data_file tool provides structured parsing and analysis for data files (${DATA_FILE_EXTENSIONS.join(', ')}). Please use read_data_file for: ${filePath}`;
111
170
  }
112
171
  if (params.offset !== undefined && params.offset < 0) {
113
172
  return 'Offset must be a non-negative number';
@@ -1 +1 @@
1
- {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../../src/tools/read-file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../../src/tools/read-file.ts"],"names":[],"mappings":"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"}