@iaforged/context-code 2.3.0 → 2.3.3

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 (47) hide show
  1. package/context-bootstrap.js +8 -1
  2. package/contextcode-bootstrap.js +7 -1
  3. package/dist/src/QueryEngine.js +1 -1
  4. package/dist/src/cli/handlers/auth.js +1 -1
  5. package/dist/src/cli/handlers/modelList.js +1 -1
  6. package/dist/src/cli/structuredIO.js +1 -1
  7. package/dist/src/commands/branch/index.js +1 -1
  8. package/dist/src/commands/login/login.js +1 -1
  9. package/dist/src/commands/profile/index.js +1 -1
  10. package/dist/src/commands/profile/profile.js +1 -1
  11. package/dist/src/commands/provider/index.js +1 -1
  12. package/dist/src/commands/provider/provider.js +1 -1
  13. package/dist/src/components/ConsoleOAuthFlow.js +1 -1
  14. package/dist/src/components/LogoV2/Opus1mMergeNotice.js +1 -1
  15. package/dist/src/components/ModelPicker.js +1 -1
  16. package/dist/src/components/SessionTokenFooter.js +1 -0
  17. package/dist/src/constants/oauth.js +1 -1
  18. package/dist/src/core/providers/providerCore.js +1 -1
  19. package/dist/src/hooks/useTypeahead.js +1 -1
  20. package/dist/src/main.js +1 -1
  21. package/dist/src/screens/REPL.js +1 -1
  22. package/dist/src/services/api/openai.js +1 -1
  23. package/dist/src/services/oauth/auth-code-listener.js +1 -1
  24. package/dist/src/services/oauth/client.js +1 -1
  25. package/dist/src/services/oauth/geminiCli.js +1 -1
  26. package/dist/src/utils/auth.js +1 -1
  27. package/dist/src/utils/claudeInChrome/setup.js +1 -1
  28. package/dist/src/utils/config.js +1 -1
  29. package/dist/src/utils/env.js +1 -1
  30. package/dist/src/utils/envUtils.js +1 -1
  31. package/dist/src/utils/git.js +1 -1
  32. package/dist/src/utils/localInstaller.js +1 -1
  33. package/dist/src/utils/model/configs.js +1 -1
  34. package/dist/src/utils/model/model.js +1 -1
  35. package/dist/src/utils/model/modelAllowlist.js +1 -1
  36. package/dist/src/utils/model/modelOptions.js +1 -1
  37. package/dist/src/utils/model/providerBaseUrls.js +1 -1
  38. package/dist/src/utils/model/providerCatalog.js +1 -1
  39. package/dist/src/utils/model/providerModels.js +1 -1
  40. package/dist/src/utils/model/providerProfiles.js +1 -1
  41. package/dist/src/utils/model/providerProfilesDb.js +1 -1
  42. package/dist/src/utils/model/providers.js +1 -1
  43. package/dist/src/utils/model/validateModel.js +1 -1
  44. package/dist/src/utils/permissions/filesystem.js +1 -1
  45. package/dist/src/utils/ripgrep.js +1 -1
  46. package/dist/webapp/ngsw.json +1 -1
  47. package/package.json +1 -1
