@blackbox_ai/blackbox-cli-core 0.0.9 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/README.md +11 -183
  2. package/dist/index.d.ts +2 -1
  3. package/dist/index.js +2 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/blackbox/blackboxOAuth2.js +17 -1
  6. package/dist/src/blackbox/blackboxOAuth2.js.map +1 -1
  7. package/dist/src/code_assist/oauth2.js +15 -3
  8. package/dist/src/code_assist/oauth2.js.map +1 -1
  9. package/dist/src/config/blackboxModels.d.ts +3 -2
  10. package/dist/src/config/blackboxModels.js +262 -33
  11. package/dist/src/config/blackboxModels.js.map +1 -1
  12. package/dist/src/config/config.d.ts +65 -0
  13. package/dist/src/config/config.js +282 -17
  14. package/dist/src/config/config.js.map +1 -1
  15. package/dist/src/config/models.d.ts +1 -1
  16. package/dist/src/config/models.js +1 -1
  17. package/dist/src/config/models.js.map +1 -1
  18. package/dist/src/config/multiAgentModels.d.ts +63 -0
  19. package/dist/src/config/multiAgentModels.js +194 -0
  20. package/dist/src/config/multiAgentModels.js.map +1 -0
  21. package/dist/src/core/client.js +8 -2
  22. package/dist/src/core/client.js.map +1 -1
  23. package/dist/src/core/contentGenerator.d.ts +1 -0
  24. package/dist/src/core/contentGenerator.js +57 -7
  25. package/dist/src/core/contentGenerator.js.map +1 -1
  26. package/dist/src/core/encryptedClientFactory.d.ts +17 -0
  27. package/dist/src/core/encryptedClientFactory.js +92 -0
  28. package/dist/src/core/encryptedClientFactory.js.map +1 -0
  29. package/dist/src/core/encryptedContentGenerator.d.ts +47 -0
  30. package/dist/src/core/encryptedContentGenerator.js +445 -0
  31. package/dist/src/core/encryptedContentGenerator.js.map +1 -0
  32. package/dist/src/core/encryptedGeminiClient.d.ts +59 -0
  33. package/dist/src/core/encryptedGeminiClient.js +177 -0
  34. package/dist/src/core/encryptedGeminiClient.js.map +1 -0
  35. package/dist/src/core/encryptedGeminiClientBridge.d.ts +107 -0
  36. package/dist/src/core/encryptedGeminiClientBridge.js +808 -0
  37. package/dist/src/core/encryptedGeminiClientBridge.js.map +1 -0
  38. package/dist/src/core/encryptedGeminiClientWrapper.d.ts +129 -0
  39. package/dist/src/core/encryptedGeminiClientWrapper.js +305 -0
  40. package/dist/src/core/encryptedGeminiClientWrapper.js.map +1 -0
  41. package/dist/src/core/encryptedTurn.d.ts +40 -0
  42. package/dist/src/core/encryptedTurn.js +114 -0
  43. package/dist/src/core/encryptedTurn.js.map +1 -0
  44. package/dist/src/core/logger.d.ts +21 -0
  45. package/dist/src/core/logger.js +110 -0
  46. package/dist/src/core/logger.js.map +1 -1
  47. package/dist/src/core/openaiContentGenerator/constants.d.ts +2 -0
  48. package/dist/src/core/openaiContentGenerator/constants.js +2 -0
  49. package/dist/src/core/openaiContentGenerator/constants.js.map +1 -1
  50. package/dist/src/core/openaiContentGenerator/converter.d.ts +16 -1
  51. package/dist/src/core/openaiContentGenerator/converter.js +135 -4
  52. package/dist/src/core/openaiContentGenerator/converter.js.map +1 -1
  53. package/dist/src/core/openaiContentGenerator/pipeline.js +6 -2
  54. package/dist/src/core/openaiContentGenerator/pipeline.js.map +1 -1
  55. package/dist/src/core/openaiContentGenerator/provider/default.js +10 -1
  56. package/dist/src/core/openaiContentGenerator/provider/default.js.map +1 -1
  57. package/dist/src/core/prompts.d.ts +17 -0
  58. package/dist/src/core/prompts.js +347 -19
  59. package/dist/src/core/prompts.js.map +1 -1
  60. package/dist/src/core/tokenLimits.d.ts +1 -0
  61. package/dist/src/core/tokenLimits.js +37 -2
  62. package/dist/src/core/tokenLimits.js.map +1 -1
  63. package/dist/src/core/tokenLimits.test.js +36 -1
  64. package/dist/src/core/tokenLimits.test.js.map +1 -1
  65. package/dist/src/encrypt/attestation.d.ts +5 -0
  66. package/dist/src/encrypt/attestation.js +100 -0
  67. package/dist/src/encrypt/attestation.js.map +1 -0
  68. package/dist/src/encrypt/client.d.ts +14 -0
  69. package/dist/src/encrypt/client.js +132 -0
  70. package/dist/src/encrypt/client.js.map +1 -0
  71. package/dist/src/encrypt/config.d.ts +22 -0
  72. package/dist/src/encrypt/config.js +43 -0
  73. package/dist/src/encrypt/config.js.map +1 -0
  74. package/dist/src/encrypt/crypto-utils.d.ts +57 -0
  75. package/dist/src/encrypt/crypto-utils.js +257 -0
  76. package/dist/src/encrypt/crypto-utils.js.map +1 -0
  77. package/dist/src/encrypt/history-manager.d.ts +43 -0
  78. package/dist/src/encrypt/history-manager.js +164 -0
  79. package/dist/src/encrypt/history-manager.js.map +1 -0
  80. package/dist/src/encrypt/minimax-template.d.ts +73 -0
  81. package/dist/src/encrypt/minimax-template.js +276 -0
  82. package/dist/src/encrypt/minimax-template.js.map +1 -0
  83. package/dist/src/encrypt/sessions.d.ts +17 -0
  84. package/dist/src/encrypt/sessions.js +221 -0
  85. package/dist/src/encrypt/sessions.js.map +1 -0
  86. package/dist/src/encrypt/streaming-client.d.ts +29 -0
  87. package/dist/src/encrypt/streaming-client.js +232 -0
  88. package/dist/src/encrypt/streaming-client.js.map +1 -0
  89. package/dist/src/encrypt/tool-formatter.d.ts +36 -0
  90. package/dist/src/encrypt/tool-formatter.js +353 -0
  91. package/dist/src/encrypt/tool-formatter.js.map +1 -0
  92. package/dist/src/encrypt/tool-parser.d.ts +93 -0
  93. package/dist/src/encrypt/tool-parser.js +567 -0
  94. package/dist/src/encrypt/tool-parser.js.map +1 -0
  95. package/dist/src/encrypt/types.d.ts +81 -0
  96. package/dist/src/encrypt/types.js +2 -0
  97. package/dist/src/encrypt/types.js.map +1 -0
  98. package/dist/src/generated/git-commit.d.ts +3 -3
  99. package/dist/src/generated/git-commit.js +3 -3
  100. package/dist/src/ide/ide-client.js +9 -19
  101. package/dist/src/ide/ide-client.js.map +1 -1
  102. package/dist/src/index.d.ts +15 -0
  103. package/dist/src/index.js +15 -0
  104. package/dist/src/index.js.map +1 -1
  105. package/dist/src/mcp/oauth-provider.js +2 -6
  106. package/dist/src/mcp/oauth-provider.js.map +1 -1
  107. package/dist/src/mcp/oauth-token-storage.d.ts +7 -0
  108. package/dist/src/mcp/oauth-token-storage.js +24 -0
  109. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  110. package/dist/src/services/EncryptedChatService.d.ts +80 -0
  111. package/dist/src/services/EncryptedChatService.js +202 -0
  112. package/dist/src/services/EncryptedChatService.js.map +1 -0
  113. package/dist/src/services/StatsHistoryService.d.ts +131 -0
  114. package/dist/src/services/StatsHistoryService.js +427 -0
  115. package/dist/src/services/StatsHistoryService.js.map +1 -0
  116. package/dist/src/services/checkpointApiService.d.ts +101 -0
  117. package/dist/src/services/checkpointApiService.js +215 -0
  118. package/dist/src/services/checkpointApiService.js.map +1 -0
  119. package/dist/src/services/environmentSanitization.d.ts +24 -0
  120. package/dist/src/services/environmentSanitization.js +152 -0
  121. package/dist/src/services/environmentSanitization.js.map +1 -0
  122. package/dist/src/telemetry/blackbox-logger/blackbox-logger.d.ts +2 -6
  123. package/dist/src/telemetry/blackbox-logger/blackbox-logger.js +29 -135
  124. package/dist/src/telemetry/blackbox-logger/blackbox-logger.js.map +1 -1
  125. package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.js +1 -1
  126. package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.js.map +1 -1
  127. package/dist/src/telemetry/uiTelemetry.d.ts +8 -0
  128. package/dist/src/telemetry/uiTelemetry.js +17 -0
  129. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  130. package/dist/src/tools/browser-interactive.d.ts +63 -0
  131. package/dist/src/tools/browser-interactive.js +394 -0
  132. package/dist/src/tools/browser-interactive.js.map +1 -0
  133. package/dist/src/tools/browser_use.d.ts +22 -1
  134. package/dist/src/tools/browser_use.js +403 -23
  135. package/dist/src/tools/browser_use.js.map +1 -1
  136. package/dist/src/tools/data-file-constants.d.ts +17 -0
  137. package/dist/src/tools/data-file-constants.js +30 -0
  138. package/dist/src/tools/data-file-constants.js.map +1 -0
  139. package/dist/src/tools/edit.js +44 -7
  140. package/dist/src/tools/edit.js.map +1 -1
  141. package/dist/src/tools/ls.js +40 -6
  142. package/dist/src/tools/ls.js.map +1 -1
  143. package/dist/src/tools/ls.test.js +4 -4
  144. package/dist/src/tools/ls.test.js.map +1 -1
  145. package/dist/src/tools/mcp-client-manager.d.ts +28 -2
  146. package/dist/src/tools/mcp-client-manager.js +62 -4
  147. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  148. package/dist/src/tools/mcp-client.d.ts +5 -3
  149. package/dist/src/tools/mcp-client.js +39 -11
  150. package/dist/src/tools/mcp-client.js.map +1 -1
  151. package/dist/src/tools/mcp-tool.d.ts +3 -1
  152. package/dist/src/tools/mcp-tool.js +37 -9
  153. package/dist/src/tools/mcp-tool.js.map +1 -1
  154. package/dist/src/tools/memoryTool.d.ts +14 -4
  155. package/dist/src/tools/memoryTool.js +98 -39
  156. package/dist/src/tools/memoryTool.js.map +1 -1
  157. package/dist/src/tools/read-data-file.d.ts +31 -0
  158. package/dist/src/tools/read-data-file.js +469 -0
  159. package/dist/src/tools/read-data-file.js.map +1 -0
  160. package/dist/src/tools/read-file.js +64 -5
  161. package/dist/src/tools/read-file.js.map +1 -1
  162. package/dist/src/tools/read-file.test.js +40 -6
  163. package/dist/src/tools/read-file.test.js.map +1 -1
  164. package/dist/src/tools/shell.d.ts +3 -1
  165. package/dist/src/tools/shell.js +25 -4
  166. package/dist/src/tools/shell.js.map +1 -1
  167. package/dist/src/tools/skill.d.ts +34 -0
  168. package/dist/src/tools/skill.js +143 -0
  169. package/dist/src/tools/skill.js.map +1 -0
  170. package/dist/src/tools/sql_db.d.ts +101 -0
  171. package/dist/src/tools/sql_db.js +1033 -0
  172. package/dist/src/tools/sql_db.js.map +1 -0
  173. package/dist/src/tools/sql_db_configure.d.ts +18 -0
  174. package/dist/src/tools/sql_db_configure.js +96 -0
  175. package/dist/src/tools/sql_db_configure.js.map +1 -0
  176. package/dist/src/tools/taskCompletion.d.ts +29 -0
  177. package/dist/src/tools/taskCompletion.js +231 -0
  178. package/dist/src/tools/taskCompletion.js.map +1 -0
  179. package/dist/src/tools/tool-error.d.ts +3 -1
  180. package/dist/src/tools/tool-error.js +3 -0
  181. package/dist/src/tools/tool-error.js.map +1 -1
  182. package/dist/src/tools/tool-names.d.ts +8 -0
  183. package/dist/src/tools/tool-names.js +8 -0
  184. package/dist/src/tools/tool-names.js.map +1 -1
  185. package/dist/src/tools/tool-registry.d.ts +22 -0
  186. package/dist/src/tools/tool-registry.js +41 -1
  187. package/dist/src/tools/tool-registry.js.map +1 -1
  188. package/dist/src/tools/tools.d.ts +18 -2
  189. package/dist/src/tools/tools.js +3 -0
  190. package/dist/src/tools/tools.js.map +1 -1
  191. package/dist/src/tools/web-fetch.js +24 -4
  192. package/dist/src/tools/web-fetch.js.map +1 -1
  193. package/dist/src/tools/web-search.js +160 -2
  194. package/dist/src/tools/web-search.js.map +1 -1
  195. package/dist/src/tools/workspace-error-helper.d.ts +9 -0
  196. package/dist/src/tools/workspace-error-helper.js +43 -0
  197. package/dist/src/tools/workspace-error-helper.js.map +1 -0
  198. package/dist/src/tools/workspace-error-helper.test.js +85 -0
  199. package/dist/src/tools/workspace-error-helper.test.js.map +1 -0
  200. package/dist/src/tools/write-file.js +42 -7
  201. package/dist/src/tools/write-file.js.map +1 -1
  202. package/dist/src/utils/environmentContext.js +3 -1
  203. package/dist/src/utils/environmentContext.js.map +1 -1
  204. package/dist/src/utils/environmentContext.test.js +3 -2
  205. package/dist/src/utils/environmentContext.test.js.map +1 -1
  206. package/dist/src/utils/fetch.d.ts +3 -1
  207. package/dist/src/utils/fetch.js +35 -2
  208. package/dist/src/utils/fetch.js.map +1 -1
  209. package/dist/src/utils/fileUtils.js +30 -3
  210. package/dist/src/utils/fileUtils.js.map +1 -1
  211. package/dist/src/utils/filesearch/fileSearch.d.ts +2 -0
  212. package/dist/src/utils/filesearch/fileSearch.js +38 -7
  213. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  214. package/dist/src/utils/git-worktree-utils.d.ts +56 -0
  215. package/dist/src/utils/git-worktree-utils.js +176 -0
  216. package/dist/src/utils/git-worktree-utils.js.map +1 -0
  217. package/dist/src/utils/imageCompression.d.ts +34 -0
  218. package/dist/src/utils/imageCompression.js +170 -0
  219. package/dist/src/utils/imageCompression.js.map +1 -0
  220. package/dist/src/utils/messageTruncator.d.ts +51 -0
  221. package/dist/src/utils/messageTruncator.js +346 -0
  222. package/dist/src/utils/messageTruncator.js.map +1 -0
  223. package/dist/src/utils/pathReader.js +26 -6
  224. package/dist/src/utils/pathReader.js.map +1 -1
  225. package/dist/src/utils/skill.d.ts +65 -0
  226. package/dist/src/utils/skill.js +241 -0
  227. package/dist/src/utils/skill.js.map +1 -0
  228. package/dist/src/utils/textCleaning.d.ts +51 -0
  229. package/dist/src/utils/textCleaning.js +327 -0
  230. package/dist/src/utils/textCleaning.js.map +1 -0
  231. package/dist/tsconfig.tsbuildinfo +1 -1
  232. package/package.json +16 -2
  233. package/dist/src/tools/mcp-client-manager.test.js +0 -39
  234. package/dist/src/tools/mcp-client-manager.test.js.map +0 -1
  235. package/dist/src/tools/mcp-client.test.d.ts +0 -6
  236. package/dist/src/tools/mcp-client.test.js +0 -454
  237. package/dist/src/tools/mcp-client.test.js.map +0 -1
  238. package/dist/src/tools/mcp-tool.test.d.ts +0 -6
  239. package/dist/src/tools/mcp-tool.test.js +0 -576
  240. package/dist/src/tools/mcp-tool.test.js.map +0 -1
  241. package/dist/src/tools/memoryTool.test.d.ts +0 -6
  242. package/dist/src/tools/memoryTool.test.js +0 -420
  243. package/dist/src/tools/memoryTool.test.js.map +0 -1
  244. package/dist/src/tools/tool-registry.test.d.ts +0 -6
  245. package/dist/src/tools/tool-registry.test.js +0 -332
  246. package/dist/src/tools/tool-registry.test.js.map +0 -1
  247. /package/dist/src/tools/{mcp-client-manager.test.d.ts → workspace-error-helper.test.d.ts} +0 -0
