@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.
Files changed (233) hide show
  1. package/README.md +20 -0
  2. package/dist/assets/notification.mp3 +0 -0
  3. package/dist/package.json +2 -2
  4. package/dist/src/commands/configure/ConfigureUI.d.ts +1 -1
  5. package/dist/src/commands/configure/ConfigureUI.js +91 -22
  6. package/dist/src/commands/configure/ConfigureUI.js.map +1 -1
  7. package/dist/src/commands/configure.js +57 -16
  8. package/dist/src/commands/configure.js.map +1 -1
  9. package/dist/src/commands/shortcut.d.ts +10 -0
  10. package/dist/src/commands/shortcut.js +72 -0
  11. package/dist/src/commands/shortcut.js.map +1 -0
  12. package/dist/src/commands/voice.js +39 -34
  13. package/dist/src/commands/voice.js.map +1 -1
  14. package/dist/src/config/config.js +8 -5
  15. package/dist/src/config/config.js.map +1 -1
  16. package/dist/src/config/modelFetcher.d.ts +4 -0
  17. package/dist/src/config/modelFetcher.js +68 -22
  18. package/dist/src/config/modelFetcher.js.map +1 -1
  19. package/dist/src/config/settings.d.ts +2 -0
  20. package/dist/src/config/settings.js +48 -3
  21. package/dist/src/config/settings.js.map +1 -1
  22. package/dist/src/config/settingsSchema.d.ts +64 -6
  23. package/dist/src/config/settingsSchema.js +62 -6
  24. package/dist/src/config/settingsSchema.js.map +1 -1
  25. package/dist/src/gemini.js +31 -20
  26. package/dist/src/gemini.js.map +1 -1
  27. package/dist/src/generated/git-commit.d.ts +2 -2
  28. package/dist/src/generated/git-commit.js +2 -2
  29. package/dist/src/services/BuiltinCommandLoader.js +4 -2
  30. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  31. package/dist/src/services/agentExecutor.d.ts +57 -0
  32. package/dist/src/services/agentExecutor.js +149 -0
  33. package/dist/src/services/agentExecutor.js.map +1 -0
  34. package/dist/src/services/voiceRecordingService.d.ts +13 -1
  35. package/dist/src/services/voiceRecordingService.js +38 -5
  36. package/dist/src/services/voiceRecordingService.js.map +1 -1
  37. package/dist/src/ui/App.d.ts +1 -1
  38. package/dist/src/ui/App.js +292 -26
  39. package/dist/src/ui/App.js.map +1 -1
  40. package/dist/src/ui/colors.js +3 -0
  41. package/dist/src/ui/colors.js.map +1 -1
  42. package/dist/src/ui/commands/agentCommand.d.ts +7 -0
  43. package/dist/src/ui/commands/agentCommand.js +181 -0
  44. package/dist/src/ui/commands/agentCommand.js.map +1 -0
  45. package/dist/src/ui/commands/modelCommand.js +15 -2
  46. package/dist/src/ui/commands/modelCommand.js.map +1 -1
  47. package/dist/src/ui/commands/quitCommand.js +5 -0
  48. package/dist/src/ui/commands/quitCommand.js.map +1 -1
  49. package/dist/src/ui/commands/subAgentsCommand.d.ts +7 -0
  50. package/dist/src/ui/commands/subAgentsCommand.js +32 -0
  51. package/dist/src/ui/commands/subAgentsCommand.js.map +1 -0
  52. package/dist/src/ui/commands/types.d.ts +24 -3
  53. package/dist/src/ui/commands/types.js.map +1 -1
  54. package/dist/src/ui/commands/voiceCommand.js +70 -34
  55. package/dist/src/ui/commands/voiceCommand.js.map +1 -1
  56. package/dist/src/ui/commands/voiceCommand.test.d.ts +6 -0
  57. package/dist/src/ui/commands/voiceCommand.test.js +131 -0
  58. package/dist/src/ui/commands/voiceCommand.test.js.map +1 -0
  59. package/dist/src/ui/components/AgentModelSelector.d.ts +17 -0
  60. package/dist/src/ui/components/AgentModelSelector.js +41 -0
  61. package/dist/src/ui/components/AgentModelSelector.js.map +1 -0
  62. package/dist/src/ui/components/AgentSetDialog.d.ts +15 -0
  63. package/dist/src/ui/components/AgentSetDialog.js +52 -0
  64. package/dist/src/ui/components/AgentSetDialog.js.map +1 -0
  65. package/dist/src/ui/components/ApiKeyInputDialog.d.ts +17 -0
  66. package/dist/src/ui/components/ApiKeyInputDialog.js +44 -0
  67. package/dist/src/ui/components/ApiKeyInputDialog.js.map +1 -0
  68. package/dist/src/ui/components/AsciiArt.d.ts +3 -3
  69. package/dist/src/ui/components/AsciiArt.js +18 -18
  70. package/dist/src/ui/components/AsciiArt.js.map +1 -1
  71. package/dist/src/ui/components/AuthDialog.js +50 -7
  72. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  73. package/dist/src/ui/components/Footer.d.ts +8 -0
  74. package/dist/src/ui/components/Footer.js +17 -4
  75. package/dist/src/ui/components/Footer.js.map +1 -1
  76. package/dist/src/ui/components/GenericProviderKeyPrompt.js +1 -1
  77. package/dist/src/ui/components/GenericProviderKeyPrompt.js.map +1 -1
  78. package/dist/src/ui/components/Header.js +6 -10
  79. package/dist/src/ui/components/Header.js.map +1 -1
  80. package/dist/src/ui/components/HistoryBrowserDialog.js +2 -1
  81. package/dist/src/ui/components/HistoryBrowserDialog.js.map +1 -1
  82. package/dist/src/ui/components/InputPrompt.js +3 -1
  83. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  84. package/dist/src/ui/components/MemoryUsageDisplay.js +41 -8
  85. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  86. package/dist/src/ui/components/SettingsDialog.js +4 -3
  87. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  88. package/dist/src/ui/components/StatsDisplay.js +1 -1
  89. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  90. package/dist/src/ui/components/SuggestionsDisplay.js +3 -2
  91. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  92. package/dist/src/ui/components/Tips.js +1 -1
  93. package/dist/src/ui/components/Tips.js.map +1 -1
  94. package/dist/src/ui/components/agents/SingleAgentDialog.d.ts +23 -0
  95. package/dist/src/ui/components/agents/SingleAgentDialog.js +222 -0
  96. package/dist/src/ui/components/agents/SingleAgentDialog.js.map +1 -0
  97. package/dist/src/ui/components/messages/DiffRenderer.js +1 -9
  98. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  99. package/dist/src/ui/components/messages/ErrorMessage.js +2 -1
  100. package/dist/src/ui/components/messages/ErrorMessage.js.map +1 -1
  101. package/dist/src/ui/components/messages/InfoMessage.js +2 -1
  102. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
  103. package/dist/src/ui/components/messages/ToolGroupMessage.js +4 -1
  104. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  105. package/dist/src/ui/components/messages/ToolMessage.js +4 -4
  106. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  107. package/dist/src/ui/components/messages/UserMessage.js +1 -2
  108. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  109. package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.js +1 -19
  110. package/dist/src/ui/components/multiagent/MultiAgentConfigDialog.js.map +1 -1
  111. package/dist/src/ui/components/shared/RadioButtonSelect.js +14 -4
  112. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  113. package/dist/src/ui/contexts/SessionContext.d.ts +18 -0
  114. package/dist/src/ui/contexts/SessionContext.js +25 -1
  115. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  116. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +1 -1
  117. package/dist/src/ui/hooks/shellCommandProcessor.js +13 -2
  118. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  119. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -2
  120. package/dist/src/ui/hooks/slashCommandProcessor.js +65 -29
  121. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  122. package/dist/src/ui/hooks/useAdaptiveStream.d.ts +2 -1
  123. package/dist/src/ui/hooks/useAdaptiveStream.js +2 -2
  124. package/dist/src/ui/hooks/useAdaptiveStream.js.map +1 -1
  125. package/dist/src/ui/hooks/useAgentCommandProcessor.d.ts +26 -0
  126. package/dist/src/ui/hooks/useAgentCommandProcessor.js +967 -0
  127. package/dist/src/ui/hooks/useAgentCommandProcessor.js.map +1 -0
  128. package/dist/src/ui/hooks/useAuthCommand.d.ts +2 -1
  129. package/dist/src/ui/hooks/useAuthCommand.js +22 -2
  130. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
  131. package/dist/src/ui/hooks/useDialogClose.d.ts +2 -0
  132. package/dist/src/ui/hooks/useDialogClose.js +5 -0
  133. package/dist/src/ui/hooks/useDialogClose.js.map +1 -1
  134. package/dist/src/ui/hooks/useEncryptedStream.d.ts +2 -1
  135. package/dist/src/ui/hooks/useEncryptedStream.js +31 -3
  136. package/dist/src/ui/hooks/useEncryptedStream.js.map +1 -1
  137. package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -1
  138. package/dist/src/ui/hooks/useGeminiStream.js +292 -22
  139. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  140. package/dist/src/ui/hooks/useInputBoxColor.d.ts +13 -0
  141. package/dist/src/ui/hooks/useInputBoxColor.js +62 -0
  142. package/dist/src/ui/hooks/useInputBoxColor.js.map +1 -0
  143. package/dist/src/ui/hooks/useMessageQueue.d.ts +7 -1
  144. package/dist/src/ui/hooks/useMessageQueue.js +9 -3
  145. package/dist/src/ui/hooks/useMessageQueue.js.map +1 -1
  146. package/dist/src/ui/hooks/useSingleAgentCommand.d.ts +10 -0
  147. package/dist/src/ui/hooks/useSingleAgentCommand.js +21 -0
  148. package/dist/src/ui/hooks/useSingleAgentCommand.js.map +1 -0
  149. package/dist/src/ui/themes/ansi-light.js +1 -0
  150. package/dist/src/ui/themes/ansi-light.js.map +1 -1
  151. package/dist/src/ui/themes/ansi.js +1 -0
  152. package/dist/src/ui/themes/ansi.js.map +1 -1
  153. package/dist/src/ui/themes/atom-one-dark.js +14 -13
  154. package/dist/src/ui/themes/atom-one-dark.js.map +1 -1
  155. package/dist/src/ui/themes/ayu-light.js +14 -13
  156. package/dist/src/ui/themes/ayu-light.js.map +1 -1
  157. package/dist/src/ui/themes/ayu.js +14 -13
  158. package/dist/src/ui/themes/ayu.js.map +1 -1
  159. package/dist/src/ui/themes/blackbox-dark.js +36 -31
  160. package/dist/src/ui/themes/blackbox-dark.js.map +1 -1
  161. package/dist/src/ui/themes/blackbox-light.js +41 -39
  162. package/dist/src/ui/themes/blackbox-light.js.map +1 -1
  163. package/dist/src/ui/themes/default-light.js +20 -20
  164. package/dist/src/ui/themes/default-light.js.map +1 -1
  165. package/dist/src/ui/themes/default.js +27 -27
  166. package/dist/src/ui/themes/default.js.map +1 -1
  167. package/dist/src/ui/themes/dracula.js +14 -13
  168. package/dist/src/ui/themes/dracula.js.map +1 -1
  169. package/dist/src/ui/themes/github-dark.js +14 -13
  170. package/dist/src/ui/themes/github-dark.js.map +1 -1
  171. package/dist/src/ui/themes/github-light.js +14 -13
  172. package/dist/src/ui/themes/github-light.js.map +1 -1
  173. package/dist/src/ui/themes/googlecode.js +1 -0
  174. package/dist/src/ui/themes/googlecode.js.map +1 -1
  175. package/dist/src/ui/themes/no-color.js +2 -0
  176. package/dist/src/ui/themes/no-color.js.map +1 -1
  177. package/dist/src/ui/themes/semantic-tokens.d.ts +1 -0
  178. package/dist/src/ui/themes/semantic-tokens.js +3 -0
  179. package/dist/src/ui/themes/semantic-tokens.js.map +1 -1
  180. package/dist/src/ui/themes/shades-of-purple.js +1 -0
  181. package/dist/src/ui/themes/shades-of-purple.js.map +1 -1
  182. package/dist/src/ui/themes/theme.d.ts +2 -0
  183. package/dist/src/ui/themes/theme.js +35 -28
  184. package/dist/src/ui/themes/theme.js.map +1 -1
  185. package/dist/src/ui/themes/xcode.js +1 -0
  186. package/dist/src/ui/themes/xcode.js.map +1 -1
  187. package/dist/src/ui/types.d.ts +5 -0
  188. package/dist/src/ui/utils/agentConversationUtils.d.ts +28 -0
  189. package/dist/src/ui/utils/agentConversationUtils.js +71 -0
  190. package/dist/src/ui/utils/agentConversationUtils.js.map +1 -0
  191. package/dist/src/ui/utils/colorBlend.d.ts +33 -0
  192. package/dist/src/ui/utils/colorBlend.js +61 -0
  193. package/dist/src/ui/utils/colorBlend.js.map +1 -0
  194. package/dist/src/ui/utils/commandUtils.d.ts +2 -1
  195. package/dist/src/ui/utils/commandUtils.js +14 -1
  196. package/dist/src/ui/utils/commandUtils.js.map +1 -1
  197. package/dist/src/ui/utils/commandUtils.test.js +25 -0
  198. package/dist/src/ui/utils/commandUtils.test.js.map +1 -1
  199. package/dist/src/ui/utils/terminalBackgroundDetector.d.ts +35 -0
  200. package/dist/src/ui/utils/terminalBackgroundDetector.js +200 -0
  201. package/dist/src/ui/utils/terminalBackgroundDetector.js.map +1 -0
  202. package/dist/src/utils/agentCommandBuilder.d.ts +48 -0
  203. package/dist/src/utils/agentCommandBuilder.js +328 -0
  204. package/dist/src/utils/agentCommandBuilder.js.map +1 -0
  205. package/dist/src/utils/apiKeyUtils.d.ts +47 -0
  206. package/dist/src/utils/apiKeyUtils.js +177 -0
  207. package/dist/src/utils/apiKeyUtils.js.map +1 -0
  208. package/dist/src/utils/backgroundUpdateCheck.js +104 -7
  209. package/dist/src/utils/backgroundUpdateCheck.js.map +1 -1
  210. package/dist/src/utils/memoryManager.d.ts +85 -0
  211. package/dist/src/utils/memoryManager.js +258 -0
  212. package/dist/src/utils/memoryManager.js.map +1 -0
  213. package/dist/src/utils/memoryMonitor.d.ts +89 -0
  214. package/dist/src/utils/memoryMonitor.js +238 -0
  215. package/dist/src/utils/memoryMonitor.js.map +1 -0
  216. package/dist/src/utils/memoryWrapper.d.ts +18 -0
  217. package/dist/src/utils/memoryWrapper.js +62 -0
  218. package/dist/src/utils/memoryWrapper.js.map +1 -0
  219. package/dist/src/utils/preLaunchUpdateCheck.js +17 -7
  220. package/dist/src/utils/preLaunchUpdateCheck.js.map +1 -1
  221. package/dist/src/utils/shellShortcut.d.ts +45 -0
  222. package/dist/src/utils/shellShortcut.js +221 -0
  223. package/dist/src/utils/shellShortcut.js.map +1 -0
  224. package/dist/src/utils/soundNotification.d.ts +15 -0
  225. package/dist/src/utils/soundNotification.js +138 -0
  226. package/dist/src/utils/soundNotification.js.map +1 -0
  227. package/dist/src/utils/userStartupWarnings.js +0 -20
  228. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  229. package/dist/src/utils/versionStorage.d.ts +20 -0
  230. package/dist/src/utils/versionStorage.js +62 -0
  231. package/dist/src/utils/versionStorage.js.map +1 -1
  232. package/dist/tsconfig.tsbuildinfo +1 -1
  233. 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(`\n🚀 Installing Blackbox CLI update to ${pendingUpdate.version}...`);
