@blackbox_ai/blackbox-cli 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.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/package.json +11 -2
- package/dist/src/built-in-extensions/conductor/README.md +242 -0
- package/dist/src/built-in-extensions/conductor/blackbox-extension.json +5 -0
- package/dist/src/built-in-extensions/conductor/commands/conductor/implement.toml +170 -0
- package/dist/src/built-in-extensions/conductor/commands/conductor/newTrack.toml +142 -0
- package/dist/src/built-in-extensions/conductor/commands/conductor/revert.toml +122 -0
- package/dist/src/built-in-extensions/conductor/commands/conductor/setup.toml +424 -0
- package/dist/src/built-in-extensions/conductor/commands/conductor/status.toml +57 -0
- package/dist/src/built-in-extensions/conductor/templates/code_styleguides/general.md +23 -0
- package/dist/src/built-in-extensions/conductor/templates/code_styleguides/go.md +48 -0
- package/dist/src/built-in-extensions/conductor/templates/code_styleguides/html-css.md +49 -0
- package/dist/src/built-in-extensions/conductor/templates/code_styleguides/javascript.md +51 -0
- package/dist/src/built-in-extensions/conductor/templates/code_styleguides/python.md +37 -0
- package/dist/src/built-in-extensions/conductor/templates/code_styleguides/typescript.md +43 -0
- package/dist/src/built-in-extensions/conductor/templates/workflow.md +333 -0
- package/dist/src/built-in-extensions-data.d.ts +15 -0
- package/dist/src/built-in-extensions-data.js +61 -0
- package/dist/src/built-in-extensions-data.js.map +1 -0
- package/dist/src/commands/configure/ConfigureUI.d.ts +5 -2
- package/dist/src/commands/configure/ConfigureUI.js +181 -41
- package/dist/src/commands/configure/ConfigureUI.js.map +1 -1
- package/dist/src/commands/configure/index.js +35 -3
- package/dist/src/commands/configure/index.js.map +1 -1
- package/dist/src/commands/configure.js +20 -3
- package/dist/src/commands/configure.js.map +1 -1
- package/dist/src/commands/extensions/enable.js +1 -1
- package/dist/src/commands/extensions/enable.js.map +1 -1
- package/dist/src/commands/extensions/examples/context/CONTEXT.md +16 -0
- package/dist/src/commands/extensions/examples/context/blackbox-extension.json +5 -0
- package/dist/src/commands/extensions/examples/custom-commands/blackbox-extension.json +4 -0
- package/dist/src/commands/extensions/examples/custom-commands/commands/deploy.toml +12 -0
- package/dist/src/commands/extensions/examples/exclude-tools/README.md +28 -0
- package/dist/src/commands/extensions/examples/exclude-tools/blackbox-extension.json +5 -0
- package/dist/src/commands/extensions/install.d.ts +6 -2
- package/dist/src/commands/extensions/install.js +109 -15
- package/dist/src/commands/extensions/install.js.map +1 -1
- package/dist/src/commands/extensions/link.d.ts +12 -0
- package/dist/src/commands/extensions/link.js +53 -0
- package/dist/src/commands/extensions/link.js.map +1 -0
- package/dist/src/commands/extensions/list.js +2 -2
- package/dist/src/commands/extensions/list.js.map +1 -1
- package/dist/src/commands/extensions/new.d.ts +13 -0
- package/dist/src/commands/extensions/new.js +145 -0
- package/dist/src/commands/extensions/new.js.map +1 -0
- package/dist/src/commands/extensions/settings.d.ts +18 -0
- package/dist/src/commands/extensions/settings.js +98 -0
- package/dist/src/commands/extensions/settings.js.map +1 -0
- package/dist/src/commands/extensions/update.d.ts +2 -1
- package/dist/src/commands/extensions/update.js +59 -10
- package/dist/src/commands/extensions/update.js.map +1 -1
- package/dist/src/commands/extensions/validate.d.ts +12 -0
- package/dist/src/commands/extensions/validate.js +72 -0
- package/dist/src/commands/extensions/validate.js.map +1 -0
- package/dist/src/commands/extensions.js +10 -1
- package/dist/src/commands/extensions.js.map +1 -1
- package/dist/src/commands/mcp/add.d.ts +11 -0
- package/dist/src/commands/mcp/add.js +61 -7
- package/dist/src/commands/mcp/add.js.map +1 -1
- package/dist/src/commands/update.d.ts +7 -0
- package/dist/src/commands/update.js +103 -0
- package/dist/src/commands/update.js.map +1 -0
- package/dist/src/commands/voice.d.ts +7 -0
- package/dist/src/commands/voice.js +510 -0
- package/dist/src/commands/voice.js.map +1 -0
- package/dist/src/config/auth.d.ts +4 -2
- package/dist/src/config/auth.js +36 -1
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/config.d.ts +7 -1
- package/dist/src/config/config.js +68 -9
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.d.ts +6 -1
- package/dist/src/config/extension.js +137 -11
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/extensions/github.d.ts +48 -0
- package/dist/src/config/extensions/github.js +308 -0
- package/dist/src/config/extensions/github.js.map +1 -0
- package/dist/src/config/keyBindings.d.ts +1 -0
- package/dist/src/config/keyBindings.js +3 -0
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/modelFetcher.js +14 -39
- package/dist/src/config/modelFetcher.js.map +1 -1
- package/dist/src/config/settings.js +64 -0
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +351 -0
- package/dist/src/config/settingsSchema.js +351 -0
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/voice.d.ts +31 -0
- package/dist/src/config/voice.js +82 -0
- package/dist/src/config/voice.js.map +1 -0
- 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/bridge.d.ts +30 -0
- package/dist/src/encrypt/bridge.js +32 -0
- package/dist/src/encrypt/bridge.js.map +1 -0
- package/dist/src/encrypt/client.d.ts +14 -0
- package/dist/src/encrypt/client.js +133 -0
- package/dist/src/encrypt/client.js.map +1 -0
- package/dist/src/encrypt/config.d.ts +26 -0
- package/dist/src/encrypt/config.js +51 -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/index.d.ts +12 -0
- package/dist/src/encrypt/index.js +13 -0
- package/dist/src/encrypt/index.js.map +1 -0
- package/dist/src/encrypt/retry-utils.d.ts +20 -0
- package/dist/src/encrypt/retry-utils.js +60 -0
- package/dist/src/encrypt/retry-utils.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 +226 -0
- package/dist/src/encrypt/streaming-client.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/gemini.d.ts +1 -1
- package/dist/src/gemini.js +57 -27
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +3 -3
- package/dist/src/generated/git-commit.js +3 -3
- package/dist/src/nonInteractiveCli.d.ts +4 -0
- package/dist/src/nonInteractiveCli.js +418 -5
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/on-demand-extensions/README.md +266 -0
- package/dist/src/on-demand-extensions/git-helper/README.md +16 -0
- package/dist/src/on-demand-extensions/git-helper/blackbox-extension.json +5 -0
- package/dist/src/on-demand-extensions/git-helper/commands/git/branch-cleanup.toml +18 -0
- package/dist/src/on-demand-extensions/git-helper/commands/git/smart-commit.toml +22 -0
- package/dist/src/on-demand-extensions/greet/README.md +76 -0
- package/dist/src/on-demand-extensions/greet/blackbox-extension.json +5 -0
- package/dist/src/on-demand-extensions/greet/commands/greet/hello.toml +9 -0
- package/dist/src/on-demand-extensions/registry.json +251 -0
- package/dist/src/services/BuiltinCommandLoader.js +20 -2
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/EncryptedContentGenerator.d.ts +63 -0
- package/dist/src/services/EncryptedContentGenerator.js +426 -0
- package/dist/src/services/EncryptedContentGenerator.js.map +1 -0
- package/dist/src/services/McpCommandLoader.d.ts +24 -0
- package/dist/src/services/McpCommandLoader.js +50 -0
- package/dist/src/services/McpCommandLoader.js.map +1 -0
- package/dist/src/services/McpPromptLoader.js +17 -2
- package/dist/src/services/McpPromptLoader.js.map +1 -1
- package/dist/src/services/ReleaseNotesCache.d.ts +57 -0
- package/dist/src/services/ReleaseNotesCache.js +186 -0
- package/dist/src/services/ReleaseNotesCache.js.map +1 -0
- package/dist/src/services/elevenLabsErrors.d.ts +65 -0
- package/dist/src/services/elevenLabsErrors.js +233 -0
- package/dist/src/services/elevenLabsErrors.js.map +1 -0
- package/dist/src/services/elevenLabsService.d.ts +62 -0
- package/dist/src/services/elevenLabsService.js +186 -0
- package/dist/src/services/elevenLabsService.js.map +1 -0
- package/dist/src/services/elevenLabsStreamingService.d.ts +59 -0
- package/dist/src/services/elevenLabsStreamingService.js +202 -0
- package/dist/src/services/elevenLabsStreamingService.js.map +1 -0
- package/dist/src/services/elevenLabsTokenService.d.ts +21 -0
- package/dist/src/services/elevenLabsTokenService.js +42 -0
- package/dist/src/services/elevenLabsTokenService.js.map +1 -0
- package/dist/src/services/voiceInputHandler.d.ts +26 -0
- package/dist/src/services/voiceInputHandler.js +209 -0
- package/dist/src/services/voiceInputHandler.js.map +1 -0
- package/dist/src/services/voiceRecordingService.d.ts +69 -0
- package/dist/src/services/voiceRecordingService.js +397 -0
- package/dist/src/services/voiceRecordingService.js.map +1 -0
- package/dist/src/ui/App.d.ts +1 -0
- package/dist/src/ui/App.js +412 -63
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/commands/browseExtensionsCommand.d.ts +7 -0
- package/dist/src/ui/commands/browseExtensionsCommand.js +16 -0
- package/dist/src/ui/commands/browseExtensionsCommand.js.map +1 -0
- package/dist/src/ui/commands/chatCommand.js +356 -16
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/dbCommand.d.ts +7 -0
- package/dist/src/ui/commands/dbCommand.js +37 -0
- package/dist/src/ui/commands/dbCommand.js.map +1 -0
- package/dist/src/ui/commands/docsCommand.js +1 -1
- package/dist/src/ui/commands/docsCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.js +3 -2
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpInvokeCommand.d.ts +16 -0
- package/dist/src/ui/commands/mcpInvokeCommand.js +263 -0
- package/dist/src/ui/commands/mcpInvokeCommand.js.map +1 -0
- package/dist/src/ui/commands/modelCommand.js +79 -5
- package/dist/src/ui/commands/modelCommand.js.map +1 -1
- package/dist/src/ui/commands/multiAgentCommand.d.ts +7 -0
- package/dist/src/ui/commands/multiAgentCommand.js +833 -0
- package/dist/src/ui/commands/multiAgentCommand.js.map +1 -0
- package/dist/src/ui/commands/multiAgentConfigureCommand.d.ts +7 -0
- package/dist/src/ui/commands/multiAgentConfigureCommand.js +17 -0
- package/dist/src/ui/commands/multiAgentConfigureCommand.js.map +1 -0
- package/dist/src/ui/commands/quitCommand.js +71 -2
- package/dist/src/ui/commands/quitCommand.js.map +1 -1
- package/dist/src/ui/commands/releasesCommand.d.ts +7 -0
- package/dist/src/ui/commands/releasesCommand.js +16 -0
- package/dist/src/ui/commands/releasesCommand.js.map +1 -0
- package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
- package/dist/src/ui/commands/shellPermissionsCommand.d.ts +7 -0
- package/dist/src/ui/commands/shellPermissionsCommand.js +109 -0
- package/dist/src/ui/commands/shellPermissionsCommand.js.map +1 -0
- package/dist/src/ui/commands/skillCommand.d.ts +7 -0
- package/dist/src/ui/commands/skillCommand.js +240 -0
- package/dist/src/ui/commands/skillCommand.js.map +1 -0
- package/dist/src/ui/commands/statsCommand.js +243 -1
- package/dist/src/ui/commands/statsCommand.js.map +1 -1
- package/dist/src/ui/commands/tasksCommand.d.ts +7 -0
- package/dist/src/ui/commands/tasksCommand.js +535 -0
- package/dist/src/ui/commands/tasksCommand.js.map +1 -0
- package/dist/src/ui/commands/toolPermissionsCommand.d.ts +7 -0
- package/dist/src/ui/commands/toolPermissionsCommand.js +408 -0
- package/dist/src/ui/commands/toolPermissionsCommand.js.map +1 -0
- package/dist/src/ui/commands/types.d.ts +10 -2
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/commands/voiceCommand.d.ts +7 -0
- package/dist/src/ui/commands/voiceCommand.js +525 -0
- package/dist/src/ui/commands/voiceCommand.js.map +1 -0
- package/dist/src/ui/components/AuthDialog.d.ts +5 -4
- package/dist/src/ui/components/AuthDialog.js +89 -52
- package/dist/src/ui/components/AuthDialog.js.map +1 -1
- package/dist/src/ui/components/AuthInProgress.js +3 -1
- package/dist/src/ui/components/AuthInProgress.js.map +1 -1
- package/dist/src/ui/components/ExtensionsDialog.d.ts +11 -0
- package/dist/src/ui/components/ExtensionsDialog.js +303 -0
- package/dist/src/ui/components/ExtensionsDialog.js.map +1 -0
- package/dist/src/ui/components/GenericProviderKeyPrompt.d.ts +3 -1
- package/dist/src/ui/components/GenericProviderKeyPrompt.js +17 -4
- package/dist/src/ui/components/GenericProviderKeyPrompt.js.map +1 -1
- package/dist/src/ui/components/Header.js +10 -1
- package/dist/src/ui/components/Header.js.map +1 -1
- package/dist/src/ui/components/HistoryBrowserDialog.d.ts +15 -0
- package/dist/src/ui/components/HistoryBrowserDialog.js +166 -0
- package/dist/src/ui/components/HistoryBrowserDialog.js.map +1 -0
- package/dist/src/ui/components/HistoryItemDisplay.js +13 -1
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +22 -8
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.d.ts +4 -0
- package/dist/src/ui/components/LoadingIndicator.js +16 -4
- package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.test.js +108 -16
- package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/components/ModelSelectionDialog.d.ts +2 -0
- package/dist/src/ui/components/ModelSelectionDialog.js +33 -4
- package/dist/src/ui/components/ModelSelectionDialog.js.map +1 -1
- package/dist/src/ui/components/ModelSelectionDialog.test.js +41 -4
- package/dist/src/ui/components/ModelSelectionDialog.test.js.map +1 -1
- package/dist/src/ui/components/ReleaseNotesDialog.d.ts +23 -0
- package/dist/src/ui/components/ReleaseNotesDialog.js +150 -0
- package/dist/src/ui/components/ReleaseNotesDialog.js.map +1 -0
- package/dist/src/ui/components/ReleaseNotesDisplay.d.ts +18 -0
- package/dist/src/ui/components/ReleaseNotesDisplay.js +14 -0
- package/dist/src/ui/components/ReleaseNotesDisplay.js.map +1 -0
- package/dist/src/ui/components/SessionSummaryDisplay.d.ts +2 -0
- package/dist/src/ui/components/SessionSummaryDisplay.js +1 -1
- package/dist/src/ui/components/SessionSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.d.ts +3 -1
- package/dist/src/ui/components/SettingsDialog.js +17 -7
- package/dist/src/ui/components/SettingsDialog.js.map +1 -1
- package/dist/src/ui/components/ShellConfirmationDialog.d.ts +2 -0
- package/dist/src/ui/components/ShellConfirmationDialog.js +7 -3
- package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
- package/dist/src/ui/components/StatsDisplay.d.ts +2 -0
- package/dist/src/ui/components/StatsDisplay.js +92 -7
- package/dist/src/ui/components/StatsDisplay.js.map +1 -1
- package/dist/src/ui/components/SuggestionsDisplay.js +6 -1
- package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
- package/dist/src/ui/components/ThemeDialog.d.ts +3 -1
- package/dist/src/ui/components/ThemeDialog.js +5 -2
- package/dist/src/ui/components/ThemeDialog.js.map +1 -1
- package/dist/src/ui/components/Tips.js +1 -4
- package/dist/src/ui/components/Tips.js.map +1 -1
- package/dist/src/ui/components/TodoListDialog.d.ts +13 -0
- package/dist/src/ui/components/TodoListDialog.js +29 -0
- package/dist/src/ui/components/TodoListDialog.js.map +1 -0
- package/dist/src/ui/components/TodoListDialog.test.d.ts +6 -0
- package/dist/src/ui/components/TodoListDialog.test.js +60 -0
- package/dist/src/ui/components/TodoListDialog.test.js.map +1 -0
- package/dist/src/ui/components/VoiceConfigDialog.d.ts +17 -0
- package/dist/src/ui/components/VoiceConfigDialog.js +47 -0
- package/dist/src/ui/components/VoiceConfigDialog.js.map +1 -0
- package/dist/src/ui/components/messages/GeminiMessage.js +4 -0
- package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
- package/dist/src/ui/components/messages/GeminiMessageContent.js +4 -0
- package/dist/src/ui/components/messages/GeminiMessageContent.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +2 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +96 -9
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js +3 -3
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.test.js +9 -12
- package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
- package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.d.ts +25 -0
- package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.js +179 -0
- package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.js.map +1 -0
- package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +3 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.js +57 -18
- package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
- package/dist/src/ui/components/shared/TextInput.d.ts +2 -1
- package/dist/src/ui/components/shared/TextInput.js +5 -2
- package/dist/src/ui/components/shared/TextInput.js.map +1 -1
- package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.js +3 -3
- package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.js.map +1 -1
- package/dist/src/ui/constants.d.ts +3 -3
- package/dist/src/ui/constants.js +3 -3
- package/dist/src/ui/constants.js.map +1 -1
- package/dist/src/ui/contexts/SessionContext.d.ts +6 -0
- package/dist/src/ui/contexts/SessionContext.js +24 -2
- package/dist/src/ui/contexts/SessionContext.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.js +139 -57
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +189 -17
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAdaptiveStream.d.ts +42 -0
- package/dist/src/ui/hooks/useAdaptiveStream.js +31 -0
- package/dist/src/ui/hooks/useAdaptiveStream.js.map +1 -0
- package/dist/src/ui/hooks/useAtCompletion.js +20 -4
- package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useAuthCommand.d.ts +2 -2
- package/dist/src/ui/hooks/useAuthCommand.js +99 -5
- package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.js +14 -10
- package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useDialogClose.d.ts +10 -0
- package/dist/src/ui/hooks/useDialogClose.js +25 -0
- package/dist/src/ui/hooks/useDialogClose.js.map +1 -1
- package/dist/src/ui/hooks/useDialogCloseAnimation.d.ts +22 -0
- package/dist/src/ui/hooks/useDialogCloseAnimation.js +68 -0
- package/dist/src/ui/hooks/useDialogCloseAnimation.js.map +1 -0
- package/dist/src/ui/hooks/useEncryptedStream.d.ts +22 -0
- package/dist/src/ui/hooks/useEncryptedStream.js +378 -0
- package/dist/src/ui/hooks/useEncryptedStream.js.map +1 -0
- package/dist/src/ui/hooks/useExtensionsDialog.d.ts +10 -0
- package/dist/src/ui/hooks/useExtensionsDialog.js +21 -0
- package/dist/src/ui/hooks/useExtensionsDialog.js.map +1 -0
- package/dist/src/ui/hooks/useGeminiStream.js +4 -2
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.js +3 -2
- package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +27 -5
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/useMultiAgentConfigCommand.d.ts +10 -0
- package/dist/src/ui/hooks/useMultiAgentConfigCommand.js +21 -0
- package/dist/src/ui/hooks/useMultiAgentConfigCommand.js.map +1 -0
- package/dist/src/ui/hooks/useReleasesDialog.d.ts +20 -0
- package/dist/src/ui/hooks/useReleasesDialog.js +214 -0
- package/dist/src/ui/hooks/useReleasesDialog.js.map +1 -0
- package/dist/src/ui/hooks/useSlashCompletion.js +10 -8
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useTodoList.d.ts +17 -0
- package/dist/src/ui/hooks/useTodoList.js +51 -0
- package/dist/src/ui/hooks/useTodoList.js.map +1 -0
- package/dist/src/ui/keyMatchers.test.js +6 -0
- package/dist/src/ui/keyMatchers.test.js.map +1 -1
- package/dist/src/ui/themes/blackbox-dark.js +1 -1
- package/dist/src/ui/themes/blackbox-dark.js.map +1 -1
- package/dist/src/ui/themes/blackbox-light.js +1 -1
- package/dist/src/ui/themes/blackbox-light.js.map +1 -1
- package/dist/src/ui/types.d.ts +15 -2
- package/dist/src/ui/types.js +1 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/computeStats.d.ts +25 -1
- package/dist/src/ui/utils/computeStats.js +58 -1
- package/dist/src/ui/utils/computeStats.js.map +1 -1
- package/dist/src/ui/utils/updateCheck.js +37 -54
- package/dist/src/ui/utils/updateCheck.js.map +1 -1
- package/dist/src/utils/backgroundUpdateCheck.d.ts +15 -0
- package/dist/src/utils/backgroundUpdateCheck.js +48 -0
- package/dist/src/utils/backgroundUpdateCheck.js.map +1 -0
- package/dist/src/utils/gitAutoDetect.d.ts +16 -0
- package/dist/src/utils/gitAutoDetect.js +45 -0
- package/dist/src/utils/gitAutoDetect.js.map +1 -0
- package/dist/src/utils/installationInfo.d.ts +1 -0
- package/dist/src/utils/installationInfo.js +24 -4
- package/dist/src/utils/installationInfo.js.map +1 -1
- package/dist/src/utils/preLaunchUpdateCheck.d.ts +17 -0
- package/dist/src/utils/preLaunchUpdateCheck.js +75 -0
- package/dist/src/utils/preLaunchUpdateCheck.js.map +1 -0
- package/dist/src/utils/version.js +12 -1
- package/dist/src/utils/version.js.map +1 -1
- package/dist/src/utils/versionStorage.d.ts +50 -0
- package/dist/src/utils/versionStorage.js +224 -0
- package/dist/src/utils/versionStorage.js.map +1 -0
- package/dist/src/validateNonInterActiveAuth.js +10 -3
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/src/virtual-extensions.d.ts +14 -0
- package/dist/src/virtual-extensions.js +56 -0
- package/dist/src/virtual-extensions.js.map +1 -0
- package/dist/src/zed-integration/fileSystemService.d.ts +3 -3
- package/dist/src/zed-integration/fileSystemService.js +5 -7
- package/dist/src/zed-integration/fileSystemService.js.map +1 -1
- package/dist/src/zed-integration/zedIntegration.js +62 -17
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -2
- package/dist/src/utils/handleAutoUpdate.d.ts +0 -11
- package/dist/src/utils/handleAutoUpdate.js +0 -102
- package/dist/src/utils/handleAutoUpdate.js.map +0 -1
- package/dist/src/utils/updateEventEmitter.d.ts +0 -11
- package/dist/src/utils/updateEventEmitter.js +0 -12
- package/dist/src/utils/updateEventEmitter.js.map +0 -1
- package/dist/src/zed-integration/acp.d.ts +0 -63
- package/dist/src/zed-integration/acp.js +0 -226
- package/dist/src/zed-integration/acp.js.map +0 -1
- package/dist/src/zed-integration/schema.d.ts +0 -11782
- package/dist/src/zed-integration/schema.js +0 -311
- package/dist/src/zed-integration/schema.js.map +0 -1
|
@@ -0,0 +1,833 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Blackbox
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { CommandKind } from './types.js';
|
|
7
|
+
import { getDefaultModelForAgent, getModelDisplayName, isGitRepository } from '@blackbox_ai/blackbox-cli-core';
|
|
8
|
+
export const multiAgentCommand = {
|
|
9
|
+
name: 'multi-agent',
|
|
10
|
+
description: 'Set up parallel AI agent execution. Usage: /multi-agent <task>',
|
|
11
|
+
kind: CommandKind.BUILT_IN,
|
|
12
|
+
action: async (context, args) => {
|
|
13
|
+
const task = args.trim();
|
|
14
|
+
if (!task) {
|
|
15
|
+
return {
|
|
16
|
+
type: 'message',
|
|
17
|
+
messageType: 'error',
|
|
18
|
+
content: 'Please provide a task. Usage: /multi-agent <task description>',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
// Detect if we're in a git repository
|
|
22
|
+
const isGitRepo = isGitRepository(process.cwd());
|
|
23
|
+
// Get Blackbox API key from environment (set by auth system)
|
|
24
|
+
const blackboxApiKey = process.env['BLACKBOX_API_KEY'];
|
|
25
|
+
if (!blackboxApiKey) {
|
|
26
|
+
return {
|
|
27
|
+
type: 'message',
|
|
28
|
+
messageType: 'error',
|
|
29
|
+
content: 'Blackbox API key not found. Please configure your Blackbox authentication first using the /auth command.',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// Check for OpenAI API key (required for Codex agent - only sk- keys supported)
|
|
33
|
+
const openaiApiKey = process.env['OPENAI_API_KEY'];
|
|
34
|
+
const hasOpenAIKey = !!openaiApiKey && openaiApiKey.startsWith('sk-');
|
|
35
|
+
// Check for Gemini API key (required for Gemini agent)
|
|
36
|
+
const geminiApiKey = process.env['GEMINI_API_KEY'];
|
|
37
|
+
const hasGeminiKey = !!geminiApiKey;
|
|
38
|
+
// Get agent configurations from settings - access the merged settings properly
|
|
39
|
+
const settings = context.services.settings;
|
|
40
|
+
const multiAgentSettings = settings.merged?.multiAgent || {};
|
|
41
|
+
// Debug: Log the actual settings being read
|
|
42
|
+
console.log('[DEBUG] Full settings object:', JSON.stringify(settings.merged, null, 2));
|
|
43
|
+
console.log('[DEBUG] Multi-agent settings:', JSON.stringify(multiAgentSettings, null, 2));
|
|
44
|
+
// Read the actual enabled states from settings
|
|
45
|
+
// Only default to true if NO configuration exists at all (backward compatibility)
|
|
46
|
+
const hasAnyConfig = multiAgentSettings && Object.keys(multiAgentSettings).length > 0;
|
|
47
|
+
const blackboxEnabled = hasAnyConfig
|
|
48
|
+
? (multiAgentSettings.blackbox?.enabled === true) // Explicit true check
|
|
49
|
+
: true; // Default only when no config exists
|
|
50
|
+
const blackboxModel = multiAgentSettings.blackbox?.model || getDefaultModelForAgent('blackbox');
|
|
51
|
+
const claudeEnabled = hasAnyConfig
|
|
52
|
+
? (multiAgentSettings.claude?.enabled === true) // Explicit true check
|
|
53
|
+
: true; // Default only when no config exists
|
|
54
|
+
const claudeModel = multiAgentSettings.claude?.model || getDefaultModelForAgent('claude');
|
|
55
|
+
// Codex requires OpenAI API key
|
|
56
|
+
const codexEnabled = hasAnyConfig
|
|
57
|
+
? (multiAgentSettings.codex?.enabled === true && hasOpenAIKey) // Explicit true check
|
|
58
|
+
: hasOpenAIKey; // Default only when no config exists
|
|
59
|
+
const codexModel = multiAgentSettings.codex?.model || getDefaultModelForAgent('codex');
|
|
60
|
+
// Gemini requires GEMINI_API_KEY
|
|
61
|
+
const geminiEnabled = hasAnyConfig
|
|
62
|
+
? (multiAgentSettings.gemini?.enabled === true && hasGeminiKey) // Explicit true check
|
|
63
|
+
: hasGeminiKey; // Default only when no config exists
|
|
64
|
+
const geminiModel = multiAgentSettings.gemini?.model || getDefaultModelForAgent('gemini');
|
|
65
|
+
// Debug: Log what was determined
|
|
66
|
+
console.log('[DEBUG] Determined enabled states:', {
|
|
67
|
+
blackboxEnabled,
|
|
68
|
+
claudeEnabled,
|
|
69
|
+
codexEnabled,
|
|
70
|
+
geminiEnabled,
|
|
71
|
+
hasOpenAIKey,
|
|
72
|
+
hasGeminiKey
|
|
73
|
+
});
|
|
74
|
+
// Check if at least one agent is enabled
|
|
75
|
+
if (!blackboxEnabled && !claudeEnabled && !codexEnabled && !geminiEnabled) {
|
|
76
|
+
return {
|
|
77
|
+
type: 'message',
|
|
78
|
+
messageType: 'error',
|
|
79
|
+
content: 'At least one agent must be enabled. Please check your multi-agent settings. You can enable agents using the /multi-agent-configure command.',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Extract model name for Codex config (remove provider prefix)
|
|
83
|
+
const codexModelName = codexModel.split('/').pop() || 'gpt-5-codex';
|
|
84
|
+
// Codex configuration (only for OpenAI API keys starting with sk-)
|
|
85
|
+
const codexConfigToml = `model = "${codexModelName}"
|
|
86
|
+
model_provider = "openai"
|
|
87
|
+
|
|
88
|
+
[model_providers.openai]
|
|
89
|
+
name = "OpenAI"
|
|
90
|
+
base_url = "https://api.openai.com/v1"
|
|
91
|
+
env_key = "OPENAI_API_KEY"
|
|
92
|
+
wire_api = "responses"
|
|
93
|
+
|
|
94
|
+
[debug]
|
|
95
|
+
log_requests = true`;
|
|
96
|
+
// Get display names for models
|
|
97
|
+
const blackboxDisplayName = getModelDisplayName(blackboxModel);
|
|
98
|
+
const claudeDisplayName = getModelDisplayName(claudeModel);
|
|
99
|
+
const codexDisplayName = getModelDisplayName(codexModel);
|
|
100
|
+
const geminiDisplayName = getModelDisplayName(geminiModel);
|
|
101
|
+
// Generate timestamp for unique branch/directory names
|
|
102
|
+
const timestamp = Date.now();
|
|
103
|
+
// Build list of enabled agents for display
|
|
104
|
+
const enabledAgents = [];
|
|
105
|
+
if (blackboxEnabled)
|
|
106
|
+
enabledAgents.push('Blackbox');
|
|
107
|
+
if (claudeEnabled)
|
|
108
|
+
enabledAgents.push('Claude');
|
|
109
|
+
if (codexEnabled)
|
|
110
|
+
enabledAgents.push('Codex');
|
|
111
|
+
if (geminiEnabled)
|
|
112
|
+
enabledAgents.push('Gemini');
|
|
113
|
+
// Build configuration display
|
|
114
|
+
const configLines = [];
|
|
115
|
+
if (blackboxEnabled)
|
|
116
|
+
configLines.push(`- Blackbox Agent: ${blackboxDisplayName}`);
|
|
117
|
+
if (claudeEnabled)
|
|
118
|
+
configLines.push(`- Claude Agent: ${claudeDisplayName}`);
|
|
119
|
+
if (codexEnabled)
|
|
120
|
+
configLines.push(`- Codex Agent: ${codexDisplayName}`);
|
|
121
|
+
if (geminiEnabled)
|
|
122
|
+
configLines.push(`- Gemini Agent: ${geminiDisplayName}`);
|
|
123
|
+
if (!codexEnabled && multiAgentSettings.codex?.enabled !== false && !hasOpenAIKey) {
|
|
124
|
+
configLines.push('- Codex Agent: Disabled (requires OPENAI_API_KEY)');
|
|
125
|
+
}
|
|
126
|
+
if (!geminiEnabled && multiAgentSettings.gemini?.enabled !== false && !hasGeminiKey) {
|
|
127
|
+
configLines.push('- Gemini Agent: Disabled (requires GEMINI_API_KEY)');
|
|
128
|
+
}
|
|
129
|
+
// Generate instructions based on whether we're in a git repository
|
|
130
|
+
if (isGitRepo) {
|
|
131
|
+
// GIT REPOSITORY: Use existing git worktree approach (no changes to preserve existing behavior)
|
|
132
|
+
return generateGitWorkflowInstructions(task, timestamp, enabledAgents, configLines, blackboxEnabled, claudeEnabled, codexEnabled, geminiEnabled, blackboxDisplayName, claudeDisplayName, codexDisplayName, geminiDisplayName, blackboxModel, claudeModel, codexModel, geminiModel, blackboxApiKey, openaiApiKey, geminiApiKey, hasOpenAIKey, hasGeminiKey, codexConfigToml, multiAgentSettings);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// NON-GIT DIRECTORY: Use new in-place workflow
|
|
136
|
+
return generateNonGitWorkflowInstructions(task, timestamp, enabledAgents, configLines, blackboxEnabled, claudeEnabled, codexEnabled, geminiEnabled, blackboxDisplayName, claudeDisplayName, codexDisplayName, geminiDisplayName, blackboxModel, claudeModel, codexModel, geminiModel, blackboxApiKey, openaiApiKey, geminiApiKey, hasOpenAIKey, hasGeminiKey, codexConfigToml, multiAgentSettings);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Generates instructions for git repository workflow (existing behavior - unchanged)
|
|
142
|
+
*/
|
|
143
|
+
function generateGitWorkflowInstructions(task, timestamp, enabledAgents, configLines, blackboxEnabled, claudeEnabled, codexEnabled, geminiEnabled, blackboxDisplayName, claudeDisplayName, codexDisplayName, geminiDisplayName, blackboxModel, claudeModel, codexModel, geminiModel, blackboxApiKey, openaiApiKey, geminiApiKey, hasOpenAIKey, hasGeminiKey, codexConfigToml, _multiAgentSettings) {
|
|
144
|
+
const instructions = `I need to set up parallel AI agent execution for the following task: "${task}"
|
|
145
|
+
|
|
146
|
+
**Configuration:**
|
|
147
|
+
${configLines.join('\n')}
|
|
148
|
+
- API: https://api.blackbox.ai (Blackbox API Gateway)
|
|
149
|
+
- Enabled Agents: ${enabledAgents.join(', ')}
|
|
150
|
+
|
|
151
|
+
${!hasOpenAIKey ? 'Add a note to the user saying To enable Codex agent, set the OPENAI_API_KEY environment variable with your OpenAI API key (must start with sk-).\n' : ''}
|
|
152
|
+
${!hasGeminiKey ? 'Add a note to the user saying To enable Gemini agent, set the GEMINI_API_KEY environment variable with your Gemini API key.\n' : ''}
|
|
153
|
+
**CRITICAL:** You MUST ONLY execute steps for these ${enabledAgents.length} enabled agent(s): ${enabledAgents.join(', ')}.
|
|
154
|
+
DO NOT create worktrees, check CLIs, or run commands for any other agents. Ignore any disabled agents completely.
|
|
155
|
+
|
|
156
|
+
Please follow these steps using the shell tool:
|
|
157
|
+
|
|
158
|
+
1. **Check CLI installations and install if needed (ONLY for enabled agents):**
|
|
159
|
+
${claudeEnabled ? ` - Check Claude CLI:
|
|
160
|
+
\`\`\`
|
|
161
|
+
which claude || (echo "Claude CLI not found. Installing..." && npm install -g @anthropic-ai/claude-code)
|
|
162
|
+
\`\`\`
|
|
163
|
+
` : ''}${codexEnabled ? ` - Check Codex CLI:
|
|
164
|
+
\`\`\`
|
|
165
|
+
which codex || (echo "Codex CLI not found. Installing..." && npm install -g @openai/codex)
|
|
166
|
+
\`\`\`
|
|
167
|
+
` : ''}${geminiEnabled ? ` - Check Gemini CLI:
|
|
168
|
+
\`\`\`
|
|
169
|
+
which gemini || (echo "Gemini CLI not found. Installing..." && npm install -g @google/gemini-cli)
|
|
170
|
+
\`\`\`
|
|
171
|
+
` : ''}${!claudeEnabled && !codexEnabled && !geminiEnabled ? ' - No CLI checks needed (Blackbox CLI is built-in)\n' : ''}
|
|
172
|
+
|
|
173
|
+
2. **Create Git worktrees for each enabled agent:**
|
|
174
|
+
${blackboxEnabled ? `- For blackbox agent:
|
|
175
|
+
\`\`\`
|
|
176
|
+
git worktree add /tmp/blackbox-multi-agent-blackbox-${timestamp} -b blackboxai/multi-agent-blackbox-${timestamp}
|
|
177
|
+
\`\`\`` : ''}
|
|
178
|
+
|
|
179
|
+
${claudeEnabled ? `- For claude agent:
|
|
180
|
+
\`\`\`
|
|
181
|
+
git worktree add /tmp/blackbox-multi-agent-claude-${timestamp} -b blackboxai/multi-agent-claude-${timestamp}
|
|
182
|
+
\`\`\`` : ''}
|
|
183
|
+
|
|
184
|
+
${codexEnabled ? `- For codex agent:
|
|
185
|
+
\`\`\`
|
|
186
|
+
git worktree add /tmp/blackbox-multi-agent-codex-${timestamp} -b blackboxai/multi-agent-codex-${timestamp}
|
|
187
|
+
\`\`\`` : ''}
|
|
188
|
+
|
|
189
|
+
${geminiEnabled ? `- For gemini agent:
|
|
190
|
+
\`\`\`
|
|
191
|
+
git worktree add /tmp/blackbox-multi-agent-gemini-${timestamp} -b blackboxai/multi-agent-gemini-${timestamp}
|
|
192
|
+
\`\`\`` : ''}
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
- Use the current branch as the base for all worktrees (to inherit existing code context). Make sure to stash any uncommitted changes before creating worktrees.
|
|
196
|
+
|
|
197
|
+
${codexEnabled ? `3. **Set up Codex CLI configuration** (using OpenAI API):
|
|
198
|
+
\`\`\`
|
|
199
|
+
mkdir -p ~/.codex && cat > ~/.codex/config.toml << 'EOF'
|
|
200
|
+
${codexConfigToml}
|
|
201
|
+
EOF
|
|
202
|
+
\`\`\`` : ''}
|
|
203
|
+
|
|
204
|
+
${codexEnabled || geminiEnabled ? '4' : '3'}. **Run all enabled agents in parallel** (use background processes with &):
|
|
205
|
+
${blackboxEnabled ? `- Blackbox agent (using ${blackboxDisplayName}):
|
|
206
|
+
\`\`\`
|
|
207
|
+
cd /tmp/blackbox-multi-agent-blackbox-${timestamp} && blackbox -p "${task}" -y > /tmp/blackbox-output-${timestamp}.log 2>&1 &
|
|
208
|
+
\`\`\`` : ''}
|
|
209
|
+
|
|
210
|
+
${claudeEnabled ? `- Claude agent (using ${claudeDisplayName}, with enhanced jq parsing for readable output):
|
|
211
|
+
\`\`\`
|
|
212
|
+
cd /tmp/blackbox-multi-agent-claude-${timestamp} && ANTHROPIC_API_KEY="${blackboxApiKey}" ANTHROPIC_BASE_URL="https://api.blackbox.ai" claude --model "${claudeModel}" -p --output-format=stream-json --dangerously-skip-permissions --verbose '${task.replace(/'/g, "'\\''")}' 2>&1 | jq -r '
|
|
213
|
+
if .type == "assistant" and .message.content then
|
|
214
|
+
.message.content[] |
|
|
215
|
+
if .type == "text" then .text
|
|
216
|
+
elif .type == "tool_use" then
|
|
217
|
+
"+-------------------------------------------------------------+\\n" +
|
|
218
|
+
"| 🔧 TOOL USE: \\(.name)\\n" +
|
|
219
|
+
"+-------------------------------------------------------------+\\n" +
|
|
220
|
+
"| Input:\\n" +
|
|
221
|
+
((.input | @json | split("\\n")) | map("| " + .) | join("\\n")) + "\\n" +
|
|
222
|
+
"+-------------------------------------------------------------+\\n"
|
|
223
|
+
else empty
|
|
224
|
+
end
|
|
225
|
+
elif .type == "user" and .message.content then
|
|
226
|
+
.message.content[] |
|
|
227
|
+
if .type == "tool_result" then
|
|
228
|
+
"\\n" +
|
|
229
|
+
((.content | split("\\n")) as $lines |
|
|
230
|
+
if ($lines | length) > 10 then
|
|
231
|
+
($lines[:10] | join("\\n")) + "\\n" +
|
|
232
|
+
"\\n... (\\($lines | length - 10) more lines hidden) ...\\n"
|
|
233
|
+
else
|
|
234
|
+
$lines | join("\\n")
|
|
235
|
+
end) +
|
|
236
|
+
"\\n"
|
|
237
|
+
else empty
|
|
238
|
+
end
|
|
239
|
+
else empty
|
|
240
|
+
end
|
|
241
|
+
' > /tmp/claude-output-${timestamp}.log 2>&1 &
|
|
242
|
+
\`\`\`
|
|
243
|
+
|
|
244
|
+
Note: The enhanced jq command parses Claude's stream-json format with visual separators (using --unbuffered for real-time streaming):
|
|
245
|
+
- Extracts clean text from AI responses
|
|
246
|
+
- Shows tool calls with 🔧 icon in bordered boxes
|
|
247
|
+
- Displays formatted JSON input for each tool use
|
|
248
|
+
- Shows tool results with truncation (first 10 lines, then summary)
|
|
249
|
+
- Creates structured, readable output` : ''}
|
|
250
|
+
|
|
251
|
+
${codexEnabled ? `- Codex agent (using ${codexDisplayName}, with OpenAI API key):
|
|
252
|
+
\`\`\`
|
|
253
|
+
cd /tmp/blackbox-multi-agent-codex-${timestamp} && echo "${openaiApiKey}" | codex login --with-api-key && codex exec --dangerously-bypass-approvals-and-sandbox '${task.replace(/'/g, "'\\''")}' > /tmp/codex-output-${timestamp}.log 2>&1 &
|
|
254
|
+
\`\`\`` : ''}
|
|
255
|
+
|
|
256
|
+
${geminiEnabled ? `- Gemini agent (using ${geminiDisplayName}, with GEMINI_API_KEY):
|
|
257
|
+
\`\`\`
|
|
258
|
+
cd /tmp/blackbox-multi-agent-gemini-${timestamp} && GEMINI_API_KEY="${geminiApiKey}" gemini --model "${geminiModel}" --yolo '${task.replace(/'/g, "'\\''")}' --output-format stream-json | jq -r '
|
|
259
|
+
def hr(n): ("─" * n);
|
|
260
|
+
|
|
261
|
+
def box(title; body):
|
|
262
|
+
"\\n┌" + hr(78) + "┐\\n" +
|
|
263
|
+
"│ " + (title | ascii_upcase) + (" " * (77 - (title|length))) + "│\\n" +
|
|
264
|
+
"├" + hr(78) + "┤\\n" +
|
|
265
|
+
(body
|
|
266
|
+
| split("\\n")
|
|
267
|
+
| map("│ " + . + (" " * (77 - (. | length))))
|
|
268
|
+
| join("\\n")
|
|
269
|
+
) +
|
|
270
|
+
"\\n└" + hr(78) + "┘";
|
|
271
|
+
|
|
272
|
+
if .type == "message" and .role == "assistant" then
|
|
273
|
+
box("assistant"; .content)
|
|
274
|
+
elif .type == "tool_use" then
|
|
275
|
+
box("tool call: " + .tool_name; "INPUT:\\n" + (.parameters | tojson))
|
|
276
|
+
elif .type == "tool_result" then
|
|
277
|
+
box("tool result"; "STATUS: " + .status + (if .output != null and .output != "" then "\\nOUTPUT:\\n" + .output else "" end))
|
|
278
|
+
else empty end' > /tmp/gemini-output-${timestamp}.log 2>&1 &
|
|
279
|
+
\`\`\`` : ''}
|
|
280
|
+
|
|
281
|
+
${codexEnabled || geminiEnabled ? '5' : '4'}. **Monitor the agents' progress:**
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
The agents are now running in the background. You can check their progress by:
|
|
285
|
+
|
|
286
|
+
- Checking if processes are still running:
|
|
287
|
+
\`\`\`
|
|
288
|
+
ps aux | grep -E "(${enabledAgents.map(a => a.toLowerCase()).join('|')})" | grep -v grep
|
|
289
|
+
\`\`\`
|
|
290
|
+
|
|
291
|
+
- Viewing the last 20 lines from each enabled agent's log:
|
|
292
|
+
\`\`\`
|
|
293
|
+
${blackboxEnabled ? `echo "=== Blackbox Agent (${blackboxDisplayName}) ===" && tail -20 /tmp/blackbox-output-${timestamp}.log 2>/dev/null || echo "No output yet"` : ''}
|
|
294
|
+
${claudeEnabled ? `echo "" && echo "=== Claude Agent (${claudeDisplayName}, Enhanced Format) ===" && tail -20 /tmp/claude-output-${timestamp}.log 2>/dev/null || echo "No Claude output yet"` : ''}
|
|
295
|
+
${codexEnabled ? `echo "" && echo "=== Codex Agent (${codexDisplayName}) ===" && tail -20 /tmp/codex-output-${timestamp}.log 2>/dev/null || echo "No output yet"` : ''}
|
|
296
|
+
${geminiEnabled ? `echo "" && echo "=== Gemini Agent (${geminiDisplayName}) ===" && tail -20 /tmp/gemini-output-${timestamp}.log 2>/dev/null || echo "No output yet"` : ''}
|
|
297
|
+
\`\`\`
|
|
298
|
+
|
|
299
|
+
${claudeEnabled ? '**Important**: The Claude output is already formatted with enhanced visual separators in the log file.\n' : ''}
|
|
300
|
+
Periodically check the logs every 30-60 seconds to show progress updates to the user.
|
|
301
|
+
|
|
302
|
+
${codexEnabled ? '6' : '5'}. **After completion:**
|
|
303
|
+
- Show the results from all enabled agents
|
|
304
|
+
- List the branches created:
|
|
305
|
+
\`\`\`
|
|
306
|
+
git branch | grep blackboxai/multi-agent
|
|
307
|
+
\`\`\`
|
|
308
|
+
- Show changes from each branch:
|
|
309
|
+
\`\`\`
|
|
310
|
+
${blackboxEnabled ? `echo "=== Blackbox Changes ==="; git diff blackboxai/multi-agent-blackbox-${timestamp}; echo ""` : ''}
|
|
311
|
+
${claudeEnabled ? `echo "=== Claude Changes ==="; git diff blackboxai/multi-agent-claude-${timestamp}; echo ""` : ''}
|
|
312
|
+
${codexEnabled ? `echo "=== Codex Changes ==="; git diff blackboxai/multi-agent-codex-${timestamp}; echo ""` : ''}
|
|
313
|
+
${geminiEnabled ? `echo "=== Gemini Changes ==="; git diff blackboxai/multi-agent-gemini-${timestamp}; echo ""` : ''}
|
|
314
|
+
\`\`\`
|
|
315
|
+
- Commit the changes made by each agent with appropriate commit messages to their branches.
|
|
316
|
+
|
|
317
|
+
${codexEnabled ? '7' : '6'}. **Provide recommendations and ask user for preference:**
|
|
318
|
+
|
|
319
|
+
Based on the outputs and changes from all agents, provide your analysis:
|
|
320
|
+
- Which agent performed best for this task?
|
|
321
|
+
- What were the key differences in their approaches?
|
|
322
|
+
- Compare the changes made by each agent
|
|
323
|
+
- Provide your recommendation on which agent's solution is best
|
|
324
|
+
|
|
325
|
+
Then, **ASK THE USER** which agent's branch they want to merge:
|
|
326
|
+
|
|
327
|
+
"Which agent's solution would you like to merge to your current branch? Please choose one:
|
|
328
|
+
${blackboxEnabled ? '- blackbox' : ''}
|
|
329
|
+
${claudeEnabled ? '- claude' : ''}
|
|
330
|
+
${codexEnabled ? '- codex' : ''}
|
|
331
|
+
${geminiEnabled ? '- gemini' : ''}
|
|
332
|
+
- none (keep all branches for manual review)
|
|
333
|
+
|
|
334
|
+
Or type 'compare' to see a detailed comparison of specific files between branches."
|
|
335
|
+
|
|
336
|
+
${codexEnabled ? '8' : '7'}. **After user chooses, help with merging and cleanup:**
|
|
337
|
+
|
|
338
|
+
Based on the user's choice, execute the appropriate merge and cleanup commands:
|
|
339
|
+
|
|
340
|
+
**If user chooses Blackbox:**
|
|
341
|
+
\`\`\`
|
|
342
|
+
# Merge Blackbox's branch
|
|
343
|
+
git merge blackboxai/multi-agent-blackbox-${timestamp} --no-ff -m "Merge Blackbox agent solution for: ${task}"
|
|
344
|
+
echo "Merged Blackbox's solution"
|
|
345
|
+
|
|
346
|
+
# Delete other branches
|
|
347
|
+
${claudeEnabled ? `git branch -D blackboxai/multi-agent-claude-${timestamp}` : ''}
|
|
348
|
+
${codexEnabled ? `git branch -D blackboxai/multi-agent-codex-${timestamp}` : ''}
|
|
349
|
+
${geminiEnabled ? `git branch -D blackboxai/multi-agent-gemini-${timestamp}` : ''}
|
|
350
|
+
|
|
351
|
+
# Remove worktrees
|
|
352
|
+
${blackboxEnabled ? `git worktree remove /tmp/blackbox-multi-agent-blackbox-${timestamp} --force` : ''}
|
|
353
|
+
${claudeEnabled ? `git worktree remove /tmp/blackbox-multi-agent-claude-${timestamp} --force` : ''}
|
|
354
|
+
${codexEnabled ? `git worktree remove /tmp/blackbox-multi-agent-codex-${timestamp} --force` : ''}
|
|
355
|
+
${geminiEnabled ? `git worktree remove /tmp/blackbox-multi-agent-gemini-${timestamp} --force` : ''}
|
|
356
|
+
|
|
357
|
+
echo "Cleanup complete! Blackbox's solution has been merged."
|
|
358
|
+
\`\`\`
|
|
359
|
+
|
|
360
|
+
**If user chooses Claude:**
|
|
361
|
+
\`\`\`
|
|
362
|
+
# Merge Claude's branch
|
|
363
|
+
git merge blackboxai/multi-agent-claude-${timestamp} --no-ff -m "Merge Claude agent solution for: ${task}"
|
|
364
|
+
echo "Merged Claude's solution"
|
|
365
|
+
|
|
366
|
+
# Delete other branches
|
|
367
|
+
${blackboxEnabled ? `git branch -D blackboxai/multi-agent-blackbox-${timestamp}` : ''}
|
|
368
|
+
${codexEnabled ? `git branch -D blackboxai/multi-agent-codex-${timestamp}` : ''}
|
|
369
|
+
${geminiEnabled ? `git branch -D blackboxai/multi-agent-gemini-${timestamp}` : ''}
|
|
370
|
+
|
|
371
|
+
# Remove worktrees
|
|
372
|
+
${blackboxEnabled ? `git worktree remove /tmp/blackbox-multi-agent-blackbox-${timestamp} --force` : ''}
|
|
373
|
+
${claudeEnabled ? `git worktree remove /tmp/blackbox-multi-agent-claude-${timestamp} --force` : ''}
|
|
374
|
+
${codexEnabled ? `git worktree remove /tmp/blackbox-multi-agent-codex-${timestamp} --force` : ''}
|
|
375
|
+
${geminiEnabled ? `git worktree remove /tmp/blackbox-multi-agent-gemini-${timestamp} --force` : ''}
|
|
376
|
+
|
|
377
|
+
echo "Cleanup complete! Claude's solution has been merged."
|
|
378
|
+
\`\`\`
|
|
379
|
+
|
|
380
|
+
**If user chooses Codex:**
|
|
381
|
+
\`\`\`
|
|
382
|
+
# Merge Codex's branch
|
|
383
|
+
git merge blackboxai/multi-agent-codex-${timestamp} --no-ff -m "Merge Codex agent solution for: ${task}"
|
|
384
|
+
echo "Merged Codex's solution"
|
|
385
|
+
|
|
386
|
+
# Delete other branches
|
|
387
|
+
${blackboxEnabled ? `git branch -D blackboxai/multi-agent-blackbox-${timestamp}` : ''}
|
|
388
|
+
${claudeEnabled ? `git branch -D blackboxai/multi-agent-claude-${timestamp}` : ''}
|
|
389
|
+
${geminiEnabled ? `git branch -D blackboxai/multi-agent-gemini-${timestamp}` : ''}
|
|
390
|
+
|
|
391
|
+
# Remove worktrees
|
|
392
|
+
${blackboxEnabled ? `git worktree remove /tmp/blackbox-multi-agent-blackbox-${timestamp} --force` : ''}
|
|
393
|
+
${claudeEnabled ? `git worktree remove /tmp/blackbox-multi-agent-claude-${timestamp} --force` : ''}
|
|
394
|
+
${codexEnabled ? `git worktree remove /tmp/blackbox-multi-agent-codex-${timestamp} --force` : ''}
|
|
395
|
+
${geminiEnabled ? `git worktree remove /tmp/blackbox-multi-agent-gemini-${timestamp} --force` : ''}
|
|
396
|
+
|
|
397
|
+
echo "Cleanup complete! Codex's solution has been merged."
|
|
398
|
+
\`\`\`
|
|
399
|
+
|
|
400
|
+
**If user chooses Gemini:**
|
|
401
|
+
\`\`\`
|
|
402
|
+
# Merge Gemini's branch
|
|
403
|
+
git merge blackboxai/multi-agent-gemini-${timestamp} --no-ff -m "Merge Gemini agent solution for: ${task}"
|
|
404
|
+
echo "Merged Gemini's solution"
|
|
405
|
+
|
|
406
|
+
# Delete other branches
|
|
407
|
+
${blackboxEnabled ? `git branch -D blackboxai/multi-agent-blackbox-${timestamp}` : ''}
|
|
408
|
+
${claudeEnabled ? `git branch -D blackboxai/multi-agent-claude-${timestamp}` : ''}
|
|
409
|
+
${codexEnabled ? `git branch -D blackboxai/multi-agent-codex-${timestamp}` : ''}
|
|
410
|
+
|
|
411
|
+
# Remove worktrees
|
|
412
|
+
${blackboxEnabled ? `git worktree remove /tmp/blackbox-multi-agent-blackbox-${timestamp} --force` : ''}
|
|
413
|
+
${claudeEnabled ? `git worktree remove /tmp/blackbox-multi-agent-claude-${timestamp} --force` : ''}
|
|
414
|
+
${codexEnabled ? `git worktree remove /tmp/blackbox-multi-agent-codex-${timestamp} --force` : ''}
|
|
415
|
+
${geminiEnabled ? `git worktree remove /tmp/blackbox-multi-agent-gemini-${timestamp} --force` : ''}
|
|
416
|
+
|
|
417
|
+
echo "Cleanup complete! Gemini's solution has been merged."
|
|
418
|
+
\`\`\`
|
|
419
|
+
|
|
420
|
+
**If user chooses 'none':**
|
|
421
|
+
\`\`\`
|
|
422
|
+
echo "All branches have been kept for your manual review."
|
|
423
|
+
echo "You can merge them manually or compare them further."
|
|
424
|
+
echo "Branches available:"
|
|
425
|
+
git branch | grep blackboxai/multi-agent
|
|
426
|
+
|
|
427
|
+
# Still remove worktrees to free up space
|
|
428
|
+
${blackboxEnabled ? `git worktree remove /tmp/blackbox-multi-agent-blackbox-${timestamp} --force` : ''}
|
|
429
|
+
${claudeEnabled ? `git worktree remove /tmp/blackbox-multi-agent-claude-${timestamp} --force` : ''}
|
|
430
|
+
${codexEnabled ? `git worktree remove /tmp/blackbox-multi-agent-codex-${timestamp} --force` : ''}
|
|
431
|
+
${geminiEnabled ? `git worktree remove /tmp/blackbox-multi-agent-gemini-${timestamp} --force` : ''}
|
|
432
|
+
\`\`\`
|
|
433
|
+
|
|
434
|
+
**If user chooses 'compare':**
|
|
435
|
+
Ask which specific files they want to compare, then show diffs between branches:
|
|
436
|
+
\`\`\`
|
|
437
|
+
# Example: Compare a specific file across branches
|
|
438
|
+
echo "Comparing [filename] from different agents:"
|
|
439
|
+
${blackboxEnabled ? 'echo ""; echo "=== BLACKBOX VERSION ==="; git show blackboxai/multi-agent-blackbox-' + timestamp + ':[filename] 2>/dev/null || echo "Not found"' : ''}
|
|
440
|
+
${claudeEnabled ? 'echo ""; echo "=== CLAUDE VERSION ==="; git show blackboxai/multi-agent-claude-' + timestamp + ':[filename] 2>/dev/null || echo "Not found"' : ''}
|
|
441
|
+
${codexEnabled ? 'echo ""; echo "=== CODEX VERSION ==="; git show blackboxai/multi-agent-codex-' + timestamp + ':[filename] 2>/dev/null || echo "Not found"' : ''}
|
|
442
|
+
${geminiEnabled ? 'echo ""; echo "=== GEMINI VERSION ==="; git show blackboxai/multi-agent-gemini-' + timestamp + ':[filename] 2>/dev/null || echo "Not found"' : ''}
|
|
443
|
+
\`\`\`
|
|
444
|
+
|
|
445
|
+
${codexEnabled ? '9' : '8'}. **Final steps:**
|
|
446
|
+
- Unstash any stashed changes back to the current branch
|
|
447
|
+
- Remove any temporary files created during the process
|
|
448
|
+
- Show final summary of what was merged
|
|
449
|
+
|
|
450
|
+
**Note:** Each agent worked in its own git branch. The cleanup process will:
|
|
451
|
+
1. Merge the chosen agent's branch to your current branch
|
|
452
|
+
2. Delete all other agent branches
|
|
453
|
+
3. Remove all worktrees
|
|
454
|
+
4. Keep your repository clean with only the selected solution
|
|
455
|
+
|
|
456
|
+
Please execute these steps, show me the streaming output from all agents, provide your analysis, ask for my preference, and help me with the merge and cleanup.`;
|
|
457
|
+
return {
|
|
458
|
+
type: 'submit_prompt',
|
|
459
|
+
content: instructions,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Generates instructions for non-git directory workflow (new functionality)
|
|
464
|
+
*/
|
|
465
|
+
function generateNonGitWorkflowInstructions(task, timestamp, enabledAgents, configLines, blackboxEnabled, claudeEnabled, codexEnabled, geminiEnabled, blackboxDisplayName, claudeDisplayName, codexDisplayName, geminiDisplayName, blackboxModel, claudeModel, codexModel, geminiModel, blackboxApiKey, openaiApiKey, geminiApiKey, hasOpenAIKey, hasGeminiKey, codexConfigToml, _multiAgentSettings) {
|
|
466
|
+
const instructions = `I need to set up parallel AI agent execution for the following task: "${task}"
|
|
467
|
+
|
|
468
|
+
**Configuration:**
|
|
469
|
+
${configLines.join('\n')}
|
|
470
|
+
- API: https://api.blackbox.ai (Blackbox API Gateway)
|
|
471
|
+
- Enabled Agents: ${enabledAgents.join(', ')}
|
|
472
|
+
- **Mode: Non-Git Directory** (working in-place without git worktrees)
|
|
473
|
+
|
|
474
|
+
${!hasOpenAIKey ? 'Please make a note to the user saying To enable Codex agent, set the OPENAI_API_KEY environment variable with your OpenAI API key (must start with sk-).\n' : ''}
|
|
475
|
+
${!hasGeminiKey ? 'Please make a note to the user saying To enable Gemini agent, set the GEMINI_API_KEY environment variable with your Gemini API key.\n' : ''}
|
|
476
|
+
**CRITICAL:** You MUST ONLY execute steps for these ${enabledAgents.length} enabled agent(s): ${enabledAgents.join(', ')}.
|
|
477
|
+
DO NOT create worktrees, check CLIs, or run commands for any other agents. Ignore any disabled agents completely.
|
|
478
|
+
|
|
479
|
+
**Important:** This directory is NOT a git repository, so we'll use a different approach:
|
|
480
|
+
- Agents will work in the current directory
|
|
481
|
+
- Each agent's output will be saved to separate folders for comparison
|
|
482
|
+
- No git branches or worktrees will be created
|
|
483
|
+
|
|
484
|
+
Please follow these steps using the shell tool:
|
|
485
|
+
|
|
486
|
+
1. **Check CLI installations and install if needed (ONLY for enabled agents):**
|
|
487
|
+
${claudeEnabled ? ` - Check Claude CLI:
|
|
488
|
+
\`\`\`
|
|
489
|
+
which claude || (echo "Claude CLI not found. Installing..." && npm install -g @anthropic-ai/claude-code)
|
|
490
|
+
\`\`\`
|
|
491
|
+
` : ''}${codexEnabled ? ` - Check Codex CLI:
|
|
492
|
+
\`\`\`
|
|
493
|
+
which codex || (echo "Codex CLI not found. Installing..." && npm install -g @openai/codex)
|
|
494
|
+
\`\`\`
|
|
495
|
+
` : ''}${geminiEnabled ? ` - Check Gemini CLI:
|
|
496
|
+
\`\`\`
|
|
497
|
+
which gemini || (echo "Gemini CLI not found. Installing..." && npm install -g @google/gemini-cli)
|
|
498
|
+
\`\`\`
|
|
499
|
+
` : ''}${!claudeEnabled && !codexEnabled && !geminiEnabled ? ' - No CLI checks needed (Blackbox CLI is built-in)\n' : ''}
|
|
500
|
+
|
|
501
|
+
2. **Set up multi-agent workspace in current directory:**
|
|
502
|
+
\`\`\`
|
|
503
|
+
mkdir -p .blackbox-multi-agent-${timestamp}/logs
|
|
504
|
+
echo "Multi-agent workspace created at: .blackbox-multi-agent-${timestamp}/"
|
|
505
|
+
\`\`\`
|
|
506
|
+
|
|
507
|
+
${codexEnabled ? `4. **Set up Codex CLI configuration** (using OpenAI API):
|
|
508
|
+
\`\`\`
|
|
509
|
+
mkdir -p ~/.codex && cat > ~/.codex/config.toml << 'EOF'
|
|
510
|
+
${codexConfigToml}
|
|
511
|
+
EOF
|
|
512
|
+
\`\`\`` : ''}
|
|
513
|
+
|
|
514
|
+
${codexEnabled || geminiEnabled ? '5' : '4'}. **Important Instructions for All Agents:**
|
|
515
|
+
|
|
516
|
+
**CRITICAL FILE NAMING CONVENTION:**
|
|
517
|
+
When creating or modifying files, each agent MUST follow this naming convention to avoid conflicts:
|
|
518
|
+
|
|
519
|
+
- **For NEW files**: Create with agent name prefix
|
|
520
|
+
Example: If creating \`utils.ts\`, save as:
|
|
521
|
+
${blackboxEnabled ? '- Blackbox: `blackbox_utils.ts`' : ''}
|
|
522
|
+
${claudeEnabled ? '- Claude: `claude_utils.ts`' : ''}
|
|
523
|
+
${codexEnabled ? '- Codex: `codex_utils.ts`' : ''}
|
|
524
|
+
${geminiEnabled ? '- Gemini: `gemini_utils.ts`' : ''}
|
|
525
|
+
|
|
526
|
+
- **For MODIFIED files**: Create a copy with agent name prefix, don't modify original
|
|
527
|
+
Example: If modifying \`src/app.ts\`, create:
|
|
528
|
+
${blackboxEnabled ? '- Blackbox: `src/blackbox_app.ts` (copy and modify)' : ''}
|
|
529
|
+
${claudeEnabled ? '- Claude: `src/claude_app.ts` (copy and modify)' : ''}
|
|
530
|
+
${codexEnabled ? '- Codex: `src/codex_app.ts` (copy and modify)' : ''}
|
|
531
|
+
${geminiEnabled ? '- Gemini: `src/gemini_app.ts` (copy and modify)' : ''}
|
|
532
|
+
|
|
533
|
+
- **Original files remain untouched** - This allows users to compare all versions and choose the best one
|
|
534
|
+
|
|
535
|
+
- **Reading files**: Agents can read any existing files normally (no prefix needed)
|
|
536
|
+
|
|
537
|
+
${codexEnabled || geminiEnabled ? '6' : '5'}. **Run all enabled agents in parallel** (use background processes with &):
|
|
538
|
+
|
|
539
|
+
Each agent will work in the current directory following the file naming convention above.
|
|
540
|
+
|
|
541
|
+
${blackboxEnabled ? `- Blackbox agent (using ${blackboxDisplayName}):
|
|
542
|
+
\`\`\`
|
|
543
|
+
(blackbox -p "IMPORTANT: When creating or modifying files, use 'blackbox_' prefix for all new/modified files. Original task: ${task}" -y 2>&1 | tee .blackbox-multi-agent-${timestamp}/logs/blackbox.log) &
|
|
544
|
+
BLACKBOX_PID=$!
|
|
545
|
+
echo "Blackbox agent started (PID: $BLACKBOX_PID)"
|
|
546
|
+
\`\`\`` : ''}
|
|
547
|
+
|
|
548
|
+
${claudeEnabled ? `- Claude agent (using ${claudeDisplayName}, with enhanced jq parsing for readable output):
|
|
549
|
+
\`\`\`
|
|
550
|
+
(ANTHROPIC_API_KEY="${blackboxApiKey}" ANTHROPIC_BASE_URL="https://api.blackbox.ai" claude --model "${claudeModel}" -p --output-format=stream-json --dangerously-skip-permissions --verbose 'IMPORTANT: When creating or modifying files, use "claude_" prefix for all new/modified files. Original task: ${task.replace(/'/g, "'\\''")}' 2>&1 | jq -r '
|
|
551
|
+
if .type == "assistant" and .message.content then
|
|
552
|
+
.message.content[] |
|
|
553
|
+
if .type == "text" then .text
|
|
554
|
+
elif .type == "tool_use" then
|
|
555
|
+
"+-------------------------------------------------------------+\\n" +
|
|
556
|
+
"| 🔧 TOOL USE: \\(.name)\\n" +
|
|
557
|
+
"+-------------------------------------------------------------+\\n" +
|
|
558
|
+
"| Input:\\n" +
|
|
559
|
+
((.input | @json | split("\\n")) | map("| " + .) | join("\\n")) + "\\n" +
|
|
560
|
+
"+-------------------------------------------------------------+\\n"
|
|
561
|
+
else empty
|
|
562
|
+
end
|
|
563
|
+
elif .type == "user" and .message.content then
|
|
564
|
+
.message.content[] |
|
|
565
|
+
if .type == "tool_result" then
|
|
566
|
+
"\\n" +
|
|
567
|
+
((.content | split("\\n")) as $lines |
|
|
568
|
+
if ($lines | length) > 10 then
|
|
569
|
+
($lines[:10] | join("\\n")) + "\\n" +
|
|
570
|
+
"\\n... (\\($lines | length - 10) more lines hidden) ...\\n"
|
|
571
|
+
else
|
|
572
|
+
$lines | join("\\n")
|
|
573
|
+
end) +
|
|
574
|
+
"\\n"
|
|
575
|
+
else empty
|
|
576
|
+
end
|
|
577
|
+
else empty
|
|
578
|
+
end
|
|
579
|
+
' | tee .blackbox-multi-agent-${timestamp}/logs/claude.log) &
|
|
580
|
+
CLAUDE_PID=$!
|
|
581
|
+
echo "Claude agent started (PID: $CLAUDE_PID)"
|
|
582
|
+
\`\`\`` : ''}
|
|
583
|
+
|
|
584
|
+
${codexEnabled ? `- Codex agent (using ${codexDisplayName}, with OpenAI API key):
|
|
585
|
+
\`\`\`
|
|
586
|
+
(echo "${openaiApiKey}" | codex login --with-api-key && codex exec --dangerously-bypass-approvals-and-sandbox 'IMPORTANT: When creating or modifying files, use "codex_" prefix for all new/modified files. Original task: ${task.replace(/'/g, "'\\''")}' 2>&1 | tee .blackbox-multi-agent-${timestamp}/logs/codex.log) &
|
|
587
|
+
CODEX_PID=$!
|
|
588
|
+
echo "Codex agent started (PID: $CODEX_PID)"
|
|
589
|
+
\`\`\`` : ''}
|
|
590
|
+
|
|
591
|
+
${geminiEnabled ? `- Gemini agent (using ${geminiDisplayName}, with GEMINI_API_KEY):
|
|
592
|
+
\`\`\`
|
|
593
|
+
(GEMINI_API_KEY="${geminiApiKey}" gemini --model "${geminiModel}" --yolo 'IMPORTANT: When creating or modifying files, use "gemini_" prefix for all new/modified files. Original task: ${task.replace(/'/g, "'\\''")}' --output-format stream-json 2>&1 | jq -r '
|
|
594
|
+
def hr(n): ("─" * n);
|
|
595
|
+
|
|
596
|
+
def box(title; body):
|
|
597
|
+
"\\n┌" + hr(78) + "┐\\n" +
|
|
598
|
+
"│ " + (title | ascii_upcase) + (" " * (77 - (title|length))) + "│\\n" +
|
|
599
|
+
"├" + hr(78) + "┤\\n" +
|
|
600
|
+
(body
|
|
601
|
+
| split("\\n")
|
|
602
|
+
| map("│ " + . + (" " * (77 - (. | length))))
|
|
603
|
+
| join("\\n")
|
|
604
|
+
) +
|
|
605
|
+
"\\n└" + hr(78) + "┘";
|
|
606
|
+
|
|
607
|
+
if .type == "message" and .role == "assistant" then
|
|
608
|
+
box("assistant"; .content)
|
|
609
|
+
elif .type == "tool_use" then
|
|
610
|
+
box("tool call: " + .tool_name; "INPUT:\\n" + (.parameters | tojson))
|
|
611
|
+
elif .type == "tool_result" then
|
|
612
|
+
box("tool result"; "STATUS: " + .status + (if .output != null and .output != "" then "\\nOUTPUT:\\n" + .output else "" end))
|
|
613
|
+
else empty end' | tee .blackbox-multi-agent-${timestamp}/logs/gemini.log) &
|
|
614
|
+
GEMINI_PID=$!
|
|
615
|
+
echo "Gemini agent started (PID: $GEMINI_PID)"
|
|
616
|
+
\`\`\`` : ''}
|
|
617
|
+
|
|
618
|
+
${codexEnabled || geminiEnabled ? '7' : '6'}. **Monitor the agents' progress:**
|
|
619
|
+
|
|
620
|
+
The agents are now running in the background in the current directory. You can check their progress by:
|
|
621
|
+
|
|
622
|
+
- Checking if processes are still running:
|
|
623
|
+
\`\`\`
|
|
624
|
+
ps aux | grep -E "(${enabledAgents.map(a => a.toLowerCase()).join('|')})" | grep -v grep
|
|
625
|
+
\`\`\`
|
|
626
|
+
|
|
627
|
+
- Viewing the last 20 lines from each enabled agent's log:
|
|
628
|
+
\`\`\`
|
|
629
|
+
${blackboxEnabled ? `echo "=== Blackbox Agent (${blackboxDisplayName}) ===" && tail -20 .blackbox-multi-agent-${timestamp}/logs/blackbox.log 2>/dev/null || echo "No output yet"` : ''}
|
|
630
|
+
${claudeEnabled ? `echo "" && echo "=== Claude Agent (${claudeDisplayName}, Enhanced Format) ===" && tail -20 .blackbox-multi-agent-${timestamp}/logs/claude.log 2>/dev/null || echo "No Claude output yet"` : ''}
|
|
631
|
+
${codexEnabled ? `echo "" && echo "=== Codex Agent (${codexDisplayName}) ===" && tail -20 .blackbox-multi-agent-${timestamp}/logs/codex.log 2>/dev/null || echo "No output yet"` : ''}
|
|
632
|
+
${geminiEnabled ? `echo "" && echo "=== Gemini Agent (${geminiDisplayName}) ===" && tail -20 .blackbox-multi-agent-${timestamp}/logs/gemini.log 2>/dev/null || echo "No output yet"` : ''}
|
|
633
|
+
\`\`\`
|
|
634
|
+
|
|
635
|
+
Periodically check the logs every 30-60 seconds to show progress updates to the user.
|
|
636
|
+
|
|
637
|
+
${codexEnabled || geminiEnabled ? '8' : '7'}. **Wait for all agents to complete:**
|
|
638
|
+
\`\`\`
|
|
639
|
+
echo "Waiting for all agents to complete..."
|
|
640
|
+
${blackboxEnabled ? 'wait $BLACKBOX_PID && echo "Blackbox agent completed"' : ''}
|
|
641
|
+
${claudeEnabled ? 'wait $CLAUDE_PID && echo "Claude agent completed"' : ''}
|
|
642
|
+
${codexEnabled ? 'wait $CODEX_PID && echo "Codex agent completed"' : ''}
|
|
643
|
+
${geminiEnabled ? 'wait $GEMINI_PID && echo "Gemini agent completed"' : ''}
|
|
644
|
+
echo "All agents have completed!"
|
|
645
|
+
\`\`\`
|
|
646
|
+
|
|
647
|
+
${codexEnabled || geminiEnabled ? '9' : '8'}. **Show execution summary:**
|
|
648
|
+
|
|
649
|
+
After all agents complete, show a summary:
|
|
650
|
+
|
|
651
|
+
\`\`\`
|
|
652
|
+
echo ""
|
|
653
|
+
echo "=== MULTI-AGENT EXECUTION SUMMARY ==="
|
|
654
|
+
echo ""
|
|
655
|
+
echo "Task: ${task}"
|
|
656
|
+
echo "Agents used: ${enabledAgents.join(', ')}"
|
|
657
|
+
echo ""
|
|
658
|
+
echo "All agent logs are available in: .blackbox-multi-agent-${timestamp}/logs/"
|
|
659
|
+
echo ""
|
|
660
|
+
echo "To review each agent's complete log:"
|
|
661
|
+
${blackboxEnabled ? `echo " - Blackbox: cat .blackbox-multi-agent-${timestamp}/logs/blackbox.log"` : ''}
|
|
662
|
+
${claudeEnabled ? `echo " - Claude: cat .blackbox-multi-agent-${timestamp}/logs/claude.log"` : ''}
|
|
663
|
+
${codexEnabled ? `echo " - Codex: cat .blackbox-multi-agent-${timestamp}/logs/codex.log"` : ''}
|
|
664
|
+
${geminiEnabled ? `echo " - Gemini: cat .blackbox-multi-agent-${timestamp}/logs/gemini.log"` : ''}
|
|
665
|
+
echo ""
|
|
666
|
+
\`\`\`
|
|
667
|
+
|
|
668
|
+
${codexEnabled || geminiEnabled ? '10' : '9'}. **Show final results from all agents:**
|
|
669
|
+
|
|
670
|
+
Display the complete output from each agent:
|
|
671
|
+
|
|
672
|
+
\`\`\`
|
|
673
|
+
${blackboxEnabled ? `echo ""; echo "=== BLACKBOX AGENT COMPLETE OUTPUT ==="; cat .blackbox-multi-agent-${timestamp}/logs/blackbox.log; echo ""` : ''}
|
|
674
|
+
${claudeEnabled ? `echo ""; echo "=== CLAUDE AGENT COMPLETE OUTPUT ==="; cat .blackbox-multi-agent-${timestamp}/logs/claude.log; echo ""` : ''}
|
|
675
|
+
${codexEnabled ? `echo ""; echo "=== CODEX AGENT COMPLETE OUTPUT ==="; cat .blackbox-multi-agent-${timestamp}/logs/codex.log; echo ""` : ''}
|
|
676
|
+
${geminiEnabled ? `echo ""; echo "=== GEMINI AGENT COMPLETE OUTPUT ==="; cat .blackbox-multi-agent-${timestamp}/logs/gemini.log; echo ""` : ''}
|
|
677
|
+
\`\`\`
|
|
678
|
+
|
|
679
|
+
${codexEnabled || geminiEnabled ? '11' : '10'}. **List all files created by each agent:**
|
|
680
|
+
|
|
681
|
+
Show which files each agent created/modified:
|
|
682
|
+
|
|
683
|
+
\`\`\`
|
|
684
|
+
echo ""
|
|
685
|
+
echo "=== FILES CREATED BY EACH AGENT ==="
|
|
686
|
+
echo ""
|
|
687
|
+
${blackboxEnabled ? `echo "Blackbox files:"
|
|
688
|
+
find . -name "blackbox_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" 2>/dev/null || echo " No files created"
|
|
689
|
+
echo ""` : ''}
|
|
690
|
+
${claudeEnabled ? `echo "Claude files:"
|
|
691
|
+
find . -name "claude_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" 2>/dev/null || echo " No files created"
|
|
692
|
+
echo ""` : ''}
|
|
693
|
+
${codexEnabled ? `echo "Codex files:"
|
|
694
|
+
find . -name "codex_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" 2>/dev/null || echo " No files created"
|
|
695
|
+
echo ""` : ''}
|
|
696
|
+
${geminiEnabled ? `echo "Gemini files:"
|
|
697
|
+
find . -name "gemini_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" 2>/dev/null || echo " No files created"
|
|
698
|
+
echo ""` : ''}
|
|
699
|
+
\`\`\`
|
|
700
|
+
|
|
701
|
+
${codexEnabled || geminiEnabled ? '12' : '11'}. **Provide recommendations and ask user for preference:**
|
|
702
|
+
|
|
703
|
+
Based on the outputs from all agents, provide your analysis:
|
|
704
|
+
- Which agent performed best for this task?
|
|
705
|
+
- What were the key differences in their approaches?
|
|
706
|
+
- List the specific files each agent created (with their prefixes)
|
|
707
|
+
- Compare the quality and completeness of each agent's solution
|
|
708
|
+
- Provide your recommendation on which agent's solution is best
|
|
709
|
+
|
|
710
|
+
Then, **ASK THE USER** which agent's files they want to keep:
|
|
711
|
+
|
|
712
|
+
"Which agent's solution would you like to use? Please choose one:
|
|
713
|
+
${blackboxEnabled ? '- blackbox' : ''}
|
|
714
|
+
${claudeEnabled ? '- claude' : ''}
|
|
715
|
+
${codexEnabled ? '- codex' : ''}
|
|
716
|
+
${geminiEnabled ? '- gemini' : ''}
|
|
717
|
+
- none (keep all files for manual review)
|
|
718
|
+
|
|
719
|
+
Or type 'compare' to see a detailed comparison of specific files."
|
|
720
|
+
|
|
721
|
+
${codexEnabled || geminiEnabled ? '13' : '12'}. **After user chooses, help with cleanup:**
|
|
722
|
+
|
|
723
|
+
Based on the user's choice, execute the appropriate cleanup commands:
|
|
724
|
+
|
|
725
|
+
**If user chooses Blackbox:**
|
|
726
|
+
\`\`\`
|
|
727
|
+
# Rename Blackbox's files (remove prefix)
|
|
728
|
+
for file in (find . -name "blackbox_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*"); do
|
|
729
|
+
newname="{file#./}"
|
|
730
|
+
newname="{newname/blackbox_/}"
|
|
731
|
+
mv "file" "newname"
|
|
732
|
+
echo "Renamed: file -> newname"
|
|
733
|
+
done
|
|
734
|
+
|
|
735
|
+
# Remove other agents' files
|
|
736
|
+
find . -name "claude_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" -delete
|
|
737
|
+
find . -name "codex_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" -delete
|
|
738
|
+
find . -name "gemini_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" -delete
|
|
739
|
+
|
|
740
|
+
echo "Cleanup complete! Blackbox's files are now active."
|
|
741
|
+
\`\`\`
|
|
742
|
+
|
|
743
|
+
**If user chooses Claude:**
|
|
744
|
+
\`\`\`
|
|
745
|
+
# Rename Claude's files (remove prefix)
|
|
746
|
+
for file in (find . -name "claude_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*"); do
|
|
747
|
+
newname="{file#./}"
|
|
748
|
+
newname="{newname/claude_/}"
|
|
749
|
+
mv "file" "newname"
|
|
750
|
+
echo "Renamed: file -> newname"
|
|
751
|
+
done
|
|
752
|
+
|
|
753
|
+
# Remove other agents' files
|
|
754
|
+
find . -name "blackbox_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" -delete
|
|
755
|
+
find . -name "codex_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" -delete
|
|
756
|
+
find . -name "gemini_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" -delete
|
|
757
|
+
|
|
758
|
+
echo "Cleanup complete! Claude's files are now active."
|
|
759
|
+
\`\`\`
|
|
760
|
+
|
|
761
|
+
**If user chooses Codex:**
|
|
762
|
+
\`\`\`
|
|
763
|
+
# Rename Codex's files (remove prefix)
|
|
764
|
+
for file in (find . -name "codex_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*"); do
|
|
765
|
+
newname="{file#./}"
|
|
766
|
+
newname="{newname/codex_/}"
|
|
767
|
+
mv "file" "newname"
|
|
768
|
+
echo "Renamed: file -> newname"
|
|
769
|
+
done
|
|
770
|
+
|
|
771
|
+
# Remove other agents' files
|
|
772
|
+
find . -name "blackbox_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" -delete
|
|
773
|
+
find . -name "claude_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" -delete
|
|
774
|
+
find . -name "gemini_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" -delete
|
|
775
|
+
|
|
776
|
+
echo "Cleanup complete! Codex's files are now active."
|
|
777
|
+
\`\`\`
|
|
778
|
+
|
|
779
|
+
**If user chooses Gemini:**
|
|
780
|
+
\`\`\`
|
|
781
|
+
# Rename Gemini's files (remove prefix)
|
|
782
|
+
for file in (find . -name "gemini_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*"); do
|
|
783
|
+
newname="{file#./}"
|
|
784
|
+
newname="{newname/gemini_/}"
|
|
785
|
+
mv "file" "newname"
|
|
786
|
+
echo "Renamed: file -> newname"
|
|
787
|
+
done
|
|
788
|
+
|
|
789
|
+
# Remove other agents' files
|
|
790
|
+
find . -name "blackbox_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" -delete
|
|
791
|
+
find . -name "claude_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" -delete
|
|
792
|
+
find . -name "codex_*" -type f -not -path "./.blackbox-multi-agent-${timestamp}/*" -delete
|
|
793
|
+
|
|
794
|
+
echo "Cleanup complete! Gemini's files are now active."
|
|
795
|
+
\`\`\`
|
|
796
|
+
|
|
797
|
+
**If user chooses 'none':**
|
|
798
|
+
\`\`\`
|
|
799
|
+
echo "All agent files have been kept for your manual review."
|
|
800
|
+
echo "You can compare them and manually choose which ones to keep."
|
|
801
|
+
\`\`\`
|
|
802
|
+
|
|
803
|
+
**If user chooses 'compare':**
|
|
804
|
+
Ask which specific files they want to compare, then show side-by-side diffs:
|
|
805
|
+
\`\`\`
|
|
806
|
+
# Example: Compare a specific file from different agents
|
|
807
|
+
echo "Comparing [filename] from different agents:"
|
|
808
|
+
${blackboxEnabled ? 'echo ""; echo "=== BLACKBOX VERSION ==="; cat blackbox_[filename] 2>/dev/null || echo "Not found"' : ''}
|
|
809
|
+
${claudeEnabled ? 'echo ""; echo "=== CLAUDE VERSION ==="; cat claude_[filename] 2>/dev/null || echo "Not found"' : ''}
|
|
810
|
+
${codexEnabled ? 'echo ""; echo "=== CODEX VERSION ==="; cat codex_[filename] 2>/dev/null || echo "Not found"' : ''}
|
|
811
|
+
${geminiEnabled ? 'echo ""; echo "=== GEMINI VERSION ==="; cat gemini_[filename] 2>/dev/null || echo "Not found"' : ''}
|
|
812
|
+
\`\`\`
|
|
813
|
+
|
|
814
|
+
${codexEnabled || geminiEnabled ? '14' : '13'}. **Final cleanup of logs:**
|
|
815
|
+
|
|
816
|
+
After the user is satisfied with their choice, remove the logs directory:
|
|
817
|
+
\`\`\`
|
|
818
|
+
rm -rf .blackbox-multi-agent-${timestamp}
|
|
819
|
+
echo "Multi-agent logs removed. Task complete!"
|
|
820
|
+
\`\`\`
|
|
821
|
+
|
|
822
|
+
**Note:** Each agent created files with their name prefix (e.g., \`blackbox_file.ts\`, \`claude_file.ts\`). This allows easy comparison and selection. The cleanup process will:
|
|
823
|
+
1. Rename the chosen agent's files (remove prefix)
|
|
824
|
+
2. Delete all other agents' files
|
|
825
|
+
3. Keep the directory clean with only the selected solution
|
|
826
|
+
|
|
827
|
+
Please execute these steps, show me the streaming output from all agents, provide your analysis, ask for my preference, and help me with the cleanup.`;
|
|
828
|
+
return {
|
|
829
|
+
type: 'submit_prompt',
|
|
830
|
+
content: instructions,
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
//# sourceMappingURL=multiAgentCommand.js.map
|