@@ -1 +1 @@
1
- import{feature as e}from"../recovery/bunBundleShim.js";import{createRequire as t}from"module";const o=t(import.meta.url);import{randomBytes as r}from"crypto";import{unwatchFile as n,watchFile as s}from"fs";import i from"lodash-es/memoize.js";import a from"lodash-es/pickBy.js";import{basename as c,dirname as l,join as u,resolve as d}from"path";import{getOriginalCwd as f,getSessionTrustAccepted as p}from"../bootstrap/state.js";import{getAutoMemEntrypoint as g}from"../memdir/paths.js";import{logEvent as m}from"../services/analytics/index.js";import{getCwd as h}from"./cwd.js";import{registerCleanup as C}from"./cleanupRegistry.js";import{logForDebugging as b}from"./debug.js";import{logForDiagnosticsNoPII as y}from"./diagLogs.js";import{getGlobalClaudeFile as v}from"./env.js";import{getClaudeConfigHomeDir as E,isEnvTruthy as S}from"./envUtils.js";import{ConfigParseError as T,getErrnoCode as D}from"./errors.js";import{writeFileSyncAndFlush_DEPRECATED as _}from"./file.js";import{getFsImplementation as w}from"./fsOperations.js";import{findCanonicalGitRoot as k}from"./git.js";import{safeParseJSON as j}from"./json.js";import{stripBOM as A}from"./jsonRead.js";import*as G from"./lockfile.js";import{logError as M}from"./log.js";import{normalizePathForConfigKey as N}from"./path.js";import{getEssentialTrafficOnlyReason as U}from"./privacyLevel.js";import{getManagedFilePath as O}from"./settings/managedPath.js";const x=e("TEAMMEM")?o("../memdir/teamMemPaths.js"):null,F=e("CCR_AUTO_CONNECT")?o("../bridge/bridgeEnabled.js"):null;import{jsonParse as I,jsonStringify as P}from"./slowOperations.js";let L=!1;const R={allowedTools:[],mcpContextUris:[],mcpServers:{},enabledMcpjsonServers:[],disabledMcpjsonServers:[],hasTrustDialogAccepted:!1,projectOnboardingSeenCount:0,hasClaudeMdExternalIncludesApproved:!1,hasClaudeMdExternalIncludesWarningShown:!1};export{EDITOR_MODES,NOTIFICATION_CHANNELS}from"./configConstants.js";function createDefaultGlobalConfig(){return{numStartups:0,installMethod:void 0,autoUpdates:void 0,theme:"dark",preferredNotifChannel:"auto",verbose:!1,editorMode:"normal",autoCompactEnabled:!0,showTurnDuration:!0,hasSeenTasksHint:!1,hasUsedStash:!1,hasUsedBackgroundTask:!1,queuedCommandUpHintCount:0,diffTool:"auto",customApiKeyResponses:{approved:[],rejected:[]},env:{},tipsHistory:{},memoryUsageCount:0,promptQueueUseCount:0,btwUseCount:0,todoFeatureEnabled:!0,showExpandedTodos:!1,messageIdleNotifThresholdMs:6e4,awaySummaryBlurDelayMs:3e5,autoConnectIde:!1,autoInstallIdeExtension:!0,fileCheckpointingEnabled:!0,terminalProgressBarEnabled:!0,cachedStatsigGates:{},cachedDynamicConfigs:{},cachedGrowthBookFeatures:{},respectGitignore:!0,copyFullResponse:!1}}export const DEFAULT_GLOBAL_CONFIG={numStartups:0,installMethod:void 0,autoUpdates:void 0,theme:"dark",preferredNotifChannel:"auto",verbose:!1,editorMode:"normal",autoCompactEnabled:!0,showTurnDuration:!0,hasSeenTasksHint:!1,hasUsedStash:!1,hasUsedBackgroundTask:!1,queuedCommandUpHintCount:0,diffTool:"auto",customApiKeyResponses:{approved:[],rejected:[]},env:{},tipsHistory:{},memoryUsageCount:0,promptQueueUseCount:0,btwUseCount:0,todoFeatureEnabled:!0,showExpandedTodos:!1,messageIdleNotifThresholdMs:6e4,awaySummaryBlurDelayMs:3e5,autoConnectIde:!1,autoInstallIdeExtension:!0,fileCheckpointingEnabled:!0,terminalProgressBarEnabled:!0,cachedStatsigGates:{},cachedDynamicConfigs:{},cachedGrowthBookFeatures:{},respectGitignore:!0,copyFullResponse:!1};export const GLOBAL_CONFIG_KEYS=["apiKeyHelper","installMethod","autoUpdates","autoUpdatesProtectedForNative","theme","verbose","preferredNotifChannel","shiftEnterKeyBindingInstalled","editorMode","hasUsedBackslashReturn","autoCompactEnabled","showTurnDuration","diffTool","env","tipsHistory","todoFeatureEnabled","showExpandedTodos","messageIdleNotifThresholdMs","awaySummaryBlurDelayMs","autoConnectIde","autoInstallIdeExtension","fileCheckpointingEnabled","terminalProgressBarEnabled","showStatusInTerminalTab","taskCompleteNotifEnabled","inputNeededNotifEnabled","agentPushNotifEnabled","respectGitignore","claudeInChromeDefaultEnabled","hasCompletedContextInChromeOnboarding","lspRecommendationDisabled","lspRecommendationNeverPlugins","lspRecommendationIgnoredCount","copyFullResponse","copyOnSelect","permissionExplainerEnabled","prStatusFooterEnabled","remoteControlAtStartup","remoteDialogSeen","lastClaudeModel","lastOpenAIModel","lastOpenRouterModel","lastModelByProvider"];export function isGlobalConfigKey(e){return GLOBAL_CONFIG_KEYS.includes(e)}export const PROJECT_CONFIG_KEYS=["allowedTools","hasTrustDialogAccepted","hasCompletedProjectOnboarding"];let B=!1;export function resetTrustDialogAcceptedCacheForTesting(){B=!1}export function checkHasTrustDialogAccepted(){return B||=function(){if(p())return!0;const e=getGlobalConfig(),t=getProjectPathForConfig(),o=e.projects?.[t];if(o?.hasTrustDialogAccepted)return!0;let r=N(h());for(;;){const t=e.projects?.[r];if(t?.hasTrustDialogAccepted)return!0;const o=N(d(r,".."));if(o===r)break;r=o}return!1}()}export function isPathTrusted(e){const t=getGlobalConfig();let o=N(d(e));for(;;){if(t.projects?.[o]?.hasTrustDialogAccepted)return!0;const e=N(d(o,".."));if(e===o)return!1;o=e}}const $={...DEFAULT_GLOBAL_CONFIG,autoUpdates:!1},H={...R};export function isProjectConfigKey(e){return PROJECT_CONFIG_KEYS.includes(e)}function wouldLoseAuthState(e){const t=K.config;if(!t)return!1;const o=void 0!==t.oauthAccount&&void 0===e.oauthAccount,r=!0===t.hasCompletedOnboarding&&!0!==e.hasCompletedOnboarding;return o||r}export function saveGlobalConfig(e){if("test"===process.env.NODE_ENV){const t=e($);if(t===$)return;return void Object.assign($,t)}let t=null;try{saveConfigWithLock(v(),createDefaultGlobalConfig,o=>{const r=e(o);return r===o?o:(t={...r,projects:removeProjectHistory(o.projects)},t)})&&t&&writeThroughGlobalConfigCache(t)}catch(o){b(`Failed to save config with lock: ${o}`,{level:"error"});const r=getConfig(v(),createDefaultGlobalConfig);if(wouldLoseAuthState(r))return b("saveGlobalConfig fallback: re-read config is missing auth that cache has; refusing to write. See GH #3117.",{level:"error"}),void m("tengu_config_auth_loss_prevented",{});const n=e(r);if(n===r)return;t={...n,projects:removeProjectHistory(r.projects)},saveConfig(v(),t,DEFAULT_GLOBAL_CONFIG),writeThroughGlobalConfigCache(t)}}let K={config:null,mtime:0},W=null,z=0,V=0,Y=0;export function getGlobalConfigWriteCount(){return Y}export const CONFIG_WRITE_DISPLAY_THRESHOLD=20;function migrateConfigFields(e){if(void 0!==e.installMethod)return e;const t=e;let o="unknown",r=e.autoUpdates??!0;switch(t.autoUpdaterStatus){case"migrated":o="local";break;case"installed":o="native";break;case"disabled":r=!1;break;case"enabled":case"no_permissions":case"not_configured":o="global"}return{...e,installMethod:o,autoUpdates:r}}function removeProjectHistory(e){if(!e)return e;const t={};let o=!1;for(const[r,n]of Object.entries(e)){const e=n;if(void 0!==e.history){o=!0;const{history:n,...s}=e;t[r]=s}else t[r]=n}return o?t:e}C(async()=>{!function(){const e=z+V;e>0&&m("tengu_config_cache_stats",{cache_hits:z,cache_misses:V,hit_rate:z/e}),z=0,V=0}()});const q=1e3;let Q=!1;function writeThroughGlobalConfigCache(e){K={config:e,mtime:Date.now()},W=null}export function getGlobalConfig(){if("test"===process.env.NODE_ENV)return $;if(K.config)return z++,K.config;V++;try{let e=null;try{e=w().statSync(v())}catch{}const t=migrateConfigFields(getConfig(v(),createDefaultGlobalConfig));return K={config:t,mtime:e?.mtimeMs??Date.now()},W=e?{mtime:e.mtimeMs,size:e.size}:null,function(){if(Q||"test"===process.env.NODE_ENV)return;Q=!0;const e=v();s(e,{interval:q,persistent:!1},t=>{t.mtimeMs<=K.mtime||w().readFile(e,{encoding:"utf-8"}).then(e=>{if(t.mtimeMs<=K.mtime)return;const o=j(A(e));null!==o&&"object"==typeof o&&(K={config:migrateConfigFields({numStartups:0,installMethod:void 0,autoUpdates:void 0,theme:"dark",preferredNotifChannel:"auto",verbose:!1,editorMode:"normal",autoCompactEnabled:!0,showTurnDuration:!0,hasSeenTasksHint:!1,hasUsedStash:!1,hasUsedBackgroundTask:!1,queuedCommandUpHintCount:0,diffTool:"auto",customApiKeyResponses:{approved:[],rejected:[]},env:{},tipsHistory:{},memoryUsageCount:0,promptQueueUseCount:0,btwUseCount:0,todoFeatureEnabled:!0,showExpandedTodos:!1,messageIdleNotifThresholdMs:6e4,awaySummaryBlurDelayMs:3e5,autoConnectIde:!1,autoInstallIdeExtension:!0,fileCheckpointingEnabled:!0,terminalProgressBarEnabled:!0,cachedStatsigGates:{},cachedDynamicConfigs:{},cachedGrowthBookFeatures:{},respectGitignore:!0,copyFullResponse:!1,...o}),mtime:t.mtimeMs},W={mtime:t.mtimeMs,size:t.size})}).catch(()=>{})}),C(async()=>{n(e),Q=!1})}(),t}catch{return migrateConfigFields(getConfig(v(),createDefaultGlobalConfig))}}export function getRemoteControlAtStartup(){const t=getGlobalConfig().remoteControlAtStartup;return void 0!==t?t:!(!e("CCR_AUTO_CONNECT")||!F?.getCcrAutoConnectDefault())}export function getCustomApiKeyStatus(e){const t=getGlobalConfig();return t.customApiKeyResponses?.approved?.includes(e)?"approved":t.customApiKeyResponses?.rejected?.includes(e)?"rejected":"new"}function saveConfig(e,t,o){const r=l(e);w().mkdirSync(r);const n=a(t,(e,t)=>P(e)!==P(o[t]));_(e,P(n,null,2),{encoding:"utf-8",mode:384}),e===v()&&Y++}function saveConfigWithLock(e,t,o){const r=t(),n=l(e),s=w();let i;s.mkdirSync(n);try{const n=`${e}.lock`,l=Date.now();i=G.lockSync(e,{lockfilePath:n,onCompromised:e=>{b(`Config lock compromised: ${e}`,{level:"error"})}});const d=Date.now()-l;if(d>100&&(b("Lock acquisition took longer than expected - another Claude instance may be running"),m("tengu_config_lock_contention",{lock_time_ms:d})),W&&e===v())try{const t=s.statSync(e);t.mtimeMs===W.mtime&&t.size===W.size||m("tengu_config_stale_write",{read_mtime:W.mtime,write_mtime:t.mtimeMs,read_size:W.size,write_size:t.size})}catch(e){if("ENOENT"!==D(e))throw e}const f=getConfig(e,t);if(e===v()&&wouldLoseAuthState(f))return b("saveConfigWithLock: re-read config is missing auth that cache has; refusing to write to avoid wiping ~/.context.json. See GH #3117.",{level:"error"}),m("tengu_config_auth_loss_prevented",{}),!1;const p=o(f);if(p===f)return!1;const g=a(p,(e,t)=>P(e)!==P(r[t]));try{const t=c(e),o=getConfigBackupDir();try{s.mkdirSync(o)}catch(e){if("EEXIST"!==D(e))throw e}const r=6e4,n=s.readdirStringSync(o).filter(e=>e.startsWith(`${t}.backup.`)).sort().reverse(),i=n[0],a=i?Number(i.split(".backup.").pop()):0,l=Number.isNaN(a)||Date.now()-a>=r;if(l){const r=u(o,`${t}.backup.${Date.now()}`);s.copyFileSync(e,r)}const d=5,f=l?s.readdirStringSync(o).filter(e=>e.startsWith(`${t}.backup.`)).sort().reverse():n;for(const e of f.slice(d))try{s.unlinkSync(u(o,e))}catch{}}catch(e){"ENOENT"!==D(e)&&b(`Failed to backup config: ${e}`,{level:"error"})}return _(e,P(g,null,2),{encoding:"utf-8",mode:384}),e===v()&&Y++,!0}finally{i&&i()}}let J=!1;export function enableConfigs(){if(J)return;const e=Date.now();y("info","enable_configs_started"),J=!0,getConfig(v(),createDefaultGlobalConfig,!0),y("info","enable_configs_completed",{duration_ms:Date.now()-e})}function getConfigBackupDir(){return u(E(),"backups")}function findMostRecentBackup(e){const t=w(),o=c(e),r=getConfigBackupDir();try{const e=t.readdirStringSync(r).filter(e=>e.startsWith(`${o}.backup.`)).sort().at(-1);if(e)return u(r,e)}catch{}const n=l(e);try{const r=t.readdirStringSync(n).filter(e=>e.startsWith(`${o}.backup.`)).sort().at(-1);if(r)return u(n,r);const s=`${e}.backup`;try{return t.statSync(s),s}catch{}}catch{}return null}function getConfig(e,t,o){if(!J&&"test"!==process.env.NODE_ENV)throw new Error("Config accessed before allowed.");const r=w();try{const o=r.readFileSync(e,{encoding:"utf-8"});try{const e=I(A(o));return{...t(),...e}}catch(o){const r=o instanceof Error?o.message:String(o);throw new T(r,e,t())}}catch(n){if("ENOENT"===D(n)){const o=findMostRecentBackup(e);return o&&process.stderr.write(`\nClaude configuration file not found at: ${e}\nA backup file exists at: ${o}\nYou can manually restore it by running: cp "${o}" "${e}"\n\n`),t()}if(n instanceof T&&o)throw n;if(n instanceof T){if(b(`Config file corrupted, resetting to defaults: ${n.message}`,{level:"error"}),!L){L=!0;try{M(n);let t=!1;try{r.statSync(`${e}.backup`),t=!0}catch{}m("tengu_config_parse_error",{has_backup:t})}finally{L=!1}}process.stderr.write(`\nClaude configuration file at ${e} is corrupted: ${n.message}\n`);const t=c(e),o=getConfigBackupDir();try{r.mkdirSync(o)}catch(e){if("EEXIST"!==D(e))throw e}const s=r.readdirStringSync(o).filter(e=>e.startsWith(`${t}.corrupted.`));let i,a=!1;const l=r.readFileSync(e,{encoding:"utf-8"});for(const e of s)try{if(l===r.readFileSync(u(o,e),{encoding:"utf-8"})){a=!0;break}}catch{}if(!a){i=u(o,`${t}.corrupted.${Date.now()}`);try{r.copyFileSync(e,i),b(`Corrupted config backed up to: ${i}`,{level:"error"})}catch{}}const d=findMostRecentBackup(e);i?process.stderr.write(`The corrupted file has been backed up to: ${i}\n`):a&&process.stderr.write("The corrupted file has already been backed up.\n"),d?process.stderr.write(`A backup file exists at: ${d}\nYou can manually restore it by running: cp "${d}" "${e}"\n\n`):process.stderr.write("\n")}return t()}}export const getProjectPathForConfig=i(()=>{const e=f(),t=k(e);return N(t||d(e))});export function getCurrentProjectConfig(){if("test"===process.env.NODE_ENV)return H;const e=getProjectPathForConfig(),t=getGlobalConfig();if(!t.projects)return R;const o=t.projects[e]??R;return"string"==typeof o.allowedTools&&(o.allowedTools=j(o.allowedTools)??[]),o}export function saveCurrentProjectConfig(e){if("test"===process.env.NODE_ENV){const t=e(H);if(t===H)return;return void Object.assign(H,t)}const t=getProjectPathForConfig();let o=null;try{saveConfigWithLock(v(),createDefaultGlobalConfig,r=>{const n=r.projects?.[t]??R,s=e(n);return s===n?r:(o={...r,projects:{...r.projects,[t]:s}},o)})&&o&&writeThroughGlobalConfigCache(o)}catch(r){b(`Failed to save config with lock: ${r}`,{level:"error"});const n=getConfig(v(),createDefaultGlobalConfig);if(wouldLoseAuthState(n))return b("saveCurrentProjectConfig fallback: re-read config is missing auth that cache has; refusing to write. See GH #3117.",{level:"error"}),void m("tengu_config_auth_loss_prevented",{});const s=n.projects?.[t]??R,i=e(s);if(i===s)return;o={...n,projects:{...n.projects,[t]:i}},saveConfig(v(),o,DEFAULT_GLOBAL_CONFIG),writeThroughGlobalConfigCache(o)}}export function isAutoUpdaterDisabled(){return null!==getAutoUpdaterDisabledReason()}export function shouldSkipPluginAutoupdate(){return isAutoUpdaterDisabled()&&!S(process.env.FORCE_AUTOUPDATE_PLUGINS)}export function formatAutoUpdaterDisabledReason(e){switch(e.type){case"development":return"development build";case"env":return`${e.envVar} set`;case"config":return"config"}}export function getAutoUpdaterDisabledReason(){if("development"===process.env.NODE_ENV)return{type:"development"};if(S(process.env.DISABLE_AUTOUPDATER))return{type:"env",envVar:"DISABLE_AUTOUPDATER"};const e=U();if(e)return{type:"env",envVar:e};const t=getGlobalConfig();return!1!==t.autoUpdates||"native"===t.installMethod&&!0===t.autoUpdatesProtectedForNative?null:{type:"config"}}export function getOrCreateUserID(){const e=getGlobalConfig();if(e.userID)return e.userID;const t=r(32).toString("hex");return saveGlobalConfig(e=>({...e,userID:t})),t}export function recordFirstStartTime(){if(!getGlobalConfig().firstStartTime){const e=(new Date).toISOString();saveGlobalConfig(t=>({...t,firstStartTime:t.firstStartTime??e}))}}export function getMemoryPath(t){const o=f();switch(t){case"User":return u(E(),"CLAUDE.md");case"Local":return u(o,"CLAUDE.local.md");case"Project":return u(o,"CLAUDE.md");case"Managed":return u(O(),"CLAUDE.md");case"AutoMem":return g()}return e("TEAMMEM")?x.getTeamMemEntrypoint():""}export function getManagedClaudeRulesDir(){return u(O(),".claude","rules")}export function getUserClaudeRulesDir(){return u(E(),"rules")}function customProviderModelsCacheKey(e,t){return t&&t.trim()?t:e}export function setCustomProviderModels(e,t,o){const r=getGlobalConfig(),n={...r.customProviderModelsCache??{}};n[customProviderModelsCacheKey(e,o)]=t,saveGlobalConfig({...r,customProviderModelsCache:n})}export function getCustomProviderModels(e,t){const o=getGlobalConfig().customProviderModelsCache;if(!o)return[];const r=o[customProviderModelsCacheKey(e,t)];return r&&r.length>0?r:o[e]??[]}export const _getConfigForTesting=getConfig;export const _wouldLoseAuthStateForTesting=wouldLoseAuthState;export function _setGlobalConfigCacheForTesting(e){K.config=e,K.mtime=e?Date.now():0}
1
+ import{feature as e}from"../recovery/bunBundleShim.js";import{createRequire as t}from"module";const o=t(import.meta.url);import{randomBytes as r}from"crypto";import{unwatchFile as n,watchFile as s}from"fs";import i from"lodash-es/memoize.js";import a from"lodash-es/pickBy.js";import{basename as c,dirname as l,join as u,resolve as d}from"path";import{getOriginalCwd as f,getSessionTrustAccepted as p}from"../bootstrap/state.js";import{getAutoMemEntrypoint as g}from"../memdir/paths.js";import{logEvent as m}from"../services/analytics/index.js";import{getCwd as h}from"./cwd.js";import{registerCleanup as C}from"./cleanupRegistry.js";import{logForDebugging as b}from"./debug.js";import{logForDiagnosticsNoPII as y}from"./diagLogs.js";import{getGlobalClaudeFile as v}from"./env.js";import{getClaudeConfigHomeDir as E,isEnvTruthy as S}from"./envUtils.js";import{ConfigParseError as T,getErrnoCode as D}from"./errors.js";import{writeFileSyncAndFlush_DEPRECATED as _}from"./file.js";import{getFsImplementation as w}from"./fsOperations.js";import{findCanonicalGitRoot as k}from"./git.js";import{safeParseJSON as j}from"./json.js";import{stripBOM as A}from"./jsonRead.js";import*as G from"./lockfile.js";import{logError as M}from"./log.js";import{normalizePathForConfigKey as N}from"./path.js";import{getEssentialTrafficOnlyReason as U}from"./privacyLevel.js";import{getManagedFilePath as O}from"./settings/managedPath.js";const x=e("TEAMMEM")?o("../memdir/teamMemPaths.js"):null,F=e("CCR_AUTO_CONNECT")?o("../bridge/bridgeEnabled.js"):null;import{jsonParse as I,jsonStringify as P}from"./slowOperations.js";let L=!1;const R={allowedTools:[],mcpContextUris:[],mcpServers:{},enabledMcpjsonServers:[],disabledMcpjsonServers:[],hasTrustDialogAccepted:!1,projectOnboardingSeenCount:0,hasClaudeMdExternalIncludesApproved:!1,hasClaudeMdExternalIncludesWarningShown:!1};export{EDITOR_MODES,NOTIFICATION_CHANNELS}from"./configConstants.js";function createDefaultGlobalConfig(){return{numStartups:0,installMethod:void 0,autoUpdates:void 0,theme:"dark",preferredNotifChannel:"auto",verbose:!1,editorMode:"normal",autoCompactEnabled:!0,showTurnDuration:!0,hasSeenTasksHint:!1,hasUsedStash:!1,hasUsedBackgroundTask:!1,queuedCommandUpHintCount:0,diffTool:"auto",customApiKeyResponses:{approved:[],rejected:[]},env:{},tipsHistory:{},memoryUsageCount:0,promptQueueUseCount:0,btwUseCount:0,todoFeatureEnabled:!0,showExpandedTodos:!1,messageIdleNotifThresholdMs:6e4,awaySummaryBlurDelayMs:3e5,autoConnectIde:!1,autoInstallIdeExtension:!0,fileCheckpointingEnabled:!0,terminalProgressBarEnabled:!0,cachedStatsigGates:{},cachedDynamicConfigs:{},cachedGrowthBookFeatures:{},respectGitignore:!0,copyFullResponse:!1}}export const DEFAULT_GLOBAL_CONFIG={numStartups:0,installMethod:void 0,autoUpdates:void 0,theme:"dark",preferredNotifChannel:"auto",verbose:!1,editorMode:"normal",autoCompactEnabled:!0,showTurnDuration:!0,hasSeenTasksHint:!1,hasUsedStash:!1,hasUsedBackgroundTask:!1,queuedCommandUpHintCount:0,diffTool:"auto",customApiKeyResponses:{approved:[],rejected:[]},env:{},tipsHistory:{},memoryUsageCount:0,promptQueueUseCount:0,btwUseCount:0,todoFeatureEnabled:!0,showExpandedTodos:!1,messageIdleNotifThresholdMs:6e4,awaySummaryBlurDelayMs:3e5,autoConnectIde:!1,autoInstallIdeExtension:!0,fileCheckpointingEnabled:!0,terminalProgressBarEnabled:!0,cachedStatsigGates:{},cachedDynamicConfigs:{},cachedGrowthBookFeatures:{},respectGitignore:!0,copyFullResponse:!1};export const GLOBAL_CONFIG_KEYS=["apiKeyHelper","installMethod","autoUpdates","autoUpdatesProtectedForNative","theme","verbose","preferredNotifChannel","shiftEnterKeyBindingInstalled","editorMode","hasUsedBackslashReturn","autoCompactEnabled","showTurnDuration","diffTool","env","tipsHistory","todoFeatureEnabled","showExpandedTodos","messageIdleNotifThresholdMs","awaySummaryBlurDelayMs","autoConnectIde","autoInstallIdeExtension","fileCheckpointingEnabled","terminalProgressBarEnabled","showStatusInTerminalTab","taskCompleteNotifEnabled","inputNeededNotifEnabled","agentPushNotifEnabled","respectGitignore","claudeInChromeDefaultEnabled","hasCompletedContextInChromeOnboarding","lspRecommendationDisabled","lspRecommendationNeverPlugins","lspRecommendationIgnoredCount","copyFullResponse","copyOnSelect","permissionExplainerEnabled","prStatusFooterEnabled","remoteControlAtStartup","remoteDialogSeen","lastClaudeModel","lastOpenAIModel","lastOpenRouterModel","lastModelByProvider"];export function isGlobalConfigKey(e){return GLOBAL_CONFIG_KEYS.includes(e)}export const PROJECT_CONFIG_KEYS=["allowedTools","hasTrustDialogAccepted","hasCompletedProjectOnboarding"];let B=!1;export function resetTrustDialogAcceptedCacheForTesting(){B=!1}export function checkHasTrustDialogAccepted(){return B||=function(){if(p())return!0;const e=getGlobalConfig(),t=getProjectPathForConfig(),o=e.projects?.[t];if(o?.hasTrustDialogAccepted)return!0;let r=N(h());for(;;){const t=e.projects?.[r];if(t?.hasTrustDialogAccepted)return!0;const o=N(d(r,".."));if(o===r)break;r=o}return!1}()}export function isPathTrusted(e){const t=getGlobalConfig();let o=N(d(e));for(;;){if(t.projects?.[o]?.hasTrustDialogAccepted)return!0;const e=N(d(o,".."));if(e===o)return!1;o=e}}const $={...DEFAULT_GLOBAL_CONFIG,autoUpdates:!1},H={...R};export function isProjectConfigKey(e){return PROJECT_CONFIG_KEYS.includes(e)}function wouldLoseAuthState(e){const t=K.config;if(!t)return!1;const o=void 0!==t.oauthAccount&&void 0===e.oauthAccount,r=!0===t.hasCompletedOnboarding&&!0!==e.hasCompletedOnboarding;return o||r}export function saveGlobalConfig(e){if("test"===process.env.NODE_ENV){const t=e($);if(t===$)return;return void Object.assign($,t)}let t=null;try{saveConfigWithLock(v(),createDefaultGlobalConfig,o=>{const r=e(o);return r===o?o:(t={...r,projects:removeProjectHistory(o.projects)},t)})&&t&&writeThroughGlobalConfigCache(t)}catch(o){b(`Failed to save config with lock: ${o}`,{level:"error"});const r=getConfig(v(),createDefaultGlobalConfig);if(wouldLoseAuthState(r))return b("saveGlobalConfig fallback: re-read config is missing auth that cache has; refusing to write. See GH #3117.",{level:"error"}),void m("tengu_config_auth_loss_prevented",{});const n=e(r);if(n===r)return;t={...n,projects:removeProjectHistory(r.projects)},saveConfig(v(),t,DEFAULT_GLOBAL_CONFIG),writeThroughGlobalConfigCache(t)}}let K={config:null,mtime:0},W=null,z=0,V=0,Y=0;export function getGlobalConfigWriteCount(){return Y}export const CONFIG_WRITE_DISPLAY_THRESHOLD=20;function migrateConfigFields(e){if(void 0!==e.installMethod)return e;const t=e;let o="unknown",r=e.autoUpdates??!0;switch(t.autoUpdaterStatus){case"migrated":o="local";break;case"installed":o="native";break;case"disabled":r=!1;break;case"enabled":case"no_permissions":case"not_configured":o="global"}return{...e,installMethod:o,autoUpdates:r}}function removeProjectHistory(e){if(!e)return e;const t={};let o=!1;for(const[r,n]of Object.entries(e)){const e=n;if(void 0!==e.history){o=!0;const{history:n,...s}=e;t[r]=s}else t[r]=n}return o?t:e}C(async()=>{!function(){const e=z+V;e>0&&m("tengu_config_cache_stats",{cache_hits:z,cache_misses:V,hit_rate:z/e}),z=0,V=0}()});const q=1e3;let Q=!1;function writeThroughGlobalConfigCache(e){K={config:e,mtime:Date.now()},W=null}export function getGlobalConfig(){if("test"===process.env.NODE_ENV)return $;if(K.config)return z++,K.config;V++;try{let e=null;try{e=w().statSync(v())}catch{}const t=migrateConfigFields(getConfig(v(),createDefaultGlobalConfig));return K={config:t,mtime:e?.mtimeMs??Date.now()},W=e?{mtime:e.mtimeMs,size:e.size}:null,function(){if(Q||"test"===process.env.NODE_ENV)return;Q=!0;const e=v();s(e,{interval:q,persistent:!1},t=>{t.mtimeMs<=K.mtime||w().readFile(e,{encoding:"utf-8"}).then(e=>{if(t.mtimeMs<=K.mtime)return;const o=j(A(e));null!==o&&"object"==typeof o&&(K={config:migrateConfigFields({numStartups:0,installMethod:void 0,autoUpdates:void 0,theme:"dark",preferredNotifChannel:"auto",verbose:!1,editorMode:"normal",autoCompactEnabled:!0,showTurnDuration:!0,hasSeenTasksHint:!1,hasUsedStash:!1,hasUsedBackgroundTask:!1,queuedCommandUpHintCount:0,diffTool:"auto",customApiKeyResponses:{approved:[],rejected:[]},env:{},tipsHistory:{},memoryUsageCount:0,promptQueueUseCount:0,btwUseCount:0,todoFeatureEnabled:!0,showExpandedTodos:!1,messageIdleNotifThresholdMs:6e4,awaySummaryBlurDelayMs:3e5,autoConnectIde:!1,autoInstallIdeExtension:!0,fileCheckpointingEnabled:!0,terminalProgressBarEnabled:!0,cachedStatsigGates:{},cachedDynamicConfigs:{},cachedGrowthBookFeatures:{},respectGitignore:!0,copyFullResponse:!1,...o}),mtime:t.mtimeMs},W={mtime:t.mtimeMs,size:t.size})}).catch(()=>{})}),C(async()=>{n(e),Q=!1})}(),t}catch{return migrateConfigFields(getConfig(v(),createDefaultGlobalConfig))}}export function getRemoteControlAtStartup(){const t=getGlobalConfig().remoteControlAtStartup;return void 0!==t?t:!(!e("CCR_AUTO_CONNECT")||!F?.getCcrAutoConnectDefault())}export function getCustomApiKeyStatus(e){const t=getGlobalConfig();return t.customApiKeyResponses?.approved?.includes(e)?"approved":t.customApiKeyResponses?.rejected?.includes(e)?"rejected":"new"}function saveConfig(e,t,o){const r=l(e);w().mkdirSync(r);const n=a(t,(e,t)=>P(e)!==P(o[t]));_(e,P(n,null,2),{encoding:"utf-8",mode:384}),e===v()&&Y++}function saveConfigWithLock(e,t,o){const r=t(),n=l(e),s=w();let i;s.mkdirSync(n);try{const n=`${e}.lock`,l=Date.now();i=G.lockSync(e,{lockfilePath:n,onCompromised:e=>{b(`Config lock compromised: ${e}`,{level:"error"})}});const d=Date.now()-l;if(d>100&&(b("Lock acquisition took longer than expected - another Claude instance may be running"),m("tengu_config_lock_contention",{lock_time_ms:d})),W&&e===v())try{const t=s.statSync(e);t.mtimeMs===W.mtime&&t.size===W.size||m("tengu_config_stale_write",{read_mtime:W.mtime,write_mtime:t.mtimeMs,read_size:W.size,write_size:t.size})}catch(e){if("ENOENT"!==D(e))throw e}const f=getConfig(e,t);if(e===v()&&wouldLoseAuthState(f))return b("saveConfigWithLock: re-read config is missing auth that cache has; refusing to write to avoid wiping ~/.context.json. See GH #3117.",{level:"error"}),m("tengu_config_auth_loss_prevented",{}),!1;const p=o(f);if(p===f)return!1;const g=a(p,(e,t)=>P(e)!==P(r[t]));try{const t=c(e),o=getConfigBackupDir();try{s.mkdirSync(o)}catch(e){if("EEXIST"!==D(e))throw e}const r=6e4,n=s.readdirStringSync(o).filter(e=>e.startsWith(`${t}.backup.`)).sort().reverse(),i=n[0],a=i?Number(i.split(".backup.").pop()):0,l=Number.isNaN(a)||Date.now()-a>=r;if(l){const r=u(o,`${t}.backup.${Date.now()}`);s.copyFileSync(e,r)}const d=5,f=l?s.readdirStringSync(o).filter(e=>e.startsWith(`${t}.backup.`)).sort().reverse():n;for(const e of f.slice(d))try{s.unlinkSync(u(o,e))}catch{}}catch(e){"ENOENT"!==D(e)&&b(`Failed to backup config: ${e}`,{level:"error"})}return _(e,P(g,null,2),{encoding:"utf-8",mode:384}),e===v()&&Y++,!0}finally{i&&i()}}let J=!1;export function enableConfigs(){if(J)return;const e=Date.now();y("info","enable_configs_started"),J=!0,getConfig(v(),createDefaultGlobalConfig,!0),y("info","enable_configs_completed",{duration_ms:Date.now()-e})}function getConfigBackupDir(){return u(E(),"backups")}function findMostRecentBackup(e){const t=w(),o=c(e),r=getConfigBackupDir();try{const e=t.readdirStringSync(r).filter(e=>e.startsWith(`${o}.backup.`)).sort().at(-1);if(e)return u(r,e)}catch{}const n=l(e);try{const r=t.readdirStringSync(n).filter(e=>e.startsWith(`${o}.backup.`)).sort().at(-1);if(r)return u(n,r);const s=`${e}.backup`;try{return t.statSync(s),s}catch{}}catch{}return null}function getConfig(e,t,o){if(!J&&"test"!==process.env.NODE_ENV)throw new Error("Config accessed before allowed.");const r=w();try{const o=r.readFileSync(e,{encoding:"utf-8"});try{const e=I(A(o));return{...t(),...e}}catch(o){const r=o instanceof Error?o.message:String(o);throw new T(r,e,t())}}catch(n){if("ENOENT"===D(n)){const o=findMostRecentBackup(e);return o&&process.stderr.write(`\nClaude configuration file not found at: ${e}\nA backup file exists at: ${o}\nYou can manually restore it by running: cp "${o}" "${e}"\n\n`),t()}if(n instanceof T&&o)throw n;if(n instanceof T){if(b(`Config file corrupted, resetting to defaults: ${n.message}`,{level:"error"}),!L){L=!0;try{M(n);let t=!1;try{r.statSync(`${e}.backup`),t=!0}catch{}m("tengu_config_parse_error",{has_backup:t})}finally{L=!1}}process.stderr.write(`\nClaude configuration file at ${e} is corrupted: ${n.message}\n`);const t=c(e),o=getConfigBackupDir();try{r.mkdirSync(o)}catch(e){if("EEXIST"!==D(e))throw e}const s=r.readdirStringSync(o).filter(e=>e.startsWith(`${t}.corrupted.`));let i,a=!1;const l=r.readFileSync(e,{encoding:"utf-8"});for(const e of s)try{if(l===r.readFileSync(u(o,e),{encoding:"utf-8"})){a=!0;break}}catch{}if(!a){i=u(o,`${t}.corrupted.${Date.now()}`);try{r.copyFileSync(e,i),b(`Corrupted config backed up to: ${i}`,{level:"error"})}catch{}}const d=findMostRecentBackup(e);i?process.stderr.write(`The corrupted file has been backed up to: ${i}\n`):a&&process.stderr.write("The corrupted file has already been backed up.\n"),d?process.stderr.write(`A backup file exists at: ${d}\nYou can manually restore it by running: cp "${d}" "${e}"\n\n`):process.stderr.write("\n")}return t()}}export const getProjectPathForConfig=i(()=>{const e=f(),t=k(e);return N(t||d(e))});export function getCurrentProjectConfig(){if("test"===process.env.NODE_ENV)return H;const e=getProjectPathForConfig(),t=getGlobalConfig();if(!t.projects)return R;const o=t.projects[e]??R;return"string"==typeof o.allowedTools&&(o.allowedTools=j(o.allowedTools)??[]),o}export function saveCurrentProjectConfig(e){if("test"===process.env.NODE_ENV){const t=e(H);if(t===H)return;return void Object.assign(H,t)}const t=getProjectPathForConfig();let o=null;try{saveConfigWithLock(v(),createDefaultGlobalConfig,r=>{const n=r.projects?.[t]??R,s=e(n);return s===n?r:(o={...r,projects:{...r.projects,[t]:s}},o)})&&o&&writeThroughGlobalConfigCache(o)}catch(r){b(`Failed to save config with lock: ${r}`,{level:"error"});const n=getConfig(v(),createDefaultGlobalConfig);if(wouldLoseAuthState(n))return b("saveCurrentProjectConfig fallback: re-read config is missing auth that cache has; refusing to write. See GH #3117.",{level:"error"}),void m("tengu_config_auth_loss_prevented",{});const s=n.projects?.[t]??R,i=e(s);if(i===s)return;o={...n,projects:{...n.projects,[t]:i}},saveConfig(v(),o,DEFAULT_GLOBAL_CONFIG),writeThroughGlobalConfigCache(o)}}export function isAutoUpdaterDisabled(){return null!==getAutoUpdaterDisabledReason()}export function shouldSkipPluginAutoupdate(){return isAutoUpdaterDisabled()&&!S(process.env.FORCE_AUTOUPDATE_PLUGINS)}export function formatAutoUpdaterDisabledReason(e){switch(e.type){case"development":return"development build";case"env":return`${e.envVar} set`;case"config":return"config"}}export function getAutoUpdaterDisabledReason(){if("development"===process.env.NODE_ENV)return{type:"development"};if(S(process.env.DISABLE_AUTOUPDATER))return{type:"env",envVar:"DISABLE_AUTOUPDATER"};const e=U();if(e)return{type:"env",envVar:e};const t=getGlobalConfig();return!1!==t.autoUpdates||"native"===t.installMethod&&!0===t.autoUpdatesProtectedForNative?null:{type:"config"}}export function getOrCreateUserID(){const e=getGlobalConfig();if(e.userID)return e.userID;const t=r(32).toString("hex");return saveGlobalConfig(e=>({...e,userID:t})),t}export function recordFirstStartTime(){if(!getGlobalConfig().firstStartTime){const e=(new Date).toISOString();saveGlobalConfig(t=>({...t,firstStartTime:t.firstStartTime??e}))}}export function getMemoryPath(t){const o=f();switch(t){case"User":return u(E(),"CLAUDE.md");case"Local":return u(o,"CLAUDE.local.md");case"Project":return u(o,"CLAUDE.md");case"Managed":return u(O(),"CLAUDE.md");case"AutoMem":return g()}return e("TEAMMEM")?x.getTeamMemEntrypoint():""}export function getManagedClaudeRulesDir(){return u(O(),".claude","rules")}export function getUserClaudeRulesDir(){return u(E(),"rules")}function customProviderModelsCacheKey(e,t){return t&&t.trim()?t:e}export function setCustomProviderModels(e,t,o){const r=getGlobalConfig(),n={...r.customProviderModelsCache??{}};n[customProviderModelsCacheKey(e,o)]=t,o&&o.trim()&&(n[e]=t),saveGlobalConfig({...r,customProviderModelsCache:n})}export function getCustomProviderModels(e,t){const o=getGlobalConfig().customProviderModelsCache;if(!o)return[];const r=o[customProviderModelsCacheKey(e,t)];return r&&r.length>0?r:o[e]??[]}export const _getConfigForTesting=getConfig;export const _wouldLoseAuthStateForTesting=wouldLoseAuthState;export function _setGlobalConfigCacheForTesting(e){K.config=e,K.mtime=e?Date.now():0}
@@ -1 +1 @@
1
- import e from"lodash-es/memoize.js";import{homedir as r}from"os";import{join as n}from"path";import{fileSuffixForOauthConfig as s}from"../constants/oauth.js";import{isRunningWithBun as t}from"./bundledMode.js";import{getClaudeConfigHomeDir as i,isEnvTruthy as o}from"./envUtils.js";import{findExecutable as c}from"./findExecutable.js";import{getFsImplementation as u}from"./fsOperations.js";import{which as a}from"./which.js";export const getGlobalClaudeFile=e(()=>{if(u().existsSync(n(i(),".config.json")))return n(i(),".config.json");const e=`.claude${s()}.json`;return n(process.env.CLAUDE_CONFIG_DIR||r(),e)});const p=e(async()=>{try{const{default:e}=await import("axios");return await e.head("http://1.1.1.1",{signal:AbortSignal.timeout(1e3)}),!0}catch{return!1}});async function isCommandAvailable(e){try{return!!await a(e)}catch{return!1}}const f=e(async()=>{const e=[];return await isCommandAvailable("npm")&&e.push("npm"),await isCommandAvailable("yarn")&&e.push("yarn"),await isCommandAvailable("pnpm")&&e.push("pnpm"),e}),E=e(async()=>{const e=[];return await isCommandAvailable("bun")&&e.push("bun"),await isCommandAvailable("deno")&&e.push("deno"),await isCommandAvailable("node")&&e.push("node"),e}),v=e(()=>{try{return u().existsSync("/proc/sys/fs/binfmt_misc/WSLInterop")}catch(e){return!1}}),l=e(()=>{try{if(!v())return!1;const{cmd:e}=c("npm",[]);return e.startsWith("/mnt/c/")}catch(e){return!1}});export const JETBRAINS_IDES=["pycharm","intellij","webstorm","phpstorm","rubymine","clion","goland","rider","datagrip","appcode","dataspell","aqua","gateway","fleet","jetbrains","androidstudio"];export const detectDeploymentEnvironment=e(()=>{if(o(process.env.CODESPACES))return"codespaces";if(process.env.GITPOD_WORKSPACE_ID)return"gitpod";if(process.env.REPL_ID||process.env.REPL_SLUG)return"replit";if(process.env.PROJECT_DOMAIN)return"glitch";if(o(process.env.VERCEL))return"vercel";if(process.env.RAILWAY_ENVIRONMENT_NAME||process.env.RAILWAY_SERVICE_NAME)return"railway";if(o(process.env.RENDER))return"render";if(o(process.env.NETLIFY))return"netlify";if(process.env.DYNO)return"heroku";if(process.env.FLY_APP_NAME||process.env.FLY_MACHINE_ID)return"fly.io";if(o(process.env.CF_PAGES))return"cloudflare-pages";if(process.env.DENO_DEPLOYMENT_ID)return"deno-deploy";if(process.env.AWS_LAMBDA_FUNCTION_NAME)return"aws-lambda";if("AWS_ECS_FARGATE"===process.env.AWS_EXECUTION_ENV)return"aws-fargate";if("AWS_ECS_EC2"===process.env.AWS_EXECUTION_ENV)return"aws-ecs";try{if(u().readFileSync("/sys/hypervisor/uuid",{encoding:"utf8"}).trim().toLowerCase().startsWith("ec2"))return"aws-ec2"}catch{}if(process.env.K_SERVICE)return"gcp-cloud-run";if(process.env.GOOGLE_CLOUD_PROJECT)return"gcp";if(process.env.WEBSITE_SITE_NAME||process.env.WEBSITE_SKU)return"azure-app-service";if(process.env.AZURE_FUNCTIONS_ENVIRONMENT)return"azure-functions";if(process.env.APP_URL?.includes("ondigitalocean.app"))return"digitalocean-app-platform";if(process.env.SPACE_CREATOR_USER_ID)return"huggingface-spaces";if(o(process.env.GITHUB_ACTIONS))return"github-actions";if(o(process.env.GITLAB_CI))return"gitlab-ci";if(process.env.CIRCLECI)return"circleci";if(process.env.BUILDKITE)return"buildkite";if(o(process.env.CI))return"ci";if(process.env.KUBERNETES_SERVICE_HOST)return"kubernetes";try{if(u().existsSync("/.dockerenv"))return"docker"}catch{}return"darwin"===env.platform?"unknown-darwin":"linux"===env.platform?"unknown-linux":"win32"===env.platform?"unknown-win32":"unknown"});function isSSHSession(){return!!(process.env.SSH_CONNECTION||process.env.SSH_CLIENT||process.env.SSH_TTY)}export const env={hasInternetAccess:p,isCI:o(process.env.CI),platform:["win32","darwin"].includes(process.platform)?process.platform:"linux",arch:process.arch,nodeVersion:process.version,terminal:function(){if(process.env.CURSOR_TRACE_ID)return"cursor";if(process.env.VSCODE_GIT_ASKPASS_MAIN?.includes("cursor"))return"cursor";if(process.env.VSCODE_GIT_ASKPASS_MAIN?.includes("windsurf"))return"windsurf";if(process.env.VSCODE_GIT_ASKPASS_MAIN?.includes("antigravity"))return"antigravity";const e=process.env.__CFBundleIdentifier?.toLowerCase();if(e?.includes("vscodium"))return"codium";if(e?.includes("windsurf"))return"windsurf";if(e?.includes("com.google.android.studio"))return"androidstudio";if(e)for(const r of JETBRAINS_IDES)if(e.includes(r))return r;if(process.env.VisualStudioVersion)return"visualstudio";if("JetBrains-JediTerm"===process.env.TERMINAL_EMULATOR)return process.platform,"pycharm";if("xterm-ghostty"===process.env.TERM)return"ghostty";if(process.env.TERM?.includes("kitty"))return"kitty";if(process.env.TERM_PROGRAM)return process.env.TERM_PROGRAM;if(process.env.TMUX)return"tmux";if(process.env.STY)return"screen";if(process.env.KONSOLE_VERSION)return"konsole";if(process.env.GNOME_TERMINAL_SERVICE)return"gnome-terminal";if(process.env.XTERM_VERSION)return"xterm";if(process.env.VTE_VERSION)return"vte-based";if(process.env.TERMINATOR_UUID)return"terminator";if(process.env.KITTY_WINDOW_ID)return"kitty";if(process.env.ALACRITTY_LOG)return"alacritty";if(process.env.TILIX_ID)return"tilix";if(process.env.WT_SESSION)return"windows-terminal";if(process.env.SESSIONNAME&&"cygwin"===process.env.TERM)return"cygwin";if(process.env.MSYSTEM)return process.env.MSYSTEM.toLowerCase();if(process.env.ConEmuANSI||process.env.ConEmuPID||process.env.ConEmuTask)return"conemu";if(process.env.WSL_DISTRO_NAME)return`wsl-${process.env.WSL_DISTRO_NAME}`;if(isSSHSession())return"ssh-session";if(process.env.TERM){const e=process.env.TERM;return e.includes("alacritty")?"alacritty":e.includes("rxvt")?"rxvt":e.includes("termite")?"termite":process.env.TERM}return process.stdout.isTTY?null:"non-interactive"}(),isSSH:isSSHSession,getPackageManagers:f,getRuntimes:E,isRunningWithBun:e(t),isWslEnvironment:v,isNpmFromWindowsPath:l,isConductor:function(){return"com.conductor.app"===process.env.__CFBundleIdentifier},detectDeploymentEnvironment};export function getHostPlatformForAnalytics(){const e=process.env.CONTEXT_CODE_HOST_PLATFORM??process.env.CLAUDE_CODE_HOST_PLATFORM;return"win32"===e||"darwin"===e||"linux"===e?e:env.platform}
1
+ import e from"lodash-es/memoize.js";import{join as r}from"path";import{fileSuffixForOauthConfig as n}from"../constants/oauth.js";import{isRunningWithBun as s}from"./bundledMode.js";import{getClaudeConfigHomeDir as t,isEnvTruthy as i}from"./envUtils.js";import{findExecutable as o}from"./findExecutable.js";import{getFsImplementation as c}from"./fsOperations.js";import{which as u}from"./which.js";export const getGlobalClaudeFile=e(()=>{const e=c(),s=process.env.CONTEXT_CONFIG_DIR||process.env.CLAUDE_CONFIG_DIR||t(),i=n(),o=r(s,`.context${i}.json`);if(e.existsSync(o))return o;const u=r(s,`.claude${i}.json`);if(e.existsSync(u))return u;const a=r(s,".config.json");return e.existsSync(a)?a:o});const a=e(async()=>{try{const{default:e}=await import("axios");return await e.head("http://1.1.1.1",{signal:AbortSignal.timeout(1e3)}),!0}catch{return!1}});async function isCommandAvailable(e){try{return!!await u(e)}catch{return!1}}const p=e(async()=>{const e=[];return await isCommandAvailable("npm")&&e.push("npm"),await isCommandAvailable("yarn")&&e.push("yarn"),await isCommandAvailable("pnpm")&&e.push("pnpm"),e}),E=e(async()=>{const e=[];return await isCommandAvailable("bun")&&e.push("bun"),await isCommandAvailable("deno")&&e.push("deno"),await isCommandAvailable("node")&&e.push("node"),e}),f=e(()=>{try{return c().existsSync("/proc/sys/fs/binfmt_misc/WSLInterop")}catch(e){return!1}}),v=e(()=>{try{if(!f())return!1;const{cmd:e}=o("npm",[]);return e.startsWith("/mnt/c/")}catch(e){return!1}});export const JETBRAINS_IDES=["pycharm","intellij","webstorm","phpstorm","rubymine","clion","goland","rider","datagrip","appcode","dataspell","aqua","gateway","fleet","jetbrains","androidstudio"];export const detectDeploymentEnvironment=e(()=>{if(i(process.env.CODESPACES))return"codespaces";if(process.env.GITPOD_WORKSPACE_ID)return"gitpod";if(process.env.REPL_ID||process.env.REPL_SLUG)return"replit";if(process.env.PROJECT_DOMAIN)return"glitch";if(i(process.env.VERCEL))return"vercel";if(process.env.RAILWAY_ENVIRONMENT_NAME||process.env.RAILWAY_SERVICE_NAME)return"railway";if(i(process.env.RENDER))return"render";if(i(process.env.NETLIFY))return"netlify";if(process.env.DYNO)return"heroku";if(process.env.FLY_APP_NAME||process.env.FLY_MACHINE_ID)return"fly.io";if(i(process.env.CF_PAGES))return"cloudflare-pages";if(process.env.DENO_DEPLOYMENT_ID)return"deno-deploy";if(process.env.AWS_LAMBDA_FUNCTION_NAME)return"aws-lambda";if("AWS_ECS_FARGATE"===process.env.AWS_EXECUTION_ENV)return"aws-fargate";if("AWS_ECS_EC2"===process.env.AWS_EXECUTION_ENV)return"aws-ecs";try{if(c().readFileSync("/sys/hypervisor/uuid",{encoding:"utf8"}).trim().toLowerCase().startsWith("ec2"))return"aws-ec2"}catch{}if(process.env.K_SERVICE)return"gcp-cloud-run";if(process.env.GOOGLE_CLOUD_PROJECT)return"gcp";if(process.env.WEBSITE_SITE_NAME||process.env.WEBSITE_SKU)return"azure-app-service";if(process.env.AZURE_FUNCTIONS_ENVIRONMENT)return"azure-functions";if(process.env.APP_URL?.includes("ondigitalocean.app"))return"digitalocean-app-platform";if(process.env.SPACE_CREATOR_USER_ID)return"huggingface-spaces";if(i(process.env.GITHUB_ACTIONS))return"github-actions";if(i(process.env.GITLAB_CI))return"gitlab-ci";if(process.env.CIRCLECI)return"circleci";if(process.env.BUILDKITE)return"buildkite";if(i(process.env.CI))return"ci";if(process.env.KUBERNETES_SERVICE_HOST)return"kubernetes";try{if(c().existsSync("/.dockerenv"))return"docker"}catch{}return"darwin"===env.platform?"unknown-darwin":"linux"===env.platform?"unknown-linux":"win32"===env.platform?"unknown-win32":"unknown"});function isSSHSession(){return!!(process.env.SSH_CONNECTION||process.env.SSH_CLIENT||process.env.SSH_TTY)}export const env={hasInternetAccess:a,isCI:i(process.env.CI),platform:["win32","darwin"].includes(process.platform)?process.platform:"linux",arch:process.arch,nodeVersion:process.version,terminal:function(){if(process.env.CURSOR_TRACE_ID)return"cursor";if(process.env.VSCODE_GIT_ASKPASS_MAIN?.includes("cursor"))return"cursor";if(process.env.VSCODE_GIT_ASKPASS_MAIN?.includes("windsurf"))return"windsurf";if(process.env.VSCODE_GIT_ASKPASS_MAIN?.includes("antigravity"))return"antigravity";const e=process.env.__CFBundleIdentifier?.toLowerCase();if(e?.includes("vscodium"))return"codium";if(e?.includes("windsurf"))return"windsurf";if(e?.includes("com.google.android.studio"))return"androidstudio";if(e)for(const r of JETBRAINS_IDES)if(e.includes(r))return r;if(process.env.VisualStudioVersion)return"visualstudio";if("JetBrains-JediTerm"===process.env.TERMINAL_EMULATOR)return process.platform,"pycharm";if("xterm-ghostty"===process.env.TERM)return"ghostty";if(process.env.TERM?.includes("kitty"))return"kitty";if(process.env.TERM_PROGRAM)return process.env.TERM_PROGRAM;if(process.env.TMUX)return"tmux";if(process.env.STY)return"screen";if(process.env.KONSOLE_VERSION)return"konsole";if(process.env.GNOME_TERMINAL_SERVICE)return"gnome-terminal";if(process.env.XTERM_VERSION)return"xterm";if(process.env.VTE_VERSION)return"vte-based";if(process.env.TERMINATOR_UUID)return"terminator";if(process.env.KITTY_WINDOW_ID)return"kitty";if(process.env.ALACRITTY_LOG)return"alacritty";if(process.env.TILIX_ID)return"tilix";if(process.env.WT_SESSION)return"windows-terminal";if(process.env.SESSIONNAME&&"cygwin"===process.env.TERM)return"cygwin";if(process.env.MSYSTEM)return process.env.MSYSTEM.toLowerCase();if(process.env.ConEmuANSI||process.env.ConEmuPID||process.env.ConEmuTask)return"conemu";if(process.env.WSL_DISTRO_NAME)return`wsl-${process.env.WSL_DISTRO_NAME}`;if(isSSHSession())return"ssh-session";if(process.env.TERM){const e=process.env.TERM;return e.includes("alacritty")?"alacritty":e.includes("rxvt")?"rxvt":e.includes("termite")?"termite":process.env.TERM}return process.stdout.isTTY?null:"non-interactive"}(),isSSH:isSSHSession,getPackageManagers:p,getRuntimes:E,isRunningWithBun:e(s),isWslEnvironment:f,isNpmFromWindowsPath:v,isConductor:function(){return"com.conductor.app"===process.env.__CFBundleIdentifier},detectDeploymentEnvironment};export function getHostPlatformForAnalytics(){const e=process.env.CONTEXT_CODE_HOST_PLATFORM??process.env.CLAUDE_CODE_HOST_PLATFORM;return"win32"===e||"darwin"===e||"linux"===e?e:env.platform}
@@ -1 +1 @@
1
- import{createRequire as e}from"module";const n=e(import.meta.url);import r from"lodash-es/memoize.js";import{homedir as t}from"os";import{join as o}from"path";export const getContextConfigHomeDir=r(()=>(process.env.CONTEXT_CONFIG_DIR??o(t(),".context")).normalize("NFC"),()=>`${process.env.CONTEXT_CONFIG_DIR??""}`);export const getClaudeConfigHomeDir=getContextConfigHomeDir;export function getTeamsDir(){return o(getContextConfigHomeDir(),"teams")}export function hasNodeOption(e){const n=process.env.NODE_OPTIONS;return!!n&&n.split(/\s+/).includes(e)}export function isEnvTruthy(e){if(!e)return!1;if("boolean"==typeof e)return e;const n=e.toLowerCase().trim();return["1","true","yes","on"].includes(n)}export function isEnvDefinedFalsy(e){if(void 0===e)return!1;if("boolean"==typeof e)return!e;if(!e)return!1;const n=e.toLowerCase().trim();return["0","false","no","off"].includes(n)}export function isBareMode(){return isEnvTruthy(process.env.CONTEXT_CODE_SIMPLE)||isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)||process.argv.includes("--bare")}export function parseEnvVars(e){const n={};if(e)for(const r of e){const[e,...t]=r.split("=");if(!e||0===t.length)throw new Error(`Invalid environment variable format: ${r}, environment variables should be added as: -e KEY1=value1 -e KEY2=value2`);n[e]=t.join("=")}return n}export function getAWSRegion(){return process.env.AWS_REGION||process.env.AWS_DEFAULT_REGION||"us-east-1"}export function getDefaultVertexRegion(){return process.env.CLOUD_ML_REGION||"us-east5"}export function shouldMaintainProjectWorkingDir(){return isEnvTruthy(process.env.CONTEXT_BASH_MAINTAIN_PROJECT_WORKING_DIR)||isEnvTruthy(process.env.CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR)}export function readForkEnvVar(e,n){return process.env[e]??process.env[n]}export function isForkEnvVarTruthy(e,n){return isEnvTruthy(process.env[e])||isEnvTruthy(process.env[n])}export function isBackgroundTasksDisabled(){return isForkEnvVarTruthy("CONTEXT_CODE_DISABLE_BACKGROUND_TASKS","CLAUDE_CODE_DISABLE_BACKGROUND_TASKS")}export function isCoordinatorMode(){return isForkEnvVarTruthy("CONTEXT_CODE_COORDINATOR_MODE","CLAUDE_CODE_COORDINATOR_MODE")}export function isRunningOnHomespace(){return"ant"===process.env.USER_TYPE&&isEnvTruthy(process.env.COO_RUNNING_ON_HOMESPACE)}export function isInProtectedNamespace(){return"ant"===process.env.USER_TYPE&&n("./protectedNamespace.js").checkProtectedNamespace()}const s=[["claude-haiku-4-5","VERTEX_REGION_CLAUDE_HAIKU_4_5"],["claude-3-5-haiku","VERTEX_REGION_CLAUDE_3_5_HAIKU"],["claude-3-5-sonnet","VERTEX_REGION_CLAUDE_3_5_SONNET"],["claude-3-7-sonnet","VERTEX_REGION_CLAUDE_3_7_SONNET"],["claude-opus-4-1","VERTEX_REGION_CLAUDE_4_1_OPUS"],["claude-opus-4","VERTEX_REGION_CLAUDE_4_0_OPUS"],["claude-sonnet-4-6","VERTEX_REGION_CLAUDE_4_6_SONNET"],["claude-sonnet-4-5","VERTEX_REGION_CLAUDE_4_5_SONNET"],["claude-sonnet-4","VERTEX_REGION_CLAUDE_4_0_SONNET"]];export function getVertexRegionForModel(e){if(e){const n=s.find(([n])=>e.startsWith(n));if(n)return process.env[n[1]]||getDefaultVertexRegion()}return getDefaultVertexRegion()}
1
+ import{createRequire as e}from"module";const n=e(import.meta.url);import r from"lodash-es/memoize.js";import{homedir as o}from"os";import{join as t}from"path";export const getContextConfigHomeDir=r(()=>(process.env.CONTEXT_CONFIG_DIR??t(o(),".context")).normalize("NFC"),()=>`${process.env.CONTEXT_CONFIG_DIR??""}`);export const getClaudeConfigHomeDir=getContextConfigHomeDir;export function getTeamsDir(){return t(getContextConfigHomeDir(),"teams")}export function hasNodeOption(e){const n=process.env.NODE_OPTIONS;return!!n&&n.split(/\s+/).includes(e)}export function isEnvTruthy(e){if(!e)return!1;if("boolean"==typeof e)return e;const n=e.toLowerCase().trim();return["1","true","yes","on"].includes(n)}export function isEnvDefinedFalsy(e){if(void 0===e)return!1;if("boolean"==typeof e)return!e;if(!e)return!1;const n=e.toLowerCase().trim();return["0","false","no","off"].includes(n)}export function isBareMode(){return isEnvTruthy(process.env.CONTEXT_CODE_SIMPLE)||isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)||process.argv.includes("--bare")}export function parseEnvVars(e){const n={};if(e)for(const r of e){const[e,...o]=r.split("=");if(!e||0===o.length)throw new Error(`Invalid environment variable format: ${r}, environment variables should be added as: -e KEY1=value1 -e KEY2=value2`);n[e]=o.join("=")}return n}export function getAWSRegion(){return process.env.AWS_REGION||process.env.AWS_DEFAULT_REGION||"us-east-1"}export function getDefaultVertexRegion(){return process.env.CLOUD_ML_REGION||"us-east5"}export function shouldMaintainProjectWorkingDir(){return isEnvTruthy(process.env.CONTEXT_BASH_MAINTAIN_PROJECT_WORKING_DIR)||isEnvTruthy(process.env.CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR)}export function readForkEnvVar(e,n){return process.env[e]??process.env[n]}export function isForkEnvVarTruthy(e,n){return isEnvTruthy(process.env[e])||isEnvTruthy(process.env[n])}export function isBackgroundTasksDisabled(){return isForkEnvVarTruthy("CONTEXT_CODE_DISABLE_BACKGROUND_TASKS","CLAUDE_CODE_DISABLE_BACKGROUND_TASKS")}export function isCoordinatorMode(){return isForkEnvVarTruthy("CONTEXT_CODE_COORDINATOR_MODE","CLAUDE_CODE_COORDINATOR_MODE")}export function isRunningOnHomespace(){return"ant"===process.env.USER_TYPE&&isEnvTruthy(process.env.COO_RUNNING_ON_HOMESPACE)}export function isInProtectedNamespace(){return"ant"===process.env.USER_TYPE&&n("./protectedNamespace.js").checkProtectedNamespace()}const s=[["claude-haiku-4-5","VERTEX_REGION_CLAUDE_HAIKU_4_5"],["claude-3-5-haiku","VERTEX_REGION_CLAUDE_3_5_HAIKU"],["claude-3-5-sonnet","VERTEX_REGION_CLAUDE_3_5_SONNET"],["claude-3-7-sonnet","VERTEX_REGION_CLAUDE_3_7_SONNET"],["claude-opus-4-8","VERTEX_REGION_CLAUDE_4_8_OPUS"],["claude-opus-4-1","VERTEX_REGION_CLAUDE_4_1_OPUS"],["claude-opus-4","VERTEX_REGION_CLAUDE_4_0_OPUS"],["claude-sonnet-4-6","VERTEX_REGION_CLAUDE_4_6_SONNET"],["claude-sonnet-4-5","VERTEX_REGION_CLAUDE_4_5_SONNET"],["claude-sonnet-4","VERTEX_REGION_CLAUDE_4_0_SONNET"]];export function getVertexRegionForModel(e){if(e){const n=s.find(([n])=>e.startsWith(n));if(n)return process.env[n[1]]||getDefaultVertexRegion()}return getDefaultVertexRegion()}
@@ -1 +1 @@
1
- import{createHash as t}from"crypto";import{readFileSync as e,realpathSync as r,statSync as o}from"fs";import{open as n,readFile as i,realpath as s,stat as a}from"fs/promises";import c from"lodash-es/memoize.js";import{basename as u,dirname as l,join as f,resolve as p,sep as m}from"path";import{hasBinaryExtension as d,isBinaryContent as g}from"../constants/files.js";import{getCwd as h}from"./cwd.js";import{logForDebugging as y}from"./debug.js";import{logForDiagnosticsNoPII as w}from"./diagLogs.js";import{execFileNoThrow as _}from"./execFileNoThrow.js";import{getFsImplementation as x}from"./fsOperations.js";import{getCachedBranch as E,getCachedDefaultBranch as b,getCachedHead as k,getCachedRemoteUrl as D,getWorktreeCountFromFs as O,isShallowClone as H,resolveGitDir as R}from"./git/gitFilesystem.js";import{logError as v}from"./log.js";import{memoizeWithLRU as C}from"./memoize.js";import{whichSync as F}from"./which.js";const G=Symbol("git-root-not-found"),A=C(t=>{const e=Date.now();w("info","find_git_root_started");let r=p(t);const n=r.substring(0,r.indexOf(m)+1)||m;let i=0;for(;r!==n;){try{const t=f(r,".git");i++;const n=o(t);if(n.isDirectory()||n.isFile())return w("info","find_git_root_completed",{duration_ms:Date.now()-e,stat_count:i,found:!0}),r.normalize("NFC")}catch{}const t=l(r);if(t===r)break;r=t}try{const t=f(n,".git");i++;const r=o(t);if(r.isDirectory()||r.isFile())return w("info","find_git_root_completed",{duration_ms:Date.now()-e,stat_count:i,found:!0}),n.normalize("NFC")}catch{}return w("info","find_git_root_completed",{duration_ms:Date.now()-e,stat_count:i,found:!1}),G},t=>t,50);export const findGitRoot=function(){function wrapper(t){const e=A(t);return e===G?null:e}return wrapper.cache=A.cache,wrapper}();const S=C(t=>{try{const o=e(f(t,".git"),"utf-8").trim();if(!o.startsWith("gitdir:"))return t;const n=p(t,o.slice(7).trim()),i=p(n,e(f(n,"commondir"),"utf-8").trim());if(p(l(n))!==f(i,"worktrees"))return t;return r(e(f(n,"gitdir"),"utf-8").trim())!==f(r(t),".git")?t:".git"!==u(i)?i.normalize("NFC"):l(i).normalize("NFC")}catch{return t}},t=>t,50);export const findCanonicalGitRoot=function(){function wrapper(t){const e=findGitRoot(t);return e?S(e):null}return wrapper.cache=S.cache,wrapper}();export const gitExe=c(()=>F("git")||"git");export const getIsGit=c(async()=>{const t=Date.now();w("info","is_git_check_started");const e=null!==findGitRoot(h());return w("info","is_git_check_completed",{duration_ms:Date.now()-t,is_git:e}),e});export function getGitDir(t){return R(t)}export async function isAtGitRoot(){const t=h(),e=findGitRoot(t);if(!e)return!1;try{const[r,o]=await Promise.all([s(t),s(e)]);return r===o}catch{return t===e}}export const dirIsInGitRepo=async t=>null!==findGitRoot(t);export const getHead=async()=>k();export const getBranch=async()=>E();export const getDefaultBranch=async()=>b();export const getRemoteUrl=async()=>D();export function normalizeGitRemoteUrl(t){const e=t.trim();if(!e)return null;const r=e.match(/^git@([^:]+):(.+?)(?:\.git)?$/);if(r&&r[1]&&r[2])return`${r[1]}/${r[2]}`.toLowerCase();const o=e.match(/^(?:https?|ssh):\/\/(?:[^@]+@)?([^/]+)\/(.+?)(?:\.git)?$/);if(o&&o[1]&&o[2]){const t=o[1],e=o[2];if(function(t){const e=t.split(":")[0]??"";return"localhost"===e||/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(e)}(t)&&e.startsWith("git/")){const t=e.slice(4),r=t.split("/");return r.length>=3&&r[0].includes(".")?t.toLowerCase():`github.com/${t}`.toLowerCase()}return`${t}/${e}`.toLowerCase()}return null}export async function getRepoRemoteHash(){const e=await getRemoteUrl();if(!e)return null;const r=normalizeGitRemoteUrl(e);if(!r)return null;return t("sha256").update(r).digest("hex").substring(0,16)}export const getIsHeadOnRemote=async()=>{const{code:t}=await _(gitExe(),["rev-parse","@{u}"],{preserveOutputOnError:!1});return 0===t};export const hasUnpushedCommits=async()=>{const{stdout:t,code:e}=await _(gitExe(),["rev-list","--count","@{u}..HEAD"],{preserveOutputOnError:!1});return 0===e&&parseInt(t.trim(),10)>0};export const getIsClean=async t=>{const e=["--no-optional-locks","status","--porcelain"];t?.ignoreUntracked&&e.push("-uno");const{stdout:r}=await _(gitExe(),e,{preserveOutputOnError:!1});return 0===r.trim().length};export const getChangedFiles=async()=>{const{stdout:t}=await _(gitExe(),["--no-optional-locks","status","--porcelain"],{preserveOutputOnError:!1});return t.trim().split("\n").map(t=>t.trim().split(" ",2)[1]?.trim()).filter(t=>"string"==typeof t)};export const getFileStatus=async()=>{const{stdout:t}=await _(gitExe(),["--no-optional-locks","status","--porcelain"],{preserveOutputOnError:!1}),e=[],r=[];return t.trim().split("\n").filter(t=>t.length>0).forEach(t=>{const o=t.substring(0,2),n=t.substring(2).trim();"??"===o?r.push(n):n&&e.push(n)}),{tracked:e,untracked:r}};export const getWorktreeCount=async()=>O();export const stashToCleanState=async t=>{try{const e=t||`Context Code auto-stash - ${(new Date).toISOString()}`,{untracked:r}=await getFileStatus();if(r.length>0){const{code:t}=await _(gitExe(),["add",...r],{preserveOutputOnError:!1});if(0!==t)return!1}const{code:o}=await _(gitExe(),["stash","push","--message",e],{preserveOutputOnError:!1});return 0===o}catch(t){return!1}};export async function getGitState(){try{const[t,e,r,o,n,i]=await Promise.all([getHead(),getBranch(),getRemoteUrl(),getIsHeadOnRemote(),getIsClean(),getWorktreeCount()]);return{commitHash:t,branchName:e,remoteUrl:r,isHeadOnRemote:o,isClean:n,worktreeCount:i}}catch(t){return null}}export async function getGithubRepo(){const{parseGitRemote:t}=await import("./detectRepository.js"),e=await getRemoteUrl();if(!e)return y("Local GitHub repo: unknown"),null;const r=t(e);if(r&&"github.com"===r.host){const t=`${r.owner}/${r.name}`;return y(`Local GitHub repo: ${t}`),t}return y("Local GitHub repo: unknown"),null}const U=524288e3,$=5368709120;export async function findRemoteBase(){const{stdout:t,code:e}=await _(gitExe(),["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],{preserveOutputOnError:!1});if(0===e&&t.trim())return t.trim();const{stdout:r,code:o}=await _(gitExe(),["remote","show","origin","--","HEAD"],{preserveOutputOnError:!1});if(0===o){const t=r.match(/HEAD branch: (\S+)/);if(t&&t[1])return`origin/${t[1]}`}const n=["origin/main","origin/staging","origin/master"];for(const t of n){const{code:e}=await _(gitExe(),["rev-parse","--verify",t],{preserveOutputOnError:!1});if(0===e)return t}return null}async function captureUntrackedFiles(){const{stdout:t,code:e}=await _(gitExe(),["ls-files","--others","--exclude-standard"],{preserveOutputOnError:!1}),r=t.trim();if(0!==e||!r)return[];const o=r.split("\n").filter(Boolean),s=[];let c=0;for(const t of o){if(s.length>=2e4){y("Untracked file capture: reached max file count (20000)");break}if(!d(t))try{const e=(await a(t)).size;if(e>U){y(`Untracked file capture: skipping ${t} (exceeds 524288000 bytes)`);continue}if(c+e>$){y("Untracked file capture: reached total size limit (5368709120 bytes)");break}if(0===e){s.push({path:t,content:""});continue}const r=Math.min(65536,e),o=await n(t,"r");try{const n=Buffer.alloc(r),{bytesRead:a}=await o.read(n,0,r,0),u=n.subarray(0,a);if(g(u))continue;let l;l=e<=r?u.toString("utf-8"):await i(t,"utf-8"),s.push({path:t,content:l}),c+=e}finally{await o.close()}}catch(e){y(`Failed to read untracked file ${t}: ${e}`)}}return s}export async function preserveGitStateForIssue(){try{if(!await getIsGit())return null;if(await H()){y("Shallow clone detected, using HEAD-only mode for issue");const[{stdout:t},e]=await Promise.all([_(gitExe(),["diff","HEAD"]),captureUntrackedFiles()]);return{remote_base_sha:null,remote_base:null,patch:t||"",untracked_files:e,format_patch:null,head_sha:null,branch_name:null}}const t=await findRemoteBase();if(!t){y("No remote found, using HEAD-only mode for issue");const[{stdout:t},e]=await Promise.all([_(gitExe(),["diff","HEAD"]),captureUntrackedFiles()]);return{remote_base_sha:null,remote_base:null,patch:t||"",untracked_files:e,format_patch:null,head_sha:null,branch_name:null}}const{stdout:e,code:r}=await _(gitExe(),["merge-base","HEAD",t],{preserveOutputOnError:!1});if(0!==r||!e.trim()){y("Merge-base failed, using HEAD-only mode for issue");const[{stdout:t},e]=await Promise.all([_(gitExe(),["diff","HEAD"]),captureUntrackedFiles()]);return{remote_base_sha:null,remote_base:null,patch:t||"",untracked_files:e,format_patch:null,head_sha:null,branch_name:null}}const o=e.trim(),[{stdout:n},i,{stdout:s,code:a},{stdout:c},{stdout:u}]=await Promise.all([_(gitExe(),["diff",o]),captureUntrackedFiles(),_(gitExe(),["format-patch",`${o}..HEAD`,"--stdout"]),_(gitExe(),["rev-parse","HEAD"]),_(gitExe(),["rev-parse","--abbrev-ref","HEAD"])]);let l=null;0===a&&s&&s.trim()&&(l=s);const f=u?.trim();return{remote_base_sha:o,remote_base:t,patch:n||"",untracked_files:i,format_patch:l,head_sha:c?.trim()||null,branch_name:f&&"HEAD"!==f?f:null}}catch(t){return v(t),null}}export function isCurrentDirectoryBareGitRepo(){const t=x(),e=h(),r=f(e,".git");try{const e=t.statSync(r);if(e.isFile())return!1;if(e.isDirectory()){const e=f(r,"HEAD");try{if(t.statSync(e).isFile())return!1}catch{}}}catch{}try{if(t.statSync(f(e,"HEAD")).isFile())return!0}catch{}try{if(t.statSync(f(e,"objects")).isDirectory())return!0}catch{}try{if(t.statSync(f(e,"refs")).isDirectory())return!0}catch{}return!1}
1
+ import{createHash as t}from"crypto";import{readFileSync as e,realpathSync as r,statSync as o}from"fs";import{open as n,readFile as i,realpath as s,stat as a}from"fs/promises";import c from"lodash-es/memoize.js";import{basename as u,dirname as l,join as f,resolve as p,sep as m}from"path";import{hasBinaryExtension as d,isBinaryContent as g}from"../constants/files.js";import{getCwd as h}from"./cwd.js";import{logForDebugging as y}from"./debug.js";import{logForDiagnosticsNoPII as w}from"./diagLogs.js";import{execFileNoThrow as _}from"./execFileNoThrow.js";import{getFsImplementation as E}from"./fsOperations.js";import{getCachedBranch as x,getCachedDefaultBranch as b,getCachedHead as O,getCachedRemoteUrl as k,getWorktreeCountFromFs as D,isShallowClone as R,resolveGitDir as C}from"./git/gitFilesystem.js";import{logError as H}from"./log.js";import{memoizeWithLRU as v}from"./memoize.js";import{whichSync as F}from"./which.js";const G=Symbol("git-root-not-found"),S=v(t=>{const e=Date.now();w("info","find_git_root_started");let r=p(t);const n=r.substring(0,r.indexOf(m)+1)||m;let i=0;for(;r!==n;){try{const t=f(r,".git");i++;const n=o(t);if(n.isDirectory()||n.isFile())return w("info","find_git_root_completed",{duration_ms:Date.now()-e,stat_count:i,found:!0}),r.normalize("NFC")}catch{}if("1"===process.env.CONTEXT_SUBPROJECT_ONLY)break;const t=l(r);if(t===r)break;r=t}if("1"!==process.env.CONTEXT_SUBPROJECT_ONLY)try{const t=f(n,".git");i++;const r=o(t);if(r.isDirectory()||r.isFile())return w("info","find_git_root_completed",{duration_ms:Date.now()-e,stat_count:i,found:!0}),n.normalize("NFC")}catch{}return w("info","find_git_root_completed",{duration_ms:Date.now()-e,stat_count:i,found:!1}),G},t=>t,50);export const findGitRoot=function(){function wrapper(t){const e=S(t);return e===G?null:e}return wrapper.cache=S.cache,wrapper}();const U=v(t=>{try{const o=e(f(t,".git"),"utf-8").trim();if(!o.startsWith("gitdir:"))return t;const n=p(t,o.slice(7).trim()),i=p(n,e(f(n,"commondir"),"utf-8").trim());if(p(l(n))!==f(i,"worktrees"))return t;return r(e(f(n,"gitdir"),"utf-8").trim())!==f(r(t),".git")?t:".git"!==u(i)?i.normalize("NFC"):l(i).normalize("NFC")}catch{return t}},t=>t,50);export const findCanonicalGitRoot=function(){function wrapper(t){const e=findGitRoot(t);return e?U(e):null}return wrapper.cache=U.cache,wrapper}();export const gitExe=c(()=>F("git")||"git");export const getIsGit=c(async()=>{const t=Date.now();w("info","is_git_check_started");const e=null!==findGitRoot(h());return w("info","is_git_check_completed",{duration_ms:Date.now()-t,is_git:e}),e});export function getGitDir(t){return C(t)}export async function isAtGitRoot(){const t=h(),e=findGitRoot(t);if(!e)return!1;try{const[r,o]=await Promise.all([s(t),s(e)]);return r===o}catch{return t===e}}export const dirIsInGitRepo=async t=>null!==findGitRoot(t);export const getHead=async()=>O();export const getBranch=async()=>x();export const getDefaultBranch=async()=>b();export const getRemoteUrl=async()=>k();export function normalizeGitRemoteUrl(t){const e=t.trim();if(!e)return null;const r=e.match(/^git@([^:]+):(.+?)(?:\.git)?$/);if(r&&r[1]&&r[2])return`${r[1]}/${r[2]}`.toLowerCase();const o=e.match(/^(?:https?|ssh):\/\/(?:[^@]+@)?([^/]+)\/(.+?)(?:\.git)?$/);if(o&&o[1]&&o[2]){const t=o[1],e=o[2];if(function(t){const e=t.split(":")[0]??"";return"localhost"===e||/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(e)}(t)&&e.startsWith("git/")){const t=e.slice(4),r=t.split("/");return r.length>=3&&r[0].includes(".")?t.toLowerCase():`github.com/${t}`.toLowerCase()}return`${t}/${e}`.toLowerCase()}return null}export async function getRepoRemoteHash(){const e=await getRemoteUrl();if(!e)return null;const r=normalizeGitRemoteUrl(e);if(!r)return null;return t("sha256").update(r).digest("hex").substring(0,16)}export const getIsHeadOnRemote=async()=>{const{code:t}=await _(gitExe(),["rev-parse","@{u}"],{preserveOutputOnError:!1});return 0===t};export const hasUnpushedCommits=async()=>{const{stdout:t,code:e}=await _(gitExe(),["rev-list","--count","@{u}..HEAD"],{preserveOutputOnError:!1});return 0===e&&parseInt(t.trim(),10)>0};export const getIsClean=async t=>{const e=["--no-optional-locks","status","--porcelain"];t?.ignoreUntracked&&e.push("-uno");const{stdout:r}=await _(gitExe(),e,{preserveOutputOnError:!1});return 0===r.trim().length};export const getChangedFiles=async()=>{const{stdout:t}=await _(gitExe(),["--no-optional-locks","status","--porcelain"],{preserveOutputOnError:!1});return t.trim().split("\n").map(t=>t.trim().split(" ",2)[1]?.trim()).filter(t=>"string"==typeof t)};export const getFileStatus=async()=>{const{stdout:t}=await _(gitExe(),["--no-optional-locks","status","--porcelain"],{preserveOutputOnError:!1}),e=[],r=[];return t.trim().split("\n").filter(t=>t.length>0).forEach(t=>{const o=t.substring(0,2),n=t.substring(2).trim();"??"===o?r.push(n):n&&e.push(n)}),{tracked:e,untracked:r}};export const getWorktreeCount=async()=>D();export const stashToCleanState=async t=>{try{const e=t||`Context Code auto-stash - ${(new Date).toISOString()}`,{untracked:r}=await getFileStatus();if(r.length>0){const{code:t}=await _(gitExe(),["add",...r],{preserveOutputOnError:!1});if(0!==t)return!1}const{code:o}=await _(gitExe(),["stash","push","--message",e],{preserveOutputOnError:!1});return 0===o}catch(t){return!1}};export async function getGitState(){try{const[t,e,r,o,n,i]=await Promise.all([getHead(),getBranch(),getRemoteUrl(),getIsHeadOnRemote(),getIsClean(),getWorktreeCount()]);return{commitHash:t,branchName:e,remoteUrl:r,isHeadOnRemote:o,isClean:n,worktreeCount:i}}catch(t){return null}}export async function getGithubRepo(){const{parseGitRemote:t}=await import("./detectRepository.js"),e=await getRemoteUrl();if(!e)return y("Local GitHub repo: unknown"),null;const r=t(e);if(r&&"github.com"===r.host){const t=`${r.owner}/${r.name}`;return y(`Local GitHub repo: ${t}`),t}return y("Local GitHub repo: unknown"),null}const A=524288e3,$=5368709120;export async function findRemoteBase(){const{stdout:t,code:e}=await _(gitExe(),["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],{preserveOutputOnError:!1});if(0===e&&t.trim())return t.trim();const{stdout:r,code:o}=await _(gitExe(),["remote","show","origin","--","HEAD"],{preserveOutputOnError:!1});if(0===o){const t=r.match(/HEAD branch: (\S+)/);if(t&&t[1])return`origin/${t[1]}`}const n=["origin/main","origin/staging","origin/master"];for(const t of n){const{code:e}=await _(gitExe(),["rev-parse","--verify",t],{preserveOutputOnError:!1});if(0===e)return t}return null}async function captureUntrackedFiles(){const{stdout:t,code:e}=await _(gitExe(),["ls-files","--others","--exclude-standard"],{preserveOutputOnError:!1}),r=t.trim();if(0!==e||!r)return[];const o=r.split("\n").filter(Boolean),s=[];let c=0;for(const t of o){if(s.length>=2e4){y("Untracked file capture: reached max file count (20000)");break}if(!d(t))try{const e=(await a(t)).size;if(e>A){y(`Untracked file capture: skipping ${t} (exceeds 524288000 bytes)`);continue}if(c+e>$){y("Untracked file capture: reached total size limit (5368709120 bytes)");break}if(0===e){s.push({path:t,content:""});continue}const r=Math.min(65536,e),o=await n(t,"r");try{const n=Buffer.alloc(r),{bytesRead:a}=await o.read(n,0,r,0),u=n.subarray(0,a);if(g(u))continue;let l;l=e<=r?u.toString("utf-8"):await i(t,"utf-8"),s.push({path:t,content:l}),c+=e}finally{await o.close()}}catch(e){y(`Failed to read untracked file ${t}: ${e}`)}}return s}export async function preserveGitStateForIssue(){try{if(!await getIsGit())return null;if(await R()){y("Shallow clone detected, using HEAD-only mode for issue");const[{stdout:t},e]=await Promise.all([_(gitExe(),["diff","HEAD"]),captureUntrackedFiles()]);return{remote_base_sha:null,remote_base:null,patch:t||"",untracked_files:e,format_patch:null,head_sha:null,branch_name:null}}const t=await findRemoteBase();if(!t){y("No remote found, using HEAD-only mode for issue");const[{stdout:t},e]=await Promise.all([_(gitExe(),["diff","HEAD"]),captureUntrackedFiles()]);return{remote_base_sha:null,remote_base:null,patch:t||"",untracked_files:e,format_patch:null,head_sha:null,branch_name:null}}const{stdout:e,code:r}=await _(gitExe(),["merge-base","HEAD",t],{preserveOutputOnError:!1});if(0!==r||!e.trim()){y("Merge-base failed, using HEAD-only mode for issue");const[{stdout:t},e]=await Promise.all([_(gitExe(),["diff","HEAD"]),captureUntrackedFiles()]);return{remote_base_sha:null,remote_base:null,patch:t||"",untracked_files:e,format_patch:null,head_sha:null,branch_name:null}}const o=e.trim(),[{stdout:n},i,{stdout:s,code:a},{stdout:c},{stdout:u}]=await Promise.all([_(gitExe(),["diff",o]),captureUntrackedFiles(),_(gitExe(),["format-patch",`${o}..HEAD`,"--stdout"]),_(gitExe(),["rev-parse","HEAD"]),_(gitExe(),["rev-parse","--abbrev-ref","HEAD"])]);let l=null;0===a&&s&&s.trim()&&(l=s);const f=u?.trim();return{remote_base_sha:o,remote_base:t,patch:n||"",untracked_files:i,format_patch:l,head_sha:c?.trim()||null,branch_name:f&&"HEAD"!==f?f:null}}catch(t){return H(t),null}}export function isCurrentDirectoryBareGitRepo(){const t=E(),e=h(),r=f(e,".git");try{const e=t.statSync(r);if(e.isFile())return!1;if(e.isDirectory()){const e=f(r,"HEAD");try{if(t.statSync(e).isFile())return!1}catch{}}}catch{}try{if(t.statSync(f(e,"HEAD")).isFile())return!0}catch{}try{if(t.statSync(f(e,"objects")).isDirectory())return!0}catch{}try{if(t.statSync(f(e,"refs")).isDirectory())return!0}catch{}return!1}
@@ -1 +1 @@
1
- import{MACRO as t}from"../recovery/bunBundleShim.js";import{access as e,chmod as n,writeFile as r}from"fs/promises";import{join as a}from"path";import{saveGlobalConfig as o}from"./config.js";import{getClaudeConfigHomeDir as i}from"./envUtils.js";import{getErrnoCode as l}from"./errors.js";import{execFileNoThrowWithCwd as s}from"./execFileNoThrow.js";import{getFsImplementation as c}from"./fsOperations.js";import{logError as u}from"./log.js";import{jsonStringify as f}from"./slowOperations.js";function getLocalInstallDir(){return a(i(),"local")}export function getLocalClaudePath(){return a(getLocalInstallDir(),"claude")}export function isRunningFromLocalInstallation(){return(process.argv[1]||"").includes("/.claude/local/node_modules/")}async function writeIfMissing(t,e,n){try{return await r(t,e,{encoding:"utf8",flag:"wx",mode:n}),!0}catch(t){if("EEXIST"===l(t))return!1;throw t}}export async function ensureLocalPackageEnvironment(){try{const t=getLocalInstallDir();await c().mkdir(t),await writeIfMissing(a(t,"package.json"),f({name:"claude-local",version:"0.0.1",private:!0},null,2));const e=a(t,"claude");return await writeIfMissing(e,`#!/bin/sh\nexec "${t}/node_modules/.bin/claude" "$@"`,493)&&await n(e,493),!0}catch(t){return u(t),!1}}export async function installOrUpdateClaudePackage(e,n){try{if(!await ensureLocalPackageEnvironment())return"install_failed";const r=n||("stable"===e?"stable":"latest"),a=await s("npm",["install",`${t.PACKAGE_URL}@${r}`],{cwd:getLocalInstallDir(),maxBuffer:1e6});if(0!==a.code){const t=new Error(`Failed to install Claude CLI package: ${a.stderr}`);return u(t),190===a.code?"in_progress":"install_failed"}return o(t=>({...t,installMethod:"local"})),"success"}catch(t){return u(t),"install_failed"}}export async function localInstallationExists(){try{return await e(a(getLocalInstallDir(),"node_modules",".bin","claude")),!0}catch{return!1}}export function getShellType(){const t=process.env.SHELL||"";return t.includes("zsh")?"zsh":t.includes("bash")?"bash":t.includes("fish")?"fish":"unknown"}
1
+ import{MACRO as t}from"../recovery/bunBundleShim.js";import{access as e,chmod as a,writeFile as n}from"fs/promises";import{join as r}from"path";import{saveGlobalConfig as o}from"./config.js";import{getClaudeConfigHomeDir as l}from"./envUtils.js";import{getErrnoCode as i}from"./errors.js";import{execFileNoThrowWithCwd as s}from"./execFileNoThrow.js";import{getFsImplementation as c}from"./fsOperations.js";import{logError as u}from"./log.js";import{jsonStringify as d}from"./slowOperations.js";function getLocalInstallDir(){return r(l(),"local")}export function getLocalClaudePath(){return r(getLocalInstallDir(),"claude")}export function isRunningFromLocalInstallation(){return(process.argv[1]||"").includes("/.claude/local/node_modules/")}async function writeIfMissing(t,e,a){try{return await n(t,e,{encoding:"utf8",flag:"wx",mode:a}),!0}catch(t){if("EEXIST"===i(t))return!1;throw t}}export async function ensureLocalPackageEnvironment(){try{const t=getLocalInstallDir();await c().mkdir(t),await writeIfMissing(r(t,"package.json"),d({name:"claude-local",version:"0.0.1",private:!0},null,2));const e=r(t,"claude");return await writeIfMissing(e,`#!/bin/sh\nexec "${t}/node_modules/.bin/claude" "$@"`,493)&&await a(e,493),!0}catch(t){return u(t),!1}}export async function installOrUpdateClaudePackage(e,a){try{if(!await ensureLocalPackageEnvironment())return"install_failed";const n=a||("stable"===e?"stable":"latest"),r=await s("npm",["install",`${t.PACKAGE_URL}@${n}`],{cwd:getLocalInstallDir(),maxBuffer:1e6});if(0!==r.code){const t=new Error(`Failed to install Claude CLI package: ${r.stderr}`);return u(t),190===r.code?"in_progress":"install_failed"}return o(t=>({...t,installMethod:"local"})),"success"}catch(t){return u(t),"install_failed"}}export async function localInstallationExists(){try{return await e(r(getLocalInstallDir(),"node_modules",".bin","claude")),!0}catch{return!1}}export function getShellType(){const t=process.env.SHELL||"";return t.includes("zsh")?"zsh":t.includes("bash")?"bash":t.includes("fish")?"fish":"unknown"}export{installOrUpdateClaudePackage as installOrUpdateContextPackage};
@@ -1 +1 @@
1
- export const CLAUDE_3_7_SONNET_CONFIG={firstParty:"claude-3-7-sonnet-20250219",bedrock:"us.anthropic.claude-3-7-sonnet-20250219-v1:0",vertex:"claude-3-7-sonnet@20250219",foundry:"claude-3-7-sonnet"};export const CLAUDE_3_5_V2_SONNET_CONFIG={firstParty:"claude-3-5-sonnet-20241022",bedrock:"anthropic.claude-3-5-sonnet-20241022-v2:0",vertex:"claude-3-5-sonnet-v2@20241022",foundry:"claude-3-5-sonnet"};export const CLAUDE_3_5_HAIKU_CONFIG={firstParty:"claude-3-5-haiku-20241022",bedrock:"us.anthropic.claude-3-5-haiku-20241022-v1:0",vertex:"claude-3-5-haiku@20241022",foundry:"claude-3-5-haiku"};export const CLAUDE_HAIKU_4_5_CONFIG={firstParty:"claude-haiku-4-5-20251001",bedrock:"us.anthropic.claude-haiku-4-5-20251001-v1:0",vertex:"claude-haiku-4-5@20251001",foundry:"claude-haiku-4-5"};export const CLAUDE_SONNET_4_CONFIG={firstParty:"claude-sonnet-4-20250514",bedrock:"us.anthropic.claude-sonnet-4-20250514-v1:0",vertex:"claude-sonnet-4@20250514",foundry:"claude-sonnet-4"};export const CLAUDE_SONNET_4_5_CONFIG={firstParty:"claude-sonnet-4-5-20250929",bedrock:"us.anthropic.claude-sonnet-4-5-20250929-v1:0",vertex:"claude-sonnet-4-5@20250929",foundry:"claude-sonnet-4-5"};export const CLAUDE_OPUS_4_CONFIG={firstParty:"claude-opus-4-20250514",bedrock:"us.anthropic.claude-opus-4-20250514-v1:0",vertex:"claude-opus-4@20250514",foundry:"claude-opus-4"};export const CLAUDE_OPUS_4_1_CONFIG={firstParty:"claude-opus-4-1-20250805",bedrock:"us.anthropic.claude-opus-4-1-20250805-v1:0",vertex:"claude-opus-4-1@20250805",foundry:"claude-opus-4-1"};export const CLAUDE_OPUS_4_5_CONFIG={firstParty:"claude-opus-4-5-20251101",bedrock:"us.anthropic.claude-opus-4-5-20251101-v1:0",vertex:"claude-opus-4-5@20251101",foundry:"claude-opus-4-5"};export const CLAUDE_OPUS_4_6_CONFIG={firstParty:"claude-opus-4-6",bedrock:"us.anthropic.claude-opus-4-6-v1",vertex:"claude-opus-4-6",foundry:"claude-opus-4-6"};export const CLAUDE_OPUS_4_7_CONFIG={firstParty:"claude-opus-4-7",bedrock:"us.anthropic.claude-opus-4-7-v1",vertex:"claude-opus-4-7",foundry:"claude-opus-4-7"};export const CLAUDE_SONNET_4_6_CONFIG={firstParty:"claude-sonnet-4-6",bedrock:"us.anthropic.claude-sonnet-4-6",vertex:"claude-sonnet-4-6",foundry:"claude-sonnet-4-6"};export const ALL_MODEL_CONFIGS={haiku35:CLAUDE_3_5_HAIKU_CONFIG,haiku45:CLAUDE_HAIKU_4_5_CONFIG,sonnet35:CLAUDE_3_5_V2_SONNET_CONFIG,sonnet37:CLAUDE_3_7_SONNET_CONFIG,sonnet40:CLAUDE_SONNET_4_CONFIG,sonnet45:CLAUDE_SONNET_4_5_CONFIG,sonnet46:CLAUDE_SONNET_4_6_CONFIG,opus40:CLAUDE_OPUS_4_CONFIG,opus41:CLAUDE_OPUS_4_1_CONFIG,opus45:CLAUDE_OPUS_4_5_CONFIG,opus46:CLAUDE_OPUS_4_6_CONFIG,opus47:CLAUDE_OPUS_4_7_CONFIG};export const CANONICAL_MODEL_IDS=Object.values(ALL_MODEL_CONFIGS).map(e=>e.firstParty);export const CANONICAL_ID_TO_KEY=Object.fromEntries(Object.entries(ALL_MODEL_CONFIGS).map(([e,o])=>[o.firstParty,e]));
1
+ export const CLAUDE_3_7_SONNET_CONFIG={firstParty:"claude-3-7-sonnet-20250219",bedrock:"us.anthropic.claude-3-7-sonnet-20250219-v1:0",vertex:"claude-3-7-sonnet@20250219",foundry:"claude-3-7-sonnet"};export const CLAUDE_3_5_V2_SONNET_CONFIG={firstParty:"claude-3-5-sonnet-20241022",bedrock:"anthropic.claude-3-5-sonnet-20241022-v2:0",vertex:"claude-3-5-sonnet-v2@20241022",foundry:"claude-3-5-sonnet"};export const CLAUDE_3_5_HAIKU_CONFIG={firstParty:"claude-3-5-haiku-20241022",bedrock:"us.anthropic.claude-3-5-haiku-20241022-v1:0",vertex:"claude-3-5-haiku@20241022",foundry:"claude-3-5-haiku"};export const CLAUDE_HAIKU_4_5_CONFIG={firstParty:"claude-haiku-4-5-20251001",bedrock:"us.anthropic.claude-haiku-4-5-20251001-v1:0",vertex:"claude-haiku-4-5@20251001",foundry:"claude-haiku-4-5"};export const CLAUDE_SONNET_4_CONFIG={firstParty:"claude-sonnet-4-20250514",bedrock:"us.anthropic.claude-sonnet-4-20250514-v1:0",vertex:"claude-sonnet-4@20250514",foundry:"claude-sonnet-4"};export const CLAUDE_SONNET_4_5_CONFIG={firstParty:"claude-sonnet-4-5-20250929",bedrock:"us.anthropic.claude-sonnet-4-5-20250929-v1:0",vertex:"claude-sonnet-4-5@20250929",foundry:"claude-sonnet-4-5"};export const CLAUDE_OPUS_4_CONFIG={firstParty:"claude-opus-4-20250514",bedrock:"us.anthropic.claude-opus-4-20250514-v1:0",vertex:"claude-opus-4@20250514",foundry:"claude-opus-4"};export const CLAUDE_OPUS_4_1_CONFIG={firstParty:"claude-opus-4-1-20250805",bedrock:"us.anthropic.claude-opus-4-1-20250805-v1:0",vertex:"claude-opus-4-1@20250805",foundry:"claude-opus-4-1"};export const CLAUDE_OPUS_4_5_CONFIG={firstParty:"claude-opus-4-5-20251101",bedrock:"us.anthropic.claude-opus-4-5-20251101-v1:0",vertex:"claude-opus-4-5@20251101",foundry:"claude-opus-4-5"};export const CLAUDE_OPUS_4_6_CONFIG={firstParty:"claude-opus-4-6",bedrock:"us.anthropic.claude-opus-4-6-v1",vertex:"claude-opus-4-6",foundry:"claude-opus-4-6"};export const CLAUDE_OPUS_4_7_CONFIG={firstParty:"claude-opus-4-7",bedrock:"us.anthropic.claude-opus-4-7-v1",vertex:"claude-opus-4-7",foundry:"claude-opus-4-7"};export const CLAUDE_OPUS_4_8_CONFIG={firstParty:"claude-opus-4-8",bedrock:"us.anthropic.claude-opus-4-8-v1",vertex:"claude-opus-4-8",foundry:"claude-opus-4-8"};export const CLAUDE_SONNET_4_6_CONFIG={firstParty:"claude-sonnet-4-6",bedrock:"us.anthropic.claude-sonnet-4-6",vertex:"claude-sonnet-4-6",foundry:"claude-sonnet-4-6"};export const ALL_MODEL_CONFIGS={haiku35:CLAUDE_3_5_HAIKU_CONFIG,haiku45:CLAUDE_HAIKU_4_5_CONFIG,sonnet35:CLAUDE_3_5_V2_SONNET_CONFIG,sonnet37:CLAUDE_3_7_SONNET_CONFIG,sonnet40:CLAUDE_SONNET_4_CONFIG,sonnet45:CLAUDE_SONNET_4_5_CONFIG,sonnet46:CLAUDE_SONNET_4_6_CONFIG,opus40:CLAUDE_OPUS_4_CONFIG,opus41:CLAUDE_OPUS_4_1_CONFIG,opus45:CLAUDE_OPUS_4_5_CONFIG,opus46:CLAUDE_OPUS_4_6_CONFIG,opus47:CLAUDE_OPUS_4_7_CONFIG,opus48:CLAUDE_OPUS_4_8_CONFIG};export const CANONICAL_MODEL_IDS=Object.values(ALL_MODEL_CONFIGS).map(e=>e.firstParty);export const CANONICAL_ID_TO_KEY=Object.fromEntries(Object.entries(ALL_MODEL_CONFIGS).map(([e,o])=>[o.firstParty,e]));
@@ -1 +1 @@
1
- import{getMainLoopModelOverride as e}from"../../bootstrap/state.js";import{getSubscriptionType as t,isClaudeAISubscriber as n,isMaxSubscriber as o,isProSubscriber as r,isTeamPremiumSubscriber as u}from"../auth.js";import{has1mContext as i,is1mContextDisabled as s,modelSupports1M as l}from"../context.js";import{isEnvTruthy as a}from"../envUtils.js";import{getModelStrings as c,resolveOverriddenModel as d}from"./modelStrings.js";import{resolveAntModel as p,getAntModelOverrideConfig as f}from"./antModels.js";export{p as resolveAntModel,f as getAntModelOverrideConfig};import{formatModelPricing as m,getOpus46CostTier as M}from"../modelCost.js";import{getSettings_DEPRECATED as g}from"../settings/settings.js";import{getAPIProvider as O,isOpenAICompatibleProvider as D}from"./providers.js";import{LIGHTNING_BOLT as x}from"../../constants/figures.js";import{isModelAllowed as S}from"./modelAllowlist.js";import{isModelAlias as P}from"./aliases.js";import{capitalize as E}from"../stringUtils.js";export function isOpenAIProvider(){return D(O())}export function isGeminiProvider(){const e=O();return"gemini-api"===e||"gemini-google"===e}export function getSmallFastModel(){return process.env.ANTHROPIC_SMALL_FAST_MODEL||getDefaultHaikuModel()}export function isNonCustomOpusModel(e){return e===c().opus40||e===c().opus41||e===c().opus45||e===c().opus46||e===c().opus47}export function getUserSpecifiedModelSetting(){let t;const n=e();if(void 0!==n)t=n;else{const e=g()||{};t=process.env.ANTHROPIC_MODEL||e.model||void 0}if(!t||S(t))return t}export function getMainLoopModel(){const e=getUserSpecifiedModelSetting();return null!=e?parseUserSpecifiedModel(e):getDefaultMainLoopModel()}export function getBestModel(){return isGeminiProvider()?getDefaultGeminiModel():isOpenAIProvider()?getDefaultOpenAIModel():getDefaultOpusModel()}export function getDefaultOpusModel(){return process.env.ANTHROPIC_DEFAULT_OPUS_MODEL?process.env.ANTHROPIC_DEFAULT_OPUS_MODEL:(O(),c().opus46)}export function getDefaultSonnetModel(){return process.env.ANTHROPIC_DEFAULT_SONNET_MODEL?process.env.ANTHROPIC_DEFAULT_SONNET_MODEL:"firstParty"!==O()?c().sonnet45:c().sonnet46}export function getDefaultHaikuModel(){return process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL?process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL:c().haiku45}export function getDefaultOpenAIModel(){return process.env.OPENAI_DEFAULT_MODEL||"gpt-5.4"}export function getDefaultOpenAIFastModel(){return process.env.OPENAI_DEFAULT_FAST_MODEL||"gpt-5.4-mini"}export function getDefaultGeminiModel(){return process.env.GEMINI_DEFAULT_MODEL||"gemini-3.5-pro"}export function getDefaultGeminiFastModel(){return process.env.GEMINI_DEFAULT_FAST_MODEL||"gemini-3.5-flash"}export function getRuntimeMainLoopModel(e){const{permissionMode:t,mainLoopModel:n,exceeds200kTokens:o=!1}=e;return"opusplan"!==getUserSpecifiedModelSetting()||"plan"!==t||o?"haiku"===getUserSpecifiedModelSetting()&&"plan"===t?getDefaultSonnetModel():n:getDefaultOpusModel()}export function getDefaultMainLoopModelSetting(){return"ant"===process.env.USER_TYPE?f()?.defaultModel??getDefaultOpusModel()+"[1m]":isGeminiProvider()?getDefaultGeminiModel():isOpenAIProvider()?getDefaultOpenAIModel():o()||u()?getDefaultOpusModel()+(isOpus1mMergeEnabled()?"[1m]":""):getDefaultSonnetModel()}export function getDefaultMainLoopModel(){return parseUserSpecifiedModel(getDefaultMainLoopModelSetting())}export function firstPartyNameToCanonical(e){if(!e)return e;if((e=e.toLowerCase()).includes("claude-opus-4-7"))return"claude-opus-4-7";if(e.includes("claude-opus-4-6"))return"claude-opus-4-6";if(e.includes("claude-opus-4-5"))return"claude-opus-4-5";if(e.includes("claude-opus-4-1"))return"claude-opus-4-1";if(e.includes("claude-opus-4"))return"claude-opus-4";if(e.includes("claude-sonnet-4-6"))return"claude-sonnet-4-6";if(e.includes("claude-sonnet-4-5"))return"claude-sonnet-4-5";if(e.includes("claude-sonnet-4"))return"claude-sonnet-4";if(e.includes("claude-haiku-4-5"))return"claude-haiku-4-5";if(e.includes("claude-3-7-sonnet"))return"claude-3-7-sonnet";if(e.includes("claude-3-5-sonnet"))return"claude-3-5-sonnet";if(e.includes("claude-3-5-haiku"))return"claude-3-5-haiku";if(e.includes("claude-3-opus"))return"claude-3-opus";if(e.includes("claude-3-sonnet"))return"claude-3-sonnet";if(e.includes("claude-3-haiku"))return"claude-3-haiku";const t=e.match(/(claude-(\d+-\d+-)?\w+)/);return t&&t[1]?t[1]:e}export function getCanonicalName(e){return firstPartyNameToCanonical(d(e))}export function getClaudeAiUserDefaultModelDescription(e=!1){return o()||u()?isOpus1mMergeEnabled()?`Opus 4.7 con contexto de 1M · El más capaz para tareas complejas${e?getOpus46PricingSuffix(!0):""}`:`Opus 4.7 · El más capaz para tareas complejas${e?getOpus46PricingSuffix(!0):""}`:"Sonnet 4.6 · Lo mejor para tareas cotidianas"}export function renderDefaultModelSetting(e){return"opusplan"===e?"Opus 4.7 en modo plan, de lo contrario Sonnet 4.6":renderModelName(parseUserSpecifiedModel(e))}export function getOpus46PricingSuffix(e){if("firstParty"!==O())return"";const t=m(M(e));return` ·${e?` (${x})`:""} ${t}`}export function isOpus1mMergeEnabled(){return!s()&&!r()&&"firstParty"===O()&&(!n()||null!==t())}export function renderModelSetting(e){return"opusplan"===e?"Plan Opus":P(e)?E(e):renderModelName(e)}export function getPublicModelDisplayName(e){switch(e){case c().opus47:return"Opus 4.7";case c().opus47+"[1m]":return"Opus 4.7 (1M context)";case c().opus46:return"Opus 4.6";case c().opus46+"[1m]":return"Opus 4.6 (1M context)";case c().opus45:return"Opus 4.5";case c().opus41:return"Opus 4.1";case c().opus40:return"Opus 4";case c().sonnet46+"[1m]":return"Sonnet 4.6 (1M context)";case c().sonnet46:return"Sonnet 4.6";case c().sonnet45+"[1m]":return"Sonnet 4.5 (1M context)";case c().sonnet45:return"Sonnet 4.5";case c().sonnet40:return"Sonnet 4";case c().sonnet40+"[1m]":return"Sonnet 4 (1M context)";case c().sonnet37:return"Sonnet 3.7";case c().sonnet35:return"Sonnet 3.5";case c().haiku45:return"Haiku 4.5";case c().haiku35:return"Haiku 3.5";default:return null}}export function renderModelName(e){const t=getPublicModelDisplayName(e);if(t)return t;if("ant"===process.env.USER_TYPE){const t=parseUserSpecifiedModel(e),n=p(e);if(n){const e=function(e){const[t="",...n]=e.split("-");return[t.slice(0,3)+"*".repeat(Math.max(0,t.length-3)),...n].join("-")}(n.model.replace(/\[1m\]$/i,""));return e+(i(t)?"[1m]":"")}return t!==e?`${e} (${t})`:t}return e}export function getPublicModelName(e){const t=getPublicModelDisplayName(e);return t||e}export function parseUserSpecifiedModel(e){const t=getDefaultMainLoopModelSetting(),n=("string"==typeof e&&e.trim().length>0?e:"string"==typeof t&&t.trim().length>0?t:getDefaultOpenAIModel()).trim(),o=n.toLowerCase(),r=i(o),u=r?o.replace(/\[1m]$/i,"").trim():o;if(isOpenAIProvider()&&P(u))return"best"===u?getBestModel():r?n.replace(/\[1m\]$/i,"").trim()+"[1m]":n;if(P(u))switch(u){case"best":return getBestModel();case"opusplan":case"sonnet":return getDefaultSonnetModel()+(r?"[1m]":"");case"haiku":return getDefaultHaikuModel()+(r?"[1m]":"");case"opus":return getDefaultOpusModel()+(r?"[1m]":"")}if("firstParty"===O()&&(s=u,T.includes(s))&&isLegacyModelRemapEnabled())return getDefaultOpusModel()+(r?"[1m]":"");var s;if("ant"===process.env.USER_TYPE){const e=i(o),t=o.replace(/\[1m]$/i,"").trim(),n=p(t);if(n){const t=e?"[1m]":"";return n.model+t}}return r?n.replace(/\[1m\]$/i,"").trim()+"[1m]":n}export function resolveSkillModelOverride(e,t){return i(e)||!i(t)?e:l(parseUserSpecifiedModel(e))?e+"[1m]":e}const T=["claude-opus-4-20250514","claude-opus-4-1-20250805","claude-opus-4-0","claude-opus-4-1"];export function isLegacyModelRemapEnabled(){return!a(process.env.CONTEXT_CODE_DISABLE_LEGACY_MODEL_REMAP)&&!a(process.env.CLAUDE_CODE_DISABLE_LEGACY_MODEL_REMAP)}export function modelDisplayString(e){if(null===e)return"ant"===process.env.USER_TYPE?`Predeterminado para Ants (${renderDefaultModelSetting(getDefaultMainLoopModelSetting())})`:n()?`Predeterminado (${getClaudeAiUserDefaultModelDescription()})`:`Predeterminado (${renderModelName(getDefaultMainLoopModel())})`;const t=parseUserSpecifiedModel(e);return isOpenAIProvider()?e===t?renderModelName(t):`${e} (${renderModelName(t)})`:e===t?t:`${e} (${t})`}export function getMarketingNameForModel(e){if(!e)return;if("foundry"===O())return;const t=e.toLowerCase().includes("[1m]"),n=getCanonicalName(e);return n.includes("claude-opus-4-7")?t?"Opus 4.7 (with 1M context)":"Opus 4.7":n.includes("claude-opus-4-6")?t?"Opus 4.6 (with 1M context)":"Opus 4.6":n.includes("claude-opus-4-5")?"Opus 4.5":n.includes("claude-opus-4-1")?"Opus 4.1":n.includes("claude-opus-4")?"Opus 4":n.includes("claude-sonnet-4-6")?t?"Sonnet 4.6 (with 1M context)":"Sonnet 4.6":n.includes("claude-sonnet-4-5")?t?"Sonnet 4.5 (with 1M context)":"Sonnet 4.5":n.includes("claude-sonnet-4")?t?"Sonnet 4 (with 1M context)":"Sonnet 4":n.includes("claude-3-7-sonnet")?"3.7 Sonnet":n.includes("claude-3-5-sonnet")?"3.5 Sonnet":n.includes("claude-haiku-4-5")?"Haiku 4.5":n.includes("claude-3-5-haiku")?"3.5 Haiku":n.includes("gpt-5.3-codex")?"GPT-5.3 Codex":n.includes("gpt-5.5-pro")?"GPT-5.5 Pro":n.includes("gpt-5.5")?"GPT-5.5":n.includes("gpt-5.2-codex")?"GPT-5.2 Codex":n.includes("gpt-5.1-codex-max")?"GPT-5.1 Codex Max":n.includes("gpt-5.1-codex-mini")?"GPT-5.1 Codex mini":n.includes("gpt-5.1-codex")?"GPT-5.1 Codex":n.includes("gpt-5.3")?"GPT-5.3":n.includes("gpt-5.2")?"GPT-5.2":n.includes("gpt-5.1")?"GPT-5.1":n.includes("gpt-5-codex")?"GPT-5 Codex":n.includes("gpt-5-chat-latest")?"GPT-5 Chat":n.includes("gpt-5-mini")?"GPT-5 mini":n.includes("gpt-5-nano")?"GPT-5 nano":n.includes("gpt-5-pro")?"GPT-5 Pro":n.includes("gpt-5")?"GPT-5":n.includes("gpt-4o-mini")?"GPT-4o mini":n.includes("gpt-4o")?"GPT-4o":n.includes("codex-mini-latest")?"Codex mini":void 0}export function normalizeModelStringForAPI(e){return e.replace(/\[(1|2)m\]/gi,"")}
1
+ import{getMainLoopModelOverride as e}from"../../bootstrap/state.js";import{getSubscriptionType as t,isClaudeAISubscriber as n,isMaxSubscriber as o,isProSubscriber as r,isTeamPremiumSubscriber as u}from"../auth.js";import{has1mContext as s,is1mContextDisabled as i,modelSupports1M as l}from"../context.js";import{isEnvTruthy as a}from"../envUtils.js";import{getModelStrings as c,resolveOverriddenModel as d}from"./modelStrings.js";import{resolveAntModel as p,getAntModelOverrideConfig as f}from"./antModels.js";export{p as resolveAntModel,f as getAntModelOverrideConfig};import{formatModelPricing as m,getOpus46CostTier as M}from"../modelCost.js";import{getSettings_DEPRECATED as g}from"../settings/settings.js";import{getAPIProvider as O,isOpenAICompatibleProvider as x}from"./providers.js";import{LIGHTNING_BOLT as D}from"../../constants/figures.js";import{isModelAllowed as S}from"./modelAllowlist.js";import{isModelAlias as P}from"./aliases.js";import{capitalize as E}from"../stringUtils.js";export function isOpenAIProvider(){return x(O())}export function isGeminiProvider(){const e=O();return"gemini-api"===e||"gemini-google"===e}export function getSmallFastModel(){return process.env.ANTHROPIC_SMALL_FAST_MODEL||getDefaultHaikuModel()}export function isNonCustomOpusModel(e){return e===c().opus40||e===c().opus41||e===c().opus45||e===c().opus46||e===c().opus47||e===c().opus48}export function getUserSpecifiedModelSetting(){let t;const n=e();if(void 0!==n)t=n;else{const e=g()||{};t=process.env.ANTHROPIC_MODEL||e.model||void 0}if(!t||S(t))return t}export function getMainLoopModel(){const e=getUserSpecifiedModelSetting();return null!=e?parseUserSpecifiedModel(e):getDefaultMainLoopModel()}export function getBestModel(){return isGeminiProvider()?getDefaultGeminiModel():isOpenAIProvider()?getDefaultOpenAIModel():getDefaultOpusModel()}export function getDefaultOpusModel(){return process.env.ANTHROPIC_DEFAULT_OPUS_MODEL?process.env.ANTHROPIC_DEFAULT_OPUS_MODEL:(O(),c().opus48)}export function getDefaultSonnetModel(){return process.env.ANTHROPIC_DEFAULT_SONNET_MODEL?process.env.ANTHROPIC_DEFAULT_SONNET_MODEL:"firstParty"!==O()?c().sonnet45:c().sonnet46}export function getDefaultHaikuModel(){return process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL?process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL:c().haiku45}export function getDefaultOpenAIModel(){return process.env.OPENAI_DEFAULT_MODEL||"gpt-5.4"}export function getDefaultOpenAIFastModel(){return process.env.OPENAI_DEFAULT_FAST_MODEL||"gpt-5.4-mini"}export function getDefaultGeminiModel(){return process.env.GEMINI_DEFAULT_MODEL||"gemini-3.5-pro"}export function getDefaultGeminiFastModel(){return process.env.GEMINI_DEFAULT_FAST_MODEL||"gemini-3.5-flash"}export function getRuntimeMainLoopModel(e){const{permissionMode:t,mainLoopModel:n,exceeds200kTokens:o=!1}=e;return"opusplan"!==getUserSpecifiedModelSetting()||"plan"!==t||o?"haiku"===getUserSpecifiedModelSetting()&&"plan"===t?getDefaultSonnetModel():n:getDefaultOpusModel()}export function getDefaultMainLoopModelSetting(){return"ant"===process.env.USER_TYPE?f()?.defaultModel??getDefaultOpusModel()+"[1m]":isGeminiProvider()?getDefaultGeminiModel():isOpenAIProvider()?getDefaultOpenAIModel():o()||u()?getDefaultOpusModel()+(isOpus1mMergeEnabled()?"[1m]":""):getDefaultSonnetModel()}export function getDefaultMainLoopModel(){return parseUserSpecifiedModel(getDefaultMainLoopModelSetting())}export function firstPartyNameToCanonical(e){if(!e)return e;if((e=e.toLowerCase()).includes("claude-opus-4-8"))return"claude-opus-4-8";if(e.includes("claude-opus-4-7"))return"claude-opus-4-7";if(e.includes("claude-opus-4-6"))return"claude-opus-4-6";if(e.includes("claude-opus-4-5"))return"claude-opus-4-5";if(e.includes("claude-opus-4-1"))return"claude-opus-4-1";if(e.includes("claude-opus-4"))return"claude-opus-4";if(e.includes("claude-sonnet-4-6"))return"claude-sonnet-4-6";if(e.includes("claude-sonnet-4-5"))return"claude-sonnet-4-5";if(e.includes("claude-sonnet-4"))return"claude-sonnet-4";if(e.includes("claude-haiku-4-5"))return"claude-haiku-4-5";if(e.includes("claude-3-7-sonnet"))return"claude-3-7-sonnet";if(e.includes("claude-3-5-sonnet"))return"claude-3-5-sonnet";if(e.includes("claude-3-5-haiku"))return"claude-3-5-haiku";if(e.includes("claude-3-opus"))return"claude-3-opus";if(e.includes("claude-3-sonnet"))return"claude-3-sonnet";if(e.includes("claude-3-haiku"))return"claude-3-haiku";const t=e.match(/(claude-(\d+-\d+-)?\w+)/);return t&&t[1]?t[1]:e}export function getCanonicalName(e){return firstPartyNameToCanonical(d(e))}export function getClaudeAiUserDefaultModelDescription(e=!1){return o()||u()?isOpus1mMergeEnabled()?`Opus 4.7 con contexto de 1M · El más capaz para tareas complejas${e?getOpus46PricingSuffix(!0):""}`:`Opus 4.7 · El más capaz para tareas complejas${e?getOpus46PricingSuffix(!0):""}`:"Sonnet 4.6 · Lo mejor para tareas cotidianas"}export function renderDefaultModelSetting(e){return"opusplan"===e?"Opus 4.7 en modo plan, de lo contrario Sonnet 4.6":renderModelName(parseUserSpecifiedModel(e))}export function getOpus46PricingSuffix(e){if("firstParty"!==O())return"";const t=m(M(e));return` ·${e?` (${D})`:""} ${t}`}export function isOpus1mMergeEnabled(){return!i()&&!r()&&"firstParty"===O()&&(!n()||null!==t())}export function renderModelSetting(e){return"opusplan"===e?"Plan Opus":P(e)?E(e):renderModelName(e)}export function getPublicModelDisplayName(e){switch(e){case c().opus48:return"Opus 4.8";case c().opus48+"[1m]":return"Opus 4.8 (1M context)";case c().opus47:return"Opus 4.7";case c().opus47+"[1m]":return"Opus 4.7 (1M context)";case c().opus46:return"Opus 4.6";case c().opus46+"[1m]":return"Opus 4.6 (1M context)";case c().opus45:return"Opus 4.5";case c().opus41:return"Opus 4.1";case c().opus40:return"Opus 4";case c().sonnet46+"[1m]":return"Sonnet 4.6 (1M context)";case c().sonnet46:return"Sonnet 4.6";case c().sonnet45+"[1m]":return"Sonnet 4.5 (1M context)";case c().sonnet45:return"Sonnet 4.5";case c().sonnet40:return"Sonnet 4";case c().sonnet40+"[1m]":return"Sonnet 4 (1M context)";case c().sonnet37:return"Sonnet 3.7";case c().sonnet35:return"Sonnet 3.5";case c().haiku45:return"Haiku 4.5";case c().haiku35:return"Haiku 3.5";default:return null}}export function renderModelName(e){const t=getPublicModelDisplayName(e);if(t)return t;if("ant"===process.env.USER_TYPE){const t=parseUserSpecifiedModel(e),n=p(e);if(n){const e=function(e){const[t="",...n]=e.split("-");return[t.slice(0,3)+"*".repeat(Math.max(0,t.length-3)),...n].join("-")}(n.model.replace(/\[1m\]$/i,""));return e+(s(t)?"[1m]":"")}return t!==e?`${e} (${t})`:t}return e}export function getPublicModelName(e){const t=getPublicModelDisplayName(e);return t||e}export function parseUserSpecifiedModel(e){const t=getDefaultMainLoopModelSetting(),n=("string"==typeof e&&e.trim().length>0?e:"string"==typeof t&&t.trim().length>0?t:getDefaultOpenAIModel()).trim(),o=n.toLowerCase(),r=s(o),u=r?o.replace(/\[1m]$/i,"").trim():o;if(isOpenAIProvider()&&P(u))return"best"===u?getBestModel():r?n.replace(/\[1m\]$/i,"").trim()+"[1m]":n;if(P(u))switch(u){case"best":return getBestModel();case"opusplan":case"sonnet":return getDefaultSonnetModel()+(r?"[1m]":"");case"haiku":return getDefaultHaikuModel()+(r?"[1m]":"");case"opus":return getDefaultOpusModel()+(r?"[1m]":"")}if("firstParty"===O()&&(i=u,T.includes(i))&&isLegacyModelRemapEnabled())return getDefaultOpusModel()+(r?"[1m]":"");var i;if("ant"===process.env.USER_TYPE){const e=s(o),t=o.replace(/\[1m]$/i,"").trim(),n=p(t);if(n){const t=e?"[1m]":"";return n.model+t}}return r?n.replace(/\[1m\]$/i,"").trim()+"[1m]":n}export function resolveSkillModelOverride(e,t){return s(e)||!s(t)?e:l(parseUserSpecifiedModel(e))?e+"[1m]":e}const T=["claude-opus-4-20250514","claude-opus-4-1-20250805","claude-opus-4-0","claude-opus-4-1"];export function isLegacyModelRemapEnabled(){return!a(process.env.CONTEXT_CODE_DISABLE_LEGACY_MODEL_REMAP)&&!a(process.env.CLAUDE_CODE_DISABLE_LEGACY_MODEL_REMAP)}export function modelDisplayString(e){if(null===e)return"ant"===process.env.USER_TYPE?`Predeterminado para Ants (${renderDefaultModelSetting(getDefaultMainLoopModelSetting())})`:n()?`Predeterminado (${getClaudeAiUserDefaultModelDescription()})`:`Predeterminado (${renderModelName(getDefaultMainLoopModel())})`;const t=parseUserSpecifiedModel(e);return isOpenAIProvider()?e===t?renderModelName(t):`${e} (${renderModelName(t)})`:e===t?t:`${e} (${t})`}export function getMarketingNameForModel(e){if(!e)return;if("foundry"===O())return;const t=e.toLowerCase().includes("[1m]"),n=getCanonicalName(e);return n.includes("claude-opus-4-8")?t?"Opus 4.8 (with 1M context)":"Opus 4.8":n.includes("claude-opus-4-7")?t?"Opus 4.7 (with 1M context)":"Opus 4.7":n.includes("claude-opus-4-6")?t?"Opus 4.6 (with 1M context)":"Opus 4.6":n.includes("claude-opus-4-5")?"Opus 4.5":n.includes("claude-opus-4-1")?"Opus 4.1":n.includes("claude-opus-4")?"Opus 4":n.includes("claude-sonnet-4-6")?t?"Sonnet 4.6 (with 1M context)":"Sonnet 4.6":n.includes("claude-sonnet-4-5")?t?"Sonnet 4.5 (with 1M context)":"Sonnet 4.5":n.includes("claude-sonnet-4")?t?"Sonnet 4 (with 1M context)":"Sonnet 4":n.includes("claude-3-7-sonnet")?"3.7 Sonnet":n.includes("claude-3-5-sonnet")?"3.5 Sonnet":n.includes("claude-haiku-4-5")?"Haiku 4.5":n.includes("claude-3-5-haiku")?"3.5 Haiku":n.includes("gpt-5.3-codex")?"GPT-5.3 Codex":n.includes("gpt-5.5-pro")?"GPT-5.5 Pro":n.includes("gpt-5.5")?"GPT-5.5":n.includes("gpt-5.2-codex")?"GPT-5.2 Codex":n.includes("gpt-5.1-codex-max")?"GPT-5.1 Codex Max":n.includes("gpt-5.1-codex-mini")?"GPT-5.1 Codex mini":n.includes("gpt-5.1-codex")?"GPT-5.1 Codex":n.includes("gpt-5.3")?"GPT-5.3":n.includes("gpt-5.2")?"GPT-5.2":n.includes("gpt-5.1")?"GPT-5.1":n.includes("gpt-5-codex")?"GPT-5 Codex":n.includes("gpt-5-chat-latest")?"GPT-5 Chat":n.includes("gpt-5-mini")?"GPT-5 mini":n.includes("gpt-5-nano")?"GPT-5 nano":n.includes("gpt-5-pro")?"GPT-5 Pro":n.includes("gpt-5")?"GPT-5":n.includes("gpt-4o-mini")?"GPT-4o mini":n.includes("gpt-4o")?"GPT-4o":n.includes("codex-mini-latest")?"Codex mini":void 0}export function normalizeModelStringForAPI(e){return e.replace(/\[(1|2)m\]/gi,"")}
@@ -1 +1 @@
1
- import{getSettings_DEPRECATED as e}from"../settings/settings.js";import{isModelAlias as t,isModelFamilyAlias as o}from"./aliases.js";import{parseUserSpecifiedModel as r}from"./model.js";import{resolveOverriddenModel as i}from"./modelStrings.js";function modelBelongsToFamily(e,o){if(e.includes(o))return!0;if(t(e)){return r(e).toLowerCase().includes(o)}return!1}function prefixMatchesModel(e,t){return!!e.startsWith(t)&&(e.length===t.length||"-"===e[t.length])}function modelMatchesVersionPrefix(e,o){const i=t(e)?r(e).toLowerCase():e;return!!prefixMatchesModel(i,o)||!(o.startsWith("claude-")||!prefixMatchesModel(i,`claude-${o}`))}function familyHasSpecificEntries(e,t){for(const r of t){if(o(r))continue;const t=r.indexOf(e);if(-1===t)continue;const i=t+e.length;if(i===r.length||"-"===r[i])return!0}return!1}export function isModelAllowed(n){const s=e()||{},{availableModels:f}=s;if(!f)return!0;if(0===f.length)return!1;const l=i(n).trim().toLowerCase(),c=f.map(e=>e.trim().toLowerCase());if(c.includes(l)&&(!o(l)||!familyHasSpecificEntries(l,c)))return!0;for(const e of c)if(o(e)&&!familyHasSpecificEntries(e,c)&&modelBelongsToFamily(l,e))return!0;if(t(l)){const e=r(l).toLowerCase();if(c.includes(e))return!0}for(const e of c)if(!o(e)&&t(e)){if(r(e).toLowerCase()===l)return!0}for(const e of c)if(!o(e)&&!t(e)&&modelMatchesVersionPrefix(l,e))return!0;return!1}
1
+ import{getSettings_DEPRECATED as e}from"../settings/settings.js";import{isModelAlias as t,isModelFamilyAlias as r}from"./aliases.js";import{parseUserSpecifiedModel as o}from"./model.js";import{resolveOverriddenModel as i}from"./modelStrings.js";import{getAPIProvider as n}from"./providers.js";function modelBelongsToFamily(e,r){if(e.includes(r))return!0;if(t(e)){return o(e).toLowerCase().includes(r)}return!1}function prefixMatchesModel(e,t){return!!e.startsWith(t)&&(e.length===t.length||"-"===e[t.length])}function modelMatchesVersionPrefix(e,r){const i=t(e)?o(e).toLowerCase():e;return!!prefixMatchesModel(i,r)||!(r.startsWith("claude-")||!prefixMatchesModel(i,`claude-${r}`))}function familyHasSpecificEntries(e,t){for(const o of t){if(r(o))continue;const t=o.indexOf(e);if(-1===t)continue;const i=t+e.length;if(i===o.length||"-"===o[i])return!0}return!1}export function isModelAllowed(s){const f=n(),c="firstParty"===f||"bedrock"===f||"vertex"===f||"foundry"===f||"custom-anthropic"===f,l=s.trim().toLowerCase(),u=l.includes("claude")||"opus"===l||"sonnet"===l||"haiku"===l||"best"===l||"opusplan"===l;if(!c&&!u)return!0;const a=e()||{},{availableModels:m}=a;if(!m)return!0;if(0===m.length)return!1;const d=i(s).trim().toLowerCase(),p=m.map(e=>e.trim().toLowerCase());if(p.includes(d)&&(!r(d)||!familyHasSpecificEntries(d,p)))return!0;for(const e of p)if(r(e)&&!familyHasSpecificEntries(e,p)&&modelBelongsToFamily(d,e))return!0;if(t(d)){const e=o(d).toLowerCase();if(p.includes(e))return!0}for(const e of p)if(!r(e)&&t(e)){if(o(e).toLowerCase()===d)return!0}for(const e of p)if(!r(e)&&!t(e)&&modelMatchesVersionPrefix(d,e))return!0;return!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 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 f,getDefaultOpenAIModel as g,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{getCustomProviderModels as y,getGlobalConfig as k}from"../config.js";import{resolveProviderProfile as U}from"./providerProfiles.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:f(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 H={value:"sonnet",label:"Sonnet",description:"Sonnet 4.6 · Best for everyday tasks"},I={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("custom-openai"===c()||"custom-anthropic"===c()){const o=c(),t=U(o)?.id??null,i=y(o,t).map(e=>({value:e,label:e,description:`Modelo del endpoint ${o}`}));return[getDefaultOptionForUser(e),...i]}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(H),d()&&o.push(getMaxSonnet46_1MOption()),o.push(I),o}const o=[getDefaultOptionForUser(e)];return o.push(H),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(I),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})`});const n=c();if(!("custom-openai"===n||"custom-anthropic"===n))for(const e of k().additionalModelOptionsCache??[])t.some(o=>o.value===e.value)||t.push(e);let s=null;const r=T(),l=e();if(null!=r?s=r:null!==l&&(s=l),null===s||t.some(e=>e.value===s))return filterModelOptionsByAllowlist(t);if("opusplan"===s)return filterModelOptionsByAllowlist([...t,{value:"opusplan",label:"Opus Plan Mode",description:"Use Opus 4.7 in plan mode, Sonnet 4.6 otherwise"}]);if("opus"===s&&"firstParty"===c())return filterModelOptionsByAllowlist([...t,getMaxOpusOption(o)]);if("opus[1m]"===s&&"firstParty"===c())return filterModelOptionsByAllowlist([...t,getMergedOpus1MOption(o)]);{const e=getKnownModelOption(s);return e?t.push(e):t.push({value:s,label:s,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
+ 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 p,formatModelPricing as a}from"../modelCost.js";import{getSettings_DEPRECATED as l}from"../settings/settings.js";import{checkOpus1mAccess as u,checkSonnet1mAccess as c}from"./check1mAccess.js";import{getAPIProvider as d}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 h,getDefaultGeminiFastModel as v,getDefaultSonnetModel as x,getDefaultOpusModel as b,getDefaultHaikuModel as _,getDefaultMainLoopModelSetting as P,getMarketingNameForModel as F,getUserSpecifiedModelSetting as w,isOpus1mMergeEnabled as T,getOpus46PricingSuffix as D,isOpenAIProvider as S,isGeminiProvider as k,renderDefaultModelSetting as C}from"./model.js";import{getAntModels as E}from"./antModels.js";import{has1mContext as N}from"../context.js";import{getCustomProviderModels as A,getGlobalConfig as U}from"../config.js";import{resolveProviderProfile as $}from"./providerProfiles.js";export function getDefaultOptionForUser(e=!1){if("ant"===process.env.USER_TYPE){const e=C(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 ${C(P())})`};if(o())return{value:null,label:"Default (recommended)",description:g(e)};const t="firstParty"!==d();return{value:null,label:"Default (recommended)",description:`Use the default model (currently ${C(P())})${t?"":` · ${a(s)}`}`}}function getSonnet46Option(){const e="firstParty"!==d();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 getOpus48Option(e=!1){d();return{value:n().opus48,label:"Opus",description:`Opus 4.8 · Most capable for complex work${D(e)}`,descriptionForModel:"Opus 4.8 - most capable for complex work"}}export function getOpus48_1MOption(e=!1){d();return{value:n().opus48+"[1m]",label:"Opus 4.8 (1M context)",description:`Opus 4.8 for long sessions${D(e)}`,descriptionForModel:"Opus 4.8 with 1M context window - for long sessions with large codebases"}}function getOpus47Option(e=!1){d();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"!==d()?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"!==d();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){d();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"!==d()?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"!==d()?"":` · ${a(p)}`),descriptionForModel:"Haiku 4.5 - fastest for quick answers. Lower cost but less capable than Sonnet 4.6."}}function getHaikuOption(){return _()===n().haiku45?getHaiku45Option():{value:"haiku",label:"Haiku",description:"Haiku 3.5 for simple tasks"+("firstParty"!==d()?"":` · ${a(r)}`),descriptionForModel:"Haiku 3.5 - faster and lower cost, but less capable than Sonnet. Use for simple tasks."}}function getMaxOpus48Option(e=!1){return{value:n().opus48,label:"Opus",description:`Opus 4.8 · Most capable for complex work${e?D(!0):""}`}}export function getMaxOpus48_1MOption(e=!1){const t=o()?" · Billed as extra usage":"";return{value:n().opus48+"[1m]",label:"Opus 4.8 (1M context)",description:`Opus 4.8 with 1M context${t}${D(e)}`}}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"!==d();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"!==d();return{value:n().opus48+"[1m]",label:"Opus (1M context)",description:`Opus 4.8 with 1M context · Most capable for complex work${!o&&e?D(e):""}`,descriptionForModel:"Opus 4.8 with 1M context - most capable for complex work"}}const y={value:"sonnet",label:"Sonnet",description:"Sonnet 4.6 · Best for everyday tasks"},I={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"===d())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"===d())return[getDefaultOptionForUser(e)];if(k())return[getDefaultOptionForUser(e),{value:h(),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:v(),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("custom-openai"===d()||"custom-anthropic"===d()){const o=d(),t=$(o)?.id??null,i=A(o,t),n="custom-openai"===o?"OpenAI personalizado":"Anthropic personalizado",s=i.map(e=>({value:e,label:e,description:`Modelo del endpoint ${n}`}));return[getDefaultOptionForUser(e),...s]}if("ollama"===d()||"ollama-cloud"===d()||"zai"===d()||"minimax"===d()||"deepseek"===d())return[getDefaultOptionForUser(e)];if(o()){if(t()||i()){const o=[getDefaultOptionForUser(e)];return o.push(getMaxOpus48Option(e)),!T()&&u()&&o.push(getMaxOpus48_1MOption(e)),o.push(getMaxOpus47Option(e)),!T()&&u()&&o.push(getMaxOpus47_1MOption(e)),o.push(getMaxOpusOption(e)),!T()&&u()&&o.push(getMaxOpus46_1MOption(e)),o.push(y),c()&&o.push(getMaxSonnet46_1MOption()),o.push(I),o}const o=[getDefaultOptionForUser(e)];return o.push(y),c()&&o.push(getMaxSonnet46_1MOption()),o.push(getMaxOpus48Option(e)),u()&&o.push(getMaxOpus48_1MOption(e)),o.push(getMaxOpus47Option(e)),u()&&o.push(getMaxOpus47_1MOption(e)),o.push(getMaxOpusOption(e)),u()&&o.push(getMaxOpus46_1MOption(e)),o.push(I),o}if("firstParty"===d()){const o=[getDefaultOptionForUser(e)];return o.push(getSonnet46Option()),c()&&o.push(getSonnet46_1MOption()),o.push(getOpus48Option(e)),u()&&o.push(getOpus48_1MOption(e)),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"!==d(),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()),c()&&n.push(getSonnet46_1MOption()));const r=function(){const e="firstParty"!==d(),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(getOpus48Option(e)),u()&&n.push(getOpus48_1MOption(e)),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 p=function(){const e="firstParty"!==d(),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!==p?n.push(p):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(b());if(e)return{alias:"Opus",currentVersionName:e}}if(o.includes("claude-haiku")||o.includes("claude-3-5-haiku")){const e=F(_());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??`Modelo personalizado (${i})`});const n=d();if("firstParty"===n)for(const e of U().additionalModelOptionsCache??[])t.some(o=>o.value===e.value)||t.push(e);let s=null;const r=w(),p=e();null!=r?s=r:null!==p&&(s=p);const a=function(e){if(!(l()||{}).availableModels)return e;return e.filter(e=>null===e.value||null!==e.value&&O(e.value))}((()=>{if(null===s||t.some(e=>e.value===s))return t;if("opusplan"===s)return[...t,{value:"opusplan",label:"Opus Plan Mode",description:"Use Opus 4.8 in plan mode, Sonnet 4.6 otherwise"}];if("opus"===s&&"firstParty"===d())return[...t,getMaxOpusOption(o)];if("opus[1m]"===s&&"firstParty"===d())return[...t,getMergedOpus1MOption(o)];{const e=getKnownModelOption(s);return e?t.push(e):t.push({value:s,label:s,description:"Modelo personalizado"}),t}})());return"firstParty"!==n&&"custom-anthropic"!==n?a.filter(e=>!function(e){if(!e)return!1;const o=e.toLowerCase();return o.startsWith("claude")||o.startsWith("sonnet")||o.startsWith("opus")||o.startsWith("haiku")||"opusplan"===o}(e.value)):a}
@@ -1 +1 @@
1
- import{clearProviderProfileBaseUrl as r,getProviderProfileBaseUrl as t,isProfiledProvider as e,setProviderProfileBaseUrl as i}from"./providerProfiles.js";import{clearStoredProviderBaseUrl as o,getStoredProviderBaseUrl as a,setStoredProviderBaseUrl as n}from"./providerProfilesDb.js";const s={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",nvidia:"https://integrate.api.nvidia.com/v1",deepseek:"https://api.deepseek.com/v1","custom-openai":"https://api.openai.com/v1","custom-anthropic":"https://api.anthropic.com/v1"};function trimTrailingSlash(r){return r.endsWith("/")?r.slice(0,-1):r}export function getDefaultProviderBaseUrl(r){return s[r]}export function getConfiguredProviderBaseUrl(r){const e=t(r)?.trim();if(e)try{return normalizeProviderBaseUrl(r,e)}catch{return e}const i=a(r)?.trim();if(i)try{return normalizeProviderBaseUrl(r,i)}catch{return i}return getDefaultProviderBaseUrl(r)}export function isProviderBaseUrlCustomized(r){return Boolean(t(r)?.trim()||a(r)?.trim())}export function normalizeProviderBaseUrl(r,t){const e=function(r,t){const e=t.trim();if(!e)throw new Error("La base URL no puede estar vacia.");try{return new URL(e)}catch{return new URL(`${"ollama"===r||"ollama-cloud"===r?"http://":"https://"}${e}`)}}(r,t),i=`${e.protocol}//${e.host}${e.pathname}${e.search}${e.hash}`;return"zai"===r||"minimax"===r||"gemini-api"===r||"gemini-google"===r||"nvidia"===r?trimTrailingSlash(i):function(r){const t=trimTrailingSlash(r);return t.endsWith("/v1")?t:`${t}/v1`}(i)}export function setProviderBaseUrl(r,t){const o=normalizeProviderBaseUrl(r,t);return e(r)&&i(r,o),n(r,o),o}export function clearProviderBaseUrl(t){e(t)&&r(t),o(t)}
1
+ import{clearProviderProfileBaseUrl as t,getProviderProfileBaseUrl as i,isProfiledProvider as e,setProviderProfileBaseUrl as a}from"./providerProfiles.js";import{clearStoredProviderBaseUrl as r,getStoredProviderBaseUrl as o,setStoredProviderBaseUrl as n}from"./providerProfilesDb.js";const p={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",nvidia:"https://integrate.api.nvidia.com/v1",deepseek:"https://api.deepseek.com/v1",xai:"https://api.x.ai/v1",gmi:"https://api.gmi-serving.com/v1",novita:"https://api.novita.ai/openai/v1",stepfun:"https://api.stepfun.ai/step_plan/v1",huggingface:"https://router.huggingface.co/v1","opencode-zen":"https://opencode.ai/zen/v1",arcee:"https://api.arcee.ai/api/v1",alibaba:"https://dashscope-intl.aliyuncs.com/compatible-mode/v1",kimi:"https://api.moonshot.ai/v1","custom-openai":"https://api.openai.com/v1","custom-anthropic":"https://api.anthropic.com/v1"};function trimTrailingSlash(t){return t.endsWith("/")?t.slice(0,-1):t}export function getDefaultProviderBaseUrl(t){return p[t]}export function getConfiguredProviderBaseUrl(t){const e=i(t)?.trim();if(e)try{return normalizeProviderBaseUrl(t,e)}catch{return e}const a=o(t)?.trim();if(a)try{return normalizeProviderBaseUrl(t,a)}catch{return a}return getDefaultProviderBaseUrl(t)}export function isProviderBaseUrlCustomized(t){return Boolean(i(t)?.trim()||o(t)?.trim())}export function normalizeProviderBaseUrl(t,i){const e=function(t,i){const e=i.trim();if(!e)throw new Error("La base URL no puede estar vacia.");try{return new URL(e)}catch{return new URL(`${"ollama"===t||"ollama-cloud"===t?"http://":"https://"}${e}`)}}(t,i),a=`${e.protocol}//${e.host}${e.pathname}${e.search}${e.hash}`;return"zai"===t||"minimax"===t||"gemini-api"===t||"gemini-google"===t||"nvidia"===t?trimTrailingSlash(a):function(t){const i=trimTrailingSlash(t);return i.endsWith("/v1")?i:`${i}/v1`}(a)}export function setProviderBaseUrl(t,i){const r=normalizeProviderBaseUrl(t,i);return e(t)&&a(t,r),n(t,r),r}export function clearProviderBaseUrl(i){e(i)&&t(i),r(i)}
@@ -1 +1 @@
1
- export const VISIBLE_PROVIDERS=[{id:"minimax",label:"MiniMax",description:"API key propia. Usa el endpoint Anthropic-compatible y luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de MiniMax.",nextStep:"Despues, elige un modelo MiniMax compatible con Anthropic desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"openrouter",label:"OpenRouter",description:"API key propia. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de OpenRouter.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"ollama",label:"Ollama",description:"Servidor Ollama compatible. Incluye modelos locales y modelos cloud si hiciste ollama signin.",setup:{kind:"local-server",intro:"Esto solo configura el servidor Ollama; no abre un login OAuth.",nextStep:"Asegurate de tener ollama serve activo. Si usas cloud, ejecuta ollama signin fuera del CLI.",actionLabel:"Continuar con Ollama"},implemented:!0},{id:"ollama-cloud",label:"Ollama Cloud",description:"Modelos cloud desde tu servidor Ollama autenticado con ollama signin.",setup:{kind:"local-server",intro:"Esto usa tu servidor Ollama ya autenticado; no abre un login OAuth.",nextStep:"Ejecuta ollama signin fuera del CLI, usa http://localhost:11434/v1 y despues elige un modelo cloud desde /model.",actionLabel:"Continuar con Ollama Cloud"},implemented:!0},{id:"openai",label:"OpenAI / Codex",description:"OAuth de OpenAI",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de OpenAI / Codex.",nextStep:"Despues de iniciar sesion, elige un modelo desde /model.",actionLabel:"Continuar con OpenAI"},implemented:!0},{id:"gemini-google",label:"Gemini Google OAuth",description:"Cuenta Google mediante OAuth compatible con Gemini CLI.",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de Google usando el flujo OAuth de Gemini CLI.",nextStep:"Usa /login y elige Gemini Google para abrir el navegador y guardar el token OAuth.",actionLabel:"Continuar con Google"},implemented:!0},{id:"gemini-api",label:"Gemini API",description:"API key de Google AI Studio, usando endpoint OpenAI-compatible.",setup:{kind:"api-key",intro:"Pega tu API key de Gemini / Google AI Studio.",nextStep:"Despues, elige un modelo Gemini desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"zai",label:"Z.AI",description:"API key propia. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de Z.AI.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"nvidia",label:"NVIDIA API",description:"API key propia de NVIDIA NIM / build.nvidia.com. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de NVIDIA.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"deepseek",label:"DeepSeek",description:"API key propia de api.deepseek.com (OpenAI-compatible). Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de DeepSeek (sk-...).",nextStep:"Despues, elige un modelo como deepseek-chat o deepseek-reasoner desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"claude",label:"Claude (Anthropic)",description:"Suscripcion Claude o Anthropic Console",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de Claude o Anthropic Console.",nextStep:"Despues de iniciar sesion, elige un modelo desde /model.",actionLabel:"Continuar con Claude"},implemented:!0},{id:"custom-openai",label:"Custom OpenAI",description:"API key y endpoint personalizado para OpenAI-compatible. Ideal para proxies o servidores propios.",setup:{kind:"api-key",intro:"Wizard paso a paso: API key, endpoint (opcional), modelo (opcional).",nextStep:"Al finalizar, elige un modelo desde /model.",actionLabel:"Configurar Custom OpenAI"},implemented:!0},{id:"custom-anthropic",label:"Custom Anthropic",description:"API key y endpoint personalizado para Anthropic-compatible. Ideal para instalaciones on-premise.",setup:{kind:"api-key",intro:"Wizard paso a paso: API key, endpoint (opcional), modelo (opcional).",nextStep:"Al finalizar, elige un modelo desde /model.",actionLabel:"Configurar Custom Anthropic"},implemented:!0}];export function getVisibleProvider(e){const o=VISIBLE_PROVIDERS.find(o=>o.id===e);if(!o)throw new Error(`Unknown provider: ${e}`);return o}
1
+ export const VISIBLE_PROVIDERS=[{id:"minimax",label:"MiniMax",description:"API key propia. Usa el endpoint Anthropic-compatible y luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de MiniMax.",nextStep:"Despues, elige un modelo MiniMax compatible con Anthropic desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"openrouter",label:"OpenRouter",description:"API key propia. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de OpenRouter.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"ollama",label:"Ollama",description:"Servidor Ollama compatible. Incluye modelos locales y modelos cloud si hiciste ollama signin.",setup:{kind:"local-server",intro:"Esto solo configura el servidor Ollama; no abre un login OAuth.",nextStep:"Asegurate de tener ollama serve activo. Si usas cloud, ejecuta ollama signin fuera del CLI.",actionLabel:"Continuar con Ollama"},implemented:!0},{id:"ollama-cloud",label:"Ollama Cloud",description:"Modelos cloud desde tu servidor Ollama autenticado con ollama signin.",setup:{kind:"local-server",intro:"Esto usa tu servidor Ollama ya autenticado; no abre un login OAuth.",nextStep:"Ejecuta ollama signin fuera del CLI, usa http://localhost:11434/v1 y despues elige un modelo cloud desde /model.",actionLabel:"Continuar con Ollama Cloud"},implemented:!0},{id:"openai",label:"OpenAI / Codex",description:"OAuth de OpenAI",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de OpenAI / Codex.",nextStep:"Despues de iniciar sesion, elige un modelo desde /model.",actionLabel:"Continuar con OpenAI"},implemented:!0},{id:"gemini-google",label:"Gemini Google OAuth",description:"Cuenta Google mediante OAuth compatible con Gemini CLI.",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de Google usando el flujo OAuth de Gemini CLI.",nextStep:"Usa /login y elige Gemini Google para abrir el navegador y guardar el token OAuth.",actionLabel:"Continuar con Google"},implemented:!0},{id:"gemini-api",label:"Gemini API",description:"API key de Google AI Studio, usando endpoint OpenAI-compatible.",setup:{kind:"api-key",intro:"Pega tu API key de Gemini / Google AI Studio.",nextStep:"Despues, elige un modelo Gemini desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"zai",label:"Z.AI",description:"API key propia. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de Z.AI.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"nvidia",label:"NVIDIA API",description:"API key propia de NVIDIA NIM / build.nvidia.com. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de NVIDIA.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"deepseek",label:"DeepSeek",description:"API key propia de api.deepseek.com (OpenAI-compatible). Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de DeepSeek (sk-...).",nextStep:"Despues, elige un modelo como deepseek-chat o deepseek-reasoner desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"xai",label:"xAI / Grok",description:"API key propia de api.x.ai (OpenAI-compatible). Luego elige un modelo Grok en /model.",setup:{kind:"api-key",intro:"Pega tu API key de xAI (xai-...).",nextStep:"Despues, elige un modelo como grok-4 o grok-code-fast-1 desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"gmi",label:"GMI Cloud",description:"API key de api.gmi-serving.com (OpenAI-compatible, multi-modelo). Luego elige modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de GMI Cloud.",nextStep:"Despues, elige un modelo desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"novita",label:"NovitaAI",description:"API key de novita.ai (OpenAI-compatible, multi-modelo). Luego elige modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de NovitaAI.",nextStep:"Despues, elige un modelo desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"stepfun",label:"StepFun",description:"API key de stepfun.ai (OpenAI-compatible). Luego elige un modelo Step en /model.",setup:{kind:"api-key",intro:"Pega tu API key de StepFun.",nextStep:"Despues, elige un modelo como step-3 desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"huggingface",label:"HuggingFace",description:"Token HF en router.huggingface.co (OpenAI-compatible). Luego elige modelo en /model.",setup:{kind:"api-key",intro:"Pega tu token de HuggingFace (HF_TOKEN, hf_...).",nextStep:"Despues, elige un modelo desde /model.",actionLabel:"Pegar token"},implemented:!0},{id:"opencode-zen",label:"OpenCode Zen",description:"API key de opencode.ai/zen (OpenAI-compatible). Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de OpenCode Zen.",nextStep:"Despues, elige un modelo desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"arcee",label:"Arcee AI",description:"API key de api.arcee.ai (OpenAI-compatible). Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de Arcee AI.",nextStep:"Despues, elige un modelo (p.ej. auto) desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"alibaba",label:"Alibaba (Qwen)",description:"API key de DashScope (compatible-mode OpenAI). Luego elige un modelo Qwen en /model.",setup:{kind:"api-key",intro:"Pega tu API key de DashScope / Alibaba Cloud (DASHSCOPE_API_KEY).",nextStep:"Despues, elige un modelo como qwen3-max desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"kimi",label:"Kimi (Moonshot)",description:"API key de api.moonshot.ai (OpenAI-compatible). Luego elige un modelo Kimi en /model.",setup:{kind:"api-key",intro:"Pega tu API key de Kimi / Moonshot (KIMI_API_KEY).",nextStep:"Despues, elige un modelo como kimi-k2-0905-preview desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"claude",label:"Claude (Anthropic)",description:"Suscripcion Claude o Anthropic Console",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de Claude o Anthropic Console.",nextStep:"Despues de iniciar sesion, elige un modelo desde /model.",actionLabel:"Continuar con Claude"},implemented:!0},{id:"custom-openai",label:"Custom OpenAI",description:"API key y endpoint personalizado para OpenAI-compatible. Ideal para proxies o servidores propios.",setup:{kind:"api-key",intro:"Wizard paso a paso: API key, endpoint (opcional), modelo (opcional).",nextStep:"Al finalizar, elige un modelo desde /model.",actionLabel:"Configurar Custom OpenAI"},implemented:!0},{id:"custom-anthropic",label:"Custom Anthropic",description:"API key y endpoint personalizado para Anthropic-compatible. Ideal para instalaciones on-premise.",setup:{kind:"api-key",intro:"Wizard paso a paso: API key, endpoint (opcional), modelo (opcional).",nextStep:"Al finalizar, elige un modelo desde /model.",actionLabel:"Configurar Custom Anthropic"},implemented:!0}];export function getVisibleProvider(e){const o=VISIBLE_PROVIDERS.find(o=>o.id===e);if(!o)throw new Error(`Unknown provider: ${e}`);return o}
@@ -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 o,isProfiledProvider as r}from"./providerProfiles.js";const n={"minimax-m3":"Modelo multimodal de frontera para codigo, con ventana de 1M tokens.","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-M3","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."}],u=[{value:"grok-4",label:"Grok 4",description:"Modelo principal de xAI para razonamiento, codigo y agentes."},{value:"grok-4-fast-reasoning",label:"Grok 4 Fast (reasoning)",description:"Variante rapida de Grok 4 con razonamiento."},{value:"grok-code-fast-1",label:"Grok Code Fast 1",description:"Optimizado para tareas agenticas de codigo de baja latencia."},{value:"grok-3",label:"Grok 3",description:"Generacion anterior, estable para uso general."}],d={gmi:[{value:"deepseek-ai/DeepSeek-V3.2",label:"DeepSeek V3.2",description:"GMI Cloud — DeepSeek V3.2."},{value:"moonshotai/Kimi-K2.5",label:"Kimi K2.5",description:"GMI Cloud — Moonshot Kimi K2.5."},{value:"zai-org/GLM-5.1-FP8",label:"GLM 5.1",description:"GMI Cloud — Zhipu GLM 5.1."},{value:"openai/gpt-5.4",label:"GPT-5.4",description:"GMI Cloud — OpenAI GPT-5.4."}],novita:[{value:"moonshotai/kimi-k2.5",label:"Kimi K2.5",description:"NovitaAI — Moonshot Kimi K2.5."},{value:"zai-org/glm-5",label:"GLM 5",description:"NovitaAI — Zhipu GLM 5."},{value:"deepseek/deepseek-v3-0324",label:"DeepSeek V3 0324",description:"NovitaAI — DeepSeek V3."},{value:"qwen/qwen3-235b-a22b-fp8",label:"Qwen3 235B",description:"NovitaAI — Qwen3 235B."}],stepfun:[{value:"step-3",label:"Step 3",description:"StepFun — modelo flagship Step 3."}],huggingface:[{value:"Qwen/Qwen3.5-72B-Instruct",label:"Qwen3.5 72B",description:"HuggingFace router — Qwen3.5 72B Instruct."},{value:"deepseek-ai/DeepSeek-V3.2",label:"DeepSeek V3.2",description:"HuggingFace router — DeepSeek V3.2."}],arcee:[{value:"auto",label:"Auto (router)",description:"Arcee AI — enrutador automático de modelos."}],alibaba:[{value:"qwen3-max",label:"Qwen3 Max",description:"Alibaba DashScope — Qwen3 Max."},{value:"qwen3-coder-plus",label:"Qwen3 Coder Plus",description:"Alibaba DashScope — Qwen3 Coder Plus."},{value:"qwen-plus",label:"Qwen Plus",description:"Alibaba DashScope — Qwen Plus."}],kimi:[{value:"kimi-k2-0905-preview",label:"Kimi K2 (0905)",description:"Moonshot — Kimi K2 para coding."},{value:"moonshot-v1-128k",label:"Moonshot v1 128k",description:"Moonshot — contexto 128k."}]},p=new Map,m=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}:${(r(e)?o(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";case"xai":return"xAI";case"gmi":return"GMI Cloud";case"novita":return"NovitaAI";case"stepfun":return"StepFun";case"huggingface":return"HuggingFace";case"opencode-zen":return"OpenCode Zen";case"arcee":return"Arcee AI";case"alibaba":return"Alibaba (Qwen)";case"kimi":return"Kimi (Moonshot)";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");case"xai":return ensureV1Suffix(process.env.XAI_BASE_URL||t("xai")||"https://api.x.ai/v1");case"gmi":case"novita":case"stepfun":case"huggingface":case"opencode-zen":case"arcee":case"alibaba":case"kimi":return ensureV1Suffix(t(e));case"custom-openai":return ensureV1Suffix(t("custom-openai")||"https://api.openai.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={},o=i(a),r=getProviderBaseUrl(a);return"ollama"!==a&&!("ollama-cloud"===a&&isLocalOllamaProviderHost(r))&&o&&(t.Authorization=`Bearer ${o}`),"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 m.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,o=setTimeout(()=>t.abort(),i);try{return await fetch(e,{headers:a,signal:t.signal})}finally{clearTimeout(o)}}export async function checkProviderHealth(e,t={}){if(!t.forceRefresh){const a=function(e){const a=m.get(getProviderCacheKey(e));return a?a.expiresAt<Date.now()?(m.delete(getProviderCacheKey(e)),null):a.result:null}(e);if(a)return a}const o=getProviderBaseUrl(e),r=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(o)||l))return cacheProviderHealth(buildHealthResult(e,"needs-setup",`${r} no tiene credenciales configuradas.`,{baseUrl:o}));try{if("minimax"===e)return cacheProviderHealth(buildHealthResult(e,"healthy",`${r} configurado para Anthropic-compatible (${o}).`,{baseUrl:o}));if("ollama"===e||"ollama-cloud"===e){const a=[`${o.endsWith("/v1")?o.slice(0,-3):o}/api/tags`,`${o}/models`];let i,t="";for(const r of a){const a=await fetchWithTimeout(r,n);if(a.ok)return cacheProviderHealth(buildHealthResult(e,"healthy",`Conectado a ${r}.`,{baseUrl:o,statusCode:a.status}));if(i=a.status,t=`${a.status} ${a.statusText}`.trim(),404!==a.status||!r.endsWith("/api/tags"))break}return cacheProviderHealth(429===i?buildHealthResult(e,"rate-limited",`${r} devolvió rate limit al validar la conexión.`,{baseUrl:o,statusCode:i}):buildHealthResult(e,"unreachable",t?`${r} no respondió correctamente (${t}).`:`${r} no respondió correctamente.`,{baseUrl:o,statusCode:i}))}const a=`${o}/models`,i=await fetchWithTimeout(a,n);return i.ok?cacheProviderHealth(buildHealthResult(e,"healthy",`Conectado a ${a}.`,{baseUrl:o,statusCode:i.status})):401===i.status||403===i.status?cacheProviderHealth(buildHealthResult(e,"needs-setup",`${r} rechazó la solicitud. Revisa la API key o token configurado.`,{baseUrl:o,statusCode:i.status})):429===i.status?cacheProviderHealth(buildHealthResult(e,"rate-limited",`${r} devolvió rate limit al validar la conexión.`,{baseUrl:o,statusCode:i.status})):cacheProviderHealth(buildHealthResult(e,"unreachable",`${r} respondió con ${i.status} al validar la conexión.`,{baseUrl:o,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:o})):i.includes("401")||i.includes("403")||i.toLowerCase().includes("authentication")?cacheProviderHealth(buildHealthResult(e,"needs-setup",`${r} no tiene credenciales válidas.`,{baseUrl:o})):i.includes("429")||i.toLowerCase().includes("rate limit")?cacheProviderHealth(buildHealthResult(e,"rate-limited",`${r} devolvió rate limit al validar la conexión.`,{baseUrl:o})):cacheProviderHealth(buildHealthResult(e,"unreachable",`${r} no pudo validarse: ${i||"error desconocido"}.`,{baseUrl:o}))}}export function getCachedProviderModels(e){return p.get(getProviderCacheKey(e))??null}export async function fetchProviderModels(e){const i=getProviderCacheKey(e),t=p.get(i);if(t)return t;try{if("minimax"===e)try{const e=a(),t=function(e){return(e.data??[]).map(e=>{const a=e.id?.trim();return a?{value:a,label:e.display_name?.trim()||a,description:n[a.toLowerCase()]??""}:null}).filter(e=>null!==e)}(await fetchJson(`${getProviderBaseUrl("minimax")}/v1/models`,{"X-Api-Key":e??"","Content-Type":"application/json"})),o=new Set(t.map(e=>e.value)),r=t.length>0?[...t,...l.filter(e=>!o.has(e.value))]:l;return p.set(i,r),r}catch{return p.set(i,l),l}let t=[];if("ollama"===e||"ollama-cloud"===e){const a=getProviderBaseUrl(e),i=a.endsWith("/v1")?a.slice(0,-3):a;try{t=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(`${i}/api/tags`,await buildProviderHeaders(e))),a)}catch{t=filterOllamaModels(e,mapOpenAICompatibleModels(await fetchJson(`${a}/models`,await buildProviderHeaders(e)),e),a)}}else{t=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));t=[...c,...t.filter(a=>!e.has(a.value))]}if("xai"===e){const e=new Set(u.map(e=>e.value));t=[...u,...t.filter(a=>!e.has(a.value))]}if("deepseek"===e){const e=new Set(s.map(e=>e.value));t=[...s,...t.filter(a=>!e.has(a.value))]}const o=d[e];if(o){const e=new Set(o.map(e=>e.value));t=[...o,...t.filter(a=>!e.has(a.value))]}return p.set(i,t),t}catch{if("gemini-api"===e||"gemini-google"===e)return p.set(i,c),c;if("xai"===e)return p.set(i,u),u;if("deepseek"===e)return p.set(i,s),s;const a=d[e];return a?(p.set(i,a),a):[]}}
@@ -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","custom-openai","custom-anthropic"]),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","custom-openai":"main","custom-anthropic":"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","custom-openai":"custom-openai","custom-anthropic":"custom-anthropic"},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
+ import{getStoredLastModelForProvider as e,getStoredProviderBaseUrl as i,readProviderProfilesState as r,writeProviderProfilesState as o}from"./providerProfilesDb.js";const t=new Set(["claude","openai","openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","nvidia","deepseek","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi","custom-openai","custom-anthropic"]),n={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",xai:"main",gmi:"main",novita:"main",stepfun:"main",huggingface:"main","opencode-zen":"main",arcee:"main",alibaba:"main",kimi:"main","custom-openai":"main","custom-anthropic":"main"},a={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",xai:"xai",gmi:"gmi",novita:"novita",stepfun:"stepfun",huggingface:"huggingface","opencode-zen":"opencode-zen",arcee:"arcee",alibaba:"alibaba",kimi:"kimi","custom-openai":"custom-openai","custom-anthropic":"custom-anthropic"},l={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",xai:"https://api.x.ai/v1",gmi:"https://api.gmi-serving.com/v1",novita:"https://api.novita.ai/openai/v1",stepfun:"https://api.stepfun.ai/step_plan/v1",huggingface:"https://router.huggingface.co/v1","opencode-zen":"https://opencode.ai/zen/v1",arcee:"https://api.arcee.ai/api/v1",alibaba:"https://dashscope-intl.aliyuncs.com/compatible-mode/v1",kimi:"https://api.moonshot.ai/v1"};function sanitizeProfileSegment(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"default"}function buildProfileId(e,i){return`${e}/${sanitizeProfileSegment(i)}`}function buildDefaultAgentName(e,i){const r=a[e],o=sanitizeProfileSegment(i);return o===sanitizeProfileSegment(n[e])?r:`${r}-${o}`}export function getDefaultProfileName(e){return n[e]}export function buildProviderProfileId(e,i){return buildProfileId(e,i)}export function isDefaultProfileId(e,i){return!!i&&i===buildProfileId(e,n[e])}function getState(){const e=r();return{version:1,profiles:e.profiles??{},lastProfileIdByProvider:e.lastProfileIdByProvider??{},activeProfileId:e.activeProfileId}}function saveState(e){const i=e(getState());return o(i),i}function getProfilesMap(){return getState().profiles??{}}function getProfileSeed(r,o){return o?function(r){return{baseUrl:"openrouter"===r||"ollama"===r||"ollama-cloud"===r||"zai"===r||"minimax"===r||"deepseek"===r||"xai"===r||"gmi"===r||"novita"===r||"stepfun"===r||"huggingface"===r||"opencode-zen"===r||"arcee"===r||"alibaba"===r||"kimi"===r?i(r):void 0,lastModel:e(r)??null}}(r):{baseUrl:l[r],lastModel:null}}export function isProfiledProvider(e){return t.has(e)}export function listProviderProfiles(e){const i=Object.values(getProfilesMap());return e?i.filter(i=>i.provider===e):i}export function getProviderProfile(e){return e?getProfilesMap()[e]??null:null}export function getActiveProviderProfile(){return getProviderProfile(getState().activeProfileId)}export function getLastUsedProviderProfile(e){const i=getState(),r=i.lastProfileIdByProvider?.[e];if(r){const e=getProviderProfile(r);if(e)return e}return listProviderProfiles(e)[0]??null}export function createProviderProfile(e){const i=buildProfileId(e.provider,e.name),r=getProviderProfile(i);if(r)return r;const o=(new Date).toISOString(),t={id:i,provider:e.provider,name:e.name.trim()||n[e.provider],agentName:e.agentName?.trim()||buildDefaultAgentName(e.provider,e.name),baseUrl:e.baseUrl,lastModel:e.lastModel??null,createdAt:o,updatedAt:o};return saveState(i=>({...i,activeProfileId:e.activate?t.id:i.activeProfileId,profiles:{...i.profiles??{},[t.id]:t},lastProfileIdByProvider:{...i.lastProfileIdByProvider??{},[e.provider]:t.id}})),t}export function ensureProviderProfile(e,i=n[e]){const r=getProviderProfile(buildProfileId(e,i));if(r)return r;return createProviderProfile({provider:e,name:i,...getProfileSeed(e,0===listProviderProfiles(e).length),activate:!1})}export function resolveProviderProfile(e,i={}){const r=getActiveProviderProfile();if(r?.provider===e)return r;const o=getLastUsedProviderProfile(e);return o||(i.createIfMissing?ensureProviderProfile(e):null)}export function getResolvedProviderProfileId(e){return resolveProviderProfile(e)?.id??null}export function setActiveProviderProfile(e){const i=getProviderProfile(e);return i?(saveState(e=>({...e,activeProfileId:i.id,lastProfileIdByProvider:{...e.lastProfileIdByProvider??{},[i.provider]:i.id}})),i):null}export function setActiveProfileForProvider(e,i){const r=i&&i.trim()?ensureProviderProfile(e,i):resolveProviderProfile(e,{createIfMissing:!0});return setActiveProviderProfile(r.id),r}export function findProviderProfileByName(e,i){return getProviderProfile(buildProfileId(e,i))}export function updateProviderProfile(e,i){let r=null;return saveState(o=>{const t=o.profiles?.[e];return t?(r=i(t),{...o,profiles:{...o.profiles??{},[e]:r},lastProfileIdByProvider:{...o.lastProfileIdByProvider??{},[t.provider]:e}}):o}),r}export function renameProviderProfile(e,i,r){const o=findProviderProfileByName(e,i);if(!o)return null;const t=r.trim();if(!t)throw new Error("Debes indicar un nuevo nombre de perfil.");const n=buildProfileId(e,t);if(n!==o.id&&getProviderProfile(n))throw new Error(`Ya existe un perfil ${e}/${t}.`);const a={...o,id:n,name:t,updatedAt:(new Date).toISOString()};return saveState(i=>{const r={...i.profiles??{}};delete r[o.id],r[n]=a;const t={...i.lastProfileIdByProvider??{},[e]:i.lastProfileIdByProvider?.[e]===o.id?n:i.lastProfileIdByProvider?.[e]};return{...i,activeProfileId:i.activeProfileId===o.id?n:i.activeProfileId,profiles:r,lastProfileIdByProvider:t}}),{previousId:o.id,profile:a}}export function removeProviderProfile(e,i){const r=findProviderProfileByName(e,i);return r?(saveState(i=>{const o={...i.profiles??{}};delete o[r.id];const t=Object.values(o).filter(i=>i.provider===e),n=t[0]?.id;return{...i,activeProfileId:i.activeProfileId===r.id?n:i.activeProfileId,profiles:o,lastProfileIdByProvider:{...i.lastProfileIdByProvider??{},[e]:i.lastProfileIdByProvider?.[e]===r.id?n:i.lastProfileIdByProvider?.[e]}}}),r):null}export function clearAllProviderProfiles(){const e=Object.values(getProfilesMap());return saveState(e=>({version:1,profiles:{},lastProfileIdByProvider:{}})),e}export function setProviderProfileAgentNameByName(e,i,r){const o=findProviderProfileByName(e,i);if(!o)return null;const t=sanitizeProfileSegment(r);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,i){const r=resolveProviderProfile(e,{createIfMissing:!0});return updateProviderProfile(r.id,e=>({...e,baseUrl:i,updatedAt:(new Date).toISOString()}))??r}export function clearProviderProfileBaseUrl(e){const i=resolveProviderProfile(e);return i?updateProviderProfile(i.id,e=>({...e,baseUrl:void 0,updatedAt:(new Date).toISOString()})):null}export function getProviderProfileBaseUrl(e){return resolveProviderProfile(e)?.baseUrl??null}export function setProviderProfileLastModel(e,i){const r=resolveProviderProfile(e);return r?updateProviderProfile(r.id,e=>({...e,lastModel:i,updatedAt:(new Date).toISOString()})):null}export function getProviderProfileLastModel(e){return resolveProviderProfile(e)?.lastModel??null}export function setProviderProfileLastModelByName(e,i,r){const o=findProviderProfileByName(e,i);return o?updateProviderProfile(o.id,e=>({...e,lastModel:r,updatedAt:(new Date).toISOString()})):null}