@iaforged/context-code 2.1.7 → 2.1.8

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 (408) hide show
  1. package/dist/src/Task.js +1 -1
  2. package/dist/src/constants/oauth.js +1 -1
  3. package/dist/src/context/mailbox.js +1 -1
  4. package/dist/src/context/voice.js +1 -1
  5. package/dist/src/hooks/useTerminalSize.js +1 -1
  6. package/dist/src/ink/Ansi.js +1 -1
  7. package/dist/src/ink/clearTerminal.js +1 -1
  8. package/dist/src/ink/colorize.js +1 -1
  9. package/dist/src/ink/components/App.js +1 -1
  10. package/dist/src/ink/components/Button.js +1 -1
  11. package/dist/src/ink/components/ClockContext.js +1 -1
  12. package/dist/src/ink/components/CursorDeclarationContext.js +1 -1
  13. package/dist/src/ink/components/Link.js +1 -1
  14. package/dist/src/ink/components/StdinContext.js +1 -1
  15. package/dist/src/ink/components/TerminalFocusContext.js +1 -1
  16. package/dist/src/ink/dom.js +1 -1
  17. package/dist/src/ink/events/keyboard-event.js +1 -1
  18. package/dist/src/ink/hit-test.js +1 -1
  19. package/dist/src/ink/hooks/use-animation-frame.js +1 -1
  20. package/dist/src/ink/hooks/use-app.js +1 -1
  21. package/dist/src/ink/hooks/use-input.js +1 -1
  22. package/dist/src/ink/hooks/use-interval.js +1 -1
  23. package/dist/src/ink/hooks/use-selection.js +1 -1
  24. package/dist/src/ink/hooks/use-tab-status.js +1 -1
  25. package/dist/src/ink/hooks/use-terminal-focus.js +1 -1
  26. package/dist/src/ink/hooks/use-terminal-title.js +1 -1
  27. package/dist/src/ink/hooks/use-terminal-viewport.js +1 -1
  28. package/dist/src/ink/ink.js +1 -1
  29. package/dist/src/ink/layout/yoga.js +1 -1
  30. package/dist/src/ink/line-width-cache.js +1 -1
  31. package/dist/src/ink/log-update.js +1 -1
  32. package/dist/src/ink/measure-text.js +1 -1
  33. package/dist/src/ink/output.js +1 -1
  34. package/dist/src/ink/parse-keypress.js +1 -1
  35. package/dist/src/ink/reconciler.js +1 -1
  36. package/dist/src/ink/render-border.js +1 -1
  37. package/dist/src/ink/render-node-to-output.js +1 -1
  38. package/dist/src/ink/render-to-screen.js +1 -1
  39. package/dist/src/ink/renderer.js +1 -1
  40. package/dist/src/ink/root.js +1 -1
  41. package/dist/src/ink/screen.js +1 -1
  42. package/dist/src/ink/searchHighlight.js +1 -1
  43. package/dist/src/ink/selection.js +1 -1
  44. package/dist/src/ink/squash-text-nodes.js +1 -1
  45. package/dist/src/ink/stringWidth.js +1 -1
  46. package/dist/src/ink/tabstops.js +1 -1
  47. package/dist/src/ink/terminal.js +1 -1
  48. package/dist/src/ink/termio/osc.js +1 -1
  49. package/dist/src/ink/termio/parser.js +1 -1
  50. package/dist/src/ink/termio/tokenize.js +1 -1
  51. package/dist/src/ink/useTerminalNotification.js +1 -1
  52. package/dist/src/ink/warn.js +1 -1
  53. package/dist/src/ink/widest-line.js +1 -1
  54. package/dist/src/ink/wrap-text.js +1 -1
  55. package/dist/src/ink/wrapAnsi.js +1 -1
  56. package/dist/src/native-ts/yoga-layout/index.js +1 -1
  57. package/dist/src/schemas/hooks.js +1 -1
  58. package/dist/src/services/SessionMemory/sessionMemoryUtils.js +1 -1
  59. package/dist/src/services/api/client.js +1 -1
  60. package/dist/src/services/api/dumpPrompts.js +1 -1
  61. package/dist/src/services/api/errorUtils.js +1 -1
  62. package/dist/src/services/api/promptCacheBreakDetection.js +1 -1
  63. package/dist/src/services/api/withRetry.js +1 -1
  64. package/dist/src/services/autoDream/consolidationLock.js +1 -1
  65. package/dist/src/services/mcp/elicitationHandler.js +1 -1
  66. package/dist/src/services/mcp/mcpStringUtils.js +1 -1
  67. package/dist/src/services/mcp/oauthPort.js +1 -1
  68. package/dist/src/services/mcp/vscodeSdkMcp.js +1 -1
  69. package/dist/src/services/oauth/client.js +1 -1
  70. package/dist/src/services/oauth/getOauthProfile.js +1 -1
  71. package/dist/src/services/objetivo/types.js +1 -1
  72. package/dist/src/services/rateLimitMocking.js +1 -1
  73. package/dist/src/services/remoteManagedSettings/syncCacheState.js +1 -1
  74. package/dist/src/skills/bundledSkills.js +1 -1
  75. package/dist/src/tasks/DreamTask/DreamTask.js +1 -1
  76. package/dist/src/tools/AgentTool/agentMemory.js +1 -1
  77. package/dist/src/tools/AgentTool/forkSubagent.js +1 -1
  78. package/dist/src/tools/BashTool/BashToolResultMessage.js +1 -1
  79. package/dist/src/tools/BashTool/UI.js +1 -1
  80. package/dist/src/tools/BashTool/sedEditParser.js +1 -1
  81. package/dist/src/tools/BashTool/utils.js +1 -1
  82. package/dist/src/tools/FileReadTool/imageProcessor.js +1 -1
  83. package/dist/src/tools/FileReadTool/prompt.js +1 -1
  84. package/dist/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +1 -1
  85. package/dist/src/tools/ListMcpResourcesTool/UI.js +1 -1
  86. package/dist/src/tools/MCPTool/MCPTool.js +1 -1
  87. package/dist/src/tools/MCPTool/UI.js +1 -1
  88. package/dist/src/tools/McpAuthTool/McpAuthTool.js +1 -1
  89. package/dist/src/tools/NotebookEditTool/prompt.js +1 -1
  90. package/dist/src/tools/PowerShellTool/PowerShellTool.js +1 -1
  91. package/dist/src/tools/PowerShellTool/UI.js +1 -1
  92. package/dist/src/tools/PowerShellTool/gitSafety.js +1 -1
  93. package/dist/src/tools/PowerShellTool/modeValidation.js +1 -1
  94. package/dist/src/tools/PowerShellTool/pathValidation.js +1 -1
  95. package/dist/src/tools/PowerShellTool/powershellPermissions.js +1 -1
  96. package/dist/src/tools/PowerShellTool/powershellSecurity.js +1 -1
  97. package/dist/src/tools/PowerShellTool/prompt.js +1 -1
  98. package/dist/src/tools/PowerShellTool/readOnlyValidation.js +1 -1
  99. package/dist/src/tools/REPLTool/constants.js +1 -1
  100. package/dist/src/tools/REPLTool/primitiveTools.js +1 -1
  101. package/dist/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +1 -1
  102. package/dist/src/tools/ReadMcpResourceTool/UI.js +1 -1
  103. package/dist/src/tools/ScheduleCronTool/prompt.js +1 -1
  104. package/dist/src/tools/SkillTool/prompt.js +1 -1
  105. package/dist/src/tools/TodoWriteTool/TodoWriteTool.js +1 -1
  106. package/dist/src/tools/ToolSearchTool/prompt.js +1 -1
  107. package/dist/src/tools/WebSearchTool/prompt.js +1 -1
  108. package/dist/src/tools/shared/gitOperationTracking.js +1 -1
  109. package/dist/src/types/permissions.js +1 -1
  110. package/dist/src/utils/Cursor.js +1 -1
  111. package/dist/src/utils/QueryGuard.js +1 -1
  112. package/dist/src/utils/Shell.js +1 -1
  113. package/dist/src/utils/ShellCommand.js +1 -1
  114. package/dist/src/utils/activityManager.js +1 -1
  115. package/dist/src/utils/advisor.js +1 -1
  116. package/dist/src/utils/appleTerminalBackup.js +1 -1
  117. package/dist/src/utils/argumentSubstitution.js +1 -1
  118. package/dist/src/utils/authFileDescriptor.js +1 -1
  119. package/dist/src/utils/autoUpdater.js +1 -1
  120. package/dist/src/utils/background/remote/preconditions.js +1 -1
  121. package/dist/src/utils/background/remote/remoteSession.js +1 -1
  122. package/dist/src/utils/bash/ShellSnapshot.js +1 -1
  123. package/dist/src/utils/bash/ast.js +1 -1
  124. package/dist/src/utils/bash/bashParser.js +1 -1
  125. package/dist/src/utils/bash/bashPipeCommand.js +1 -1
  126. package/dist/src/utils/bash/parser.js +1 -1
  127. package/dist/src/utils/bash/shellQuote.js +1 -1
  128. package/dist/src/utils/bash/shellQuoting.js +1 -1
  129. package/dist/src/utils/billing.js +1 -1
  130. package/dist/src/utils/caCerts.js +1 -1
  131. package/dist/src/utils/claudeInChrome/common.js +1 -1
  132. package/dist/src/utils/claudeInChrome/setupPortable.js +1 -1
  133. package/dist/src/utils/claudemd.js +1 -1
  134. package/dist/src/utils/collapseBackgroundBashNotifications.js +1 -1
  135. package/dist/src/utils/collapseReadSearch.js +1 -1
  136. package/dist/src/utils/completionCache.js +1 -1
  137. package/dist/src/utils/computerUse/common.js +1 -1
  138. package/dist/src/utils/concurrentSessions.js +1 -1
  139. package/dist/src/utils/context.js +1 -1
  140. package/dist/src/utils/cron.js +1 -1
  141. package/dist/src/utils/cronTasks.js +1 -1
  142. package/dist/src/utils/cwd.js +1 -1
  143. package/dist/src/utils/debug.js +1 -1
  144. package/dist/src/utils/debugFilter.js +1 -1
  145. package/dist/src/utils/detectRepository.js +1 -1
  146. package/dist/src/utils/diagLogs.js +1 -1
  147. package/dist/src/utils/diff.js +1 -1
  148. package/dist/src/utils/directMemberMessage.js +1 -1
  149. package/dist/src/utils/doctorDiagnostic.js +1 -1
  150. package/dist/src/utils/dxt/helpers.js +1 -1
  151. package/dist/src/utils/dxt/zip.js +1 -1
  152. package/dist/src/utils/earlyInput.js +1 -1
  153. package/dist/src/utils/editor.js +1 -1
  154. package/dist/src/utils/effort.js +1 -1
  155. package/dist/src/utils/embeddedTools.js +1 -1
  156. package/dist/src/utils/envDynamic.js +1 -1
  157. package/dist/src/utils/envUtils.js +1 -1
  158. package/dist/src/utils/execFileNoThrowPortable.js +1 -1
  159. package/dist/src/utils/execSyncWrapper.js +1 -1
  160. package/dist/src/utils/exportRenderer.js +1 -1
  161. package/dist/src/utils/extraUsage.js +1 -1
  162. package/dist/src/utils/fastMode.js +1 -1
  163. package/dist/src/utils/fileOperationAnalytics.js +1 -1
  164. package/dist/src/utils/fileRead.js +1 -1
  165. package/dist/src/utils/findExecutable.js +1 -1
  166. package/dist/src/utils/format.js +1 -1
  167. package/dist/src/utils/frontmatterParser.js +1 -1
  168. package/dist/src/utils/fsOperations.js +1 -1
  169. package/dist/src/utils/fullscreen.js +1 -1
  170. package/dist/src/utils/genericProcessUtils.js +1 -1
  171. package/dist/src/utils/getWorktreePaths.js +1 -1
  172. package/dist/src/utils/git/gitConfigParser.js +1 -1
  173. package/dist/src/utils/git/gitFilesystem.js +1 -1
  174. package/dist/src/utils/git/gitignore.js +1 -1
  175. package/dist/src/utils/gitDiff.js +1 -1
  176. package/dist/src/utils/gitSettings.js +1 -1
  177. package/dist/src/utils/glob.js +1 -1
  178. package/dist/src/utils/gracefulShutdown.js +1 -1
  179. package/dist/src/utils/groupToolUses.js +1 -1
  180. package/dist/src/utils/handlePromptSubmit.js +1 -1
  181. package/dist/src/utils/hash.js +1 -1
  182. package/dist/src/utils/hooks/fileChangedWatcher.js +1 -1
  183. package/dist/src/utils/hooks/hooksSettings.js +1 -1
  184. package/dist/src/utils/hooks/registerSkillHooks.js +1 -1
  185. package/dist/src/utils/hooks/sessionHooks.js +1 -1
  186. package/dist/src/utils/http.js +1 -1
  187. package/dist/src/utils/hyperlink.js +1 -1
  188. package/dist/src/utils/ide.js +1 -1
  189. package/dist/src/utils/idePathConversion.js +1 -1
  190. package/dist/src/utils/imagePaste.js +1 -1
  191. package/dist/src/utils/imageResizer.js +1 -1
  192. package/dist/src/utils/imageStore.js +1 -1
  193. package/dist/src/utils/inProcessTeammateHelpers.js +1 -1
  194. package/dist/src/utils/ink.js +1 -1
  195. package/dist/src/utils/jetbrains.js +1 -1
  196. package/dist/src/utils/json.js +1 -1
  197. package/dist/src/utils/listSessionsImpl.js +1 -1
  198. package/dist/src/utils/localInstaller.js +1 -1
  199. package/dist/src/utils/lockfile.js +1 -1
  200. package/dist/src/utils/logoV2Utils.js +1 -1
  201. package/dist/src/utils/markdown.js +1 -1
  202. package/dist/src/utils/mcp/dateTimeParser.js +1 -1
  203. package/dist/src/utils/mcpOutputStorage.js +1 -1
  204. package/dist/src/utils/mcpValidation.js +1 -1
  205. package/dist/src/utils/memoize.js +1 -1
  206. package/dist/src/utils/memory/types.js +1 -1
  207. package/dist/src/utils/memoryFileDetection.js +1 -1
  208. package/dist/src/utils/messageQueueManager.js +1 -1
  209. package/dist/src/utils/messages/mappers.js +1 -1
  210. package/dist/src/utils/messages/systemInit.js +1 -1
  211. package/dist/src/utils/model/antModels.js +1 -1
  212. package/dist/src/utils/model/check1mAccess.js +1 -1
  213. package/dist/src/utils/model/contextWindowUpgradeCheck.js +1 -1
  214. package/dist/src/utils/model/model.js +1 -1
  215. package/dist/src/utils/model/modelAllowlist.js +1 -1
  216. package/dist/src/utils/model/modelCapabilities.js +1 -1
  217. package/dist/src/utils/model/modelOptions.js +1 -1
  218. package/dist/src/utils/model/modelStrings.js +1 -1
  219. package/dist/src/utils/model/providerModels.js +1 -1
  220. package/dist/src/utils/model/providerProfiles.js +1 -1
  221. package/dist/src/utils/model/providerProfilesDb.js +1 -1
  222. package/dist/src/utils/model/providerSwitch.js +1 -1
  223. package/dist/src/utils/model/providers.js +1 -1
  224. package/dist/src/utils/modelCost.js +1 -1
  225. package/dist/src/utils/modifiers.js +1 -1
  226. package/dist/src/utils/mtls.js +1 -1
  227. package/dist/src/utils/nativeInstaller/download.js +1 -1
  228. package/dist/src/utils/nativeInstaller/installer.js +1 -1
  229. package/dist/src/utils/nativeInstaller/packageManagers.js +1 -1
  230. package/dist/src/utils/nativeInstaller/pidLock.js +1 -1
  231. package/dist/src/utils/notebook.js +1 -1
  232. package/dist/src/utils/pasteStore.js +1 -1
  233. package/dist/src/utils/path.js +1 -1
  234. package/dist/src/utils/permissions/PermissionMode.js +1 -1
  235. package/dist/src/utils/permissions/PermissionPromptToolResultSchema.js +1 -1
  236. package/dist/src/utils/permissions/PermissionUpdate.js +1 -1
  237. package/dist/src/utils/permissions/PermissionUpdateSchema.js +1 -1
  238. package/dist/src/utils/permissions/autoModeState.js +1 -1
  239. package/dist/src/utils/permissions/bypassPermissionsKillswitch.js +1 -1
  240. package/dist/src/utils/permissions/filesystem.js +1 -1
  241. package/dist/src/utils/permissions/getNextPermissionMode.js +1 -1
  242. package/dist/src/utils/permissions/pathValidation.js +1 -1
  243. package/dist/src/utils/permissions/permissionRuleParser.js +1 -1
  244. package/dist/src/utils/permissions/permissionsDb.js +1 -1
  245. package/dist/src/utils/permissions/permissionsLoader.js +1 -1
  246. package/dist/src/utils/permissions/shellRuleMatching.js +1 -1
  247. package/dist/src/utils/planModeV2.js +1 -1
  248. package/dist/src/utils/plans.js +1 -1
  249. package/dist/src/utils/platform.js +1 -1
  250. package/dist/src/utils/plugins/addDirPluginSettings.js +1 -1
  251. package/dist/src/utils/plugins/cacheUtils.js +1 -1
  252. package/dist/src/utils/plugins/dependencyResolver.js +1 -1
  253. package/dist/src/utils/plugins/fetchTelemetry.js +1 -1
  254. package/dist/src/utils/plugins/gitAvailability.js +1 -1
  255. package/dist/src/utils/plugins/hintRecommendation.js +1 -1
  256. package/dist/src/utils/plugins/installedPluginsManager.js +1 -1
  257. package/dist/src/utils/plugins/loadPluginAgents.js +1 -1
  258. package/dist/src/utils/plugins/loadPluginCommands.js +1 -1
  259. package/dist/src/utils/plugins/loadPluginHooks.js +1 -1
  260. package/dist/src/utils/plugins/loadPluginOutputStyles.js +1 -1
  261. package/dist/src/utils/plugins/lspPluginIntegration.js +1 -1
  262. package/dist/src/utils/plugins/lspRecommendation.js +1 -1
  263. package/dist/src/utils/plugins/managedPlugins.js +1 -1
  264. package/dist/src/utils/plugins/marketplaceHelpers.js +1 -1
  265. package/dist/src/utils/plugins/marketplaceManager.js +1 -1
  266. package/dist/src/utils/plugins/mcpPluginIntegration.js +1 -1
  267. package/dist/src/utils/plugins/mcpbHandler.js +1 -1
  268. package/dist/src/utils/plugins/officialMarketplaceGcs.js +1 -1
  269. package/dist/src/utils/plugins/officialMarketplaceStartupCheck.js +1 -1
  270. package/dist/src/utils/plugins/orphanedPluginFilter.js +1 -1
  271. package/dist/src/utils/plugins/performStartupChecks.js +1 -1
  272. package/dist/src/utils/plugins/pluginAutoupdate.js +1 -1
  273. package/dist/src/utils/plugins/pluginBlocklist.js +1 -1
  274. package/dist/src/utils/plugins/pluginDirectories.js +1 -1
  275. package/dist/src/utils/plugins/pluginFlagging.js +1 -1
  276. package/dist/src/utils/plugins/pluginInstallationHelpers.js +1 -1
  277. package/dist/src/utils/plugins/pluginLoader.js +1 -1
  278. package/dist/src/utils/plugins/pluginOptionsStorage.js +1 -1
  279. package/dist/src/utils/plugins/pluginPolicy.js +1 -1
  280. package/dist/src/utils/plugins/pluginStartupCheck.js +1 -1
  281. package/dist/src/utils/plugins/pluginVersioning.js +1 -1
  282. package/dist/src/utils/plugins/reconciler.js +1 -1
  283. package/dist/src/utils/plugins/refresh.js +1 -1
  284. package/dist/src/utils/plugins/schemas.js +1 -1
  285. package/dist/src/utils/plugins/walkPluginMarkdown.js +1 -1
  286. package/dist/src/utils/plugins/zipCache.js +1 -1
  287. package/dist/src/utils/powershell/parser.js +1 -1
  288. package/dist/src/utils/processUserInput/processBashCommand.js +1 -1
  289. package/dist/src/utils/processUserInput/processSlashCommand.js +1 -1
  290. package/dist/src/utils/processUserInput/processTextPrompt.js +1 -1
  291. package/dist/src/utils/processUserInput/processUserInput.js +1 -1
  292. package/dist/src/utils/profilerBase.js +1 -1
  293. package/dist/src/utils/promptCategory.js +1 -1
  294. package/dist/src/utils/promptEditor.js +1 -1
  295. package/dist/src/utils/promptShellExecution.js +1 -1
  296. package/dist/src/utils/proxy.js +1 -1
  297. package/dist/src/utils/queryHelpers.js +1 -1
  298. package/dist/src/utils/queryProfiler.js +1 -1
  299. package/dist/src/utils/queueProcessor.js +1 -1
  300. package/dist/src/utils/readFileInRange.js +1 -1
  301. package/dist/src/utils/releaseNotes.js +1 -1
  302. package/dist/src/utils/renderOptions.js +1 -1
  303. package/dist/src/utils/ripgrep.js +1 -1
  304. package/dist/src/utils/sandbox/sandbox-adapter.js +1 -1
  305. package/dist/src/utils/sdkEventQueue.js +1 -1
  306. package/dist/src/utils/secureStorage/index.js +1 -1
  307. package/dist/src/utils/secureStorage/macOsKeychainHelpers.js +1 -1
  308. package/dist/src/utils/secureStorage/macOsKeychainStorage.js +1 -1
  309. package/dist/src/utils/secureStorage/plainTextStorage.js +1 -1
  310. package/dist/src/utils/secureStorage/sqliteStorage.js +1 -1
  311. package/dist/src/utils/sessionEnvironment.js +1 -1
  312. package/dist/src/utils/sessionIngressAuth.js +1 -1
  313. package/dist/src/utils/sessionRestore.js +1 -1
  314. package/dist/src/utils/sessionStart.js +1 -1
  315. package/dist/src/utils/sessionTitle.js +1 -1
  316. package/dist/src/utils/settings/managedPath.js +1 -1
  317. package/dist/src/utils/settings/mdm/rawRead.js +1 -1
  318. package/dist/src/utils/settings/mdm/settings.js +1 -1
  319. package/dist/src/utils/settings/permissionValidation.js +1 -1
  320. package/dist/src/utils/settings/pluginOnlyPolicy.js +1 -1
  321. package/dist/src/utils/settings/schemaOutput.js +1 -1
  322. package/dist/src/utils/settings/settings.js +1 -1
  323. package/dist/src/utils/settings/types.js +1 -1
  324. package/dist/src/utils/settings/validateEditTool.js +1 -1
  325. package/dist/src/utils/settings/validation.js +1 -1
  326. package/dist/src/utils/shell/bashProvider.js +1 -1
  327. package/dist/src/utils/shell/powershellDetection.js +1 -1
  328. package/dist/src/utils/shell/powershellProvider.js +1 -1
  329. package/dist/src/utils/shell/readOnlyCommandValidation.js +1 -1
  330. package/dist/src/utils/shell/resolveDefaultShell.js +1 -1
  331. package/dist/src/utils/shell/shellToolUtils.js +1 -1
  332. package/dist/src/utils/shell/specPrefix.js +1 -1
  333. package/dist/src/utils/shellConfig.js +1 -1
  334. package/dist/src/utils/sideQuestion.js +1 -1
  335. package/dist/src/utils/skills/skillChangeDetector.js +1 -1
  336. package/dist/src/utils/slashCommandParsing.js +1 -1
  337. package/dist/src/utils/sliceAnsi.js +1 -1
  338. package/dist/src/utils/slowOperations.js +1 -1
  339. package/dist/src/utils/standaloneAgent.js +1 -1
  340. package/dist/src/utils/startupProfiler.js +1 -1
  341. package/dist/src/utils/staticRender.js +1 -1
  342. package/dist/src/utils/status.js +1 -1
  343. package/dist/src/utils/statusNoticeDefinitions.js +1 -1
  344. package/dist/src/utils/suggestions/commandSuggestions.js +1 -1
  345. package/dist/src/utils/suggestions/directoryCompletion.js +1 -1
  346. package/dist/src/utils/suggestions/shellHistoryCompletion.js +1 -1
  347. package/dist/src/utils/suggestions/skillUsageTracking.js +1 -1
  348. package/dist/src/utils/suggestions/slackChannelSuggestions.js +1 -1
  349. package/dist/src/utils/swarm/backends/detection.js +1 -1
  350. package/dist/src/utils/swarm/permissionSync.js +1 -1
  351. package/dist/src/utils/swarm/reconnection.js +1 -1
  352. package/dist/src/utils/swarm/spawnUtils.js +1 -91
  353. package/dist/src/utils/swarm/teammateInit.js +1 -1
  354. package/dist/src/utils/systemDirectories.js +1 -1
  355. package/dist/src/utils/systemPrompt.js +1 -1
  356. package/dist/src/utils/systemTheme.js +1 -1
  357. package/dist/src/utils/task/TaskOutput.js +1 -1
  358. package/dist/src/utils/task/diskOutput.js +1 -1
  359. package/dist/src/utils/tasks.js +1 -1
  360. package/dist/src/utils/teamDiscovery.js +1 -1
  361. package/dist/src/utils/teamMemoryOps.js +1 -1
  362. package/dist/src/utils/teammateMailbox.js +1 -1
  363. package/dist/src/utils/telemetry/betaSessionTracing.js +1 -1
  364. package/dist/src/utils/telemetry/bigqueryExporter.js +1 -1
  365. package/dist/src/utils/telemetry/events.js +1 -1
  366. package/dist/src/utils/telemetry/instrumentation.js +1 -1
  367. package/dist/src/utils/telemetry/logger.js +1 -1
  368. package/dist/src/utils/telemetry/perfettoTracing.js +1 -1
  369. package/dist/src/utils/telemetry/pluginTelemetry.js +1 -1
  370. package/dist/src/utils/telemetry/sessionTracing.js +1 -1
  371. package/dist/src/utils/telemetryAttributes.js +1 -1
  372. package/dist/src/utils/teleport/api.js +1 -1
  373. package/dist/src/utils/teleport/environments.js +1 -1
  374. package/dist/src/utils/teleport/gitBundle.js +1 -1
  375. package/dist/src/utils/teleport.js +1 -1
  376. package/dist/src/utils/tempfile.js +1 -1
  377. package/dist/src/utils/terminal.js +1 -1
  378. package/dist/src/utils/terminalPanel.js +1 -1
  379. package/dist/src/utils/textHighlighting.js +1 -1
  380. package/dist/src/utils/theme.js +1 -1
  381. package/dist/src/utils/themes/bootstrap.js +1 -1
  382. package/dist/src/utils/themes/loader.js +1 -1
  383. package/dist/src/utils/thinking.js +1 -1
  384. package/dist/src/utils/tmuxSocket.js +1 -1
  385. package/dist/src/utils/tokens.js +1 -1
  386. package/dist/src/utils/toolPool.js +1 -1
  387. package/dist/src/utils/toolResultStorage.js +1 -1
  388. package/dist/src/utils/transcriptSearch.js +1 -1
  389. package/dist/src/utils/truncate.js +1 -1
  390. package/dist/src/utils/ultraplan/keyword.js +1 -1
  391. package/dist/src/utils/unaryLogging.js +1 -1
  392. package/dist/src/utils/undercover.js +1 -1
  393. package/dist/src/utils/user.js +1 -1
  394. package/dist/src/utils/userPromptKeywords.js +1 -1
  395. package/dist/src/utils/which.js +1 -1
  396. package/dist/src/utils/windowsPaths.js +1 -1
  397. package/dist/src/utils/worktree.js +1 -1
  398. package/dist/src/utils/zodToJsonSchema.js +1 -1
  399. package/dist/src/vim/operators.js +1 -1
  400. package/dist/src/vim/textObjects.js +1 -1
  401. package/dist/src/vim/transitions.js +1 -1
  402. package/dist/src/voice/voiceModeEnabled.js +1 -1
  403. package/dist/src/webapp/auth.js +1 -1
  404. package/dist/src/webapp/tunnel.js +1 -1
  405. package/dist/src/whatsapp/bridge.js +1 -1
  406. package/dist/src/whatsapp/mirror.js +1 -1
  407. package/dist/webapp/main-MTQLKGXD.js +1 -1
  408. package/package.json +1 -1
