@within-7/minto 0.1.4 → 0.1.6

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 (264) hide show
  1. package/dist/commands/agents/AgentsCommand.js +2342 -0
  2. package/dist/commands/agents/AgentsCommand.js.map +7 -0
  3. package/dist/commands/agents/constants.js +58 -0
  4. package/dist/commands/agents/constants.js.map +7 -0
  5. package/dist/commands/agents/index.js +37 -0
  6. package/dist/commands/agents/index.js.map +7 -0
  7. package/dist/commands/agents/types.js +10 -0
  8. package/dist/commands/agents/types.js.map +7 -0
  9. package/dist/commands/agents/utils/fileOperations.js +185 -0
  10. package/dist/commands/agents/utils/fileOperations.js.map +7 -0
  11. package/dist/commands/agents/utils/index.js +21 -0
  12. package/dist/commands/agents/utils/index.js.map +7 -0
  13. package/dist/commands/bug.js +2 -2
  14. package/dist/commands/bug.js.map +2 -2
  15. package/dist/commands/compact.js +5 -5
  16. package/dist/commands/compact.js.map +2 -2
  17. package/dist/commands/ctx_viz.js +55 -22
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/mcp-interactive.js +11 -11
  20. package/dist/commands/mcp-interactive.js.map +2 -2
  21. package/dist/commands/model.js +94 -32
  22. package/dist/commands/model.js.map +3 -3
  23. package/dist/commands/plugin/AddMarketplaceForm.js +49 -21
  24. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  25. package/dist/commands/plugin/ConfirmDialog.js +38 -26
  26. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  27. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +24 -8
  28. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  29. package/dist/commands/plugin/InstalledPluginsManager.js +3 -1
  30. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  31. package/dist/commands/plugin/MainMenu.js +16 -7
  32. package/dist/commands/plugin/MainMenu.js.map +2 -2
  33. package/dist/commands/plugin/MarketplaceManager.js +84 -39
  34. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  35. package/dist/commands/plugin/MarketplaceSelector.js +7 -3
  36. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  37. package/dist/commands/plugin/PlaceholderScreen.js +16 -2
  38. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  39. package/dist/commands/plugin/PluginBrowser.js +4 -2
  40. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  41. package/dist/commands/plugin/PluginDetailsInstall.js +12 -6
  42. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  43. package/dist/commands/plugin/PluginDetailsManage.js +14 -5
  44. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  45. package/dist/commands/plugin/example-usage.js.map +2 -2
  46. package/dist/commands/plugin/utils.js.map +2 -2
  47. package/dist/commands/plugin.js +226 -46
  48. package/dist/commands/plugin.js.map +2 -2
  49. package/dist/commands/refreshCommands.js +6 -3
  50. package/dist/commands/refreshCommands.js.map +2 -2
  51. package/dist/commands/resume.js +2 -1
  52. package/dist/commands/resume.js.map +2 -2
  53. package/dist/commands/setup.js +19 -5
  54. package/dist/commands/setup.js.map +2 -2
  55. package/dist/commands/terminalSetup.js +2 -2
  56. package/dist/commands/terminalSetup.js.map +1 -1
  57. package/dist/commands.js +14 -30
  58. package/dist/commands.js.map +2 -2
  59. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  60. package/dist/components/AskUserQuestionDialog/QuestionView.js +10 -1
  61. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  62. package/dist/components/BackgroundTasksPanel.js +5 -1
  63. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  64. package/dist/components/Config.js +17 -4
  65. package/dist/components/Config.js.map +2 -2
  66. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  67. package/dist/components/CustomSelect/select-option.js +4 -1
  68. package/dist/components/CustomSelect/select-option.js.map +2 -2
  69. package/dist/components/Help.js +6 -8
  70. package/dist/components/Help.js.map +2 -2
  71. package/dist/components/Logo.js +1 -1
  72. package/dist/components/Logo.js.map +2 -2
  73. package/dist/components/ModelListManager.js.map +2 -2
  74. package/dist/components/ModelSelector/ModelSelector.js +2030 -0
  75. package/dist/components/ModelSelector/ModelSelector.js.map +7 -0
  76. package/dist/components/ModelSelector/ScreenContainer.js +27 -0
  77. package/dist/components/ModelSelector/ScreenContainer.js.map +7 -0
  78. package/dist/components/ModelSelector/constants.js +37 -0
  79. package/dist/components/ModelSelector/constants.js.map +7 -0
  80. package/dist/components/ModelSelector/hooks/index.js +5 -0
  81. package/dist/components/ModelSelector/hooks/index.js.map +7 -0
  82. package/dist/components/ModelSelector/hooks/useEscapeNavigation.js +21 -0
  83. package/dist/components/ModelSelector/hooks/useEscapeNavigation.js.map +7 -0
  84. package/dist/components/ModelSelector/index.js +17 -0
  85. package/dist/components/ModelSelector/index.js.map +7 -0
  86. package/dist/components/ModelSelector/types.js +1 -0
  87. package/dist/components/ModelSelector/types.js.map +7 -0
  88. package/dist/components/PressEnterToContinue.js +1 -1
  89. package/dist/components/PressEnterToContinue.js.map +2 -2
  90. package/dist/components/ProjectOnboarding.js +1 -1
  91. package/dist/components/ProjectOnboarding.js.map +2 -2
  92. package/dist/components/PromptInput.js +88 -37
  93. package/dist/components/PromptInput.js.map +2 -2
  94. package/dist/components/QuitSummary.js +17 -10
  95. package/dist/components/QuitSummary.js.map +2 -2
  96. package/dist/components/SentryErrorBoundary.js.map +2 -2
  97. package/dist/components/StreamingBashOutput.js.map +2 -2
  98. package/dist/components/StructuredDiff.js.map +2 -2
  99. package/dist/components/SubagentProgress.js.map +2 -2
  100. package/dist/components/TaskCard.js.map +2 -2
  101. package/dist/components/TextInput.js.map +1 -1
  102. package/dist/components/TodoItem.js.map +1 -1
  103. package/dist/components/binary-feedback/BinaryFeedbackOption.js +1 -3
  104. package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +2 -2
  105. package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +1 -1
  106. package/dist/components/messages/AssistantToolUseMessage.js +3 -1
  107. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  108. package/dist/components/messages/TaskProgressMessage.js.map +2 -2
  109. package/dist/components/messages/TaskToolMessage.js.map +2 -2
  110. package/dist/components/messages/UserToolResultMessage/utils.js.map +2 -2
  111. package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +2 -2
  112. package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +2 -2
  113. package/dist/components/permissions/hooks.js.map +2 -2
  114. package/dist/constants/modelCapabilities.js +1 -1
  115. package/dist/constants/modelCapabilities.js.map +2 -2
  116. package/dist/constants/prompts.js.map +1 -1
  117. package/dist/constants/timing.js +34 -0
  118. package/dist/constants/timing.js.map +7 -0
  119. package/dist/entrypoints/cli.js +128 -33
  120. package/dist/entrypoints/cli.js.map +3 -3
  121. package/dist/entrypoints/mcp.js +13 -18
  122. package/dist/entrypoints/mcp.js.map +2 -2
  123. package/dist/hooks/useCanUseTool.js.map +2 -2
  124. package/dist/hooks/useCancelRequest.js.map +1 -1
  125. package/dist/hooks/useHistorySearch.js.map +2 -2
  126. package/dist/hooks/useLogStartupTime.js.map +2 -2
  127. package/dist/hooks/usePermissionRequestLogging.js.map +2 -2
  128. package/dist/hooks/useTextInput.js.map +1 -1
  129. package/dist/hooks/useUnifiedCompletion.js +493 -394
  130. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  131. package/dist/index.js.map +2 -2
  132. package/dist/permissions.js +4 -7
  133. package/dist/permissions.js.map +2 -2
  134. package/dist/query.js +6 -1
  135. package/dist/query.js.map +2 -2
  136. package/dist/screens/REPL.js +72 -36
  137. package/dist/screens/REPL.js.map +2 -2
  138. package/dist/screens/ResumeConversation.js +2 -1
  139. package/dist/screens/ResumeConversation.js.map +2 -2
  140. package/dist/services/adapters/base.js.map +2 -2
  141. package/dist/services/adapters/chatCompletions.js.map +2 -2
  142. package/dist/services/adapters/responsesAPI.js +3 -1
  143. package/dist/services/adapters/responsesAPI.js.map +2 -2
  144. package/dist/services/claude.js +327 -328
  145. package/dist/services/claude.js.map +2 -2
  146. package/dist/services/customCommands.js +6 -1
  147. package/dist/services/customCommands.js.map +2 -2
  148. package/dist/services/fileFreshness.js.map +2 -2
  149. package/dist/services/gpt5ConnectionTest.js +20 -7
  150. package/dist/services/gpt5ConnectionTest.js.map +2 -2
  151. package/dist/services/hookExecutor.js +6 -12
  152. package/dist/services/hookExecutor.js.map +2 -2
  153. package/dist/services/mcpClient.js +29 -2
  154. package/dist/services/mcpClient.js.map +2 -2
  155. package/dist/services/mentionProcessor.js +23 -10
  156. package/dist/services/mentionProcessor.js.map +2 -2
  157. package/dist/services/modelAdapterFactory.js.map +2 -2
  158. package/dist/services/oauth.js.map +2 -2
  159. package/dist/services/openai.js +109 -72
  160. package/dist/services/openai.js.map +3 -3
  161. package/dist/services/responseStateManager.js.map +2 -2
  162. package/dist/services/systemReminder.js.map +2 -2
  163. package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
  164. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +14 -8
  165. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  166. package/dist/tools/BashOutputTool/BashOutputTool.js.map +2 -2
  167. package/dist/tools/BashTool/BashTool.js.map +2 -2
  168. package/dist/tools/FileReadTool/FileReadTool.js.map +1 -1
  169. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  170. package/dist/tools/GrepTool/GrepTool.js +1 -4
  171. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  172. package/dist/tools/MultiEditTool/MultiEditTool.js +4 -1
  173. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  174. package/dist/tools/NotebookReadTool/NotebookReadTool.js +3 -1
  175. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  176. package/dist/tools/SkillTool/SkillTool.js +12 -6
  177. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  178. package/dist/tools/TaskTool/TaskTool.js +14 -5
  179. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  180. package/dist/tools/TaskTool/prompt.js.map +2 -2
  181. package/dist/tools/ThinkTool/ThinkTool.js +6 -1
  182. package/dist/tools/ThinkTool/ThinkTool.js.map +2 -2
  183. package/dist/tools/TodoWriteTool/TodoWriteTool.js +23 -3
  184. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  185. package/dist/tools/URLFetcherTool/URLFetcherTool.js +2 -2
  186. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  187. package/dist/tools/URLFetcherTool/cache.js +6 -3
  188. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  189. package/dist/tools/URLFetcherTool/htmlToMarkdown.js +3 -1
  190. package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +2 -2
  191. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  192. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  193. package/dist/tools/WebSearchTool/searchProviders.js +15 -6
  194. package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
  195. package/dist/tools.js +4 -1
  196. package/dist/tools.js.map +2 -2
  197. package/dist/types/core.js +1 -0
  198. package/dist/types/core.js.map +7 -0
  199. package/dist/types/hooks.js +1 -4
  200. package/dist/types/hooks.js.map +2 -2
  201. package/dist/types/marketplace.js +8 -2
  202. package/dist/types/marketplace.js.map +2 -2
  203. package/dist/types/plugin.js +9 -6
  204. package/dist/types/plugin.js.map +2 -2
  205. package/dist/utils/BackgroundShellManager.js +76 -10
  206. package/dist/utils/BackgroundShellManager.js.map +2 -2
  207. package/dist/utils/PersistentShell.js +7 -2
  208. package/dist/utils/PersistentShell.js.map +2 -2
  209. package/dist/utils/advancedFuzzyMatcher.js +4 -1
  210. package/dist/utils/advancedFuzzyMatcher.js.map +2 -2
  211. package/dist/utils/agentLoader.js +69 -35
  212. package/dist/utils/agentLoader.js.map +2 -2
  213. package/dist/utils/agentStorage.js.map +2 -2
  214. package/dist/utils/async.js +163 -0
  215. package/dist/utils/async.js.map +7 -0
  216. package/dist/utils/autoUpdater.js +8 -2
  217. package/dist/utils/autoUpdater.js.map +2 -2
  218. package/dist/utils/commands.js +23 -11
  219. package/dist/utils/commands.js.map +2 -2
  220. package/dist/utils/commonUnixCommands.js +3 -1
  221. package/dist/utils/commonUnixCommands.js.map +2 -2
  222. package/dist/utils/compressionMode.js.map +2 -2
  223. package/dist/utils/config.js +30 -14
  224. package/dist/utils/config.js.map +2 -2
  225. package/dist/utils/debugLogger.js.map +2 -2
  226. package/dist/utils/env.js.map +2 -2
  227. package/dist/utils/envConfig.js +82 -0
  228. package/dist/utils/envConfig.js.map +7 -0
  229. package/dist/utils/errorHandling.js +89 -0
  230. package/dist/utils/errorHandling.js.map +7 -0
  231. package/dist/utils/expertChatStorage.js.map +2 -2
  232. package/dist/utils/fuzzyMatcher.js +13 -7
  233. package/dist/utils/fuzzyMatcher.js.map +2 -2
  234. package/dist/utils/hookManager.js +14 -4
  235. package/dist/utils/hookManager.js.map +2 -2
  236. package/dist/utils/log.js.map +2 -2
  237. package/dist/utils/marketplaceManager.js +44 -9
  238. package/dist/utils/marketplaceManager.js.map +2 -2
  239. package/dist/utils/messageContextManager.js.map +1 -1
  240. package/dist/utils/messages.js +6 -3
  241. package/dist/utils/messages.js.map +2 -2
  242. package/dist/utils/model.js +3 -1
  243. package/dist/utils/model.js.map +2 -2
  244. package/dist/utils/pluginInstaller.js +3 -15
  245. package/dist/utils/pluginInstaller.js.map +2 -2
  246. package/dist/utils/pluginLoader.js +41 -13
  247. package/dist/utils/pluginLoader.js.map +2 -2
  248. package/dist/utils/pluginRegistry.js.map +2 -2
  249. package/dist/utils/pluginValidator.js +71 -49
  250. package/dist/utils/pluginValidator.js.map +2 -2
  251. package/dist/utils/ptyCompat.js.map +2 -2
  252. package/dist/utils/roundConverter.js.map +2 -2
  253. package/dist/utils/secureFile.js +43 -14
  254. package/dist/utils/secureFile.js.map +2 -2
  255. package/dist/utils/sessionState.js.map +2 -2
  256. package/dist/utils/skillLoader.js.map +2 -2
  257. package/dist/utils/teamConfig.js +7 -4
  258. package/dist/utils/teamConfig.js.map +2 -2
  259. package/dist/utils/theme.js.map +2 -2
  260. package/dist/utils/thinking.js.map +2 -2
  261. package/dist/utils/unaryLogging.js.map +2 -2
  262. package/dist/version.js +2 -2
  263. package/dist/version.js.map +1 -1
  264. package/package.json +5 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/autoUpdater.ts"],
