@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.
Files changed (255) 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 +11 -5
  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/coreToolScheduler.js +2 -2
  27. package/dist/src/core/coreToolScheduler.js.map +1 -1
  28. package/dist/src/core/encryptedClientFactory.d.ts +17 -0
  29. package/dist/src/core/encryptedClientFactory.js +92 -0
  30. package/dist/src/core/encryptedClientFactory.js.map +1 -0
  31. package/dist/src/core/encryptedContentGenerator.d.ts +47 -0
  32. package/dist/src/core/encryptedContentGenerator.js +445 -0
  33. package/dist/src/core/encryptedContentGenerator.js.map +1 -0
  34. package/dist/src/core/encryptedGeminiClient.d.ts +59 -0
  35. package/dist/src/core/encryptedGeminiClient.js +177 -0
  36. package/dist/src/core/encryptedGeminiClient.js.map +1 -0
  37. package/dist/src/core/encryptedGeminiClientBridge.d.ts +107 -0
  38. package/dist/src/core/encryptedGeminiClientBridge.js +808 -0
  39. package/dist/src/core/encryptedGeminiClientBridge.js.map +1 -0
  40. package/dist/src/core/encryptedGeminiClientWrapper.d.ts +129 -0
  41. package/dist/src/core/encryptedGeminiClientWrapper.js +305 -0
  42. package/dist/src/core/encryptedGeminiClientWrapper.js.map +1 -0
  43. package/dist/src/core/encryptedTurn.d.ts +40 -0
  44. package/dist/src/core/encryptedTurn.js +114 -0
  45. package/dist/src/core/encryptedTurn.js.map +1 -0
  46. package/dist/src/core/logger.d.ts +21 -0
  47. package/dist/src/core/logger.js +110 -0
  48. package/dist/src/core/logger.js.map +1 -1
  49. package/dist/src/core/openaiContentGenerator/constants.d.ts +2 -0
  50. package/dist/src/core/openaiContentGenerator/constants.js +2 -0
  51. package/dist/src/core/openaiContentGenerator/constants.js.map +1 -1
  52. package/dist/src/core/openaiContentGenerator/converter.d.ts +16 -1
  53. package/dist/src/core/openaiContentGenerator/converter.js +135 -4
  54. package/dist/src/core/openaiContentGenerator/converter.js.map +1 -1
  55. package/dist/src/core/openaiContentGenerator/pipeline.js +22 -8
  56. package/dist/src/core/openaiContentGenerator/pipeline.js.map +1 -1
  57. package/dist/src/core/openaiContentGenerator/pipeline.test.js +51 -0
  58. package/dist/src/core/openaiContentGenerator/pipeline.test.js.map +1 -1
  59. package/dist/src/core/openaiContentGenerator/provider/default.js +10 -1
  60. package/dist/src/core/openaiContentGenerator/provider/default.js.map +1 -1
  61. package/dist/src/core/prompts.d.ts +18 -1
  62. package/dist/src/core/prompts.js +388 -459
  63. package/dist/src/core/prompts.js.map +1 -1
  64. package/dist/src/core/tokenLimits.d.ts +1 -0
  65. package/dist/src/core/tokenLimits.js +37 -2
  66. package/dist/src/core/tokenLimits.js.map +1 -1
  67. package/dist/src/core/tokenLimits.test.js +36 -1
  68. package/dist/src/core/tokenLimits.test.js.map +1 -1
  69. package/dist/src/encrypt/attestation.d.ts +5 -0
  70. package/dist/src/encrypt/attestation.js +100 -0
  71. package/dist/src/encrypt/attestation.js.map +1 -0
  72. package/dist/src/encrypt/client.d.ts +14 -0
  73. package/dist/src/encrypt/client.js +132 -0
  74. package/dist/src/encrypt/client.js.map +1 -0
  75. package/dist/src/encrypt/config.d.ts +22 -0
  76. package/dist/src/encrypt/config.js +43 -0
  77. package/dist/src/encrypt/config.js.map +1 -0
  78. package/dist/src/encrypt/crypto-utils.d.ts +57 -0
  79. package/dist/src/encrypt/crypto-utils.js +257 -0
  80. package/dist/src/encrypt/crypto-utils.js.map +1 -0
  81. package/dist/src/encrypt/history-manager.d.ts +43 -0
  82. package/dist/src/encrypt/history-manager.js +164 -0
  83. package/dist/src/encrypt/history-manager.js.map +1 -0
  84. package/dist/src/encrypt/minimax-template.d.ts +73 -0
  85. package/dist/src/encrypt/minimax-template.js +276 -0
  86. package/dist/src/encrypt/minimax-template.js.map +1 -0
  87. package/dist/src/encrypt/sessions.d.ts +17 -0
  88. package/dist/src/encrypt/sessions.js +221 -0
  89. package/dist/src/encrypt/sessions.js.map +1 -0
  90. package/dist/src/encrypt/streaming-client.d.ts +29 -0
  91. package/dist/src/encrypt/streaming-client.js +232 -0
  92. package/dist/src/encrypt/streaming-client.js.map +1 -0
  93. package/dist/src/encrypt/tool-formatter.d.ts +36 -0
  94. package/dist/src/encrypt/tool-formatter.js +353 -0
  95. package/dist/src/encrypt/tool-formatter.js.map +1 -0
  96. package/dist/src/encrypt/tool-parser.d.ts +93 -0
  97. package/dist/src/encrypt/tool-parser.js +567 -0
  98. package/dist/src/encrypt/tool-parser.js.map +1 -0
  99. package/dist/src/encrypt/types.d.ts +81 -0
  100. package/dist/src/encrypt/types.js +2 -0
  101. package/dist/src/encrypt/types.js.map +1 -0
  102. package/dist/src/generated/git-commit.d.ts +3 -3
  103. package/dist/src/generated/git-commit.js +3 -3
  104. package/dist/src/ide/ide-client.js +9 -19
  105. package/dist/src/ide/ide-client.js.map +1 -1
  106. package/dist/src/index.d.ts +15 -0
  107. package/dist/src/index.js +15 -0
  108. package/dist/src/index.js.map +1 -1
  109. package/dist/src/mcp/oauth-provider.js +2 -6
  110. package/dist/src/mcp/oauth-provider.js.map +1 -1
  111. package/dist/src/mcp/oauth-token-storage.d.ts +7 -0
  112. package/dist/src/mcp/oauth-token-storage.js +24 -0
  113. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  114. package/dist/src/services/EncryptedChatService.d.ts +80 -0
  115. package/dist/src/services/EncryptedChatService.js +202 -0
  116. package/dist/src/services/EncryptedChatService.js.map +1 -0
  117. package/dist/src/services/StatsHistoryService.d.ts +131 -0
  118. package/dist/src/services/StatsHistoryService.js +427 -0
  119. package/dist/src/services/StatsHistoryService.js.map +1 -0
  120. package/dist/src/services/checkpointApiService.d.ts +101 -0
  121. package/dist/src/services/checkpointApiService.js +215 -0
  122. package/dist/src/services/checkpointApiService.js.map +1 -0
  123. package/dist/src/services/environmentSanitization.d.ts +24 -0
  124. package/dist/src/services/environmentSanitization.js +152 -0
  125. package/dist/src/services/environmentSanitization.js.map +1 -0
  126. package/dist/src/telemetry/blackbox-logger/blackbox-logger.d.ts +2 -6
  127. package/dist/src/telemetry/blackbox-logger/blackbox-logger.js +29 -135
  128. package/dist/src/telemetry/blackbox-logger/blackbox-logger.js.map +1 -1
  129. package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.js +1 -1
  130. package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.js.map +1 -1
  131. package/dist/src/telemetry/uiTelemetry.d.ts +8 -0
  132. package/dist/src/telemetry/uiTelemetry.js +17 -0
  133. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  134. package/dist/src/tools/browser-interactive.d.ts +63 -0
  135. package/dist/src/tools/browser-interactive.js +394 -0
  136. package/dist/src/tools/browser-interactive.js.map +1 -0
  137. package/dist/src/tools/browser_use.d.ts +23 -2
  138. package/dist/src/tools/browser_use.js +424 -43
  139. package/dist/src/tools/browser_use.js.map +1 -1
  140. package/dist/src/tools/data-file-constants.d.ts +17 -0
  141. package/dist/src/tools/data-file-constants.js +30 -0
  142. package/dist/src/tools/data-file-constants.js.map +1 -0
  143. package/dist/src/tools/edit.js +44 -7
  144. package/dist/src/tools/edit.js.map +1 -1
  145. package/dist/src/tools/exitPlanMode.js +1 -1
  146. package/dist/src/tools/exitPlanMode.js.map +1 -1
  147. package/dist/src/tools/ls.js +40 -6
  148. package/dist/src/tools/ls.js.map +1 -1
  149. package/dist/src/tools/ls.test.js +4 -4
  150. package/dist/src/tools/ls.test.js.map +1 -1
  151. package/dist/src/tools/mcp-client-manager.d.ts +28 -2
  152. package/dist/src/tools/mcp-client-manager.js +62 -4
  153. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  154. package/dist/src/tools/mcp-client.d.ts +5 -3
  155. package/dist/src/tools/mcp-client.js +39 -11
  156. package/dist/src/tools/mcp-client.js.map +1 -1
  157. package/dist/src/tools/mcp-tool.d.ts +3 -1
  158. package/dist/src/tools/mcp-tool.js +37 -9
  159. package/dist/src/tools/mcp-tool.js.map +1 -1
  160. package/dist/src/tools/memoryTool.d.ts +14 -4
  161. package/dist/src/tools/memoryTool.js +98 -39
  162. package/dist/src/tools/memoryTool.js.map +1 -1
  163. package/dist/src/tools/read-data-file.d.ts +31 -0
  164. package/dist/src/tools/read-data-file.js +469 -0
  165. package/dist/src/tools/read-data-file.js.map +1 -0
  166. package/dist/src/tools/read-file.js +64 -5
  167. package/dist/src/tools/read-file.js.map +1 -1
  168. package/dist/src/tools/read-file.test.js +40 -6
  169. package/dist/src/tools/read-file.test.js.map +1 -1
  170. package/dist/src/tools/shell.d.ts +3 -1
  171. package/dist/src/tools/shell.js +25 -4
  172. package/dist/src/tools/shell.js.map +1 -1
  173. package/dist/src/tools/skill.d.ts +34 -0
  174. package/dist/src/tools/skill.js +143 -0
  175. package/dist/src/tools/skill.js.map +1 -0
  176. package/dist/src/tools/sql_db.d.ts +101 -0
  177. package/dist/src/tools/sql_db.js +1033 -0
  178. package/dist/src/tools/sql_db.js.map +1 -0
  179. package/dist/src/tools/sql_db_configure.d.ts +18 -0
  180. package/dist/src/tools/sql_db_configure.js +96 -0
  181. package/dist/src/tools/sql_db_configure.js.map +1 -0
  182. package/dist/src/tools/taskCompletion.d.ts +29 -0
  183. package/dist/src/tools/taskCompletion.js +231 -0
  184. package/dist/src/tools/taskCompletion.js.map +1 -0
  185. package/dist/src/tools/todoWrite.js +0 -142
  186. package/dist/src/tools/todoWrite.js.map +1 -1
  187. package/dist/src/tools/tool-error.d.ts +3 -1
  188. package/dist/src/tools/tool-error.js +3 -0
  189. package/dist/src/tools/tool-error.js.map +1 -1
  190. package/dist/src/tools/tool-names.d.ts +8 -0
  191. package/dist/src/tools/tool-names.js +8 -0
  192. package/dist/src/tools/tool-names.js.map +1 -1
  193. package/dist/src/tools/tool-registry.d.ts +22 -0
  194. package/dist/src/tools/tool-registry.js +41 -1
  195. package/dist/src/tools/tool-registry.js.map +1 -1
  196. package/dist/src/tools/tools.d.ts +18 -2
  197. package/dist/src/tools/tools.js +3 -0
  198. package/dist/src/tools/tools.js.map +1 -1
  199. package/dist/src/tools/web-fetch.js +24 -4
  200. package/dist/src/tools/web-fetch.js.map +1 -1
  201. package/dist/src/tools/web-search.js +160 -2
  202. package/dist/src/tools/web-search.js.map +1 -1
  203. package/dist/src/tools/workspace-error-helper.d.ts +9 -0
  204. package/dist/src/tools/workspace-error-helper.js +43 -0
  205. package/dist/src/tools/workspace-error-helper.js.map +1 -0
  206. package/dist/src/tools/workspace-error-helper.test.js +85 -0
  207. package/dist/src/tools/workspace-error-helper.test.js.map +1 -0
  208. package/dist/src/tools/write-file.js +42 -7
  209. package/dist/src/tools/write-file.js.map +1 -1
  210. package/dist/src/utils/environmentContext.js +3 -1
  211. package/dist/src/utils/environmentContext.js.map +1 -1
  212. package/dist/src/utils/environmentContext.test.js +3 -2
  213. package/dist/src/utils/environmentContext.test.js.map +1 -1
  214. package/dist/src/utils/fetch.d.ts +3 -1
  215. package/dist/src/utils/fetch.js +35 -2
  216. package/dist/src/utils/fetch.js.map +1 -1
  217. package/dist/src/utils/fileUtils.js +30 -3
  218. package/dist/src/utils/fileUtils.js.map +1 -1
  219. package/dist/src/utils/filesearch/fileSearch.d.ts +2 -0
  220. package/dist/src/utils/filesearch/fileSearch.js +38 -7
  221. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  222. package/dist/src/utils/git-worktree-utils.d.ts +56 -0
  223. package/dist/src/utils/git-worktree-utils.js +176 -0
  224. package/dist/src/utils/git-worktree-utils.js.map +1 -0
  225. package/dist/src/utils/imageCompression.d.ts +34 -0
  226. package/dist/src/utils/imageCompression.js +170 -0
  227. package/dist/src/utils/imageCompression.js.map +1 -0
  228. package/dist/src/utils/messageTruncator.d.ts +51 -0
  229. package/dist/src/utils/messageTruncator.js +346 -0
  230. package/dist/src/utils/messageTruncator.js.map +1 -0
  231. package/dist/src/utils/pathReader.js +26 -6
  232. package/dist/src/utils/pathReader.js.map +1 -1
  233. package/dist/src/utils/skill.d.ts +65 -0
  234. package/dist/src/utils/skill.js +241 -0
  235. package/dist/src/utils/skill.js.map +1 -0
  236. package/dist/src/utils/textCleaning.d.ts +51 -0
  237. package/dist/src/utils/textCleaning.js +327 -0
  238. package/dist/src/utils/textCleaning.js.map +1 -0
  239. package/dist/tsconfig.tsbuildinfo +1 -1
  240. package/package.json +19 -6
  241. package/dist/src/tools/mcp-client-manager.test.js +0 -39
  242. package/dist/src/tools/mcp-client-manager.test.js.map +0 -1
  243. package/dist/src/tools/mcp-client.test.d.ts +0 -6
  244. package/dist/src/tools/mcp-client.test.js +0 -454
  245. package/dist/src/tools/mcp-client.test.js.map +0 -1
  246. package/dist/src/tools/mcp-tool.test.d.ts +0 -6
  247. package/dist/src/tools/mcp-tool.test.js +0 -576
  248. package/dist/src/tools/mcp-tool.test.js.map +0 -1
  249. package/dist/src/tools/memoryTool.test.d.ts +0 -6
  250. package/dist/src/tools/memoryTool.test.js +0 -420
  251. package/dist/src/tools/memoryTool.test.js.map +0 -1
  252. package/dist/src/tools/tool-registry.test.d.ts +0 -6
  253. package/dist/src/tools/tool-registry.test.js +0 -332
  254. package/dist/src/tools/tool-registry.test.js.map +0 -1
  255. /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
- if (path.isAbsolute(pathStr)) {
24
- if (!workspace.isPathWithinWorkspace(pathStr)) {
25
- throw new Error(`Absolute path is outside of the allowed workspace: ${pathStr}`);
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, pathStr);
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: ${pathStr}`);
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":"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"}
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[]>;