@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,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { encoding_for_model, get_encoding } from "tiktoken";
|
|
7
|
+
// --- Constants (inferred from context or standard defaults) ---
|
|
8
|
+
const MIN_TOKENS_TO_PRESERVE = 20;
|
|
9
|
+
const LARGE_CONTEXT_BUFFER = 1000;
|
|
10
|
+
const STANDARD_CONTEXT_BUFFER = 500;
|
|
11
|
+
const ANTHROPIC_LARGE_CONTEXT_THRESHOLD = 16000;
|
|
12
|
+
const ANTHROPIC_LARGE_CONTEXT_MULTIPLIER = 0.9; // Safety buffer
|
|
13
|
+
const SAFE_DEFAULT_MAX_TOKENS = 4096;
|
|
14
|
+
const INITIAL_MESSAGES_TO_KEEP = 2; // Usually keeps System + 1
|
|
15
|
+
export class MessageTruncator {
|
|
16
|
+
debugMode = false;
|
|
17
|
+
constructor(debugMode = false) {
|
|
18
|
+
this.debugMode = debugMode;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Helper to get the tokenizer for a model.
|
|
22
|
+
* Handles generic fallback if the model string isn't an exact match.
|
|
23
|
+
*/
|
|
24
|
+
getTokenizer(model) {
|
|
25
|
+
try {
|
|
26
|
+
// Clean model name (e.g., "gpt-4-0613" -> "gpt-4") if needed,
|
|
27
|
+
// but encoding_for_model usually handles specifics well.
|
|
28
|
+
return encoding_for_model(model);
|
|
29
|
+
}
|
|
30
|
+
catch (_e) {
|
|
31
|
+
return get_encoding("cl100k_base");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Helper to count tokens for text or a list of messages.
|
|
36
|
+
* This mimics the self.count_tokens behavior.
|
|
37
|
+
*/
|
|
38
|
+
countTokens(enc, input) {
|
|
39
|
+
if (typeof input === 'string') {
|
|
40
|
+
return enc.encode(input).length;
|
|
41
|
+
}
|
|
42
|
+
// Rough estimation for message list overhead (similar to OpenAI cookbook)
|
|
43
|
+
let numTokens = 0;
|
|
44
|
+
const tokensPerMessage = 3;
|
|
45
|
+
for (const msg of input) {
|
|
46
|
+
numTokens += tokensPerMessage;
|
|
47
|
+
// Count content
|
|
48
|
+
if (typeof msg.content === 'string') {
|
|
49
|
+
numTokens += enc.encode(msg.content).length;
|
|
50
|
+
}
|
|
51
|
+
else if (Array.isArray(msg.content)) {
|
|
52
|
+
for (const block of msg.content) {
|
|
53
|
+
if (block.type === 'text' && block.text) {
|
|
54
|
+
numTokens += enc.encode(block.text).length;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Count tool calls if present
|
|
59
|
+
if (msg.tool_calls) {
|
|
60
|
+
for (const tool of msg.tool_calls) {
|
|
61
|
+
if (tool.function && tool.function.arguments) {
|
|
62
|
+
numTokens += enc.encode(tool.function.arguments).length;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
numTokens += 3; // every reply is primed with <|start|>assistant<|message|>
|
|
68
|
+
return numTokens;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Returns max token limits for models that may not be available in LiteLLM's get_model_info().
|
|
72
|
+
* Based on the comprehensive model mapping from the Python implementation.
|
|
73
|
+
*/
|
|
74
|
+
getModelMaxTokens(model) {
|
|
75
|
+
const modelLower = model.toLowerCase();
|
|
76
|
+
// Exact model mappings
|
|
77
|
+
const modelToLengths = {
|
|
78
|
+
"anthropic/claude-opus-4": 200_000,
|
|
79
|
+
"anthropic/claude-opus-4.1": 200_000,
|
|
80
|
+
"moonshotai/kimi-k2": 260_000,
|
|
81
|
+
"image-gen": 4_096, // OpenAI GPT-4o image input token limit
|
|
82
|
+
"transcribe": 8_000, // Whisper-1 approximate limit
|
|
83
|
+
"custom/blackbox-base": 256_000, // grok-code-fast-1
|
|
84
|
+
"google/gemini-2.5-pro-preview": 1_048_576, // 1M tokens (Gemini 2.5 Pro)
|
|
85
|
+
"google/gemini-3-pro-preview": 1_048_576, // 1M tokens (Gemini 3 Pro)
|
|
86
|
+
"custom/claude-opus-4": 200_000,
|
|
87
|
+
"gemini-2.5-pro-preview-03-25": 1_048_576,
|
|
88
|
+
"grok-3-beta": 128_000, // Grok-3 beta by xAI (Elon Musk)
|
|
89
|
+
"llama-4-maverick-17b-128e-instruct-fp8": 128_000, // unofficial estimate
|
|
90
|
+
"qwen/qwen2.5-coder-32b-instruct": 128_000,
|
|
91
|
+
"qwen/qwen2.5-72b-instruct-turbo": 128_000,
|
|
92
|
+
"black-forest-labs/flux-schnell": 8_192, // estimate based on small models
|
|
93
|
+
"black-forest-labs/flux-kontext-max": 32_768, // larger context variant
|
|
94
|
+
"anthropic/claude-sonnet-4": 1_000_000,
|
|
95
|
+
"openrouter/claude-sonnet-4": 1_000_000,
|
|
96
|
+
"anthropic/claude-sonnet-4.5": 1_000_000,
|
|
97
|
+
"x-ai/grok-4-fast": 2_000_000,
|
|
98
|
+
"gpt-5": 400_000,
|
|
99
|
+
"kimi-k2-0905": 260_000,
|
|
100
|
+
"blackbox-pro-plus": 1_000_000,
|
|
101
|
+
"custom/blackbox-pro-plus": 1_000_000,
|
|
102
|
+
"custom/blackbox-pro": 1_000_000,
|
|
103
|
+
"gpt-4o-mini": 256_000, // grok-code-fast-1
|
|
104
|
+
};
|
|
105
|
+
// Check for exact match first
|
|
106
|
+
if (modelToLengths[model]) {
|
|
107
|
+
return modelToLengths[model];
|
|
108
|
+
}
|
|
109
|
+
if (modelToLengths[modelLower]) {
|
|
110
|
+
return modelToLengths[modelLower];
|
|
111
|
+
}
|
|
112
|
+
// Pattern-based matching for common model families
|
|
113
|
+
if (modelLower.includes("gpt-5"))
|
|
114
|
+
return 400_000;
|
|
115
|
+
if (modelLower.includes("gpt-4o") && modelLower.includes("mini"))
|
|
116
|
+
return 256_000;
|
|
117
|
+
if (modelLower.includes("gpt-4-turbo") || modelLower.includes("gpt-4-1106"))
|
|
118
|
+
return 128_000;
|
|
119
|
+
if (modelLower.includes("gpt-4-32k"))
|
|
120
|
+
return 32_768;
|
|
121
|
+
if (modelLower.includes("gpt-4"))
|
|
122
|
+
return 8_192;
|
|
123
|
+
if (modelLower.includes("gpt-3.5-turbo-16k"))
|
|
124
|
+
return 16_385;
|
|
125
|
+
if (modelLower.includes("gpt-3.5-turbo"))
|
|
126
|
+
return 4_096;
|
|
127
|
+
// Claude models
|
|
128
|
+
if (modelLower.includes("claude-sonnet-4"))
|
|
129
|
+
return 1_000_000;
|
|
130
|
+
if (modelLower.includes("claude-opus-4"))
|
|
131
|
+
return 200_000;
|
|
132
|
+
if (modelLower.includes("claude-3") || modelLower.includes("claude-2"))
|
|
133
|
+
return 200_000;
|
|
134
|
+
// Gemini models
|
|
135
|
+
if (modelLower.includes("gemini-2.5") || modelLower.includes("gemini-3"))
|
|
136
|
+
return 1_048_576;
|
|
137
|
+
if (modelLower.includes("gemini"))
|
|
138
|
+
return 1_048_576; // Default for Gemini family
|
|
139
|
+
// Blackbox models
|
|
140
|
+
if (modelLower.includes("blackbox-pro"))
|
|
141
|
+
return 1_000_000;
|
|
142
|
+
if (modelLower.includes("blackbox"))
|
|
143
|
+
return 256_000;
|
|
144
|
+
// Grok models
|
|
145
|
+
if (modelLower.includes("grok-4"))
|
|
146
|
+
return 2_000_000;
|
|
147
|
+
if (modelLower.includes("grok-3"))
|
|
148
|
+
return 128_000;
|
|
149
|
+
if (modelLower.includes("grok"))
|
|
150
|
+
return 128_000;
|
|
151
|
+
// Kimi models
|
|
152
|
+
if (modelLower.includes("kimi"))
|
|
153
|
+
return 260_000;
|
|
154
|
+
// Qwen models
|
|
155
|
+
if (modelLower.includes("qwen"))
|
|
156
|
+
return 128_000;
|
|
157
|
+
// LLaMA models
|
|
158
|
+
if (modelLower.includes("llama"))
|
|
159
|
+
return 128_000;
|
|
160
|
+
return 128_000; // Unknown model
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Smartly truncates message content by targeting longer texts first.
|
|
164
|
+
*/
|
|
165
|
+
truncateMessageContent(enc, messageContent, tokensToRemove) {
|
|
166
|
+
// 1. Handle Simple String
|
|
167
|
+
if (typeof messageContent === 'string') {
|
|
168
|
+
const tokens = enc.encode(messageContent);
|
|
169
|
+
const totalTokens = tokens.length;
|
|
170
|
+
const tokensToRemoveFromBlock = Math.min(tokensToRemove, totalTokens - Math.min(MIN_TOKENS_TO_PRESERVE, totalTokens));
|
|
171
|
+
if (tokensToRemoveFromBlock <= 0) {
|
|
172
|
+
return [messageContent, tokensToRemove];
|
|
173
|
+
}
|
|
174
|
+
const keepCount = Math.max(0, totalTokens - tokensToRemoveFromBlock);
|
|
175
|
+
const newTokens = tokens.subarray(0, keepCount);
|
|
176
|
+
const newText = new TextDecoder().decode(enc.decode(newTokens)) + '... [Message truncated]';
|
|
177
|
+
return [newText, tokensToRemove - tokensToRemoveFromBlock];
|
|
178
|
+
}
|
|
179
|
+
// 2. Handle Tool Calls Calculation (Python code did this check implicitly via message structure)
|
|
180
|
+
// Note: The python code checked 'tool_calls' on the message object, but here we are passed
|
|
181
|
+
// message_content. If tool_calls affect the "content" budget, they should be handled before calling this,
|
|
182
|
+
// or passed in. Following the Python logic strictly, it handled "tool_calls" key in message_content dict.
|
|
183
|
+
// In TS interfaces, content is usually separate from tool_calls.
|
|
184
|
+
// We will assume `tokensToRemove` passed here already accounts for tool overhead if needed.
|
|
185
|
+
// 3. Handle List of Content Blocks
|
|
186
|
+
if (Array.isArray(messageContent)) {
|
|
187
|
+
// Analyze text blocks
|
|
188
|
+
const textBlocks = [];
|
|
189
|
+
messageContent.forEach((block, idx) => {
|
|
190
|
+
if (block.type === 'text' && block.text) {
|
|
191
|
+
const tokens = enc.encode(block.text);
|
|
192
|
+
textBlocks.push({
|
|
193
|
+
index: idx,
|
|
194
|
+
text: block.text,
|
|
195
|
+
tokens,
|
|
196
|
+
token_count: tokens.length
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
// Sort by length descending
|
|
201
|
+
textBlocks.sort((a, b) => b.token_count - a.token_count);
|
|
202
|
+
// Copy content to modify
|
|
203
|
+
// Deep clone to avoid mutating original immediately
|
|
204
|
+
const truncatedContent = JSON.parse(JSON.stringify(messageContent));
|
|
205
|
+
for (const block of textBlocks) {
|
|
206
|
+
const tokensToRemoveFromBlock = Math.min(tokensToRemove, block.token_count - Math.min(MIN_TOKENS_TO_PRESERVE, block.token_count));
|
|
207
|
+
if (tokensToRemoveFromBlock > 0) {
|
|
208
|
+
const keepCount = Math.max(0, block.token_count - tokensToRemoveFromBlock);
|
|
209
|
+
const newTokens = block.tokens.subarray(0, keepCount);
|
|
210
|
+
const newText = new TextDecoder().decode(enc.decode(newTokens)) + '... [Message truncated]';
|
|
211
|
+
truncatedContent[block.index].text = newText;
|
|
212
|
+
tokensToRemove -= tokensToRemoveFromBlock;
|
|
213
|
+
}
|
|
214
|
+
if (tokensToRemove <= 0)
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
return [truncatedContent, tokensToRemove];
|
|
218
|
+
}
|
|
219
|
+
return [messageContent, tokensToRemove];
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Main truncation method
|
|
223
|
+
*/
|
|
224
|
+
truncateLongMessages(model, messages, maxOutputTokens = 8192, systemPrompt = null) {
|
|
225
|
+
// Filter out string-only messages if any (Python code did this)
|
|
226
|
+
let currentMessages = messages.filter(m => typeof m !== 'string');
|
|
227
|
+
let enc = null;
|
|
228
|
+
try {
|
|
229
|
+
enc = this.getTokenizer(model);
|
|
230
|
+
// Handle System Prompt insertion logic
|
|
231
|
+
let systemAddedToTop = false;
|
|
232
|
+
if (systemPrompt && currentMessages.length > 0 && currentMessages[0].role !== 'system') {
|
|
233
|
+
currentMessages = [{ role: 'system', content: systemPrompt }, ...currentMessages];
|
|
234
|
+
systemAddedToTop = true;
|
|
235
|
+
}
|
|
236
|
+
const currentInpTotalTokens = this.countTokens(enc, currentMessages);
|
|
237
|
+
if (this.debugMode) {
|
|
238
|
+
console.log(` ${model} - current_inp_total_tokens`, currentInpTotalTokens, currentMessages.length);
|
|
239
|
+
}
|
|
240
|
+
// --- Calculate Max Allowed Size ---
|
|
241
|
+
let maxInputTokens = this.getModelMaxTokens(model);
|
|
242
|
+
if (maxInputTokens === 0) {
|
|
243
|
+
maxInputTokens = SAFE_DEFAULT_MAX_TOKENS; // Fallback
|
|
244
|
+
}
|
|
245
|
+
let maxAllowedSize;
|
|
246
|
+
if (maxInputTokens > 500_000) {
|
|
247
|
+
maxAllowedSize = maxInputTokens - LARGE_CONTEXT_BUFFER - maxOutputTokens;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
maxAllowedSize = maxInputTokens - STANDARD_CONTEXT_BUFFER - maxOutputTokens;
|
|
251
|
+
}
|
|
252
|
+
// Anthropic specific logic check
|
|
253
|
+
if (currentInpTotalTokens > ANTHROPIC_LARGE_CONTEXT_THRESHOLD && model.toLowerCase().includes("anthropic")) {
|
|
254
|
+
maxAllowedSize = Math.floor(maxAllowedSize * ANTHROPIC_LARGE_CONTEXT_MULTIPLIER);
|
|
255
|
+
}
|
|
256
|
+
// --- Check if Truncation is Needed ---
|
|
257
|
+
if (currentInpTotalTokens <= maxAllowedSize) {
|
|
258
|
+
if (systemAddedToTop) {
|
|
259
|
+
return currentMessages.slice(1);
|
|
260
|
+
}
|
|
261
|
+
return currentMessages;
|
|
262
|
+
}
|
|
263
|
+
// --- Truncation Logic ---
|
|
264
|
+
const truncatedMessages = [];
|
|
265
|
+
let tokensToRemove = currentInpTotalTokens - maxAllowedSize;
|
|
266
|
+
let removedTokens = 0;
|
|
267
|
+
// 1. Setup lists
|
|
268
|
+
let messagesToConsider = currentMessages.slice(0, -1); // All except last user message
|
|
269
|
+
// Always keep first message (System/Task)
|
|
270
|
+
if (currentMessages[0].role === 'system') {
|
|
271
|
+
truncatedMessages.push(currentMessages[0]);
|
|
272
|
+
messagesToConsider = messagesToConsider.slice(1);
|
|
273
|
+
}
|
|
274
|
+
// Keep INITIAL_MESSAGES_TO_KEEP from the start of what remains
|
|
275
|
+
if (messagesToConsider.length > 0) {
|
|
276
|
+
const keepCount = Math.min(messagesToConsider.length, INITIAL_MESSAGES_TO_KEEP);
|
|
277
|
+
truncatedMessages.push(...messagesToConsider.slice(0, keepCount));
|
|
278
|
+
messagesToConsider = messagesToConsider.slice(keepCount - 1); // Python logic was slice(INITIAL - 1)
|
|
279
|
+
// Note on Python Slice logic:
|
|
280
|
+
// Python: truncated_messages.extend(messages[1:INITIAL_MESSAGES_TO_KEEP])
|
|
281
|
+
// Python: messages_to_consider = messages_to_consider[INITIAL_MESSAGES_TO_KEEP - 1:]
|
|
282
|
+
// We replicate this behavior here:
|
|
283
|
+
}
|
|
284
|
+
// 2. Remove "Middle" Messages
|
|
285
|
+
const truncatedMiddleMessages = [];
|
|
286
|
+
for (const message of messagesToConsider) {
|
|
287
|
+
if (removedTokens >= tokensToRemove) {
|
|
288
|
+
truncatedMiddleMessages.push(message);
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
// Count tokens for this specific message
|
|
292
|
+
const fullMsgTokens = this.countTokens(enc, [message]);
|
|
293
|
+
removedTokens += fullMsgTokens;
|
|
294
|
+
}
|
|
295
|
+
tokensToRemove -= removedTokens;
|
|
296
|
+
// 3. Handle the "Last of the Initial Kept Messages" (Trim tail of the head)
|
|
297
|
+
if (tokensToRemove > 0 && truncatedMessages.length > 0) {
|
|
298
|
+
const lastIndex = truncatedMessages.length - 1;
|
|
299
|
+
const [newContent, remainingTokens] = this.truncateMessageContent(enc, truncatedMessages[lastIndex].content, tokensToRemove);
|
|
300
|
+
truncatedMessages[lastIndex].content = newContent;
|
|
301
|
+
tokensToRemove = remainingTokens;
|
|
302
|
+
}
|
|
303
|
+
// 4. Reassemble
|
|
304
|
+
truncatedMessages.push(...truncatedMiddleMessages);
|
|
305
|
+
// Add the final user message back
|
|
306
|
+
truncatedMessages.push(currentMessages[currentMessages.length - 1]);
|
|
307
|
+
// 5. Trim the final user message if needed
|
|
308
|
+
if (tokensToRemove > 0) {
|
|
309
|
+
const lastIndex = truncatedMessages.length - 1;
|
|
310
|
+
const [newContent, remainingTokens] = this.truncateMessageContent(enc, truncatedMessages[lastIndex].content, tokensToRemove);
|
|
311
|
+
truncatedMessages[lastIndex].content = newContent;
|
|
312
|
+
tokensToRemove = remainingTokens;
|
|
313
|
+
}
|
|
314
|
+
// --- Final Safety Check ---
|
|
315
|
+
let inpTotalTokensAfter = this.countTokens(enc, truncatedMessages);
|
|
316
|
+
if (inpTotalTokensAfter > maxInputTokens) {
|
|
317
|
+
if (truncatedMessages[0].role === 'system') {
|
|
318
|
+
// Keep System + Last Message
|
|
319
|
+
const newTruncated = [truncatedMessages[0], truncatedMessages[truncatedMessages.length - 1]];
|
|
320
|
+
inpTotalTokensAfter = this.countTokens(enc, newTruncated);
|
|
321
|
+
// Clean up system if it was virtually added
|
|
322
|
+
if (systemAddedToTop)
|
|
323
|
+
return newTruncated.slice(1);
|
|
324
|
+
return newTruncated;
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
// Keep Last Message Only
|
|
328
|
+
const newTruncated = [truncatedMessages[truncatedMessages.length - 1]];
|
|
329
|
+
inpTotalTokensAfter = this.countTokens(enc, newTruncated);
|
|
330
|
+
return newTruncated;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
if (systemAddedToTop) {
|
|
334
|
+
return truncatedMessages.slice(1);
|
|
335
|
+
}
|
|
336
|
+
return truncatedMessages;
|
|
337
|
+
}
|
|
338
|
+
finally {
|
|
339
|
+
// Free the tokenizer memory
|
|
340
|
+
if (enc) {
|
|
341
|
+
enc.free();
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=messageTruncator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageTruncator.js","sourceRoot":"","sources":["../../../src/utils/messageTruncator.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,17 +20,37 @@ export async function readPathFromWorkspace(pathStr, config) {
|
|
|
20
20
|
const workspace = config.getWorkspaceContext();
|
|
21
21
|
const fileService = config.getFileService();
|
|
22
22
|
let absolutePath = null;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
// Clean up escaped characters from terminal paste (e.g., "Screenshot\ 2025" -> "Screenshot 2025")
|
|
24
|
+
const cleanedPath = pathStr.replace(/\\ /g, ' ').replace(/\\$/g, '');
|
|
25
|
+
if (path.isAbsolute(cleanedPath)) {
|
|
26
|
+
// Special handling for macOS temp directories (screenshots)
|
|
27
|
+
// These paths start with /var/folders/ or /private/var/folders/
|
|
28
|
+
const isMacOSTempPath = cleanedPath.startsWith('/var/folders/') ||
|
|
29
|
+
cleanedPath.startsWith('/private/var/folders/') ||
|
|
30
|
+
cleanedPath.startsWith('/tmp/') ||
|
|
31
|
+
cleanedPath.startsWith('/private/tmp/');
|
|
32
|
+
if (isMacOSTempPath) {
|
|
33
|
+
// Allow reading from macOS temp directories for screenshot support
|
|
34
|
+
try {
|
|
35
|
+
await fs.access(cleanedPath);
|
|
36
|
+
absolutePath = cleanedPath;
|
|
37
|
+
}
|
|
38
|
+
catch (_error) {
|
|
39
|
+
throw new Error(`macOS temp file not accessible (may have been deleted): ${cleanedPath}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (!workspace.isPathWithinWorkspace(cleanedPath)) {
|
|
43
|
+
throw new Error(`Absolute path is outside of the allowed workspace: ${cleanedPath}`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
absolutePath = cleanedPath;
|
|
26
47
|
}
|
|
27
|
-
absolutePath = pathStr;
|
|
28
48
|
}
|
|
29
49
|
else {
|
|
30
50
|
// Prioritized search for relative paths.
|
|
31
51
|
const searchDirs = workspace.getDirectories();
|
|
32
52
|
for (const dir of searchDirs) {
|
|
33
|
-
const potentialPath = path.resolve(dir,
|
|
53
|
+
const potentialPath = path.resolve(dir, cleanedPath);
|
|
34
54
|
try {
|
|
35
55
|
await fs.access(potentialPath);
|
|
36
56
|
absolutePath = potentialPath;
|
|
@@ -42,7 +62,7 @@ export async function readPathFromWorkspace(pathStr, config) {
|
|
|
42
62
|
}
|
|
43
63
|
}
|
|
44
64
|
if (!absolutePath) {
|
|
45
|
-
throw new Error(`Path not found in workspace: ${
|
|
65
|
+
throw new Error(`Path not found in workspace: ${cleanedPath}`);
|
|
46
66
|
}
|
|
47
67
|
const stats = await fs.stat(absolutePath);
|
|
48
68
|
if (stats.isDirectory()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pathReader.js","sourceRoot":"","sources":["../../../src/utils/pathReader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAG1D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAe,EACf,MAAc;IAEd,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;IAC5C,IAAI,YAAY,GAAkB,IAAI,CAAC;IAEvC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"pathReader.js","sourceRoot":"","sources":["../../../src/utils/pathReader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export interface SkillMetadata {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
}
|
|
10
|
+
export interface Skill extends SkillMetadata {
|
|
11
|
+
skillName: string;
|
|
12
|
+
filePath: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get the available skills for the current environment.
|
|
16
|
+
* Reads the skills folder in .blackbox folder in the workspace,
|
|
17
|
+
* returns the name and description of the skills by reading SKILL.md file.
|
|
18
|
+
*
|
|
19
|
+
* Directory structure: <workspace>/.blackbox/skills/<skill_name>/SKILL.md
|
|
20
|
+
*
|
|
21
|
+
* Every SKILL.md consists of:
|
|
22
|
+
* - Frontmatter (YAML): Contains name and description fields. These are the only
|
|
23
|
+
* fields that Claude reads to determine when the skill gets used, thus it is
|
|
24
|
+
* very important to be clear and comprehensive in describing what the skill is,
|
|
25
|
+
* and when it should be used.
|
|
26
|
+
* - Body (Markdown): Instructions and guidance for using the skill. Only loaded
|
|
27
|
+
* AFTER the skill triggers (if at all).
|
|
28
|
+
*
|
|
29
|
+
* @param workspaceRoot - The root directory of the workspace
|
|
30
|
+
* @returns A formatted string of available skills for system prompt injection, or undefined if no skills found
|
|
31
|
+
*/
|
|
32
|
+
export declare function getAvailableSkills(workspaceRoot: string): Promise<string | undefined>;
|
|
33
|
+
/**
|
|
34
|
+
* Extract YAML frontmatter metadata from a SKILL.md file
|
|
35
|
+
* @param content - The full content of the SKILL.md file
|
|
36
|
+
* @returns The parsed metadata or null if no valid frontmatter found
|
|
37
|
+
*/
|
|
38
|
+
export declare function extractSkillMetadata(content: string): SkillMetadata | null;
|
|
39
|
+
/**
|
|
40
|
+
* Read and return the full content of a skill (without frontmatter)
|
|
41
|
+
* @param workspaceRoot - The root directory of the workspace
|
|
42
|
+
* @param skillName - The name of the skill directory
|
|
43
|
+
* @returns The skill content without YAML frontmatter, or null if not found
|
|
44
|
+
*/
|
|
45
|
+
export declare function getSkillContent(workspaceRoot: string, skillName: string): Promise<{
|
|
46
|
+
content: string;
|
|
47
|
+
baseDir: string;
|
|
48
|
+
} | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Create a new skill with a template SKILL.md file
|
|
51
|
+
* @param workspaceRoot - The root directory of the workspace
|
|
52
|
+
* @param skillName - The name of the skill to create
|
|
53
|
+
* @returns Success status and error message if failed
|
|
54
|
+
*/
|
|
55
|
+
export declare function createSkill(workspaceRoot: string, skillName: string): Promise<{
|
|
56
|
+
success: boolean;
|
|
57
|
+
error?: string;
|
|
58
|
+
skillPath?: string;
|
|
59
|
+
}>;
|
|
60
|
+
/**
|
|
61
|
+
* List all available skills in the workspace
|
|
62
|
+
* @param workspaceRoot - The root directory of the workspace
|
|
63
|
+
* @returns Array of skill information
|
|
64
|
+
*/
|
|
65
|
+
export declare function listSkills(workspaceRoot: string): Promise<Skill[]>;
|