@blackbox_ai/blackbox-cli-core 0.0.7 → 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.
- package/README.md +11 -183
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/src/blackbox/blackboxOAuth2.js +17 -1
- package/dist/src/blackbox/blackboxOAuth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +15 -3
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/config/blackboxModels.d.ts +3 -2
- package/dist/src/config/blackboxModels.js +262 -33
- package/dist/src/config/blackboxModels.js.map +1 -1
- package/dist/src/config/config.d.ts +65 -0
- package/dist/src/config/config.js +282 -17
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/models.d.ts +1 -1
- package/dist/src/config/models.js +1 -1
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/multiAgentModels.d.ts +63 -0
- package/dist/src/config/multiAgentModels.js +194 -0
- package/dist/src/config/multiAgentModels.js.map +1 -0
- package/dist/src/core/client.js +11 -5
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +1 -0
- package/dist/src/core/contentGenerator.js +57 -7
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +2 -2
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/encryptedClientFactory.d.ts +17 -0
- package/dist/src/core/encryptedClientFactory.js +92 -0
- package/dist/src/core/encryptedClientFactory.js.map +1 -0
- package/dist/src/core/encryptedContentGenerator.d.ts +47 -0
- package/dist/src/core/encryptedContentGenerator.js +445 -0
- package/dist/src/core/encryptedContentGenerator.js.map +1 -0
- package/dist/src/core/encryptedGeminiClient.d.ts +59 -0
- package/dist/src/core/encryptedGeminiClient.js +177 -0
- package/dist/src/core/encryptedGeminiClient.js.map +1 -0
- package/dist/src/core/encryptedGeminiClientBridge.d.ts +107 -0
- package/dist/src/core/encryptedGeminiClientBridge.js +808 -0
- package/dist/src/core/encryptedGeminiClientBridge.js.map +1 -0
- package/dist/src/core/encryptedGeminiClientWrapper.d.ts +129 -0
- package/dist/src/core/encryptedGeminiClientWrapper.js +305 -0
- package/dist/src/core/encryptedGeminiClientWrapper.js.map +1 -0
- package/dist/src/core/encryptedTurn.d.ts +40 -0
- package/dist/src/core/encryptedTurn.js +114 -0
- package/dist/src/core/encryptedTurn.js.map +1 -0
- package/dist/src/core/logger.d.ts +21 -0
- package/dist/src/core/logger.js +110 -0
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/constants.d.ts +2 -0
- package/dist/src/core/openaiContentGenerator/constants.js +2 -0
- package/dist/src/core/openaiContentGenerator/constants.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/converter.d.ts +16 -1
- package/dist/src/core/openaiContentGenerator/converter.js +135 -4
- package/dist/src/core/openaiContentGenerator/converter.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/pipeline.js +22 -8
- package/dist/src/core/openaiContentGenerator/pipeline.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/pipeline.test.js +51 -0
- package/dist/src/core/openaiContentGenerator/pipeline.test.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/provider/default.js +10 -1
- package/dist/src/core/openaiContentGenerator/provider/default.js.map +1 -1
- package/dist/src/core/prompts.d.ts +18 -1
- package/dist/src/core/prompts.js +388 -459
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/tokenLimits.d.ts +1 -0
- package/dist/src/core/tokenLimits.js +37 -2
- package/dist/src/core/tokenLimits.js.map +1 -1
- package/dist/src/core/tokenLimits.test.js +36 -1
- package/dist/src/core/tokenLimits.test.js.map +1 -1
- package/dist/src/encrypt/attestation.d.ts +5 -0
- package/dist/src/encrypt/attestation.js +100 -0
- package/dist/src/encrypt/attestation.js.map +1 -0
- package/dist/src/encrypt/client.d.ts +14 -0
- package/dist/src/encrypt/client.js +132 -0
- package/dist/src/encrypt/client.js.map +1 -0
- package/dist/src/encrypt/config.d.ts +22 -0
- package/dist/src/encrypt/config.js +43 -0
- package/dist/src/encrypt/config.js.map +1 -0
- package/dist/src/encrypt/crypto-utils.d.ts +57 -0
- package/dist/src/encrypt/crypto-utils.js +257 -0
- package/dist/src/encrypt/crypto-utils.js.map +1 -0
- package/dist/src/encrypt/history-manager.d.ts +43 -0
- package/dist/src/encrypt/history-manager.js +164 -0
- package/dist/src/encrypt/history-manager.js.map +1 -0
- package/dist/src/encrypt/minimax-template.d.ts +73 -0
- package/dist/src/encrypt/minimax-template.js +276 -0
- package/dist/src/encrypt/minimax-template.js.map +1 -0
- package/dist/src/encrypt/sessions.d.ts +17 -0
- package/dist/src/encrypt/sessions.js +221 -0
- package/dist/src/encrypt/sessions.js.map +1 -0
- package/dist/src/encrypt/streaming-client.d.ts +29 -0
- package/dist/src/encrypt/streaming-client.js +232 -0
- package/dist/src/encrypt/streaming-client.js.map +1 -0
- package/dist/src/encrypt/tool-formatter.d.ts +36 -0
- package/dist/src/encrypt/tool-formatter.js +353 -0
- package/dist/src/encrypt/tool-formatter.js.map +1 -0
- package/dist/src/encrypt/tool-parser.d.ts +93 -0
- package/dist/src/encrypt/tool-parser.js +567 -0
- package/dist/src/encrypt/tool-parser.js.map +1 -0
- package/dist/src/encrypt/types.d.ts +81 -0
- package/dist/src/encrypt/types.js +2 -0
- package/dist/src/encrypt/types.js.map +1 -0
- package/dist/src/generated/git-commit.d.ts +3 -3
- package/dist/src/generated/git-commit.js +3 -3
- package/dist/src/ide/ide-client.js +9 -19
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.js +15 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.js +2 -6
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.d.ts +7 -0
- package/dist/src/mcp/oauth-token-storage.js +24 -0
- package/dist/src/mcp/oauth-token-storage.js.map +1 -1
- package/dist/src/services/EncryptedChatService.d.ts +80 -0
- package/dist/src/services/EncryptedChatService.js +202 -0
- package/dist/src/services/EncryptedChatService.js.map +1 -0
- package/dist/src/services/StatsHistoryService.d.ts +131 -0
- package/dist/src/services/StatsHistoryService.js +427 -0
- package/dist/src/services/StatsHistoryService.js.map +1 -0
- package/dist/src/services/checkpointApiService.d.ts +101 -0
- package/dist/src/services/checkpointApiService.js +215 -0
- package/dist/src/services/checkpointApiService.js.map +1 -0
- package/dist/src/services/environmentSanitization.d.ts +24 -0
- package/dist/src/services/environmentSanitization.js +152 -0
- package/dist/src/services/environmentSanitization.js.map +1 -0
- package/dist/src/telemetry/blackbox-logger/blackbox-logger.d.ts +2 -6
- package/dist/src/telemetry/blackbox-logger/blackbox-logger.js +29 -135
- package/dist/src/telemetry/blackbox-logger/blackbox-logger.js.map +1 -1
- package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.js +1 -1
- package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +8 -0
- package/dist/src/telemetry/uiTelemetry.js +17 -0
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/tools/browser-interactive.d.ts +63 -0
- package/dist/src/tools/browser-interactive.js +394 -0
- package/dist/src/tools/browser-interactive.js.map +1 -0
- package/dist/src/tools/browser_use.d.ts +23 -2
- package/dist/src/tools/browser_use.js +424 -43
- package/dist/src/tools/browser_use.js.map +1 -1
- package/dist/src/tools/data-file-constants.d.ts +17 -0
- package/dist/src/tools/data-file-constants.js +30 -0
- package/dist/src/tools/data-file-constants.js.map +1 -0
- package/dist/src/tools/edit.js +44 -7
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/exitPlanMode.js +1 -1
- package/dist/src/tools/exitPlanMode.js.map +1 -1
- package/dist/src/tools/ls.js +40 -6
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +4 -4
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.d.ts +28 -2
- package/dist/src/tools/mcp-client-manager.js +62 -4
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +5 -3
- package/dist/src/tools/mcp-client.js +39 -11
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +3 -1
- package/dist/src/tools/mcp-tool.js +37 -9
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +14 -4
- package/dist/src/tools/memoryTool.js +98 -39
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/read-data-file.d.ts +31 -0
- package/dist/src/tools/read-data-file.js +469 -0
- package/dist/src/tools/read-data-file.js.map +1 -0
- package/dist/src/tools/read-file.js +64 -5
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +40 -6
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +3 -1
- package/dist/src/tools/shell.js +25 -4
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/skill.d.ts +34 -0
- package/dist/src/tools/skill.js +143 -0
- package/dist/src/tools/skill.js.map +1 -0
- package/dist/src/tools/sql_db.d.ts +101 -0
- package/dist/src/tools/sql_db.js +1033 -0
- package/dist/src/tools/sql_db.js.map +1 -0
- package/dist/src/tools/sql_db_configure.d.ts +18 -0
- package/dist/src/tools/sql_db_configure.js +96 -0
- package/dist/src/tools/sql_db_configure.js.map +1 -0
- package/dist/src/tools/taskCompletion.d.ts +29 -0
- package/dist/src/tools/taskCompletion.js +231 -0
- package/dist/src/tools/taskCompletion.js.map +1 -0
- package/dist/src/tools/todoWrite.js +0 -142
- package/dist/src/tools/todoWrite.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +3 -1
- package/dist/src/tools/tool-error.js +3 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +8 -0
- package/dist/src/tools/tool-names.js +8 -0
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +22 -0
- package/dist/src/tools/tool-registry.js +41 -1
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tools.d.ts +18 -2
- package/dist/src/tools/tools.js +3 -0
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-fetch.js +24 -4
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-search.js +160 -2
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/workspace-error-helper.d.ts +9 -0
- package/dist/src/tools/workspace-error-helper.js +43 -0
- package/dist/src/tools/workspace-error-helper.js.map +1 -0
- package/dist/src/tools/workspace-error-helper.test.js +85 -0
- package/dist/src/tools/workspace-error-helper.test.js.map +1 -0
- package/dist/src/tools/write-file.js +42 -7
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/utils/environmentContext.js +3 -1
- package/dist/src/utils/environmentContext.js.map +1 -1
- package/dist/src/utils/environmentContext.test.js +3 -2
- package/dist/src/utils/environmentContext.test.js.map +1 -1
- package/dist/src/utils/fetch.d.ts +3 -1
- package/dist/src/utils/fetch.js +35 -2
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/fileUtils.js +30 -3
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.d.ts +2 -0
- package/dist/src/utils/filesearch/fileSearch.js +38 -7
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/git-worktree-utils.d.ts +56 -0
- package/dist/src/utils/git-worktree-utils.js +176 -0
- package/dist/src/utils/git-worktree-utils.js.map +1 -0
- package/dist/src/utils/imageCompression.d.ts +34 -0
- package/dist/src/utils/imageCompression.js +170 -0
- package/dist/src/utils/imageCompression.js.map +1 -0
- package/dist/src/utils/messageTruncator.d.ts +51 -0
- package/dist/src/utils/messageTruncator.js +346 -0
- package/dist/src/utils/messageTruncator.js.map +1 -0
- package/dist/src/utils/pathReader.js +26 -6
- package/dist/src/utils/pathReader.js.map +1 -1
- package/dist/src/utils/skill.d.ts +65 -0
- package/dist/src/utils/skill.js +241 -0
- package/dist/src/utils/skill.js.map +1 -0
- package/dist/src/utils/textCleaning.d.ts +51 -0
- package/dist/src/utils/textCleaning.js +327 -0
- package/dist/src/utils/textCleaning.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +19 -6
- package/dist/src/tools/mcp-client-manager.test.js +0 -39
- package/dist/src/tools/mcp-client-manager.test.js.map +0 -1
- package/dist/src/tools/mcp-client.test.d.ts +0 -6
- package/dist/src/tools/mcp-client.test.js +0 -454
- package/dist/src/tools/mcp-client.test.js.map +0 -1
- package/dist/src/tools/mcp-tool.test.d.ts +0 -6
- package/dist/src/tools/mcp-tool.test.js +0 -576
- package/dist/src/tools/mcp-tool.test.js.map +0 -1
- package/dist/src/tools/memoryTool.test.d.ts +0 -6
- package/dist/src/tools/memoryTool.test.js +0 -420
- package/dist/src/tools/memoryTool.test.js.map +0 -1
- package/dist/src/tools/tool-registry.test.d.ts +0 -6
- package/dist/src/tools/tool-registry.test.js +0 -332
- package/dist/src/tools/tool-registry.test.js.map +0 -1
- /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
|
-
|
|
108
|
-
if (
|
|
109
|
-
const
|
|
110
|
-
return `
|
|
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":"AAAA;;;;GAIG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../../src/tools/read-file.ts"],"names":[],"mappings":"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"}
|