@blackbox_ai/blackbox-cli 0.8.6 → 0.9.2

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 (135) hide show
  1. package/README.md +20 -0
  2. package/dist/package.json +2 -2
  3. package/dist/src/commands/configure/ConfigureUI.d.ts +1 -1
  4. package/dist/src/commands/configure/ConfigureUI.js +91 -22
  5. package/dist/src/commands/configure/ConfigureUI.js.map +1 -1
  6. package/dist/src/commands/configure.js +57 -16
  7. package/dist/src/commands/configure.js.map +1 -1
  8. package/dist/src/commands/shortcut.d.ts +10 -0
  9. package/dist/src/commands/shortcut.js +72 -0
  10. package/dist/src/commands/shortcut.js.map +1 -0
  11. package/dist/src/config/config.js +7 -1
  12. package/dist/src/config/config.js.map +1 -1
  13. package/dist/src/config/modelFetcher.d.ts +4 -0
  14. package/dist/src/config/modelFetcher.js +68 -22
  15. package/dist/src/config/modelFetcher.js.map +1 -1
  16. package/dist/src/config/settings.js +26 -2
  17. package/dist/src/config/settings.js.map +1 -1
  18. package/dist/src/config/settingsSchema.d.ts +29 -0
  19. package/dist/src/config/settingsSchema.js +29 -0
  20. package/dist/src/config/settingsSchema.js.map +1 -1
  21. package/dist/src/gemini.js +6 -0
  22. package/dist/src/gemini.js.map +1 -1
  23. package/dist/src/generated/git-commit.d.ts +2 -2
  24. package/dist/src/generated/git-commit.js +2 -2
  25. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  26. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  27. package/dist/src/services/agentExecutor.d.ts +52 -0
  28. package/dist/src/services/agentExecutor.js +145 -0
  29. package/dist/src/services/agentExecutor.js.map +1 -0
  30. package/dist/src/ui/App.d.ts +1 -1
  31. package/dist/src/ui/App.js +47 -16
  32. package/dist/src/ui/App.js.map +1 -1
  33. package/dist/src/ui/colors.js +3 -0
  34. package/dist/src/ui/colors.js.map +1 -1
  35. package/dist/src/ui/commands/agentCommand.d.ts +7 -0
  36. package/dist/src/ui/commands/agentCommand.js +90 -0
  37. package/dist/src/ui/commands/agentCommand.js.map +1 -0
  38. package/dist/src/ui/commands/types.d.ts +12 -2
  39. package/dist/src/ui/commands/types.js.map +1 -1
  40. package/dist/src/ui/components/AgentModelSelector.d.ts +17 -0
  41. package/dist/src/ui/components/AgentModelSelector.js +41 -0
  42. package/dist/src/ui/components/AgentModelSelector.js.map +1 -0
  43. package/dist/src/ui/components/AsciiArt.d.ts +3 -3
  44. package/dist/src/ui/components/AsciiArt.js +18 -18
  45. package/dist/src/ui/components/AsciiArt.js.map +1 -1
  46. package/dist/src/ui/components/AuthDialog.js +70 -13
  47. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  48. package/dist/src/ui/components/Footer.d.ts +2 -0
  49. package/dist/src/ui/components/Footer.js +2 -4
  50. package/dist/src/ui/components/Footer.js.map +1 -1
  51. package/dist/src/ui/components/Header.js +4 -1
  52. package/dist/src/ui/components/Header.js.map +1 -1
  53. package/dist/src/ui/components/InputPrompt.js +1 -1
  54. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  55. package/dist/src/ui/components/StatsDisplay.js +1 -1
  56. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  57. package/dist/src/ui/components/agents/SingleAgentDialog.d.ts +20 -0
  58. package/dist/src/ui/components/agents/SingleAgentDialog.js +150 -0
  59. package/dist/src/ui/components/agents/SingleAgentDialog.js.map +1 -0
  60. package/dist/src/ui/components/messages/ToolMessage.js +4 -4
  61. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  62. package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.js +1 -19
  63. package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.js.map +1 -1
  64. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +1 -1
  65. package/dist/src/ui/hooks/shellCommandProcessor.js +13 -2
  66. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  67. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +1 -1
  68. package/dist/src/ui/hooks/slashCommandProcessor.js +13 -29
  69. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  70. package/dist/src/ui/hooks/useAdaptiveStream.d.ts +2 -1
  71. package/dist/src/ui/hooks/useAdaptiveStream.js +2 -2
  72. package/dist/src/ui/hooks/useAdaptiveStream.js.map +1 -1
  73. package/dist/src/ui/hooks/useAgentCommandProcessor.d.ts +16 -0
  74. package/dist/src/ui/hooks/useAgentCommandProcessor.js +802 -0
  75. package/dist/src/ui/hooks/useAgentCommandProcessor.js.map +1 -0
  76. package/dist/src/ui/hooks/useEncryptedStream.js +15 -0
  77. package/dist/src/ui/hooks/useEncryptedStream.js.map +1 -1
  78. package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -1
  79. package/dist/src/ui/hooks/useGeminiStream.js +95 -20
  80. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  81. package/dist/src/ui/hooks/useSingleAgentCommand.d.ts +10 -0
  82. package/dist/src/ui/hooks/useSingleAgentCommand.js +21 -0
  83. package/dist/src/ui/hooks/useSingleAgentCommand.js.map +1 -0
  84. package/dist/src/ui/themes/ansi-light.js +1 -0
  85. package/dist/src/ui/themes/ansi-light.js.map +1 -1
  86. package/dist/src/ui/themes/ansi.js +1 -0
  87. package/dist/src/ui/themes/ansi.js.map +1 -1
  88. package/dist/src/ui/themes/atom-one-dark.js +14 -13
  89. package/dist/src/ui/themes/atom-one-dark.js.map +1 -1
  90. package/dist/src/ui/themes/ayu-light.js +14 -13
  91. package/dist/src/ui/themes/ayu-light.js.map +1 -1
  92. package/dist/src/ui/themes/ayu.js +14 -13
  93. package/dist/src/ui/themes/ayu.js.map +1 -1
  94. package/dist/src/ui/themes/blackbox-dark.js +36 -31
  95. package/dist/src/ui/themes/blackbox-dark.js.map +1 -1
  96. package/dist/src/ui/themes/blackbox-light.js +41 -39
  97. package/dist/src/ui/themes/blackbox-light.js.map +1 -1
  98. package/dist/src/ui/themes/default-light.js +20 -20
  99. package/dist/src/ui/themes/default-light.js.map +1 -1
  100. package/dist/src/ui/themes/default.js +27 -27
  101. package/dist/src/ui/themes/default.js.map +1 -1
  102. package/dist/src/ui/themes/dracula.js +14 -13
  103. package/dist/src/ui/themes/dracula.js.map +1 -1
  104. package/dist/src/ui/themes/github-dark.js +14 -13
  105. package/dist/src/ui/themes/github-dark.js.map +1 -1
  106. package/dist/src/ui/themes/github-light.js +14 -13
  107. package/dist/src/ui/themes/github-light.js.map +1 -1
  108. package/dist/src/ui/themes/googlecode.js +1 -0
  109. package/dist/src/ui/themes/googlecode.js.map +1 -1
  110. package/dist/src/ui/themes/no-color.js +2 -0
  111. package/dist/src/ui/themes/no-color.js.map +1 -1
  112. package/dist/src/ui/themes/semantic-tokens.d.ts +1 -0
  113. package/dist/src/ui/themes/semantic-tokens.js +3 -0
  114. package/dist/src/ui/themes/semantic-tokens.js.map +1 -1
  115. package/dist/src/ui/themes/shades-of-purple.js +1 -0
  116. package/dist/src/ui/themes/shades-of-purple.js.map +1 -1
  117. package/dist/src/ui/themes/theme.d.ts +2 -0
  118. package/dist/src/ui/themes/theme.js +35 -28
  119. package/dist/src/ui/themes/theme.js.map +1 -1
  120. package/dist/src/ui/themes/xcode.js +1 -0
  121. package/dist/src/ui/themes/xcode.js.map +1 -1
  122. package/dist/src/ui/types.d.ts +5 -0
  123. package/dist/src/ui/utils/terminalBackgroundDetector.d.ts +19 -0
  124. package/dist/src/ui/utils/terminalBackgroundDetector.js +99 -0
  125. package/dist/src/ui/utils/terminalBackgroundDetector.js.map +1 -0
  126. package/dist/src/utils/agentCommandBuilder.d.ts +36 -0
  127. package/dist/src/utils/agentCommandBuilder.js +288 -0
  128. package/dist/src/utils/agentCommandBuilder.js.map +1 -0
  129. package/dist/src/utils/shellShortcut.d.ts +45 -0
  130. package/dist/src/utils/shellShortcut.js +221 -0
  131. package/dist/src/utils/shellShortcut.js.map +1 -0
  132. package/dist/src/utils/userStartupWarnings.js +0 -20
  133. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  134. package/dist/tsconfig.tsbuildinfo +1 -1
  135. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalBackgroundDetector.js","sourceRoot":"","sources":["../../../../src/ui/utils/terminalBackgroundDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Blackbox
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export type AgentType = 'blackbox' | 'claude' | 'codex' | 'gemini';
7
+ /**
8
+ * Determines if an agent should use direct client integration vs CLI execution.
9
+ * Blackbox agent uses the existing Gemini client directly to reuse streaming, tools, and UI components.
10
+ * Other agents use CLI execution for their specific implementations.
11
+ */
12
+ export declare function shouldUseDirectClient(agentType: AgentType): boolean;
13
+ /**
14
+ * Builds the CLI command for the specified agent type.
15
+ * This is the single source of truth for agent command generation,
16
+ * used by both single agent and multi-agent systems.
17
+ *
18
+ * Note: For blackbox agent in single agent mode, direct client integration is preferred
19
+ * over CLI execution to reuse existing streaming and tool infrastructure.
20
+ */
21
+ export declare function buildAgentCommand(agentType: AgentType, model: string, task: string): string;
22
+ /**
23
+ * Builds the enhanced Claude command with jq parsing for readable output.
24
+ * Used specifically in multi-agent scenarios for better output formatting.
25
+ */
26
+ export declare function buildClaudeCommandWithJqParsing(model: string, task: string, outputFile: string): string;
27
+ /**
28
+ * Builds the enhanced Codex command with jq parsing for readable output.
29
+ * Used specifically in multi-agent scenarios for better output formatting.
30
+ */
31
+ export declare function buildCodexCommandWithJqParsing(model: string, task: string, outputFile: string): string;
32
+ /**
33
+ * Builds the enhanced Gemini command with jq parsing for readable output.
34
+ * Used specifically in multi-agent scenarios for better output formatting.
35
+ */
36
+ export declare function buildGeminiCommandWithJqParsing(model: string, task: string, outputFile: string): string;
@@ -0,0 +1,288 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Blackbox
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { resolveOpenAIModel } from '@blackbox_ai/blackbox-cli-core';
7
+ /**
8
+ * Determines if an agent should use direct client integration vs CLI execution.
9
+ * Blackbox agent uses the existing Gemini client directly to reuse streaming, tools, and UI components.
10
+ * Other agents use CLI execution for their specific implementations.
11
+ */
12
+ export function shouldUseDirectClient(agentType) {
13
+ return agentType === 'blackbox';
14
+ }
15
+ /**
16
+ * Builds the CLI command for the specified agent type.
17
+ * This is the single source of truth for agent command generation,
18
+ * used by both single agent and multi-agent systems.
19
+ *
20
+ * Note: For blackbox agent in single agent mode, direct client integration is preferred
21
+ * over CLI execution to reuse existing streaming and tool infrastructure.
22
+ */
23
+ export function buildAgentCommand(agentType, model, task) {
24
+ // Escape single quotes in the task for shell safety
25
+ const escapedTask = task.replace(/'/g, "'\\''");
26
+ switch (agentType) {
27
+ case 'blackbox':
28
+ return `blackbox -p '${escapedTask}' -y`;
29
+ case 'claude': {
30
+ const blackboxApiKey = process.env['BLACKBOX_API_KEY'];
31
+ if (!blackboxApiKey) {
32
+ throw new Error('BLACKBOX_API_KEY environment variable is required for Claude agent');
33
+ }
34
+ return `ANTHROPIC_API_KEY="${blackboxApiKey}" ANTHROPIC_BASE_URL="https://api.blackbox.ai" claude --model "${model}" -p --output-format=stream-json --include-partial-messages --dangerously-skip-permissions --verbose '${escapedTask}'`;
35
+ }
36
+ case 'codex': {
37
+ // Resolve model to use Blackbox provider if available
38
+ const apiKeys = {
39
+ blackbox_api_key: process.env['BLACKBOX_API_KEY'],
40
+ openai_api_key: process.env['OPENAI_API_KEY']
41
+ };
42
+ const resolved = resolveOpenAIModel(model, apiKeys);
43
+ if (!resolved.userApiKey) {
44
+ throw new Error('Either BLACKBOX_API_KEY or OPENAI_API_KEY environment variable is required for Codex agent');
45
+ }
46
+ // Check if using Blackbox provider
47
+ if (resolved.selectedModel.startsWith('blackboxai/')) {
48
+ // Use the full Blackbox model name (e.g., blackboxai/openai/gpt-5.1)
49
+ const blackboxModel = resolved.selectedModel;
50
+ // Create config.toml for Blackbox provider
51
+ const configToml = `model = "${blackboxModel}"
52
+ model_provider = "blackbox-ai-gateway"
53
+
54
+ [shell_environment_policy]
55
+ ignore_default_excludes = true
56
+ inherit = "all"
57
+
58
+ [model_providers.blackbox-ai-gateway]
59
+ name = "BlackBox AI Gateway"
60
+ base_url = "https://api.blackbox.ai/v1"
61
+ env_key = "BLACKBOX_API_KEY"
62
+ wire_api = "chat"
63
+
64
+ [debug]
65
+ log_requests = true`;
66
+ // Use Blackbox provider with custom configuration
67
+ return `mkdir -p ~/.codex && cat > ~/.codex/config.toml << 'EOF'
68
+ ${configToml}
69
+ EOF
70
+ BLACKBOX_API_KEY="${resolved.userApiKey}" codex exec --json --dangerously-bypass-approvals-and-sandbox '${escapedTask}'`;
71
+ }
72
+ else {
73
+ // Create config.toml for OpenAI provider
74
+ const configToml = `model = "${resolved.selectedModel}"
75
+ model_provider = "openai"
76
+
77
+ [shell_environment_policy]
78
+ ignore_default_excludes = true
79
+ inherit = "all"
80
+
81
+ [model_providers.openai]
82
+ name = "OpenAI"
83
+ base_url = "https://api.openai.com/v1"
84
+ env_key = "OPENAI_API_KEY"
85
+ wire_api = "responses"
86
+
87
+ [debug]
88
+ log_requests = true`;
89
+ // Use original OpenAI provider with custom configuration
90
+ return `mkdir -p ~/.codex && cat > ~/.codex/config.toml << 'EOF'
91
+ ${configToml}
92
+ EOF
93
+ OPENAI_API_KEY="${resolved.userApiKey}" codex exec --json --dangerously-bypass-approvals-and-sandbox '${escapedTask}'`;
94
+ }
95
+ }
96
+ case 'gemini': {
97
+ const geminiApiKey = process.env['GEMINI_API_KEY'];
98
+ if (!geminiApiKey) {
99
+ throw new Error('GEMINI_API_KEY environment variable is required for Gemini agent');
100
+ }
101
+ return `GEMINI_API_KEY="${geminiApiKey}" gemini --model "${model}" --yolo '${escapedTask}' --output-format stream-json`;
102
+ }
103
+ default:
104
+ throw new Error(`Unsupported agent type: ${agentType}`);
105
+ }
106
+ }
107
+ /**
108
+ * Builds the enhanced Claude command with jq parsing for readable output.
109
+ * Used specifically in multi-agent scenarios for better output formatting.
110
+ */
111
+ export function buildClaudeCommandWithJqParsing(model, task, outputFile) {
112
+ const blackboxApiKey = process.env['BLACKBOX_API_KEY'];
113
+ if (!blackboxApiKey) {
114
+ throw new Error('BLACKBOX_API_KEY environment variable is required for Claude agent');
115
+ }
116
+ const escapedTask = task.replace(/'/g, "'\\''");
117
+ return `ANTHROPIC_API_KEY="${blackboxApiKey}" ANTHROPIC_BASE_URL="https://api.blackbox.ai" claude --model "${model}" -p --output-format=stream-json --dangerously-skip-permissions --verbose '${escapedTask}' 2>&1 | jq -r '
118
+ if .type == "assistant" and .message.content then
119
+ .message.content[] |
120
+ if .type == "text" then .text
121
+ elif .type == "tool_use" then
122
+ "+-------------------------------------------------------------+\\n" +
123
+ "| 🔧 TOOL USE: \\(.name)\\n" +
124
+ "+-------------------------------------------------------------+\\n" +
125
+ "| Input:\\n" +
126
+ ((.input | @json | split("\\n")) | map("| " + .) | join("\\n")) + "\\n" +
127
+ "+-------------------------------------------------------------+\\n"
128
+ else empty
129
+ end
130
+ elif .type == "user" and .message.content then
131
+ .message.content[] |
132
+ if .type == "tool_result" then
133
+ "\\n" +
134
+ ((.content | split("\\n")) as $lines |
135
+ if ($lines | length) > 10 then
136
+ ($lines[:10] | join("\\n")) + "\\n" +
137
+ "\\n... (\\($lines | length - 10) more lines hidden) ...\\n"
138
+ else
139
+ $lines | join("\\n")
140
+ end) +
141
+ "\\n"
142
+ else empty
143
+ end
144
+ else empty
145
+ end
146
+ ' > ${outputFile} 2>&1`;
147
+ }
148
+ /**
149
+ * Builds the enhanced Codex command with jq parsing for readable output.
150
+ * Used specifically in multi-agent scenarios for better output formatting.
151
+ */
152
+ export function buildCodexCommandWithJqParsing(model, task, outputFile) {
153
+ // Resolve model to use Blackbox provider if available
154
+ const apiKeys = {
155
+ blackbox_api_key: process.env['BLACKBOX_API_KEY'],
156
+ openai_api_key: process.env['OPENAI_API_KEY']
157
+ };
158
+ const resolved = resolveOpenAIModel(model, apiKeys);
159
+ if (!resolved.userApiKey) {
160
+ throw new Error('Either BLACKBOX_API_KEY or OPENAI_API_KEY environment variable is required for Codex agent');
161
+ }
162
+ const escapedTask = task.replace(/'/g, "'\\''");
163
+ // Check if using Blackbox provider
164
+ if (resolved.selectedModel.startsWith('blackboxai/')) {
165
+ const blackboxModel = resolved.selectedModel;
166
+ // Create config.toml for Blackbox provider
167
+ const configToml = `model = "${blackboxModel}"
168
+ model_provider = "blackbox-ai-gateway"
169
+
170
+ [shell_environment_policy]
171
+ ignore_default_excludes = true
172
+ inherit = "all"
173
+
174
+ [model_providers.blackbox-ai-gateway]
175
+ name = "BlackBox AI Gateway"
176
+ base_url = "https://api.blackbox.ai/v1"
177
+ env_key = "BLACKBOX_API_KEY"
178
+ wire_api = "chat"
179
+
180
+ [debug]
181
+ log_requests = true`;
182
+ return `mkdir -p ~/.codex && cat > ~/.codex/config.toml << 'EOF'
183
+ ${configToml}
184
+ EOF
185
+ BLACKBOX_API_KEY="${resolved.userApiKey}" codex exec --json --dangerously-bypass-approvals-and-sandbox '${escapedTask}' 2>&1 | jq -r '
186
+ if .type == "item.completed" and .item.type == "agent_message" then
187
+ .item.text
188
+ elif .type == "item.started" and .item.type == "command_execution" then
189
+ "\\n🔧 EXECUTING: " + .item.command + "\\n"
190
+ elif .type == "item.completed" and .item.type == "command_execution" then
191
+ if .item.exit_code == 0 then
192
+ ((.item.aggregated_output | split("\\n")) as $lines |
193
+ if ($lines | length) > 20 then
194
+ ($lines[:20] | join("\\n")) + "\\n" +
195
+ "\\n... (\\($lines | length - 20) more lines hidden) ...\\n"
196
+ else
197
+ $lines | join("\\n")
198
+ end) + "\\n"
199
+ else
200
+ "❌ Command failed with exit code: " + (.item.exit_code | tostring) + "\\n" + .item.aggregated_output + "\\n"
201
+ end
202
+ elif .type == "turn.started" then
203
+ "🚀 Starting Codex execution...\\n"
204
+ elif .type == "turn.completed" then
205
+ "✅ Codex execution completed.\\n"
206
+ else empty
207
+ end
208
+ ' > ${outputFile} 2>&1`;
209
+ }
210
+ else {
211
+ // Create config.toml for OpenAI provider
212
+ const configToml = `model = "${resolved.selectedModel}"
213
+ model_provider = "openai"
214
+
215
+ [shell_environment_policy]
216
+ ignore_default_excludes = true
217
+ inherit = "all"
218
+
219
+ [model_providers.openai]
220
+ name = "OpenAI"
221
+ base_url = "https://api.openai.com/v1"
222
+ env_key = "OPENAI_API_KEY"
223
+ wire_api = "responses"
224
+
225
+ [debug]
226
+ log_requests = true`;
227
+ return `mkdir -p ~/.codex && cat > ~/.codex/config.toml << 'EOF'
228
+ ${configToml}
229
+ EOF
230
+ OPENAI_API_KEY="${resolved.userApiKey}" codex exec --json --dangerously-bypass-approvals-and-sandbox '${escapedTask}' 2>&1 | jq -r '
231
+ if .type == "item.completed" and .item.type == "agent_message" then
232
+ .item.text
233
+ elif .type == "item.started" and .item.type == "command_execution" then
234
+ "\\n🔧 EXECUTING: " + .item.command + "\\n"
235
+ elif .type == "item.completed" and .item.type == "command_execution" then
236
+ if .item.exit_code == 0 then
237
+ ((.item.aggregated_output | split("\\n")) as $lines |
238
+ if ($lines | length) > 20 then
239
+ ($lines[:20] | join("\\n")) + "\\n" +
240
+ "\\n... (\\($lines | length - 20) more lines hidden) ...\\n"
241
+ else
242
+ $lines | join("\\n")
243
+ end) + "\\n"
244
+ else
245
+ "❌ Command failed with exit code: " + (.item.exit_code | tostring) + "\\n" + .item.aggregated_output + "\\n"
246
+ end
247
+ elif .type == "turn.started" then
248
+ "🚀 Starting Codex execution...\\n"
249
+ elif .type == "turn.completed" then
250
+ "✅ Codex execution completed.\\n"
251
+ else empty
252
+ end
253
+ ' > ${outputFile} 2>&1`;
254
+ }
255
+ }
256
+ /**
257
+ * Builds the enhanced Gemini command with jq parsing for readable output.
258
+ * Used specifically in multi-agent scenarios for better output formatting.
259
+ */
260
+ export function buildGeminiCommandWithJqParsing(model, task, outputFile) {
261
+ const geminiApiKey = process.env['GEMINI_API_KEY'];
262
+ if (!geminiApiKey) {
263
+ throw new Error('GEMINI_API_KEY environment variable is required for Gemini agent');
264
+ }
265
+ const escapedTask = task.replace(/'/g, "'\\''");
266
+ return `GEMINI_API_KEY="${geminiApiKey}" gemini --model "${model}" --yolo '${escapedTask}' --output-format stream-json | jq -r '
267
+ def hr(n): ("─" * n);
268
+
269
+ def box(title; body):
270
+ "\\n┌" + hr(78) + "┐\\n" +
271
+ "│ " + (title | ascii_upcase) + (" " * (77 - (title|length))) + "│\\n" +
272
+ "├" + hr(78) + "┤\\n" +
273
+ (body
274
+ | split("\\n")
275
+ | map("│ " + . + (" " * (77 - (. | length))))
276
+ | join("\\n")
277
+ ) +
278
+ "\\n└" + hr(78) + "┘";
279
+
280
+ if .type == "message" and .role == "assistant" then
281
+ box("assistant"; .content)
282
+ elif .type == "tool_use" then
283
+ box("tool call: " + .tool_name; "INPUT:\\n" + (.parameters | tojson))
284
+ elif .type == "tool_result" then
285
+ box("tool result"; "STATUS: " + .status + (if .output != null and .output != "" then "\\nOUTPUT:\\n" + .output else "" end))
286
+ else empty end' > ${outputFile} 2>&1`;
287
+ }
288
+ //# sourceMappingURL=agentCommandBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentCommandBuilder.js","sourceRoot":"","sources":["../../../src/utils/agentCommandBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export declare enum ShellType {
7
+ BASH = "bash",
8
+ ZSH = "zsh",
9
+ FISH = "fish",
10
+ POWERSHELL = "powershell",
11
+ UNKNOWN = "unknown"
12
+ }
13
+ export interface ShellConfig {
14
+ type: ShellType;
15
+ configPath: string;
16
+ aliasFormat: string;
17
+ }
18
+ /**
19
+ * Detect the user's current shell
20
+ */
21
+ export declare function detectShell(): Promise<ShellType>;
22
+ /**
23
+ * Get the config file path for a given shell
24
+ */
25
+ export declare function getShellConfigPath(shell: ShellType): string;
26
+ /**
27
+ * Check if an alias already exists in the config file
28
+ */
29
+ export declare function aliasExists(aliasName: string, configPath: string): Promise<boolean>;
30
+ /**
31
+ * Add an alias to the shell config file
32
+ */
33
+ export declare function addAlias(aliasName: string, command: string, configPath: string, shellType: ShellType): Promise<void>;
34
+ /**
35
+ * Remove an alias from the shell config file
36
+ */
37
+ export declare function removeAlias(aliasName: string, configPath: string): Promise<void>;
38
+ /**
39
+ * Get the full shell config for alias operations
40
+ */
41
+ export declare function getShellConfig(): Promise<ShellConfig>;
42
+ /**
43
+ * Format an alias command for a specific shell
44
+ */
45
+ export declare function formatAliasCommand(aliasName: string, command: string, shellType: ShellType): string;
@@ -0,0 +1,221 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'node:fs/promises';
7
+ import * as path from 'node:path';
8
+ import { homedir } from 'node:os';
9
+ import { existsSync } from 'node:fs';
10
+ export var ShellType;
11
+ (function (ShellType) {
12
+ ShellType["BASH"] = "bash";
13
+ ShellType["ZSH"] = "zsh";
14
+ ShellType["FISH"] = "fish";
15
+ ShellType["POWERSHELL"] = "powershell";
16
+ ShellType["UNKNOWN"] = "unknown";
17
+ })(ShellType || (ShellType = {}));
18
+ /**
19
+ * Detect the user's current shell
20
+ */
21
+ export async function detectShell() {
22
+ // Check SHELL environment variable on Unix/Linux/macOS
23
+ const shellEnv = process.env['SHELL'];
24
+ if (shellEnv) {
25
+ const shellName = path.basename(shellEnv).toLowerCase();
26
+ if (shellName.includes('zsh')) {
27
+ return ShellType.ZSH;
28
+ }
29
+ if (shellName.includes('bash')) {
30
+ return ShellType.BASH;
31
+ }
32
+ if (shellName.includes('fish')) {
33
+ return ShellType.FISH;
34
+ }
35
+ }
36
+ // Check for PowerShell on Windows
37
+ if (process.platform === 'win32') {
38
+ if (process.env['PSModulePath']) {
39
+ return ShellType.POWERSHELL;
40
+ }
41
+ }
42
+ // Fallback based on platform
43
+ if (process.platform === 'darwin') {
44
+ // macOS defaults to zsh since Catalina
45
+ return ShellType.ZSH;
46
+ }
47
+ if (process.platform === 'linux') {
48
+ // Linux typically defaults to bash
49
+ return ShellType.BASH;
50
+ }
51
+ return ShellType.UNKNOWN;
52
+ }
53
+ /**
54
+ * Get the config file path for a given shell
55
+ */
56
+ export function getShellConfigPath(shell) {
57
+ const home = homedir();
58
+ switch (shell) {
59
+ case ShellType.BASH:
60
+ // macOS uses .bash_profile, Linux uses .bashrc
61
+ if (process.platform === 'darwin') {
62
+ return path.join(home, '.bash_profile');
63
+ }
64
+ return path.join(home, '.bashrc');
65
+ case ShellType.ZSH:
66
+ return path.join(home, '.zshrc');
67
+ case ShellType.FISH:
68
+ return path.join(home, '.config', 'fish', 'config.fish');
69
+ case ShellType.POWERSHELL:
70
+ // PowerShell profile path
71
+ return path.join(home, 'Documents', 'PowerShell', 'Microsoft.PowerShell_profile.ps1');
72
+ default:
73
+ return '';
74
+ }
75
+ }
76
+ /**
77
+ * Check if an alias already exists in the config file
78
+ */
79
+ export async function aliasExists(aliasName, configPath) {
80
+ try {
81
+ if (!existsSync(configPath)) {
82
+ return false;
83
+ }
84
+ const content = await fs.readFile(configPath, 'utf-8');
85
+ const lines = content.split('\n');
86
+ // Match alias definition: alias name='...' or alias name="..." or alias name=...
87
+ const aliasRegex = new RegExp(`^\\s*alias\\s+${aliasName}[=\\s]`, 'i');
88
+ for (const line of lines) {
89
+ if (aliasRegex.test(line)) {
90
+ return true;
91
+ }
92
+ }
93
+ return false;
94
+ }
95
+ catch {
96
+ // If we can't read the file, assume alias doesn't exist
97
+ return false;
98
+ }
99
+ }
100
+ /**
101
+ * Add an alias to the shell config file
102
+ */
103
+ export async function addAlias(aliasName, command, configPath, shellType) {
104
+ // Check if alias already exists
105
+ const exists = await aliasExists(aliasName, configPath);
106
+ if (exists) {
107
+ throw new Error(`Alias '${aliasName}' already exists in ${configPath}`);
108
+ }
109
+ // Format the alias command
110
+ const aliasCommand = formatAliasCommand(aliasName, command, shellType);
111
+ // Prepare the content to append
112
+ const comment = '# Blackbox CLI alias - added by \'blackbox configure\'';
113
+ const contentToAppend = `\n${comment}\n${aliasCommand}\n`;
114
+ // Ensure directory exists (for fish)
115
+ const dir = path.dirname(configPath);
116
+ await fs.mkdir(dir, { recursive: true });
117
+ // Append to config file
118
+ await fs.appendFile(configPath, contentToAppend, 'utf-8');
119
+ }
120
+ /**
121
+ * Remove an alias from the shell config file
122
+ */
123
+ export async function removeAlias(aliasName, configPath) {
124
+ try {
125
+ if (!existsSync(configPath)) {
126
+ return; // Nothing to remove
127
+ }
128
+ const content = await fs.readFile(configPath, 'utf-8');
129
+ const lines = content.split('\n');
130
+ // Match alias definition and the comment before it
131
+ const aliasRegex = new RegExp(`^\\s*alias\\s+${aliasName}[=\\s]`, 'i');
132
+ const commentRegex = /^\s*#\s*Blackbox CLI alias/i;
133
+ const filteredLines = [];
134
+ let skipNext = false;
135
+ for (let i = 0; i < lines.length; i++) {
136
+ const line = lines[i];
137
+ // Check if this is the comment line
138
+ if (commentRegex.test(line)) {
139
+ // Check if next line is the alias we're looking for
140
+ if (i + 1 < lines.length && aliasRegex.test(lines[i + 1])) {
141
+ skipNext = true;
142
+ continue; // Skip the comment
143
+ }
144
+ }
145
+ // Check if this is the alias line
146
+ if (skipNext && aliasRegex.test(line)) {
147
+ skipNext = false;
148
+ continue; // Skip the alias
149
+ }
150
+ // Check if this is the alias without a comment
151
+ if (aliasRegex.test(line)) {
152
+ continue; // Skip the alias
153
+ }
154
+ filteredLines.push(line);
155
+ }
156
+ // Write back to file
157
+ await fs.writeFile(configPath, filteredLines.join('\n'), 'utf-8');
158
+ // Remove alias from current shell session
159
+ // This ensures the alias is removed immediately without needing to source the config file
160
+ const { exec } = await import('node:child_process');
161
+ const { promisify } = await import('node:util');
162
+ const execAsync = promisify(exec);
163
+ try {
164
+ // Use unalias command to remove from current session's alias list
165
+ await execAsync(`unalias ${aliasName} 2>/dev/null || true`);
166
+ }
167
+ catch {
168
+ // Ignore errors from unalias - it's not critical if it fails
169
+ // (e.g., alias might not be loaded in current session)
170
+ }
171
+ }
172
+ catch (error) {
173
+ throw new Error(`Failed to remove alias: ${error instanceof Error ? error.message : error}`);
174
+ }
175
+ }
176
+ /**
177
+ * Get the full shell config for alias operations
178
+ */
179
+ export async function getShellConfig() {
180
+ const shellType = await detectShell();
181
+ const configPath = getShellConfigPath(shellType);
182
+ const aliasFormat = getAliasFormat(shellType);
183
+ return {
184
+ type: shellType,
185
+ configPath,
186
+ aliasFormat,
187
+ };
188
+ }
189
+ /**
190
+ * Format an alias command for a specific shell
191
+ */
192
+ export function formatAliasCommand(aliasName, command, shellType) {
193
+ switch (shellType) {
194
+ case ShellType.BASH:
195
+ case ShellType.ZSH:
196
+ return `alias ${aliasName}='${command}'`;
197
+ case ShellType.FISH:
198
+ return `alias ${aliasName} '${command}'`;
199
+ case ShellType.POWERSHELL:
200
+ return `Set-Alias -Name ${aliasName} -Value ${command}`;
201
+ default:
202
+ return `alias ${aliasName}='${command}'`;
203
+ }
204
+ }
205
+ /**
206
+ * Get the alias format string for a shell type
207
+ */
208
+ function getAliasFormat(shellType) {
209
+ switch (shellType) {
210
+ case ShellType.BASH:
211
+ case ShellType.ZSH:
212
+ return "alias {name}='{command}'";
213
+ case ShellType.FISH:
214
+ return "alias {name} '{command}'";
215
+ case ShellType.POWERSHELL:
216
+ return "Set-Alias -Name {name} -Value {command}";
217
+ default:
218
+ return "alias {name}='{command}'";
219
+ }
220
+ }
221
+ //# sourceMappingURL=shellShortcut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellShortcut.js","sourceRoot":"","sources":["../../../src/utils/shellShortcut.ts"],"names":[],"mappings":"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"}
@@ -4,27 +4,8 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import fs from 'node:fs/promises';
7
- import * as os from 'node:os';
8
7
  import path from 'node:path';
9
8
  // Individual warning checks
10
- const homeDirectoryCheck = {
11
- id: 'home-directory',
12
- check: async (workspaceRoot) => {
13
- try {
14
- const [workspaceRealPath, homeRealPath] = await Promise.all([
15
- fs.realpath(workspaceRoot),
16
- fs.realpath(os.homedir()),
17
- ]);
18
- if (workspaceRealPath === homeRealPath) {
19
- return 'You are running Blackbox Code in your home directory. It is recommended to run in a project-specific directory.';
20
- }
21
- return null;
22
- }
23
- catch (_err) {
24
- return 'Could not verify the current directory due to a file system error.';
25
- }
26
- },
27
- };
28
9
  const rootDirectoryCheck = {
29
10
  id: 'root-directory',
30
11
  check: async (workspaceRoot) => {
@@ -44,7 +25,6 @@ const rootDirectoryCheck = {
44
25
  };
45
26
  // All warning checks
46
27
  const WARNING_CHECKS = [
47
- homeDirectoryCheck,
48
28
  rootDirectoryCheck,
49
29
  ];
50
30
  export async function getUserStartupWarnings(workspaceRoot) {
@@ -1 +1 @@
1
- {"version":3,"file":"userStartupWarnings.js","sourceRoot":"","sources":["../../../src/utils/userStartupWarnings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,4BAA4B;AAC5B,MAAM,kBAAkB,GAAiB;IACvC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,KAAK,EAAE,aAAqB,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1D,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAC1B,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;aAC1B,CAAC,CAAC;YAEH,IAAI,iBAAiB,KAAK,YAAY,EAAE,CAAC;gBACvC,OAAO,iHAAiH,CAAC;YAC3H,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,IAAa,EAAE,CAAC;YACvB,OAAO,oEAAoE,CAAC;QAC9E,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,kBAAkB,GAAiB;IACvC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,KAAK,EAAE,aAAqB,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,iBAAiB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC3D,MAAM,YAAY,GAChB,yLAAyL,CAAC;YAE5L,gCAAgC;YAChC,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,iBAAiB,EAAE,CAAC;gBAC1D,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,IAAa,EAAE,CAAC;YACvB,OAAO,oEAAoE,CAAC;QAC9E,CAAC;IACH,CAAC;CACF,CAAC;AAEF,qBAAqB;AACrB,MAAM,cAAc,GAA4B;IAC9C,kBAAkB;IAClB,kBAAkB;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,aAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAC1D,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"userStartupWarnings.js","sourceRoot":"","sources":["../../../src/utils/userStartupWarnings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,4BAA4B;AAC5B,MAAM,kBAAkB,GAAiB;IACvC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,KAAK,EAAE,aAAqB,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,iBAAiB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC3D,MAAM,YAAY,GAChB,yLAAyL,CAAC;YAE5L,gCAAgC;YAChC,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,iBAAiB,EAAE,CAAC;gBAC1D,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,IAAa,EAAE,CAAC;YACvB,OAAO,oEAAoE,CAAC;QAC9E,CAAC;IACH,CAAC;CACF,CAAC;AAEF,qBAAqB;AACrB,MAAM,cAAc,GAA4B;IAC9C,kBAAkB;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,aAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAC1D,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAC/C,CAAC"}