@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.
- 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 +8 -2
- 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/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 +6 -2
- package/dist/src/core/openaiContentGenerator/pipeline.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 +17 -0
- package/dist/src/core/prompts.js +347 -19
- 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 +22 -1
- package/dist/src/tools/browser_use.js +403 -23
- 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/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/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 +16 -2
- 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,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { CountTokensParameters, CountTokensResponse, EmbedContentParameters, EmbedContentResponse, GenerateContentParameters } from '@google/genai';
|
|
7
|
+
import { GenerateContentResponse } from '@google/genai';
|
|
8
|
+
import type { ContentGenerator } from './contentGenerator.js';
|
|
9
|
+
import type { UserTierId } from '../code_assist/types.js';
|
|
10
|
+
import type { Config } from '../config/config.js';
|
|
11
|
+
interface EncryptionServiceBridge {
|
|
12
|
+
sendMessageStream: (sessionId: string, userText: string, messageHistory?: Array<{
|
|
13
|
+
role: 'system' | 'user' | 'assistant';
|
|
14
|
+
content: string;
|
|
15
|
+
}>) => Promise<ReadableStream<Uint8Array>>;
|
|
16
|
+
}
|
|
17
|
+
declare global {
|
|
18
|
+
var blackboxEncryptionService: EncryptionServiceBridge | undefined;
|
|
19
|
+
}
|
|
20
|
+
export declare class EncryptedContentGenerator implements ContentGenerator {
|
|
21
|
+
private sessionId;
|
|
22
|
+
private config;
|
|
23
|
+
private initialized;
|
|
24
|
+
constructor(sessionId: string, config: Config);
|
|
25
|
+
private ensureInitialized;
|
|
26
|
+
/**
|
|
27
|
+
* Formats tools strictly according to MiniMax-M2.1 Jinja template requirements
|
|
28
|
+
*/
|
|
29
|
+
private extractAndFormatTools;
|
|
30
|
+
private convertToMessageHistory;
|
|
31
|
+
private convertPartsToText;
|
|
32
|
+
private parseToolCallsFromResponse;
|
|
33
|
+
private detectModelType;
|
|
34
|
+
private removeToolCallMarkup;
|
|
35
|
+
private extractContentArray;
|
|
36
|
+
private extractToolsFromRequest;
|
|
37
|
+
generateContent(request: GenerateContentParameters, _userPromptId: string): Promise<GenerateContentResponse>;
|
|
38
|
+
generateContentStream(request: GenerateContentParameters, _userPromptId: string): Promise<AsyncGenerator<GenerateContentResponse>>;
|
|
39
|
+
private generateContentStreamInternal;
|
|
40
|
+
private createTextResponse;
|
|
41
|
+
private createThinkResponse;
|
|
42
|
+
private createToolCallResponse;
|
|
43
|
+
countTokens(request: CountTokensParameters): Promise<CountTokensResponse>;
|
|
44
|
+
embedContent(request: EmbedContentParameters): Promise<EmbedContentResponse>;
|
|
45
|
+
userTier?: UserTierId;
|
|
46
|
+
}
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { GenerateContentResponse } from '@google/genai';
|
|
7
|
+
import { ApprovalMode } from '../config/config.js';
|
|
8
|
+
import { createEncryptedToolParser } from '../encrypt/tool-parser.js';
|
|
9
|
+
import { getCoreSystemPrompt } from './prompts.js';
|
|
10
|
+
import { getEnvironmentContext } from '../utils/environmentContext.js';
|
|
11
|
+
import { removeToolCallMarkup, cleanStreamingText, formatThinkContent, detectModelType } from '../utils/textCleaning.js';
|
|
12
|
+
export class EncryptedContentGenerator {
|
|
13
|
+
sessionId;
|
|
14
|
+
config;
|
|
15
|
+
initialized = false;
|
|
16
|
+
constructor(sessionId, config) {
|
|
17
|
+
this.sessionId = sessionId;
|
|
18
|
+
this.config = config;
|
|
19
|
+
}
|
|
20
|
+
async ensureInitialized() {
|
|
21
|
+
if (!this.initialized) {
|
|
22
|
+
this.initialized = true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Formats tools strictly according to MiniMax-M2.1 Jinja template requirements
|
|
27
|
+
*/
|
|
28
|
+
extractAndFormatTools(request) {
|
|
29
|
+
const tools = [];
|
|
30
|
+
if (request.config?.tools) {
|
|
31
|
+
for (const toolGroup of request.config.tools) {
|
|
32
|
+
if ('functionDeclarations' in toolGroup && toolGroup.functionDeclarations) {
|
|
33
|
+
tools.push(...toolGroup.functionDeclarations);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (tools.length === 0) {
|
|
38
|
+
return '';
|
|
39
|
+
}
|
|
40
|
+
// MiniMax System Prompt Addition (Derived from Jinja)
|
|
41
|
+
// It requires tools in JSONSchema format inside <tools> tags,
|
|
42
|
+
// followed by specific XML invocation instructions.
|
|
43
|
+
const toolsJson = JSON.stringify(tools, null, 2);
|
|
44
|
+
const systemPrompt = `
|
|
45
|
+
# Tools
|
|
46
|
+
You may call one or more tools to assist with the user query.
|
|
47
|
+
Here are the tools available in JSONSchema format:
|
|
48
|
+
<tools>
|
|
49
|
+
${toolsJson}
|
|
50
|
+
</tools>
|
|
51
|
+
|
|
52
|
+
When making tool calls, use XML format to invoke tools and pass parameters:
|
|
53
|
+
<minimax:tool_call>
|
|
54
|
+
<invoke name="tool-name-1">
|
|
55
|
+
<parameter name="param-key-1">param-value-1</parameter>
|
|
56
|
+
<parameter name="param-key-2">param-value-2</parameter>
|
|
57
|
+
...
|
|
58
|
+
</invoke>
|
|
59
|
+
</minimax:tool_call>
|
|
60
|
+
`;
|
|
61
|
+
return systemPrompt;
|
|
62
|
+
}
|
|
63
|
+
async convertToMessageHistory(contents, toolsSystemPrompt = '') {
|
|
64
|
+
const userMemory = this.config.getUserMemory();
|
|
65
|
+
const coreSystemPrompt = getCoreSystemPrompt(userMemory, {}, this.config.getModel(), this.config.getApprovalMode() === ApprovalMode.YOLO);
|
|
66
|
+
const fullSystemPrompt = toolsSystemPrompt
|
|
67
|
+
? `${coreSystemPrompt}\n\n${toolsSystemPrompt}`
|
|
68
|
+
: coreSystemPrompt;
|
|
69
|
+
const envParts = await getEnvironmentContext(this.config);
|
|
70
|
+
const envText = envParts.map(part => typeof part === 'string' ? part : part.text || '').join('\n');
|
|
71
|
+
const systemPromptWithEnvironment = envText.trim()
|
|
72
|
+
? `${fullSystemPrompt}\n\n${envText}`
|
|
73
|
+
: fullSystemPrompt;
|
|
74
|
+
const messages = [
|
|
75
|
+
{ role: 'system', content: systemPromptWithEnvironment }
|
|
76
|
+
];
|
|
77
|
+
if (envText.trim()) {
|
|
78
|
+
messages.push({ role: 'user', content: envText });
|
|
79
|
+
messages.push({ role: 'assistant', content: 'Got it. Thanks for the context!' });
|
|
80
|
+
}
|
|
81
|
+
const conversationMessages = contents.map(content => {
|
|
82
|
+
const textParts = content.parts?.filter((part) => typeof part === 'object' && part !== null && 'text' in part) || [];
|
|
83
|
+
const text = textParts.map(part => part.text).join('\n');
|
|
84
|
+
const role = content.role === 'model' ? 'assistant' : content.role;
|
|
85
|
+
return { role, content: text };
|
|
86
|
+
}).filter(msg => msg.role !== 'system');
|
|
87
|
+
messages.push(...conversationMessages);
|
|
88
|
+
return messages;
|
|
89
|
+
}
|
|
90
|
+
convertPartsToText(parts) {
|
|
91
|
+
return parts
|
|
92
|
+
.filter((part) => 'text' in part)
|
|
93
|
+
.map(part => part.text)
|
|
94
|
+
.join('\n');
|
|
95
|
+
}
|
|
96
|
+
parseToolCallsFromResponse(text, tools) {
|
|
97
|
+
const modelType = this.detectModelType(text);
|
|
98
|
+
const parser = createEncryptedToolParser();
|
|
99
|
+
const parseResult = parser.parseComplete(text, tools, modelType);
|
|
100
|
+
if (!parseResult.success) {
|
|
101
|
+
console.warn('Tool parsing failed, check syntax');
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
return parseResult.toolCalls.map((tc, index) => ({
|
|
105
|
+
name: tc.name,
|
|
106
|
+
args: tc.arguments,
|
|
107
|
+
id: tc.id || `call_${Date.now()}_${index}`
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
detectModelType(text) {
|
|
111
|
+
return detectModelType(text);
|
|
112
|
+
}
|
|
113
|
+
removeToolCallMarkup(text) {
|
|
114
|
+
const modelType = this.detectModelType(text);
|
|
115
|
+
const result = removeToolCallMarkup(text, modelType, {
|
|
116
|
+
debug: false, // Enable debug logging if needed for troubleshooting
|
|
117
|
+
maxConsecutiveNewlines: 2,
|
|
118
|
+
trimEnds: true
|
|
119
|
+
});
|
|
120
|
+
return result.text;
|
|
121
|
+
}
|
|
122
|
+
extractContentArray(contents) {
|
|
123
|
+
return contents.filter((c) => typeof c === 'object' && c !== null && 'role' in c && 'parts' in c);
|
|
124
|
+
}
|
|
125
|
+
extractToolsFromRequest(request) {
|
|
126
|
+
const tools = [];
|
|
127
|
+
if (request.config?.tools) {
|
|
128
|
+
for (const toolGroup of request.config.tools) {
|
|
129
|
+
if ('functionDeclarations' in toolGroup && toolGroup.functionDeclarations) {
|
|
130
|
+
tools.push(...toolGroup.functionDeclarations);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return tools;
|
|
135
|
+
}
|
|
136
|
+
// --- Main Generate Methods ---
|
|
137
|
+
async generateContent(request, _userPromptId) {
|
|
138
|
+
await this.ensureInitialized();
|
|
139
|
+
const toolsSystemPrompt = this.extractAndFormatTools(request);
|
|
140
|
+
const tools = this.extractToolsFromRequest(request);
|
|
141
|
+
const contents = Array.isArray(request.contents) ? request.contents : [request.contents];
|
|
142
|
+
const contentsArray = this.extractContentArray(contents);
|
|
143
|
+
const lastContent = contentsArray[contentsArray.length - 1];
|
|
144
|
+
const userMessage = lastContent ? this.convertPartsToText(lastContent.parts || []) : '';
|
|
145
|
+
const messageHistory = await this.convertToMessageHistory(contentsArray, toolsSystemPrompt);
|
|
146
|
+
if (!globalThis.blackboxEncryptionService)
|
|
147
|
+
throw new Error("Encryption service not initialized");
|
|
148
|
+
const encryptedStream = await globalThis.blackboxEncryptionService.sendMessageStream(this.sessionId, userMessage, messageHistory);
|
|
149
|
+
let fullResponse = '';
|
|
150
|
+
const reader = encryptedStream.getReader();
|
|
151
|
+
const decoder = new TextDecoder();
|
|
152
|
+
try {
|
|
153
|
+
while (true) {
|
|
154
|
+
const { done, value } = await reader.read();
|
|
155
|
+
if (done)
|
|
156
|
+
break;
|
|
157
|
+
fullResponse += decoder.decode(value, { stream: true });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
reader.releaseLock();
|
|
162
|
+
}
|
|
163
|
+
const toolCalls = this.parseToolCallsFromResponse(fullResponse, tools);
|
|
164
|
+
const cleanTextResponse = this.removeToolCallMarkup(fullResponse);
|
|
165
|
+
const responseParts = [];
|
|
166
|
+
if (cleanTextResponse.trim()) {
|
|
167
|
+
responseParts.push({ text: cleanTextResponse });
|
|
168
|
+
}
|
|
169
|
+
for (const toolCall of toolCalls) {
|
|
170
|
+
responseParts.push({ functionCall: toolCall });
|
|
171
|
+
}
|
|
172
|
+
const response = new GenerateContentResponse();
|
|
173
|
+
response.candidates = [{
|
|
174
|
+
content: { role: 'model', parts: responseParts },
|
|
175
|
+
finishReason: 'STOP',
|
|
176
|
+
index: 0,
|
|
177
|
+
safetyRatings: []
|
|
178
|
+
}];
|
|
179
|
+
return response;
|
|
180
|
+
}
|
|
181
|
+
async generateContentStream(request, _userPromptId) {
|
|
182
|
+
return this.generateContentStreamInternal(request);
|
|
183
|
+
}
|
|
184
|
+
async *generateContentStreamInternal(request) {
|
|
185
|
+
await this.ensureInitialized();
|
|
186
|
+
const toolsSystemPrompt = this.extractAndFormatTools(request);
|
|
187
|
+
const tools = this.extractToolsFromRequest(request);
|
|
188
|
+
const contents = Array.isArray(request.contents) ? request.contents : [request.contents];
|
|
189
|
+
const contentsArray = this.extractContentArray(contents);
|
|
190
|
+
const lastContent = contentsArray[contentsArray.length - 1];
|
|
191
|
+
const userMessage = lastContent ? this.convertPartsToText(lastContent.parts || []) : '';
|
|
192
|
+
const messageHistory = await this.convertToMessageHistory(contentsArray, toolsSystemPrompt);
|
|
193
|
+
if (!globalThis.blackboxEncryptionService)
|
|
194
|
+
throw new Error("Encryption service not initialized");
|
|
195
|
+
const encryptedStream = await globalThis.blackboxEncryptionService.sendMessageStream(this.sessionId, userMessage, messageHistory);
|
|
196
|
+
const reader = encryptedStream.getReader();
|
|
197
|
+
const decoder = new TextDecoder();
|
|
198
|
+
// Enhanced streaming state machine
|
|
199
|
+
let accumulatedText = '';
|
|
200
|
+
let streamBuffer = '';
|
|
201
|
+
let toolCallsProcessed = false;
|
|
202
|
+
// All possible tokens we need to detect
|
|
203
|
+
const TOKENS = {
|
|
204
|
+
THINK_START: '<think>',
|
|
205
|
+
THINK_END: '</think>',
|
|
206
|
+
MM_TOOL_START: '<minimax:tool_call>',
|
|
207
|
+
MM_TOOL_END: '</minimax:tool_call>',
|
|
208
|
+
DEEPSEEK_START: '<|tool▁calls▁begin|>',
|
|
209
|
+
DEEPSEEK_END: '<|tool▁calls▁end|>',
|
|
210
|
+
QWEN_START: '<tool_call>',
|
|
211
|
+
QWEN_END: '</tool_call>',
|
|
212
|
+
};
|
|
213
|
+
// Helper function to check if buffer might contain start of any token
|
|
214
|
+
const mightContainPartialToken = (buffer) => {
|
|
215
|
+
const allTokens = Object.values(TOKENS);
|
|
216
|
+
for (const token of allTokens) {
|
|
217
|
+
for (let i = 1; i < Math.min(token.length, 10); i++) {
|
|
218
|
+
if (buffer.endsWith(token.substring(0, i))) {
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return false;
|
|
224
|
+
};
|
|
225
|
+
// Helper function to find the earliest complete token in buffer
|
|
226
|
+
const findEarliestToken = (buffer) => {
|
|
227
|
+
let earliest = null;
|
|
228
|
+
// Check all tokens
|
|
229
|
+
for (const [key, token] of Object.entries(TOKENS)) {
|
|
230
|
+
const index = buffer.indexOf(token);
|
|
231
|
+
if (index !== -1) {
|
|
232
|
+
if (!earliest || index < earliest.index) {
|
|
233
|
+
const type = key.endsWith('_START') ? 'start' : 'end';
|
|
234
|
+
earliest = { index, token, type };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return earliest;
|
|
239
|
+
};
|
|
240
|
+
try {
|
|
241
|
+
while (true) {
|
|
242
|
+
const { done, value } = await reader.read();
|
|
243
|
+
if (done)
|
|
244
|
+
break;
|
|
245
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
246
|
+
accumulatedText += chunk;
|
|
247
|
+
streamBuffer += chunk;
|
|
248
|
+
// Process buffer until no more complete tokens can be found
|
|
249
|
+
let continueProcessing = true;
|
|
250
|
+
while (continueProcessing) {
|
|
251
|
+
continueProcessing = false;
|
|
252
|
+
const tokenMatch = findEarliestToken(streamBuffer);
|
|
253
|
+
if (tokenMatch) {
|
|
254
|
+
// Found a complete token
|
|
255
|
+
const beforeToken = streamBuffer.substring(0, tokenMatch.index);
|
|
256
|
+
// Yield text before the token (if any and not just whitespace/newlines)
|
|
257
|
+
if (beforeToken && beforeToken.trim() && beforeToken.trim().length > 0) {
|
|
258
|
+
const response = this.createTextResponse(beforeToken);
|
|
259
|
+
if (response) {
|
|
260
|
+
yield response;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Handle the token based on its type
|
|
264
|
+
if (tokenMatch.token === TOKENS.THINK_START) {
|
|
265
|
+
// Start of think block - find the end
|
|
266
|
+
const afterStart = streamBuffer.substring(tokenMatch.index + tokenMatch.token.length);
|
|
267
|
+
const endIndex = afterStart.indexOf(TOKENS.THINK_END);
|
|
268
|
+
if (endIndex !== -1) {
|
|
269
|
+
// Complete think block found - format it differently from assistant messages
|
|
270
|
+
const thinkContent = afterStart.substring(0, endIndex);
|
|
271
|
+
// Yield the think content with special formatting (different from assistant messages)
|
|
272
|
+
if (thinkContent.trim().length > 0) {
|
|
273
|
+
yield this.createThinkResponse(thinkContent.trim());
|
|
274
|
+
}
|
|
275
|
+
streamBuffer = afterStart.substring(endIndex + TOKENS.THINK_END.length);
|
|
276
|
+
continueProcessing = true;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
// Incomplete think block - wait for more data
|
|
280
|
+
streamBuffer = streamBuffer.substring(tokenMatch.index);
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
else if (tokenMatch.token === TOKENS.MM_TOOL_START ||
|
|
285
|
+
tokenMatch.token === TOKENS.DEEPSEEK_START ||
|
|
286
|
+
tokenMatch.token === TOKENS.QWEN_START) {
|
|
287
|
+
// Start of tool block - find the corresponding end
|
|
288
|
+
let endToken;
|
|
289
|
+
if (tokenMatch.token === TOKENS.MM_TOOL_START) {
|
|
290
|
+
endToken = TOKENS.MM_TOOL_END;
|
|
291
|
+
}
|
|
292
|
+
else if (tokenMatch.token === TOKENS.DEEPSEEK_START) {
|
|
293
|
+
endToken = TOKENS.DEEPSEEK_END;
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
endToken = TOKENS.QWEN_END;
|
|
297
|
+
}
|
|
298
|
+
const afterStart = streamBuffer.substring(tokenMatch.index + tokenMatch.token.length);
|
|
299
|
+
const endIndex = afterStart.indexOf(endToken);
|
|
300
|
+
if (endIndex !== -1) {
|
|
301
|
+
if (!toolCallsProcessed) {
|
|
302
|
+
const toolCalls = this.parseToolCallsFromResponse(accumulatedText, tools);
|
|
303
|
+
if (toolCalls.length > 0) {
|
|
304
|
+
toolCallsProcessed = true;
|
|
305
|
+
for (const toolCall of toolCalls) {
|
|
306
|
+
yield this.createToolCallResponse(toolCall);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// Skip the tool block
|
|
311
|
+
streamBuffer = afterStart.substring(endIndex + endToken.length);
|
|
312
|
+
continueProcessing = true;
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
streamBuffer = streamBuffer.substring(tokenMatch.index);
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
// End token found without matching start - just skip it
|
|
321
|
+
streamBuffer = streamBuffer.substring(tokenMatch.index + tokenMatch.token.length);
|
|
322
|
+
continueProcessing = true;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
// No complete tokens found
|
|
327
|
+
// Check if we might have a partial token at the end
|
|
328
|
+
if (mightContainPartialToken(streamBuffer)) {
|
|
329
|
+
// Keep the buffer as is - don't yield anything that might be part of a token
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
// Safe to yield most of the buffer, but keep a small safety margin
|
|
334
|
+
const maxTokenLength = Math.max(...Object.values(TOKENS).map(t => t.length));
|
|
335
|
+
const safetyMargin = maxTokenLength + 5;
|
|
336
|
+
if (streamBuffer.length > safetyMargin) {
|
|
337
|
+
const safeLength = streamBuffer.length - safetyMargin;
|
|
338
|
+
const textToYield = streamBuffer.substring(0, safeLength);
|
|
339
|
+
// Only filter out completely empty strings or just newlines
|
|
340
|
+
if (textToYield && textToYield.trim().length > 0) {
|
|
341
|
+
const response = this.createTextResponse(textToYield);
|
|
342
|
+
if (response) {
|
|
343
|
+
yield response;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
streamBuffer = streamBuffer.substring(safeLength);
|
|
347
|
+
}
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
// Final processing - yield any remaining text
|
|
354
|
+
if (streamBuffer.trim()) {
|
|
355
|
+
// Check one more time for any remaining tool calls
|
|
356
|
+
if (!toolCallsProcessed) {
|
|
357
|
+
const toolCalls = this.parseToolCallsFromResponse(accumulatedText, tools);
|
|
358
|
+
if (toolCalls.length > 0) {
|
|
359
|
+
for (const toolCall of toolCalls) {
|
|
360
|
+
yield this.createToolCallResponse(toolCall);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// Clean and yield remaining text
|
|
365
|
+
const cleanText = this.removeToolCallMarkup(streamBuffer);
|
|
366
|
+
if (cleanText && cleanText.trim().length > 0) {
|
|
367
|
+
const response = this.createTextResponse(cleanText);
|
|
368
|
+
if (response) {
|
|
369
|
+
yield response;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
finally {
|
|
375
|
+
reader.releaseLock();
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
createTextResponse(text) {
|
|
379
|
+
// Use our consolidated text cleaning utility for streaming content
|
|
380
|
+
const result = cleanStreamingText(text, {
|
|
381
|
+
debug: false, // Enable for debugging if needed
|
|
382
|
+
maxConsecutiveNewlines: 2,
|
|
383
|
+
trimEnds: true
|
|
384
|
+
});
|
|
385
|
+
// CRITICAL: Don't create response for empty, whitespace-only, or newline-only content
|
|
386
|
+
if (!result.text || result.text.trim().length === 0) {
|
|
387
|
+
return null;
|
|
388
|
+
}
|
|
389
|
+
const resp = new GenerateContentResponse();
|
|
390
|
+
resp.candidates = [{
|
|
391
|
+
content: { role: 'model', parts: [{ text: result.text }] },
|
|
392
|
+
finishReason: 'STOP',
|
|
393
|
+
index: 0,
|
|
394
|
+
safetyRatings: []
|
|
395
|
+
}];
|
|
396
|
+
return resp;
|
|
397
|
+
}
|
|
398
|
+
createThinkResponse(thinkContent) {
|
|
399
|
+
const formattedContent = formatThinkContent(thinkContent, {
|
|
400
|
+
debug: false, // Enable for debugging if needed
|
|
401
|
+
maxConsecutiveNewlines: 2,
|
|
402
|
+
trimEnds: true
|
|
403
|
+
});
|
|
404
|
+
const resp = new GenerateContentResponse();
|
|
405
|
+
resp.candidates = [{
|
|
406
|
+
content: { role: 'model', parts: [{ text: formattedContent }] },
|
|
407
|
+
finishReason: 'STOP',
|
|
408
|
+
index: 0,
|
|
409
|
+
safetyRatings: []
|
|
410
|
+
}];
|
|
411
|
+
return resp;
|
|
412
|
+
}
|
|
413
|
+
createToolCallResponse(toolCall) {
|
|
414
|
+
const resp = new GenerateContentResponse();
|
|
415
|
+
resp.candidates = [{
|
|
416
|
+
content: { role: 'model', parts: [{ functionCall: toolCall }] },
|
|
417
|
+
finishReason: 'STOP',
|
|
418
|
+
index: 0,
|
|
419
|
+
safetyRatings: []
|
|
420
|
+
}];
|
|
421
|
+
return resp;
|
|
422
|
+
}
|
|
423
|
+
// Stubs for interface compliance
|
|
424
|
+
async countTokens(request) {
|
|
425
|
+
const contents = Array.isArray(request.contents) ? request.contents : [request.contents];
|
|
426
|
+
const contentsArray = this.extractContentArray(contents);
|
|
427
|
+
let totalTokens = 0;
|
|
428
|
+
for (const content of contentsArray) {
|
|
429
|
+
const text = this.convertPartsToText(content.parts || []);
|
|
430
|
+
totalTokens += Math.ceil(text.length / 4);
|
|
431
|
+
}
|
|
432
|
+
return { totalTokens };
|
|
433
|
+
}
|
|
434
|
+
async embedContent(request) {
|
|
435
|
+
const contents = Array.isArray(request.contents) ? request.contents : [request.contents];
|
|
436
|
+
return {
|
|
437
|
+
embeddings: contents.map(() => ({
|
|
438
|
+
values: []
|
|
439
|
+
}))
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
// Optional userTier property
|
|
443
|
+
userTier;
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=encryptedContentGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryptedContentGenerator.js","sourceRoot":"","sources":["../../../src/core/encryptedContentGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { PartListUnion, FunctionDeclaration } from '@google/genai';
|
|
7
|
+
import type { ServerGeminiStreamEvent } from './turn.js';
|
|
8
|
+
import type { Config } from '../config/config.js';
|
|
9
|
+
/**
|
|
10
|
+
* Interface for the encrypted chat service
|
|
11
|
+
*/
|
|
12
|
+
export interface EncryptedChatService {
|
|
13
|
+
sendMessage(message: string, messageHistory?: Array<{
|
|
14
|
+
role: 'system' | 'user' | 'assistant';
|
|
15
|
+
content: string;
|
|
16
|
+
}>): Promise<ReadableStream<Uint8Array>>;
|
|
17
|
+
initialize(systemPrompt?: string): Promise<void>;
|
|
18
|
+
isReady(): boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* EncryptedGeminiClient provides the same interface as GeminiClient
|
|
22
|
+
* but routes requests through the encrypted provider and emits the correct events
|
|
23
|
+
* for tool execution.
|
|
24
|
+
*/
|
|
25
|
+
export declare class EncryptedGeminiClient {
|
|
26
|
+
private readonly encryptedService;
|
|
27
|
+
private readonly config?;
|
|
28
|
+
private tools;
|
|
29
|
+
constructor(encryptedService: EncryptedChatService, config?: Config | undefined);
|
|
30
|
+
/**
|
|
31
|
+
* Set the available tools for this client
|
|
32
|
+
*/
|
|
33
|
+
setTools(tools: FunctionDeclaration[]): void;
|
|
34
|
+
/**
|
|
35
|
+
* Send a message and get streaming events that match the regular GeminiClient interface
|
|
36
|
+
* This is the key method that bridges the encrypted provider with the event system
|
|
37
|
+
*/
|
|
38
|
+
sendMessageStream(request: PartListUnion, signal: AbortSignal, prompt_id: string): AsyncGenerator<ServerGeminiStreamEvent>;
|
|
39
|
+
/**
|
|
40
|
+
* Convert PartListUnion request to text string
|
|
41
|
+
*/
|
|
42
|
+
private convertRequestToText;
|
|
43
|
+
/**
|
|
44
|
+
* Check if text contains tool call markup
|
|
45
|
+
*/
|
|
46
|
+
private containsToolCalls;
|
|
47
|
+
/**
|
|
48
|
+
* Get available tools
|
|
49
|
+
*/
|
|
50
|
+
getTools(): FunctionDeclaration[];
|
|
51
|
+
/**
|
|
52
|
+
* Check if client is ready
|
|
53
|
+
*/
|
|
54
|
+
isReady(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Get the core system prompt like Gemini does
|
|
57
|
+
*/
|
|
58
|
+
private getCoreSystemPrompt;
|
|
59
|
+
}
|