@@ -1 +1 @@
1
- import{getInitialMainLoopModel as e}from"../../bootstrap/state.js";import{isClaudeAISubscriber as o,isMaxSubscriber as t,isTeamPremiumSubscriber as i}from"../auth.js";import{getModelStrings as n}from"./modelStrings.js";import{COST_TIER_3_15 as s,COST_HAIKU_35 as r,COST_HAIKU_45 as l,formatModelPricing as a}from"../modelCost.js";import{getSettings_DEPRECATED as p}from"../settings/settings.js";import{checkOpus1mAccess as u,checkSonnet1mAccess as d}from"./check1mAccess.js";import{getAPIProvider as c}from"./providers.js";import{isModelAllowed as O}from"./modelAllowlist.js";import{getCanonicalName as m,getClaudeAiUserDefaultModelDescription as g,getDefaultOpenAIModel as f,getDefaultOpenAIFastModel as M,getDefaultGeminiModel as v,getDefaultGeminiFastModel as h,getDefaultSonnetModel as x,getDefaultOpusModel as _,getDefaultHaikuModel as b,getDefaultMainLoopModelSetting as P,getMarketingNameForModel as F,getUserSpecifiedModelSetting as S,isOpus1mMergeEnabled as T,getOpus46PricingSuffix as D,isOpenAIProvider as A,isGeminiProvider as C,renderDefaultModelSetting as w}from"./model.js";import{getAntModels as E}from"./antModels.js";import{has1mContext as N}from"../context.js";import{getGlobalConfig as k}from"../config.js";export function getDefaultOptionForUser(e=!1){if("ant"===process.env.USER_TYPE){const e=w(P());return{value:null,label:"Default (recommended)",description:`Use the default model for Ants (currently ${e})`,descriptionForModel:`Default model (currently ${e})`}}if(A())return{value:null,label:"Predeterminado (recomendado)",description:`Usa el modelo predeterminado (actualmente ${w(P())})`};if(o())return{value:null,label:"Default (recommended)",description:g(e)};const t="firstParty"!==c();return{value:null,label:"Default (recommended)",description:`Use the default model (currently ${w(P())})${t?"":` · ${a(s)}`}`}}function getSonnet46Option(){const e="firstParty"!==c();return{value:e?n().sonnet46:"sonnet",label:"Sonnet",description:"Sonnet 4.6 · Best for everyday tasks"+(e?"":` · ${a(s)}`),descriptionForModel:"Sonnet 4.6 - best for everyday tasks. Generally recommended for most coding tasks"}}function getOpus47Option(e=!1){return c(),{value:n().opus47,label:"Opus",description:`Opus 4.7 · Most capable for complex work${D(e)}`,descriptionForModel:"Opus 4.7 - most capable for complex work"}}function getOpus46Option(e=!1){return{value:"firstParty"!==c()?n().opus46:"opus",label:"Opus 4.6",description:`Opus 4.6 · Previous generation${D(e)}`,descriptionForModel:"Opus 4.6 - previous generation"}}export function getSonnet46_1MOption(){const e="firstParty"!==c();return{value:e?n().sonnet46+"[1m]":"sonnet[1m]",label:"Sonnet (1M context)",description:"Sonnet 4.6 for long sessions"+(e?"":` · ${a(s)}`),descriptionForModel:"Sonnet 4.6 with 1M context window - for long sessions with large codebases"}}export function getOpus47_1MOption(e=!1){return c(),{value:n().opus47+"[1m]",label:"Opus 4.7 (1M context)",description:`Opus 4.7 for long sessions${D(e)}`,descriptionForModel:"Opus 4.7 with 1M context window - for long sessions with large codebases"}}export function getOpus46_1MOption(e=!1){return{value:"firstParty"!==c()?n().opus46+"[1m]":"opus[1m]",label:"Opus 4.6 (1M context)",description:`Opus 4.6 for long sessions${D(e)}`,descriptionForModel:"Opus 4.6 with 1M context window - for long sessions with large codebases"}}function getHaiku45Option(){return{value:"haiku",label:"Haiku",description:"Haiku 4.5 · Fastest for quick answers"+("firstParty"!==c()?"":` · ${a(l)}`),descriptionForModel:"Haiku 4.5 - fastest for quick answers. Lower cost but less capable than Sonnet 4.6."}}function getHaikuOption(){return b()===n().haiku45?getHaiku45Option():{value:"haiku",label:"Haiku",description:"Haiku 3.5 for simple tasks"+("firstParty"!==c()?"":` · ${a(r)}`),descriptionForModel:"Haiku 3.5 - faster and lower cost, but less capable than Sonnet. Use for simple tasks."}}function getMaxOpus47Option(e=!1){return{value:n().opus47,label:"Opus",description:`Opus 4.7 · Most capable for complex work${e?D(!0):""}`}}function getMaxOpusOption(e=!1){return{value:"opus",label:"Opus 4.6",description:`Opus 4.6 · Previous generation${e?D(!0):""}`}}export function getMaxSonnet46_1MOption(){const e="firstParty"!==c();return{value:"sonnet[1m]",label:"Sonnet (1M context)",description:`Sonnet 4.6 with 1M context${o()?" · Billed as extra usage":""}${e?"":` · ${a(s)}`}`}}export function getMaxOpus47_1MOption(e=!1){const t=o()?" · Billed as extra usage":"";return{value:n().opus47+"[1m]",label:"Opus 4.7 (1M context)",description:`Opus 4.7 with 1M context${t}${D(e)}`}}export function getMaxOpus46_1MOption(e=!1){return{value:"opus[1m]",label:"Opus 4.6 (1M context)",description:`Opus 4.6 with 1M context${o()?" · Billed as extra usage":""}${D(e)}`}}function getMergedOpus1MOption(e=!1){const o="firstParty"!==c();return{value:n().opus47+"[1m]",label:"Opus (1M context)",description:`Opus 4.7 with 1M context · Most capable for complex work${!o&&e?D(e):""}`,descriptionForModel:"Opus 4.7 with 1M context - most capable for complex work"}}const I={value:"sonnet",label:"Sonnet",description:"Sonnet 4.6 · Best for everyday tasks"},U={value:"haiku",label:"Haiku",description:"Haiku 4.5 · Fastest for quick answers"};function getModelOptionsBase(e=!1){if("ant"===process.env.USER_TYPE){const o=E().map(e=>({value:e.alias,label:e.label,description:e.description??`[ANT-ONLY] ${e.label} (${e.model})`}));return[getDefaultOptionForUser(),...o,getMergedOpus1MOption(e),getSonnet46Option(),getSonnet46_1MOption(),getHaiku45Option()]}if("openai"===c())return[getDefaultOptionForUser(e),{value:"gpt-5.5",label:"GPT-5.5",description:"gpt-5.5 - Modelo flagship para razonamiento, coding y agentes",descriptionForModel:"gpt-5.5 - flagship model for complex reasoning, coding, and agentic work"},{value:"gpt-5.5-pro",label:"GPT-5.5 Pro",description:"gpt-5.5-pro - Mayor precision para tareas dificiles",descriptionForModel:"gpt-5.5-pro - higher-accuracy model for harder tasks"},{value:"gpt-5.4",label:"GPT-5.4",description:"gpt-5.4 - Modelo principal recomendado",descriptionForModel:"gpt-5.4 - recommended flagship model"},{value:"gpt-5.2-codex",label:"GPT-5.2-Codex",description:"gpt-5.2-codex - Codex moderno para programacion",descriptionForModel:"gpt-5.2-codex - modern Codex model"},{value:"gpt-5.1-codex-max",label:"GPT-5.1-Codex-Max",description:"gpt-5.1-codex-max - Codex de maxima capacidad",descriptionForModel:"gpt-5.1-codex-max - highest-capacity Codex model"},{value:"gpt-5.4-mini",label:"GPT-5.4-Mini",description:"gpt-5.4-mini - Variante ligera y rapida",descriptionForModel:"gpt-5.4-mini - fast lightweight model"},{value:"gpt-5.3-codex",label:"GPT-5.3-Codex",description:"gpt-5.3-codex - Codex frontier anterior",descriptionForModel:"gpt-5.3-codex - previous frontier Codex model"},{value:"gpt-5.2",label:"GPT-5.2",description:"gpt-5.2 - Modelo general estable",descriptionForModel:"gpt-5.2 - stable general-purpose model"},{value:"gpt-5.1-codex-mini",label:"GPT-5.1-Codex-Mini",description:"gpt-5.1-codex-mini - Codex mini de compatibilidad",descriptionForModel:"gpt-5.1-codex-mini - compatibility Codex mini model"}];if("openrouter"===c())return[getDefaultOptionForUser(e)];if(C())return[getDefaultOptionForUser(e),{value:v(),label:"Gemini 3.5 Pro",description:"gemini-3.5-pro - Modelo Gemini principal para razonamiento, codigo y agentes",descriptionForModel:"gemini-3.5-pro - flagship Gemini model"},{value:h(),label:"Gemini 3.5 Flash",description:"gemini-3.5-flash - Variante Gemini rapida para tareas multimodales y de codigo",descriptionForModel:"gemini-3.5-flash - fast Gemini model"},{value:"gemini-3.5-flash-lite",label:"Gemini 3.5 Flash-Lite",description:"gemini-3.5-flash-lite - Variante de bajo costo y baja latencia",descriptionForModel:"gemini-3.5-flash-lite - fast low-cost Gemini model"},{value:"gemini-3.1-pro-preview",label:"Gemini 3.1 Pro Preview",description:"gemini-3.1-pro-preview - Version anterior de Pro",descriptionForModel:"gemini-3.1-pro-preview - previous Pro preview model"},{value:"gemini-3-flash-preview",label:"Gemini 3 Flash Preview",description:"gemini-3-flash-preview - Version anterior de Flash",descriptionForModel:"gemini-3-flash-preview - previous Flash preview model"},{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro",description:"gemini-2.5-pro - Modelo estable para razonamiento y codigo",descriptionForModel:"gemini-2.5-pro - stable Gemini model"},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash",description:"gemini-2.5-flash - Modelo estable rapido",descriptionForModel:"gemini-2.5-flash - stable fast Gemini model"}];if("ollama"===c()||"ollama-cloud"===c()||"zai"===c()||"minimax"===c()||"deepseek"===c())return[getDefaultOptionForUser(e)];if(o()){if(t()||i()){const o=[getDefaultOptionForUser(e)];return o.push(getMaxOpus47Option(e)),!T()&&u()&&o.push(getMaxOpus47_1MOption(e)),o.push(getMaxOpusOption(e)),!T()&&u()&&o.push(getMaxOpus46_1MOption(e)),o.push(I),d()&&o.push(getMaxSonnet46_1MOption()),o.push(U),o}const o=[getDefaultOptionForUser(e)];return o.push(I),d()&&o.push(getMaxSonnet46_1MOption()),o.push(getMaxOpus47Option(e)),u()&&o.push(getMaxOpus47_1MOption(e)),o.push(getMaxOpusOption(e)),u()&&o.push(getMaxOpus46_1MOption(e)),o.push(U),o}if("firstParty"===c()){const o=[getDefaultOptionForUser(e)];return o.push(getSonnet46Option()),d()&&o.push(getSonnet46_1MOption()),o.push(getOpus47Option(e)),u()&&o.push(getOpus47_1MOption(e)),o.push(getOpus46Option(e)),u()&&o.push(getOpus46_1MOption(e)),o.push(getHaiku45Option()),o}const n=[getDefaultOptionForUser(e)],s=function(){const e="firstParty"!==c(),o=process.env.ANTHROPIC_DEFAULT_SONNET_MODEL;if(e&&o){const e=N(o);return{value:"sonnet",label:process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_NAME??o,description:process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION??"Custom Sonnet model"+(e?" (1M context)":""),descriptionForModel:`${process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION??"Custom Sonnet model"+(e?" with 1M context":"")} (${o})`}}}();void 0!==s?n.push(s):(n.push(getSonnet46Option()),d()&&n.push(getSonnet46_1MOption()));const r=function(){const e="firstParty"!==c(),o=process.env.ANTHROPIC_DEFAULT_OPUS_MODEL;if(e&&o){const e=N(o);return{value:"opus",label:process.env.ANTHROPIC_DEFAULT_OPUS_MODEL_NAME??o,description:process.env.ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION??"Custom Opus model"+(e?" (1M context)":""),descriptionForModel:`${process.env.ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION??"Custom Opus model"+(e?" with 1M context":"")} (${o})`}}}();void 0!==r?n.push(r):(n.push(getOpus47Option(e)),u()&&n.push(getOpus47_1MOption(e)),n.push(getOpus46Option(e)),u()&&n.push(getOpus46_1MOption(e)),n.push({value:"opus",label:"Opus 4.1",description:"Opus 4.1 · Legacy",descriptionForModel:"Opus 4.1 - legacy version"}));const l=function(){const e="firstParty"!==c(),o=process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL;if(e&&o)return{value:"haiku",label:process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME??o,description:process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION??"Custom Haiku model",descriptionForModel:`${process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION??"Custom Haiku model"} (${o})`}}();return void 0!==l?n.push(l):n.push(getHaikuOption()),n}export function getModelOptions(o=!1){const t=getModelOptionsBase(o),i=process.env.ANTHROPIC_CUSTOM_MODEL_OPTION;i&&!t.some(e=>e.value===i)&&t.push({value:i,label:process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME??i,description:process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION??`Custom model (${i})`});for(const e of k().additionalModelOptionsCache??[])t.some(o=>o.value===e.value)||t.push(e);let n=null;const s=S(),r=e();if(null!=s?n=s:null!==r&&(n=r),null===n||t.some(e=>e.value===n))return filterModelOptionsByAllowlist(t);if("opusplan"===n)return filterModelOptionsByAllowlist([...t,{value:"opusplan",label:"Opus Plan Mode",description:"Use Opus 4.7 in plan mode, Sonnet 4.6 otherwise"}]);if("opus"===n&&"firstParty"===c())return filterModelOptionsByAllowlist([...t,getMaxOpusOption(o)]);if("opus[1m]"===n&&"firstParty"===c())return filterModelOptionsByAllowlist([...t,getMergedOpus1MOption(o)]);{const e=function(e){const o=F(e);if(!o)return null;const t=function(e){const o=m(e);if(o.includes("claude-sonnet-4-6")||o.includes("claude-sonnet-4-5")||o.includes("claude-sonnet-4-")||o.includes("claude-3-7-sonnet")||o.includes("claude-3-5-sonnet")){const e=F(x());if(e)return{alias:"Sonnet",currentVersionName:e}}if(o.includes("claude-opus-4")){const e=F(_());if(e)return{alias:"Opus",currentVersionName:e}}if(o.includes("claude-haiku")||o.includes("claude-3-5-haiku")){const e=F(b());if(e)return{alias:"Haiku",currentVersionName:e}}return null}(e);return t&&o!==t.currentVersionName?{value:e,label:o,description:`Newer version available · select ${t.alias} for ${t.currentVersionName}`}:{value:e,label:o,description:e}}(n);return e?t.push(e):t.push({value:n,label:n,description:"Custom model"}),filterModelOptionsByAllowlist(t)}}function filterModelOptionsByAllowlist(e){return(p()||{}).availableModels?e.filter(e=>null===e.value||null!==e.value&&O(e.value)):e}
1
+ import{getInitialMainLoopModel as e}from"../../bootstrap/state.js";import{isClaudeAISubscriber as o,isMaxSubscriber as t,isTeamPremiumSubscriber as i}from"../auth.js";import{getModelStrings as n}from"./modelStrings.js";import{COST_TIER_3_15 as s,COST_HAIKU_35 as r,COST_HAIKU_45 as l,formatModelPricing as p}from"../modelCost.js";import{getSettings_DEPRECATED as a}from"../settings/settings.js";import{checkOpus1mAccess as u,checkSonnet1mAccess as d}from"./check1mAccess.js";import{getAPIProvider as c}from"./providers.js";import{isModelAllowed as O}from"./modelAllowlist.js";import{getCanonicalName as m,getClaudeAiUserDefaultModelDescription as g,getDefaultOpenAIModel as f,getDefaultOpenAIFastModel as M,getDefaultGeminiModel as v,getDefaultGeminiFastModel as h,getDefaultSonnetModel as x,getDefaultOpusModel as _,getDefaultHaikuModel as b,getDefaultMainLoopModelSetting as P,getMarketingNameForModel as F,getUserSpecifiedModelSetting as T,isOpus1mMergeEnabled as w,getOpus46PricingSuffix as D,isOpenAIProvider as S,isGeminiProvider as C,renderDefaultModelSetting as E}from"./model.js";import{getAntModels as A}from"./antModels.js";import{has1mContext as N}from"../context.js";import{getGlobalConfig as y}from"../config.js";export function getDefaultOptionForUser(e=!1){if("ant"===process.env.USER_TYPE){const e=E(P());return{value:null,label:"Default (recommended)",description:`Use the default model for Ants (currently ${e})`,descriptionForModel:`Default model (currently ${e})`}}if(S())return{value:null,label:"Predeterminado (recomendado)",description:`Usa el modelo predeterminado (actualmente ${E(P())})`};if(o())return{value:null,label:"Default (recommended)",description:g(e)};const t="firstParty"!==c();return{value:null,label:"Default (recommended)",description:`Use the default model (currently ${E(P())})${t?"":` · ${p(s)}`}`}}function getSonnet46Option(){const e="firstParty"!==c();return{value:e?n().sonnet46:"sonnet",label:"Sonnet",description:"Sonnet 4.6 · Best for everyday tasks"+(e?"":` · ${p(s)}`),descriptionForModel:"Sonnet 4.6 - best for everyday tasks. Generally recommended for most coding tasks"}}function getOpus47Option(e=!1){c();return{value:n().opus47,label:"Opus",description:`Opus 4.7 · Most capable for complex work${D(e)}`,descriptionForModel:"Opus 4.7 - most capable for complex work"}}function getOpus46Option(e=!1){return{value:"firstParty"!==c()?n().opus46:"opus",label:"Opus 4.6",description:`Opus 4.6 · Previous generation${D(e)}`,descriptionForModel:"Opus 4.6 - previous generation"}}export function getSonnet46_1MOption(){const e="firstParty"!==c();return{value:e?n().sonnet46+"[1m]":"sonnet[1m]",label:"Sonnet (1M context)",description:"Sonnet 4.6 for long sessions"+(e?"":` · ${p(s)}`),descriptionForModel:"Sonnet 4.6 with 1M context window - for long sessions with large codebases"}}export function getOpus47_1MOption(e=!1){c();return{value:n().opus47+"[1m]",label:"Opus 4.7 (1M context)",description:`Opus 4.7 for long sessions${D(e)}`,descriptionForModel:"Opus 4.7 with 1M context window - for long sessions with large codebases"}}export function getOpus46_1MOption(e=!1){return{value:"firstParty"!==c()?n().opus46+"[1m]":"opus[1m]",label:"Opus 4.6 (1M context)",description:`Opus 4.6 for long sessions${D(e)}`,descriptionForModel:"Opus 4.6 with 1M context window - for long sessions with large codebases"}}function getHaiku45Option(){return{value:"haiku",label:"Haiku",description:"Haiku 4.5 · Fastest for quick answers"+("firstParty"!==c()?"":` · ${p(l)}`),descriptionForModel:"Haiku 4.5 - fastest for quick answers. Lower cost but less capable than Sonnet 4.6."}}function getHaikuOption(){return b()===n().haiku45?getHaiku45Option():{value:"haiku",label:"Haiku",description:"Haiku 3.5 for simple tasks"+("firstParty"!==c()?"":` · ${p(r)}`),descriptionForModel:"Haiku 3.5 - faster and lower cost, but less capable than Sonnet. Use for simple tasks."}}function getMaxOpus47Option(e=!1){return{value:n().opus47,label:"Opus",description:`Opus 4.7 · Most capable for complex work${e?D(!0):""}`}}function getMaxOpusOption(e=!1){return{value:"opus",label:"Opus 4.6",description:`Opus 4.6 · Previous generation${e?D(!0):""}`}}export function getMaxSonnet46_1MOption(){const e="firstParty"!==c();return{value:"sonnet[1m]",label:"Sonnet (1M context)",description:`Sonnet 4.6 with 1M context${o()?" · Billed as extra usage":""}${e?"":` · ${p(s)}`}`}}export function getMaxOpus47_1MOption(e=!1){const t=o()?" · Billed as extra usage":"";return{value:n().opus47+"[1m]",label:"Opus 4.7 (1M context)",description:`Opus 4.7 with 1M context${t}${D(e)}`}}export function getMaxOpus46_1MOption(e=!1){return{value:"opus[1m]",label:"Opus 4.6 (1M context)",description:`Opus 4.6 with 1M context${o()?" · Billed as extra usage":""}${D(e)}`}}function getMergedOpus1MOption(e=!1){const o="firstParty"!==c();return{value:n().opus47+"[1m]",label:"Opus (1M context)",description:`Opus 4.7 with 1M context · Most capable for complex work${!o&&e?D(e):""}`,descriptionForModel:"Opus 4.7 with 1M context - most capable for complex work"}}const k={value:"sonnet",label:"Sonnet",description:"Sonnet 4.6 · Best for everyday tasks"},U={value:"haiku",label:"Haiku",description:"Haiku 4.5 · Fastest for quick answers"};function getModelOptionsBase(e=!1){if("ant"===process.env.USER_TYPE){const o=A().map(e=>({value:e.alias,label:e.label,description:e.description??`[ANT-ONLY] ${e.label} (${e.model})`}));return[getDefaultOptionForUser(),...o,getMergedOpus1MOption(e),getSonnet46Option(),getSonnet46_1MOption(),getHaiku45Option()]}if("openai"===c())return[getDefaultOptionForUser(e),{value:"gpt-5.5",label:"GPT-5.5",description:"gpt-5.5 - Modelo flagship para razonamiento, coding y agentes",descriptionForModel:"gpt-5.5 - flagship model for complex reasoning, coding, and agentic work"},{value:"gpt-5.5-pro",label:"GPT-5.5 Pro",description:"gpt-5.5-pro - Mayor precision para tareas dificiles",descriptionForModel:"gpt-5.5-pro - higher-accuracy model for harder tasks"},{value:"gpt-5.4",label:"GPT-5.4",description:"gpt-5.4 - Modelo principal recomendado",descriptionForModel:"gpt-5.4 - recommended flagship model"},{value:"gpt-5.2-codex",label:"GPT-5.2-Codex",description:"gpt-5.2-codex - Codex moderno para programacion",descriptionForModel:"gpt-5.2-codex - modern Codex model"},{value:"gpt-5.1-codex-max",label:"GPT-5.1-Codex-Max",description:"gpt-5.1-codex-max - Codex de maxima capacidad",descriptionForModel:"gpt-5.1-codex-max - highest-capacity Codex model"},{value:"gpt-5.4-mini",label:"GPT-5.4-Mini",description:"gpt-5.4-mini - Variante ligera y rapida",descriptionForModel:"gpt-5.4-mini - fast lightweight model"},{value:"gpt-5.3-codex",label:"GPT-5.3-Codex",description:"gpt-5.3-codex - Codex frontier anterior",descriptionForModel:"gpt-5.3-codex - previous frontier Codex model"},{value:"gpt-5.2",label:"GPT-5.2",description:"gpt-5.2 - Modelo general estable",descriptionForModel:"gpt-5.2 - stable general-purpose model"},{value:"gpt-5.1-codex-mini",label:"GPT-5.1-Codex-Mini",description:"gpt-5.1-codex-mini - Codex mini de compatibilidad",descriptionForModel:"gpt-5.1-codex-mini - compatibility Codex mini model"}];if("openrouter"===c())return[getDefaultOptionForUser(e)];if(C())return[getDefaultOptionForUser(e),{value:v(),label:"Gemini 3.5 Pro",description:"gemini-3.5-pro - Modelo Gemini principal para razonamiento, codigo y agentes",descriptionForModel:"gemini-3.5-pro - flagship Gemini model"},{value:h(),label:"Gemini 3.5 Flash",description:"gemini-3.5-flash - Variante Gemini rapida para tareas multimodales y de codigo",descriptionForModel:"gemini-3.5-flash - fast Gemini model"},{value:"gemini-3.5-flash-lite",label:"Gemini 3.5 Flash-Lite",description:"gemini-3.5-flash-lite - Variante de bajo costo y baja latencia",descriptionForModel:"gemini-3.5-flash-lite - fast low-cost Gemini model"},{value:"gemini-3.1-pro-preview",label:"Gemini 3.1 Pro Preview",description:"gemini-3.1-pro-preview - Version anterior de Pro",descriptionForModel:"gemini-3.1-pro-preview - previous Pro preview model"},{value:"gemini-3-flash-preview",label:"Gemini 3 Flash Preview",description:"gemini-3-flash-preview - Version anterior de Flash",descriptionForModel:"gemini-3-flash-preview - previous Flash preview model"},{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro",description:"gemini-2.5-pro - Modelo estable para razonamiento y codigo",descriptionForModel:"gemini-2.5-pro - stable Gemini model"},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash",description:"gemini-2.5-flash - Modelo estable rapido",descriptionForModel:"gemini-2.5-flash - stable fast Gemini model"}];if("ollama"===c()||"ollama-cloud"===c()||"zai"===c()||"minimax"===c()||"deepseek"===c())return[getDefaultOptionForUser(e)];if(o()){if(t()||i()){const o=[getDefaultOptionForUser(e)];return o.push(getMaxOpus47Option(e)),!w()&&u()&&o.push(getMaxOpus47_1MOption(e)),o.push(getMaxOpusOption(e)),!w()&&u()&&o.push(getMaxOpus46_1MOption(e)),o.push(k),d()&&o.push(getMaxSonnet46_1MOption()),o.push(U),o}const o=[getDefaultOptionForUser(e)];return o.push(k),d()&&o.push(getMaxSonnet46_1MOption()),o.push(getMaxOpus47Option(e)),u()&&o.push(getMaxOpus47_1MOption(e)),o.push(getMaxOpusOption(e)),u()&&o.push(getMaxOpus46_1MOption(e)),o.push(U),o}if("firstParty"===c()){const o=[getDefaultOptionForUser(e)];return o.push(getSonnet46Option()),d()&&o.push(getSonnet46_1MOption()),o.push(getOpus47Option(e)),u()&&o.push(getOpus47_1MOption(e)),o.push(getOpus46Option(e)),u()&&o.push(getOpus46_1MOption(e)),o.push(getHaiku45Option()),o}const n=[getDefaultOptionForUser(e)],s=function(){const e="firstParty"!==c(),o=process.env.ANTHROPIC_DEFAULT_SONNET_MODEL;if(e&&o){const e=N(o);return{value:"sonnet",label:process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_NAME??o,description:process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION??"Custom Sonnet model"+(e?" (1M context)":""),descriptionForModel:`${process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION??"Custom Sonnet model"+(e?" with 1M context":"")} (${o})`}}}();void 0!==s?n.push(s):(n.push(getSonnet46Option()),d()&&n.push(getSonnet46_1MOption()));const r=function(){const e="firstParty"!==c(),o=process.env.ANTHROPIC_DEFAULT_OPUS_MODEL;if(e&&o){const e=N(o);return{value:"opus",label:process.env.ANTHROPIC_DEFAULT_OPUS_MODEL_NAME??o,description:process.env.ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION??"Custom Opus model"+(e?" (1M context)":""),descriptionForModel:`${process.env.ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION??"Custom Opus model"+(e?" with 1M context":"")} (${o})`}}}();void 0!==r?n.push(r):(n.push(getOpus47Option(e)),u()&&n.push(getOpus47_1MOption(e)),n.push(getOpus46Option(e)),u()&&n.push(getOpus46_1MOption(e)),n.push({value:"opus",label:"Opus 4.1",description:"Opus 4.1 · Legacy",descriptionForModel:"Opus 4.1 - legacy version"}));const l=function(){const e="firstParty"!==c(),o=process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL;if(e&&o)return{value:"haiku",label:process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME??o,description:process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION??"Custom Haiku model",descriptionForModel:`${process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION??"Custom Haiku model"} (${o})`}}();return void 0!==l?n.push(l):n.push(getHaikuOption()),n}function getKnownModelOption(e){const o=F(e);if(!o)return null;const t=function(e){const o=m(e);if(o.includes("claude-sonnet-4-6")||o.includes("claude-sonnet-4-5")||o.includes("claude-sonnet-4-")||o.includes("claude-3-7-sonnet")||o.includes("claude-3-5-sonnet")){const e=F(x());if(e)return{alias:"Sonnet",currentVersionName:e}}if(o.includes("claude-opus-4")){const e=F(_());if(e)return{alias:"Opus",currentVersionName:e}}if(o.includes("claude-haiku")||o.includes("claude-3-5-haiku")){const e=F(b());if(e)return{alias:"Haiku",currentVersionName:e}}return null}(e);return t&&o!==t.currentVersionName?{value:e,label:o,description:`Newer version available · select ${t.alias} for ${t.currentVersionName}`}:{value:e,label:o,description:e}}export function getModelOptions(o=!1){const t=getModelOptionsBase(o),i=process.env.ANTHROPIC_CUSTOM_MODEL_OPTION;i&&!t.some(e=>e.value===i)&&t.push({value:i,label:process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME??i,description:process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION??`Custom model (${i})`});for(const e of y().additionalModelOptionsCache??[])t.some(o=>o.value===e.value)||t.push(e);let n=null;const s=T(),r=e();if(null!=s?n=s:null!==r&&(n=r),null===n||t.some(e=>e.value===n))return filterModelOptionsByAllowlist(t);if("opusplan"===n)return filterModelOptionsByAllowlist([...t,{value:"opusplan",label:"Opus Plan Mode",description:"Use Opus 4.7 in plan mode, Sonnet 4.6 otherwise"}]);if("opus"===n&&"firstParty"===c())return filterModelOptionsByAllowlist([...t,getMaxOpusOption(o)]);if("opus[1m]"===n&&"firstParty"===c())return filterModelOptionsByAllowlist([...t,getMergedOpus1MOption(o)]);{const e=getKnownModelOption(n);return e?t.push(e):t.push({value:n,label:n,description:"Custom model"}),filterModelOptionsByAllowlist(t)}}function filterModelOptionsByAllowlist(e){return(a()||{}).availableModels?e.filter(e=>null===e.value||null!==e.value&&O(e.value)):e}
@@ -1 +1 @@
1
- import{clearModelStrings as t,getModelStrings as r,setModelStrings as e}from"src/bootstrap/state.js";import{logError as o}from"../log.js";import{sequential as n}from"../sequential.js";import{getInitialSettings as s}from"../settings/settings.js";import{findFirstMatch as i,getBedrockInferenceProfiles as c}from"./bedrock.js";import{ALL_MODEL_CONFIGS as l,CANONICAL_ID_TO_KEY as a}from"./configs.js";import{getAPIProvider as d}from"./providers.js";const f=Object.keys(l);function getBuiltinModelStrings(t){const r={};for(const e of f)r[e]=l[e][t];return r}function applyModelOverrides(t){const r=s().modelOverrides;if(!r)return t;const e={...t};for(const[t,o]of Object.entries(r)){const r=a[t];r&&o&&(e[r]=o)}return e}export function resolveOverriddenModel(t){let r;try{r=s().modelOverrides}catch{return t}if(!r)return t;for(const[e,o]of Object.entries(r))if(o===t)return e;return t}const u=n(async()=>{if(null===r())try{const t=await async function(){const t=getBuiltinModelStrings("bedrock");let r;try{r=await c()}catch(r){return o(r),t}if(!r?.length)return t;const e={};for(const o of f){const n=l[o].firstParty;e[o]=i(r,n)||t[o]}return e}();e(t)}catch(t){o(t)}});export function getModelStrings(){const t=r();return null===t?(null===r()&&("bedrock"===d()?u():e(getBuiltinModelStrings(d()))),applyModelOverrides(getBuiltinModelStrings(d()))):applyModelOverrides(t)}export async function ensureModelStringsInitialized(){null===r()&&("bedrock"===d()?await u():e(getBuiltinModelStrings(d())))}export function resetModelStringsForProviderChange(){t(),u.cache?.clear?.()}
1
+ import{clearModelStrings as t,getModelStrings as r,setModelStrings as e}from"../../bootstrap/state.js";import{logError as o}from"../log.js";import{sequential as n}from"../sequential.js";import{getInitialSettings as i}from"../settings/settings.js";import{findFirstMatch as s,getBedrockInferenceProfiles as c}from"./bedrock.js";import{ALL_MODEL_CONFIGS as l,CANONICAL_ID_TO_KEY as d}from"./configs.js";import{getAPIProvider as f}from"./providers.js";const u=Object.keys(l);function getBuiltinModelStrings(t){const r={};for(const e of u)r[e]=l[e][t];return r}function applyModelOverrides(t){const r=i().modelOverrides;if(!r)return t;const e={...t};for(const[t,o]of Object.entries(r)){const r=d[t];r&&o&&(e[r]=o)}return e}export function resolveOverriddenModel(t){let r;try{r=i().modelOverrides}catch{return t}if(!r)return t;for(const[e,o]of Object.entries(r))if(o===t)return e;return t}const a=n(async()=>{if(null===r())try{const t=await async function(){const t=getBuiltinModelStrings("bedrock");let r;try{r=await c()}catch(r){return o(r),t}if(!r?.length)return t;const e={};for(const o of u){const n=l[o].firstParty;e[o]=s(r,n)||t[o]}return e}();e(t)}catch(t){o(t)}});export function getModelStrings(){const t=r();return null===t?(null===r()&&("bedrock"===f()?a():e(getBuiltinModelStrings(f()))),applyModelOverrides(getBuiltinModelStrings(f()))):applyModelOverrides(t)}export async function ensureModelStringsInitialized(){null===r()&&("bedrock"===f()?await a():e(getBuiltinModelStrings(f())))}export function resetModelStringsForProviderChange(){t(),a.cache?.clear?.()}
@@ -1 +1 @@
1
- import{getGeminiGoogleAuthHeaders as e,getMiniMaxAccessToken as a,getOpenAICompatibleAccessToken as i}from"../auth.js";import{getConfiguredProviderBaseUrl as t}from"./providerBaseUrls.js";import{getResolvedProviderProfileId as r,isProfiledProvider as o}from"./providerProfiles.js";const n={"minimax-m2.7":"Modelo de razonamiento general y chat predeterminado.","minimax-m2.7-highspeed":"Version rapida de MiniMax-M2.7.","minimax-m2.5":"Modelo de razonamiento avanzado con alta capacidad.","minimax-m2.5-highspeed":"Version rapida de MiniMax-M2.5.","minimax-m2.1":"Optimizado para programacion y desarrollo.","minimax-m2.1-highspeed":"Version rapida de MiniMax-M2.1.","minimax-m2":"Capacidades agenciales y razonamiento avanzado."},l=["MiniMax-M2.7","MiniMax-M2.7-highspeed","MiniMax-M2.5","MiniMax-M2.5-highspeed","MiniMax-M2.1","MiniMax-M2.1-highspeed","MiniMax-M2"].map(e=>({value:e,label:e,description:n[e.toLowerCase()]??""})),s=[{value:"deepseek-v4-pro",label:"DeepSeek V4 Pro",description:"Familia V4 pro — razonamiento profundo y código. Contexto 1M tokens."},{value:"deepseek-v4-flash",label:"DeepSeek V4 Flash",description:"Familia V4 flash — alto volumen, baja latencia. Contexto 1M tokens."},{value:"deepseek-chat",label:"deepseek-chat",description:"Alias estable V3 (api.deepseek.com). Contexto 128k tokens."},{value:"deepseek-reasoner",label:"deepseek-reasoner",description:"Alias estable R1/V3 con chain-of-thought. Contexto 128k tokens."}],c=[{value:"gemini-3.5-pro",label:"Gemini 3.5 Pro",description:"Modelo Gemini principal para razonamiento, codigo y agentes."},{value:"gemini-3.5-flash",label:"Gemini 3.5 Flash",description:"Modelo Gemini rapido con capacidades multimodales y de codigo."},{value:"gemini-3.5-flash-lite",label:"Gemini 3.5 Flash-Lite",description:"Variante de bajo costo y baja latencia."},{value:"gemini-3.1-pro-preview",label:"Gemini 3.1 Pro Preview",description:"Version anterior de Pro."},{value:"gemini-3-flash-preview",label:"Gemini 3 Flash Preview",description:"Version anterior de Flash."},{value:"gemini-3.1-flash-lite-preview",label:"Gemini 3.1 Flash-Lite Preview",description:"Version anterior de Flash-Lite."},{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro",description:"Modelo estable para razonamiento y codigo."},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash",description:"Modelo estable rapido para alto volumen."},{value:"gemini-2.5-flash-lite",label:"Gemini 2.5 Flash-Lite",description:"Modelo estable economico y de baja latencia."}],d=new Map,u=new Map;function trimTrailingSlash(e){return e.endsWith("/")?e.slice(0,-1):e}function ensureV1Suffix(e){const a=trimTrailingSlash(e);return a.endsWith("/v1")?a:`${a}/v1`}function isLocalOllamaProviderHost(e){try{const a=new URL(e);return"localhost"===a.hostname||"127.0.0.1"===a.hostname}catch{return e.includes("localhost")||e.includes("127.0.0.1")}}function getProviderCacheKey(e){const a=getProviderBaseUrl(e);return`${e}:${(o(e)?r(e):null)??"default"}:${a}`}function getProviderLabel(e){switch(e){case"openrouter":return"OpenRouter";case"ollama":return"Ollama";case"ollama-cloud":return"Ollama Cloud";case"gemini-api":return"Gemini API";case"gemini-google":return"Gemini Google";case"zai":return"Z.AI";case"minimax":return"MiniMax";case"nvidia":return"NVIDIA NIM";case"deepseek":return"DeepSeek";default:return"OpenAI"}}function getProviderBaseUrl(e){switch(e){case"openrouter":return ensureV1Suffix(process.env.OPENROUTER_BASE_URL||t("openrouter")||"https://openrouter.ai/api/v1");case"ollama":return ensureV1Suffix(process.env.OLLAMA_BASE_URL||t("ollama")||"http://localhost:11434/v1");case"ollama-cloud":return ensureV1Suffix(process.env.OLLAMA_CLOUD_BASE_URL||process.env.OLLAMA_BASE_URL||t("ollama-cloud")||"http://localhost:11434/v1");case"zai":return trimTrailingSlash(process.env.ZAI_BASE_URL||t("zai")||"https://api.z.ai/api/coding/paas/v4");case"gemini-api":return trimTrailingSlash(process.env.GEMINI_BASE_URL||process.env.GEMINI_API_BASE_URL||t("gemini-api")||"https://generativelanguage.googleapis.com/v1beta/openai");case"gemini-google":return trimTrailingSlash(process.env.GEMINI_GOOGLE_BASE_URL||process.env.GEMINI_BASE_URL||t("gemini-google")||"https://generativelanguage.googleapis.com/v1beta/openai");case"minimax":return trimTrailingSlash(process.env.MINIMAX_BASE_URL||t("minimax")||"https://api.minimax.io/anthropic");case"nvidia":return ensureV1Suffix(process.env.NVIDIA_BASE_URL||t("nvidia")||"https://integrate.api.nvidia.com/v1");case"deepseek":return ensureV1Suffix(process.env.DEEPSEEK_BASE_URL||t("deepseek")||"https://api.deepseek.com/v1");default:return ensureV1Suffix(process.env.OPENAI_API_BASE_URL||process.env.OPENAI_BASE_URL||"https://api.openai.com/v1")}}async function buildProviderHeaders(a){if("gemini-google"===a)return e();const t={},r=i(a),o=getProviderBaseUrl(a);return"ollama"!==a&&!("ollama-cloud"===a&&isLocalOllamaProviderHost(o))&&r&&(t.Authorization=`Bearer ${r}`),"openrouter"===a&&(t["HTTP-Referer"]="https://context.iaforged.com",t["X-Title"]="Context Code"),t}function formatOpenAICompatibleDescription(e){const a=[];return e.description&&a.push(e.description),e.context_length&&a.push(`Context: ${e.context_length}`),(e.pricing?.prompt||e.pricing?.completion)&&a.push(`Price: ${e.pricing?.prompt??"?"} prompt / ${e.pricing?.completion??"?"} completion`),a.join(" · ")}function mapOpenAICompatibleModels(e,a){return(e.data??[]).map(e=>{const i=e.id?.trim();if(!i)return null;const t="minimax"===a?n[i.toLowerCase()]:void 0;return{value:i,label:e.name?.trim()||i,description:formatOpenAICompatibleDescription(e)||t||""}}).filter(e=>null!==e)}function filterOllamaModels(e,a,i){return"ollama-cloud"===e&&isLocalOllamaProviderHost(i)?a.filter(e=>e.value.toLowerCase().endsWith(":cloud")):a}async function fetchJson(e,a){const i=await fetch(e,{headers:a});if(!i.ok)throw new Error(`Failed to load models from ${e}: ${i.status}`);return i.json()}function cacheProviderHealth(e){return u.set(getProviderCacheKey(e.provider),{expiresAt:Date.now()+3e4,result:e}),e}function buildHealthResult(e,a,i,t={}){return{provider:e,label:getProviderLabel(e),state:a,message:i,baseUrl:t.baseUrl??getProviderBaseUrl(e),statusCode:t.statusCode,checkedAt:Date.now()}}async function fetchWithTimeout(e,a,i=5e3){const t=new AbortController,r=setTimeout(()=>t.abort(),i);try{return await fetch(e,{headers:a,signal:t.signal})}finally{clearTimeout(r)}}export async function checkProviderHealth(e,t={}){if(!t.forceRefresh){const a=function(e){const a=u.get(getProviderCacheKey(e));return a?a.expiresAt<Date.now()?(u.delete(getProviderCacheKey(e)),null):a.result:null}(e);if(a)return a}const r=getProviderBaseUrl(e),o=getProviderLabel(e),n="minimax"===e?{"x-api-key":a()??"",Authorization:`Bearer ${a()??""}`,"Content-Type":"application/json"}:await buildProviderHeaders(e),l="minimax"===e?a():i(e);if(!("ollama"===e||"gemini-google"===e||"ollama-cloud"===e&&isLocalOllamaProviderHost(r)||l))return cacheProviderHealth(buildHealthResult(e,"needs-setup",`${o} no tiene credenciales configuradas.`,{baseUrl:r}));try{if("minimax"===e)return cacheProviderHealth(buildHealthResult(e,"healthy",`${o} configurado para Anthropic-compatible (${r}).`,{baseUrl:r}));if("ollama"===e||"ollama-cloud"===e){const a=[`${r.endsWith("/v1")?r.slice(0,-3):r}/api/tags`,`${r}/models`];let i,t="";for(const o of a){const a=await fetchWithTimeout(o,n);if(a.ok)return cacheProviderHealth(buildHealthResult(e,"healthy",`Conectado a ${o}.`,{baseUrl:r,statusCode:a.status}));if(i=a.status,t=`${a.status} ${a.statusText}`.trim(),404!==a.status||!o.endsWith("/api/tags"))break}return cacheProviderHealth(429===i?buildHealthResult(e,"rate-limited",`${o} devolvió rate limit al validar la conexión.`,{baseUrl:r,statusCode:i}):buildHealthResult(e,"unreachable",t?`${o} no respondió correctamente (${t}).`:`${o} no respondió correctamente.`,{baseUrl:r,statusCode:i}))}const a=`${r}/models`,i=await fetchWithTimeout(a,n);return i.ok?cacheProviderHealth(buildHealthResult(e,"healthy",`Conectado a ${a}.`,{baseUrl:r,statusCode:i.status})):401===i.status||403===i.status?cacheProviderHealth(buildHealthResult(e,"needs-setup",`${o} rechazó la solicitud. Revisa la API key o token configurado.`,{baseUrl:r,statusCode:i.status})):429===i.status?cacheProviderHealth(buildHealthResult(e,"rate-limited",`${o} devolvió rate limit al validar la conexión.`,{baseUrl:r,statusCode:i.status})):cacheProviderHealth(buildHealthResult(e,"unreachable",`${o} respondió con ${i.status} al validar la conexión.`,{baseUrl:r,statusCode:i.status}))}catch(a){const i=function(e){return e instanceof Error?e.message.replace(/\s+/g," ").trim():String(e).replace(/\s+/g," ").trim()}(a);return"ollama"===e&&(i.toLowerCase().includes("econnrefused")||i.toLowerCase().includes("fetch failed")||i.toLowerCase().includes("networkerror")||i.toLowerCase().includes("localhost:11434"))?cacheProviderHealth(buildHealthResult(e,"unreachable","Ollama no es accesible. Inicia el servidor local o revisa OLLAMA_BASE_URL.",{baseUrl:r})):i.includes("401")||i.includes("403")||i.toLowerCase().includes("authentication")?cacheProviderHealth(buildHealthResult(e,"needs-setup",`${o} no tiene credenciales válidas.`,{baseUrl:r})):i.includes("429")||i.toLowerCase().includes("rate limit")?cacheProviderHealth(buildHealthResult(e,"rate-limited",`${o} devolvió rate limit al validar la conexión.`,{baseUrl:r})):cacheProviderHealth(buildHealthResult(e,"unreachable",`${o} no pudo validarse: ${i||"error desconocido"}.`,{baseUrl:r}))}}export function getCachedProviderModels(e){return d.get(getProviderCacheKey(e))??null}export async function fetchProviderModels(e){const a=getProviderCacheKey(e),i=d.get(a);if(i)return i;try{if("minimax"===e)return d.set(a,l),l;if("deepseek"===e)return d.set(a,s),s;let i=[];if("ollama"===e||"ollama-cloud"===e){const a=getProviderBaseUrl(e),t=a.endsWith("/v1")?a.slice(0,-3):a;try{i=filterOllamaModels(e,function(e){return(e.models??[]).map(e=>{const a=e.model?.trim()||e.name?.trim();if(!a)return null;const i=[e.details?.family,e.details?.parameter_size,e.details?.quantization_level].filter(Boolean);return{value:a,label:e.name?.trim()||a,description:i.join(" · ")}}).filter(e=>null!==e)}(await fetchJson(`${t}/api/tags`,await buildProviderHeaders(e))),a)}catch{i=filterOllamaModels(e,mapOpenAICompatibleModels(await fetchJson(`${a}/models`,await buildProviderHeaders(e)),e),a)}}else i=mapOpenAICompatibleModels(await fetchJson(`${getProviderBaseUrl(e)}/models`,await buildProviderHeaders(e)),e);if("gemini-api"===e||"gemini-google"===e){const e=new Set(c.map(e=>e.value));i=[...c,...i.filter(a=>!e.has(a.value))]}return d.set(a,i),i}catch{return"gemini-api"===e||"gemini-google"===e?(d.set(a,c),c):[]}}
1
+ import{getGeminiGoogleAuthHeaders as e,getMiniMaxAccessToken as a,getOpenAICompatibleAccessToken as i}from"../auth.js";import{getConfiguredProviderBaseUrl as t}from"./providerBaseUrls.js";import{getResolvedProviderProfileId as r,isProfiledProvider as o}from"./providerProfiles.js";const n={"minimax-m2.7":"Modelo de razonamiento general y chat predeterminado.","minimax-m2.7-highspeed":"Version rapida de MiniMax-M2.7.","minimax-m2.5":"Modelo de razonamiento avanzado con alta capacidad.","minimax-m2.5-highspeed":"Version rapida de MiniMax-M2.5.","minimax-m2.1":"Optimizado para programacion y desarrollo.","minimax-m2.1-highspeed":"Version rapida de MiniMax-M2.1.","minimax-m2":"Capacidades agenciales y razonamiento avanzado."},l=["MiniMax-M2.7","MiniMax-M2.7-highspeed","MiniMax-M2.5","MiniMax-M2.5-highspeed","MiniMax-M2.1","MiniMax-M2.1-highspeed","MiniMax-M2"].map(e=>({value:e,label:e,description:n[e.toLowerCase()]??""})),s=[{value:"deepseek-v4-pro",label:"DeepSeek V4 Pro",description:"Familia V4 pro — razonamiento profundo y código. Contexto 1M tokens."},{value:"deepseek-v4-flash",label:"DeepSeek V4 Flash",description:"Familia V4 flash — alto volumen, baja latencia. Contexto 1M tokens."},{value:"deepseek-chat",label:"deepseek-chat",description:"Alias estable V3 (api.deepseek.com). Contexto 128k tokens."},{value:"deepseek-reasoner",label:"deepseek-reasoner",description:"Alias estable R1/V3 con chain-of-thought. Contexto 128k tokens."}],c=[{value:"gemini-3.5-pro",label:"Gemini 3.5 Pro",description:"Modelo Gemini principal para razonamiento, codigo y agentes."},{value:"gemini-3.5-flash",label:"Gemini 3.5 Flash",description:"Modelo Gemini rapido con capacidades multimodales y de codigo."},{value:"gemini-3.5-flash-lite",label:"Gemini 3.5 Flash-Lite",description:"Variante de bajo costo y baja latencia."},{value:"gemini-3.1-pro-preview",label:"Gemini 3.1 Pro Preview",description:"Version anterior de Pro."},{value:"gemini-3-flash-preview",label:"Gemini 3 Flash Preview",description:"Version anterior de Flash."},{value:"gemini-3.1-flash-lite-preview",label:"Gemini 3.1 Flash-Lite Preview",description:"Version anterior de Flash-Lite."},{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro",description:"Modelo estable para razonamiento y codigo."},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash",description:"Modelo estable rapido para alto volumen."},{value:"gemini-2.5-flash-lite",label:"Gemini 2.5 Flash-Lite",description:"Modelo estable economico y de baja latencia."}],d=new Map,u=new Map;function trimTrailingSlash(e){return e.endsWith("/")?e.slice(0,-1):e}function ensureV1Suffix(e){const a=trimTrailingSlash(e);return a.endsWith("/v1")?a:`${a}/v1`}function isLocalOllamaProviderHost(e){try{const a=new URL(e);return"localhost"===a.hostname||"127.0.0.1"===a.hostname}catch{return e.includes("localhost")||e.includes("127.0.0.1")}}function getProviderCacheKey(e){const a=getProviderBaseUrl(e);return`${e}:${(o(e)?r(e):null)??"default"}:${a}`}function getProviderLabel(e){switch(e){case"openrouter":return"OpenRouter";case"ollama":return"Ollama";case"ollama-cloud":return"Ollama Cloud";case"gemini-api":return"Gemini API";case"gemini-google":return"Gemini Google";case"zai":return"Z.AI";case"minimax":return"MiniMax";case"nvidia":return"NVIDIA NIM";case"deepseek":return"DeepSeek";default:return"OpenAI"}}function getProviderBaseUrl(e){switch(e){case"openrouter":return ensureV1Suffix(process.env.OPENROUTER_BASE_URL||t("openrouter")||"https://openrouter.ai/api/v1");case"ollama":return ensureV1Suffix(process.env.OLLAMA_BASE_URL||t("ollama")||"http://localhost:11434/v1");case"ollama-cloud":return ensureV1Suffix(process.env.OLLAMA_CLOUD_BASE_URL||process.env.OLLAMA_BASE_URL||t("ollama-cloud")||"http://localhost:11434/v1");case"zai":return trimTrailingSlash(process.env.ZAI_BASE_URL||t("zai")||"https://api.z.ai/api/coding/paas/v4");case"gemini-api":return trimTrailingSlash(process.env.GEMINI_BASE_URL||process.env.GEMINI_API_BASE_URL||t("gemini-api")||"https://generativelanguage.googleapis.com/v1beta/openai");case"gemini-google":return trimTrailingSlash(process.env.GEMINI_GOOGLE_BASE_URL||process.env.GEMINI_BASE_URL||t("gemini-google")||"https://generativelanguage.googleapis.com/v1beta/openai");case"minimax":return trimTrailingSlash(process.env.MINIMAX_BASE_URL||t("minimax")||"https://api.minimax.io/anthropic");case"nvidia":return ensureV1Suffix(process.env.NVIDIA_BASE_URL||t("nvidia")||"https://integrate.api.nvidia.com/v1");case"deepseek":return ensureV1Suffix(process.env.DEEPSEEK_BASE_URL||t("deepseek")||"https://api.deepseek.com/v1");default:return ensureV1Suffix(process.env.OPENAI_API_BASE_URL||process.env.OPENAI_BASE_URL||"https://api.openai.com/v1")}}async function buildProviderHeaders(a){if("gemini-google"===a)return e();const t={},r=i(a),o=getProviderBaseUrl(a);return"ollama"!==a&&!("ollama-cloud"===a&&isLocalOllamaProviderHost(o))&&r&&(t.Authorization=`Bearer ${r}`),"openrouter"===a&&(t["HTTP-Referer"]="https://context.iaforged.com",t["X-Title"]="Context Code"),t}function formatOpenAICompatibleDescription(e){const a=[];return e.description&&a.push(e.description),e.context_length&&a.push(`Context: ${e.context_length}`),(e.pricing?.prompt||e.pricing?.completion)&&a.push(`Price: ${e.pricing?.prompt??"?"} prompt / ${e.pricing?.completion??"?"} completion`),a.join(" · ")}function mapOpenAICompatibleModels(e,a){return(e.data??[]).map(e=>{const i=e.id?.trim();if(!i)return null;const t="minimax"===a?n[i.toLowerCase()]:void 0;return{value:i,label:e.name?.trim()||i,description:formatOpenAICompatibleDescription(e)||t||""}}).filter(e=>null!==e)}function filterOllamaModels(e,a,i){return"ollama-cloud"===e&&isLocalOllamaProviderHost(i)?a.filter(e=>e.value.toLowerCase().endsWith(":cloud")):a}async function fetchJson(e,a){const i=await fetch(e,{headers:a});if(!i.ok)throw new Error(`Failed to load models from ${e}: ${i.status}`);return i.json()}function cacheProviderHealth(e){return u.set(getProviderCacheKey(e.provider),{expiresAt:Date.now()+3e4,result:e}),e}function buildHealthResult(e,a,i,t={}){return{provider:e,label:getProviderLabel(e),state:a,message:i,baseUrl:t.baseUrl??getProviderBaseUrl(e),statusCode:t.statusCode,checkedAt:Date.now()}}async function fetchWithTimeout(e,a,i=5e3){const t=new AbortController,r=setTimeout(()=>t.abort(),i);try{return await fetch(e,{headers:a,signal:t.signal})}finally{clearTimeout(r)}}export async function checkProviderHealth(e,t={}){if(!t.forceRefresh){const a=function(e){const a=u.get(getProviderCacheKey(e));return a?a.expiresAt<Date.now()?(u.delete(getProviderCacheKey(e)),null):a.result:null}(e);if(a)return a}const r=getProviderBaseUrl(e),o=getProviderLabel(e),n="minimax"===e?{"x-api-key":a()??"",Authorization:`Bearer ${a()??""}`,"Content-Type":"application/json"}:await buildProviderHeaders(e),l="minimax"===e?a():i(e);if(!("ollama"===e||"gemini-google"===e||"ollama-cloud"===e&&isLocalOllamaProviderHost(r)||l))return cacheProviderHealth(buildHealthResult(e,"needs-setup",`${o} no tiene credenciales configuradas.`,{baseUrl:r}));try{if("minimax"===e)return cacheProviderHealth(buildHealthResult(e,"healthy",`${o} configurado para Anthropic-compatible (${r}).`,{baseUrl:r}));if("ollama"===e||"ollama-cloud"===e){const a=[`${r.endsWith("/v1")?r.slice(0,-3):r}/api/tags`,`${r}/models`];let i,t="";for(const o of a){const a=await fetchWithTimeout(o,n);if(a.ok)return cacheProviderHealth(buildHealthResult(e,"healthy",`Conectado a ${o}.`,{baseUrl:r,statusCode:a.status}));if(i=a.status,t=`${a.status} ${a.statusText}`.trim(),404!==a.status||!o.endsWith("/api/tags"))break}return cacheProviderHealth(429===i?buildHealthResult(e,"rate-limited",`${o} devolvió rate limit al validar la conexión.`,{baseUrl:r,statusCode:i}):buildHealthResult(e,"unreachable",t?`${o} no respondió correctamente (${t}).`:`${o} no respondió correctamente.`,{baseUrl:r,statusCode:i}))}const a=`${r}/models`,i=await fetchWithTimeout(a,n);return i.ok?cacheProviderHealth(buildHealthResult(e,"healthy",`Conectado a ${a}.`,{baseUrl:r,statusCode:i.status})):401===i.status||403===i.status?cacheProviderHealth(buildHealthResult(e,"needs-setup",`${o} rechazó la solicitud. Revisa la API key o token configurado.`,{baseUrl:r,statusCode:i.status})):429===i.status?cacheProviderHealth(buildHealthResult(e,"rate-limited",`${o} devolvió rate limit al validar la conexión.`,{baseUrl:r,statusCode:i.status})):cacheProviderHealth(buildHealthResult(e,"unreachable",`${o} respondió con ${i.status} al validar la conexión.`,{baseUrl:r,statusCode:i.status}))}catch(a){const i=function(e){return e instanceof Error?e.message.replace(/\s+/g," ").trim():String(e).replace(/\s+/g," ").trim()}(a);return"ollama"===e&&(i.toLowerCase().includes("econnrefused")||i.toLowerCase().includes("fetch failed")||i.toLowerCase().includes("networkerror")||i.toLowerCase().includes("localhost:11434"))?cacheProviderHealth(buildHealthResult(e,"unreachable","Ollama no es accesible. Inicia el servidor local o revisa OLLAMA_BASE_URL.",{baseUrl:r})):i.includes("401")||i.includes("403")||i.toLowerCase().includes("authentication")?cacheProviderHealth(buildHealthResult(e,"needs-setup",`${o} no tiene credenciales válidas.`,{baseUrl:r})):i.includes("429")||i.toLowerCase().includes("rate limit")?cacheProviderHealth(buildHealthResult(e,"rate-limited",`${o} devolvió rate limit al validar la conexión.`,{baseUrl:r})):cacheProviderHealth(buildHealthResult(e,"unreachable",`${o} no pudo validarse: ${i||"error desconocido"}.`,{baseUrl:r}))}}export function getCachedProviderModels(e){return d.get(getProviderCacheKey(e))??null}export async function fetchProviderModels(e){const a=getProviderCacheKey(e),i=d.get(a);if(i)return i;try{if("minimax"===e)return d.set(a,l),l;if("deepseek"===e)return d.set(a,s),s;let i=[];if("ollama"===e||"ollama-cloud"===e){const a=getProviderBaseUrl(e),t=a.endsWith("/v1")?a.slice(0,-3):a;try{i=filterOllamaModels(e,function(e){return(e.models??[]).map(e=>{const a=e.model?.trim()||e.name?.trim();if(!a)return null;const i=[e.details?.family,e.details?.parameter_size,e.details?.quantization_level].filter(Boolean);return{value:a,label:e.name?.trim()||a,description:i.join(" · ")}}).filter(e=>null!==e)}(await fetchJson(`${t}/api/tags`,await buildProviderHeaders(e))),a)}catch{i=filterOllamaModels(e,mapOpenAICompatibleModels(await fetchJson(`${a}/models`,await buildProviderHeaders(e)),e),a)}}else{i=mapOpenAICompatibleModels(await fetchJson(`${getProviderBaseUrl(e)}/models`,await buildProviderHeaders(e)),e)}if("gemini-api"===e||"gemini-google"===e){const e=new Set(c.map(e=>e.value));i=[...c,...i.filter(a=>!e.has(a.value))]}return d.set(a,i),i}catch{return"gemini-api"===e||"gemini-google"===e?(d.set(a,c),c):[]}}
@@ -1 +1 @@
1
- import{getStoredLastModelForProvider as e,getStoredProviderBaseUrl as r,readProviderProfilesState as i,writeProviderProfilesState as o}from"./providerProfilesDb.js";const t=new Set(["claude","openai","openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","nvidia","deepseek"]),l={claude:"main",openai:"main",openrouter:"main",ollama:"local","ollama-cloud":"main","gemini-api":"main","gemini-google":"main",zai:"main",minimax:"main",nvidia:"main",deepseek:"main"},n={claude:"claude",openai:"openai",openrouter:"openrouter",ollama:"ollama-local","ollama-cloud":"ollama-cloud","gemini-api":"gemini-api","gemini-google":"gemini-google",zai:"z-ai",minimax:"minimax",nvidia:"nvidia",deepseek:"deepseek"},a={openrouter:"https://openrouter.ai/api/v1",ollama:"http://localhost:11434/v1","ollama-cloud":"http://localhost:11434/v1","gemini-api":"https://generativelanguage.googleapis.com/v1beta/openai","gemini-google":"https://generativelanguage.googleapis.com/v1beta/openai",zai:"https://api.z.ai/api/coding/paas/v4",minimax:"https://api.minimax.io/anthropic",deepseek:"https://api.deepseek.com/v1"};function sanitizeProfileSegment(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"default"}function buildProfileId(e,r){return`${e}/${sanitizeProfileSegment(r)}`}function buildDefaultAgentName(e,r){const i=n[e],o=sanitizeProfileSegment(r);return o===sanitizeProfileSegment(l[e])?i:`${i}-${o}`}export function getDefaultProfileName(e){return l[e]}export function buildProviderProfileId(e,r){return buildProfileId(e,r)}export function isDefaultProfileId(e,r){return!!r&&r===buildProfileId(e,l[e])}function getState(){const e=i();return{version:1,profiles:e.profiles??{},lastProfileIdByProvider:e.lastProfileIdByProvider??{},activeProfileId:e.activeProfileId}}function saveState(e){const r=e(getState());return o(r),r}function getProfilesMap(){return getState().profiles??{}}function getProfileSeed(i,o){return o?function(i){return{baseUrl:"openrouter"===i||"ollama"===i||"ollama-cloud"===i||"zai"===i||"minimax"===i||"deepseek"===i?r(i):void 0,lastModel:e(i)??null}}(i):{baseUrl:a[i],lastModel:null}}export function isProfiledProvider(e){return t.has(e)}export function listProviderProfiles(e){const r=Object.values(getProfilesMap());return e?r.filter(r=>r.provider===e):r}export function getProviderProfile(e){return e?getProfilesMap()[e]??null:null}export function getActiveProviderProfile(){return getProviderProfile(getState().activeProfileId)}export function getLastUsedProviderProfile(e){const r=getState(),i=r.lastProfileIdByProvider?.[e];if(i){const e=getProviderProfile(i);if(e)return e}return listProviderProfiles(e)[0]??null}export function createProviderProfile(e){const r=buildProfileId(e.provider,e.name),i=getProviderProfile(r);if(i)return i;const o=(new Date).toISOString(),t={id:r,provider:e.provider,name:e.name.trim()||l[e.provider],agentName:e.agentName?.trim()||buildDefaultAgentName(e.provider,e.name),baseUrl:e.baseUrl,lastModel:e.lastModel??null,createdAt:o,updatedAt:o};return saveState(r=>({...r,activeProfileId:e.activate?t.id:r.activeProfileId,profiles:{...r.profiles??{},[t.id]:t},lastProfileIdByProvider:{...r.lastProfileIdByProvider??{},[e.provider]:t.id}})),t}export function ensureProviderProfile(e,r=l[e]){const i=getProviderProfile(buildProfileId(e,r));return i||createProviderProfile({provider:e,name:r,...getProfileSeed(e,0===listProviderProfiles(e).length),activate:!1})}export function resolveProviderProfile(e,r={}){const i=getActiveProviderProfile();if(i?.provider===e)return i;return getLastUsedProviderProfile(e)||(r.createIfMissing?ensureProviderProfile(e):null)}export function getResolvedProviderProfileId(e){return resolveProviderProfile(e)?.id??null}export function setActiveProviderProfile(e){const r=getProviderProfile(e);return r?(saveState(e=>({...e,activeProfileId:r.id,lastProfileIdByProvider:{...e.lastProfileIdByProvider??{},[r.provider]:r.id}})),r):null}export function setActiveProfileForProvider(e,r){const i=r&&r.trim()?ensureProviderProfile(e,r):resolveProviderProfile(e,{createIfMissing:!0});return setActiveProviderProfile(i.id),i}export function findProviderProfileByName(e,r){return getProviderProfile(buildProfileId(e,r))}export function updateProviderProfile(e,r){let i=null;return saveState(o=>{const t=o.profiles?.[e];return t?(i=r(t),{...o,profiles:{...o.profiles??{},[e]:i},lastProfileIdByProvider:{...o.lastProfileIdByProvider??{},[t.provider]:e}}):o}),i}export function renameProviderProfile(e,r,i){const o=findProviderProfileByName(e,r);if(!o)return null;const t=i.trim();if(!t)throw new Error("Debes indicar un nuevo nombre de perfil.");const l=buildProfileId(e,t);if(l!==o.id&&getProviderProfile(l))throw new Error(`Ya existe un perfil ${e}/${t}.`);const n={...o,id:l,name:t,updatedAt:(new Date).toISOString()};return saveState(r=>{const i={...r.profiles??{}};delete i[o.id],i[l]=n;const t={...r.lastProfileIdByProvider??{},[e]:r.lastProfileIdByProvider?.[e]===o.id?l:r.lastProfileIdByProvider?.[e]};return{...r,activeProfileId:r.activeProfileId===o.id?l:r.activeProfileId,profiles:i,lastProfileIdByProvider:t}}),{previousId:o.id,profile:n}}export function removeProviderProfile(e,r){const i=findProviderProfileByName(e,r);return i?(saveState(r=>{const o={...r.profiles??{}};delete o[i.id];const t=Object.values(o).filter(r=>r.provider===e),l=t[0]?.id;return{...r,activeProfileId:r.activeProfileId===i.id?l:r.activeProfileId,profiles:o,lastProfileIdByProvider:{...r.lastProfileIdByProvider??{},[e]:r.lastProfileIdByProvider?.[e]===i.id?l:r.lastProfileIdByProvider?.[e]}}}),i):null}export function clearAllProviderProfiles(){const e=Object.values(getProfilesMap());return saveState(e=>({version:1,profiles:{},lastProfileIdByProvider:{}})),e}export function setProviderProfileAgentNameByName(e,r,i){const o=findProviderProfileByName(e,r);if(!o)return null;const t=sanitizeProfileSegment(i);if(!t)throw new Error("Debes indicar un agentName valido.");return updateProviderProfile(o.id,e=>({...e,agentName:t,updatedAt:(new Date).toISOString()}))}export function setProviderProfileBaseUrl(e,r){const i=resolveProviderProfile(e,{createIfMissing:!0});return updateProviderProfile(i.id,e=>({...e,baseUrl:r,updatedAt:(new Date).toISOString()}))??i}export function clearProviderProfileBaseUrl(e){const r=resolveProviderProfile(e);return r?updateProviderProfile(r.id,e=>({...e,baseUrl:void 0,updatedAt:(new Date).toISOString()})):null}export function getProviderProfileBaseUrl(e){return resolveProviderProfile(e)?.baseUrl??null}export function setProviderProfileLastModel(e,r){const i=resolveProviderProfile(e);return i?updateProviderProfile(i.id,e=>({...e,lastModel:r,updatedAt:(new Date).toISOString()})):null}export function getProviderProfileLastModel(e){return resolveProviderProfile(e)?.lastModel??null}export function setProviderProfileLastModelByName(e,r,i){const o=findProviderProfileByName(e,r);return o?updateProviderProfile(o.id,e=>({...e,lastModel:i,updatedAt:(new Date).toISOString()})):null}
1
+ import{getStoredLastModelForProvider as e,getStoredProviderBaseUrl as r,readProviderProfilesState as i,writeProviderProfilesState as o}from"./providerProfilesDb.js";const t=new Set(["claude","openai","openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","nvidia","deepseek"]),l={claude:"main",openai:"main",openrouter:"main",ollama:"local","ollama-cloud":"main","gemini-api":"main","gemini-google":"main",zai:"main",minimax:"main",nvidia:"main",deepseek:"main"},n={claude:"claude",openai:"openai",openrouter:"openrouter",ollama:"ollama-local","ollama-cloud":"ollama-cloud","gemini-api":"gemini-api","gemini-google":"gemini-google",zai:"z-ai",minimax:"minimax",nvidia:"nvidia",deepseek:"deepseek"},a={openrouter:"https://openrouter.ai/api/v1",ollama:"http://localhost:11434/v1","ollama-cloud":"http://localhost:11434/v1","gemini-api":"https://generativelanguage.googleapis.com/v1beta/openai","gemini-google":"https://generativelanguage.googleapis.com/v1beta/openai",zai:"https://api.z.ai/api/coding/paas/v4",minimax:"https://api.minimax.io/anthropic",deepseek:"https://api.deepseek.com/v1"};function sanitizeProfileSegment(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"default"}function buildProfileId(e,r){return`${e}/${sanitizeProfileSegment(r)}`}function buildDefaultAgentName(e,r){const i=n[e],o=sanitizeProfileSegment(r);return o===sanitizeProfileSegment(l[e])?i:`${i}-${o}`}export function getDefaultProfileName(e){return l[e]}export function buildProviderProfileId(e,r){return buildProfileId(e,r)}export function isDefaultProfileId(e,r){return!!r&&r===buildProfileId(e,l[e])}function getState(){const e=i();return{version:1,profiles:e.profiles??{},lastProfileIdByProvider:e.lastProfileIdByProvider??{},activeProfileId:e.activeProfileId}}function saveState(e){const r=e(getState());return o(r),r}function getProfilesMap(){return getState().profiles??{}}function getProfileSeed(i,o){return o?function(i){return{baseUrl:"openrouter"===i||"ollama"===i||"ollama-cloud"===i||"zai"===i||"minimax"===i||"deepseek"===i?r(i):void 0,lastModel:e(i)??null}}(i):{baseUrl:a[i],lastModel:null}}export function isProfiledProvider(e){return t.has(e)}export function listProviderProfiles(e){const r=Object.values(getProfilesMap());return e?r.filter(r=>r.provider===e):r}export function getProviderProfile(e){return e?getProfilesMap()[e]??null:null}export function getActiveProviderProfile(){return getProviderProfile(getState().activeProfileId)}export function getLastUsedProviderProfile(e){const r=getState(),i=r.lastProfileIdByProvider?.[e];if(i){const e=getProviderProfile(i);if(e)return e}return listProviderProfiles(e)[0]??null}export function createProviderProfile(e){const r=buildProfileId(e.provider,e.name),i=getProviderProfile(r);if(i)return i;const o=(new Date).toISOString(),t={id:r,provider:e.provider,name:e.name.trim()||l[e.provider],agentName:e.agentName?.trim()||buildDefaultAgentName(e.provider,e.name),baseUrl:e.baseUrl,lastModel:e.lastModel??null,createdAt:o,updatedAt:o};return saveState(r=>({...r,activeProfileId:e.activate?t.id:r.activeProfileId,profiles:{...r.profiles??{},[t.id]:t},lastProfileIdByProvider:{...r.lastProfileIdByProvider??{},[e.provider]:t.id}})),t}export function ensureProviderProfile(e,r=l[e]){const i=getProviderProfile(buildProfileId(e,r));if(i)return i;return createProviderProfile({provider:e,name:r,...getProfileSeed(e,0===listProviderProfiles(e).length),activate:!1})}export function resolveProviderProfile(e,r={}){const i=getActiveProviderProfile();if(i?.provider===e)return i;const o=getLastUsedProviderProfile(e);return o||(r.createIfMissing?ensureProviderProfile(e):null)}export function getResolvedProviderProfileId(e){return resolveProviderProfile(e)?.id??null}export function setActiveProviderProfile(e){const r=getProviderProfile(e);return r?(saveState(e=>({...e,activeProfileId:r.id,lastProfileIdByProvider:{...e.lastProfileIdByProvider??{},[r.provider]:r.id}})),r):null}export function setActiveProfileForProvider(e,r){const i=r&&r.trim()?ensureProviderProfile(e,r):resolveProviderProfile(e,{createIfMissing:!0});return setActiveProviderProfile(i.id),i}export function findProviderProfileByName(e,r){return getProviderProfile(buildProfileId(e,r))}export function updateProviderProfile(e,r){let i=null;return saveState(o=>{const t=o.profiles?.[e];return t?(i=r(t),{...o,profiles:{...o.profiles??{},[e]:i},lastProfileIdByProvider:{...o.lastProfileIdByProvider??{},[t.provider]:e}}):o}),i}export function renameProviderProfile(e,r,i){const o=findProviderProfileByName(e,r);if(!o)return null;const t=i.trim();if(!t)throw new Error("Debes indicar un nuevo nombre de perfil.");const l=buildProfileId(e,t);if(l!==o.id&&getProviderProfile(l))throw new Error(`Ya existe un perfil ${e}/${t}.`);const n={...o,id:l,name:t,updatedAt:(new Date).toISOString()};return saveState(r=>{const i={...r.profiles??{}};delete i[o.id],i[l]=n;const t={...r.lastProfileIdByProvider??{},[e]:r.lastProfileIdByProvider?.[e]===o.id?l:r.lastProfileIdByProvider?.[e]};return{...r,activeProfileId:r.activeProfileId===o.id?l:r.activeProfileId,profiles:i,lastProfileIdByProvider:t}}),{previousId:o.id,profile:n}}export function removeProviderProfile(e,r){const i=findProviderProfileByName(e,r);return i?(saveState(r=>{const o={...r.profiles??{}};delete o[i.id];const t=Object.values(o).filter(r=>r.provider===e),l=t[0]?.id;return{...r,activeProfileId:r.activeProfileId===i.id?l:r.activeProfileId,profiles:o,lastProfileIdByProvider:{...r.lastProfileIdByProvider??{},[e]:r.lastProfileIdByProvider?.[e]===i.id?l:r.lastProfileIdByProvider?.[e]}}}),i):null}export function clearAllProviderProfiles(){const e=Object.values(getProfilesMap());return saveState(e=>({version:1,profiles:{},lastProfileIdByProvider:{}})),e}export function setProviderProfileAgentNameByName(e,r,i){const o=findProviderProfileByName(e,r);if(!o)return null;const t=sanitizeProfileSegment(i);if(!t)throw new Error("Debes indicar un agentName valido.");return updateProviderProfile(o.id,e=>({...e,agentName:t,updatedAt:(new Date).toISOString()}))}export function setProviderProfileBaseUrl(e,r){const i=resolveProviderProfile(e,{createIfMissing:!0});return updateProviderProfile(i.id,e=>({...e,baseUrl:r,updatedAt:(new Date).toISOString()}))??i}export function clearProviderProfileBaseUrl(e){const r=resolveProviderProfile(e);return r?updateProviderProfile(r.id,e=>({...e,baseUrl:void 0,updatedAt:(new Date).toISOString()})):null}export function getProviderProfileBaseUrl(e){return resolveProviderProfile(e)?.baseUrl??null}export function setProviderProfileLastModel(e,r){const i=resolveProviderProfile(e);return i?updateProviderProfile(i.id,e=>({...e,lastModel:r,updatedAt:(new Date).toISOString()})):null}export function getProviderProfileLastModel(e){return resolveProviderProfile(e)?.lastModel??null}export function setProviderProfileLastModelByName(e,r,i){const o=findProviderProfileByName(e,r);return o?updateProviderProfile(o.id,e=>({...e,lastModel:i,updatedAt:(new Date).toISOString()})):null}
@@ -1 +1 @@
1
- import{createRequire as e}from"module";import{randomUUID as t}from"node:crypto";import{join as n}from"path";import{getGlobalConfig as i,saveGlobalConfig as a}from"../config.js";import{getClaudeConfigHomeDir as r}from"../envUtils.js";import{getFsImplementation as E}from"../fsOperations.js";const o=e(import.meta.url);let _=null,d=!1,s=!1;const T="active_provider",l="active_profile_id",N=["claude","openai","openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","deepseek"],L={claude:"main",openai:"main",openrouter:"main",ollama:"local","ollama-cloud":"main","gemini-api":"main","gemini-google":"main",zai:"main",minimax:"main",nvidia:"main",deepseek:"main"},p={claude:"claude",openai:"openai",openrouter:"openrouter",ollama:"ollama-local","ollama-cloud":"ollama-cloud","gemini-api":"gemini-api","gemini-google":"gemini-google",zai:"z-ai",minimax:"minimax",nvidia:"nvidia",deepseek:"deepseek"},c={openrouter:"https://openrouter.ai/api/v1",ollama:"http://localhost:11434/v1","ollama-cloud":"http://localhost:11434/v1","gemini-api":"https://generativelanguage.googleapis.com/v1beta/openai","gemini-google":"https://generativelanguage.googleapis.com/v1beta/openai",zai:"https://api.z.ai/api/coding/paas/v4",minimax:"https://api.minimax.io/anthropic",deepseek:"https://api.deepseek.com/v1"},u={claude:"Claude",openai:"OpenAI",openrouter:"OpenRouter",ollama:"Ollama","ollama-cloud":"Ollama Cloud","gemini-api":"Gemini API","gemini-google":"Gemini Google",zai:"Z.AI",minimax:"MiniMax",nvidia:"NVIDIA NIM",deepseek:"DeepSeek"},m=["openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","deepseek"];function sanitizeProfileSegment(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"default"}function buildProfileId(e,t){return`${e}/${sanitizeProfileSegment(t)}`}function buildDefaultAgentName(e,t){const n=p[e],i=sanitizeProfileSegment(t);return i===sanitizeProfileSegment(L[e])?n:`${n}-${i}`}function tableExists(e,t){const n=e.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(t);return Boolean(n)}function columnExists(e,t,n){return e.prepare(`PRAGMA table_info(${t})`).all().some(e=>e.name===n)}function getDatabasePath(){return n(r(),"provider-state.sqlite3")}function rowToProfile(e){if(!e)return null;const t=e;return{id:t.id,provider:t.provider,name:t.name,agentName:t.agent_name,baseUrl:t.base_url??void 0,lastModel:t.last_model,createdAt:t.created_at,updatedAt:t.updated_at}}function seedLegacyProfiles(){const e=i(),t=e.providerProfiles,n={...t&&"object"==typeof t&&t.profiles?t.profiles:{}},a={...t&&"object"==typeof t&&t.lastProfileIdByProvider?t.lastProfileIdByProvider:{}};for(const t of N){const i=Object.values(n).some(e=>e.provider===t),r=e.providerBaseUrls?.[t],E=e.lastModelByProvider?.[t]??null;if(!i&&e.activeProvider!==t&&!Boolean(r)&&null===E||i)continue;const o=L[t],_=buildProfileId(t,o),d=(new Date).toISOString();n[_]={id:_,provider:t,name:o,agentName:buildDefaultAgentName(t,o),baseUrl:r??c[t],lastModel:E,createdAt:d,updatedAt:d},a[t]=_}return{version:1,activeProfileId:(t&&"object"==typeof t?t.activeProfileId:void 0)??(e.activeProvider&&N.includes(e.activeProvider)?a[e.activeProvider]:void 0),lastProfileIdByProvider:a,profiles:n}}function migrateFromLegacyConfig(e){const t=i(),n=seedLegacyProfiles(),a=e.prepare("\n INSERT OR REPLACE INTO provider_profiles (\n id, provider, name, agent_name, base_url, last_model, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n "),r=e.prepare("\n INSERT INTO provider_last_profile (provider, profile_id)\n VALUES (?, ?)\n ON CONFLICT(provider) DO UPDATE SET profile_id = excluded.profile_id\n "),E=e.prepare("\n INSERT INTO provider_runtime_state (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n "),o=e.prepare("\n INSERT INTO provider_last_model (provider, last_model, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n last_model = excluded.last_model,\n updated_at = excluded.updated_at\n "),_=e.prepare("\n INSERT INTO provider_base_url (provider, base_url, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n base_url = excluded.base_url,\n updated_at = excluded.updated_at\n ");for(const e of Object.values(n.profiles??{}))a.run(e.id,e.provider,e.name,e.agentName,e.baseUrl??null,e.lastModel??null,e.createdAt,e.updatedAt);for(const[e,t]of Object.entries(n.lastProfileIdByProvider??{}))t&&r.run(e,t);n.activeProfileId&&E.run(l,n.activeProfileId);const d=t.activeProvider??(n.activeProfileId?n.profiles?.[n.activeProfileId]?.provider:void 0);d&&E.run(T,d);const s={claude:t.lastClaudeModel??t.lastModelByProvider?.claude??null,openai:t.lastOpenAIModel??t.lastModelByProvider?.openai??null,openrouter:t.lastOpenRouterModel??t.lastModelByProvider?.openrouter??null,ollama:t.lastModelByProvider?.ollama??null,"ollama-cloud":t.lastModelByProvider?.["ollama-cloud"]??null,"gemini-api":t.lastModelByProvider?.["gemini-api"]??null,"gemini-google":t.lastModelByProvider?.["gemini-google"]??null,zai:t.lastModelByProvider?.zai??null,minimax:t.lastModelByProvider?.minimax??null,deepseek:t.lastModelByProvider?.deepseek??null};for(const e of N)o.run(e,s[e]??null,(new Date).toISOString());for(const e of m){const n=t.providerBaseUrls?.[e];"string"==typeof n&&n.trim()&&_.run(e,n.trim(),(new Date).toISOString())}}export function purgeLegacyProviderStateInConfig(){hasLegacyProviderStateInConfig()&&a(e=>({...e,activeProvider:void 0,lastModelByProvider:{},providerBaseUrls:void 0,lastOpenAIModel:void 0,lastClaudeModel:void 0,lastOpenRouterModel:void 0,providerProfiles:void 0}))}export function finalizeProviderProfilesMigration(){ensureInitialized(),purgeLegacyProviderStateInConfig()}function ensureInitialized(){const e=function(){if(s)throw new Error("SQLite no disponible en este runtime.");if(_)return _;let e;E().mkdirSync(r(),{mode:448});try{e=o("node:sqlite")}catch(e){throw s=!0,e}return _=new e.DatabaseSync(getDatabasePath()),_}();if(d)return e;e.exec("\n PRAGMA journal_mode = WAL;\n PRAGMA foreign_keys = ON;\n PRAGMA synchronous = NORMAL;\n\n CREATE TABLE IF NOT EXISTS provider_profiles (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL,\n name TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n base_url TEXT NULL,\n last_model TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_last_profile (\n provider TEXT PRIMARY KEY,\n profile_id TEXT NOT NULL,\n FOREIGN KEY (profile_id) REFERENCES provider_profiles(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS provider_runtime_state (\n key TEXT PRIMARY KEY,\n value TEXT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_last_model (\n provider TEXT PRIMARY KEY,\n last_model TEXT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_base_url (\n provider TEXT PRIMARY KEY,\n base_url TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_workspaces (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL UNIQUE,\n display_name TEXT NOT NULL,\n domain_focus TEXT NULL,\n is_enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_agents (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL,\n profile_id TEXT NOT NULL,\n name TEXT NOT NULL,\n role_kind TEXT NULL,\n system_prompt TEXT NULL,\n model_override TEXT NULL,\n tool_policy TEXT NULL,\n autonomy_level TEXT NULL,\n is_orchestrator INTEGER NOT NULL DEFAULT 0,\n is_enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (workspace_id) REFERENCES provider_workspaces(id) ON DELETE CASCADE,\n FOREIGN KEY (profile_id) REFERENCES provider_profiles(id) ON DELETE CASCADE,\n UNIQUE (workspace_id, name)\n );\n\n CREATE INDEX IF NOT EXISTS idx_provider_agents_workspace_id\n ON provider_agents(workspace_id);\n CREATE INDEX IF NOT EXISTS idx_provider_agents_profile_id\n ON provider_agents(profile_id);\n\n CREATE TABLE IF NOT EXISTS provider_agent_capabilities (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n capability TEXT NOT NULL,\n weight REAL NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (agent_id, capability)\n );\n\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capabilities_agent_id\n ON provider_agent_capabilities(agent_id);\n\n CREATE TABLE IF NOT EXISTS teams (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n description TEXT NULL,\n global_orchestrator_agent_id TEXT NULL,\n is_enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (global_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE TABLE IF NOT EXISTS team_units (\n id TEXT PRIMARY KEY,\n team_id TEXT NOT NULL,\n unit_name TEXT NOT NULL,\n workspace_id TEXT NULL,\n local_orchestrator_agent_id TEXT NULL,\n lead_agent_id TEXT NULL,\n selection_mode TEXT NOT NULL DEFAULT 'manual',\n required INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,\n FOREIGN KEY (workspace_id) REFERENCES provider_workspaces(id) ON DELETE SET NULL,\n FOREIGN KEY (local_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n FOREIGN KEY (lead_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n UNIQUE (team_id, unit_name)\n );\n\n CREATE INDEX IF NOT EXISTS idx_team_units_team_id\n ON team_units(team_id);\n CREATE INDEX IF NOT EXISTS idx_team_units_workspace_id\n ON team_units(workspace_id);\n CREATE INDEX IF NOT EXISTS idx_team_units_local_orchestrator_agent_id\n ON team_units(local_orchestrator_agent_id);\n CREATE INDEX IF NOT EXISTS idx_team_units_lead_agent_id\n ON team_units(lead_agent_id);\n\n CREATE TABLE IF NOT EXISTS team_unit_members (\n id TEXT PRIMARY KEY,\n team_unit_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n duty TEXT NULL,\n priority INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (team_unit_id, agent_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_team_unit_members_team_unit_id\n ON team_unit_members(team_unit_id);\n CREATE INDEX IF NOT EXISTS idx_team_unit_members_agent_id\n ON team_unit_members(agent_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_runs (\n id TEXT PRIMARY KEY,\n team_id TEXT NOT NULL,\n goal TEXT NOT NULL,\n global_orchestrator_agent_id TEXT NULL,\n status TEXT NOT NULL,\n created_at TEXT NOT NULL,\n started_at TEXT NULL,\n finished_at TEXT NULL,\n FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,\n FOREIGN KEY (global_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_runs_team_id\n ON orchestration_runs(team_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_runs_status\n ON orchestration_runs(status);\n\n CREATE TABLE IF NOT EXISTS orchestration_tasks (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n parent_task_id TEXT NULL,\n scope_type TEXT NOT NULL,\n team_unit_id TEXT NULL,\n assigned_agent_id TEXT NULL,\n title TEXT NOT NULL,\n instructions TEXT NOT NULL,\n status TEXT NOT NULL,\n result_summary TEXT NULL,\n created_at TEXT NOT NULL,\n finished_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (parent_task_id) REFERENCES orchestration_tasks(id) ON DELETE SET NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE SET NULL,\n FOREIGN KEY (assigned_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_run_id\n ON orchestration_tasks(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_assigned_agent_id\n ON orchestration_tasks(assigned_agent_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_messages (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n task_id TEXT NULL,\n from_agent_id TEXT NULL,\n to_agent_id TEXT NULL,\n message_type TEXT NOT NULL,\n content TEXT NOT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (task_id) REFERENCES orchestration_tasks(id) ON DELETE SET NULL,\n FOREIGN KEY (from_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n FOREIGN KEY (to_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_messages_run_id\n ON orchestration_messages(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_messages_task_id\n ON orchestration_messages(task_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_task_results (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n task_id TEXT NOT NULL,\n agent_id TEXT NULL,\n result_type TEXT NOT NULL,\n status TEXT NOT NULL,\n summary TEXT NULL,\n content TEXT NULL,\n metadata_json TEXT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (task_id) REFERENCES orchestration_tasks(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_task_results_run_id\n ON orchestration_task_results(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_task_results_task_id\n ON orchestration_task_results(task_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_task_results_agent_id\n ON orchestration_task_results(agent_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_team_reports (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n team_unit_id TEXT NOT NULL,\n local_orchestrator_agent_id TEXT NULL,\n status TEXT NOT NULL,\n summary TEXT NOT NULL,\n blockers TEXT NULL,\n output TEXT NULL,\n metrics_json TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n submitted_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (local_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n UNIQUE (run_id, team_unit_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_team_reports_run_id\n ON orchestration_team_reports(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_team_reports_team_unit_id\n ON orchestration_team_reports(team_unit_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_run_reports (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL UNIQUE,\n status TEXT NOT NULL,\n summary TEXT NOT NULL,\n output TEXT NULL,\n risks TEXT NULL,\n next_steps TEXT NULL,\n metrics_json TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n submitted_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_run_reports_run_id\n ON orchestration_run_reports(run_id);\n\n CREATE TABLE IF NOT EXISTS provider_agent_capability_rankings (\n id TEXT PRIMARY KEY,\n team_unit_id TEXT NULL,\n capability TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n score REAL NOT NULL DEFAULT 0,\n reason TEXT NULL,\n source TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (team_unit_id, capability, agent_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_capability\n ON provider_agent_capability_rankings(capability);\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_agent\n ON provider_agent_capability_rankings(agent_id);\n\n CREATE TABLE IF NOT EXISTS secure_storage (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS projects (\n path TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS permission_rules (\n id TEXT PRIMARY KEY,\n scope TEXT NOT NULL,\n scope_path TEXT NULL,\n tool_name TEXT NOT NULL,\n behavior TEXT NOT NULL,\n created_at TEXT NOT NULL,\n expires_at TEXT NULL,\n UNIQUE (scope, scope_path, tool_name)\n );\n\n CREATE INDEX IF NOT EXISTS idx_permission_rules_scope\n ON permission_rules(scope, scope_path);\n CREATE INDEX IF NOT EXISTS idx_permission_rules_tool_name\n ON permission_rules(tool_name);\n\n CREATE TABLE IF NOT EXISTS permission_mode_config (\n id TEXT PRIMARY KEY,\n scope TEXT NOT NULL,\n scope_path TEXT NULL,\n mode TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE (scope, scope_path)\n );\n\n CREATE TABLE IF NOT EXISTS trusted_directories (\n path TEXT PRIMARY KEY,\n trust_level TEXT NOT NULL DEFAULT 'full',\n created_at TEXT NOT NULL\n );\n "),function(e){e.exec("PRAGMA foreign_keys = OFF;");try{tableExists(e,"team_domains")&&e.exec("\n INSERT OR IGNORE INTO team_units (\n id, team_id, unit_name, workspace_id, local_orchestrator_agent_id, lead_agent_id, selection_mode, required, created_at, updated_at\n )\n SELECT id, team_id, domain_name, workspace_id, local_orchestrator_agent_id, lead_agent_id, selection_mode, required, created_at, updated_at\n FROM team_domains;\n "),tableExists(e,"team_domain_members")&&e.exec("\n INSERT OR IGNORE INTO team_unit_members (\n id, team_unit_id, agent_id, duty, priority, created_at, updated_at\n )\n SELECT id, team_domain_id, agent_id, duty, priority, created_at, updated_at\n FROM team_domain_members;\n "),tableExists(e,"orchestration_tasks")&&!columnExists(e,"orchestration_tasks","team_unit_id")&&e.exec("ALTER TABLE orchestration_tasks ADD COLUMN team_unit_id TEXT NULL;"),tableExists(e,"orchestration_tasks")&&columnExists(e,"orchestration_tasks","team_domain_id")&&columnExists(e,"orchestration_tasks","team_unit_id")&&e.exec("\n UPDATE orchestration_tasks\n SET team_unit_id = team_domain_id\n WHERE team_unit_id IS NULL AND team_domain_id IS NOT NULL;\n "),function(e){tableExists(e,"orchestration_tasks")&&columnExists(e,"orchestration_tasks","team_domain_id")&&e.exec("\n CREATE TABLE IF NOT EXISTS orchestration_tasks_v8 (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n parent_task_id TEXT NULL,\n scope_type TEXT NOT NULL,\n team_unit_id TEXT NULL,\n assigned_agent_id TEXT NULL,\n title TEXT NOT NULL,\n instructions TEXT NOT NULL,\n status TEXT NOT NULL,\n result_summary TEXT NULL,\n created_at TEXT NOT NULL,\n finished_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (parent_task_id) REFERENCES orchestration_tasks_v8(id) ON DELETE SET NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE SET NULL,\n FOREIGN KEY (assigned_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n INSERT OR REPLACE INTO orchestration_tasks_v8 (\n id, run_id, parent_task_id, scope_type, team_unit_id, assigned_agent_id, title, instructions, status, result_summary, created_at, finished_at\n )\n SELECT id, run_id, parent_task_id, scope_type, team_unit_id, assigned_agent_id, title, instructions, status, result_summary, created_at, finished_at\n FROM orchestration_tasks;\n\n DROP TABLE orchestration_tasks;\n ALTER TABLE orchestration_tasks_v8 RENAME TO orchestration_tasks;\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_run_id\n ON orchestration_tasks(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_team_unit_id\n ON orchestration_tasks(team_unit_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_assigned_agent_id\n ON orchestration_tasks(assigned_agent_id);\n ")}(e),tableExists(e,"orchestration_domain_reports")&&e.exec("\n INSERT OR IGNORE INTO orchestration_team_reports (\n id, run_id, team_unit_id, local_orchestrator_agent_id, status, summary, blockers, output, metrics_json, created_at, updated_at, submitted_at\n )\n SELECT id, run_id, team_domain_id, local_orchestrator_agent_id, status, summary, blockers, output, metrics_json, created_at, updated_at, submitted_at\n FROM orchestration_domain_reports;\n "),tableExists(e,"provider_agent_capability_rankings")&&!columnExists(e,"provider_agent_capability_rankings","team_unit_id")&&e.exec("ALTER TABLE provider_agent_capability_rankings ADD COLUMN team_unit_id TEXT NULL;"),tableExists(e,"provider_agent_capability_rankings")&&columnExists(e,"provider_agent_capability_rankings","team_domain_id")&&columnExists(e,"provider_agent_capability_rankings","team_unit_id")&&e.exec("\n UPDATE provider_agent_capability_rankings\n SET team_unit_id = team_domain_id\n WHERE team_unit_id IS NULL AND team_domain_id IS NOT NULL;\n "),function(e){tableExists(e,"provider_agent_capability_rankings")&&columnExists(e,"provider_agent_capability_rankings","team_domain_id")&&e.exec("\n CREATE TABLE IF NOT EXISTS provider_agent_capability_rankings_v8 (\n id TEXT PRIMARY KEY,\n team_unit_id TEXT NULL,\n capability TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n score REAL NOT NULL DEFAULT 0,\n reason TEXT NULL,\n source TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (team_unit_id, capability, agent_id)\n );\n\n INSERT OR REPLACE INTO provider_agent_capability_rankings_v8 (\n id, team_unit_id, capability, agent_id, score, reason, source, created_at, updated_at\n )\n SELECT id, team_unit_id, capability, agent_id, score, reason, source, created_at, updated_at\n FROM provider_agent_capability_rankings;\n\n DROP TABLE provider_agent_capability_rankings;\n ALTER TABLE provider_agent_capability_rankings_v8 RENAME TO provider_agent_capability_rankings;\n\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_team_unit\n ON provider_agent_capability_rankings(team_unit_id);\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_capability\n ON provider_agent_capability_rankings(capability);\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_agent\n ON provider_agent_capability_rankings(agent_id);\n ")}(e),e.exec("\n DROP TABLE IF EXISTS orchestration_domain_reports;\n DROP TABLE IF EXISTS team_domain_members;\n DROP TABLE IF EXISTS team_domains;\n ")}finally{e.exec("PRAGMA foreign_keys = ON;")}tableExists(e,"orchestration_tasks")&&columnExists(e,"orchestration_tasks","team_unit_id")&&e.exec("\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_team_unit_id\n ON orchestration_tasks(team_unit_id);\n "),tableExists(e,"provider_agent_capability_rankings")&&columnExists(e,"provider_agent_capability_rankings","team_unit_id")&&e.exec("\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_team_unit\n ON provider_agent_capability_rankings(team_unit_id);\n ")}(e);const n=e.prepare("PRAGMA user_version").get();(n?.user_version??0)<8&&e.exec("PRAGMA user_version = 8"),function(e){const n=(new Date).toISOString(),i=e.prepare("\n INSERT OR IGNORE INTO provider_workspaces (\n id, provider, display_name, domain_focus, is_enabled, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n ");for(const e of N)i.run(t(),e,u[e],null,1,n,n)}(e);const i=e.prepare("SELECT COUNT(*) AS count FROM provider_profiles").get();if(0===(i?.count??0))migrateFromLegacyConfig(e);else{const t=e.prepare("SELECT COUNT(*) AS count FROM provider_last_model").get();0===(t?.count??0)&&migrateFromLegacyConfig(e);const n=e.prepare("SELECT COUNT(*) AS count FROM provider_base_url").get();0===(n?.count??0)&&migrateFromLegacyConfig(e)}return purgeLegacyProviderStateInConfig(),d=!0,e}export class ProviderProfilesDb{static instance=null;db;constructor(){this.db=ensureInitialized()}static async get(){return ProviderProfilesDb.instance||(ProviderProfilesDb.instance=new ProviderProfilesDb),ProviderProfilesDb.instance}}export function getProviderProfilesDbPath(){return getDatabasePath()}export function getProviderProfilesStorageBackend(){try{return ensureInitialized(),"sqlite"}catch{return"legacy"}}export function hasLegacyProviderStateInConfig(){try{const e=i();return Boolean(e.activeProvider||e.lastClaudeModel||e.lastOpenAIModel||e.lastOpenRouterModel||Object.keys(e.lastModelByProvider??{}).length>0||Object.keys(e.providerBaseUrls??{}).length>0||e.providerProfiles?.activeProfileId||Object.keys(e.providerProfiles?.profiles??{}).length>0||Object.keys(e.providerProfiles?.lastProfileIdByProvider??{}).length>0)}catch{return!1}}export function getProviderProfilesStorageMode(){return"sqlite"!==getProviderProfilesStorageBackend()?"legacy":hasLegacyProviderStateInConfig()?"sqlite-migration-pending":"sqlite-only"}export function readProviderProfilesState(){let e;try{e=ensureInitialized()}catch{return seedLegacyProfiles()}const t=e.prepare("SELECT id, provider, name, agent_name, base_url, last_model, created_at, updated_at\n FROM provider_profiles\n ORDER BY provider, created_at, id").all().map(rowToProfile).filter(e=>null!==e),n=e.prepare("SELECT provider, profile_id FROM provider_last_profile").all(),i=e.prepare(`SELECT value FROM provider_runtime_state WHERE key = '${l}'`).get();return{version:1,activeProfileId:i?.value,lastProfileIdByProvider:Object.fromEntries(n.map(e=>[e.provider,e.profile_id])),profiles:Object.fromEntries(t.map(e=>[e.id,e]))}}export function writeProviderProfilesState(e){let t;try{t=ensureInitialized()}catch{return}const n=Object.values(e.profiles??{}),i=0===n.length;t.exec("BEGIN");try{t.exec("DELETE FROM provider_last_profile"),t.exec(`DELETE FROM provider_runtime_state WHERE key = '${l}'`),t.exec("DELETE FROM provider_profiles"),i&&(t.exec(`DELETE FROM provider_runtime_state WHERE key = '${T}'`),t.exec("DELETE FROM provider_last_model"),t.exec("DELETE FROM provider_base_url"));const a=t.prepare("\n INSERT INTO provider_profiles (\n id, provider, name, agent_name, base_url, last_model, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ");for(const e of n)a.run(e.id,e.provider,e.name,e.agentName,e.baseUrl??null,e.lastModel??null,e.createdAt,e.updatedAt);const r=t.prepare("\n INSERT INTO provider_last_profile (provider, profile_id)\n VALUES (?, ?)\n ");for(const[t,n]of Object.entries(e.lastProfileIdByProvider??{}))n&&r.run(t,n);e.activeProfileId&&t.prepare(`\n INSERT INTO provider_runtime_state (key, value)\n VALUES ('${l}', ?)\n `).run(e.activeProfileId),t.exec("COMMIT")}catch(e){throw t.exec("ROLLBACK"),e}}export function getStoredActiveProviderPreference(){const e=function(e){try{const t=ensureInitialized().prepare("SELECT value FROM provider_runtime_state WHERE key = ?").get(e);return t?.value??null}catch{return null}}(T);return null!==e?e:null}export function setStoredActiveProviderPreference(e){!function(e,t){try{const n=ensureInitialized();if(null===t)return void n.prepare("DELETE FROM provider_runtime_state WHERE key = ?").run(e);n.prepare("\n INSERT INTO provider_runtime_state (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n ").run(e,t)}catch{}}(T,e)}export function getStoredLastModelForProvider(e){try{const t=ensureInitialized().prepare("SELECT last_model FROM provider_last_model WHERE provider = ?").get(e);if(t&&Object.prototype.hasOwnProperty.call(t,"last_model"))return t.last_model??null}catch{return}}export function setStoredLastModelForProvider(e,t){!function(e,t){try{ensureInitialized().prepare("\n INSERT INTO provider_last_model (provider, last_model, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n last_model = excluded.last_model,\n updated_at = excluded.updated_at\n ").run(e,t,(new Date).toISOString())}catch{}}(e,t)}export function getStoredProviderBaseUrl(e){try{const t=ensureInitialized().prepare("SELECT base_url FROM provider_base_url WHERE provider = ?").get(e);if(t?.base_url?.trim())return t.base_url.trim()}catch{return}}export function setStoredProviderBaseUrl(e,t){try{ensureInitialized().prepare("\n INSERT INTO provider_base_url (provider, base_url, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n base_url = excluded.base_url,\n updated_at = excluded.updated_at\n ").run(e,t,(new Date).toISOString())}catch{}}export function clearStoredProviderBaseUrl(e){try{ensureInitialized().prepare("DELETE FROM provider_base_url WHERE provider = ?").run(e)}catch{}}
1
+ import{createRequire as e}from"module";import{randomUUID as t}from"node:crypto";import{join as n}from"path";import{getGlobalConfig as i,saveGlobalConfig as a}from"../config.js";import{getClaudeConfigHomeDir as r}from"../envUtils.js";import{getFsImplementation as E}from"../fsOperations.js";const o=e(import.meta.url);let _=null,d=!1,s=!1;const T="active_provider",l="active_profile_id",N=["claude","openai","openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","deepseek"],L={claude:"main",openai:"main",openrouter:"main",ollama:"local","ollama-cloud":"main","gemini-api":"main","gemini-google":"main",zai:"main",minimax:"main",nvidia:"main",deepseek:"main"},p={claude:"claude",openai:"openai",openrouter:"openrouter",ollama:"ollama-local","ollama-cloud":"ollama-cloud","gemini-api":"gemini-api","gemini-google":"gemini-google",zai:"z-ai",minimax:"minimax",nvidia:"nvidia",deepseek:"deepseek"},c={openrouter:"https://openrouter.ai/api/v1",ollama:"http://localhost:11434/v1","ollama-cloud":"http://localhost:11434/v1","gemini-api":"https://generativelanguage.googleapis.com/v1beta/openai","gemini-google":"https://generativelanguage.googleapis.com/v1beta/openai",zai:"https://api.z.ai/api/coding/paas/v4",minimax:"https://api.minimax.io/anthropic",deepseek:"https://api.deepseek.com/v1"},u={claude:"Claude",openai:"OpenAI",openrouter:"OpenRouter",ollama:"Ollama","ollama-cloud":"Ollama Cloud","gemini-api":"Gemini API","gemini-google":"Gemini Google",zai:"Z.AI",minimax:"MiniMax",nvidia:"NVIDIA NIM",deepseek:"DeepSeek"},m=["openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","deepseek"];function sanitizeProfileSegment(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"default"}function buildProfileId(e,t){return`${e}/${sanitizeProfileSegment(t)}`}function buildDefaultAgentName(e,t){const n=p[e],i=sanitizeProfileSegment(t);return i===sanitizeProfileSegment(L[e])?n:`${n}-${i}`}function tableExists(e,t){const n=e.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(t);return Boolean(n)}function columnExists(e,t,n){return e.prepare(`PRAGMA table_info(${t})`).all().some(e=>e.name===n)}function migrateTeamUnitsSchema(e){e.exec("PRAGMA foreign_keys = OFF;");try{tableExists(e,"team_domains")&&e.exec("\n INSERT OR IGNORE INTO team_units (\n id, team_id, unit_name, workspace_id, local_orchestrator_agent_id, lead_agent_id, selection_mode, required, created_at, updated_at\n )\n SELECT id, team_id, domain_name, workspace_id, local_orchestrator_agent_id, lead_agent_id, selection_mode, required, created_at, updated_at\n FROM team_domains;\n "),tableExists(e,"team_domain_members")&&e.exec("\n INSERT OR IGNORE INTO team_unit_members (\n id, team_unit_id, agent_id, duty, priority, created_at, updated_at\n )\n SELECT id, team_domain_id, agent_id, duty, priority, created_at, updated_at\n FROM team_domain_members;\n "),tableExists(e,"orchestration_tasks")&&!columnExists(e,"orchestration_tasks","team_unit_id")&&e.exec("ALTER TABLE orchestration_tasks ADD COLUMN team_unit_id TEXT NULL;"),tableExists(e,"orchestration_tasks")&&columnExists(e,"orchestration_tasks","team_domain_id")&&columnExists(e,"orchestration_tasks","team_unit_id")&&e.exec("\n UPDATE orchestration_tasks\n SET team_unit_id = team_domain_id\n WHERE team_unit_id IS NULL AND team_domain_id IS NOT NULL;\n "),function(e){tableExists(e,"orchestration_tasks")&&columnExists(e,"orchestration_tasks","team_domain_id")&&e.exec("\n CREATE TABLE IF NOT EXISTS orchestration_tasks_v8 (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n parent_task_id TEXT NULL,\n scope_type TEXT NOT NULL,\n team_unit_id TEXT NULL,\n assigned_agent_id TEXT NULL,\n title TEXT NOT NULL,\n instructions TEXT NOT NULL,\n status TEXT NOT NULL,\n result_summary TEXT NULL,\n created_at TEXT NOT NULL,\n finished_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (parent_task_id) REFERENCES orchestration_tasks_v8(id) ON DELETE SET NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE SET NULL,\n FOREIGN KEY (assigned_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n INSERT OR REPLACE INTO orchestration_tasks_v8 (\n id, run_id, parent_task_id, scope_type, team_unit_id, assigned_agent_id, title, instructions, status, result_summary, created_at, finished_at\n )\n SELECT id, run_id, parent_task_id, scope_type, team_unit_id, assigned_agent_id, title, instructions, status, result_summary, created_at, finished_at\n FROM orchestration_tasks;\n\n DROP TABLE orchestration_tasks;\n ALTER TABLE orchestration_tasks_v8 RENAME TO orchestration_tasks;\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_run_id\n ON orchestration_tasks(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_team_unit_id\n ON orchestration_tasks(team_unit_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_assigned_agent_id\n ON orchestration_tasks(assigned_agent_id);\n ")}(e),tableExists(e,"orchestration_domain_reports")&&e.exec("\n INSERT OR IGNORE INTO orchestration_team_reports (\n id, run_id, team_unit_id, local_orchestrator_agent_id, status, summary, blockers, output, metrics_json, created_at, updated_at, submitted_at\n )\n SELECT id, run_id, team_domain_id, local_orchestrator_agent_id, status, summary, blockers, output, metrics_json, created_at, updated_at, submitted_at\n FROM orchestration_domain_reports;\n "),tableExists(e,"provider_agent_capability_rankings")&&!columnExists(e,"provider_agent_capability_rankings","team_unit_id")&&e.exec("ALTER TABLE provider_agent_capability_rankings ADD COLUMN team_unit_id TEXT NULL;"),tableExists(e,"provider_agent_capability_rankings")&&columnExists(e,"provider_agent_capability_rankings","team_domain_id")&&columnExists(e,"provider_agent_capability_rankings","team_unit_id")&&e.exec("\n UPDATE provider_agent_capability_rankings\n SET team_unit_id = team_domain_id\n WHERE team_unit_id IS NULL AND team_domain_id IS NOT NULL;\n "),function(e){tableExists(e,"provider_agent_capability_rankings")&&columnExists(e,"provider_agent_capability_rankings","team_domain_id")&&e.exec("\n CREATE TABLE IF NOT EXISTS provider_agent_capability_rankings_v8 (\n id TEXT PRIMARY KEY,\n team_unit_id TEXT NULL,\n capability TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n score REAL NOT NULL DEFAULT 0,\n reason TEXT NULL,\n source TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (team_unit_id, capability, agent_id)\n );\n\n INSERT OR REPLACE INTO provider_agent_capability_rankings_v8 (\n id, team_unit_id, capability, agent_id, score, reason, source, created_at, updated_at\n )\n SELECT id, team_unit_id, capability, agent_id, score, reason, source, created_at, updated_at\n FROM provider_agent_capability_rankings;\n\n DROP TABLE provider_agent_capability_rankings;\n ALTER TABLE provider_agent_capability_rankings_v8 RENAME TO provider_agent_capability_rankings;\n\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_team_unit\n ON provider_agent_capability_rankings(team_unit_id);\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_capability\n ON provider_agent_capability_rankings(capability);\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_agent\n ON provider_agent_capability_rankings(agent_id);\n ")}(e),e.exec("\n DROP TABLE IF EXISTS orchestration_domain_reports;\n DROP TABLE IF EXISTS team_domain_members;\n DROP TABLE IF EXISTS team_domains;\n ")}finally{e.exec("PRAGMA foreign_keys = ON;")}tableExists(e,"orchestration_tasks")&&columnExists(e,"orchestration_tasks","team_unit_id")&&e.exec("\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_team_unit_id\n ON orchestration_tasks(team_unit_id);\n "),tableExists(e,"provider_agent_capability_rankings")&&columnExists(e,"provider_agent_capability_rankings","team_unit_id")&&e.exec("\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_team_unit\n ON provider_agent_capability_rankings(team_unit_id);\n ")}function getDatabasePath(){return n(r(),"provider-state.sqlite3")}function rowToProfile(e){if(!e)return null;const t=e;return{id:t.id,provider:t.provider,name:t.name,agentName:t.agent_name,baseUrl:t.base_url??void 0,lastModel:t.last_model,createdAt:t.created_at,updatedAt:t.updated_at}}function seedLegacyProfiles(){const e=i(),t=e.providerProfiles,n={...t&&"object"==typeof t&&t.profiles?t.profiles:{}},a={...t&&"object"==typeof t&&t.lastProfileIdByProvider?t.lastProfileIdByProvider:{}};for(const t of N){const i=Object.values(n).some(e=>e.provider===t),r=e.providerBaseUrls?.[t],E=e.lastModelByProvider?.[t]??null;if(!(i||e.activeProvider===t||Boolean(r)||null!==E)||i)continue;const o=L[t],_=buildProfileId(t,o),d=(new Date).toISOString();n[_]={id:_,provider:t,name:o,agentName:buildDefaultAgentName(t,o),baseUrl:r??c[t],lastModel:E,createdAt:d,updatedAt:d},a[t]=_}return{version:1,activeProfileId:(t&&"object"==typeof t?t.activeProfileId:void 0)??(e.activeProvider&&N.includes(e.activeProvider)?a[e.activeProvider]:void 0),lastProfileIdByProvider:a,profiles:n}}function migrateFromLegacyConfig(e){const t=i(),n=seedLegacyProfiles(),a=e.prepare("\n INSERT OR REPLACE INTO provider_profiles (\n id, provider, name, agent_name, base_url, last_model, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n "),r=e.prepare("\n INSERT INTO provider_last_profile (provider, profile_id)\n VALUES (?, ?)\n ON CONFLICT(provider) DO UPDATE SET profile_id = excluded.profile_id\n "),E=e.prepare("\n INSERT INTO provider_runtime_state (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n "),o=e.prepare("\n INSERT INTO provider_last_model (provider, last_model, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n last_model = excluded.last_model,\n updated_at = excluded.updated_at\n "),_=e.prepare("\n INSERT INTO provider_base_url (provider, base_url, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n base_url = excluded.base_url,\n updated_at = excluded.updated_at\n ");for(const e of Object.values(n.profiles??{}))a.run(e.id,e.provider,e.name,e.agentName,e.baseUrl??null,e.lastModel??null,e.createdAt,e.updatedAt);for(const[e,t]of Object.entries(n.lastProfileIdByProvider??{}))t&&r.run(e,t);n.activeProfileId&&E.run(l,n.activeProfileId);const d=t.activeProvider??(n.activeProfileId?n.profiles?.[n.activeProfileId]?.provider:void 0);d&&E.run(T,d);const s={claude:t.lastClaudeModel??t.lastModelByProvider?.claude??null,openai:t.lastOpenAIModel??t.lastModelByProvider?.openai??null,openrouter:t.lastOpenRouterModel??t.lastModelByProvider?.openrouter??null,ollama:t.lastModelByProvider?.ollama??null,"ollama-cloud":t.lastModelByProvider?.["ollama-cloud"]??null,"gemini-api":t.lastModelByProvider?.["gemini-api"]??null,"gemini-google":t.lastModelByProvider?.["gemini-google"]??null,zai:t.lastModelByProvider?.zai??null,minimax:t.lastModelByProvider?.minimax??null,deepseek:t.lastModelByProvider?.deepseek??null};for(const e of N)o.run(e,s[e]??null,(new Date).toISOString());for(const e of m){const n=t.providerBaseUrls?.[e];"string"==typeof n&&n.trim()&&_.run(e,n.trim(),(new Date).toISOString())}}export function purgeLegacyProviderStateInConfig(){hasLegacyProviderStateInConfig()&&a(e=>({...e,activeProvider:void 0,lastModelByProvider:{},providerBaseUrls:void 0,lastOpenAIModel:void 0,lastClaudeModel:void 0,lastOpenRouterModel:void 0,providerProfiles:void 0}))}export function finalizeProviderProfilesMigration(){ensureInitialized(),purgeLegacyProviderStateInConfig()}function ensureInitialized(){const e=function(){if(s)throw new Error("SQLite no disponible en este runtime.");if(_)return _;let e;E().mkdirSync(r(),{mode:448});try{e=o("node:sqlite")}catch(e){throw s=!0,e}return _=new e.DatabaseSync(getDatabasePath()),_}();if(d)return e;e.exec("\n PRAGMA journal_mode = WAL;\n PRAGMA foreign_keys = ON;\n PRAGMA synchronous = NORMAL;\n\n CREATE TABLE IF NOT EXISTS provider_profiles (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL,\n name TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n base_url TEXT NULL,\n last_model TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_last_profile (\n provider TEXT PRIMARY KEY,\n profile_id TEXT NOT NULL,\n FOREIGN KEY (profile_id) REFERENCES provider_profiles(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS provider_runtime_state (\n key TEXT PRIMARY KEY,\n value TEXT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_last_model (\n provider TEXT PRIMARY KEY,\n last_model TEXT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_base_url (\n provider TEXT PRIMARY KEY,\n base_url TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_workspaces (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL UNIQUE,\n display_name TEXT NOT NULL,\n domain_focus TEXT NULL,\n is_enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_agents (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL,\n profile_id TEXT NOT NULL,\n name TEXT NOT NULL,\n role_kind TEXT NULL,\n system_prompt TEXT NULL,\n model_override TEXT NULL,\n tool_policy TEXT NULL,\n autonomy_level TEXT NULL,\n is_orchestrator INTEGER NOT NULL DEFAULT 0,\n is_enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (workspace_id) REFERENCES provider_workspaces(id) ON DELETE CASCADE,\n FOREIGN KEY (profile_id) REFERENCES provider_profiles(id) ON DELETE CASCADE,\n UNIQUE (workspace_id, name)\n );\n\n CREATE INDEX IF NOT EXISTS idx_provider_agents_workspace_id\n ON provider_agents(workspace_id);\n CREATE INDEX IF NOT EXISTS idx_provider_agents_profile_id\n ON provider_agents(profile_id);\n\n CREATE TABLE IF NOT EXISTS provider_agent_capabilities (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n capability TEXT NOT NULL,\n weight REAL NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (agent_id, capability)\n );\n\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capabilities_agent_id\n ON provider_agent_capabilities(agent_id);\n\n CREATE TABLE IF NOT EXISTS teams (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n description TEXT NULL,\n global_orchestrator_agent_id TEXT NULL,\n is_enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (global_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE TABLE IF NOT EXISTS team_units (\n id TEXT PRIMARY KEY,\n team_id TEXT NOT NULL,\n unit_name TEXT NOT NULL,\n workspace_id TEXT NULL,\n local_orchestrator_agent_id TEXT NULL,\n lead_agent_id TEXT NULL,\n selection_mode TEXT NOT NULL DEFAULT 'manual',\n required INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,\n FOREIGN KEY (workspace_id) REFERENCES provider_workspaces(id) ON DELETE SET NULL,\n FOREIGN KEY (local_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n FOREIGN KEY (lead_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n UNIQUE (team_id, unit_name)\n );\n\n CREATE INDEX IF NOT EXISTS idx_team_units_team_id\n ON team_units(team_id);\n CREATE INDEX IF NOT EXISTS idx_team_units_workspace_id\n ON team_units(workspace_id);\n CREATE INDEX IF NOT EXISTS idx_team_units_local_orchestrator_agent_id\n ON team_units(local_orchestrator_agent_id);\n CREATE INDEX IF NOT EXISTS idx_team_units_lead_agent_id\n ON team_units(lead_agent_id);\n\n CREATE TABLE IF NOT EXISTS team_unit_members (\n id TEXT PRIMARY KEY,\n team_unit_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n duty TEXT NULL,\n priority INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (team_unit_id, agent_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_team_unit_members_team_unit_id\n ON team_unit_members(team_unit_id);\n CREATE INDEX IF NOT EXISTS idx_team_unit_members_agent_id\n ON team_unit_members(agent_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_runs (\n id TEXT PRIMARY KEY,\n team_id TEXT NOT NULL,\n goal TEXT NOT NULL,\n global_orchestrator_agent_id TEXT NULL,\n status TEXT NOT NULL,\n created_at TEXT NOT NULL,\n started_at TEXT NULL,\n finished_at TEXT NULL,\n FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,\n FOREIGN KEY (global_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_runs_team_id\n ON orchestration_runs(team_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_runs_status\n ON orchestration_runs(status);\n\n CREATE TABLE IF NOT EXISTS orchestration_tasks (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n parent_task_id TEXT NULL,\n scope_type TEXT NOT NULL,\n team_unit_id TEXT NULL,\n assigned_agent_id TEXT NULL,\n title TEXT NOT NULL,\n instructions TEXT NOT NULL,\n status TEXT NOT NULL,\n result_summary TEXT NULL,\n created_at TEXT NOT NULL,\n finished_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (parent_task_id) REFERENCES orchestration_tasks(id) ON DELETE SET NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE SET NULL,\n FOREIGN KEY (assigned_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_run_id\n ON orchestration_tasks(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_assigned_agent_id\n ON orchestration_tasks(assigned_agent_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_messages (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n task_id TEXT NULL,\n from_agent_id TEXT NULL,\n to_agent_id TEXT NULL,\n message_type TEXT NOT NULL,\n content TEXT NOT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (task_id) REFERENCES orchestration_tasks(id) ON DELETE SET NULL,\n FOREIGN KEY (from_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n FOREIGN KEY (to_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_messages_run_id\n ON orchestration_messages(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_messages_task_id\n ON orchestration_messages(task_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_task_results (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n task_id TEXT NOT NULL,\n agent_id TEXT NULL,\n result_type TEXT NOT NULL,\n status TEXT NOT NULL,\n summary TEXT NULL,\n content TEXT NULL,\n metadata_json TEXT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (task_id) REFERENCES orchestration_tasks(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_task_results_run_id\n ON orchestration_task_results(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_task_results_task_id\n ON orchestration_task_results(task_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_task_results_agent_id\n ON orchestration_task_results(agent_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_team_reports (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n team_unit_id TEXT NOT NULL,\n local_orchestrator_agent_id TEXT NULL,\n status TEXT NOT NULL,\n summary TEXT NOT NULL,\n blockers TEXT NULL,\n output TEXT NULL,\n metrics_json TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n submitted_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (local_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n UNIQUE (run_id, team_unit_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_team_reports_run_id\n ON orchestration_team_reports(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_team_reports_team_unit_id\n ON orchestration_team_reports(team_unit_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_run_reports (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL UNIQUE,\n status TEXT NOT NULL,\n summary TEXT NOT NULL,\n output TEXT NULL,\n risks TEXT NULL,\n next_steps TEXT NULL,\n metrics_json TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n submitted_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_run_reports_run_id\n ON orchestration_run_reports(run_id);\n\n CREATE TABLE IF NOT EXISTS provider_agent_capability_rankings (\n id TEXT PRIMARY KEY,\n team_unit_id TEXT NULL,\n capability TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n score REAL NOT NULL DEFAULT 0,\n reason TEXT NULL,\n source TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (team_unit_id, capability, agent_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_capability\n ON provider_agent_capability_rankings(capability);\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_agent\n ON provider_agent_capability_rankings(agent_id);\n\n CREATE TABLE IF NOT EXISTS secure_storage (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS projects (\n path TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS permission_rules (\n id TEXT PRIMARY KEY,\n scope TEXT NOT NULL,\n scope_path TEXT NULL,\n tool_name TEXT NOT NULL,\n behavior TEXT NOT NULL,\n created_at TEXT NOT NULL,\n expires_at TEXT NULL,\n UNIQUE (scope, scope_path, tool_name)\n );\n\n CREATE INDEX IF NOT EXISTS idx_permission_rules_scope\n ON permission_rules(scope, scope_path);\n CREATE INDEX IF NOT EXISTS idx_permission_rules_tool_name\n ON permission_rules(tool_name);\n\n CREATE TABLE IF NOT EXISTS permission_mode_config (\n id TEXT PRIMARY KEY,\n scope TEXT NOT NULL,\n scope_path TEXT NULL,\n mode TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE (scope, scope_path)\n );\n\n CREATE TABLE IF NOT EXISTS trusted_directories (\n path TEXT PRIMARY KEY,\n trust_level TEXT NOT NULL DEFAULT 'full',\n created_at TEXT NOT NULL\n );\n "),migrateTeamUnitsSchema(e);const n=e.prepare("PRAGMA user_version").get();(n?.user_version??0)<8&&e.exec("PRAGMA user_version = 8"),function(e){const n=(new Date).toISOString(),i=e.prepare("\n INSERT OR IGNORE INTO provider_workspaces (\n id, provider, display_name, domain_focus, is_enabled, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n ");for(const e of N)i.run(t(),e,u[e],null,1,n,n)}(e);const i=e.prepare("SELECT COUNT(*) AS count FROM provider_profiles").get();if(0===(i?.count??0))migrateFromLegacyConfig(e);else{const t=e.prepare("SELECT COUNT(*) AS count FROM provider_last_model").get();0===(t?.count??0)&&migrateFromLegacyConfig(e);const n=e.prepare("SELECT COUNT(*) AS count FROM provider_base_url").get();0===(n?.count??0)&&migrateFromLegacyConfig(e)}return purgeLegacyProviderStateInConfig(),d=!0,e}export class ProviderProfilesDb{static instance=null;db;constructor(){this.db=ensureInitialized()}static async get(){return ProviderProfilesDb.instance||(ProviderProfilesDb.instance=new ProviderProfilesDb),ProviderProfilesDb.instance}}export function getProviderProfilesDbPath(){return getDatabasePath()}export function getProviderProfilesStorageBackend(){try{return ensureInitialized(),"sqlite"}catch{return"legacy"}}export function hasLegacyProviderStateInConfig(){try{const e=i();return Boolean(e.activeProvider||e.lastClaudeModel||e.lastOpenAIModel||e.lastOpenRouterModel||Object.keys(e.lastModelByProvider??{}).length>0||Object.keys(e.providerBaseUrls??{}).length>0||e.providerProfiles?.activeProfileId||Object.keys(e.providerProfiles?.profiles??{}).length>0||Object.keys(e.providerProfiles?.lastProfileIdByProvider??{}).length>0)}catch{return!1}}export function getProviderProfilesStorageMode(){return"sqlite"!==getProviderProfilesStorageBackend()?"legacy":hasLegacyProviderStateInConfig()?"sqlite-migration-pending":"sqlite-only"}export function readProviderProfilesState(){let e;try{e=ensureInitialized()}catch{return seedLegacyProfiles()}const t=e.prepare("SELECT id, provider, name, agent_name, base_url, last_model, created_at, updated_at\n FROM provider_profiles\n ORDER BY provider, created_at, id").all().map(rowToProfile).filter(e=>null!==e),n=e.prepare("SELECT provider, profile_id FROM provider_last_profile").all(),i=e.prepare(`SELECT value FROM provider_runtime_state WHERE key = '${l}'`).get();return{version:1,activeProfileId:i?.value,lastProfileIdByProvider:Object.fromEntries(n.map(e=>[e.provider,e.profile_id])),profiles:Object.fromEntries(t.map(e=>[e.id,e]))}}export function writeProviderProfilesState(e){let t;try{t=ensureInitialized()}catch{return}const n=Object.values(e.profiles??{}),i=0===n.length;t.exec("BEGIN");try{t.exec("DELETE FROM provider_last_profile"),t.exec(`DELETE FROM provider_runtime_state WHERE key = '${l}'`),t.exec("DELETE FROM provider_profiles"),i&&(t.exec(`DELETE FROM provider_runtime_state WHERE key = '${T}'`),t.exec("DELETE FROM provider_last_model"),t.exec("DELETE FROM provider_base_url"));const a=t.prepare("\n INSERT INTO provider_profiles (\n id, provider, name, agent_name, base_url, last_model, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ");for(const e of n)a.run(e.id,e.provider,e.name,e.agentName,e.baseUrl??null,e.lastModel??null,e.createdAt,e.updatedAt);const r=t.prepare("\n INSERT INTO provider_last_profile (provider, profile_id)\n VALUES (?, ?)\n ");for(const[t,n]of Object.entries(e.lastProfileIdByProvider??{}))n&&r.run(t,n);e.activeProfileId&&t.prepare(`\n INSERT INTO provider_runtime_state (key, value)\n VALUES ('${l}', ?)\n `).run(e.activeProfileId),t.exec("COMMIT")}catch(e){throw t.exec("ROLLBACK"),e}}export function getStoredActiveProviderPreference(){const e=function(e){try{const t=ensureInitialized().prepare("SELECT value FROM provider_runtime_state WHERE key = ?").get(e);return t?.value??null}catch{return null}}(T);return null!==e?e:null}export function setStoredActiveProviderPreference(e){!function(e,t){try{const n=ensureInitialized();if(null===t)return void n.prepare("DELETE FROM provider_runtime_state WHERE key = ?").run(e);n.prepare("\n INSERT INTO provider_runtime_state (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n ").run(e,t)}catch{}}(T,e)}export function getStoredLastModelForProvider(e){try{const t=ensureInitialized().prepare("SELECT last_model FROM provider_last_model WHERE provider = ?").get(e);if(t&&Object.prototype.hasOwnProperty.call(t,"last_model"))return t.last_model??null}catch{return}}export function setStoredLastModelForProvider(e,t){!function(e,t){try{ensureInitialized().prepare("\n INSERT INTO provider_last_model (provider, last_model, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n last_model = excluded.last_model,\n updated_at = excluded.updated_at\n ").run(e,t,(new Date).toISOString())}catch{}}(e,t)}export function getStoredProviderBaseUrl(e){try{const t=ensureInitialized().prepare("SELECT base_url FROM provider_base_url WHERE provider = ?").get(e);if(t?.base_url?.trim())return t.base_url.trim()}catch{return}}export function setStoredProviderBaseUrl(e,t){try{ensureInitialized().prepare("\n INSERT INTO provider_base_url (provider, base_url, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n base_url = excluded.base_url,\n updated_at = excluded.updated_at\n ").run(e,t,(new Date).toISOString())}catch{}}export function clearStoredProviderBaseUrl(e){try{ensureInitialized().prepare("DELETE FROM provider_base_url WHERE provider = ?").run(e)}catch{}}
@@ -1 +1 @@
1
- import{resetModelCapabilityOverridesForProviderChange as r}from"./modelSupportOverrides.js";import{resetModelStringsForProviderChange as e}from"./modelStrings.js";import{getStoredLastModelForProvider as o,setStoredActiveProviderPreference as i,setStoredLastModelForProvider as t}from"./providerProfilesDb.js";import{getProviderProfileLastModel as d,isProfiledProvider as a,setActiveProfileForProvider as n,setProviderProfileLastModel as l}from"./providerProfiles.js";export function toProviderPreference(r){return"openai"===r?"openai":"openrouter"===r?"openrouter":"ollama"===r?"ollama":"ollama-cloud"===r?"ollama-cloud":"gemini-api"===r?"gemini-api":"zai"===r?"zai":"minimax"===r?"minimax":"nvidia"===r?"nvidia":"deepseek"===r?"deepseek":"claude"}export function getStoredModelForProvider(r){if(a(r)){const e=d(r);if(null!==e)return e}const e=o(r);return void 0!==e?e:null}export function switchProviderPreference(o){const d="claude"===o.currentProvider||"openai"===o.currentProvider||"openrouter"===o.currentProvider||"ollama"===o.currentProvider||"ollama-cloud"===o.currentProvider||"gemini-google"===o.currentProvider||"zai"===o.currentProvider||"minimax"===o.currentProvider||"nvidia"===o.currentProvider||"deepseek"===o.currentProvider?o.currentProvider:toProviderPreference(o.currentProvider);return a(d)&&l(d,o.currentModel),t(d,o.currentModel),a(o.targetProvider)&&n(o.targetProvider,o.targetProfileName??void 0),i(o.targetProvider),d!==o.targetProvider&&(e(),r()),getStoredModelForProvider(o.targetProvider)}
1
+ import{resetModelCapabilityOverridesForProviderChange as r}from"./modelSupportOverrides.js";import{resetModelStringsForProviderChange as e}from"./modelStrings.js";import{getStoredLastModelForProvider as o,setStoredActiveProviderPreference as i,setStoredLastModelForProvider as t}from"./providerProfilesDb.js";import{getProviderProfileLastModel as n,isProfiledProvider as d,setActiveProfileForProvider as a,setProviderProfileLastModel as u}from"./providerProfiles.js";export function toProviderPreference(r){return"openai"===r?"openai":"openrouter"===r?"openrouter":"ollama"===r?"ollama":"ollama-cloud"===r?"ollama-cloud":"gemini-api"===r?"gemini-api":"zai"===r?"zai":"minimax"===r?"minimax":"nvidia"===r?"nvidia":"deepseek"===r?"deepseek":"claude"}export function getStoredModelForProvider(r){if(d(r)){const e=n(r);if(null!==e)return e}const e=o(r);return void 0!==e?e:null}export function switchProviderPreference(o){const n="claude"===o.currentProvider||"openai"===o.currentProvider||"openrouter"===o.currentProvider||"ollama"===o.currentProvider||"ollama-cloud"===o.currentProvider||"gemini-google"===o.currentProvider||"zai"===o.currentProvider||"minimax"===o.currentProvider||"nvidia"===o.currentProvider||"deepseek"===o.currentProvider?o.currentProvider:toProviderPreference(o.currentProvider);return d(n)&&u(n,o.currentModel),t(n,o.currentModel),d(o.targetProvider)&&a(o.targetProvider,o.targetProfileName??void 0),i(o.targetProvider),n!==o.targetProvider&&(e(),r()),getStoredModelForProvider(o.targetProvider)}
@@ -1 +1 @@
1
- import{isEnvTruthy as e}from"../envUtils.js";import{getSecureStorage as r}from"../secureStorage/index.js";import{isProviderBaseUrlCustomized as o}from"./providerBaseUrls.js";import{getProviderOverride as i}from"./providerOverrideContext.js";import{getStoredActiveProviderPreference as n}from"./providerProfilesDb.js";import{listProviderProfiles as t}from"./providerProfiles.js";export function providerPreferenceToApiProvider(e){if(e)return"claude"===e?"firstParty":e}export function isOpenAIProviderConfigured(){return e(process.env.CLAUDE_CODE_USE_OPENAI)||Boolean(process.env.OPENAI_API_KEY)||Boolean(process.env.OPENAI_API_TOKEN)||Boolean(process.env.OPENAI_OAUTH_TOKEN)||function(){try{const e=r().read(),o=Object.entries(e?.providerProfileOauth??{}).some(([e,r])=>e.startsWith("openai/")&&"object"==typeof r&&null!==r&&"string"==typeof r.accessToken&&r.accessToken.trim());return Boolean(o||e?.openAiOauth?.accessToken)}catch{return!1}}()}export function isOpenRouterProviderConfigured(){try{const e=r().read(),o=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("openrouter/")&&"string"==typeof r&&r.trim());return Boolean(process.env.OPENROUTER_API_KEY||process.env.OPENROUTER_API_TOKEN||e?.providerApiKeys?.openrouter||o)}catch{return Boolean(process.env.OPENROUTER_API_KEY||process.env.OPENROUTER_API_TOKEN)}}export function isOllamaProviderConfigured(){try{const e=n();return Boolean(process.env.OLLAMA_BASE_URL||o("ollama")||t("ollama").length>0||"ollama"===e)}catch{return Boolean(process.env.OLLAMA_BASE_URL)}}export function isOllamaCloudProviderConfigured(){if(isOllamaProviderConfigured())return!0;try{const e=r().read(),i=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("ollama-cloud/")&&"string"==typeof r&&r.trim()),t=n();return Boolean(process.env.OLLAMA_CLOUD_BASE_URL||process.env.OLLAMA_BASE_URL||process.env.OLLAMA_API_KEY||e?.providerApiKeys?.["ollama-cloud"]||i||o("ollama-cloud")||"ollama-cloud"===t||"ollama"===t)}catch{return Boolean(process.env.OLLAMA_CLOUD_BASE_URL||process.env.OLLAMA_BASE_URL||process.env.OLLAMA_API_KEY)}}export function isGeminiApiProviderConfigured(){try{const e=r().read(),o=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("gemini-api/")&&"string"==typeof r&&r.trim());return Boolean(process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY||e?.providerApiKeys?.["gemini-api"]||o)}catch{return Boolean(process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY)}}export function isGeminiGoogleProviderConfigured(){try{const e=n();return Boolean(process.env.GEMINI_OAUTH_TOKEN||process.env.GOOGLE_OAUTH_ACCESS_TOKEN||process.env.GOOGLE_APPLICATION_CREDENTIALS||process.env.GEMINI_GOOGLE_PROJECT_ID||process.env.GOOGLE_CLOUD_PROJECT||process.env.GCLOUD_PROJECT||Object.entries(storage?.providerProfileOauth??{}).some(([e,r])=>e.startsWith("gemini-google/")&&"object"==typeof r&&null!==r&&"string"==typeof r.accessToken&&r.accessToken.trim())||"gemini-google"===e)}catch{return Boolean(process.env.GEMINI_OAUTH_TOKEN||process.env.GOOGLE_OAUTH_ACCESS_TOKEN||process.env.GOOGLE_APPLICATION_CREDENTIALS||process.env.GEMINI_GOOGLE_PROJECT_ID||process.env.GOOGLE_CLOUD_PROJECT||process.env.GCLOUD_PROJECT)}}export function isZAIProviderConfigured(){try{const e=r().read(),o=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("zai/")&&"string"==typeof r&&r.trim());return Boolean(process.env.ZAI_API_KEY||e?.providerApiKeys?.zai||o)}catch{return Boolean(process.env.ZAI_API_KEY)}}export function isMiniMaxProviderConfigured(){try{const e=r().read(),o=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("minimax/")&&"string"==typeof r&&r.trim());return Boolean(process.env.MINIMAX_API_KEY||e?.providerApiKeys?.minimax||o)}catch{return Boolean(process.env.MINIMAX_API_KEY)}}export function isNvidiaProviderConfigured(){try{const e=r().read(),o=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("nvidia/")&&"string"==typeof r&&r.trim());return Boolean(process.env.NVIDIA_API_KEY||e?.providerApiKeys?.nvidia||o)}catch{return Boolean(process.env.NVIDIA_API_KEY)}}export function isDeepSeekProviderConfigured(){try{const e=r().read(),o=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("deepseek/")&&"string"==typeof r&&r.trim());return Boolean(process.env.DEEPSEEK_API_KEY||e?.providerApiKeys?.deepseek||o)}catch{return Boolean(process.env.DEEPSEEK_API_KEY)}}export function isOpenAICompatibleProvider(e){return"openai"===e||"openrouter"===e||"ollama"===e||"ollama-cloud"===e||"gemini-api"===e||"gemini-google"===e||"zai"===e||"minimax"===e||"nvidia"===e||"deepseek"===e}export function usesOpenAIBackend(e){return isOpenAICompatibleProvider(e)&&"minimax"!==e}export function hasDualProviderSessions(){return(isOpenAIProviderConfigured()||isOpenRouterProviderConfigured()||isOllamaProviderConfigured()||isOllamaCloudProviderConfigured()||isGeminiApiProviderConfigured()||isGeminiGoogleProviderConfigured()||isZAIProviderConfigured()||isMiniMaxProviderConfigured()||isNvidiaProviderConfigured()||isDeepSeekProviderConfigured())&&function(){try{const e=r().read(),o=Object.entries(e?.providerProfileOauth??{}).some(([e,r])=>e.startsWith("claude/")&&"object"==typeof r&&null!==r&&"string"==typeof r.accessToken&&r.accessToken.trim());return Boolean(o)}catch{return!1}}()}export function getAPIProvider(){const r=i();if(r)return r;if(e(process.env.CLAUDE_CODE_USE_BEDROCK))return"bedrock";if(e(process.env.CLAUDE_CODE_USE_VERTEX))return"vertex";if(e(process.env.CLAUDE_CODE_USE_FOUNDRY))return"foundry";try{const e=n();if("claude"===e)return"firstParty";if("openai"===e)return"openai";if("openrouter"===e)return"openrouter";if("ollama"===e)return"ollama";if("ollama-cloud"===e)return"ollama-cloud";if("gemini-api"===e)return"gemini-api";if("gemini-google"===e)return"gemini-google";if("zai"===e)return"zai";if("minimax"===e)return"minimax";if("nvidia"===e)return"nvidia";if("deepseek"===e)return"deepseek"}catch{}const o=isOpenAIProviderConfigured(),t=isOpenRouterProviderConfigured(),s=isOllamaProviderConfigured(),a=isOllamaCloudProviderConfigured(),p=isGeminiApiProviderConfigured(),c=isGeminiGoogleProviderConfigured(),d=isZAIProviderConfigured(),u=isMiniMaxProviderConfigured(),v=isNvidiaProviderConfigured(),l=isDeepSeekProviderConfigured();return o?"openai":t?"openrouter":d?"zai":u?"minimax":v?"nvidia":l?"deepseek":p?"gemini-api":c?"gemini-google":a?"ollama-cloud":s?"ollama":"firstParty"}export function getAPIProviderForStatsig(){return getAPIProvider()}export function isFirstPartyAnthropicBaseUrl(){const e=process.env.ANTHROPIC_BASE_URL;if(!e)return!0;try{const r=new URL(e).host,o=["api.anthropic.com"];return"ant"===process.env.USER_TYPE&&o.push("api-staging.anthropic.com"),o.includes(r)}catch{return!1}}
1
+ import{isEnvTruthy as e}from"../envUtils.js";import{getSecureStorage as r}from"../secureStorage/index.js";import{isProviderBaseUrlCustomized as o}from"./providerBaseUrls.js";import{getProviderOverride as i}from"./providerOverrideContext.js";import{getStoredActiveProviderPreference as n}from"./providerProfilesDb.js";import{listProviderProfiles as t}from"./providerProfiles.js";export function providerPreferenceToApiProvider(e){if(e)return"claude"===e?"firstParty":e}export function isOpenAIProviderConfigured(){return e(process.env.CLAUDE_CODE_USE_OPENAI)||Boolean(process.env.OPENAI_API_KEY)||Boolean(process.env.OPENAI_API_TOKEN)||Boolean(process.env.OPENAI_OAUTH_TOKEN)||function(){try{const e=r().read(),o=Object.entries(e?.providerProfileOauth??{}).some(([e,r])=>e.startsWith("openai/")&&"object"==typeof r&&null!==r&&"string"==typeof r.accessToken&&r.accessToken.trim());return Boolean(o||e?.openAiOauth?.accessToken)}catch{return!1}}()}export function isOpenRouterProviderConfigured(){try{const e=r().read(),o=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("openrouter/")&&"string"==typeof r&&r.trim());return Boolean(process.env.OPENROUTER_API_KEY||process.env.OPENROUTER_API_TOKEN||e?.providerApiKeys?.openrouter||o)}catch{return Boolean(process.env.OPENROUTER_API_KEY||process.env.OPENROUTER_API_TOKEN)}}export function isOllamaProviderConfigured(){try{const e=n();return Boolean(process.env.OLLAMA_BASE_URL||o("ollama")||t("ollama").length>0||"ollama"===e)}catch{return Boolean(process.env.OLLAMA_BASE_URL)}}export function isOllamaCloudProviderConfigured(){if(isOllamaProviderConfigured())return!0;try{const e=r().read(),i=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("ollama-cloud/")&&"string"==typeof r&&r.trim()),t=n();return Boolean(process.env.OLLAMA_CLOUD_BASE_URL||process.env.OLLAMA_BASE_URL||process.env.OLLAMA_API_KEY||e?.providerApiKeys?.["ollama-cloud"]||i||o("ollama-cloud")||"ollama-cloud"===t||"ollama"===t)}catch{return Boolean(process.env.OLLAMA_CLOUD_BASE_URL||process.env.OLLAMA_BASE_URL||process.env.OLLAMA_API_KEY)}}export function isGeminiApiProviderConfigured(){try{const e=r().read(),o=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("gemini-api/")&&"string"==typeof r&&r.trim());return Boolean(process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY||e?.providerApiKeys?.["gemini-api"]||o)}catch{return Boolean(process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY)}}export function isGeminiGoogleProviderConfigured(){try{const e=n();return Boolean(process.env.GEMINI_OAUTH_TOKEN||process.env.GOOGLE_OAUTH_ACCESS_TOKEN||process.env.GOOGLE_APPLICATION_CREDENTIALS||process.env.GEMINI_GOOGLE_PROJECT_ID||process.env.GOOGLE_CLOUD_PROJECT||process.env.GCLOUD_PROJECT||Object.entries(storage?.providerProfileOauth??{}).some(([e,r])=>e.startsWith("gemini-google/")&&"object"==typeof r&&null!==r&&"string"==typeof r.accessToken&&r.accessToken.trim())||"gemini-google"===e)}catch{return Boolean(process.env.GEMINI_OAUTH_TOKEN||process.env.GOOGLE_OAUTH_ACCESS_TOKEN||process.env.GOOGLE_APPLICATION_CREDENTIALS||process.env.GEMINI_GOOGLE_PROJECT_ID||process.env.GOOGLE_CLOUD_PROJECT||process.env.GCLOUD_PROJECT)}}export function isZAIProviderConfigured(){try{const e=r().read(),o=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("zai/")&&"string"==typeof r&&r.trim());return Boolean(process.env.ZAI_API_KEY||e?.providerApiKeys?.zai||o)}catch{return Boolean(process.env.ZAI_API_KEY)}}export function isMiniMaxProviderConfigured(){try{const e=r().read(),o=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("minimax/")&&"string"==typeof r&&r.trim());return Boolean(process.env.MINIMAX_API_KEY||e?.providerApiKeys?.minimax||o)}catch{return Boolean(process.env.MINIMAX_API_KEY)}}export function isNvidiaProviderConfigured(){try{const e=r().read(),o=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("nvidia/")&&"string"==typeof r&&r.trim());return Boolean(process.env.NVIDIA_API_KEY||e?.providerApiKeys?.nvidia||o)}catch{return Boolean(process.env.NVIDIA_API_KEY)}}export function isDeepSeekProviderConfigured(){try{const e=r().read(),o=Object.entries(e?.providerProfileApiKeys??{}).some(([e,r])=>e.startsWith("deepseek/")&&"string"==typeof r&&r.trim());return Boolean(process.env.DEEPSEEK_API_KEY||e?.providerApiKeys?.deepseek||o)}catch{return Boolean(process.env.DEEPSEEK_API_KEY)}}export function isOpenAICompatibleProvider(e){return"openai"===e||"openrouter"===e||"ollama"===e||"ollama-cloud"===e||"gemini-api"===e||"gemini-google"===e||"zai"===e||"minimax"===e||"nvidia"===e||"deepseek"===e}export function usesOpenAIBackend(e){return isOpenAICompatibleProvider(e)&&"minimax"!==e}export function hasDualProviderSessions(){return(isOpenAIProviderConfigured()||isOpenRouterProviderConfigured()||isOllamaProviderConfigured()||isOllamaCloudProviderConfigured()||isGeminiApiProviderConfigured()||isGeminiGoogleProviderConfigured()||isZAIProviderConfigured()||isMiniMaxProviderConfigured()||isNvidiaProviderConfigured()||isDeepSeekProviderConfigured())&&function(){try{const e=r().read(),o=Object.entries(e?.providerProfileOauth??{}).some(([e,r])=>e.startsWith("claude/")&&"object"==typeof r&&null!==r&&"string"==typeof r.accessToken&&r.accessToken.trim());return Boolean(o)}catch{return!1}}()}export function getAPIProvider(){const r=i();if(r)return r;if(e(process.env.CLAUDE_CODE_USE_BEDROCK))return"bedrock";if(e(process.env.CLAUDE_CODE_USE_VERTEX))return"vertex";if(e(process.env.CLAUDE_CODE_USE_FOUNDRY))return"foundry";try{const e=n();if("claude"===e)return"firstParty";if("openai"===e)return"openai";if("openrouter"===e)return"openrouter";if("ollama"===e)return"ollama";if("ollama-cloud"===e)return"ollama-cloud";if("gemini-api"===e)return"gemini-api";if("gemini-google"===e)return"gemini-google";if("zai"===e)return"zai";if("minimax"===e)return"minimax";if("nvidia"===e)return"nvidia";if("deepseek"===e)return"deepseek"}catch{}const o=isOpenAIProviderConfigured(),t=isOpenRouterProviderConfigured(),s=isOllamaProviderConfigured(),a=isOllamaCloudProviderConfigured(),p=isGeminiApiProviderConfigured(),c=isGeminiGoogleProviderConfigured(),d=isZAIProviderConfigured(),u=isMiniMaxProviderConfigured(),l=isNvidiaProviderConfigured(),v=isDeepSeekProviderConfigured();return o?"openai":t?"openrouter":d?"zai":u?"minimax":l?"nvidia":v?"deepseek":p?"gemini-api":c?"gemini-google":a?"ollama-cloud":s?"ollama":"firstParty"}export function getAPIProviderForStatsig(){return getAPIProvider()}export function isFirstPartyAnthropicBaseUrl(){const e=process.env.ANTHROPIC_BASE_URL;if(!e)return!0;try{const r=new URL(e).host,o=["api.anthropic.com"];return"ant"===process.env.USER_TYPE&&o.push("api-staging.anthropic.com"),o.includes(r)}catch{return!1}}
@@ -1 +1 @@
1
- import{logEvent as t}from"src/services/analytics/index.js";import{setHasUnknownModelCost as e}from"../bootstrap/state.js";import{isFastModeEnabled as o}from"./fastMode.js";import{CLAUDE_3_5_HAIKU_CONFIG as s,CLAUDE_3_5_V2_SONNET_CONFIG as r,CLAUDE_3_7_SONNET_CONFIG as _,CLAUDE_HAIKU_4_5_CONFIG as n,CLAUDE_OPUS_4_1_CONFIG as a,CLAUDE_OPUS_4_5_CONFIG as T,CLAUDE_OPUS_4_6_CONFIG as p,CLAUDE_OPUS_4_CONFIG as i,CLAUDE_SONNET_4_5_CONFIG as u,CLAUDE_SONNET_4_6_CONFIG as c,CLAUDE_SONNET_4_CONFIG as C}from"./model/configs.js";import{firstPartyNameToCanonical as O,getCanonicalName as S,getDefaultMainLoopModelSetting as k}from"./model/model.js";export const COST_TIER_3_15={inputTokens:3,outputTokens:15,promptCacheWriteTokens:3.75,promptCacheReadTokens:.3,webSearchRequests:.01};export const COST_TIER_15_75={inputTokens:15,outputTokens:75,promptCacheWriteTokens:18.75,promptCacheReadTokens:1.5,webSearchRequests:.01};export const COST_TIER_5_25={inputTokens:5,outputTokens:25,promptCacheWriteTokens:6.25,promptCacheReadTokens:.5,webSearchRequests:.01};export const COST_TIER_30_150={inputTokens:30,outputTokens:150,promptCacheWriteTokens:37.5,promptCacheReadTokens:3,webSearchRequests:.01};export const COST_HAIKU_35={inputTokens:.8,outputTokens:4,promptCacheWriteTokens:1,promptCacheReadTokens:.08,webSearchRequests:.01};export const COST_HAIKU_45={inputTokens:1,outputTokens:5,promptCacheWriteTokens:1.25,promptCacheReadTokens:.1,webSearchRequests:.01};const m=COST_TIER_5_25;export function getOpus46CostTier(t){return o()&&t?COST_TIER_30_150:COST_TIER_5_25}export const MODEL_COSTS={[O(s.firstParty)]:COST_HAIKU_35,[O(n.firstParty)]:COST_HAIKU_45,[O(r.firstParty)]:COST_TIER_3_15,[O(_.firstParty)]:COST_TIER_3_15,[O(C.firstParty)]:COST_TIER_3_15,[O(u.firstParty)]:COST_TIER_3_15,[O(c.firstParty)]:COST_TIER_3_15,[O(i.firstParty)]:COST_TIER_15_75,[O(a.firstParty)]:COST_TIER_15_75,[O(T.firstParty)]:COST_TIER_5_25,[O(p.firstParty)]:COST_TIER_5_25};export function getModelCosts(o,s){const r=S(o);if(r===O(p.firstParty))return getOpus46CostTier("fast"===s.speed);return MODEL_COSTS[r]||(function(o,s){t("tengu_unknown_model_cost",{model:o,shortName:s}),e()}(o,r),MODEL_COSTS[S(k())]??m)}export function calculateUSDCost(t,e){return function(t,e){return e.input_tokens/1e6*t.inputTokens+e.output_tokens/1e6*t.outputTokens+(e.cache_read_input_tokens??0)/1e6*t.promptCacheReadTokens+(e.cache_creation_input_tokens??0)/1e6*t.promptCacheWriteTokens+(e.server_tool_use?.web_search_requests??0)*t.webSearchRequests}(getModelCosts(t,e),e)}export function calculateCostFromTokens(t,e){return calculateUSDCost(t,{input_tokens:e.inputTokens,output_tokens:e.outputTokens,cache_read_input_tokens:e.cacheReadInputTokens,cache_creation_input_tokens:e.cacheCreationInputTokens})}function formatPrice(t){return Number.isInteger(t)?`$${t}`:`$${t.toFixed(2)}`}export function formatModelPricing(t){return`${formatPrice(t.inputTokens)}/${formatPrice(t.outputTokens)} per Mtok`}export function getModelPricingString(t){const e=S(t),o=MODEL_COSTS[e];if(o)return formatModelPricing(o)}
1
+ import{logEvent as t}from"../services/analytics/index.js";import{setHasUnknownModelCost as e}from"../bootstrap/state.js";import{isFastModeEnabled as o}from"./fastMode.js";import{CLAUDE_3_5_HAIKU_CONFIG as r,CLAUDE_3_5_V2_SONNET_CONFIG as n,CLAUDE_3_7_SONNET_CONFIG as s,CLAUDE_HAIKU_4_5_CONFIG as _,CLAUDE_OPUS_4_1_CONFIG as p,CLAUDE_OPUS_4_5_CONFIG as T,CLAUDE_OPUS_4_6_CONFIG as u,CLAUDE_OPUS_4_CONFIG as c,CLAUDE_SONNET_4_5_CONFIG as a,CLAUDE_SONNET_4_6_CONFIG as i,CLAUDE_SONNET_4_CONFIG as C}from"./model/configs.js";import{firstPartyNameToCanonical as k,getCanonicalName as S,getDefaultMainLoopModelSetting as m}from"./model/model.js";export const COST_TIER_3_15={inputTokens:3,outputTokens:15,promptCacheWriteTokens:3.75,promptCacheReadTokens:.3,webSearchRequests:.01};export const COST_TIER_15_75={inputTokens:15,outputTokens:75,promptCacheWriteTokens:18.75,promptCacheReadTokens:1.5,webSearchRequests:.01};export const COST_TIER_5_25={inputTokens:5,outputTokens:25,promptCacheWriteTokens:6.25,promptCacheReadTokens:.5,webSearchRequests:.01};export const COST_TIER_30_150={inputTokens:30,outputTokens:150,promptCacheWriteTokens:37.5,promptCacheReadTokens:3,webSearchRequests:.01};export const COST_HAIKU_35={inputTokens:.8,outputTokens:4,promptCacheWriteTokens:1,promptCacheReadTokens:.08,webSearchRequests:.01};export const COST_HAIKU_45={inputTokens:1,outputTokens:5,promptCacheWriteTokens:1.25,promptCacheReadTokens:.1,webSearchRequests:.01};const f=COST_TIER_5_25;export function getOpus46CostTier(t){return o()&&t?COST_TIER_30_150:COST_TIER_5_25}export const MODEL_COSTS={[k(r.firstParty)]:COST_HAIKU_35,[k(_.firstParty)]:COST_HAIKU_45,[k(n.firstParty)]:COST_TIER_3_15,[k(s.firstParty)]:COST_TIER_3_15,[k(C.firstParty)]:COST_TIER_3_15,[k(a.firstParty)]:COST_TIER_3_15,[k(i.firstParty)]:COST_TIER_3_15,[k(c.firstParty)]:COST_TIER_15_75,[k(p.firstParty)]:COST_TIER_15_75,[k(T.firstParty)]:COST_TIER_5_25,[k(u.firstParty)]:COST_TIER_5_25};export function getModelCosts(o,r){const n=S(o);if(n===k(u.firstParty)){return getOpus46CostTier("fast"===r.speed)}const s=MODEL_COSTS[n];return s||(function(o,r){t("tengu_unknown_model_cost",{model:o,shortName:r}),e()}(o,n),MODEL_COSTS[S(m())]??f)}export function calculateUSDCost(t,e){return function(t,e){return e.input_tokens/1e6*t.inputTokens+e.output_tokens/1e6*t.outputTokens+(e.cache_read_input_tokens??0)/1e6*t.promptCacheReadTokens+(e.cache_creation_input_tokens??0)/1e6*t.promptCacheWriteTokens+(e.server_tool_use?.web_search_requests??0)*t.webSearchRequests}(getModelCosts(t,e),e)}export function calculateCostFromTokens(t,e){return calculateUSDCost(t,{input_tokens:e.inputTokens,output_tokens:e.outputTokens,cache_read_input_tokens:e.cacheReadInputTokens,cache_creation_input_tokens:e.cacheCreationInputTokens})}function formatPrice(t){return Number.isInteger(t)?`$${t}`:`$${t.toFixed(2)}`}export function formatModelPricing(t){return`${formatPrice(t.inputTokens)}/${formatPrice(t.outputTokens)} per Mtok`}export function getModelPricingString(t){const e=S(t),o=MODEL_COSTS[e];if(o)return formatModelPricing(o)}
@@ -1 +1 @@
1
- import{createRequire as r}from"module";const e=r(import.meta.url);let i=!1;export function prewarmModifiers(){if(!i&&"darwin"===process.platform){i=!0;try{const{prewarm:r}=e("modifiers-napi");r()}catch{}}}export function isModifierPressed(r){if("darwin"!==process.platform)return!1;const{isModifierPressed:i}=e("modifiers-napi");return i(r)}
1
+ import{createRequire as r}from"module";const i=r(import.meta.url);let e=!1;export function prewarmModifiers(){if(!e&&"darwin"===process.platform){e=!0;try{const{prewarm:r}=i("modifiers-napi");r()}catch{}}}export function isModifierPressed(r){if("darwin"!==process.platform)return!1;const{isModifierPressed:e}=i("modifiers-napi");return e(r)}
@@ -1 +1 @@
1
- import{createRequire as e}from"module";const t=e(import.meta.url);import{Agent as n}from"https";import o from"lodash-es/memoize.js";import{getCACertificates as c}from"./caCerts.js";import{logForDebugging as r}from"./debug.js";import{getFsImplementation as i}from"./fsOperations.js";export const getMTLSConfig=o(()=>{const e={},t=process.env.CONTEXT_CODE_CLIENT_CERT??process.env.CLAUDE_CODE_CLIENT_CERT;if(t)try{e.cert=i().readFileSync(t,{encoding:"utf8"}),r("mTLS: Loaded client certificate from CONTEXT_CODE_CLIENT_CERT / CLAUDE_CODE_CLIENT_CERT")}catch(e){r(`mTLS: Failed to load client certificate: ${e}`,{level:"error"})}const n=process.env.CONTEXT_CODE_CLIENT_KEY??process.env.CLAUDE_CODE_CLIENT_KEY;if(n)try{e.key=i().readFileSync(n,{encoding:"utf8"}),r("mTLS: Loaded client key from CONTEXT_CODE_CLIENT_KEY / CLAUDE_CODE_CLIENT_KEY")}catch(e){r(`mTLS: Failed to load client key: ${e}`,{level:"error"})}const o=process.env.CONTEXT_CODE_CLIENT_KEY_PASSPHRASE??process.env.CLAUDE_CODE_CLIENT_KEY_PASSPHRASE;if(o&&(e.passphrase=o,r("mTLS: Using client key passphrase")),0!==Object.keys(e).length)return e});export const getMTLSAgent=o(()=>{const e=getMTLSConfig(),t=c();if(!e&&!t)return;const o={...e,...t&&{ca:t},keepAlive:!0};return r("mTLS: Creating HTTPS agent with custom certificates"),new n(o)});export function getWebSocketTLSOptions(){const e=getMTLSConfig(),t=c();if(e||t)return{...e,...t&&{ca:t}}}export function getTLSFetchOptions(){const e=getMTLSConfig(),n=c();if(!e&&!n)return{};const o={...e,...n&&{ca:n}};return"undefined"!=typeof Bun?{tls:o}:(r("TLS: Created undici agent with custom certificates"),{dispatcher:new(t("undici").Agent)({connect:{cert:o.cert,key:o.key,passphrase:o.passphrase,...o.ca&&{ca:o.ca}},pipelining:1})})}export function clearMTLSCache(){getMTLSConfig.cache.clear?.(),getMTLSAgent.cache.clear?.(),r("Cleared mTLS configuration cache")}export function configureGlobalMTLS(){getMTLSConfig()&&process.env.NODE_EXTRA_CA_CERTS&&r("NODE_EXTRA_CA_CERTS detected - Node.js will automatically append to built-in CAs")}
1
+ import{createRequire as e}from"module";const t=e(import.meta.url);import{Agent as n}from"https";import c from"lodash-es/memoize.js";import{getCACertificates as o}from"./caCerts.js";import{logForDebugging as r}from"./debug.js";import{getFsImplementation as i}from"./fsOperations.js";export const getMTLSConfig=c(()=>{const e={},t=process.env.CONTEXT_CODE_CLIENT_CERT??process.env.CLAUDE_CODE_CLIENT_CERT;if(t)try{e.cert=i().readFileSync(t,{encoding:"utf8"}),r("mTLS: Loaded client certificate from CONTEXT_CODE_CLIENT_CERT / CLAUDE_CODE_CLIENT_CERT")}catch(e){r(`mTLS: Failed to load client certificate: ${e}`,{level:"error"})}const n=process.env.CONTEXT_CODE_CLIENT_KEY??process.env.CLAUDE_CODE_CLIENT_KEY;if(n)try{e.key=i().readFileSync(n,{encoding:"utf8"}),r("mTLS: Loaded client key from CONTEXT_CODE_CLIENT_KEY / CLAUDE_CODE_CLIENT_KEY")}catch(e){r(`mTLS: Failed to load client key: ${e}`,{level:"error"})}const c=process.env.CONTEXT_CODE_CLIENT_KEY_PASSPHRASE??process.env.CLAUDE_CODE_CLIENT_KEY_PASSPHRASE;if(c&&(e.passphrase=c,r("mTLS: Using client key passphrase")),0!==Object.keys(e).length)return e});export const getMTLSAgent=c(()=>{const e=getMTLSConfig(),t=o();if(!e&&!t)return;const c={...e,...t&&{ca:t},keepAlive:!0};return r("mTLS: Creating HTTPS agent with custom certificates"),new n(c)});export function getWebSocketTLSOptions(){const e=getMTLSConfig(),t=o();if(e||t)return{...e,...t&&{ca:t}}}export function getTLSFetchOptions(){const e=getMTLSConfig(),n=o();if(!e&&!n)return{};const c={...e,...n&&{ca:n}};if("undefined"!=typeof Bun)return{tls:c};r("TLS: Created undici agent with custom certificates");return{dispatcher:new(t("undici").Agent)({connect:{cert:c.cert,key:c.key,passphrase:c.passphrase,...c.ca&&{ca:c.ca}},pipelining:1})}}export function clearMTLSCache(){getMTLSConfig.cache.clear?.(),getMTLSAgent.cache.clear?.(),r("Cleared mTLS configuration cache")}export function configureGlobalMTLS(){getMTLSConfig()&&process.env.NODE_EXTRA_CA_CERTS&&r("NODE_EXTRA_CA_CERTS detected - Node.js will automatically append to built-in CAs")}
@@ -1 +1 @@
1
- import{MACRO as e}from"../../recovery/bunBundleShim.js";import{feature as t}from"bun:bundle";import o from"axios";import{createHash as r}from"crypto";import{chmod as n,writeFile as s}from"fs/promises";import{join as a}from"path";import{logEvent as i}from"src/services/analytics/index.js";import{logForDebugging as c}from"../debug.js";import{toError as l}from"../errors.js";import{execFileNoThrowWithCwd as m}from"../execFileNoThrow.js";import{getFsImplementation as d}from"../fsOperations.js";import{logError as u}from"../log.js";import{sleep as f}from"../sleep.js";import{jsonStringify as p,writeFileSync_DEPRECATED as _}from"../slowOperations.js";import{getBinaryName as w,getPlatform as E}from"./installer.js";const y="https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases";export const ARTIFACTORY_REGISTRY_URL="https://artifactory.infra.ant.dev/artifactory/api/npm/npm-all/";export async function getLatestVersionFromArtifactory(t="latest"){const o=Date.now(),{stdout:r,code:n,stderr:s}=await m("npm",["view",`${e.NATIVE_PACKAGE_URL}@${t}`,"version","--prefer-online","--registry",ARTIFACTORY_REGISTRY_URL],{timeout:3e4,preserveOutputOnError:!0}),a=Date.now()-o;if(0!==n){i("tengu_version_check_failure",{latency_ms:a,source_npm:!0,exit_code:n});const e=new Error(`npm view failed with code ${n}: ${s}`);throw u(e),e}return i("tengu_version_check_success",{latency_ms:a,source_npm:!0}),c(`npm view ${e.NATIVE_PACKAGE_URL}@${t} version: ${r}`),r.trim()}export async function getLatestVersionFromBinaryRepo(e="latest",t,r){const n=Date.now();try{const s=await o.get(`${t}/${e}`,{timeout:3e4,responseType:"text",...r}),a=Date.now()-n;return i("tengu_version_check_success",{latency_ms:a}),s.data.trim()}catch(r){const s=Date.now()-n,a=r instanceof Error?r.message:String(r);let c;o.isAxiosError(r)&&r.response&&(c=r.response.status),i("tengu_version_check_failure",{latency_ms:s,http_status:c,is_timeout:a.includes("timeout")});const l=new Error(`Failed to fetch version from ${t}/${e}: ${a}`);throw u(l),l}}export async function getLatestVersion(e){if(/^v?\d+\.\d+\.\d+(-\S+)?$/.test(e)){const o=e.startsWith("v")?e.slice(1):e;if(/^99\.99\./.test(o)&&!t("ALLOW_TEST_VERSIONS"))throw new Error(`Version ${o} is not available for installation. Use 'stable' or 'latest'.`);return o}const o=e;if("stable"!==o&&"latest"!==o)throw new Error(`Invalid channel: ${e}. Use 'stable' or 'latest'`);return"ant"===process.env.USER_TYPE?getLatestVersionFromArtifactory("stable"===o?"stable":"latest"):getLatestVersionFromBinaryRepo(o,y)}export async function downloadVersionFromArtifactory(t,o){const r=d();await r.rm(o,{recursive:!0,force:!0});const n=E(),s=`${e.NATIVE_PACKAGE_URL}-${n}`;c(`Fetching integrity hash for ${s}@${t}`);const{stdout:i,code:l,stderr:u}=await m("npm",["view",`${s}@${t}`,"dist.integrity","--registry",ARTIFACTORY_REGISTRY_URL],{timeout:3e4,preserveOutputOnError:!0});if(0!==l)throw new Error(`npm view integrity failed with code ${l}: ${u}`);const f=i.trim();if(!f)throw new Error(`Failed to fetch integrity hash for ${s}@${t}`);c(`Got integrity hash for ${n}: ${f}`),await r.mkdir(o);const w={name:"claude-native-installer",version:"0.0.1",dependencies:{[e.NATIVE_PACKAGE_URL]:t}},y={name:"claude-native-installer",version:"0.0.1",lockfileVersion:3,requires:!0,packages:{"":{name:"claude-native-installer",version:"0.0.1",dependencies:{[e.NATIVE_PACKAGE_URL]:t}},[`node_modules/${e.NATIVE_PACKAGE_URL}`]:{version:t,optionalDependencies:{[s]:t}},[`node_modules/${s}`]:{version:t,integrity:f}}};_(a(o,"package.json"),p(w,null,2),{encoding:"utf8",flush:!0}),_(a(o,"package-lock.json"),p(y,null,2),{encoding:"utf8",flush:!0});const h=await m("npm",["ci","--prefer-online","--registry",ARTIFACTORY_REGISTRY_URL],{timeout:6e4,preserveOutputOnError:!0,cwd:o});if(0!==h.code)throw new Error(`npm ci failed with code ${h.code}: ${h.stderr}`);c(`Successfully downloaded and verified ${e.NATIVE_PACKAGE_URL}@${t}`)}const h=3;class StallTimeoutError extends Error{constructor(){super("Download stalled: no data received for 60 seconds"),this.name="StallTimeoutError"}}async function downloadAndVerifyBinary(e,t,a,i={}){let m;for(let d=1;d<=3;d++){const u=new AbortController;let p;const clearStallTimer=()=>{p&&(clearTimeout(p),p=void 0)},resetStallTimer=()=>{clearStallTimer(),p=setTimeout(e=>e.abort(),Number(process.env.CONTEXT_CODE_STALL_TIMEOUT_MS_FOR_TESTING??process.env.CLAUDE_CODE_STALL_TIMEOUT_MS_FOR_TESTING)||6e4,u)};try{resetStallTimer();const c=await o.get(e,{timeout:3e5,responseType:"arraybuffer",signal:u.signal,onDownloadProgress:()=>{resetStallTimer()},...i});clearStallTimer();const l=r("sha256");l.update(c.data);const m=l.digest("hex");if(m!==t)throw new Error(`Checksum mismatch: expected ${t}, got ${m}`);return await s(a,Buffer.from(c.data)),void await n(a,493)}catch(e){clearStallTimer();const t=o.isCancel(e);if(m=t?new StallTimeoutError:l(e),t&&d<3){c(`Download stalled on attempt ${d}/3, retrying...`),await f(1e3);continue}throw m}}throw m??new Error("Download failed after all retries")}export async function downloadVersionFromBinaryRepo(e,t,r,n){const s=d();await s.rm(t,{recursive:!0,force:!0});const c=E(),l=Date.now();let m;i("tengu_binary_download_attempt",{});try{m=(await o.get(`${r}/${e}/manifest.json`,{timeout:1e4,responseType:"json",...n})).data}catch(t){const n=Date.now()-l,s=t instanceof Error?t.message:String(t);let a;throw o.isAxiosError(t)&&t.response&&(a=t.response.status),i("tengu_binary_manifest_fetch_failure",{latency_ms:n,http_status:a,is_timeout:s.includes("timeout")}),u(new Error(`Failed to fetch manifest from ${r}/${e}/manifest.json: ${s}`)),t}const f=m.platforms[c];if(!f)throw i("tengu_binary_platform_not_found",{}),new Error(`Platform ${c} not found in manifest for version ${e}`);const p=f.checksum,_=w(c),y=`${r}/${e}/${c}/${_}`;await s.mkdir(t);const h=a(t,_);try{await downloadAndVerifyBinary(y,p,h,n||{});const e=Date.now()-l;i("tengu_binary_download_success",{latency_ms:e})}catch(e){const t=Date.now()-l,r=e instanceof Error?e.message:String(e);let n;throw o.isAxiosError(e)&&e.response&&(n=e.response.status),i("tengu_binary_download_failure",{latency_ms:t,http_status:n,is_timeout:r.includes("timeout"),is_checksum_mismatch:r.includes("Checksum mismatch")}),u(new Error(`Failed to download binary from ${y}: ${r}`)),e}}export async function downloadVersion(e,o){if(t("ALLOW_TEST_VERSIONS")&&/^99\.99\./.test(e)){const{stdout:t}=await m("gcloud",["auth","print-access-token"]);return await downloadVersionFromBinaryRepo(e,o,"https://storage.googleapis.com/claude-code-ci-sentinel",{headers:{Authorization:`Bearer ${t.trim()}`}}),"binary"}return"ant"===process.env.USER_TYPE?(await downloadVersionFromArtifactory(e,o),"npm"):(await downloadVersionFromBinaryRepo(e,o,y),"binary")}export{StallTimeoutError,h as MAX_DOWNLOAD_RETRIES};export const STALL_TIMEOUT_MS=6e4;export const _downloadAndVerifyBinaryForTesting=downloadAndVerifyBinary;
1
+ import{MACRO as e,feature as t}from"../../recovery/bunBundleShim.js";import o from"axios";import{createHash as r}from"crypto";import{chmod as n,writeFile as s}from"fs/promises";import{join as i}from"path";import{logEvent as a}from"../../services/analytics/index.js";import{logForDebugging as c}from"../debug.js";import{toError as l}from"../errors.js";import{execFileNoThrowWithCwd as d}from"../execFileNoThrow.js";import{getFsImplementation as m}from"../fsOperations.js";import{logError as u}from"../log.js";import{sleep as f}from"../sleep.js";import{jsonStringify as p,writeFileSync_DEPRECATED as _}from"../slowOperations.js";import{getBinaryName as w,getPlatform as y}from"./installer.js";const h="https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases";export const ARTIFACTORY_REGISTRY_URL="https://artifactory.infra.ant.dev/artifactory/api/npm/npm-all/";export async function getLatestVersionFromArtifactory(t="latest"){const o=Date.now(),{stdout:r,code:n,stderr:s}=await d("npm",["view",`${e.NATIVE_PACKAGE_URL}@${t}`,"version","--prefer-online","--registry",ARTIFACTORY_REGISTRY_URL],{timeout:3e4,preserveOutputOnError:!0}),i=Date.now()-o;if(0!==n){a("tengu_version_check_failure",{latency_ms:i,source_npm:!0,exit_code:n});const e=new Error(`npm view failed with code ${n}: ${s}`);throw u(e),e}a("tengu_version_check_success",{latency_ms:i,source_npm:!0}),c(`npm view ${e.NATIVE_PACKAGE_URL}@${t} version: ${r}`);return r.trim()}export async function getLatestVersionFromBinaryRepo(e="latest",t,r){const n=Date.now();try{const s=await o.get(`${t}/${e}`,{timeout:3e4,responseType:"text",...r}),i=Date.now()-n;return a("tengu_version_check_success",{latency_ms:i}),s.data.trim()}catch(r){const s=Date.now()-n,i=r instanceof Error?r.message:String(r);let c;o.isAxiosError(r)&&r.response&&(c=r.response.status),a("tengu_version_check_failure",{latency_ms:s,http_status:c,is_timeout:i.includes("timeout")});const l=new Error(`Failed to fetch version from ${t}/${e}: ${i}`);throw u(l),l}}export async function getLatestVersion(e){if(/^v?\d+\.\d+\.\d+(-\S+)?$/.test(e)){const o=e.startsWith("v")?e.slice(1):e;if(/^99\.99\./.test(o)&&!t("ALLOW_TEST_VERSIONS"))throw new Error(`Version ${o} is not available for installation. Use 'stable' or 'latest'.`);return o}const o=e;if("stable"!==o&&"latest"!==o)throw new Error(`Invalid channel: ${e}. Use 'stable' or 'latest'`);if("ant"===process.env.USER_TYPE){return getLatestVersionFromArtifactory("stable"===o?"stable":"latest")}return getLatestVersionFromBinaryRepo(o,h)}export async function downloadVersionFromArtifactory(t,o){const r=m();await r.rm(o,{recursive:!0,force:!0});const n=y(),s=`${e.NATIVE_PACKAGE_URL}-${n}`;c(`Fetching integrity hash for ${s}@${t}`);const{stdout:a,code:l,stderr:u}=await d("npm",["view",`${s}@${t}`,"dist.integrity","--registry",ARTIFACTORY_REGISTRY_URL],{timeout:3e4,preserveOutputOnError:!0});if(0!==l)throw new Error(`npm view integrity failed with code ${l}: ${u}`);const f=a.trim();if(!f)throw new Error(`Failed to fetch integrity hash for ${s}@${t}`);c(`Got integrity hash for ${n}: ${f}`),await r.mkdir(o);const w={name:"claude-native-installer",version:"0.0.1",dependencies:{[e.NATIVE_PACKAGE_URL]:t}},h={name:"claude-native-installer",version:"0.0.1",lockfileVersion:3,requires:!0,packages:{"":{name:"claude-native-installer",version:"0.0.1",dependencies:{[e.NATIVE_PACKAGE_URL]:t}},[`node_modules/${e.NATIVE_PACKAGE_URL}`]:{version:t,optionalDependencies:{[s]:t}},[`node_modules/${s}`]:{version:t,integrity:f}}};_(i(o,"package.json"),p(w,null,2),{encoding:"utf8",flush:!0}),_(i(o,"package-lock.json"),p(h,null,2),{encoding:"utf8",flush:!0});const E=await d("npm",["ci","--prefer-online","--registry",ARTIFACTORY_REGISTRY_URL],{timeout:6e4,preserveOutputOnError:!0,cwd:o});if(0!==E.code)throw new Error(`npm ci failed with code ${E.code}: ${E.stderr}`);c(`Successfully downloaded and verified ${e.NATIVE_PACKAGE_URL}@${t}`)}const E=3;class StallTimeoutError extends Error{constructor(){super("Download stalled: no data received for 60 seconds"),this.name="StallTimeoutError"}}async function downloadAndVerifyBinary(e,t,i,a={}){let d;for(let m=1;m<=3;m++){const u=new AbortController;let p;const clearStallTimer=()=>{p&&(clearTimeout(p),p=void 0)},resetStallTimer=()=>{clearStallTimer(),p=setTimeout(e=>e.abort(),Number(process.env.CONTEXT_CODE_STALL_TIMEOUT_MS_FOR_TESTING??process.env.CLAUDE_CODE_STALL_TIMEOUT_MS_FOR_TESTING)||6e4,u)};try{resetStallTimer();const c=await o.get(e,{timeout:3e5,responseType:"arraybuffer",signal:u.signal,onDownloadProgress:()=>{resetStallTimer()},...a});clearStallTimer();const l=r("sha256");l.update(c.data);const d=l.digest("hex");if(d!==t)throw new Error(`Checksum mismatch: expected ${t}, got ${d}`);return await s(i,Buffer.from(c.data)),void await n(i,493)}catch(e){clearStallTimer();const t=o.isCancel(e);if(d=t?new StallTimeoutError:l(e),t&&m<3){c(`Download stalled on attempt ${m}/3, retrying...`),await f(1e3);continue}throw d}}throw d??new Error("Download failed after all retries")}export async function downloadVersionFromBinaryRepo(e,t,r,n){const s=m();await s.rm(t,{recursive:!0,force:!0});const c=y(),l=Date.now();let d;a("tengu_binary_download_attempt",{});try{d=(await o.get(`${r}/${e}/manifest.json`,{timeout:1e4,responseType:"json",...n})).data}catch(t){const n=Date.now()-l,s=t instanceof Error?t.message:String(t);let i;throw o.isAxiosError(t)&&t.response&&(i=t.response.status),a("tengu_binary_manifest_fetch_failure",{latency_ms:n,http_status:i,is_timeout:s.includes("timeout")}),u(new Error(`Failed to fetch manifest from ${r}/${e}/manifest.json: ${s}`)),t}const f=d.platforms[c];if(!f)throw a("tengu_binary_platform_not_found",{}),new Error(`Platform ${c} not found in manifest for version ${e}`);const p=f.checksum,_=w(c),h=`${r}/${e}/${c}/${_}`;await s.mkdir(t);const E=i(t,_);try{await downloadAndVerifyBinary(h,p,E,n||{});const e=Date.now()-l;a("tengu_binary_download_success",{latency_ms:e})}catch(e){const t=Date.now()-l,r=e instanceof Error?e.message:String(e);let n;throw o.isAxiosError(e)&&e.response&&(n=e.response.status),a("tengu_binary_download_failure",{latency_ms:t,http_status:n,is_timeout:r.includes("timeout"),is_checksum_mismatch:r.includes("Checksum mismatch")}),u(new Error(`Failed to download binary from ${h}: ${r}`)),e}}export async function downloadVersion(e,o){if(t("ALLOW_TEST_VERSIONS")&&/^99\.99\./.test(e)){const{stdout:t}=await d("gcloud",["auth","print-access-token"]);return await downloadVersionFromBinaryRepo(e,o,"https://storage.googleapis.com/claude-code-ci-sentinel",{headers:{Authorization:`Bearer ${t.trim()}`}}),"binary"}return"ant"===process.env.USER_TYPE?(await downloadVersionFromArtifactory(e,o),"npm"):(await downloadVersionFromBinaryRepo(e,o,h),"binary")}export{StallTimeoutError,E as MAX_DOWNLOAD_RETRIES};export const STALL_TIMEOUT_MS=6e4;export const _downloadAndVerifyBinaryForTesting=downloadAndVerifyBinary;
@@ -1 +1 @@
1
- import{MACRO as e}from"../../recovery/bunBundleShim.js";import{constants as t}from"fs";import{access as a,chmod as i,copyFile as r,lstat as o,mkdir as s,readdir as n,readlink as c,realpath as l,rename as u,rm as d,rmdir as m,stat as p,symlink as f,unlink as g,writeFile as _}from"fs/promises";import{homedir as w}from"os";import{basename as h,delimiter as y,dirname as v,join as k,resolve as $}from"path";import{logEvent as b}from"src/services/analytics/index.js";import{getMaxVersion as P,shouldSkipVersion as x}from"../autoUpdater.js";import{registerCleanup as E}from"../cleanupRegistry.js";import{getGlobalConfig as A,saveGlobalConfig as F}from"../config.js";import{logForDebugging as L}from"../debug.js";import{getCurrentInstallationType as C}from"../doctorDiagnostic.js";import{env as N}from"../env.js";import{envDynamic as V}from"../envDynamic.js";import{isEnvTruthy as T}from"../envUtils.js";import{errorMessage as D,getErrnoCode as S,isENOENT as R,toError as B}from"../errors.js";import{execFileNoThrowWithCwd as I}from"../execFileNoThrow.js";import{getShellType as j}from"../localInstaller.js";import*as O from"../lockfile.js";import{logError as M}from"../log.js";import{gt as q,gte as U}from"../semver.js";import{filterClaudeAliases as H,getShellConfigPaths as W,readFileLines as G,writeFileLines as K}from"../shellConfig.js";import{sleep as z}from"../sleep.js";import{getUserBinDir as X,getXDGCacheHome as Y,getXDGDataHome as J,getXDGStateHome as Q}from"../xdg.js";import{downloadVersion as Z,getLatestVersion as ee}from"./download.js";import{acquireProcessLifetimeLock as te,cleanupStaleLocks as ae,isLockActive as ie,isPidBasedLockingEnabled as re,readLockContent as oe,withLock as se}from"./pidLock.js";export const VERSION_RETENTION_COUNT=2;const ne=6048e5;export function getPlatform(){const e=N.platform,t="x64"===process.arch?"x64":"arm64"===process.arch?"arm64":null;if(!t){const e=new Error(`Unsupported architecture: ${process.arch}`);throw L(`Native installer does not support architecture: ${process.arch}`,{level:"error"}),e}return"linux"===e&&V.isMuslEnvironment()?`linux-${t}-musl`:`${e}-${t}`}export function getBinaryName(e){return e.startsWith("win32")?"claude.exe":"claude"}function getBaseDirectories(){const e=getBinaryName(getPlatform());return{versions:k(J(),"claude","versions"),staging:k(Y(),"claude","staging"),locks:k(Q(),"claude","locks"),executable:k(X(),e)}}async function isPossibleClaudeBinary(e){try{const i=await p(e);return!(!i.isFile()||0===i.size||(await a(e,t.X_OK),0))}catch{return!1}}async function getVersionPaths(e){const t=getBaseDirectories(),a=[t.versions,t.staging,t.locks];await Promise.all(a.map(e=>s(e,{recursive:!0})));const i=v(t.executable);await s(i,{recursive:!0});const r=k(t.versions,e);try{await p(r)}catch{await _(r,"",{encoding:"utf8"})}return{stagingPath:k(t.staging,e),installPath:r}}async function tryWithVersionLock(e,t,a=0){const i=getBaseDirectories(),r=getLockFilePathFromVersionPath(i,e);if(await s(i.locks,{recursive:!0}),re()){let i=0;const o=a+1,s=a>0?1e3:100,n=a>0?5e3:500;for(;i<o;){if(await se(e,r,async()=>{try{await t()}catch(e){throw M(e),e}}))return b("tengu_version_lock_acquired",{is_pid_based:!0,is_lifetime_lock:!1,attempts:i+1}),!0;if(i++,i<o){const e=Math.min(s*Math.pow(2,i-1),n);await z(e)}}return b("tengu_version_lock_failed",{is_pid_based:!0,is_lifetime_lock:!1,attempts:o}),logLockAcquisitionError(e,new Error("Lock held by another process")),!1}let o=null;try{try{o=await O.lock(e,{stale:ne,retries:{retries:a,minTimeout:a>0?1e3:100,maxTimeout:a>0?5e3:500},lockfilePath:r,onCompromised:e=>{L(`NON-FATAL: Version lock was compromised during operation: ${e.message}`,{level:"info"})}})}catch(t){return b("tengu_version_lock_failed",{is_pid_based:!1,is_lifetime_lock:!1}),logLockAcquisitionError(e,t),!1}try{return await t(),b("tengu_version_lock_acquired",{is_pid_based:!1,is_lifetime_lock:!1}),!0}catch(e){throw M(e),e}}finally{o&&await o()}}async function atomicMoveToInstallPath(e,t){await s(v(t),{recursive:!0});const a=`${t}.tmp.${process.pid}.${Date.now()}`;try{await r(e,a),await i(a,493),await u(a,t),L(`Atomically installed binary to ${t}`)}catch(e){try{await g(a)}catch{}throw e}}async function installVersion(e,t,a){"npm"===a?await async function(e,t){try{const a=k(e,"node_modules","@anthropic-ai"),i=(await n(a)).find(e=>e.startsWith("claude-cli-native-"));if(!i)throw b("tengu_native_install_package_failure",{stage_find_package:!0,error_package_not_found:!0}),new Error("Could not find platform-specific native package");const r=k(a,i,"cli");try{await p(r)}catch{throw b("tengu_native_install_package_failure",{stage_binary_exists:!0,error_binary_not_found:!0}),new Error("Native binary not found in staged package")}await atomicMoveToInstallPath(r,t),await d(e,{recursive:!0,force:!0}),b("tengu_native_install_package_success",{})}catch(e){const t=D(e);throw t.includes("Could not find platform-specific")||t.includes("Native binary not found")||b("tengu_native_install_package_failure",{stage_atomic_move:!0,error_move_failed:!0}),M(B(e)),e}}(e,t):await async function(e,t){try{const a=getBinaryName(getPlatform()),i=k(e,a);try{await p(i)}catch{throw b("tengu_native_install_binary_failure",{stage_binary_exists:!0,error_binary_not_found:!0}),new Error("Staged binary not found")}await atomicMoveToInstallPath(i,t),await d(e,{recursive:!0,force:!0}),b("tengu_native_install_binary_success",{})}catch(e){throw D(e).includes("Staged binary not found")||b("tengu_native_install_binary_failure",{stage_atomic_move:!0,error_move_failed:!0}),M(B(e)),e}}(e,t)}async function performVersionUpdate(e,t){const{stagingPath:a,installPath:i}=await getVersionPaths(e),{executable:o}=getBaseDirectories(),n=T(process.env.ENABLE_LOCKLESS_UPDATES)?`${a}.${process.pid}.${Date.now()}`:a,l=!await versionIsAvailable(e)||t;if(l){L(t?`Force reinstalling native installer version ${e}`:`Downloading native installer version ${e}`);const a=await Z(e,n);await installVersion(n,i,a)}else L(`Version ${e} already installed, updating symlink`);if(await removeDirectoryIfEmpty(o),await async function(e,t){const a=void 0;if(getPlatform().startsWith("win32"))try{const a=v(e);let i;await s(a,{recursive:!0});try{i=await p(e)}catch{}if(i){try{const e=await p(t);if(i.size===e.size)return!1}catch{}const a=`${e}.old.${Date.now()}`;await u(e,a);try{await r(t,e);try{await g(a)}catch{}}catch(t){try{await u(a,e)}catch(e){const a=new Error(`Failed to restore old executable: ${e}`,{cause:t});throw M(a),a}throw t}}else try{await r(t,e)}catch(e){if(R(e))throw new Error(`Source file does not exist: ${t}`);throw e}return!0}catch(a){return M(new Error(`Failed to copy executable from ${t} to ${e}: ${a}`)),!1}const i=v(e);try{await s(i,{recursive:!0}),L(`Created directory ${i} for symlink`)}catch(e){return M(new Error(`Failed to create directory ${i}: ${e}`)),!1}try{let a=!1;try{await p(e),a=!0}catch{}if(a){try{const a=await c(e);if($(v(e),a)===$(t))return!1}catch{}await g(e)}}catch(e){M(new Error(`Failed to check/remove existing symlink: ${e}`))}const o=`${e}.tmp.${process.pid}.${Date.now()}`;try{return await f(t,o),await u(o,e),L(`Atomically updated symlink ${e} -> ${t}`),!0}catch(a){try{await g(o)}catch{}return M(new Error(`Failed to create symlink from ${e} to ${t}: ${a}`)),!1}}(o,i),!await isPossibleClaudeBinary(o)){let e=!1;try{await p(i),e=!0}catch{}throw new Error(`Failed to create executable at ${o}. Source file exists: ${e}. Check write permissions to ${o}.`)}return l}async function versionIsAvailable(e){const{installPath:t}=await getVersionPaths(e);return isPossibleClaudeBinary(t)}export async function removeDirectoryIfEmpty(e){try{await m(e),L(`Removed empty directory at ${e}`)}catch(t){const a=S(t);"ENOTDIR"!==a&&"ENOENT"!==a&&"ENOTEMPTY"!==a&&L(`Could not remove directory at ${e}: ${t}`)}}export async function checkInstall(e=!1){if(T(process.env.DISABLE_INSTALLATION_CHECKS))return[];const t=await C();if("development"===t)return[];const i=A();if(!e&&"native"!==t&&"native"!==i.installMethod)return[];const r=getBaseDirectories(),o=[],s=v(r.executable),n=$(s),l=getPlatform().startsWith("win32");try{await a(s)}catch{o.push({message:`installMethod is native, but directory ${s} does not exist`,userActionRequired:!0,type:"error"})}if(l)await isPossibleClaudeBinary(r.executable)||o.push({message:`installMethod is native, but claude command is missing or invalid at ${r.executable}`,userActionRequired:!0,type:"error"});else try{const e=await c(r.executable),t=$(v(r.executable),e);await isPossibleClaudeBinary(t)||o.push({message:`Claude symlink points to missing or invalid binary: ${e}`,userActionRequired:!0,type:"error"})}catch(e){R(e)?o.push({message:`installMethod is native, but claude command not found at ${r.executable}`,userActionRequired:!0,type:"error"}):await isPossibleClaudeBinary(r.executable)||o.push({message:`${r.executable} exists but is not a valid Claude binary`,userActionRequired:!0,type:"error"})}if(!(process.env.PATH||"").split(y).some(e=>{try{const t=$(e);return l?t.toLowerCase()===n.toLowerCase():t===n}catch{return!1}}))if(l){const e=s.replace(/\//g,"\\");o.push({message:`Native installation exists but ${e} is not in your PATH. Add it by opening: System Properties → Environment Variables → Edit User PATH → New → Add the path above. Then restart your terminal.`,userActionRequired:!0,type:"path"})}else{const e=j(),t=W()[e],a=t?t.replace(w(),"~"):"your shell config file";o.push({message:`Native installation exists but ~/.local/bin is not in your PATH. Run:\n\necho 'export PATH="$HOME/.local/bin:$PATH"' >> ${a} && source ${a}`,userActionRequired:!0,type:"path"})}return o}let ce=null;export function installLatest(e,t=!1){if(t)return installLatestImpl(e,t);if(ce)return L("installLatest: joining in-flight call"),ce;const a=installLatestImpl(e,t);ce=a;const clear=()=>{ce=null};return a.then(clear,clear),a}async function installLatestImpl(t,a=!1){const i=await async function(t,a=!1){const i=Date.now();let r=await ee(t);const{executable:o}=getBaseDirectories();if(L(`Checking for native installer update to version ${r}`),!a){const t=await P();if(t&&q(r,t)){if(L(`Native installer: maxVersion ${t} is set, capping update from ${r} to ${t}`),U(e.VERSION,t))return L(`Native installer: current version ${e.VERSION} is already at or above maxVersion ${t}, skipping update`),b("tengu_native_update_skipped_max_version",{latency_ms:Date.now()-i,max_version:t,available_version:r}),{success:!0,latestVersion:r};r=t}}if(!a&&r===e.VERSION&&await versionIsAvailable(r)&&await isPossibleClaudeBinary(o))return L(`Found ${r} at ${o}, skipping install`),b("tengu_native_update_complete",{latency_ms:Date.now()-i,was_new_install:!1,was_force_reinstall:!1,was_already_running:!0}),{success:!0,latestVersion:r};if(!a&&x(r))return b("tengu_native_update_skipped_minimum_version",{latency_ms:Date.now()-i,target_version:r}),{success:!0,latestVersion:r};let s,n=!1;if(T(process.env.ENABLE_LOCKLESS_UPDATES))n=await performVersionUpdate(r,a),s=Date.now()-i;else{const{installPath:e}=await getVersionPaths(r);a&&await async function(e){const t=getLockFilePathFromVersionPath(getBaseDirectories(),e);try{await g(t),L(`Force-removed lock file at ${t}`)}catch(e){L(`Failed to force-remove lock file: ${D(e)}`)}}(e);const t=await tryWithVersionLock(e,async()=>{n=await performVersionUpdate(r,a)},3);if(s=Date.now()-i,!t){const t=getBaseDirectories();let a;if(re()){const i=getLockFilePathFromVersionPath(t,e);ie(i)&&(a=oe(i)?.pid)}return b("tengu_native_update_lock_failed",{latency_ms:s,lock_holder_pid:a}),{success:!1,latestVersion:r,lockFailed:!0,lockHolderPid:a}}}return b("tengu_native_update_complete",{latency_ms:s,was_new_install:n,was_force_reinstall:a}),L(`Successfully updated to version ${r}`),{success:!0,latestVersion:r}}(t,a);return i.success?("native"!==A().installMethod&&(F(e=>({...e,installMethod:"native",autoUpdates:!1,autoUpdatesProtectedForNative:!0})),L('Native installer: Set installMethod to "native" and disabled legacy auto-updater for protection')),cleanupOldVersions(),{latestVersion:i.latestVersion,wasUpdated:i.success,lockFailed:!1}):{latestVersion:null,wasUpdated:!1,lockFailed:i.lockFailed,lockHolderPid:i.lockHolderPid}}function getLockFilePathFromVersionPath(e,t){const a=h(t);return k(e.locks,`${a}.lock`)}export async function lockCurrentVersion(){const e=getBaseDirectories();if(!process.execPath.includes(e.versions))return;const t=$(process.execPath);try{const a=getLockFilePathFromVersionPath(e,t);if(await s(e.locks,{recursive:!0}),re()){if(!await te(t,a))return b("tengu_version_lock_failed",{is_pid_based:!0,is_lifetime_lock:!0}),void logLockAcquisitionError(t,new Error("Lock already held by another process"));b("tengu_version_lock_acquired",{is_pid_based:!0,is_lifetime_lock:!0}),L(`Acquired PID lock on running version: ${t}`)}else{let i;try{i=await O.lock(t,{stale:ne,retries:0,lockfilePath:a,onCompromised:e=>{L(`NON-FATAL: Lock on running version was compromised: ${e.message}`,{level:"info"})}}),b("tengu_version_lock_acquired",{is_pid_based:!1,is_lifetime_lock:!0}),L(`Acquired mtime-based lock on running version: ${t}`),E(async()=>{try{await(i?.())}catch{}})}catch(e){return R(e)?void L(`Cannot lock current version - file does not exist: ${t}`,{level:"info"}):(b("tengu_version_lock_failed",{is_pid_based:!1,is_lifetime_lock:!0}),void logLockAcquisitionError(t,e))}}}catch(e){if(R(e))return void L(`Cannot lock current version - file does not exist: ${t}`,{level:"info"});L(`NON-FATAL: Failed to lock current version during execution ${D(e)}`,{level:"info"})}}function logLockAcquisitionError(e,t){M(new Error(`NON-FATAL: Lock acquisition failed for ${e} (expected in multi-process scenarios)`,{cause:t}))}export async function cleanupOldVersions(){await Promise.resolve();const e=getBaseDirectories(),t=Date.now()-36e5;if(getPlatform().startsWith("win32")){const t=v(e.executable);try{const e=await n(t);let a=0;for(const i of e)if(/^claude\.exe\.old\.\d+$/.test(i))try{await g(k(t,i)),a++}catch{}a>0&&L(`Cleaned up ${a} old Windows executables on startup`)}catch(e){R(e)||L(`Failed to clean up old Windows executables: ${e}`)}}try{const a=await n(e.staging);let i=0;for(const r of a){const a=k(e.staging,r);try{(await p(a)).mtime.getTime()<t&&(await d(a,{recursive:!0,force:!0}),i++,L(`Cleaned up old staging directory: ${r}`))}catch{}}i>0&&(L(`Cleaned up ${i} orphaned staging directories`),b("tengu_native_staging_cleanup",{cleaned_count:i}))}catch(e){R(e)||L(`Failed to clean up staging directories: ${e}`)}if(re()){const t=ae(e.locks);t>0&&(L(`Cleaned up ${t} stale version locks`),b("tengu_native_stale_locks_cleanup",{cleaned_count:t}))}let a;try{a=await n(e.versions)}catch(e){return void(R(e)||L(`Failed to readdir versions directory: ${e}`))}const i=[];let r=0;for(const o of a){const a=k(e.versions,o);if(/\.tmp\.\d+\.\d+$/.test(o))try{(await p(a)).mtime.getTime()<t&&(await g(a),r++,L(`Cleaned up orphaned temp install file: ${o}`))}catch{}else try{const e=await p(a);if(!e.isFile())continue;if("win32"!==process.platform&&e.size>0&&!(73&e.mode))continue;i.push({name:o,path:a,resolvedPath:$(a),mtime:e.mtime})}catch{}}if(r>0&&(L(`Cleaned up ${r} orphaned temp install files`),b("tengu_native_temp_files_cleanup",{cleaned_count:r})),0!==i.length)try{const t=process.execPath,a=new Set;t&&t.includes(e.versions)&&a.add($(t));const r=await async function(e){try{const t=await c(e),a=$(v(e),t);if(await isPossibleClaudeBinary(a))return a}catch{}return null}(e.executable);r&&a.add(r);for(const t of i){if(a.has(t.resolvedPath))continue;const i=getLockFilePathFromVersionPath(e,t.resolvedPath);let r=!1;if(re())r=ie(i);else try{r=await O.check(t.resolvedPath,{stale:ne,lockfilePath:i})}catch{r=!1}r&&(a.add(t.resolvedPath),L(`Protecting locked version from cleanup: ${t.name}`))}const o=i.filter(e=>!a.has(e.resolvedPath)).sort((e,t)=>t.mtime.getTime()-e.mtime.getTime()).slice(2);if(0===o.length)return void b("tengu_native_version_cleanup",{total_count:i.length,deleted_count:0,protected_count:a.size,retained_count:2,lock_failed_count:0,error_count:0});let s=0,n=0,l=0;await Promise.all(o.map(async e=>{try{await tryWithVersionLock(e.path,async()=>{await g(e.path)})?s++:(n++,L(`Skipping deletion of ${e.name} - locked by another process`))}catch(t){l++,M(new Error(`Failed to delete version ${e.name}: ${t}`))}})),b("tengu_native_version_cleanup",{total_count:i.length,deleted_count:s,protected_count:a.size,retained_count:2,lock_failed_count:n,error_count:l})}catch(e){R(e)||M(new Error(`Version cleanup failed: ${e}`))}}export async function removeInstalledSymlink(){const e=getBaseDirectories();try{if(await async function(e){let t=e;return(await o(e)).isSymbolicLink()&&(t=await l(e)),t.endsWith(".js")||t.includes("node_modules")}(e.executable))return void L(`Skipping removal of ${e.executable} - appears to be npm-managed`);await g(e.executable),L(`Removed claude symlink at ${e.executable}`)}catch(e){if(R(e))return;M(new Error(`Failed to remove claude symlink: ${e}`))}}export async function cleanupShellAliases(){const e=[],t=W();for(const[a,i]of Object.entries(t))try{const t=await G(i);if(!t)continue;const{filtered:r,hadAlias:o}=H(t);o&&(await K(i,r),e.push({message:`Removed claude alias from ${i}. Run: unalias claude`,userActionRequired:!0,type:"alias"}),L(`Cleaned up claude alias from ${a} config`))}catch(t){M(t),e.push({message:`Failed to clean up ${i}: ${t}`,userActionRequired:!1,type:"error"})}return e}async function attemptNpmUninstall(e){const{code:t,stderr:a}=await I("npm",["uninstall","-g",e],{cwd:process.cwd()});if(0===t)return L(`Removed global npm installation of ${e}`),{success:!0};if(a&&!a.includes("npm ERR! code E404")){if(a.includes("npm error code ENOTEMPTY")){L(`Failed to uninstall global npm package ${e}: ${a}`,{level:"error"}),L("Attempting manual removal due to ENOTEMPTY error");const t=await async function(e){try{const t=await I("npm",["config","get","prefix"]);if(0!==t.code||!t.stdout)return{success:!1,error:"Failed to get npm global prefix"};const a=t.stdout.trim();let i=!1;async function tryRemove(e,t){try{return await g(e),L(`Manually removed ${t}: ${e}`),!0}catch{return!1}}if(getPlatform().startsWith("win32")){const r=k(a,"claude.cmd"),o=k(a,"claude.ps1"),s=k(a,"claude");await tryRemove(r,"bin script")&&(i=!0),await tryRemove(o,"PowerShell script")&&(i=!0),await tryRemove(s,"bin executable")&&(i=!0)}else{const n=k(a,"bin","claude");await tryRemove(n,"bin symlink")&&(i=!0)}return i?(L(`Successfully removed ${e} manually`),{success:!0,warning:`${e} executables removed, but node_modules directory was left intact for safety. You may manually delete it later at: ${getPlatform().startsWith("win32")?k(a,"node_modules",e):k(a,"lib","node_modules",e)}`}):{success:!1}}catch(c){return L(`Manual removal failed: ${c}`,{level:"error"}),{success:!1,error:`Manual removal failed: ${c}`}}}(e);if(t.success)return{success:!0,warning:t.warning};if(t.error)return{success:!1,error:`Failed to remove global npm installation of ${e}: ${a}. Manual removal also failed: ${t.error}`}}return L(`Failed to uninstall global npm package ${e}: ${a}`,{level:"error"}),{success:!1,error:`Failed to remove global npm installation of ${e}: ${a}`}}return{success:!1}}export async function cleanupNpmInstallations(){const t=[],a=[];let i=0;const r=await attemptNpmUninstall("@anthropic-ai/claude-code");if(r.success?(i++,r.warning&&a.push(r.warning)):r.error&&t.push(r.error),e.PACKAGE_URL&&"@anthropic-ai/claude-code"!==e.PACKAGE_URL){const r=await attemptNpmUninstall(e.PACKAGE_URL);r.success?(i++,r.warning&&a.push(r.warning)):r.error&&t.push(r.error)}const o=k(w(),".context","local");try{await d(o,{recursive:!0}),i++,L(`Removed local installation at ${o}`)}catch(a){R(a)||(t.push(`Failed to remove ${o}: ${a}`),L(`Failed to remove local installation: ${a}`,{level:"error"}))}return{removed:i,errors:t,warnings:a}}
1
+ import{MACRO as e}from"../../recovery/bunBundleShim.js";import{constants as t}from"fs";import{access as a,chmod as i,copyFile as r,lstat as o,mkdir as n,readdir as s,readlink as c,realpath as l,rename as u,rm as d,rmdir as m,stat as p,symlink as f,unlink as _,writeFile as w}from"fs/promises";import{homedir as h}from"os";import{basename as y,delimiter as g,dirname as v,join as $,resolve as k}from"path";import{logEvent as b}from"../../services/analytics/index.js";import{getMaxVersion as P,shouldSkipVersion as x}from"../autoUpdater.js";import{registerCleanup as E}from"../cleanupRegistry.js";import{getGlobalConfig as A,saveGlobalConfig as F}from"../config.js";import{logForDebugging as L}from"../debug.js";import{getCurrentInstallationType as N}from"../doctorDiagnostic.js";import{env as C}from"../env.js";import{envDynamic as V}from"../envDynamic.js";import{isEnvTruthy as T}from"../envUtils.js";import{errorMessage as R,getErrnoCode as D,isENOENT as S,toError as B}from"../errors.js";import{execFileNoThrowWithCwd as I}from"../execFileNoThrow.js";import{getShellType as j}from"../localInstaller.js";import*as O from"../lockfile.js";import{logError as q}from"../log.js";import{gt as M,gte as U}from"../semver.js";import{filterClaudeAliases as W,getShellConfigPaths as H,readFileLines as K,writeFileLines as z}from"../shellConfig.js";import{sleep as Y}from"../sleep.js";import{getUserBinDir as G,getXDGCacheHome as X,getXDGDataHome as J,getXDGStateHome as Q}from"../xdg.js";import{downloadVersion as Z,getLatestVersion as ee}from"./download.js";import{acquireProcessLifetimeLock as te,cleanupStaleLocks as ae,isLockActive as ie,isPidBasedLockingEnabled as re,readLockContent as oe,withLock as ne}from"./pidLock.js";export const VERSION_RETENTION_COUNT=2;const se=6048e5;export function getPlatform(){const e=C.platform,t="x64"===process.arch?"x64":"arm64"===process.arch?"arm64":null;if(!t){const e=new Error(`Unsupported architecture: ${process.arch}`);throw L(`Native installer does not support architecture: ${process.arch}`,{level:"error"}),e}return"linux"===e&&V.isMuslEnvironment()?`linux-${t}-musl`:`${e}-${t}`}export function getBinaryName(e){return e.startsWith("win32")?"claude.exe":"claude"}function getBaseDirectories(){const e=getBinaryName(getPlatform());return{versions:$(J(),"claude","versions"),staging:$(X(),"claude","staging"),locks:$(Q(),"claude","locks"),executable:$(G(),e)}}async function isPossibleClaudeBinary(e){try{const i=await p(e);return!(!i.isFile()||0===i.size)&&(await a(e,t.X_OK),!0)}catch{return!1}}async function getVersionPaths(e){const t=getBaseDirectories(),a=[t.versions,t.staging,t.locks];await Promise.all(a.map(e=>n(e,{recursive:!0})));const i=v(t.executable);await n(i,{recursive:!0});const r=$(t.versions,e);try{await p(r)}catch{await w(r,"",{encoding:"utf8"})}return{stagingPath:$(t.staging,e),installPath:r}}async function tryWithVersionLock(e,t,a=0){const i=getBaseDirectories(),r=getLockFilePathFromVersionPath(i,e);if(await n(i.locks,{recursive:!0}),re()){let i=0;const o=a+1,n=a>0?1e3:100,s=a>0?5e3:500;for(;i<o;){if(await ne(e,r,async()=>{try{await t()}catch(e){throw q(e),e}}))return b("tengu_version_lock_acquired",{is_pid_based:!0,is_lifetime_lock:!1,attempts:i+1}),!0;if(i++,i<o){const e=Math.min(n*Math.pow(2,i-1),s);await Y(e)}}return b("tengu_version_lock_failed",{is_pid_based:!0,is_lifetime_lock:!1,attempts:o}),logLockAcquisitionError(e,new Error("Lock held by another process")),!1}let o=null;try{try{o=await O.lock(e,{stale:se,retries:{retries:a,minTimeout:a>0?1e3:100,maxTimeout:a>0?5e3:500},lockfilePath:r,onCompromised:e=>{L(`NON-FATAL: Version lock was compromised during operation: ${e.message}`,{level:"info"})}})}catch(t){return b("tengu_version_lock_failed",{is_pid_based:!1,is_lifetime_lock:!1}),logLockAcquisitionError(e,t),!1}try{return await t(),b("tengu_version_lock_acquired",{is_pid_based:!1,is_lifetime_lock:!1}),!0}catch(e){throw q(e),e}}finally{o&&await o()}}async function atomicMoveToInstallPath(e,t){await n(v(t),{recursive:!0});const a=`${t}.tmp.${process.pid}.${Date.now()}`;try{await r(e,a),await i(a,493),await u(a,t),L(`Atomically installed binary to ${t}`)}catch(e){try{await _(a)}catch{}throw e}}async function installVersion(e,t,a){"npm"===a?await async function(e,t){try{const a=$(e,"node_modules","@anthropic-ai"),i=(await s(a)).find(e=>e.startsWith("claude-cli-native-"));if(!i)throw b("tengu_native_install_package_failure",{stage_find_package:!0,error_package_not_found:!0}),new Error("Could not find platform-specific native package");const r=$(a,i,"cli");try{await p(r)}catch{throw b("tengu_native_install_package_failure",{stage_binary_exists:!0,error_binary_not_found:!0}),new Error("Native binary not found in staged package")}await atomicMoveToInstallPath(r,t),await d(e,{recursive:!0,force:!0}),b("tengu_native_install_package_success",{})}catch(e){const t=R(e);throw t.includes("Could not find platform-specific")||t.includes("Native binary not found")||b("tengu_native_install_package_failure",{stage_atomic_move:!0,error_move_failed:!0}),q(B(e)),e}}(e,t):await async function(e,t){try{const a=getBinaryName(getPlatform()),i=$(e,a);try{await p(i)}catch{throw b("tengu_native_install_binary_failure",{stage_binary_exists:!0,error_binary_not_found:!0}),new Error("Staged binary not found")}await atomicMoveToInstallPath(i,t),await d(e,{recursive:!0,force:!0}),b("tengu_native_install_binary_success",{})}catch(e){throw R(e).includes("Staged binary not found")||b("tengu_native_install_binary_failure",{stage_atomic_move:!0,error_move_failed:!0}),q(B(e)),e}}(e,t)}async function performVersionUpdate(e,t){const{stagingPath:a,installPath:i}=await getVersionPaths(e),{executable:o}=getBaseDirectories(),s=T(process.env.ENABLE_LOCKLESS_UPDATES)?`${a}.${process.pid}.${Date.now()}`:a,l=!await versionIsAvailable(e)||t;if(l){L(t?`Force reinstalling native installer version ${e}`:`Downloading native installer version ${e}`);const a=await Z(e,s);await installVersion(s,i,a)}else L(`Version ${e} already installed, updating symlink`);if(await removeDirectoryIfEmpty(o),await async function(e,t){const a=getPlatform();if(a.startsWith("win32"))try{const a=v(e);let i;await n(a,{recursive:!0});try{i=await p(e)}catch{}if(i){try{const e=await p(t);if(i.size===e.size)return!1}catch{}const a=`${e}.old.${Date.now()}`;await u(e,a);try{await r(t,e);try{await _(a)}catch{}}catch(t){try{await u(a,e)}catch(e){const a=new Error(`Failed to restore old executable: ${e}`,{cause:t});throw q(a),a}throw t}}else try{await r(t,e)}catch(e){if(S(e))throw new Error(`Source file does not exist: ${t}`);throw e}return!0}catch(a){return q(new Error(`Failed to copy executable from ${t} to ${e}: ${a}`)),!1}const i=v(e);try{await n(i,{recursive:!0}),L(`Created directory ${i} for symlink`)}catch(e){return q(new Error(`Failed to create directory ${i}: ${e}`)),!1}try{let a=!1;try{await p(e),a=!0}catch{}if(a){try{const a=await c(e),i=k(v(e),a);if(i===k(t))return!1}catch{}await _(e)}}catch(e){q(new Error(`Failed to check/remove existing symlink: ${e}`))}const o=`${e}.tmp.${process.pid}.${Date.now()}`;try{return await f(t,o),await u(o,e),L(`Atomically updated symlink ${e} -> ${t}`),!0}catch(a){try{await _(o)}catch{}return q(new Error(`Failed to create symlink from ${e} to ${t}: ${a}`)),!1}}(o,i),!await isPossibleClaudeBinary(o)){let e=!1;try{await p(i),e=!0}catch{}throw new Error(`Failed to create executable at ${o}. Source file exists: ${e}. Check write permissions to ${o}.`)}return l}async function versionIsAvailable(e){const{installPath:t}=await getVersionPaths(e);return isPossibleClaudeBinary(t)}async function updateLatest(t,a=!1){const i=Date.now();let r=await ee(t);const{executable:o}=getBaseDirectories();if(L(`Checking for native installer update to version ${r}`),!a){const t=await P();if(t&&M(r,t)){if(L(`Native installer: maxVersion ${t} is set, capping update from ${r} to ${t}`),U(e.VERSION,t))return L(`Native installer: current version ${e.VERSION} is already at or above maxVersion ${t}, skipping update`),b("tengu_native_update_skipped_max_version",{latency_ms:Date.now()-i,max_version:t,available_version:r}),{success:!0,latestVersion:r};r=t}}if(!a&&r===e.VERSION&&await versionIsAvailable(r)&&await isPossibleClaudeBinary(o))return L(`Found ${r} at ${o}, skipping install`),b("tengu_native_update_complete",{latency_ms:Date.now()-i,was_new_install:!1,was_force_reinstall:!1,was_already_running:!0}),{success:!0,latestVersion:r};if(!a&&x(r))return b("tengu_native_update_skipped_minimum_version",{latency_ms:Date.now()-i,target_version:r}),{success:!0,latestVersion:r};let n,s=!1;if(T(process.env.ENABLE_LOCKLESS_UPDATES))s=await performVersionUpdate(r,a),n=Date.now()-i;else{const{installPath:e}=await getVersionPaths(r);a&&await async function(e){const t=getLockFilePathFromVersionPath(getBaseDirectories(),e);try{await _(t),L(`Force-removed lock file at ${t}`)}catch(e){L(`Failed to force-remove lock file: ${R(e)}`)}}(e);const t=await tryWithVersionLock(e,async()=>{s=await performVersionUpdate(r,a)},3);if(n=Date.now()-i,!t){const t=getBaseDirectories();let a;if(re()){const i=getLockFilePathFromVersionPath(t,e);ie(i)&&(a=oe(i)?.pid)}return b("tengu_native_update_lock_failed",{latency_ms:n,lock_holder_pid:a}),{success:!1,latestVersion:r,lockFailed:!0,lockHolderPid:a}}}return b("tengu_native_update_complete",{latency_ms:n,was_new_install:s,was_force_reinstall:a}),L(`Successfully updated to version ${r}`),{success:!0,latestVersion:r}}export async function removeDirectoryIfEmpty(e){try{await m(e),L(`Removed empty directory at ${e}`)}catch(t){const a=D(t);"ENOTDIR"!==a&&"ENOENT"!==a&&"ENOTEMPTY"!==a&&L(`Could not remove directory at ${e}: ${t}`)}}export async function checkInstall(e=!1){if(T(process.env.DISABLE_INSTALLATION_CHECKS))return[];const t=await N();if("development"===t)return[];const i=A();if(!(e||"native"===t||"native"===i.installMethod))return[];const r=getBaseDirectories(),o=[],n=v(r.executable),s=k(n),l=getPlatform().startsWith("win32");try{await a(n)}catch{o.push({message:`installMethod is native, but directory ${n} does not exist`,userActionRequired:!0,type:"error"})}if(l)await isPossibleClaudeBinary(r.executable)||o.push({message:`installMethod is native, but claude command is missing or invalid at ${r.executable}`,userActionRequired:!0,type:"error"});else try{const e=await c(r.executable),t=k(v(r.executable),e);await isPossibleClaudeBinary(t)||o.push({message:`Claude symlink points to missing or invalid binary: ${e}`,userActionRequired:!0,type:"error"})}catch(e){S(e)?o.push({message:`installMethod is native, but claude command not found at ${r.executable}`,userActionRequired:!0,type:"error"}):await isPossibleClaudeBinary(r.executable)||o.push({message:`${r.executable} exists but is not a valid Claude binary`,userActionRequired:!0,type:"error"})}if(!(process.env.PATH||"").split(g).some(e=>{try{const t=k(e);return l?t.toLowerCase()===s.toLowerCase():t===s}catch{return!1}}))if(l){const e=n.replace(/\//g,"\\");o.push({message:`Native installation exists but ${e} is not in your PATH. Add it by opening: System Properties → Environment Variables → Edit User PATH → New → Add the path above. Then restart your terminal.`,userActionRequired:!0,type:"path"})}else{const e=j(),t=H()[e],a=t?t.replace(h(),"~"):"your shell config file";o.push({message:`Native installation exists but ~/.local/bin is not in your PATH. Run:\n\necho 'export PATH="$HOME/.local/bin:$PATH"' >> ${a} && source ${a}`,userActionRequired:!0,type:"path"})}return o}let ce=null;export function installLatest(e,t=!1){if(t)return installLatestImpl(e,t);if(ce)return L("installLatest: joining in-flight call"),ce;const a=installLatestImpl(e,t);ce=a;const clear=()=>{ce=null};return a.then(clear,clear),a}async function installLatestImpl(e,t=!1){const a=await updateLatest(e,t);if(!a.success)return{latestVersion:null,wasUpdated:!1,lockFailed:a.lockFailed,lockHolderPid:a.lockHolderPid};return"native"!==A().installMethod&&(F(e=>({...e,installMethod:"native",autoUpdates:!1,autoUpdatesProtectedForNative:!0})),L('Native installer: Set installMethod to "native" and disabled legacy auto-updater for protection')),cleanupOldVersions(),{latestVersion:a.latestVersion,wasUpdated:a.success,lockFailed:!1}}function getLockFilePathFromVersionPath(e,t){const a=y(t);return $(e.locks,`${a}.lock`)}export async function lockCurrentVersion(){const e=getBaseDirectories();if(!process.execPath.includes(e.versions))return;const t=k(process.execPath);try{const a=getLockFilePathFromVersionPath(e,t);if(await n(e.locks,{recursive:!0}),re()){if(!await te(t,a))return b("tengu_version_lock_failed",{is_pid_based:!0,is_lifetime_lock:!0}),void logLockAcquisitionError(t,new Error("Lock already held by another process"));b("tengu_version_lock_acquired",{is_pid_based:!0,is_lifetime_lock:!0}),L(`Acquired PID lock on running version: ${t}`)}else{let e;try{e=await O.lock(t,{stale:se,retries:0,lockfilePath:a,onCompromised:e=>{L(`NON-FATAL: Lock on running version was compromised: ${e.message}`,{level:"info"})}}),b("tengu_version_lock_acquired",{is_pid_based:!1,is_lifetime_lock:!0}),L(`Acquired mtime-based lock on running version: ${t}`),E(async()=>{try{await(e?.())}catch{}})}catch(e){return S(e)?void L(`Cannot lock current version - file does not exist: ${t}`,{level:"info"}):(b("tengu_version_lock_failed",{is_pid_based:!1,is_lifetime_lock:!0}),void logLockAcquisitionError(t,e))}}}catch(e){if(S(e))return void L(`Cannot lock current version - file does not exist: ${t}`,{level:"info"});L(`NON-FATAL: Failed to lock current version during execution ${R(e)}`,{level:"info"})}}function logLockAcquisitionError(e,t){q(new Error(`NON-FATAL: Lock acquisition failed for ${e} (expected in multi-process scenarios)`,{cause:t}))}export async function cleanupOldVersions(){await Promise.resolve();const e=getBaseDirectories(),t=Date.now()-36e5;if(getPlatform().startsWith("win32")){const t=v(e.executable);try{const e=await s(t);let a=0;for(const i of e)if(/^claude\.exe\.old\.\d+$/.test(i))try{await _($(t,i)),a++}catch{}a>0&&L(`Cleaned up ${a} old Windows executables on startup`)}catch(e){S(e)||L(`Failed to clean up old Windows executables: ${e}`)}}try{const a=await s(e.staging);let i=0;for(const r of a){const a=$(e.staging,r);try{(await p(a)).mtime.getTime()<t&&(await d(a,{recursive:!0,force:!0}),i++,L(`Cleaned up old staging directory: ${r}`))}catch{}}i>0&&(L(`Cleaned up ${i} orphaned staging directories`),b("tengu_native_staging_cleanup",{cleaned_count:i}))}catch(e){S(e)||L(`Failed to clean up staging directories: ${e}`)}if(re()){const t=ae(e.locks);t>0&&(L(`Cleaned up ${t} stale version locks`),b("tengu_native_stale_locks_cleanup",{cleaned_count:t}))}let a;try{a=await s(e.versions)}catch(e){return void(S(e)||L(`Failed to readdir versions directory: ${e}`))}const i=[];let r=0;for(const o of a){const a=$(e.versions,o);if(/\.tmp\.\d+\.\d+$/.test(o))try{(await p(a)).mtime.getTime()<t&&(await _(a),r++,L(`Cleaned up orphaned temp install file: ${o}`))}catch{}else try{const e=await p(a);if(!e.isFile())continue;if("win32"!==process.platform&&e.size>0&&!(73&e.mode))continue;i.push({name:o,path:a,resolvedPath:k(a),mtime:e.mtime})}catch{}}if(r>0&&(L(`Cleaned up ${r} orphaned temp install files`),b("tengu_native_temp_files_cleanup",{cleaned_count:r})),0!==i.length)try{const t=process.execPath,a=new Set;t&&t.includes(e.versions)&&a.add(k(t));const r=await async function(e){try{const t=await c(e),a=k(v(e),t);if(await isPossibleClaudeBinary(a))return a}catch{}return null}(e.executable);r&&a.add(r);for(const t of i){if(a.has(t.resolvedPath))continue;const i=getLockFilePathFromVersionPath(e,t.resolvedPath);let r=!1;if(re())r=ie(i);else try{r=await O.check(t.resolvedPath,{stale:se,lockfilePath:i})}catch{r=!1}r&&(a.add(t.resolvedPath),L(`Protecting locked version from cleanup: ${t.name}`))}const o=i.filter(e=>!a.has(e.resolvedPath)).sort((e,t)=>t.mtime.getTime()-e.mtime.getTime()).slice(2);if(0===o.length)return void b("tengu_native_version_cleanup",{total_count:i.length,deleted_count:0,protected_count:a.size,retained_count:2,lock_failed_count:0,error_count:0});let n=0,s=0,l=0;await Promise.all(o.map(async e=>{try{await tryWithVersionLock(e.path,async()=>{await _(e.path)})?n++:(s++,L(`Skipping deletion of ${e.name} - locked by another process`))}catch(t){l++,q(new Error(`Failed to delete version ${e.name}: ${t}`))}})),b("tengu_native_version_cleanup",{total_count:i.length,deleted_count:n,protected_count:a.size,retained_count:2,lock_failed_count:s,error_count:l})}catch(e){S(e)||q(new Error(`Version cleanup failed: ${e}`))}}export async function removeInstalledSymlink(){const e=getBaseDirectories();try{if(await async function(e){let t=e;return(await o(e)).isSymbolicLink()&&(t=await l(e)),t.endsWith(".js")||t.includes("node_modules")}(e.executable))return void L(`Skipping removal of ${e.executable} - appears to be npm-managed`);await _(e.executable),L(`Removed claude symlink at ${e.executable}`)}catch(e){if(S(e))return;q(new Error(`Failed to remove claude symlink: ${e}`))}}export async function cleanupShellAliases(){const e=[],t=H();for(const[a,i]of Object.entries(t))try{const t=await K(i);if(!t)continue;const{filtered:r,hadAlias:o}=W(t);o&&(await z(i,r),e.push({message:`Removed claude alias from ${i}. Run: unalias claude`,userActionRequired:!0,type:"alias"}),L(`Cleaned up claude alias from ${a} config`))}catch(t){q(t),e.push({message:`Failed to clean up ${i}: ${t}`,userActionRequired:!1,type:"error"})}return e}async function attemptNpmUninstall(e){const{code:t,stderr:a}=await I("npm",["uninstall","-g",e],{cwd:process.cwd()});if(0===t)return L(`Removed global npm installation of ${e}`),{success:!0};if(a&&!a.includes("npm ERR! code E404")){if(a.includes("npm error code ENOTEMPTY")){L(`Failed to uninstall global npm package ${e}: ${a}`,{level:"error"}),L("Attempting manual removal due to ENOTEMPTY error");const t=await async function(e){try{const t=await I("npm",["config","get","prefix"]);if(0!==t.code||!t.stdout)return{success:!1,error:"Failed to get npm global prefix"};const a=t.stdout.trim();let i=!1;async function tryRemove(e,t){try{return await _(e),L(`Manually removed ${t}: ${e}`),!0}catch{return!1}}if(getPlatform().startsWith("win32")){const r=$(a,"claude.cmd"),o=$(a,"claude.ps1"),n=$(a,"claude");await tryRemove(r,"bin script")&&(i=!0),await tryRemove(o,"PowerShell script")&&(i=!0),await tryRemove(n,"bin executable")&&(i=!0)}else{const s=$(a,"bin","claude");await tryRemove(s,"bin symlink")&&(i=!0)}return i?(L(`Successfully removed ${e} manually`),{success:!0,warning:`${e} executables removed, but node_modules directory was left intact for safety. You may manually delete it later at: ${getPlatform().startsWith("win32")?$(a,"node_modules",e):$(a,"lib","node_modules",e)}`}):{success:!1}}catch(c){return L(`Manual removal failed: ${c}`,{level:"error"}),{success:!1,error:`Manual removal failed: ${c}`}}}(e);if(t.success)return{success:!0,warning:t.warning};if(t.error)return{success:!1,error:`Failed to remove global npm installation of ${e}: ${a}. Manual removal also failed: ${t.error}`}}return L(`Failed to uninstall global npm package ${e}: ${a}`,{level:"error"}),{success:!1,error:`Failed to remove global npm installation of ${e}: ${a}`}}return{success:!1}}export async function cleanupNpmInstallations(){const t=[],a=[];let i=0;const r=await attemptNpmUninstall("@anthropic-ai/claude-code");if(r.success?(i++,r.warning&&a.push(r.warning)):r.error&&t.push(r.error),e.PACKAGE_URL&&"@anthropic-ai/claude-code"!==e.PACKAGE_URL){const r=await attemptNpmUninstall(e.PACKAGE_URL);r.success?(i++,r.warning&&a.push(r.warning)):r.error&&t.push(r.error)}const o=$(h(),".context","local");try{await d(o,{recursive:!0}),i++,L(`Removed local installation at ${o}`)}catch(e){S(e)||(t.push(`Failed to remove ${o}: ${e}`),L(`Failed to remove local installation: ${e}`,{level:"error"}))}return{removed:i,errors:t,warnings:a}}