@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,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Blackbox
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export interface WorktreeInfo {
|
|
7
|
+
name: string;
|
|
8
|
+
path: string;
|
|
9
|
+
branch: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class GitWorktreeManager {
|
|
12
|
+
private worktrees;
|
|
13
|
+
private baseDir;
|
|
14
|
+
private tempDir;
|
|
15
|
+
constructor(baseDir: string);
|
|
16
|
+
/**
|
|
17
|
+
* Check if we're in a git repository
|
|
18
|
+
*/
|
|
19
|
+
isGitRepository(): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Get the current branch name
|
|
22
|
+
*/
|
|
23
|
+
getCurrentBranch(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Check if there are uncommitted changes
|
|
26
|
+
*/
|
|
27
|
+
hasUncommittedChanges(): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Create a worktree for an agent
|
|
30
|
+
*/
|
|
31
|
+
createWorktree(agentName: string): Promise<WorktreeInfo>;
|
|
32
|
+
/**
|
|
33
|
+
* Remove a worktree
|
|
34
|
+
*/
|
|
35
|
+
removeWorktree(agentName: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Remove all worktrees
|
|
38
|
+
*/
|
|
39
|
+
cleanup(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Get worktree info for an agent
|
|
42
|
+
*/
|
|
43
|
+
getWorktree(agentName: string): WorktreeInfo | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Get all worktrees
|
|
46
|
+
*/
|
|
47
|
+
getAllWorktrees(): WorktreeInfo[];
|
|
48
|
+
/**
|
|
49
|
+
* Check if gh CLI is available
|
|
50
|
+
*/
|
|
51
|
+
isGitHubCliAvailable(): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Create a pull request using gh CLI
|
|
54
|
+
*/
|
|
55
|
+
createPullRequest(branchName: string, title: string, body: string): Promise<string>;
|
|
56
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Blackbox
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { execSync } from 'node:child_process';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import os from 'node:os';
|
|
9
|
+
import fs from 'node:fs';
|
|
10
|
+
export class GitWorktreeManager {
|
|
11
|
+
worktrees = new Map();
|
|
12
|
+
baseDir;
|
|
13
|
+
tempDir;
|
|
14
|
+
constructor(baseDir) {
|
|
15
|
+
this.baseDir = baseDir;
|
|
16
|
+
this.tempDir = path.join(os.tmpdir(), 'blackbox-multi-agent');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if we're in a git repository
|
|
20
|
+
*/
|
|
21
|
+
async isGitRepository() {
|
|
22
|
+
try {
|
|
23
|
+
execSync('git rev-parse --git-dir', {
|
|
24
|
+
cwd: this.baseDir,
|
|
25
|
+
stdio: 'pipe',
|
|
26
|
+
});
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get the current branch name
|
|
35
|
+
*/
|
|
36
|
+
getCurrentBranch() {
|
|
37
|
+
try {
|
|
38
|
+
return execSync('git rev-parse --abbrev-ref HEAD', {
|
|
39
|
+
cwd: this.baseDir,
|
|
40
|
+
encoding: 'utf-8',
|
|
41
|
+
stdio: 'pipe',
|
|
42
|
+
}).trim();
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
throw new Error(`Failed to get current branch: ${error}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if there are uncommitted changes
|
|
50
|
+
*/
|
|
51
|
+
hasUncommittedChanges() {
|
|
52
|
+
try {
|
|
53
|
+
const status = execSync('git status --porcelain', {
|
|
54
|
+
cwd: this.baseDir,
|
|
55
|
+
encoding: 'utf-8',
|
|
56
|
+
stdio: 'pipe',
|
|
57
|
+
});
|
|
58
|
+
return status.trim().length > 0;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a worktree for an agent
|
|
66
|
+
*/
|
|
67
|
+
async createWorktree(agentName) {
|
|
68
|
+
const timestamp = Date.now();
|
|
69
|
+
const branchName = `blackboxai/multi-agent-${agentName}-${timestamp}`;
|
|
70
|
+
const worktreePath = path.join(this.tempDir, `${agentName}-${timestamp}`);
|
|
71
|
+
try {
|
|
72
|
+
// Ensure temp directory exists
|
|
73
|
+
if (!fs.existsSync(this.tempDir)) {
|
|
74
|
+
fs.mkdirSync(this.tempDir, { recursive: true });
|
|
75
|
+
}
|
|
76
|
+
// Create new branch from current HEAD
|
|
77
|
+
execSync(`git branch ${branchName}`, {
|
|
78
|
+
cwd: this.baseDir,
|
|
79
|
+
stdio: 'pipe',
|
|
80
|
+
});
|
|
81
|
+
// Create worktree
|
|
82
|
+
execSync(`git worktree add "${worktreePath}" ${branchName}`, {
|
|
83
|
+
cwd: this.baseDir,
|
|
84
|
+
stdio: 'pipe',
|
|
85
|
+
});
|
|
86
|
+
const worktreeInfo = {
|
|
87
|
+
name: agentName,
|
|
88
|
+
path: worktreePath,
|
|
89
|
+
branch: branchName,
|
|
90
|
+
};
|
|
91
|
+
this.worktrees.set(agentName, worktreeInfo);
|
|
92
|
+
return worktreeInfo;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
throw new Error(`Failed to create worktree for ${agentName}: ${error}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Remove a worktree
|
|
100
|
+
*/
|
|
101
|
+
async removeWorktree(agentName) {
|
|
102
|
+
const worktree = this.worktrees.get(agentName);
|
|
103
|
+
if (!worktree) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
execSync(`git worktree remove "${worktree.path}" --force`, {
|
|
108
|
+
cwd: this.baseDir,
|
|
109
|
+
stdio: 'pipe',
|
|
110
|
+
});
|
|
111
|
+
this.worktrees.delete(agentName);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.error(`Failed to remove worktree for ${agentName}:`, error);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Remove all worktrees
|
|
119
|
+
*/
|
|
120
|
+
async cleanup() {
|
|
121
|
+
const agentNames = Array.from(this.worktrees.keys());
|
|
122
|
+
for (const agentName of agentNames) {
|
|
123
|
+
await this.removeWorktree(agentName);
|
|
124
|
+
}
|
|
125
|
+
// Clean up temp directory
|
|
126
|
+
try {
|
|
127
|
+
if (fs.existsSync(this.tempDir)) {
|
|
128
|
+
fs.rmSync(this.tempDir, { recursive: true, force: true });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
console.error('Failed to clean up temp directory:', error);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get worktree info for an agent
|
|
137
|
+
*/
|
|
138
|
+
getWorktree(agentName) {
|
|
139
|
+
return this.worktrees.get(agentName);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get all worktrees
|
|
143
|
+
*/
|
|
144
|
+
getAllWorktrees() {
|
|
145
|
+
return Array.from(this.worktrees.values());
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Check if gh CLI is available
|
|
149
|
+
*/
|
|
150
|
+
async isGitHubCliAvailable() {
|
|
151
|
+
try {
|
|
152
|
+
execSync('gh --version', { stdio: 'pipe' });
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Create a pull request using gh CLI
|
|
161
|
+
*/
|
|
162
|
+
async createPullRequest(branchName, title, body) {
|
|
163
|
+
try {
|
|
164
|
+
const result = execSync(`gh pr create --head ${branchName} --title "${title}" --body "${body}"`, {
|
|
165
|
+
cwd: this.baseDir,
|
|
166
|
+
encoding: 'utf-8',
|
|
167
|
+
stdio: 'pipe',
|
|
168
|
+
});
|
|
169
|
+
return result.trim();
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
throw new Error(`Failed to create PR: ${error}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=git-worktree-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-worktree-utils.js","sourceRoot":"","sources":["../../../src/utils/git-worktree-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Result of image compression operation
|
|
8
|
+
*/
|
|
9
|
+
export interface CompressionResult {
|
|
10
|
+
buffer: Buffer;
|
|
11
|
+
mimeType: string;
|
|
12
|
+
originalSize: number;
|
|
13
|
+
compressedSize: number;
|
|
14
|
+
compressionRatio: number;
|
|
15
|
+
wasResized: boolean;
|
|
16
|
+
finalQuality?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Compresses an image buffer to ensure it stays under the size limit.
|
|
20
|
+
* Converts to JPEG format and applies quality reduction and/or resizing as needed.
|
|
21
|
+
*
|
|
22
|
+
* @param inputBuffer The original image buffer
|
|
23
|
+
* @param originalMimeType The original MIME type of the image
|
|
24
|
+
* @returns Promise resolving to CompressionResult with compressed image data
|
|
25
|
+
*/
|
|
26
|
+
export declare function compressImage(inputBuffer: Buffer, originalMimeType: string): Promise<CompressionResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Checks if an image should be compressed based on its size and type.
|
|
29
|
+
*
|
|
30
|
+
* @param buffer The image buffer
|
|
31
|
+
* @param mimeType The MIME type of the image
|
|
32
|
+
* @returns true if the image should be compressed
|
|
33
|
+
*/
|
|
34
|
+
export declare function shouldCompressImage(buffer: Buffer, mimeType: string): boolean;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import sharp from 'sharp';
|
|
7
|
+
/**
|
|
8
|
+
* Maximum size for compressed images in bytes (4.5MB to stay safely under 5MB limit)
|
|
9
|
+
* This accounts for base64 encoding overhead (~33% increase)
|
|
10
|
+
*/
|
|
11
|
+
const MAX_COMPRESSED_SIZE_BYTES = 4.5 * 1024 * 1024;
|
|
12
|
+
/**
|
|
13
|
+
* Maximum dimension (width or height) for images
|
|
14
|
+
*/
|
|
15
|
+
const MAX_IMAGE_DIMENSION = 2048;
|
|
16
|
+
/**
|
|
17
|
+
* Initial JPEG quality for compression
|
|
18
|
+
*/
|
|
19
|
+
const INITIAL_JPEG_QUALITY = 85;
|
|
20
|
+
/**
|
|
21
|
+
* Minimum JPEG quality to try before giving up
|
|
22
|
+
*/
|
|
23
|
+
const MIN_JPEG_QUALITY = 60;
|
|
24
|
+
/**
|
|
25
|
+
* Quality reduction step when image is still too large
|
|
26
|
+
*/
|
|
27
|
+
const QUALITY_STEP = 5;
|
|
28
|
+
/**
|
|
29
|
+
* Compresses an image buffer to ensure it stays under the size limit.
|
|
30
|
+
* Converts to JPEG format and applies quality reduction and/or resizing as needed.
|
|
31
|
+
*
|
|
32
|
+
* @param inputBuffer The original image buffer
|
|
33
|
+
* @param originalMimeType The original MIME type of the image
|
|
34
|
+
* @returns Promise resolving to CompressionResult with compressed image data
|
|
35
|
+
*/
|
|
36
|
+
export async function compressImage(inputBuffer, originalMimeType) {
|
|
37
|
+
const originalSize = inputBuffer.length;
|
|
38
|
+
try {
|
|
39
|
+
// Initialize sharp instance
|
|
40
|
+
let image = sharp(inputBuffer);
|
|
41
|
+
const metadata = await image.metadata();
|
|
42
|
+
// Check if resizing is needed based on dimensions
|
|
43
|
+
let wasResized = false;
|
|
44
|
+
if (metadata.width && metadata.height) {
|
|
45
|
+
const maxDimension = Math.max(metadata.width, metadata.height);
|
|
46
|
+
if (maxDimension > MAX_IMAGE_DIMENSION) {
|
|
47
|
+
wasResized = true;
|
|
48
|
+
// Resize maintaining aspect ratio
|
|
49
|
+
image = image.resize(MAX_IMAGE_DIMENSION, MAX_IMAGE_DIMENSION, {
|
|
50
|
+
fit: 'inside',
|
|
51
|
+
withoutEnlargement: true,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Try different quality levels until we get under the size limit
|
|
56
|
+
let quality = INITIAL_JPEG_QUALITY;
|
|
57
|
+
let compressedBuffer;
|
|
58
|
+
let finalQuality = quality;
|
|
59
|
+
while (quality >= MIN_JPEG_QUALITY) {
|
|
60
|
+
// Convert to JPEG with current quality
|
|
61
|
+
compressedBuffer = await image
|
|
62
|
+
.jpeg({ quality, mozjpeg: true }) // mozjpeg provides better compression
|
|
63
|
+
.toBuffer();
|
|
64
|
+
finalQuality = quality;
|
|
65
|
+
// Check if size is acceptable
|
|
66
|
+
if (compressedBuffer.length <= MAX_COMPRESSED_SIZE_BYTES) {
|
|
67
|
+
const compressionRatio = (1 - compressedBuffer.length / originalSize) * 100;
|
|
68
|
+
console.log(`[Image Compression] Original: ${(originalSize / 1024 / 1024).toFixed(2)}MB, ` +
|
|
69
|
+
`Compressed: ${(compressedBuffer.length / 1024 / 1024).toFixed(2)}MB, ` +
|
|
70
|
+
`Ratio: ${compressionRatio.toFixed(1)}%, Quality: ${quality}%, ` +
|
|
71
|
+
`Resized: ${wasResized}`);
|
|
72
|
+
return {
|
|
73
|
+
buffer: compressedBuffer,
|
|
74
|
+
mimeType: 'image/jpeg',
|
|
75
|
+
originalSize,
|
|
76
|
+
compressedSize: compressedBuffer.length,
|
|
77
|
+
compressionRatio,
|
|
78
|
+
wasResized,
|
|
79
|
+
finalQuality,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Reduce quality and try again
|
|
83
|
+
quality -= QUALITY_STEP;
|
|
84
|
+
}
|
|
85
|
+
// If we still can't get under the limit, try more aggressive resizing
|
|
86
|
+
if (metadata.width && metadata.height) {
|
|
87
|
+
console.warn(`[Image Compression] Could not compress to under ${(MAX_COMPRESSED_SIZE_BYTES / 1024 / 1024).toFixed(1)}MB with quality reduction. Trying aggressive resize...`);
|
|
88
|
+
// Try progressively smaller sizes
|
|
89
|
+
const sizes = [1600, 1280, 1024, 800];
|
|
90
|
+
for (const size of sizes) {
|
|
91
|
+
image = sharp(inputBuffer).resize(size, size, {
|
|
92
|
+
fit: 'inside',
|
|
93
|
+
withoutEnlargement: true,
|
|
94
|
+
});
|
|
95
|
+
compressedBuffer = await image
|
|
96
|
+
.jpeg({ quality: MIN_JPEG_QUALITY, mozjpeg: true })
|
|
97
|
+
.toBuffer();
|
|
98
|
+
if (compressedBuffer.length <= MAX_COMPRESSED_SIZE_BYTES) {
|
|
99
|
+
const compressionRatio = (1 - compressedBuffer.length / originalSize) * 100;
|
|
100
|
+
console.log(`[Image Compression] Aggressive resize successful. ` +
|
|
101
|
+
`Original: ${(originalSize / 1024 / 1024).toFixed(2)}MB, ` +
|
|
102
|
+
`Compressed: ${(compressedBuffer.length / 1024 / 1024).toFixed(2)}MB, ` +
|
|
103
|
+
`Ratio: ${compressionRatio.toFixed(1)}%, Max dimension: ${size}px`);
|
|
104
|
+
return {
|
|
105
|
+
buffer: compressedBuffer,
|
|
106
|
+
mimeType: 'image/jpeg',
|
|
107
|
+
originalSize,
|
|
108
|
+
compressedSize: compressedBuffer.length,
|
|
109
|
+
compressionRatio,
|
|
110
|
+
wasResized: true,
|
|
111
|
+
finalQuality: MIN_JPEG_QUALITY,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Last resort: return the best we could do and warn
|
|
117
|
+
compressedBuffer = await sharp(inputBuffer)
|
|
118
|
+
.resize(800, 800, { fit: 'inside', withoutEnlargement: true })
|
|
119
|
+
.jpeg({ quality: MIN_JPEG_QUALITY, mozjpeg: true })
|
|
120
|
+
.toBuffer();
|
|
121
|
+
console.warn(`[Image Compression] Warning: Could not compress image to under ${(MAX_COMPRESSED_SIZE_BYTES / 1024 / 1024).toFixed(1)}MB. ` +
|
|
122
|
+
`Final size: ${(compressedBuffer.length / 1024 / 1024).toFixed(2)}MB. ` +
|
|
123
|
+
`This may exceed API limits.`);
|
|
124
|
+
return {
|
|
125
|
+
buffer: compressedBuffer,
|
|
126
|
+
mimeType: 'image/jpeg',
|
|
127
|
+
originalSize,
|
|
128
|
+
compressedSize: compressedBuffer.length,
|
|
129
|
+
compressionRatio: (1 - compressedBuffer.length / originalSize) * 100,
|
|
130
|
+
wasResized: true,
|
|
131
|
+
finalQuality: MIN_JPEG_QUALITY,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
// If compression fails, log error and return original
|
|
136
|
+
console.error(`[Image Compression] Failed to compress image: ${error instanceof Error ? error.message : String(error)}`);
|
|
137
|
+
// Return original buffer as fallback
|
|
138
|
+
return {
|
|
139
|
+
buffer: inputBuffer,
|
|
140
|
+
mimeType: originalMimeType,
|
|
141
|
+
originalSize,
|
|
142
|
+
compressedSize: originalSize,
|
|
143
|
+
compressionRatio: 0,
|
|
144
|
+
wasResized: false,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Checks if an image should be compressed based on its size and type.
|
|
150
|
+
*
|
|
151
|
+
* @param buffer The image buffer
|
|
152
|
+
* @param mimeType The MIME type of the image
|
|
153
|
+
* @returns true if the image should be compressed
|
|
154
|
+
*/
|
|
155
|
+
export function shouldCompressImage(buffer, mimeType) {
|
|
156
|
+
// Always compress if over 3MB to be safe
|
|
157
|
+
if (buffer.length > 3 * 1024 * 1024) {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
// Compress PNG files over 1MB (they often compress well to JPEG)
|
|
161
|
+
if (mimeType === 'image/png' && buffer.length > 1 * 1024 * 1024) {
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
// Don't compress small images or GIFs (to preserve animation)
|
|
165
|
+
if (mimeType === 'image/gif') {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=imageCompression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageCompression.js","sourceRoot":"","sources":["../../../src/utils/imageCompression.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
interface Message {
|
|
7
|
+
role: string;
|
|
8
|
+
content: string | ContentBlock[];
|
|
9
|
+
tool_calls?: ToolCall[];
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}
|
|
12
|
+
interface ContentBlock {
|
|
13
|
+
type: string;
|
|
14
|
+
text?: string;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
interface ToolCall {
|
|
18
|
+
function: {
|
|
19
|
+
arguments: string;
|
|
20
|
+
name?: string;
|
|
21
|
+
};
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
export declare class MessageTruncator {
|
|
25
|
+
private debugMode;
|
|
26
|
+
constructor(debugMode?: boolean);
|
|
27
|
+
/**
|
|
28
|
+
* Helper to get the tokenizer for a model.
|
|
29
|
+
* Handles generic fallback if the model string isn't an exact match.
|
|
30
|
+
*/
|
|
31
|
+
private getTokenizer;
|
|
32
|
+
/**
|
|
33
|
+
* Helper to count tokens for text or a list of messages.
|
|
34
|
+
* This mimics the self.count_tokens behavior.
|
|
35
|
+
*/
|
|
36
|
+
private countTokens;
|
|
37
|
+
/**
|
|
38
|
+
* Returns max token limits for models that may not be available in LiteLLM's get_model_info().
|
|
39
|
+
* Based on the comprehensive model mapping from the Python implementation.
|
|
40
|
+
*/
|
|
41
|
+
private getModelMaxTokens;
|
|
42
|
+
/**
|
|
43
|
+
* Smartly truncates message content by targeting longer texts first.
|
|
44
|
+
*/
|
|
45
|
+
private truncateMessageContent;
|
|
46
|
+
/**
|
|
47
|
+
* Main truncation method
|
|
48
|
+
*/
|
|
49
|
+
truncateLongMessages(model: string, messages: Message[], maxOutputTokens?: number, systemPrompt?: string | null): Message[];
|
|
50
|
+
}
|
|
51
|
+
export {};
|