4
- "sourcesContent": ["import { execFileNoThrow } from './execFileNoThrow'\nimport { logError } from './log'\n \nimport { lt, gt } from 'semver'\nimport { MACRO } from '@constants/macros'\nimport { PRODUCT_NAME } from '@constants/product'\nimport { getGlobalConfig, saveGlobalConfig, isAutoUpdaterDisabled } from './config'\nimport { env } from './env'\n\nexport type VersionConfig = {\n minVersion: string\n}\n\n// Ensure current version meets minimum supported version; exit if too old\nexport async function assertMinVersion(): Promise<void> {\n try {\n const versionConfig: VersionConfig = { minVersion: '0.0.0' }\n if (versionConfig.minVersion && lt(MACRO.VERSION, versionConfig.minVersion)) {\n const suggestions = await getUpdateCommandSuggestions()\n // Intentionally minimal: caller may print its own message; we just exit\n // eslint-disable-next-line no-console\n console.error(\n `Your ${PRODUCT_NAME} version ${MACRO.VERSION} is below the minimum supported ${versionConfig.minVersion}.\\n` +\n 'Update using one of:\\n' +\n suggestions.map(c => ` ${c}`).join('\\n'),\n )\n process.exit(1)\n }\n } catch (error) {\n logError(`Error checking minimum version: ${error}`)\n }\n}\n\n// Get latest version from npm (via npm CLI or HTTP fallback)\nexport async function getLatestVersion(): Promise<string | null> {\n // Prefer npm CLI (fast when available)\n try {\n const abortController = new AbortController()\n setTimeout(() => abortController.abort(), 5000)\n const result = await execFileNoThrow(\n 'npm',\n ['view', MACRO.PACKAGE_URL, 'version'],\n abortController.signal,\n )\n if (result.code === 0) {\n const v = result.stdout.trim()\n if (v) return v\n }\n } catch {}\n\n // Fallback: query npm registry directly\n try {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), 5000)\n const res = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(MACRO.PACKAGE_URL)}`,\n {\n method: 'GET',\n headers: {\n Accept: 'application/vnd.npm.install-v1+json',\n 'User-Agent': `${PRODUCT_NAME}/${MACRO.VERSION}`,\n },\n signal: controller.signal,\n },\n )\n clearTimeout(timer)\n if (!res.ok) return null\n const json: any = await res.json().catch(() => null)\n const latest = json && json['dist-tags'] && json['dist-tags'].latest\n return typeof latest === 'string' ? latest : null\n } catch {\n return null\n }\n}\n\n// Suggest manual update commands; prefer Bun first, then npm\nexport async function getUpdateCommandSuggestions(): Promise<string[]> {\n return [\n `bun add -g ${MACRO.PACKAGE_URL}@latest`,\n `npm install -g ${MACRO.PACKAGE_URL}@latest`,\n ]\n}\n\n// Optional: background notifier that prints a simple banner\nexport async function checkAndNotifyUpdate(): Promise<void> {\n try {\n if (process.env.NODE_ENV === 'test') return\n if (await isAutoUpdaterDisabled()) return\n if (await env.getIsDocker()) return\n if (!(await env.hasInternetAccess())) return\n\n const config: any = getGlobalConfig()\n const now = Date.now()\n const DAY_MS = 24 * 60 * 60 * 1000\n const lastCheck = Number(config.lastUpdateCheckAt || 0)\n if (lastCheck && now - lastCheck < DAY_MS) return\n\n const latest = await getLatestVersion()\n if (!latest) {\n saveGlobalConfig({ ...config, lastUpdateCheckAt: now })\n return\n }\n\n if (gt(latest, MACRO.VERSION)) {\n saveGlobalConfig({\n ...config,\n lastUpdateCheckAt: now,\n lastSuggestedVersion: latest,\n })\n const suggestions = await getUpdateCommandSuggestions()\n // eslint-disable-next-line no-console\n console.log(`New version available: ${latest} (current: ${MACRO.VERSION})`)\n console.log('Run the following command to update:')\n for (const command of suggestions) console.log(` ${command}`)\n } else {\n saveGlobalConfig({ ...config, lastUpdateCheckAt: now })\n }\n } catch (error) {\n logError(`update-notify: ${error}`)\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { execFileNoThrow } from './execFileNoThrow'\nimport { logError } from './log'\n\nimport { lt, gt } from 'semver'\nimport { MACRO } from '@constants/macros'\nimport { PRODUCT_NAME } from '@constants/product'\nimport {\n getGlobalConfig,\n saveGlobalConfig,\n isAutoUpdaterDisabled,\n} from './config'\nimport { env } from './env'\n\nexport type VersionConfig = {\n minVersion: string\n}\n\n// Ensure current version meets minimum supported version; exit if too old\nexport async function assertMinVersion(): Promise<void> {\n try {\n const versionConfig: VersionConfig = { minVersion: '0.0.0' }\n if (\n versionConfig.minVersion &&\n lt(MACRO.VERSION, versionConfig.minVersion)\n ) {\n const suggestions = await getUpdateCommandSuggestions()\n // Intentionally minimal: caller may print its own message; we just exit\n // eslint-disable-next-line no-console\n console.error(\n `Your ${PRODUCT_NAME} version ${MACRO.VERSION} is below the minimum supported ${versionConfig.minVersion}.\\n` +\n 'Update using one of:\\n' +\n suggestions.map(c => ` ${c}`).join('\\n'),\n )\n process.exit(1)\n }\n } catch (error) {\n logError(`Error checking minimum version: ${error}`)\n }\n}\n\n// Get latest version from npm (via npm CLI or HTTP fallback)\nexport async function getLatestVersion(): Promise<string | null> {\n // Prefer npm CLI (fast when available)\n try {\n const abortController = new AbortController()\n setTimeout(() => abortController.abort(), 5000)\n const result = await execFileNoThrow(\n 'npm',\n ['view', MACRO.PACKAGE_URL, 'version'],\n abortController.signal,\n )\n if (result.code === 0) {\n const v = result.stdout.trim()\n if (v) return v\n }\n } catch {}\n\n // Fallback: query npm registry directly\n try {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), 5000)\n const res = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(MACRO.PACKAGE_URL)}`,\n {\n method: 'GET',\n headers: {\n Accept: 'application/vnd.npm.install-v1+json',\n 'User-Agent': `${PRODUCT_NAME}/${MACRO.VERSION}`,\n },\n signal: controller.signal,\n },\n )\n clearTimeout(timer)\n if (!res.ok) return null\n const json: any = await res.json().catch(() => null)\n const latest = json && json['dist-tags'] && json['dist-tags'].latest\n return typeof latest === 'string' ? latest : null\n } catch {\n return null\n }\n}\n\n// Suggest manual update commands; prefer Bun first, then npm\nexport async function getUpdateCommandSuggestions(): Promise<string[]> {\n return [\n `bun add -g ${MACRO.PACKAGE_URL}@latest`,\n `npm install -g ${MACRO.PACKAGE_URL}@latest`,\n ]\n}\n\n// Optional: background notifier that prints a simple banner\nexport async function checkAndNotifyUpdate(): Promise<void> {\n try {\n if (process.env.NODE_ENV === 'test') return\n if (await isAutoUpdaterDisabled()) return\n if (await env.getIsDocker()) return\n if (!(await env.hasInternetAccess())) return\n\n const config: any = getGlobalConfig()\n const now = Date.now()\n const DAY_MS = 24 * 60 * 60 * 1000\n const lastCheck = Number(config.lastUpdateCheckAt || 0)\n if (lastCheck && now - lastCheck < DAY_MS) return\n\n const latest = await getLatestVersion()\n if (!latest) {\n saveGlobalConfig({ ...config, lastUpdateCheckAt: now })\n return\n }\n\n if (gt(latest, MACRO.VERSION)) {\n saveGlobalConfig({\n ...config,\n lastUpdateCheckAt: now,\n lastSuggestedVersion: latest,\n })\n const suggestions = await getUpdateCommandSuggestions()\n // eslint-disable-next-line no-console\n console.log(\n `New version available: ${latest} (current: ${MACRO.VERSION})`,\n )\n console.log('Run the following command to update:')\n for (const command of suggestions) console.log(` ${command}`)\n } else {\n saveGlobalConfig({ ...config, lastUpdateCheckAt: now })\n }\n } catch (error) {\n logError(`update-notify: ${error}`)\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
- import { memoize } from "lodash-es";
2
1
  import { API_ERROR_MESSAGE_PREFIX, queryQuick } from "../services/claude.js";
2
+ import { memoizeAsyncWithLimit } from "./async.js";
3
3
  import { parse } from "shell-quote";
4
4
  import { PRODUCT_NAME } from "../constants/product.js";
5
5
  const SINGLE_QUOTE = "__SINGLE_QUOTE__";
@@ -42,7 +42,7 @@ function splitCommand(command) {
42
42
  (part) => !COMMAND_LIST_SEPARATORS.has(part)
43
43
  );
44
44
  }