47
+ console.log(`\nInstalling Blackbox CLI update to ${pendingUpdate.version}...`);
48
48
  console.log('This will only take a moment...\n');
49
- const updateCommand = 'curl -fsSL https://shell.blackbox.ai/api/scripts/blackbox-cli-v2/download.sh | CONFIGURE=false bash';
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: { ...process.env, CONFIGURE: 'false' },
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(`\n✅ Successfully updated to version ${pendingUpdate.version}!`);
59
- console.log(`Please run the blackbox command again to use the new version.\n`);
60
- // Exit cleanly after update - user needs to run command again
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('💡 You can try updating manually with: blackbox update\n');
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,0CAA0C,aAAa,CAAC,OAAO,KAAK,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAEjD,MAAM,aAAa,GAAG,qGAAqG,CAAC;QAE5H,IAAI,CAAC;YACH,mDAAmD;YACnD,QAAQ,CAAC,aAAa,EAAE;gBACtB,KAAK,EAAE,SAAS,EAAE,iCAAiC;gBACnD,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE;aAC5C,CAAC,CAAC;YAEH,gCAAgC;YAChC,kBAAkB,EAAE,CAAC;YAErB,OAAO,CAAC,GAAG,CAAC,uCAAuC,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;YAE/E,8DAA8D;YAC9D,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,0DAA0D,CAAC,CAAC;YAC1E,4CAA4C;QAC9C,CAAC;IACH,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,wDAAwD;IAC1D,CAAC;AACH,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,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,4BAA4B;AAC5B,MAAM,kBAAkB,GAAiB;IACvC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,KAAK,EAAE,aAAqB,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1D,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAC1B,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;aAC1B,CAAC,CAAC;YAEH,IAAI,iBAAiB,KAAK,YAAY,EAAE,CAAC;gBACvC,OAAO,iHAAiH,CAAC;YAC3H,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,IAAa,EAAE,CAAC;YACvB,OAAO,oEAAoE,CAAC;QAC9E,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,kBAAkB,GAAiB;IACvC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,KAAK,EAAE,aAAqB,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,iBAAiB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC3D,MAAM,YAAY,GAChB,yLAAyL,CAAC;YAE5L,gCAAgC;YAChC,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,iBAAiB,EAAE,CAAC;gBAC1D,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,IAAa,EAAE,CAAC;YACvB,OAAO,oEAAoE,CAAC;QAC9E,CAAC;IACH,CAAC;CACF,CAAC;AAEF,qBAAqB;AACrB,MAAM,cAAc,GAA4B;IAC9C,kBAAkB;IAClB,kBAAkB;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,aAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAC1D,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"userStartupWarnings.js","sourceRoot":"","sources":["../../../src/utils/userStartupWarnings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,4BAA4B;AAC5B,MAAM,kBAAkB,GAAiB;IACvC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,KAAK,EAAE,aAAqB,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,iBAAiB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC3D,MAAM,YAAY,GAChB,yLAAyL,CAAC;YAE5L,gCAAgC;YAChC,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,iBAAiB,EAAE,CAAC;gBAC1D,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,IAAa,EAAE,CAAC;YACvB,OAAO,oEAAoE,CAAC;QAC9E,CAAC;IACH,CAAC;CACF,CAAC;AAEF,qBAAqB;AACrB,MAAM,cAAc,GAA4B;IAC9C,kBAAkB;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,aAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAC1D,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAC/C,CAAC"}
@@ -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;