@@ -0,0 +1,232 @@
1
+ import { serializePublicKeyPem, encryptAndSign, decryptAndVerify } from './crypto-utils.js';
2
+ import {} from './types.js';
3
+ import { ENCRYPTION_CONFIG } from './config.js';
4
+ import { truncateHistory, getHistorySummary, HISTORY_CONFIG } from './history-manager.js';
5
+ /**
6
+ * StreamingClient handles the complete encrypted streaming protocol
7
+ */
8
+ export class StreamingClient {
9
+ baseUrl;
10
+ initialized = false;
11
+ nonce = 1000;
12
+ history = [];
13
+ attestationData;
14
+ constructor(baseUrl, _attestationUrl, systemPrompt) {
15
+ this.baseUrl = baseUrl;
16
+ if (systemPrompt) {
17
+ this.history.push({ role: 'system', content: systemPrompt });
18
+ }
19
+ }
20
+ /**
21
+ * Initialize from existing session data (avoids re-attestation)
22
+ * Now uses the session management layer
23
+ */
24
+ initializeFromSession(sessionData) {
25
+ // sessionId is stored in attestationData, no need to store separately
26
+ this.nonce = sessionData.nonce;
27
+ this.history = sessionData.history || [];
28
+ this.attestationData = sessionData.attestationData;
29
+ this.initialized = true;
30
+ }
31
+ async sendMessageStream(userText, fileData, retryAttempt = 0) {
32
+ if (!this.initialized || !this.attestationData) {
33
+ throw new Error('StreamingClient not initialized with attestation data. Call initializeFromSession() first.');
34
+ }
35
+ // Validate user text is not empty
36
+ if (!userText || userText.trim().length === 0) {
37
+ throw new Error('User message cannot be empty');
38
+ }
39
+ // Process file data and build context
40
+ let processedMessage = userText;
41
+ const contextParts = [];
42
+ // Process file data if provided
43
+ if (fileData) {
44
+ // Handle PDF/text content
45
+ if (fileData.fileText) {
46
+ contextParts.push(fileData.fileText);
47
+ }
48
+ // Build message with context
49
+ if (contextParts.length > 0) {
50
+ const contextText = contextParts.join('\n\n');
51
+ processedMessage = `Context:\n\n${contextText}\n\nQuery: ${userText}`;
52
+ }
53
+ }
54
+ // Create message object
55
+ const messageObj = {
56
+ role: 'user',
57
+ content: processedMessage
58
+ };
59
+ // Process image if provided
60
+ if (fileData?.imagesData && fileData.imagesData.length > 0) {
61
+ // Use the first image for now (following the sample pattern)
62
+ const firstImage = fileData.imagesData[0];
63
+ if (firstImage?.contents) {
64
+ // Extract base64 data (remove data:image/...;base64, prefix if present)
65
+ const base64Data = firstImage.contents.includes(',')
66
+ ? firstImage.contents.split(',')[1]
67
+ : firstImage.contents;
68
+ messageObj.image_url = base64Data;
69
+ }
70
+ }
71
+ // Ensure we have a valid history array - add the current message to history for encryption
72
+ const currentHistory = [...this.history, messageObj];
73
+ // Validate history is not empty
74
+ if (currentHistory.length === 0) {
75
+ throw new Error('Message history cannot be empty');
76
+ }
77
+ // Truncate history to prevent payload size issues (413 errors)
78
+ let truncatedHistory = truncateHistory(currentHistory);
79
+ // If this is a retry, apply even more aggressive truncation
80
+ if (retryAttempt > 0) {
81
+ const { truncateToSize } = await import('./history-manager.js');
82
+ // Reduce limit by half for each retry: 100KB → 50KB → 25KB
83
+ const retryLimit = HISTORY_CONFIG.maxHistoryBytes / (2 ** retryAttempt);
84
+ console.log(`🔄 Retry attempt ${retryAttempt}: Using ${(retryLimit / 1024).toFixed(1)}KB limit`);
85
+ truncatedHistory = truncateToSize(truncatedHistory, retryLimit);
86
+ }
87
+ // Log truncation if it occurred
88
+ if (truncatedHistory.length < currentHistory.length) {
89
+ const summary = getHistorySummary(currentHistory, truncatedHistory);
90
+ console.log(`📦 ${summary}`);
91
+ }
92
+ const historyJson = JSON.stringify(truncatedHistory);
93
+ const payloadSize = new TextEncoder().encode(historyJson).length;
94
+ console.log(`📊 Payload size before encryption: ${(payloadSize / 1024).toFixed(1)}KB (${truncatedHistory.length} messages)`);
95
+ // Warn if payload is large
96
+ if (payloadSize > 600_000) {
97
+ console.warn(`⚠️ Large payload: ${(payloadSize / 1024).toFixed(1)}KB - may cause 413 error`);
98
+ }
99
+ const localKeys = this.attestationData.localKeys;
100
+ // Encrypt with all shared keys for attestation
101
+ const encryptedPayloads = {};
102
+ for (const sharedKeyData of this.attestationData.sharedKeys) {
103
+ // Use the imported encryptAndSign function for each shared key
104
+ const payload = await encryptAndSign(historyJson, sharedKeyData.sharedKey, localKeys.ecdsaPrivate, this.nonce);
105
+ const peerPubPem = await serializePublicKeyPem(localKeys.ecdsaPublic);
106
+ encryptedPayloads[sharedKeyData.id] = {
107
+ peer_public_key: peerPubPem,
108
+ payload
109
+ };
110
+ }
111
+ // Build request with all encrypted payloads
112
+ const request = {
113
+ payloads: encryptedPayloads
114
+ };
115
+ // Send to /message_stream endpoint
116
+ const url = `${this.baseUrl.replace(/\/$/, '')}/message_stream`;
117
+ const response = await fetch(url, {
118
+ method: 'POST',
119
+ headers: { 'Content-Type': 'application/json' },
120
+ body: JSON.stringify(request),
121
+ signal: AbortSignal.timeout(ENCRYPTION_CONFIG.streamingTimeout)
122
+ });
123
+ if (!response.ok) {
124
+ // Provide helpful error messages for common failure cases
125
+ if (response.status === 401 || response.status === 403) {
126
+ throw new Error(`Authentication failed (${response.status}). ` +
127
+ `Please ensure BLACKBOX_API_KEY is set correctly. ` +
128
+ `Run 'blackbox configure' to set up your API key.`);
129
+ }
130
+ // Handle 413 Payload Too Large with retry logic
131
+ if (response.status === 413 && retryAttempt < 3) {
132
+ console.warn(`⚠️ 413 Payload Too Large error (attempt ${retryAttempt + 1}/3)`);
133
+ console.log(`🔄 Retrying with more aggressive history truncation...`);
134
+ // Retry with more aggressive truncation
135
+ return this.sendMessageStream(userText, fileData, retryAttempt + 1);
136
+ }
137
+ // If all retries failed or other error
138
+ if (response.status === 413) {
139
+ throw new Error(`Payload too large even after ${retryAttempt + 1} retry attempts. ` +
140
+ `The conversation history is too large for the encrypted service. ` +
141
+ `Please start a new conversation.`);
142
+ }
143
+ throw new Error(`Streaming request failed: ${response.status}`);
144
+ }
145
+ // Process streaming response using ReadableStream (NDJSON format)
146
+ let buffer = '';
147
+ let fullResponse = '';
148
+ const attestationData = this.attestationData;
149
+ // FIX: Use arrow functions to preserve 'this' context
150
+ const transformStream = new TransformStream({
151
+ transform: async (chunk, controller) => {
152
+ try {
153
+ buffer += new TextDecoder().decode(chunk);
154
+ // Process complete lines
155
+ const lines = buffer.split('\n');
156
+ buffer = lines.pop() || ''; // Keep incomplete line in buffer
157
+ for (const line of lines) {
158
+ const trimmed = line.trim();
159
+ if (!trimmed)
160
+ continue;
161
+ try {
162
+ const jsonData = JSON.parse(trimmed);
163
+ // Check for end-of-stream marker
164
+ if (jsonData.eos === true) {
165
+ // Add the complete response to history when stream ends
166
+ if (fullResponse.trim().length > 0) {
167
+ // 'this' correctly refers to the class instance here
168
+ this.history.push({ role: 'assistant', content: fullResponse });
169
+ this.nonce = this.nonce + 1;
170
+ }
171
+ controller.terminate();
172
+ return;
173
+ }
174
+ // The server should indicate which key was used for encryption
175
+ // Try to decrypt with the appropriate key based on server response
176
+ let decryptedChunk = null;
177
+ // If server indicates which key was used
178
+ if (jsonData.key_id) {
179
+ const keyData = attestationData.sharedKeys.find((k) => k.id === jsonData.key_id);
180
+ const serverKey = attestationData.serverPublicKeys.find((k) => k.id === jsonData.key_id);
181
+ if (keyData && serverKey) {
182
+ try {
183
+ decryptedChunk = await decryptAndVerify(jsonData, keyData.sharedKey, serverKey.publicKeySpki);
184
+ }
185
+ catch (_error) {
186
+ // Failed to decrypt with specified key, will try all keys
187
+ }
188
+ }
189
+ }
190
+ // If no key_id specified or decryption failed, try all keys
191
+ if (!decryptedChunk) {
192
+ for (let i = 0; i < attestationData.sharedKeys.length; i++) {
193
+ const keyData = attestationData.sharedKeys[i];
194
+ const serverKey = attestationData.serverPublicKeys[i];
195
+ try {
196
+ decryptedChunk = await decryptAndVerify(jsonData, keyData.sharedKey, serverKey.publicKeySpki);
197
+ break;
198
+ }
199
+ catch (_error) {
200
+ // Try next key
201
+ continue;
202
+ }
203
+ }
204
+ }
205
+ if (!decryptedChunk) {
206
+ throw new Error('Failed to decrypt chunk with any available key');
207
+ }
208
+ fullResponse += decryptedChunk;
209
+ // Enqueue the decrypted chunk
210
+ controller.enqueue(new TextEncoder().encode(decryptedChunk));
211
+ }
212
+ catch (_e) {
213
+ // Error processing chunk, skip this line
214
+ }
215
+ }
216
+ }
217
+ catch (error) {
218
+ controller.error(error);
219
+ }
220
+ },
221
+ flush: () => {
222
+ // Handle case where stream ends without explicit EOS marker
223
+ if (fullResponse.trim().length > 0) {
224
+ this.history.push({ role: 'assistant', content: fullResponse });
225
+ this.nonce = this.nonce + 1;
226
+ }
227
+ }
228
+ });
229
+ return response.body.pipeThrough(transformStream);
230
+ }
231
+ }
232
+ //# sourceMappingURL=streaming-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-client.js","sourceRoot":"","sources":["../../../src/encrypt/streaming-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { FunctionDeclaration } from '@google/genai';
7
+ export interface ToolCall {
8
+ name: string;
9
+ arguments: Record<string, unknown>;
10
+ }
11
+ export interface ChatMessage {
12
+ role: 'system' | 'user' | 'assistant' | 'tool';
13
+ content: string;
14
+ tool_calls?: ToolCall[];
15
+ image_url?: string;
16
+ }
17
+ /**
18
+ * Format tools for system prompt based on model type
19
+ * Matches the Rust implementation's format_tools_for_system_prompt function
20
+ */
21
+ export declare function formatToolsForSystemPrompt(tools: FunctionDeclaration[], modelType?: string): string;
22
+ /**
23
+ * Format messages with tool calls based on model type
24
+ * Matches the Rust implementation's format_messages function
25
+ */
26
+ export declare function formatMessages(messages: ChatMessage[], modelType?: string, history?: ChatMessage[]): ChatMessage[];
27
+ /**
28
+ * Parse tool calls from text response
29
+ * Supports MiniMax, Qwen and DeepSeek formats
30
+ * Enhanced version with better error handling
31
+ */
32
+ export declare function parseToolCallsFromText(text: string, modelType?: string): ToolCall[];
33
+ /**
34
+ * Detect model type from response text
35
+ */
36
+ export declare function detectModelType(text: string): string;
@@ -0,0 +1,353 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Format tools for system prompt based on model type
8
+ * Matches the Rust implementation's format_tools_for_system_prompt function
9
+ */
10
+ export function formatToolsForSystemPrompt(tools, modelType = 'minimax') {
11
+ if (!tools || tools.length === 0) {
12
+ return '';
13
+ }
14
+ let result = '';
15
+ switch (modelType.toLowerCase()) {
16
+ case 'minimax': {
17
+ result += '\n\n# Tools\n';
18
+ result += 'You may call one or more tools to assist with the user query.\n';
19
+ result += 'Here are the tools available in JSONSchema format:\n\n';
20
+ result += '<tools>\n';
21
+ for (const tool of tools) {
22
+ const toolFunction = {
23
+ name: tool.name,
24
+ description: tool.description || '',
25
+ parameters: tool.parametersJsonSchema || {}
26
+ };
27
+ result += `<tool>${JSON.stringify(toolFunction, null, 0)}</tool>\n`;
28
+ }
29
+ result += '</tools>\n\n';
30
+ result += 'When making tool calls, use XML format to invoke tools and pass parameters:\n\n';
31
+ result += '<minimax:tool_call>\n';
32
+ result += '<invoke name="tool-name-1">\n';
33
+ result += '<parameter name="param-key-1">param-value-1</parameter>\n';
34
+ result += '<parameter name="param-key-2">param-value-2</parameter>\n';
35
+ result += '...\n';
36
+ result += '</invoke>\n';
37
+ result += '</minimax:tool_call>\n\n';
38
+ break;
39
+ }
40
+ case 'deepseek': {
41
+ result += '\n\n## Tools\n\nYou have access to the following tools. Use them when needed to help the user:\n\n';
42
+ for (const tool of tools) {
43
+ const name = tool.name || '';
44
+ const description = tool.description || '';
45
+ const parameters = tool.parametersJsonSchema || {};
46
+ result += `**${name}**: ${description}\n`;
47
+ if (parameters && typeof parameters === 'object' && Object.keys(parameters).length > 0) {
48
+ result += `Parameters: ${JSON.stringify(parameters, null, 2)}\n`;
49
+ }
50
+ result += '\n';
51
+ }
52
+ result += '**CRITICAL TOOL USAGE RULES:**\n';
53
+ result += '1. NEVER output tool descriptions, parameters, or schemas in your response\n';
54
+ result += '2. NEVER show tool invocation payloads or debug information\n';
55
+ result += '3. Use tools silently - the user should only see the results\n';
56
+ result += '4. Use this EXACT format for tool calls:\n';
57
+ result += ' <|tool▁calls▁begin|><|tool▁call▁begin|>tool_name<|tool▁sep|>{"param":"value"}<|tool▁call▁end|><|tool▁calls▁end|>\n\n';
58
+ result += '5. Replace tool_name with the exact tool name and provide valid JSON arguments\n';
59
+ result += '6. Do NOT explain what tools you are using - just use them and show results\n\n';
60
+ break;
61
+ }
62
+ case 'qwen': { // Qwen format
63
+ result += '\n\n## Tools\n\nYou have access to the following tools. Use them when needed to help the user:\n\n';
64
+ for (const tool of tools) {
65
+ const name = tool.name || '';
66
+ const description = tool.description || '';
67
+ const parameters = tool.parametersJsonSchema || {};
68
+ result += `**${name}**: ${description}\n`;
69
+ if (parameters && typeof parameters === 'object' && Object.keys(parameters).length > 0) {
70
+ result += `Parameters: ${JSON.stringify(parameters, null, 2)}\n`;
71
+ }
72
+ result += '\n';
73
+ }
74
+ result += '**CRITICAL TOOL USAGE RULES:**\n';
75
+ result += '1. NEVER output tool descriptions, parameters, or schemas in your response\n';
76
+ result += '2. NEVER show tool invocation payloads or debug information\n';
77
+ result += '3. Use tools silently - the user should only see the results\n';
78
+ result += '4. Use this EXACT format for tool calls:\n';
79
+ result += ' <tool_call>\n {"name": "tool_name", "arguments": {"param": "value"}}\n </tool_call>\n\n';
80
+ result += '5. Replace tool_name with the exact tool name and provide valid JSON arguments\n';
81
+ result += '6. Do NOT explain what tools you are using - just use them and show results\n\n';
82
+ break;
83
+ }
84
+ default: {
85
+ result += '\n\n## Tools\n\nYou have access to the following tools:\n\n';
86
+ for (const tool of tools) {
87
+ const name = tool.name || '';
88
+ const description = tool.description || '';
89
+ const parameters = tool.parametersJsonSchema || {};
90
+ result += `### ${name}\n`;
91
+ result += `Description: ${description}\n\n`;
92
+ result += `Parameters: ${JSON.stringify(parameters)}\n\n`;
93
+ }
94
+ result += 'IMPORTANT: ALWAYS adhere to this exact format for tool use:\n';
95
+ result += '<|tool▁calls▁begin|><|tool▁call▁begin|>tool_call_name<|tool▁sep|>tool_call_arguments<|tool▁call▁end|>{additional_tool_calls}<|tool▁calls▁end|>\n\n';
96
+ result += 'Where:\n';
97
+ result += '- `tool_call_name` must be an exact match to one of the available tools\n';
98
+ result += '- `tool_call_arguments` must be valid JSON that strictly follows the tool\'s Parameters Schema\n';
99
+ result += '- For multiple tool calls, chain them directly without separators or spaces\n';
100
+ break;
101
+ }
102
+ }
103
+ return result;
104
+ }
105
+ /**
106
+ * Format messages with tool calls based on model type
107
+ * Matches the Rust implementation's format_messages function
108
+ */
109
+ export function formatMessages(messages, modelType = 'deepseek', history = []) {
110
+ // Helper function to create a message key for deduplication
111
+ const messageKey = (msg) => `${msg.role}:${msg.content}`;
112
+ const formattedMessages = [];
113
+ const seenMessages = new Set();
114
+ // Extract messages from input (skip system messages)
115
+ const requestMessages = messages.filter(msg => msg.role !== 'system');
116
+ // Process messages and format tool calls
117
+ for (const msg of requestMessages) {
118
+ const formattedMsg = {
119
+ role: msg.role,
120
+ content: msg.content,
121
+ image_url: msg.image_url
122
+ };
123
+ // Format tool calls if present
124
+ if (msg.tool_calls && msg.tool_calls.length > 0) {
125
+ let toolCallsStr = '';
126
+ switch (modelType.toLowerCase()) {
127
+ case 'minimax': {
128
+ toolCallsStr = '<minimax:tool_call>\n';
129
+ for (const tc of msg.tool_calls) {
130
+ toolCallsStr += `<invoke name="${tc.name}">\n`;
131
+ for (const [key, value] of Object.entries(tc.arguments)) {
132
+ const valueStr = typeof value === 'string' ? value : JSON.stringify(value);
133
+ toolCallsStr += `<parameter name="${key}">${valueStr}</parameter>\n`;
134
+ }
135
+ toolCallsStr += '</invoke>\n';
136
+ }
137
+ toolCallsStr += '</minimax:tool_call>';
138
+ break;
139
+ }
140
+ case 'deepseek': {
141
+ const formattedCalls = msg.tool_calls.map(tc => {
142
+ const argsStr = JSON.stringify(tc.arguments);
143
+ return `<|tool▁call▁begin|>${tc.name}<|tool▁sep|>${argsStr}<|tool▁call▁end|>`;
144
+ });
145
+ if (formattedCalls.length > 0) {
146
+ toolCallsStr = `<|tool▁calls▁begin|>${formattedCalls.join('')}<|tool▁calls▁end|>`;
147
+ }
148
+ break;
149
+ }
150
+ case 'qwen': { // Qwen format
151
+ toolCallsStr = msg.tool_calls.map(tc => {
152
+ const argsStr = JSON.stringify(tc.arguments);
153
+ return `<tool_call>\n{"name": "${tc.name}", "arguments": ${argsStr}}\n</tool_call>`;
154
+ }).join('\n');
155
+ break;
156
+ }
157
+ default: {
158
+ const formattedCalls = msg.tool_calls.map(tc => {
159
+ const argsStr = JSON.stringify(tc.arguments);
160
+ return `<|tool▁call▁begin|>${tc.name}<|tool▁sep|>${argsStr}<|tool▁call▁end|>`;
161
+ });
162
+ if (formattedCalls.length > 0) {
163
+ toolCallsStr = `<|tool▁calls▁begin|>${formattedCalls.join('')}<|tool▁calls▁end|>`;
164
+ }
165
+ break;
166
+ }
167
+ }
168
+ // Combine content and tool calls
169
+ if (formattedMsg.content && toolCallsStr) {
170
+ formattedMsg.content = `${formattedMsg.content}\n${toolCallsStr}`;
171
+ }
172
+ else {
173
+ formattedMsg.content = formattedMsg.content + toolCallsStr;
174
+ }
175
+ }
176
+ // Add to formatted messages if not seen before
177
+ const key = messageKey(formattedMsg);
178
+ if (!seenMessages.has(key)) {
179
+ seenMessages.add(key);
180
+ formattedMessages.push(formattedMsg);
181
+ }
182
+ }
183
+ // Merge with history (simplified version - can be enhanced based on needs)
184
+ const result = [];
185
+ // Add system messages from history first
186
+ for (const msg of history) {
187
+ if (msg.role === 'system') {
188
+ const key = messageKey(msg);
189
+ if (!seenMessages.has(key)) {
190
+ seenMessages.add(key);
191
+ result.push(msg);
192
+ }
193
+ }
194
+ }
195
+ // Add formatted messages
196
+ result.push(...formattedMessages);
197
+ return result;
198
+ }
199
+ /**
200
+ * Parse tool calls from text response
201
+ * Supports MiniMax, Qwen and DeepSeek formats
202
+ * Enhanced version with better error handling
203
+ */
204
+ export function parseToolCallsFromText(text, modelType = 'minimax') {
205
+ const toolCalls = [];
206
+ switch (modelType.toLowerCase()) {
207
+ case 'minimax': {
208
+ // Parse MiniMax format with XML-style tool calls
209
+ const minimaxRegex = /<minimax:tool_call>([\s\S]*?)<\/minimax:tool_call>/g;
210
+ let minimaxMatch;
211
+ while ((minimaxMatch = minimaxRegex.exec(text)) !== null) {
212
+ const toolCallContent = minimaxMatch[1];
213
+ // Parse individual invoke blocks
214
+ const invokeRegex = /<invoke name="([^"]+)">([\s\S]*?)<\/invoke>/g;
215
+ let invokeMatch;
216
+ while ((invokeMatch = invokeRegex.exec(toolCallContent)) !== null) {
217
+ const toolName = invokeMatch[1];
218
+ const parametersContent = invokeMatch[2];
219
+ // Parse parameters
220
+ const parameterRegex = /<parameter name="([^"]+)">([\s\S]*?)<\/parameter>/g;
221
+ const toolArguments = {};
222
+ let paramMatch;
223
+ while ((paramMatch = parameterRegex.exec(parametersContent)) !== null) {
224
+ const paramName = paramMatch[1];
225
+ const paramValue = paramMatch[2];
226
+ // Try to parse as JSON, fallback to string
227
+ try {
228
+ toolArguments[paramName] = JSON.parse(paramValue);
229
+ }
230
+ catch {
231
+ toolArguments[paramName] = paramValue;
232
+ }
233
+ }
234
+ toolCalls.push({
235
+ name: toolName,
236
+ arguments: toolArguments
237
+ });
238
+ }
239
+ }
240
+ break;
241
+ }
242
+ case 'deepseek': {
243
+ // Parse DeepSeek format with more robust regex that handles complex JSON
244
+ const deepseekRegex = /<|tool▁call▁begin|>(.*?)<|tool▁sep|>(.*?)<|tool▁call▁end|>/gs;
245
+ let deepseekMatch;
246
+ while ((deepseekMatch = deepseekRegex.exec(text)) !== null) {
247
+ try {
248
+ const name = deepseekMatch[1].trim();
249
+ const argsJson = deepseekMatch[2].trim();
250
+ const args = parseJsonWithFallback(argsJson);
251
+ toolCalls.push({ name, arguments: args });
252
+ }
253
+ catch (error) {
254
+ console.warn('Failed to parse DeepSeek tool call:', error);
255
+ }
256
+ }
257
+ break;
258
+ }
259
+ default: { // Qwen format
260
+ // Parse Qwen format with more robust regex that handles multiline JSON
261
+ const qwenRegex = /<tool_call>\s*([\s\S]*?)\s*<\/tool_call>/g;
262
+ let qwenMatch;
263
+ while ((qwenMatch = qwenRegex.exec(text)) !== null) {
264
+ try {
265
+ const jsonStr = qwenMatch[1].trim();
266
+ const toolCallData = parseJsonWithFallback(jsonStr);
267
+ if (toolCallData['name'] && toolCallData['arguments']) {
268
+ toolCalls.push({
269
+ name: toolCallData['name'],
270
+ arguments: toolCallData['arguments']
271
+ });
272
+ }
273
+ }
274
+ catch (error) {
275
+ console.warn('Failed to parse Qwen tool call:', error);
276
+ }
277
+ }
278
+ break;
279
+ }
280
+ }
281
+ return toolCalls;
282
+ }
283
+ /**
284
+ * Parse JSON with fallback error handling
285
+ */
286
+ function parseJsonWithFallback(jsonStr) {
287
+ try {
288
+ return JSON.parse(jsonStr);
289
+ }
290
+ catch (_error) {
291
+ // Try to fix common JSON issues
292
+ let fixedJson = jsonStr;
293
+ // Fix trailing commas
294
+ fixedJson = fixedJson.replace(/,(\s*[}\]])/g, '$1');
295
+ // Try parsing again
296
+ try {
297
+ return JSON.parse(fixedJson);
298
+ }
299
+ catch (_secondError) {
300
+ // If still fails, try to extract key-value pairs manually
301
+ return extractKeyValuePairs(jsonStr);
302
+ }
303
+ }
304
+ }
305
+ /**
306
+ * Extract key-value pairs from malformed JSON as fallback
307
+ */
308
+ function extractKeyValuePairs(jsonStr) {
309
+ const result = {};
310
+ // Simple regex to extract "key": "value" or "key": value patterns
311
+ const kvRegex = /"([^"]+)"\s*:\s*("([^"]*)"|([^,}\]]+))/g;
312
+ let match;
313
+ while ((match = kvRegex.exec(jsonStr)) !== null) {
314
+ const key = match[1];
315
+ const value = match[3] !== undefined ? match[3] : match[4]?.trim();
316
+ if (value !== undefined) {
317
+ // Try to parse value as number or boolean
318
+ if (value === 'true') {
319
+ result[key] = true;
320
+ }
321
+ else if (value === 'false') {
322
+ result[key] = false;
323
+ }
324
+ else if (!isNaN(Number(value))) {
325
+ result[key] = Number(value);
326
+ }
327
+ else {
328
+ result[key] = value;
329
+ }
330
+ }
331
+ }
332
+ return result;
333
+ }
334
+ /**
335
+ * Detect model type from response text
336
+ */
337
+ export function detectModelType(text) {
338
+ // Check for MiniMax format tokens
339
+ if (text.includes('<minimax:tool_call>') || text.includes('<invoke name=')) {
340
+ return 'minimax';
341
+ }
342
+ // Check for DeepSeek format tokens
343
+ if (text.includes('<|tool▁calls▁begin|>') || text.includes('<|tool▁call▁begin|>')) {
344
+ return 'deepseek';
345
+ }
346
+ // Check for Qwen format tokens
347
+ if (text.includes('<tool_call>')) {
348
+ return 'qwen';
349
+ }
350
+ // Default to MiniMax format
351
+ return 'minimax';
352
+ }
353
+ //# sourceMappingURL=tool-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-formatter.js","sourceRoot":"","sources":["../../../src/encrypt/tool-formatter.ts"],"names":[],"mappings":"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"}