45
- const getCommandSubcommandPrefix = memoize(
45
+ const getCommandSubcommandPrefix = memoizeAsyncWithLimit(
46
46
  async (command, abortSignal) => {
47
47
  const subcommands = splitCommand(command);
48
48
  const [fullCommandPrefix, ...subcommandPrefixesResults] = await Promise.all(
@@ -71,10 +71,16 @@ const getCommandSubcommandPrefix = memoize(
71
71
  subcommandPrefixes
72
72
  };
73
73
  },
74
- (command) => command
75
- // memoize by command only
74
+ {
75
+ max: 200,
76
+ // Cache up to 200 unique commands
77
+ ttl: 3e5,
78
+ // 5 minutes TTL
79
+ resolver: (command) => command
80
+ // memoize by command only, ignore abortSignal
81
+ }
76
82
  );
77
- const getCommandPrefix = memoize(
83
+ const getCommandPrefix = memoizeAsyncWithLimit(
78
84
  async (command, abortSignal) => {
79
85
  const response = await queryQuick({
80
86
  systemPrompt: [
@@ -125,10 +131,10 @@ The user has allowed certain command prefixes to be run, and will otherwise be a
125
131
  Your task is to determine the command prefix for the following command.
126
132
 
127
133
  IMPORTANT: Bash commands may run multiple commands that are chained together.
128
- For safety, if the command seems to contain command injection, you must return "command_injection_detected".
129
- (This will help protect the user: if they think that they're allowlisting command A,
130
- but the AI coding agent sends a malicious command that technically has the same prefix as command A,
131
- then the safety system will see that you said \u201Ccommand_injection_detected\u201D and ask the user for manual confirmation.)
134
+ For safety, if the command seems to contain command injection, you must return "command_injection_detected".
135
+ (This will help protect the user: if they think that they're allowlisting command A,
136
+ but the AI coding agent sends a malicious command that technically has the same prefix as command A,
137
+ then the safety system will see that you said "command_injection_detected" and ask the user for manual confirmation.)
132
138
 
133
139
  Note that not every command has a prefix. If a command has no prefix, return "none".
134
140
 
@@ -163,8 +169,14 @@ Command: ${command}
163
169
  commandInjectionDetected: false
164
170
  };
165
171
  },
166
- (command) => command
167
- // memoize by command only
172
+ {
173
+ max: 200,
174
+ // Cache up to 200 unique commands
175
+ ttl: 3e5,
176
+ // 5 minutes TTL
177
+ resolver: (command) => command
178
+ // memoize by command only, ignore abortSignal
179
+ }
168
180
  );
169
181
  const COMMAND_LIST_SEPARATORS = /* @__PURE__ */ new Set([
170
182
  "&&",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/commands.ts"],
4
- "sourcesContent": ["import { memoize } from 'lodash-es'\nimport { API_ERROR_MESSAGE_PREFIX, queryQuick } from '@services/claude'\nimport { type ControlOperator, parse, ParseEntry } from 'shell-quote'\nimport { PRODUCT_NAME } from '@constants/product'\n\nconst SINGLE_QUOTE = '__SINGLE_QUOTE__'\nconst DOUBLE_QUOTE = '__DOUBLE_QUOTE__'\n\nexport type CommandPrefixResult =\n | {\n commandPrefix: string | null\n commandInjectionDetected: false\n }\n | { commandInjectionDetected: true }\n\n// Command prefix result alongside subcommand prefixes\nexport type CommandSubcommandPrefixResult = CommandPrefixResult & {\n subcommandPrefixes: Map<string, CommandPrefixResult>\n}\n\n/**\n * Splits a command string into individual commands based on shell operators\n */\nexport function splitCommand(command: string): string[] {\n const parts: ParseEntry[] = []\n\n // 1. Collapse adjacent strings\n for (const part of parse(\n command\n .replaceAll('\"', `\"${DOUBLE_QUOTE}`) // parse() strips out quotes :P\n .replaceAll(\"'\", `'${SINGLE_QUOTE}`), // parse() strips out quotes :P\n varName => `$${varName}`, // Preserve shell variables\n )) {\n if (typeof part === 'string') {\n if (parts.length > 0 && typeof parts[parts.length - 1] === 'string') {\n parts[parts.length - 1] += ' ' + part\n continue\n }\n }\n parts.push(part)\n }\n\n // 2. Map tokens to strings\n const stringParts = parts\n .map(part => {\n if (typeof part === 'string') {\n return part\n }\n if ('comment' in part) {\n // TODO: make this less hacky\n return '#' + part.comment\n }\n if ('op' in part && part.op === 'glob') {\n return part.pattern\n }\n if ('op' in part) {\n return part.op\n }\n return null\n })\n .filter(_ => _ !== null)\n\n // 3. Map quotes back to their original form\n const quotedParts = stringParts.map(part => {\n return part\n .replaceAll(`${SINGLE_QUOTE}`, \"'\")\n .replaceAll(`${DOUBLE_QUOTE}`, '\"')\n })\n\n // 4. Filter out separators\n return quotedParts.filter(\n part => !(COMMAND_LIST_SEPARATORS as Set<string>).has(part),\n )\n}\n\nexport const getCommandSubcommandPrefix = memoize(\n async (\n command: string,\n abortSignal: AbortSignal,\n ): Promise<CommandSubcommandPrefixResult | null> => {\n const subcommands = splitCommand(command)\n\n const [fullCommandPrefix, ...subcommandPrefixesResults] = await Promise.all(\n [\n getCommandPrefix(command, abortSignal),\n ...subcommands.map(async subcommand => ({\n subcommand,\n prefix: await getCommandPrefix(subcommand, abortSignal),\n })),\n ],\n )\n if (!fullCommandPrefix) {\n return null\n }\n const subcommandPrefixes = subcommandPrefixesResults.reduce(\n (acc, { subcommand, prefix }) => {\n if (prefix) {\n acc.set(subcommand, prefix)\n }\n return acc\n },\n new Map<string, CommandPrefixResult>(),\n )\n\n return {\n ...fullCommandPrefix,\n subcommandPrefixes,\n }\n },\n command => command, // memoize by command only\n)\n\nconst getCommandPrefix = memoize(\n async (\n command: string,\n abortSignal: AbortSignal,\n ): Promise<CommandPrefixResult | null> => {\n const response = await queryQuick({\n systemPrompt: [\n `Your task is to process Bash commands that an AI coding agent wants to run.\n\nThis policy spec defines how to determine the prefix of a Bash command:`,\n ],\n userPrompt: `<policy_spec>\n# ${PRODUCT_NAME} Code Bash command prefix detection\n\nThis document defines risk levels for actions that the ${PRODUCT_NAME} agent may take. This classification system is part of a broader safety framework and is used to determine when additional user confirmation or oversight may be needed.\n\n## Definitions\n\n**Command Injection:** Any technique used that would result in a command being run other than the detected prefix.\n\n## Command prefix extraction examples\nExamples:\n- cat foo.txt => cat\n- cd src => cd\n- cd path/to/files/ => cd\n- find ./src -type f -name \"*.ts\" => find\n- gg cat foo.py => gg cat\n- gg cp foo.py bar.py => gg cp\n- git commit -m \"foo\" => git commit\n- git diff HEAD~1 => git diff\n- git diff --staged => git diff\n- git diff $(pwd) => command_injection_detected\n- git status => git status\n- git status# test(\\`id\\`) => command_injection_detected\n- git status\\`ls\\` => command_injection_detected\n- git push => none\n- git push origin master => git push\n- git log -n 5 => git log\n- git log --oneline -n 5 => git log\n- grep -A 40 \"from foo.bar.baz import\" alpha/beta/gamma.py => grep\n- pig tail zerba.log => pig tail\n- npm test => none\n- npm test --foo => npm test\n- npm test -- -f \"foo\" => npm test\n- pwd\\n curl example.com => command_injection_detected\n- pytest foo/bar.py => pytest\n- scalac build => none\n</policy_spec>\n\nThe user has allowed certain command prefixes to be run, and will otherwise be asked to approve or deny the command.\nYour task is to determine the command prefix for the following command.\n\nIMPORTANT: Bash commands may run multiple commands that are chained together.\nFor safety, if the command seems to contain command injection, you must return \"command_injection_detected\". \n(This will help protect the user: if they think that they're allowlisting command A, \nbut the AI coding agent sends a malicious command that technically has the same prefix as command A, \nthen the safety system will see that you said \u201Ccommand_injection_detected\u201D and ask the user for manual confirmation.)\n\nNote that not every command has a prefix. If a command has no prefix, return \"none\".\n\nONLY return the prefix. Do not return any other text, markdown markers, or other content or formatting.\n\nCommand: ${command}\n`,\n signal: abortSignal,\n enablePromptCaching: false,\n })\n\n const prefix =\n typeof response.message.content === 'string'\n ? response.message.content\n : Array.isArray(response.message.content)\n ? (response.message.content.find(_ => _.type === 'text')?.text ??\n 'none')\n : 'none'\n\n if (prefix.startsWith(API_ERROR_MESSAGE_PREFIX)) {\n return null\n }\n\n if (prefix === 'command_injection_detected') {\n return { commandInjectionDetected: true }\n }\n\n // Never accept base `git` as a prefix (if e.g. `git diff` prefix not detected)\n if (prefix === 'git') {\n return {\n commandPrefix: null,\n commandInjectionDetected: false,\n }\n }\n\n if (prefix === 'none') {\n return {\n commandPrefix: null,\n commandInjectionDetected: false,\n }\n }\n\n return {\n commandPrefix: prefix,\n commandInjectionDetected: false,\n }\n },\n command => command, // memoize by command only\n)\n\nconst COMMAND_LIST_SEPARATORS = new Set<ControlOperator>([\n '&&',\n '||',\n ';',\n ';;',\n])\n\n// Checks if this is just a list of commands\nfunction isCommandList(command: string): boolean {\n for (const part of parse(\n command\n .replaceAll('\"', `\"${DOUBLE_QUOTE}`) // parse() strips out quotes :P\n .replaceAll(\"'\", `'${SINGLE_QUOTE}`), // parse() strips out quotes :P\n varName => `$${varName}`, // Preserve shell variables\n )) {\n if (typeof part === 'string') {\n // Strings are safe\n continue\n }\n if ('comment' in part) {\n // Don't trust comments, they can contain command injection\n return false\n }\n if ('op' in part) {\n if (part.op === 'glob') {\n // Globs are safe\n continue\n } else if (COMMAND_LIST_SEPARATORS.has(part.op)) {\n // Command list separators are safe\n continue\n }\n // Other operators are unsafe\n return false\n }\n }\n // No unsafe operators found in entire command\n return true\n}\n\nexport function isUnsafeCompoundCommand(command: string): boolean {\n return splitCommand(command).length > 1 && !isCommandList(command)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { API_ERROR_MESSAGE_PREFIX, queryQuick } from '@services/claude'\nimport { memoizeAsyncWithLimit } from './async'\nimport { type ControlOperator, parse, ParseEntry } from 'shell-quote'\nimport { PRODUCT_NAME } from '@constants/product'\n\nconst SINGLE_QUOTE = '__SINGLE_QUOTE__'\nconst DOUBLE_QUOTE = '__DOUBLE_QUOTE__'\n\nexport type CommandPrefixResult =\n | {\n commandPrefix: string | null\n commandInjectionDetected: false\n }\n | { commandInjectionDetected: true }\n\n// Command prefix result alongside subcommand prefixes\nexport type CommandSubcommandPrefixResult = CommandPrefixResult & {\n subcommandPrefixes: Map<string, CommandPrefixResult>\n}\n\n/**\n * Splits a command string into individual commands based on shell operators\n */\nexport function splitCommand(command: string): string[] {\n const parts: ParseEntry[] = []\n\n // 1. Collapse adjacent strings\n for (const part of parse(\n command\n .replaceAll('\"', `\"${DOUBLE_QUOTE}`) // parse() strips out quotes :P\n .replaceAll(\"'\", `'${SINGLE_QUOTE}`), // parse() strips out quotes :P\n varName => `$${varName}`, // Preserve shell variables\n )) {\n if (typeof part === 'string') {\n if (parts.length > 0 && typeof parts[parts.length - 1] === 'string') {\n parts[parts.length - 1] += ' ' + part\n continue\n }\n }\n parts.push(part)\n }\n\n // 2. Map tokens to strings\n const stringParts = parts\n .map(part => {\n if (typeof part === 'string') {\n return part\n }\n if ('comment' in part) {\n // TODO: make this less hacky\n return '#' + part.comment\n }\n if ('op' in part && part.op === 'glob') {\n return part.pattern\n }\n if ('op' in part) {\n return part.op\n }\n return null\n })\n .filter(_ => _ !== null)\n\n // 3. Map quotes back to their original form\n const quotedParts = stringParts.map(part => {\n return part\n .replaceAll(`${SINGLE_QUOTE}`, \"'\")\n .replaceAll(`${DOUBLE_QUOTE}`, '\"')\n })\n\n // 4. Filter out separators\n return quotedParts.filter(\n part => !(COMMAND_LIST_SEPARATORS as Set<string>).has(part),\n )\n}\n\n// Use memoizeAsyncWithLimit to prevent unbounded cache growth from unique commands\nexport const getCommandSubcommandPrefix = memoizeAsyncWithLimit(\n async (\n command: string,\n abortSignal: AbortSignal,\n ): Promise<CommandSubcommandPrefixResult | null> => {\n const subcommands = splitCommand(command)\n\n const [fullCommandPrefix, ...subcommandPrefixesResults] = await Promise.all(\n [\n getCommandPrefix(command, abortSignal),\n ...subcommands.map(async subcommand => ({\n subcommand,\n prefix: await getCommandPrefix(subcommand, abortSignal),\n })),\n ],\n )\n if (!fullCommandPrefix) {\n return null\n }\n const subcommandPrefixes = subcommandPrefixesResults.reduce(\n (acc, { subcommand, prefix }) => {\n if (prefix) {\n acc.set(subcommand, prefix)\n }\n return acc\n },\n new Map<string, CommandPrefixResult>(),\n )\n\n return {\n ...fullCommandPrefix,\n subcommandPrefixes,\n }\n },\n {\n max: 200, // Cache up to 200 unique commands\n ttl: 300000, // 5 minutes TTL\n resolver: (command: string) => command, // memoize by command only, ignore abortSignal\n },\n)\n\n// Use memoizeAsyncWithLimit to prevent unbounded cache growth from unique commands\nconst getCommandPrefix = memoizeAsyncWithLimit(\n async (\n command: string,\n abortSignal: AbortSignal,\n ): Promise<CommandPrefixResult | null> => {\n const response = await queryQuick({\n systemPrompt: [\n `Your task is to process Bash commands that an AI coding agent wants to run.\n\nThis policy spec defines how to determine the prefix of a Bash command:`,\n ],\n userPrompt: `<policy_spec>\n# ${PRODUCT_NAME} Code Bash command prefix detection\n\nThis document defines risk levels for actions that the ${PRODUCT_NAME} agent may take. This classification system is part of a broader safety framework and is used to determine when additional user confirmation or oversight may be needed.\n\n## Definitions\n\n**Command Injection:** Any technique used that would result in a command being run other than the detected prefix.\n\n## Command prefix extraction examples\nExamples:\n- cat foo.txt => cat\n- cd src => cd\n- cd path/to/files/ => cd\n- find ./src -type f -name \"*.ts\" => find\n- gg cat foo.py => gg cat\n- gg cp foo.py bar.py => gg cp\n- git commit -m \"foo\" => git commit\n- git diff HEAD~1 => git diff\n- git diff --staged => git diff\n- git diff $(pwd) => command_injection_detected\n- git status => git status\n- git status# test(\\`id\\`) => command_injection_detected\n- git status\\`ls\\` => command_injection_detected\n- git push => none\n- git push origin master => git push\n- git log -n 5 => git log\n- git log --oneline -n 5 => git log\n- grep -A 40 \"from foo.bar.baz import\" alpha/beta/gamma.py => grep\n- pig tail zerba.log => pig tail\n- npm test => none\n- npm test --foo => npm test\n- npm test -- -f \"foo\" => npm test\n- pwd\\n curl example.com => command_injection_detected\n- pytest foo/bar.py => pytest\n- scalac build => none\n</policy_spec>\n\nThe user has allowed certain command prefixes to be run, and will otherwise be asked to approve or deny the command.\nYour task is to determine the command prefix for the following command.\n\nIMPORTANT: Bash commands may run multiple commands that are chained together.\nFor safety, if the command seems to contain command injection, you must return \"command_injection_detected\".\n(This will help protect the user: if they think that they're allowlisting command A,\nbut the AI coding agent sends a malicious command that technically has the same prefix as command A,\nthen the safety system will see that you said \"command_injection_detected\" and ask the user for manual confirmation.)\n\nNote that not every command has a prefix. If a command has no prefix, return \"none\".\n\nONLY return the prefix. Do not return any other text, markdown markers, or other content or formatting.\n\nCommand: ${command}\n`,\n signal: abortSignal,\n enablePromptCaching: false,\n })\n\n const prefix =\n typeof response.message.content === 'string'\n ? response.message.content\n : Array.isArray(response.message.content)\n ? (response.message.content.find(_ => _.type === 'text')?.text ??\n 'none')\n : 'none'\n\n if (prefix.startsWith(API_ERROR_MESSAGE_PREFIX)) {\n return null\n }\n\n if (prefix === 'command_injection_detected') {\n return { commandInjectionDetected: true }\n }\n\n // Never accept base `git` as a prefix (if e.g. `git diff` prefix not detected)\n if (prefix === 'git') {\n return {\n commandPrefix: null,\n commandInjectionDetected: false,\n }\n }\n\n if (prefix === 'none') {\n return {\n commandPrefix: null,\n commandInjectionDetected: false,\n }\n }\n\n return {\n commandPrefix: prefix,\n commandInjectionDetected: false,\n }\n },\n {\n max: 200, // Cache up to 200 unique commands\n ttl: 300000, // 5 minutes TTL\n resolver: (command: string) => command, // memoize by command only, ignore abortSignal\n },\n)\n\nconst COMMAND_LIST_SEPARATORS = new Set<ControlOperator>([\n '&&',\n '||',\n ';',\n ';;',\n])\n\n// Checks if this is just a list of commands\nfunction isCommandList(command: string): boolean {\n for (const part of parse(\n command\n .replaceAll('\"', `\"${DOUBLE_QUOTE}`) // parse() strips out quotes :P\n .replaceAll(\"'\", `'${SINGLE_QUOTE}`), // parse() strips out quotes :P\n varName => `$${varName}`, // Preserve shell variables\n )) {\n if (typeof part === 'string') {\n // Strings are safe\n continue\n }\n if ('comment' in part) {\n // Don't trust comments, they can contain command injection\n return false\n }\n if ('op' in part) {\n if (part.op === 'glob') {\n // Globs are safe\n continue\n } else if (COMMAND_LIST_SEPARATORS.has(part.op)) {\n // Command list separators are safe\n continue\n }\n // Other operators are unsafe\n return false\n }\n }\n // No unsafe operators found in entire command\n return true\n}\n\nexport function isUnsafeCompoundCommand(command: string): boolean {\n return splitCommand(command).length > 1 && !isCommandList(command)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -617,7 +617,9 @@ const COMMON_UNIX_COMMANDS = [
617
617
  ];
618
618
  function getCommonSystemCommands(systemCommands) {
619
619
  const systemSet = new Set(systemCommands.map((cmd) => cmd.toLowerCase()));
620
- const commonIntersection = COMMON_UNIX_COMMANDS.filter((cmd) => systemSet.has(cmd.toLowerCase()));
620
+ const commonIntersection = COMMON_UNIX_COMMANDS.filter(
621
+ (cmd) => systemSet.has(cmd.toLowerCase())
622
+ );
621
623
  return Array.from(new Set(commonIntersection));
622
624
  }
623
625
  function getCommandPriority(command) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/commonUnixCommands.ts"],
4
- "sourcesContent": ["/**\n * Common Unix Commands Database\n * \n * A curated list of 500+ most frequently used Unix/Linux commands\n * for developers and system administrators.\n * \n * Categories:\n * - File & Directory Operations\n * - Text Processing\n * - Process Management\n * - Network Tools\n * - Development Tools\n * - System Administration\n * - Package Management\n * - Version Control\n */\n\nexport const COMMON_UNIX_COMMANDS = [\n // File & Directory Operations (50+)\n 'ls', 'cd', 'pwd', 'mkdir', 'rmdir', 'rm', 'cp', 'mv', 'touch', 'cat',\n 'less', 'more', 'head', 'tail', 'file', 'stat', 'ln', 'readlink', 'basename', 'dirname',\n 'find', 'locate', 'which', 'whereis', 'type', 'tree', 'du', 'df', 'mount', 'umount',\n 'chmod', 'chown', 'chgrp', 'umask', 'setfacl', 'getfacl', 'lsattr', 'chattr', 'realpath', 'mktemp',\n 'rsync', 'scp', 'sftp', 'ftp', 'wget', 'curl', 'tar', 'gzip', 'gunzip', 'zip',\n 'unzip', 'bzip2', 'bunzip2', 'xz', 'unxz', '7z', 'rar', 'unrar', 'zcat', 'zless',\n \n // Text Processing (50+)\n 'grep', 'egrep', 'fgrep', 'rg', 'ag', 'ack', 'sed', 'awk', 'cut', 'paste',\n 'sort', 'uniq', 'wc', 'tr', 'col', 'column', 'expand', 'unexpand', 'fold', 'fmt',\n 'pr', 'nl', 'od', 'hexdump', 'xxd', 'strings', 'split', 'csplit', 'join', 'comm',\n 'diff', 'sdiff', 'vimdiff', 'patch', 'diffstat', 'cmp', 'md5sum', 'sha1sum', 'sha256sum', 'sha512sum',\n 'base64', 'uuencode', 'uudecode', 'rev', 'tac', 'shuf', 'jq', 'yq', 'xmllint', 'tidy',\n \n // Process Management (40+)\n 'ps', 'top', 'htop', 'atop', 'iotop', 'iftop', 'nethogs', 'pgrep', 'pkill', 'kill',\n 'killall', 'jobs', 'bg', 'fg', 'nohup', 'disown', 'nice', 'renice', 'ionice', 'taskset',\n 'pstree', 'fuser', 'lsof', 'strace', 'ltrace', 'ptrace', 'gdb', 'valgrind', 'time', 'timeout',\n 'watch', 'screen', 'tmux', 'byobu', 'dtach', 'nmon', 'dstat', 'vmstat', 'iostat', 'mpstat',\n \n // Network Tools (50+)\n 'ping', 'ping6', 'traceroute', 'tracepath', 'mtr', 'netstat', 'ss', 'ip', 'ifconfig', 'route',\n 'arp', 'hostname', 'hostnamectl', 'nslookup', 'dig', 'host', 'whois', 'nc', 'netcat', 'ncat',\n 'socat', 'telnet', 'ssh', 'ssh-keygen', 'ssh-copy-id', 'ssh-add', 'ssh-agent', 'sshd', 'tcpdump', 'wireshark',\n 'tshark', 'nmap', 'masscan', 'zmap', 'iptables', 'ip6tables', 'firewall-cmd', 'ufw', 'fail2ban', 'nginx',\n 'apache2', 'httpd', 'curl', 'wget', 'aria2', 'axel', 'links', 'lynx', 'w3m', 'elinks',\n \n // Development Tools - Languages (60+)\n 'gcc', 'g++', 'clang', 'clang++', 'make', 'cmake', 'autoconf', 'automake', 'libtool', 'pkg-config',\n 'python3', 'pip', 'pip3', 'pipenv', 'poetry', 'virtualenv', 'pyenv',\n 'node', 'npm', 'uv', 'npx', 'yarn', 'pnpm', 'nvm', 'volta', 'deno', 'bun', 'tsx',\n 'ruby', 'gem', 'bundle', 'bundler', 'rake', 'rbenv', 'rvm', 'irb', 'pry', 'rails',\n 'java', 'javac', 'jar', 'javadoc', 'maven', 'mvn', 'gradle', 'ant', 'kotlin', 'kotlinc',\n 'go', 'gofmt', 'golint', 'govet', 'godoc', 'rust', 'rustc', 'cargo', 'rustup', 'rustfmt',\n \n // Development Tools - Utilities (40+)\n 'git', 'svn', 'hg', 'bzr', 'cvs', 'fossil', 'tig', 'gitk', 'git-flow', 'hub',\n 'gh', 'glab', 'docker', 'docker-compose', 'podman', 'kubectl', 'helm', 'minikube', 'kind', 'k3s',\n 'vagrant', 'terraform', 'ansible', 'puppet', 'chef', 'salt', 'packer', 'consul', 'vault', 'nomad',\n 'vim', 'vi', 'nvim', 'emacs', 'nano', 'pico', 'ed', 'code', 'subl', 'atom',\n \n // Database & Data Tools (30+)\n 'mysql', 'mysqldump', 'mysqladmin', 'psql', 'pg_dump', 'pg_restore', 'sqlite3', 'redis-cli', 'mongo', 'mongodump',\n 'mongorestore', 'cqlsh', 'influx', 'clickhouse-client', 'mariadb', 'cockroach', 'etcdctl', 'consul', 'vault', 'nomad',\n 'jq', 'yq', 'xmlstarlet', 'csvkit', 'miller', 'awk', 'sed', 'perl', 'lua', 'tcl',\n \n // System Administration (50+)\n 'sudo', 'su', 'passwd', 'useradd', 'userdel', 'usermod', 'groupadd', 'groupdel', 'groupmod', 'id',\n 'who', 'w', 'last', 'lastlog', 'finger', 'chfn', 'chsh', 'login', 'logout', 'exit',\n 'systemctl', 'service', 'journalctl', 'systemd-analyze', 'init', 'telinit', 'runlevel', 'shutdown', 'reboot', 'halt',\n 'poweroff', 'uptime', 'uname', 'hostname', 'hostnamectl', 'timedatectl', 'localectl', 'loginctl', 'machinectl', 'bootctl',\n 'cron', 'crontab', 'at', 'batch', 'anacron', 'systemd-run', 'systemd-timer', 'logrotate', 'logger', 'dmesg',\n \n // Package Management (30+)\n 'apt', 'apt-get', 'apt-cache', 'dpkg', 'dpkg-reconfigure', 'aptitude', 'snap', 'flatpak', 'appimage', 'alien',\n 'yum', 'dnf', 'rpm', 'zypper', 'pacman', 'yaourt', 'yay', 'makepkg', 'abs', 'aur',\n 'brew', 'port', 'pkg', 'emerge', 'portage', 'nix', 'guix', 'conda', 'mamba', 'micromamba',\n \n // Monitoring & Performance (30+)\n 'top', 'htop', 'atop', 'btop', 'gtop', 'gotop', 'bashtop', 'bpytop', 'glances', 'nmon',\n 'sar', 'iostat', 'mpstat', 'vmstat', 'pidstat', 'free', 'uptime', 'tload', 'slabtop', 'powertop',\n 'iotop', 'iftop', 'nethogs', 'bmon', 'nload', 'speedtest', 'speedtest-cli', 'fast', 'mtr', 'smokeping',\n \n // Security Tools (30+)\n 'gpg', 'gpg2', 'openssl', 'ssh-keygen', 'ssh-keyscan', 'ssl-cert', 'certbot', 'acme.sh', 'mkcert', 'step',\n 'pass', 'keepassxc-cli', 'bitwarden', '1password', 'hashcat', 'john', 'hydra', 'ncrack', 'medusa', 'aircrack-ng',\n 'chkrootkit', 'rkhunter', 'clamav', 'clamscan', 'freshclam', 'aide', 'tripwire', 'samhain', 'ossec', 'wazuh',\n \n // Shell & Scripting (30+)\n 'bash', 'sh', 'zsh', 'fish', 'ksh', 'tcsh', 'csh', 'dash', 'ash', 'elvish',\n 'export', 'alias', 'unalias', 'history', 'fc', 'source', 'eval', 'exec', 'command', 'builtin',\n 'set', 'unset', 'env', 'printenv', 'echo', 'printf', 'read', 'test', 'expr', 'let',\n \n // Archive & Compression (20+)\n 'tar', 'gzip', 'gunzip', 'bzip2', 'bunzip2', 'xz', 'unxz', 'lzma', 'unlzma', 'compress',\n 'uncompress', 'zip', 'unzip', '7z', '7za', 'rar', 'unrar', 'ar', 'cpio', 'pax',\n \n // Media Tools (20+)\n 'ffmpeg', 'ffplay', 'ffprobe', 'sox', 'play', 'rec', 'mpg123', 'mpg321', 'ogg123', 'flac',\n 'lame', 'oggenc', 'opusenc', 'convert', 'mogrify', 'identify', 'display', 'import', 'animate', 'montage',\n \n // Math & Calculation (15+)\n 'bc', 'dc', 'calc', 'qalc', 'units', 'factor', 'primes', 'seq', 'shuf', 'random',\n 'octave', 'maxima', 'sage', 'r', 'julia',\n \n // Documentation & Help (15+)\n 'man', 'info', 'help', 'apropos', 'whatis', 'whereis', 'which', 'type', 'command', 'hash',\n 'tldr', 'cheat', 'howdoi', 'stackoverflow', 'explainshell',\n \n // Miscellaneous Utilities (30+)\n 'date', 'cal', 'ncal', 'timedatectl', 'zdump', 'tzselect', 'hwclock', 'ntpdate', 'chrony', 'timeshift',\n 'yes', 'true', 'false', 'sleep', 'usleep', 'seq', 'jot', 'shuf', 'tee', 'xargs',\n 'parallel', 'rush', 'dsh', 'pssh', 'clusterssh', 'terminator', 'tilix', 'alacritty', 'kitty', 'wezterm',\n] as const\n\n/**\n * Get common commands that exist on the current system\n * @param systemCommands Array of commands available on the system\n * @returns Deduplicated intersection of common commands and system commands\n */\nexport function getCommonSystemCommands(systemCommands: string[]): string[] {\n const systemSet = new Set(systemCommands.map(cmd => cmd.toLowerCase()))\n const commonIntersection = COMMON_UNIX_COMMANDS.filter(cmd => systemSet.has(cmd.toLowerCase()))\n // Remove duplicates using Set\n return Array.from(new Set(commonIntersection))\n}\n\n/**\n * Get a priority score for a command based on its position in the common list\n * Earlier commands get higher priority (more commonly used)\n */\nexport function getCommandPriority(command: string): number {\n const index = COMMON_UNIX_COMMANDS.indexOf(command.toLowerCase() as any)\n if (index === -1) return 0\n \n // Convert index to priority score (earlier = higher score)\n const maxScore = 100\n const score = maxScore - (index / COMMON_UNIX_COMMANDS.length) * maxScore\n return Math.round(score)\n}\n\n/**\n * Get essential fallback commands for when PATH is empty or unavailable\n * These are the most basic commands that should always be available\n */\nexport function getEssentialCommands(): string[] {\n return [\n 'ls', 'cd', 'pwd', 'cat', 'grep', 'find', 'which', 'man', 'cp', 'mv', 'rm', 'mkdir',\n 'touch', 'chmod', 'ps', 'top', 'kill', 'git', 'node', 'npm', 'python3',\n 'curl', 'wget', 'docker', 'vim', 'nano', 'echo', 'export', 'env', 'sudo'\n ]\n}\n\n/**\n * Get minimal fallback commands for error scenarios\n * These are absolute minimum commands for basic functionality\n */\nexport function getMinimalFallbackCommands(): string[] {\n return [\n 'ls', 'cd', 'pwd', 'cat', 'grep', 'find', 'git', 'node', 'npm', 'python3', 'vim', 'nano'\n ]\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Common Unix Commands Database\n *\n * A curated list of 500+ most frequently used Unix/Linux commands\n * for developers and system administrators.\n *\n * Categories:\n * - File & Directory Operations\n * - Text Processing\n * - Process Management\n * - Network Tools\n * - Development Tools\n * - System Administration\n * - Package Management\n * - Version Control\n */\n\nexport const COMMON_UNIX_COMMANDS = [\n // File & Directory Operations (50+)\n 'ls',\n 'cd',\n 'pwd',\n 'mkdir',\n 'rmdir',\n 'rm',\n 'cp',\n 'mv',\n 'touch',\n 'cat',\n 'less',\n 'more',\n 'head',\n 'tail',\n 'file',\n 'stat',\n 'ln',\n 'readlink',\n 'basename',\n 'dirname',\n 'find',\n 'locate',\n 'which',\n 'whereis',\n 'type',\n 'tree',\n 'du',\n 'df',\n 'mount',\n 'umount',\n 'chmod',\n 'chown',\n 'chgrp',\n 'umask',\n 'setfacl',\n 'getfacl',\n 'lsattr',\n 'chattr',\n 'realpath',\n 'mktemp',\n 'rsync',\n 'scp',\n 'sftp',\n 'ftp',\n 'wget',\n 'curl',\n 'tar',\n 'gzip',\n 'gunzip',\n 'zip',\n 'unzip',\n 'bzip2',\n 'bunzip2',\n 'xz',\n 'unxz',\n '7z',\n 'rar',\n 'unrar',\n 'zcat',\n 'zless',\n\n // Text Processing (50+)\n 'grep',\n 'egrep',\n 'fgrep',\n 'rg',\n 'ag',\n 'ack',\n 'sed',\n 'awk',\n 'cut',\n 'paste',\n 'sort',\n 'uniq',\n 'wc',\n 'tr',\n 'col',\n 'column',\n 'expand',\n 'unexpand',\n 'fold',\n 'fmt',\n 'pr',\n 'nl',\n 'od',\n 'hexdump',\n 'xxd',\n 'strings',\n 'split',\n 'csplit',\n 'join',\n 'comm',\n 'diff',\n 'sdiff',\n 'vimdiff',\n 'patch',\n 'diffstat',\n 'cmp',\n 'md5sum',\n 'sha1sum',\n 'sha256sum',\n 'sha512sum',\n 'base64',\n 'uuencode',\n 'uudecode',\n 'rev',\n 'tac',\n 'shuf',\n 'jq',\n 'yq',\n 'xmllint',\n 'tidy',\n\n // Process Management (40+)\n 'ps',\n 'top',\n 'htop',\n 'atop',\n 'iotop',\n 'iftop',\n 'nethogs',\n 'pgrep',\n 'pkill',\n 'kill',\n 'killall',\n 'jobs',\n 'bg',\n 'fg',\n 'nohup',\n 'disown',\n 'nice',\n 'renice',\n 'ionice',\n 'taskset',\n 'pstree',\n 'fuser',\n 'lsof',\n 'strace',\n 'ltrace',\n 'ptrace',\n 'gdb',\n 'valgrind',\n 'time',\n 'timeout',\n 'watch',\n 'screen',\n 'tmux',\n 'byobu',\n 'dtach',\n 'nmon',\n 'dstat',\n 'vmstat',\n 'iostat',\n 'mpstat',\n\n // Network Tools (50+)\n 'ping',\n 'ping6',\n 'traceroute',\n 'tracepath',\n 'mtr',\n 'netstat',\n 'ss',\n 'ip',\n 'ifconfig',\n 'route',\n 'arp',\n 'hostname',\n 'hostnamectl',\n 'nslookup',\n 'dig',\n 'host',\n 'whois',\n 'nc',\n 'netcat',\n 'ncat',\n 'socat',\n 'telnet',\n 'ssh',\n 'ssh-keygen',\n 'ssh-copy-id',\n 'ssh-add',\n 'ssh-agent',\n 'sshd',\n 'tcpdump',\n 'wireshark',\n 'tshark',\n 'nmap',\n 'masscan',\n 'zmap',\n 'iptables',\n 'ip6tables',\n 'firewall-cmd',\n 'ufw',\n 'fail2ban',\n 'nginx',\n 'apache2',\n 'httpd',\n 'curl',\n 'wget',\n 'aria2',\n 'axel',\n 'links',\n 'lynx',\n 'w3m',\n 'elinks',\n\n // Development Tools - Languages (60+)\n 'gcc',\n 'g++',\n 'clang',\n 'clang++',\n 'make',\n 'cmake',\n 'autoconf',\n 'automake',\n 'libtool',\n 'pkg-config',\n 'python3',\n 'pip',\n 'pip3',\n 'pipenv',\n 'poetry',\n 'virtualenv',\n 'pyenv',\n 'node',\n 'npm',\n 'uv',\n 'npx',\n 'yarn',\n 'pnpm',\n 'nvm',\n 'volta',\n 'deno',\n 'bun',\n 'tsx',\n 'ruby',\n 'gem',\n 'bundle',\n 'bundler',\n 'rake',\n 'rbenv',\n 'rvm',\n 'irb',\n 'pry',\n 'rails',\n 'java',\n 'javac',\n 'jar',\n 'javadoc',\n 'maven',\n 'mvn',\n 'gradle',\n 'ant',\n 'kotlin',\n 'kotlinc',\n 'go',\n 'gofmt',\n 'golint',\n 'govet',\n 'godoc',\n 'rust',\n 'rustc',\n 'cargo',\n 'rustup',\n 'rustfmt',\n\n // Development Tools - Utilities (40+)\n 'git',\n 'svn',\n 'hg',\n 'bzr',\n 'cvs',\n 'fossil',\n 'tig',\n 'gitk',\n 'git-flow',\n 'hub',\n 'gh',\n 'glab',\n 'docker',\n 'docker-compose',\n 'podman',\n 'kubectl',\n 'helm',\n 'minikube',\n 'kind',\n 'k3s',\n 'vagrant',\n 'terraform',\n 'ansible',\n 'puppet',\n 'chef',\n 'salt',\n 'packer',\n 'consul',\n 'vault',\n 'nomad',\n 'vim',\n 'vi',\n 'nvim',\n 'emacs',\n 'nano',\n 'pico',\n 'ed',\n 'code',\n 'subl',\n 'atom',\n\n // Database & Data Tools (30+)\n 'mysql',\n 'mysqldump',\n 'mysqladmin',\n 'psql',\n 'pg_dump',\n 'pg_restore',\n 'sqlite3',\n 'redis-cli',\n 'mongo',\n 'mongodump',\n 'mongorestore',\n 'cqlsh',\n 'influx',\n 'clickhouse-client',\n 'mariadb',\n 'cockroach',\n 'etcdctl',\n 'consul',\n 'vault',\n 'nomad',\n 'jq',\n 'yq',\n 'xmlstarlet',\n 'csvkit',\n 'miller',\n 'awk',\n 'sed',\n 'perl',\n 'lua',\n 'tcl',\n\n // System Administration (50+)\n 'sudo',\n 'su',\n 'passwd',\n 'useradd',\n 'userdel',\n 'usermod',\n 'groupadd',\n 'groupdel',\n 'groupmod',\n 'id',\n 'who',\n 'w',\n 'last',\n 'lastlog',\n 'finger',\n 'chfn',\n 'chsh',\n 'login',\n 'logout',\n 'exit',\n 'systemctl',\n 'service',\n 'journalctl',\n 'systemd-analyze',\n 'init',\n 'telinit',\n 'runlevel',\n 'shutdown',\n 'reboot',\n 'halt',\n 'poweroff',\n 'uptime',\n 'uname',\n 'hostname',\n 'hostnamectl',\n 'timedatectl',\n 'localectl',\n 'loginctl',\n 'machinectl',\n 'bootctl',\n 'cron',\n 'crontab',\n 'at',\n 'batch',\n 'anacron',\n 'systemd-run',\n 'systemd-timer',\n 'logrotate',\n 'logger',\n 'dmesg',\n\n // Package Management (30+)\n 'apt',\n 'apt-get',\n 'apt-cache',\n 'dpkg',\n 'dpkg-reconfigure',\n 'aptitude',\n 'snap',\n 'flatpak',\n 'appimage',\n 'alien',\n 'yum',\n 'dnf',\n 'rpm',\n 'zypper',\n 'pacman',\n 'yaourt',\n 'yay',\n 'makepkg',\n 'abs',\n 'aur',\n 'brew',\n 'port',\n 'pkg',\n 'emerge',\n 'portage',\n 'nix',\n 'guix',\n 'conda',\n 'mamba',\n 'micromamba',\n\n // Monitoring & Performance (30+)\n 'top',\n 'htop',\n 'atop',\n 'btop',\n 'gtop',\n 'gotop',\n 'bashtop',\n 'bpytop',\n 'glances',\n 'nmon',\n 'sar',\n 'iostat',\n 'mpstat',\n 'vmstat',\n 'pidstat',\n 'free',\n 'uptime',\n 'tload',\n 'slabtop',\n 'powertop',\n 'iotop',\n 'iftop',\n 'nethogs',\n 'bmon',\n 'nload',\n 'speedtest',\n 'speedtest-cli',\n 'fast',\n 'mtr',\n 'smokeping',\n\n // Security Tools (30+)\n 'gpg',\n 'gpg2',\n 'openssl',\n 'ssh-keygen',\n 'ssh-keyscan',\n 'ssl-cert',\n 'certbot',\n 'acme.sh',\n 'mkcert',\n 'step',\n 'pass',\n 'keepassxc-cli',\n 'bitwarden',\n '1password',\n 'hashcat',\n 'john',\n 'hydra',\n 'ncrack',\n 'medusa',\n 'aircrack-ng',\n 'chkrootkit',\n 'rkhunter',\n 'clamav',\n 'clamscan',\n 'freshclam',\n 'aide',\n 'tripwire',\n 'samhain',\n 'ossec',\n 'wazuh',\n\n // Shell & Scripting (30+)\n 'bash',\n 'sh',\n 'zsh',\n 'fish',\n 'ksh',\n 'tcsh',\n 'csh',\n 'dash',\n 'ash',\n 'elvish',\n 'export',\n 'alias',\n 'unalias',\n 'history',\n 'fc',\n 'source',\n 'eval',\n 'exec',\n 'command',\n 'builtin',\n 'set',\n 'unset',\n 'env',\n 'printenv',\n 'echo',\n 'printf',\n 'read',\n 'test',\n 'expr',\n 'let',\n\n // Archive & Compression (20+)\n 'tar',\n 'gzip',\n 'gunzip',\n 'bzip2',\n 'bunzip2',\n 'xz',\n 'unxz',\n 'lzma',\n 'unlzma',\n 'compress',\n 'uncompress',\n 'zip',\n 'unzip',\n '7z',\n '7za',\n 'rar',\n 'unrar',\n 'ar',\n 'cpio',\n 'pax',\n\n // Media Tools (20+)\n 'ffmpeg',\n 'ffplay',\n 'ffprobe',\n 'sox',\n 'play',\n 'rec',\n 'mpg123',\n 'mpg321',\n 'ogg123',\n 'flac',\n 'lame',\n 'oggenc',\n 'opusenc',\n 'convert',\n 'mogrify',\n 'identify',\n 'display',\n 'import',\n 'animate',\n 'montage',\n\n // Math & Calculation (15+)\n 'bc',\n 'dc',\n 'calc',\n 'qalc',\n 'units',\n 'factor',\n 'primes',\n 'seq',\n 'shuf',\n 'random',\n 'octave',\n 'maxima',\n 'sage',\n 'r',\n 'julia',\n\n // Documentation & Help (15+)\n 'man',\n 'info',\n 'help',\n 'apropos',\n 'whatis',\n 'whereis',\n 'which',\n 'type',\n 'command',\n 'hash',\n 'tldr',\n 'cheat',\n 'howdoi',\n 'stackoverflow',\n 'explainshell',\n\n // Miscellaneous Utilities (30+)\n 'date',\n 'cal',\n 'ncal',\n 'timedatectl',\n 'zdump',\n 'tzselect',\n 'hwclock',\n 'ntpdate',\n 'chrony',\n 'timeshift',\n 'yes',\n 'true',\n 'false',\n 'sleep',\n 'usleep',\n 'seq',\n 'jot',\n 'shuf',\n 'tee',\n 'xargs',\n 'parallel',\n 'rush',\n 'dsh',\n 'pssh',\n 'clusterssh',\n 'terminator',\n 'tilix',\n 'alacritty',\n 'kitty',\n 'wezterm',\n] as const\n\n/**\n * Get common commands that exist on the current system\n * @param systemCommands Array of commands available on the system\n * @returns Deduplicated intersection of common commands and system commands\n */\nexport function getCommonSystemCommands(systemCommands: string[]): string[] {\n const systemSet = new Set(systemCommands.map(cmd => cmd.toLowerCase()))\n const commonIntersection = COMMON_UNIX_COMMANDS.filter(cmd =>\n systemSet.has(cmd.toLowerCase()),\n )\n // Remove duplicates using Set\n return Array.from(new Set(commonIntersection))\n}\n\n/**\n * Get a priority score for a command based on its position in the common list\n * Earlier commands get higher priority (more commonly used)\n */\nexport function getCommandPriority(command: string): number {\n const index = COMMON_UNIX_COMMANDS.indexOf(command.toLowerCase() as any)\n if (index === -1) return 0\n\n // Convert index to priority score (earlier = higher score)\n const maxScore = 100\n const score = maxScore - (index / COMMON_UNIX_COMMANDS.length) * maxScore\n return Math.round(score)\n}\n\n/**\n * Get essential fallback commands for when PATH is empty or unavailable\n * These are the most basic commands that should always be available\n */\nexport function getEssentialCommands(): string[] {\n return [\n 'ls',\n 'cd',\n 'pwd',\n 'cat',\n 'grep',\n 'find',\n 'which',\n 'man',\n 'cp',\n 'mv',\n 'rm',\n 'mkdir',\n 'touch',\n 'chmod',\n 'ps',\n 'top',\n 'kill',\n 'git',\n 'node',\n 'npm',\n 'python3',\n 'curl',\n 'wget',\n 'docker',\n 'vim',\n 'nano',\n 'echo',\n 'export',\n 'env',\n 'sudo',\n ]\n}\n\n/**\n * Get minimal fallback commands for error scenarios\n * These are absolute minimum commands for basic functionality\n */\nexport function getMinimalFallbackCommands(): string[] {\n return [\n 'ls',\n 'cd',\n 'pwd',\n 'cat',\n 'grep',\n 'find',\n 'git',\n 'node',\n 'npm',\n 'python3',\n 'vim',\n 'nano',\n ]\n}\n"],
5
+ "mappings": "AAiBO,MAAM,uBAAuB;AAAA;AAAA,EAElC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,SAAS,wBAAwB,gBAAoC;AAC1E,QAAM,YAAY,IAAI,IAAI,eAAe,IAAI,SAAO,IAAI,YAAY,CAAC,CAAC;AACtE,QAAM,qBAAqB,qBAAqB;AAAA,IAAO,SACrD,UAAU,IAAI,IAAI,YAAY,CAAC;AAAA,EACjC;AAEA,SAAO,MAAM,KAAK,IAAI,IAAI,kBAAkB,CAAC;AAC/C;AAMO,SAAS,mBAAmB,SAAyB;AAC1D,QAAM,QAAQ,qBAAqB,QAAQ,QAAQ,YAAY,CAAQ;AACvE,MAAI,UAAU,GAAI,QAAO;AAGzB,QAAM,WAAW;AACjB,QAAM,QAAQ,WAAY,QAAQ,qBAAqB,SAAU;AACjE,SAAO,KAAK,MAAM,KAAK;AACzB;AAMO,SAAS,uBAAiC;AAC/C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMO,SAAS,6BAAuC;AACrD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/compressionMode.ts"],
4
- "sourcesContent": ["/**\n * Compression Mode Management\n *\n * This module manages the compression mode selection between\n * code development and business consulting compression algorithms.\n */\n\nimport type { CompressionMode } from '@constants/compressionPrompts'\nimport { getGlobalConfig, saveGlobalConfig } from './config'\n\n/**\n * Get the current compression mode\n *\n * Priority order:\n * 1. Global configuration setting\n * 2. Default: 'business' (business consulting mode)\n *\n * @returns The current compression mode\n */\nexport function getCompressionMode(): CompressionMode {\n try {\n const config = getGlobalConfig()\n const mode = config.compressionMode\n\n // Validate the mode value\n if (mode === 'business' || mode === 'code') {\n return mode\n }\n\n // Default to business mode if not set or invalid\n return 'business'\n } catch (error) {\n console.error('Error getting compression mode:', error)\n return 'business'\n }\n}\n\n/**\n * Set the compression mode\n *\n * Saves the compression mode to global configuration for persistence\n * across sessions.\n *\n * @param mode - The compression mode to set ('business' or 'code')\n */\nexport function setCompressionMode(mode: CompressionMode): void {\n try {\n const config = getGlobalConfig()\n const updatedConfig = {\n ...config,\n compressionMode: mode,\n }\n saveGlobalConfig(updatedConfig)\n } catch (error) {\n console.error('Error setting compression mode:', error)\n throw error\n }\n}\n\n/**\n * Get a human-readable description of the compression mode\n *\n * @param mode - The compression mode\n * @returns A description of what the mode is optimized for\n */\nexport function getCompressionModeDescription(mode: CompressionMode): string {\n switch (mode) {\n case 'business':\n return 'Business Consulting (optimized for strategic analysis, research, and recommendations)'\n case 'code':\n return 'Code Development (optimized for technical context, debugging, and coding workflows)'\n default:\n return 'Unknown mode'\n }\n}\n\n/**\n * Check if a given string is a valid compression mode\n *\n * @param value - The value to check\n * @returns True if the value is a valid compression mode\n */\nexport function isValidCompressionMode(value: string): value is CompressionMode {\n return value === 'business' || value === 'code'\n}\n"],
5
- "mappings": "AAQA,SAAS,iBAAiB,wBAAwB;AAW3C,SAAS,qBAAsC;AACpD,MAAI;AACF,UAAM,SAAS,gBAAgB;AAC/B,UAAM,OAAO,OAAO;AAGpB,QAAI,SAAS,cAAc,SAAS,QAAQ;AAC1C,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,mCAAmC,KAAK;AACtD,WAAO;AAAA,EACT;AACF;AAUO,SAAS,mBAAmB,MAA6B;AAC9D,MAAI;AACF,UAAM,SAAS,gBAAgB;AAC/B,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,MACH,iBAAiB;AAAA,IACnB;AACA,qBAAiB,aAAa;AAAA,EAChC,SAAS,OAAO;AACd,YAAQ,MAAM,mCAAmC,KAAK;AACtD,UAAM;AAAA,EACR;AACF;AAQO,SAAS,8BAA8B,MAA+B;AAC3E,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAQO,SAAS,uBAAuB,OAAyC;AAC9E,SAAO,UAAU,cAAc,UAAU;AAC3C;",
4
+ "sourcesContent": ["/**\n * Compression Mode Management\n *\n * This module manages the compression mode selection between\n * code development and business consulting compression algorithms.\n */\n\nimport type { CompressionMode } from '@constants/compressionPrompts'\nimport { getGlobalConfig, saveGlobalConfig } from './config'\n\n/**\n * Get the current compression mode\n *\n * Priority order:\n * 1. Global configuration setting\n * 2. Default: 'business' (business consulting mode)\n *\n * @returns The current compression mode\n */\nexport function getCompressionMode(): CompressionMode {\n try {\n const config = getGlobalConfig()\n const mode = config.compressionMode\n\n // Validate the mode value\n if (mode === 'business' || mode === 'code') {\n return mode\n }\n\n // Default to business mode if not set or invalid\n return 'business'\n } catch (error) {\n console.error('Error getting compression mode:', error)\n return 'business'\n }\n}\n\n/**\n * Set the compression mode\n *\n * Saves the compression mode to global configuration for persistence\n * across sessions.\n *\n * @param mode - The compression mode to set ('business' or 'code')\n */\nexport function setCompressionMode(mode: CompressionMode): void {\n try {\n const config = getGlobalConfig()\n const updatedConfig = {\n ...config,\n compressionMode: mode,\n }\n saveGlobalConfig(updatedConfig)\n } catch (error) {\n console.error('Error setting compression mode:', error)\n throw error\n }\n}\n\n/**\n * Get a human-readable description of the compression mode\n *\n * @param mode - The compression mode\n * @returns A description of what the mode is optimized for\n */\nexport function getCompressionModeDescription(mode: CompressionMode): string {\n switch (mode) {\n case 'business':\n return 'Business Consulting (optimized for strategic analysis, research, and recommendations)'\n case 'code':\n return 'Code Development (optimized for technical context, debugging, and coding workflows)'\n default:\n return 'Unknown mode'\n }\n}\n\n/**\n * Check if a given string is a valid compression mode\n *\n * @param value - The value to check\n * @returns True if the value is a valid compression mode\n */\nexport function isValidCompressionMode(\n value: string,\n): value is CompressionMode {\n return value === 'business' || value === 'code'\n}\n"],
5
+ "mappings": "AAQA,SAAS,iBAAiB,wBAAwB;AAW3C,SAAS,qBAAsC;AACpD,MAAI;AACF,UAAM,SAAS,gBAAgB;AAC/B,UAAM,OAAO,OAAO;AAGpB,QAAI,SAAS,cAAc,SAAS,QAAQ;AAC1C,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,mCAAmC,KAAK;AACtD,WAAO;AAAA,EACT;AACF;AAUO,SAAS,mBAAmB,MAA6B;AAC9D,MAAI;AACF,UAAM,SAAS,gBAAgB;AAC/B,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,MACH,iBAAiB;AAAA,IACnB;AACA,qBAAiB,aAAa;AAAA,EAChC,SAAS,OAAO;AACd,YAAQ,MAAM,mCAAmC,KAAK;AACtD,UAAM;AAAA,EACR;AACF;AAQO,SAAS,8BAA8B,MAA+B;AAC3E,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAQO,SAAS,uBACd,OAC0B;AAC1B,SAAO,UAAU,cAAc,UAAU;AAC3C;",
6
6
  "names": []
7
7
  }
@@ -432,12 +432,14 @@ function getOpenAIApiKey() {
432
432
  }
433
433
  function migrateModelProfilesRemoveId(config) {
434
434
  if (!config.modelProfiles) return config;
435
+ const legacyConfig = config;
435
436
  const idToModelNameMap = /* @__PURE__ */ new Map();
436
437
  const migratedProfiles = config.modelProfiles.map((profile) => {
437
- if (profile.id && profile.modelName) {
438
- idToModelNameMap.set(profile.id, profile.modelName);
438
+ const legacyProfile = profile;
439
+ if (legacyProfile.id && profile.modelName) {
440
+ idToModelNameMap.set(legacyProfile.id, profile.modelName);
439
441
  }
440
- const { id, ...profileWithoutId } = profile;
442
+ const { id, ...profileWithoutId } = legacyProfile;
441
443
  return profileWithoutId;
442
444
  });
443
445
  const migratedPointers = {
@@ -455,12 +457,14 @@ function migrateModelProfilesRemoveId(config) {
455
457
  });
456
458
  }
457
459
  let defaultModelName;
458
- if (config.defaultModelId) {
459
- defaultModelName = idToModelNameMap.get(config.defaultModelId) || config.defaultModelId;
460
- } else if (config.defaultModelName) {
461
- defaultModelName = config.defaultModelName;
460
+ if (legacyConfig.defaultModelId) {
461
+ defaultModelName = idToModelNameMap.get(legacyConfig.defaultModelId) || legacyConfig.defaultModelId;
462
+ } else if (legacyConfig.defaultModelName) {
463
+ defaultModelName = legacyConfig.defaultModelName;
462
464
  }
463
- const migratedConfig = { ...config };
465
+ const migratedConfig = {
466
+ ...config
467
+ };
464
468
  delete migratedConfig.defaultModelId;
465
469
  delete migratedConfig.currentSelectedModelId;
466
470
  delete migratedConfig.mainAgentModelId;
@@ -519,31 +523,43 @@ function validateAndRepairGPT5Profile(profile) {
519
523
  if (!profile.reasoningEffort || !validReasoningEfforts.includes(profile.reasoningEffort)) {
520
524
  repairedProfile.reasoningEffort = "medium";
521
525
  wasRepaired = true;
522
- console.log(`\u{1F527} GPT-5 Config: Set reasoning effort to 'medium' for ${profile.modelName}`);
526
+ console.log(
527
+ `\u{1F527} GPT-5 Config: Set reasoning effort to 'medium' for ${profile.modelName}`
528
+ );
523
529
  }
524
530
  if (profile.contextLength < 128e3) {
525
531
  repairedProfile.contextLength = 128e3;
526
532
  wasRepaired = true;
527
- console.log(`\u{1F527} GPT-5 Config: Updated context length to 128k for ${profile.modelName}`);
533
+ console.log(
534
+ `\u{1F527} GPT-5 Config: Updated context length to 128k for ${profile.modelName}`
535
+ );
528
536
  }
529
537
  if (profile.maxTokens < 4e3) {
530
538
  repairedProfile.maxTokens = 8192;
531
539
  wasRepaired = true;
532
- console.log(`\u{1F527} GPT-5 Config: Updated max tokens to 8192 for ${profile.modelName}`);
540
+ console.log(
541
+ `\u{1F527} GPT-5 Config: Updated max tokens to 8192 for ${profile.modelName}`
542
+ );
533
543
  }
534
544
  if (profile.provider !== "openai" && profile.provider !== "custom-openai" && profile.provider !== "azure") {
535
- console.warn(`\u26A0\uFE0F GPT-5 Config: Unexpected provider '${profile.provider}' for GPT-5 model ${profile.modelName}. Consider using 'openai' or 'custom-openai'.`);
545
+ console.warn(
546
+ `\u26A0\uFE0F GPT-5 Config: Unexpected provider '${profile.provider}' for GPT-5 model ${profile.modelName}. Consider using 'openai' or 'custom-openai'.`
547
+ );
536
548
  }
537
549
  if (profile.modelName.includes("gpt-5") && !profile.baseURL) {
538
550
  repairedProfile.baseURL = "https://api.openai.com/v1";
539
551
  wasRepaired = true;
540
- console.log(`\u{1F527} GPT-5 Config: Set default base URL for ${profile.modelName}`);
552
+ console.log(
553
+ `\u{1F527} GPT-5 Config: Set default base URL for ${profile.modelName}`
554
+ );
541
555
  }
542
556
  }
543
557
  repairedProfile.validationStatus = wasRepaired ? "auto_repaired" : "valid";
544
558
  repairedProfile.lastValidation = now;
545
559
  if (wasRepaired) {
546
- console.log(`\u2705 GPT-5 Config: Auto-repaired configuration for ${profile.modelName}`);
560
+ console.log(
561
+ `\u2705 GPT-5 Config: Auto-repaired configuration for ${profile.modelName}`
562
+ );
547
563
  }
548
564
  return repairedProfile;
549
565
  }