@blackbox_ai/blackbox-cli 0.8.6 → 1.0.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.
- package/README.md +20 -0
- package/dist/assets/notification.mp3 +0 -0
- package/dist/package.json +2 -2
- package/dist/src/commands/configure/ConfigureUI.d.ts +1 -1
- package/dist/src/commands/configure/ConfigureUI.js +91 -22
- package/dist/src/commands/configure/ConfigureUI.js.map +1 -1
- package/dist/src/commands/configure.js +57 -16
- package/dist/src/commands/configure.js.map +1 -1
- package/dist/src/commands/shortcut.d.ts +10 -0
- package/dist/src/commands/shortcut.js +72 -0
- package/dist/src/commands/shortcut.js.map +1 -0
- package/dist/src/commands/voice.js +39 -34
- package/dist/src/commands/voice.js.map +1 -1
- package/dist/src/config/config.js +8 -5
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/modelFetcher.d.ts +4 -0
- package/dist/src/config/modelFetcher.js +68 -22
- package/dist/src/config/modelFetcher.js.map +1 -1
- package/dist/src/config/settings.d.ts +2 -0
- package/dist/src/config/settings.js +48 -3
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +64 -6
- package/dist/src/config/settingsSchema.js +62 -6
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/gemini.js +31 -20
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/services/BuiltinCommandLoader.js +4 -2
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/agentExecutor.d.ts +57 -0
- package/dist/src/services/agentExecutor.js +149 -0
- package/dist/src/services/agentExecutor.js.map +1 -0
- package/dist/src/services/voiceRecordingService.d.ts +13 -1
- package/dist/src/services/voiceRecordingService.js +38 -5
- package/dist/src/services/voiceRecordingService.js.map +1 -1
- package/dist/src/ui/App.d.ts +1 -1
- package/dist/src/ui/App.js +292 -26
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/colors.js +3 -0
- package/dist/src/ui/colors.js.map +1 -1
- package/dist/src/ui/commands/agentCommand.d.ts +7 -0
- package/dist/src/ui/commands/agentCommand.js +181 -0
- package/dist/src/ui/commands/agentCommand.js.map +1 -0
- package/dist/src/ui/commands/modelCommand.js +15 -2
- package/dist/src/ui/commands/modelCommand.js.map +1 -1
- package/dist/src/ui/commands/quitCommand.js +5 -0
- package/dist/src/ui/commands/quitCommand.js.map +1 -1
- package/dist/src/ui/commands/subAgentsCommand.d.ts +7 -0
- package/dist/src/ui/commands/subAgentsCommand.js +32 -0
- package/dist/src/ui/commands/subAgentsCommand.js.map +1 -0
- package/dist/src/ui/commands/types.d.ts +24 -3
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/commands/voiceCommand.js +70 -34
- package/dist/src/ui/commands/voiceCommand.js.map +1 -1
- package/dist/src/ui/commands/voiceCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/voiceCommand.test.js +131 -0
- package/dist/src/ui/commands/voiceCommand.test.js.map +1 -0
- package/dist/src/ui/components/AgentModelSelector.d.ts +17 -0
- package/dist/src/ui/components/AgentModelSelector.js +41 -0
- package/dist/src/ui/components/AgentModelSelector.js.map +1 -0
- package/dist/src/ui/components/AgentSetDialog.d.ts +15 -0
- package/dist/src/ui/components/AgentSetDialog.js +52 -0
- package/dist/src/ui/components/AgentSetDialog.js.map +1 -0
- package/dist/src/ui/components/ApiKeyInputDialog.d.ts +17 -0
- package/dist/src/ui/components/ApiKeyInputDialog.js +44 -0
- package/dist/src/ui/components/ApiKeyInputDialog.js.map +1 -0
- package/dist/src/ui/components/AsciiArt.d.ts +3 -3
- package/dist/src/ui/components/AsciiArt.js +18 -18
- package/dist/src/ui/components/AsciiArt.js.map +1 -1
- package/dist/src/ui/components/AuthDialog.js +50 -7
- package/dist/src/ui/components/AuthDialog.js.map +1 -1
- package/dist/src/ui/components/Footer.d.ts +8 -0
- package/dist/src/ui/components/Footer.js +17 -4
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/GenericProviderKeyPrompt.js +1 -1
- package/dist/src/ui/components/GenericProviderKeyPrompt.js.map +1 -1
- package/dist/src/ui/components/Header.js +6 -10
- package/dist/src/ui/components/Header.js.map +1 -1
- package/dist/src/ui/components/HistoryBrowserDialog.js +2 -1
- package/dist/src/ui/components/HistoryBrowserDialog.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +3 -1
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/MemoryUsageDisplay.js +41 -8
- package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.js +4 -3
- package/dist/src/ui/components/SettingsDialog.js.map +1 -1
- package/dist/src/ui/components/StatsDisplay.js +1 -1
- package/dist/src/ui/components/StatsDisplay.js.map +1 -1
- package/dist/src/ui/components/SuggestionsDisplay.js +3 -2
- package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
- package/dist/src/ui/components/Tips.js +1 -1
- package/dist/src/ui/components/Tips.js.map +1 -1
- package/dist/src/ui/components/agents/SingleAgentDialog.d.ts +23 -0
- package/dist/src/ui/components/agents/SingleAgentDialog.js +222 -0
- package/dist/src/ui/components/agents/SingleAgentDialog.js.map +1 -0
- package/dist/src/ui/components/messages/DiffRenderer.js +1 -9
- package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
- package/dist/src/ui/components/messages/ErrorMessage.js +2 -1
- package/dist/src/ui/components/messages/ErrorMessage.js.map +1 -1
- package/dist/src/ui/components/messages/InfoMessage.js +2 -1
- package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js +4 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js +4 -4
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/UserMessage.js +1 -2
- package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
- package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.js +1 -19
- package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.js +14 -4
- package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
- package/dist/src/ui/contexts/SessionContext.d.ts +18 -0
- package/dist/src/ui/contexts/SessionContext.js +25 -1
- package/dist/src/ui/contexts/SessionContext.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.d.ts +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.js +13 -2
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -2
- package/dist/src/ui/hooks/slashCommandProcessor.js +65 -29
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAdaptiveStream.d.ts +2 -1
- package/dist/src/ui/hooks/useAdaptiveStream.js +2 -2
- package/dist/src/ui/hooks/useAdaptiveStream.js.map +1 -1
- package/dist/src/ui/hooks/useAgentCommandProcessor.d.ts +26 -0
- package/dist/src/ui/hooks/useAgentCommandProcessor.js +967 -0
- package/dist/src/ui/hooks/useAgentCommandProcessor.js.map +1 -0
- package/dist/src/ui/hooks/useAuthCommand.d.ts +2 -1
- package/dist/src/ui/hooks/useAuthCommand.js +22 -2
- package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
- package/dist/src/ui/hooks/useDialogClose.d.ts +2 -0
- package/dist/src/ui/hooks/useDialogClose.js +5 -0
- package/dist/src/ui/hooks/useDialogClose.js.map +1 -1
- package/dist/src/ui/hooks/useEncryptedStream.d.ts +2 -1
- package/dist/src/ui/hooks/useEncryptedStream.js +31 -3
- package/dist/src/ui/hooks/useEncryptedStream.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -1
- package/dist/src/ui/hooks/useGeminiStream.js +292 -22
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useInputBoxColor.d.ts +13 -0
- package/dist/src/ui/hooks/useInputBoxColor.js +62 -0
- package/dist/src/ui/hooks/useInputBoxColor.js.map +1 -0
- package/dist/src/ui/hooks/useMessageQueue.d.ts +7 -1
- package/dist/src/ui/hooks/useMessageQueue.js +9 -3
- package/dist/src/ui/hooks/useMessageQueue.js.map +1 -1
- package/dist/src/ui/hooks/useSingleAgentCommand.d.ts +10 -0
- package/dist/src/ui/hooks/useSingleAgentCommand.js +21 -0
- package/dist/src/ui/hooks/useSingleAgentCommand.js.map +1 -0
- package/dist/src/ui/themes/ansi-light.js +1 -0
- package/dist/src/ui/themes/ansi-light.js.map +1 -1
- package/dist/src/ui/themes/ansi.js +1 -0
- package/dist/src/ui/themes/ansi.js.map +1 -1
- package/dist/src/ui/themes/atom-one-dark.js +14 -13
- package/dist/src/ui/themes/atom-one-dark.js.map +1 -1
- package/dist/src/ui/themes/ayu-light.js +14 -13
- package/dist/src/ui/themes/ayu-light.js.map +1 -1
- package/dist/src/ui/themes/ayu.js +14 -13
- package/dist/src/ui/themes/ayu.js.map +1 -1
- package/dist/src/ui/themes/blackbox-dark.js +36 -31
- package/dist/src/ui/themes/blackbox-dark.js.map +1 -1
- package/dist/src/ui/themes/blackbox-light.js +41 -39
- package/dist/src/ui/themes/blackbox-light.js.map +1 -1
- package/dist/src/ui/themes/default-light.js +20 -20
- package/dist/src/ui/themes/default-light.js.map +1 -1
- package/dist/src/ui/themes/default.js +27 -27
- package/dist/src/ui/themes/default.js.map +1 -1
- package/dist/src/ui/themes/dracula.js +14 -13
- package/dist/src/ui/themes/dracula.js.map +1 -1
- package/dist/src/ui/themes/github-dark.js +14 -13
- package/dist/src/ui/themes/github-dark.js.map +1 -1
- package/dist/src/ui/themes/github-light.js +14 -13
- package/dist/src/ui/themes/github-light.js.map +1 -1
- package/dist/src/ui/themes/googlecode.js +1 -0
- package/dist/src/ui/themes/googlecode.js.map +1 -1
- package/dist/src/ui/themes/no-color.js +2 -0
- package/dist/src/ui/themes/no-color.js.map +1 -1
- package/dist/src/ui/themes/semantic-tokens.d.ts +1 -0
- package/dist/src/ui/themes/semantic-tokens.js +3 -0
- package/dist/src/ui/themes/semantic-tokens.js.map +1 -1
- package/dist/src/ui/themes/shades-of-purple.js +1 -0
- package/dist/src/ui/themes/shades-of-purple.js.map +1 -1
- package/dist/src/ui/themes/theme.d.ts +2 -0
- package/dist/src/ui/themes/theme.js +35 -28
- package/dist/src/ui/themes/theme.js.map +1 -1
- package/dist/src/ui/themes/xcode.js +1 -0
- package/dist/src/ui/themes/xcode.js.map +1 -1
- package/dist/src/ui/types.d.ts +5 -0
- package/dist/src/ui/utils/agentConversationUtils.d.ts +28 -0
- package/dist/src/ui/utils/agentConversationUtils.js +71 -0
- package/dist/src/ui/utils/agentConversationUtils.js.map +1 -0
- package/dist/src/ui/utils/colorBlend.d.ts +33 -0
- package/dist/src/ui/utils/colorBlend.js +61 -0
- package/dist/src/ui/utils/colorBlend.js.map +1 -0
- package/dist/src/ui/utils/commandUtils.d.ts +2 -1
- package/dist/src/ui/utils/commandUtils.js +14 -1
- package/dist/src/ui/utils/commandUtils.js.map +1 -1
- package/dist/src/ui/utils/commandUtils.test.js +25 -0
- package/dist/src/ui/utils/commandUtils.test.js.map +1 -1
- package/dist/src/ui/utils/terminalBackgroundDetector.d.ts +35 -0
- package/dist/src/ui/utils/terminalBackgroundDetector.js +200 -0
- package/dist/src/ui/utils/terminalBackgroundDetector.js.map +1 -0
- package/dist/src/utils/agentCommandBuilder.d.ts +48 -0
- package/dist/src/utils/agentCommandBuilder.js +328 -0
- package/dist/src/utils/agentCommandBuilder.js.map +1 -0
- package/dist/src/utils/apiKeyUtils.d.ts +47 -0
- package/dist/src/utils/apiKeyUtils.js +177 -0
- package/dist/src/utils/apiKeyUtils.js.map +1 -0
- package/dist/src/utils/backgroundUpdateCheck.js +104 -7
- package/dist/src/utils/backgroundUpdateCheck.js.map +1 -1
- package/dist/src/utils/memoryManager.d.ts +85 -0
- package/dist/src/utils/memoryManager.js +258 -0
- package/dist/src/utils/memoryManager.js.map +1 -0
- package/dist/src/utils/memoryMonitor.d.ts +89 -0
- package/dist/src/utils/memoryMonitor.js +238 -0
- package/dist/src/utils/memoryMonitor.js.map +1 -0
- package/dist/src/utils/memoryWrapper.d.ts +18 -0
- package/dist/src/utils/memoryWrapper.js +62 -0
- package/dist/src/utils/memoryWrapper.js.map +1 -0
- package/dist/src/utils/preLaunchUpdateCheck.js +17 -7
- package/dist/src/utils/preLaunchUpdateCheck.js.map +1 -1
- package/dist/src/utils/shellShortcut.d.ts +45 -0
- package/dist/src/utils/shellShortcut.js +221 -0
- package/dist/src/utils/shellShortcut.js.map +1 -0
- package/dist/src/utils/soundNotification.d.ts +15 -0
- package/dist/src/utils/soundNotification.js +138 -0
- package/dist/src/utils/soundNotification.js.map +1 -0
- package/dist/src/utils/userStartupWarnings.js +0 -20
- package/dist/src/utils/userStartupWarnings.js.map +1 -1
- package/dist/src/utils/versionStorage.d.ts +20 -0
- package/dist/src/utils/versionStorage.js +62 -0
- package/dist/src/utils/versionStorage.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { MemoryManager } from './memoryManager.js';
|
|
8
|
+
/**
|
|
9
|
+
* Environment variable to prevent infinite relaunching
|
|
10
|
+
*/
|
|
11
|
+
const NO_RELAUNCH_ENV = 'BLACKBOX_CLI_NO_RELAUNCH';
|
|
12
|
+
/**
|
|
13
|
+
* Check if we need to relaunch with better memory settings
|
|
14
|
+
*/
|
|
15
|
+
export function shouldRelaunchWithMemory() {
|
|
16
|
+
// Skip if already relaunched or explicitly disabled
|
|
17
|
+
if (process.env[NO_RELAUNCH_ENV] || process.env['GEMINI_CLI_NO_RELAUNCH']) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
// Get optimal memory args
|
|
21
|
+
const memoryArgs = MemoryManager.getOptimalHeapArgs();
|
|
22
|
+
return memoryArgs.length > 0;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Relaunch the process with optimal memory settings
|
|
26
|
+
*/
|
|
27
|
+
export async function relaunchWithOptimalMemory() {
|
|
28
|
+
const memoryArgs = MemoryManager.getOptimalHeapArgs();
|
|
29
|
+
if (memoryArgs.length === 0) {
|
|
30
|
+
throw new Error('No memory optimization needed');
|
|
31
|
+
}
|
|
32
|
+
const nodeArgs = [...memoryArgs, ...process.argv.slice(1)];
|
|
33
|
+
const newEnv = {
|
|
34
|
+
...process.env,
|
|
35
|
+
[NO_RELAUNCH_ENV]: 'true',
|
|
36
|
+
// Also set the legacy env var for compatibility
|
|
37
|
+
GEMINI_CLI_NO_RELAUNCH: 'true'
|
|
38
|
+
};
|
|
39
|
+
const child = spawn(process.execPath, nodeArgs, {
|
|
40
|
+
stdio: 'inherit',
|
|
41
|
+
env: newEnv,
|
|
42
|
+
});
|
|
43
|
+
// Wait for child process to complete
|
|
44
|
+
const exitCode = await new Promise((resolve) => {
|
|
45
|
+
child.on('close', (code) => resolve(code || 0));
|
|
46
|
+
child.on('error', (error) => {
|
|
47
|
+
console.error('Failed to relaunch with memory optimization:', error);
|
|
48
|
+
resolve(1);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
process.exit(exitCode);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Ensure the process is running with optimal memory settings
|
|
55
|
+
* This should be called early in the application startup
|
|
56
|
+
*/
|
|
57
|
+
export async function ensureOptimalMemory() {
|
|
58
|
+
if (shouldRelaunchWithMemory()) {
|
|
59
|
+
await relaunchWithOptimalMemory();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=memoryWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryWrapper.js","sourceRoot":"","sources":["../../../src/utils/memoryWrapper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAEnD;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,oDAAoD;IACpD,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC;QAC1E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0BAA0B;IAC1B,MAAM,UAAU,GAAG,aAAa,CAAC,kBAAkB,EAAE,CAAC;IACtD,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,kBAAkB,EAAE,CAAC;IAEtD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG;QACb,GAAG,OAAO,CAAC,GAAG;QACd,CAAC,eAAe,CAAC,EAAE,MAAM;QACzB,gDAAgD;QAChD,sBAAsB,EAAE,MAAM;KAC/B,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE;QAC9C,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;IAEH,qCAAqC;IACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACrD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;YACrE,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,wBAAwB,EAAE,EAAE,CAAC;QAC/B,MAAM,yBAAyB,EAAE,CAAC;IACpC,CAAC;AACH,CAAC"}
|
|
@@ -44,27 +44,37 @@ export async function preLaunchUpdateCheck() {
|
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
46
|
// Pending update found - perform update with visible logs
|
|
47
|
-
console.log(`\
|
|
47
|
+
console.log(`\nInstalling Blackbox CLI update to ${pendingUpdate.version}...`);
|
|
48
48
|
console.log('This will only take a moment...\n');
|
|
49
|
-
|
|
49
|
+
// For automatic updates (background check), always restart in interactive mode
|
|
50
|
+
// No arguments, no session preservation - just a simple restart
|
|
51
|
+
const updateCommand = process.platform === 'win32'
|
|
52
|
+
? 'powershell -ExecutionPolicy Bypass -Command "& { $env:AUTO_RESTART=\'true\'; $env:CONFIGURE=\'false\'; Invoke-Expression (Invoke-WebRequest -Uri \'https://shell.blackbox.ai/api/scripts/blackbox-cli-v2/download.ps1\' -UseBasicParsing).Content }"'
|
|
53
|
+
: 'NO_COLOR=1 curl -fsSL https://shell.blackbox.ai/api/scripts/blackbox-cli-v2/download.sh | NO_COLOR=1 CONFIGURE=false AUTO_RESTART=true bash';
|
|
50
54
|
try {
|
|
51
55
|
// Run update synchronously and show output to user
|
|
52
56
|
execSync(updateCommand, {
|
|
53
57
|
stdio: 'inherit', // Show installation logs to user
|
|
54
|
-
env: {
|
|
58
|
+
env: {
|
|
59
|
+
...process.env,
|
|
60
|
+
NO_COLOR: '1',
|
|
61
|
+
CONFIGURE: 'false',
|
|
62
|
+
AUTO_RESTART: 'true',
|
|
63
|
+
},
|
|
64
|
+
shell: process.platform === 'win32' ? 'powershell.exe' : undefined,
|
|
55
65
|
});
|
|
56
66
|
// Clear the pending update file
|
|
57
67
|
clearPendingUpdate();
|
|
58
|
-
console.log(`\
|
|
59
|
-
console.log(`
|
|
60
|
-
// Exit cleanly after update -
|
|
68
|
+
console.log(`\nSuccessfully updated to version ${pendingUpdate.version}!`);
|
|
69
|
+
console.log(`Restarting Blackbox CLI...\n`);
|
|
70
|
+
// Exit cleanly after update - installer will restart the CLI in interactive mode
|
|
61
71
|
process.exit(0);
|
|
62
72
|
}
|
|
63
73
|
catch (_error) {
|
|
64
74
|
// Update failed - clear pending update and continue with current version
|
|
65
75
|
clearPendingUpdate();
|
|
66
76
|
console.error('\n⚠️ Update failed. Continuing with current version...');
|
|
67
|
-
console.error('
|
|
77
|
+
console.error('You can try updating manually with: blackbox update\n');
|
|
68
78
|
// Don't block CLI startup on update failure
|
|
69
79
|
}
|
|
70
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preLaunchUpdateCheck.js","sourceRoot":"","sources":["../../../src/utils/preLaunchUpdateCheck.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,4CAA4C;IAC5C,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,mEAAmE;QACnE,wEAAwE;QACxE,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;QAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,iDAAiD;YACjD,kEAAkE;YAClE,OAAO;QACT,CAAC;QAED,uDAAuD;QACvD,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACjD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,kBAAkB,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,gEAAgE;QAChE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;YACtD,6DAA6D;YAC7D,kBAAkB,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,0DAA0D;QAC1D,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"preLaunchUpdateCheck.js","sourceRoot":"","sources":["../../../src/utils/preLaunchUpdateCheck.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,4CAA4C;IAC5C,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,mEAAmE;QACnE,wEAAwE;QACxE,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;QAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,iDAAiD;YACjD,kEAAkE;YAClE,OAAO;QACT,CAAC;QAED,uDAAuD;QACvD,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACjD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,kBAAkB,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,gEAAgE;QAChE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;YACtD,6DAA6D;YAC7D,kBAAkB,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,0DAA0D;QAC1D,OAAO,CAAC,GAAG,CAAC,uCAAuC,aAAa,CAAC,OAAO,KAAK,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAEjD,+EAA+E;QAC/E,gEAAgE;QAChE,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;YAChD,CAAC,CAAC,sPAAsP;YACxP,CAAC,CAAC,6IAA6I,CAAC;QAElJ,IAAI,CAAC;YACH,mDAAmD;YACnD,QAAQ,CAAC,aAAa,EAAE;gBACtB,KAAK,EAAE,SAAS,EAAE,iCAAiC;gBACnD,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,QAAQ,EAAE,GAAG;oBACb,SAAS,EAAE,OAAO;oBAClB,YAAY,EAAE,MAAM;iBACrB;gBACD,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;aACnE,CAAC,CAAC;YAEH,gCAAgC;YAChC,kBAAkB,EAAE,CAAC;YAErB,OAAO,CAAC,GAAG,CAAC,qCAAqC,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAE5C,iFAAiF;YACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAElB,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,yEAAyE;YACzE,kBAAkB,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;YACzE,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACvE,4CAA4C;QAC9C,CAAC;IACH,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,wDAAwD;IAC1D,CAAC;AACH,CAAC"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Play the completion notification sound
|
|
8
|
+
* This function is non-blocking and will not throw errors
|
|
9
|
+
*/
|
|
10
|
+
export declare function playCompletionSound(): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Play the completion notification sound without waiting for it to finish
|
|
13
|
+
* This is a fire-and-forget version that returns immediately
|
|
14
|
+
*/
|
|
15
|
+
export declare function playCompletionSoundAsync(): void;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { platform } from 'node:os';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
import fs from 'node:fs';
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = path.dirname(__filename);
|
|
13
|
+
/**
|
|
14
|
+
* Get the path to the notification sound file
|
|
15
|
+
*/
|
|
16
|
+
function getNotificationSoundPath() {
|
|
17
|
+
// The notification.mp3 is in packages/cli/assets/
|
|
18
|
+
// When running from source: packages/cli/src/utils -> packages/cli/assets
|
|
19
|
+
// When running from build: packages/cli/dist/utils -> packages/cli/assets
|
|
20
|
+
// Try relative to __dirname first (works for both source and built)
|
|
21
|
+
const relativePath = path.resolve(__dirname, '../../assets/notification.mp3');
|
|
22
|
+
if (fs.existsSync(relativePath)) {
|
|
23
|
+
return relativePath;
|
|
24
|
+
}
|
|
25
|
+
// Fallback: try one level up (in case directory structure is different)
|
|
26
|
+
const fallbackPath = path.resolve(__dirname, '../assets/notification.mp3');
|
|
27
|
+
if (fs.existsSync(fallbackPath)) {
|
|
28
|
+
return fallbackPath;
|
|
29
|
+
}
|
|
30
|
+
// Last resort: return the expected path (caller will handle missing file)
|
|
31
|
+
return relativePath;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Play a sound notification based on the current platform
|
|
35
|
+
* @param soundPath - Path to the sound file to play
|
|
36
|
+
* @returns Promise that resolves when sound finishes playing (or immediately if it fails)
|
|
37
|
+
*/
|
|
38
|
+
async function playSoundFile(soundPath) {
|
|
39
|
+
return new Promise((resolve) => {
|
|
40
|
+
// Check if the sound file exists
|
|
41
|
+
if (!fs.existsSync(soundPath)) {
|
|
42
|
+
if (process.env['DEBUG']) {
|
|
43
|
+
console.warn(`Sound notification file not found: ${soundPath}`);
|
|
44
|
+
}
|
|
45
|
+
resolve();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (process.env['DEBUG']) {
|
|
49
|
+
console.log(`Playing sound from: ${soundPath}`);
|
|
50
|
+
}
|
|
51
|
+
const currentPlatform = platform();
|
|
52
|
+
let command;
|
|
53
|
+
let args;
|
|
54
|
+
switch (currentPlatform) {
|
|
55
|
+
case 'darwin': // macOS
|
|
56
|
+
command = 'afplay';
|
|
57
|
+
args = [soundPath];
|
|
58
|
+
break;
|
|
59
|
+
case 'linux':
|
|
60
|
+
// Try paplay first (PulseAudio), fall back to aplay (ALSA)
|
|
61
|
+
command = 'paplay';
|
|
62
|
+
args = [soundPath];
|
|
63
|
+
break;
|
|
64
|
+
case 'win32': // Windows
|
|
65
|
+
command = 'powershell';
|
|
66
|
+
args = [
|
|
67
|
+
'-c',
|
|
68
|
+
`(New-Object Media.SoundPlayer '${soundPath}').PlaySync()`,
|
|
69
|
+
];
|
|
70
|
+
break;
|
|
71
|
+
default:
|
|
72
|
+
console.warn(`Sound notifications not supported on platform: ${currentPlatform}`);
|
|
73
|
+
resolve();
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (process.env['DEBUG']) {
|
|
77
|
+
console.log(`Executing: ${command} ${args.join(' ')}`);
|
|
78
|
+
}
|
|
79
|
+
const child = spawn(command, args, {
|
|
80
|
+
stdio: 'ignore',
|
|
81
|
+
detached: false,
|
|
82
|
+
});
|
|
83
|
+
// Set a timeout to prevent hanging
|
|
84
|
+
const timeout = setTimeout(() => {
|
|
85
|
+
child.kill();
|
|
86
|
+
resolve();
|
|
87
|
+
}, 5000); // 5 second timeout
|
|
88
|
+
child.on('error', (_error) => {
|
|
89
|
+
clearTimeout(timeout);
|
|
90
|
+
// If paplay fails on Linux, try aplay as fallback
|
|
91
|
+
if (currentPlatform === 'linux' && command === 'paplay') {
|
|
92
|
+
const fallbackChild = spawn('aplay', [soundPath], {
|
|
93
|
+
stdio: 'ignore',
|
|
94
|
+
detached: false,
|
|
95
|
+
});
|
|
96
|
+
fallbackChild.on('error', () => {
|
|
97
|
+
// Silently fail if both commands don't work
|
|
98
|
+
resolve();
|
|
99
|
+
});
|
|
100
|
+
fallbackChild.on('close', () => {
|
|
101
|
+
resolve();
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Silently fail - don't crash the app if sound can't play
|
|
106
|
+
resolve();
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
child.on('close', () => {
|
|
110
|
+
clearTimeout(timeout);
|
|
111
|
+
resolve();
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Play the completion notification sound
|
|
117
|
+
* This function is non-blocking and will not throw errors
|
|
118
|
+
*/
|
|
119
|
+
export async function playCompletionSound() {
|
|
120
|
+
try {
|
|
121
|
+
const soundPath = getNotificationSoundPath();
|
|
122
|
+
await playSoundFile(soundPath);
|
|
123
|
+
}
|
|
124
|
+
catch (_error) {
|
|
125
|
+
// Silently fail - sound notifications should never crash the app
|
|
126
|
+
// Only log in debug mode if needed
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Play the completion notification sound without waiting for it to finish
|
|
131
|
+
* This is a fire-and-forget version that returns immediately
|
|
132
|
+
*/
|
|
133
|
+
export function playCompletionSoundAsync() {
|
|
134
|
+
playCompletionSound().catch(() => {
|
|
135
|
+
// Silently ignore errors
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=soundNotification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soundNotification.js","sourceRoot":"","sources":["../../../src/utils/soundNotification.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,
|
|
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"}
|
|
@@ -38,6 +38,13 @@ export interface PendingUpdateInfo {
|
|
|
38
38
|
version: string;
|
|
39
39
|
checkedAt: number;
|
|
40
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Interface for last check timestamp information
|
|
43
|
+
*/
|
|
44
|
+
export interface LastCheckInfo {
|
|
45
|
+
timestamp: number;
|
|
46
|
+
success: boolean;
|
|
47
|
+
}
|
|
41
48
|
/**
|
|
42
49
|
* Reads pending update information
|
|
43
50
|
*/
|
|
@@ -50,3 +57,16 @@ export declare function writePendingUpdate(version: string): boolean;
|
|
|
50
57
|
* Clears pending update information
|
|
51
58
|
*/
|
|
52
59
|
export declare function clearPendingUpdate(): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Reads last check information
|
|
62
|
+
*/
|
|
63
|
+
export declare function readLastCheck(): LastCheckInfo | null;
|
|
64
|
+
/**
|
|
65
|
+
* Writes last check information
|
|
66
|
+
*/
|
|
67
|
+
export declare function writeLastCheck(success: boolean): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Checks if enough time has passed since last check
|
|
70
|
+
* @param minIntervalMs Minimum interval in milliseconds (default: 10 minutes)
|
|
71
|
+
*/
|
|
72
|
+
export declare function shouldCheckForUpdate(minIntervalMs?: number): boolean;
|