@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.
- package/context-bootstrap.js +8 -1
- package/contextcode-bootstrap.js +7 -1
- package/dist/src/QueryEngine.js +1 -1
- package/dist/src/cli/handlers/auth.js +1 -1
- package/dist/src/cli/handlers/modelList.js +1 -1
- package/dist/src/cli/structuredIO.js +1 -1
- package/dist/src/commands/branch/index.js +1 -1
- package/dist/src/commands/login/login.js +1 -1
- package/dist/src/commands/profile/index.js +1 -1
- package/dist/src/commands/profile/profile.js +1 -1
- package/dist/src/commands/provider/index.js +1 -1
- package/dist/src/commands/provider/provider.js +1 -1
- package/dist/src/components/ConsoleOAuthFlow.js +1 -1
- package/dist/src/components/LogoV2/Opus1mMergeNotice.js +1 -1
- package/dist/src/components/ModelPicker.js +1 -1
- package/dist/src/components/SessionTokenFooter.js +1 -0
- package/dist/src/constants/oauth.js +1 -1
- package/dist/src/core/providers/providerCore.js +1 -1
- package/dist/src/hooks/useTypeahead.js +1 -1
- package/dist/src/main.js +1 -1
- package/dist/src/screens/REPL.js +1 -1
- package/dist/src/services/api/openai.js +1 -1
- package/dist/src/services/oauth/auth-code-listener.js +1 -1
- package/dist/src/services/oauth/client.js +1 -1
- package/dist/src/services/oauth/geminiCli.js +1 -1
- package/dist/src/utils/auth.js +1 -1
- package/dist/src/utils/claudeInChrome/setup.js +1 -1
- package/dist/src/utils/config.js +1 -1
- package/dist/src/utils/env.js +1 -1
- package/dist/src/utils/envUtils.js +1 -1
- package/dist/src/utils/git.js +1 -1
- package/dist/src/utils/localInstaller.js +1 -1
- package/dist/src/utils/model/configs.js +1 -1
- package/dist/src/utils/model/model.js +1 -1
- package/dist/src/utils/model/modelAllowlist.js +1 -1
- package/dist/src/utils/model/modelOptions.js +1 -1
- package/dist/src/utils/model/providerBaseUrls.js +1 -1
- package/dist/src/utils/model/providerCatalog.js +1 -1
- package/dist/src/utils/model/providerModels.js +1 -1
- package/dist/src/utils/model/providerProfiles.js +1 -1
- package/dist/src/utils/model/providerProfilesDb.js +1 -1
- package/dist/src/utils/model/providers.js +1 -1
- package/dist/src/utils/model/validateModel.js +1 -1
- package/dist/src/utils/permissions/filesystem.js +1 -1
- package/dist/src/utils/ripgrep.js +1 -1
- package/dist/webapp/ngsw.json +1 -1
- package/package.json +1 -1
package/context-bootstrap.js
CHANGED
|
@@ -9,8 +9,15 @@ const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
|
9
9
|
const __filename = fileURLToPath(import.meta.url)
|
|
10
10
|
const cliArgs = process.argv.slice(2)
|
|
11
11
|
|
|
12
|
+
// Context Code usa `~/.context` como home dir. Setear ambas vars: la nueva
|
|
13
|
+
// (CONTEXT_CONFIG_DIR) es la preferida; CLAUDE_CONFIG_DIR se mantiene como
|
|
14
|
+
// alias por compatibilidad con codigo heredado de upstream.
|
|
15
|
+
const ctxHome = join(homedir(), '.context')
|
|
16
|
+
if (!process.env.CONTEXT_CONFIG_DIR) {
|
|
17
|
+
process.env.CONTEXT_CONFIG_DIR = ctxHome
|
|
18
|
+
}
|
|
12
19
|
if (!process.env.CLAUDE_CONFIG_DIR) {
|
|
13
|
-
process.env.CLAUDE_CONFIG_DIR =
|
|
20
|
+
process.env.CLAUDE_CONFIG_DIR = ctxHome
|
|
14
21
|
}
|
|
15
22
|
|
|
16
23
|
// Re-spawn con heap grande si todavía no lo tenemos. V8 lee
|
package/contextcode-bootstrap.js
CHANGED
|
@@ -14,8 +14,14 @@ const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
|
14
14
|
const __filename = fileURLToPath(import.meta.url)
|
|
15
15
|
const cliArgs = process.argv.slice(2)
|
|
16
16
|
|
|
17
|
+
// Setear ambas vars: CONTEXT_CONFIG_DIR es la preferida; CLAUDE_CONFIG_DIR
|
|
18
|
+
// se mantiene como alias por compatibilidad con codigo heredado.
|
|
19
|
+
const ctxHome = join(homedir(), '.context')
|
|
20
|
+
if (!process.env.CONTEXT_CONFIG_DIR) {
|
|
21
|
+
process.env.CONTEXT_CONFIG_DIR = ctxHome
|
|
22
|
+
}
|
|
17
23
|
if (!process.env.CLAUDE_CONFIG_DIR) {
|
|
18
|
-
process.env.CLAUDE_CONFIG_DIR =
|
|
24
|
+
process.env.CLAUDE_CONFIG_DIR = ctxHome
|
|
19
25
|
}
|
|
20
26
|
|
|
21
27
|
// --------------------------------------------------------------------------
|
package/dist/src/QueryEngine.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{feature as e}from"./recovery/bunBundleShim.js";import{createRequire as s}from"module";const t=s(import.meta.url);import{randomUUID as o}from"crypto";import i from"lodash-es/last.js";import{getSessionId as a,isSessionPersistenceDisabled as r}from"./bootstrap/state.js";import{accumulateUsage as n,updateUsage as m}from"./services/api/claude.js";import{EMPTY_USAGE as l}from"./services/api/logging.js";import u from"strip-ansi";import{getSlashCommandToolSkills as p}from"./commands.js";import{LOCAL_COMMAND_STDERR_TAG as d,LOCAL_COMMAND_STDOUT_TAG as c}from"./constants/xml.js";import{getModelUsage as _,getTotalAPIDuration as g,getTotalCost as y}from"./cost-tracker.js";import{loadMemoryPrompt as h}from"./memdir/memdir.js";import{hasAutoMemPathOverride as f}from"./memdir/paths.js";import{query as S}from"./query.js";import{categorizeRetryableAPIError as C}from"./services/api/errors.js";import{toolMatchesName as E}from"./Tool.js";import{SYNTHETIC_OUTPUT_TOOL_NAME as b}from"./tools/SyntheticOutputTool/SyntheticOutputTool.js";import{createAbortController as M}from"./utils/abortController.js";import{getGlobalConfig as O}from"./utils/config.js";import{getCwd as v}from"./utils/cwd.js";import{isBareMode as D,isEnvTruthy as U}from"./utils/envUtils.js";import{getFastModeState as T}from"./utils/fastMode.js";import{fileHistoryEnabled as R,fileHistoryMakeSnapshot as A}from"./utils/fileHistory.js";import{cloneFileStateCache as j}from"./utils/fileStateCache.js";import{headlessProfilerCheckpoint as x}from"./utils/headlessProfiler.js";import{registerStructuredOutputEnforcement as w}from"./utils/hooks/hookHelpers.js";import{getInMemoryErrors as P}from"./utils/log.js";import{countToolCalls as I,SYNTHETIC_MESSAGES as k}from"./utils/messages.js";import{getMainLoopModel as L,parseUserSpecifiedModel as F}from"./utils/model/model.js";import{loadAllPluginsCacheOnly as N}from"./utils/plugins/pluginLoader.js";import{processUserInput as H}from"./utils/processUserInput/processUserInput.js";import{fetchSystemPromptParts as K}from"./utils/queryContext.js";import{setCwd as W}from"./utils/Shell.js";import{flushSessionStorage as X,recordTranscript as G}from"./utils/sessionStorage.js";import{asSystemPrompt as B}from"./utils/systemPromptType.js";import{resolveThemeSetting as $}from"./utils/systemTheme.js";import{shouldEnableThinkingByDefault as q}from"./utils/thinking.js";import{CoreQueryRuntimeEmitter as Q}from"./core/query/runtime.js";const messageSelector=()=>t("./components/MessageSelector.js");import{localCommandOutputToSDKAssistantMessage as Y,toSDKCompactMetadata as J}from"./utils/messages/mappers.js";import{buildSystemInitMessage as V,sdkCompatToolName as z}from"./utils/messages/systemInit.js";import{getScratchpadDir as Z,isScratchpadEnabled as ee}from"./utils/permissions/filesystem.js";import{handleOrphanedPermission as se,isResultSuccessful as te,normalizeMessage as oe}from"./utils/queryHelpers.js";import{isAbortError as ie}from"./utils/errors.js";const ae=e("COORDINATOR_MODE")?t("./coordinator/coordinatorMode.js").getCoordinatorUserContext:()=>({}),re=e("HISTORY_SNIP")?t("./services/compact/snipCompact.js"):null,ne=e("HISTORY_SNIP")?t("./services/compact/snipProjection.js"):null;export class QueryEngine{config;mutableMessages;abortController;permissionDenials;totalUsage;hasHandledOrphanedPermission=!1;readFileState;discoveredSkillNames=new Set;loadedNestedMemoryPaths=new Set;constructor(e){this.config=e,this.mutableMessages=e.initialMessages??[],this.abortController=e.abortController??M(),this.permissionDenials=[],this.readFileState=e.readFileCache,this.totalUsage=l}async*submitMessage(e,s){const{cwd:t,commands:M,tools:j,mcpClients:re,verbose:ne=!1,thinkingConfig:me,maxTurns:le,maxBudgetUsd:ue,taskBudget:pe,canUseTool:de,customSystemPrompt:ce,appendSystemPrompt:_e,userSpecifiedModel:ge,fallbackModel:ye,jsonSchema:he,getAppState:fe,setAppState:Se,replayUserMessages:Ce=!1,includePartialMessages:Ee=!1,agents:be=[],setSDKStatus:Me,orphanedPermission:Oe}=this.config;this.discoveredSkillNames.clear(),W(t);const ve=!r(),De=Date.now(),wrappedCanUseTool=async(e,s,t,o,i,a)=>{const r=await de(e,s,t,o,i,a);return"allow"!==r.behavior&&this.permissionDenials.push({tool_name:z(e.name),tool_use_id:i,tool_input:s}),r},Ue=fe(),Te=ge?F(ge):L(),Re=me||(!1!==q()?{type:"adaptive"}:{type:"disabled"});x("before_getSystemPrompt");const Ae="string"==typeof ce?ce:void 0,{defaultSystemPrompt:je,userContext:xe,systemContext:we}=await K({tools:j,mainLoopModel:Te,additionalWorkingDirectories:Array.from(Ue.toolPermissionContext.additionalWorkingDirectories.keys()),mcpClients:re,customSystemPrompt:Ae});x("after_getSystemPrompt");const Pe={...xe,...ae(re,ee()?Z():void 0)},Ie=void 0!==Ae&&f()?await h():null,ke=B([...void 0!==Ae?[Ae]:je,...Ie?[Ie]:[],..._e?[_e]:[]]),Le=j.some(e=>E(e,b));he&&Le&&w(Se,a());let Fe={messages:this.mutableMessages,setMessages:e=>{this.mutableMessages=e(this.mutableMessages)},onChangeAPIKey:()=>{},handleElicitation:this.config.handleElicitation,options:{commands:M,debug:!1,tools:j,verbose:ne,mainLoopModel:Te,thinkingConfig:Re,mcpClients:re,mcpResources:{},ideInstallationStatus:null,isNonInteractiveSession:!0,customSystemPrompt:ce,appendSystemPrompt:_e,agentDefinitions:{activeAgents:be,allAgents:[]},theme:$(O().theme),maxBudgetUsd:ue},getAppState:fe,setAppState:Se,abortController:this.abortController,readFileState:this.readFileState,nestedMemoryAttachmentTriggers:new Set,loadedNestedMemoryPaths:this.loadedNestedMemoryPaths,dynamicSkillDirTriggers:new Set,discoveredSkillNames:this.discoveredSkillNames,setInProgressToolUseIDs:()=>{},setResponseLength:()=>{},updateFileHistoryState:e=>{Se(s=>{const t=e(s.fileHistory);return t===s.fileHistory?s:{...s,fileHistory:t}})},updateAttributionState:e=>{Se(s=>{const t=e(s.attribution);return t===s.attribution?s:{...s,attribution:t}})},setSDKStatus:Me};if(Oe&&!this.hasHandledOrphanedPermission){this.hasHandledOrphanedPermission=!0;for await(const e of se(Oe,j,this.mutableMessages,Fe))yield e}const{messages:Ne,shouldQuery:He,allowedTools:Ke,model:We,resultText:Xe}=await H({input:e,mode:"prompt",setToolJSX:()=>{},context:{...Fe,messages:this.mutableMessages},messages:this.mutableMessages,uuid:s?.uuid,isMeta:s?.isMeta,querySource:"sdk"});this.mutableMessages.push(...Ne);const Ge=[...this.mutableMessages];if(ve&&Ne.length>0){const e=G(Ge);D()||(await e,(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X())}const Be=Ne.filter(e=>"user"===e.type&&!e.isMeta&&!e.toolUseResult&&messageSelector().selectableUserMessagesFilter(e)||"system"===e.type&&"compact_boundary"===e.subtype),$e=Ce?Be:[];Se(e=>({...e,toolPermissionContext:{...e.toolPermissionContext,alwaysAllowRules:{...e.toolPermissionContext.alwaysAllowRules,command:Ke}}}));const qe=We??Te;Fe={messages:Ge,setMessages:()=>{},onChangeAPIKey:()=>{},handleElicitation:this.config.handleElicitation,options:{commands:M,debug:!1,tools:j,verbose:ne,mainLoopModel:qe,thinkingConfig:Re,mcpClients:re,mcpResources:{},ideInstallationStatus:null,isNonInteractiveSession:!0,customSystemPrompt:ce,appendSystemPrompt:_e,theme:$(O().theme),agentDefinitions:{activeAgents:be,allAgents:[]},maxBudgetUsd:ue},getAppState:fe,setAppState:Se,abortController:this.abortController,readFileState:this.readFileState,nestedMemoryAttachmentTriggers:new Set,loadedNestedMemoryPaths:this.loadedNestedMemoryPaths,dynamicSkillDirTriggers:new Set,discoveredSkillNames:this.discoveredSkillNames,setInProgressToolUseIDs:()=>{},setResponseLength:()=>{},updateFileHistoryState:Fe.updateFileHistoryState,updateAttributionState:Fe.updateAttributionState,setSDKStatus:Me},x("before_skills_plugins");const[Qe,{enabled:Ye}]=await Promise.all([p(v()),N()]);if(x("after_skills_plugins"),yield V({tools:j,mcpClients:re,model:qe,permissionMode:Ue.toolPermissionContext.mode,commands:M,agents:be,skills:Qe,plugins:Ye,fastMode:Ue.fastMode}),x("system_message_yielded"),!He){for(const e of Ne)"user"===e.type&&"string"==typeof e.message.content&&(e.message.content.includes(`<${c}>`)||e.message.content.includes(`<${d}>`)||e.isCompactSummary)&&(yield{type:"user",message:{...e.message,content:u(e.message.content)},session_id:a(),parent_tool_use_id:null,uuid:e.uuid,timestamp:e.timestamp,isReplay:!e.isCompactSummary,isSynthetic:e.isMeta||e.isVisibleInTranscriptOnly}),"system"===e.type&&"local_command"===e.subtype&&"string"==typeof e.content&&(e.content.includes(`<${c}>`)||e.content.includes(`<${d}>`))&&(yield Y(e.content,e.uuid)),"system"===e.type&&"compact_boundary"===e.subtype&&(yield{type:"system",subtype:"compact_boundary",session_id:a(),uuid:e.uuid,compact_metadata:J(e.compactMetadata)});return ve&&(await G(Ge),(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X()),void(yield{type:"result",subtype:"success",is_error:!1,duration_ms:Date.now()-De,duration_api_ms:g(),num_turns:Ge.length-1,result:Xe??"",stop_reason:null,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,fast_mode_state:T(qe,Ue.fastMode),uuid:o()})}R()&&ve&&Ne.filter(messageSelector().selectableUserMessagesFilter).forEach(e=>{A(e=>{Se(s=>({...s,fileHistory:e(s.fileHistory)}))},e.uuid)});let Je,Ve=l,ze=1,Ze=!1,es=null;const ss=P().at(-1),ts=he?I(this.mutableMessages,b):0,os="0"!==process.env.CORE_QUERY_ENABLED?new Q(this.config.onCoreQueryEvent):null;os?.emitSessionState("started");const emitCoreTerminalFailure=e=>{os?.emitResult(!0,es),os?.emitSessionState("cancelled"===e||"canceled"===e?"cancelled":"failed",e)};let is=null;try{for await(const e of S({messages:Ge,systemPrompt:ke,userContext:Pe,systemContext:we,canUseTool:wrappedCanUseTool,toolUseContext:Fe,fallbackModel:ye,querySource:"sdk",maxTurns:le,taskBudget:pe})){if(os?.emitRunning(),"assistant"===e.type||"user"===e.type||"system"===e.type&&"compact_boundary"===e.subtype){if(ve&&"system"===e.type&&"compact_boundary"===e.subtype){const s=e.compactMetadata?.preservedSegment?.tailUuid;if(s){const e=this.mutableMessages.findLastIndex(e=>e.uuid===s);-1!==e&&await G(this.mutableMessages.slice(0,e+1))}}if(Ge.push(e),ve&&("assistant"===e.type?G(Ge):await G(Ge)),!Ze&&$e.length>0){Ze=!0;for(const e of $e)"user"===e.type&&(yield{type:"user",message:e.message,session_id:a(),parent_tool_use_id:null,uuid:e.uuid,timestamp:e.timestamp,isReplay:!0})}}switch("user"===e.type&&(ze++,os?.setTurn(ze)),os?.emitFromQueryMessage(e),e.type){case"tombstone":case"stream_request_start":break;case"assistant":null!=e.message.stop_reason&&(es=e.message.stop_reason),this.mutableMessages.push(e),yield*oe(e);break;case"progress":this.mutableMessages.push(e),ve&&(Ge.push(e),G(Ge)),yield*oe(e);break;case"user":this.mutableMessages.push(e),yield*oe(e);break;case"stream_event":"message_start"===e.event.type&&(Ve=l,Ve=m(Ve,e.event.message.usage)),"message_delta"===e.event.type&&(Ve=m(Ve,e.event.usage),null!=e.event.delta.stop_reason&&(es=e.event.delta.stop_reason)),"message_stop"===e.event.type&&(this.totalUsage=n(this.totalUsage,Ve)),Ee&&(yield{type:"stream_event",event:e.event,session_id:a(),parent_tool_use_id:null,uuid:o()});break;case"attachment":if(this.mutableMessages.push(e),ve&&(Ge.push(e),G(Ge)),"structured_output"===e.attachment.type)Je=e.attachment.data;else{if("max_turns_reached"===e.attachment.type)return ve&&(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X(),yield{type:"result",subtype:"error_max_turns",duration_ms:Date.now()-De,duration_api_ms:g(),is_error:!0,num_turns:e.attachment.turnCount,stop_reason:es,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,fast_mode_state:T(qe,Ue.fastMode),uuid:o(),errors:[`Reached maximum number of turns (${e.attachment.maxTurns})`]},void emitCoreTerminalFailure("error_max_turns");Ce&&"queued_command"===e.attachment.type&&(yield{type:"user",message:{role:"user",content:e.attachment.prompt},session_id:a(),parent_tool_use_id:null,uuid:e.attachment.source_uuid||e.uuid,timestamp:e.timestamp,isReplay:!0})}break;case"system":{const s=this.config.snipReplay?.(e,this.mutableMessages);if(void 0!==s){s.executed&&(this.mutableMessages.length=0,this.mutableMessages.push(...s.messages));break}if(this.mutableMessages.push(e),"compact_boundary"===e.subtype&&e.compactMetadata){const s=this.mutableMessages.length-1;s>0&&this.mutableMessages.splice(0,s);const t=Ge.length-1;t>0&&Ge.splice(0,t),yield{type:"system",subtype:"compact_boundary",session_id:a(),uuid:e.uuid,compact_metadata:J(e.compactMetadata)}}"api_error"===e.subtype&&(yield{type:"system",subtype:"api_retry",attempt:e.retryAttempt,max_retries:e.maxRetries,retry_delay_ms:e.retryInMs,error_status:e.error.status??null,error:C(e.error),session_id:a(),uuid:e.uuid});break}case"tool_use_summary":yield{type:"tool_use_summary",summary:e.summary,preceding_tool_use_ids:e.precedingToolUseIds,session_id:a(),uuid:e.uuid}}if(void 0!==ue&&y()>=ue)return ve&&(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X(),yield{type:"result",subtype:"error_max_budget_usd",duration_ms:Date.now()-De,duration_api_ms:g(),is_error:!0,num_turns:ze,stop_reason:es,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,fast_mode_state:T(qe,Ue.fastMode),uuid:o(),errors:[`Reached maximum budget ($${ue})`]},void emitCoreTerminalFailure("error_max_budget_usd");if("user"===e.type&&he){const e=I(this.mutableMessages,b)-ts,s=parseInt(process.env.MAX_STRUCTURED_OUTPUT_RETRIES||"5",10);if(e>=s)return ve&&(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X(),yield{type:"result",subtype:"error_max_structured_output_retries",duration_ms:Date.now()-De,duration_api_ms:g(),is_error:!0,num_turns:ze,stop_reason:es,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,fast_mode_state:T(qe,Ue.fastMode),uuid:o(),errors:[`Failed to provide valid structured output after ${s} attempts`]},void emitCoreTerminalFailure("error_max_structured_output_retries")}}const e=Ge.findLast(e=>"assistant"===e.type||"user"===e.type),s=e?.type??"undefined",t="assistant"===e?.type?i(e.message.content)?.type??"none":"n/a";if(ve&&(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X(),!te(e,es))return yield{type:"result",subtype:"error_during_execution",duration_ms:Date.now()-De,duration_api_ms:g(),is_error:!0,num_turns:ze,stop_reason:es,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,fast_mode_state:T(qe,Ue.fastMode),uuid:o(),errors:(()=>{const e=P(),o=ss?e.lastIndexOf(ss)+1:0;return[`[ede_diagnostic] result_type=${s} last_content_type=${t} stop_reason=${es}`,...e.slice(o).map(e=>e.error)]})()},void emitCoreTerminalFailure("error_during_execution");let r="",u=!1;if("assistant"===e.type){const s=i(e.message.content);"text"!==s?.type||k.has(s.text)||(r=s.text),u=Boolean(e.isApiErrorMessage)}yield{type:"result",subtype:"success",is_error:u,duration_ms:Date.now()-De,duration_api_ms:g(),num_turns:ze,result:r,stop_reason:es,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,structured_output:Je,fast_mode_state:T(qe,Ue.fastMode),uuid:o()}}catch(e){is=e}if(null!==is){const e=is,s="TimeoutError"===e?.name||e?.message?.toLowerCase().includes("timeout")||e?.message?.toLowerCase().includes("timed out"),t=ie(e)?"cancelled":s?"timeout":"error";return os?.emitError(e?.message||String(e),t),emitCoreTerminalFailure(t),ve&&(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X(),void(yield{type:"result",subtype:"error_during_execution",duration_ms:Date.now()-De,duration_api_ms:g(),is_error:!0,num_turns:ze,stop_reason:es,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,fast_mode_state:T(qe,Ue.fastMode),uuid:o(),errors:[e?.message||String(e)]})}var as,rs;as=isApiError,rs=textResult,os?.emitResult(as,es,rs),os?.emitSessionState(as?"failed":"completed")}interrupt(){this.abortController.abort()}getMessages(){return this.mutableMessages}getReadFileState(){return this.readFileState}getSessionId(){return a()}setModel(e){this.config.userSpecifiedModel=e}}export async function*ask({commands:s,prompt:t,promptUuid:o,isMeta:i,cwd:a,tools:r,mcpClients:n,verbose:m=!1,thinkingConfig:l,maxTurns:u,maxBudgetUsd:p,taskBudget:d,canUseTool:c,mutableMessages:_=[],getReadFileCache:g,setReadFileCache:y,customSystemPrompt:h,appendSystemPrompt:f,userSpecifiedModel:S,fallbackModel:C,jsonSchema:E,getAppState:b,setAppState:M,abortController:O,replayUserMessages:v=!1,includePartialMessages:D=!1,handleElicitation:U,agents:T=[],setSDKStatus:R,orphanedPermission:A,onCoreQueryEvent:x}){const w=new QueryEngine({cwd:a,tools:r,commands:s,mcpClients:n,agents:T,canUseTool:c,getAppState:b,setAppState:M,initialMessages:_,readFileCache:j(g()),customSystemPrompt:h,appendSystemPrompt:f,userSpecifiedModel:S,fallbackModel:C,thinkingConfig:l,maxTurns:u,maxBudgetUsd:p,taskBudget:d,jsonSchema:E,verbose:m,handleElicitation:U,replayUserMessages:v,includePartialMessages:D,setSDKStatus:R,abortController:O,orphanedPermission:A,onCoreQueryEvent:x,...e("HISTORY_SNIP")?{snipReplay:(e,s)=>{if(ne.isSnipBoundaryMessage(e))return re.snipCompactIfNeeded(s,{force:!0})}}:{}});try{yield*w.submitMessage(t,{uuid:o,isMeta:i})}finally{y(w.getReadFileState())}}
|
|
1
|
+
import{feature as e}from"./recovery/bunBundleShim.js";import{createRequire as s}from"module";const t=s(import.meta.url);import{randomUUID as o}from"crypto";import i from"lodash-es/last.js";import{getSessionId as a,isSessionPersistenceDisabled as r}from"./bootstrap/state.js";import{accumulateUsage as n,updateUsage as m}from"./services/api/claude.js";import{EMPTY_USAGE as l}from"./services/api/logging.js";import u from"strip-ansi";import{getSlashCommandToolSkills as p}from"./commands.js";import{LOCAL_COMMAND_STDERR_TAG as d,LOCAL_COMMAND_STDOUT_TAG as c}from"./constants/xml.js";import{getModelUsage as _,getTotalAPIDuration as g,getTotalCost as y}from"./cost-tracker.js";import{loadMemoryPrompt as h}from"./memdir/memdir.js";import{hasAutoMemPathOverride as f}from"./memdir/paths.js";import{query as S}from"./query.js";import{categorizeRetryableAPIError as C}from"./services/api/errors.js";import{toolMatchesName as E}from"./Tool.js";import{SYNTHETIC_OUTPUT_TOOL_NAME as b}from"./tools/SyntheticOutputTool/SyntheticOutputTool.js";import{createAbortController as M}from"./utils/abortController.js";import{getGlobalConfig as O}from"./utils/config.js";import{getCwd as v}from"./utils/cwd.js";import{isBareMode as D,isEnvTruthy as U}from"./utils/envUtils.js";import{getFastModeState as T}from"./utils/fastMode.js";import{fileHistoryEnabled as R,fileHistoryMakeSnapshot as A}from"./utils/fileHistory.js";import{cloneFileStateCache as j}from"./utils/fileStateCache.js";import{headlessProfilerCheckpoint as w}from"./utils/headlessProfiler.js";import{registerStructuredOutputEnforcement as x}from"./utils/hooks/hookHelpers.js";import{getInMemoryErrors as P}from"./utils/log.js";import{countToolCalls as I,SYNTHETIC_MESSAGES as k}from"./utils/messages.js";import{getMainLoopModel as L,parseUserSpecifiedModel as F}from"./utils/model/model.js";import{loadAllPluginsCacheOnly as N}from"./utils/plugins/pluginLoader.js";import{processUserInput as H}from"./utils/processUserInput/processUserInput.js";import{fetchSystemPromptParts as K}from"./utils/queryContext.js";import{setCwd as W}from"./utils/Shell.js";import{flushSessionStorage as X,recordTranscript as G}from"./utils/sessionStorage.js";import{asSystemPrompt as B}from"./utils/systemPromptType.js";import{resolveThemeSetting as $}from"./utils/systemTheme.js";import{shouldEnableThinkingByDefault as q}from"./utils/thinking.js";import{CoreQueryRuntimeEmitter as Q}from"./core/query/runtime.js";const messageSelector=()=>t("./components/MessageSelector.js");import{localCommandOutputToSDKAssistantMessage as Y,toSDKCompactMetadata as J}from"./utils/messages/mappers.js";import{buildSystemInitMessage as V,sdkCompatToolName as z}from"./utils/messages/systemInit.js";import{getScratchpadDir as Z,isScratchpadEnabled as ee}from"./utils/permissions/filesystem.js";import{handleOrphanedPermission as se,isResultSuccessful as te,normalizeMessage as oe}from"./utils/queryHelpers.js";import{isAbortError as ie}from"./utils/errors.js";const ae=e("COORDINATOR_MODE")?t("./coordinator/coordinatorMode.js").getCoordinatorUserContext:()=>({}),re=e("HISTORY_SNIP")?t("./services/compact/snipCompact.js"):null,ne=e("HISTORY_SNIP")?t("./services/compact/snipProjection.js"):null;export class QueryEngine{config;mutableMessages;abortController;permissionDenials;totalUsage;hasHandledOrphanedPermission=!1;readFileState;discoveredSkillNames=new Set;loadedNestedMemoryPaths=new Set;constructor(e){this.config=e,this.mutableMessages=e.initialMessages??[],this.abortController=e.abortController??M(),this.permissionDenials=[],this.readFileState=e.readFileCache,this.totalUsage=l}async*submitMessage(e,s){const{cwd:t,commands:M,tools:j,mcpClients:re,verbose:ne=!1,thinkingConfig:me,maxTurns:le,maxBudgetUsd:ue,taskBudget:pe,canUseTool:de,customSystemPrompt:ce,appendSystemPrompt:_e,userSpecifiedModel:ge,fallbackModel:ye,jsonSchema:he,getAppState:fe,setAppState:Se,replayUserMessages:Ce=!1,includePartialMessages:Ee=!1,agents:be=[],setSDKStatus:Me,orphanedPermission:Oe}=this.config;this.discoveredSkillNames.clear(),W(t);const ve=!r(),De=Date.now(),wrappedCanUseTool=async(e,s,t,o,i,a)=>{const r=await de(e,s,t,o,i,a);return"allow"!==r.behavior&&this.permissionDenials.push({tool_name:z(e.name),tool_use_id:i,tool_input:s}),r},Ue=fe(),Te=ge?F(ge):L(),Re=me||(!1!==q()?{type:"adaptive"}:{type:"disabled"});w("before_getSystemPrompt");const Ae="string"==typeof ce?ce:void 0,{defaultSystemPrompt:je,userContext:we,systemContext:xe}=await K({tools:j,mainLoopModel:Te,additionalWorkingDirectories:Array.from(Ue.toolPermissionContext.additionalWorkingDirectories.keys()),mcpClients:re,customSystemPrompt:Ae});w("after_getSystemPrompt");const Pe={...we,...ae(re,ee()?Z():void 0)},Ie=void 0!==Ae&&f()?await h():null,ke=B([...void 0!==Ae?[Ae]:je,...Ie?[Ie]:[],..._e?[_e]:[]]),Le=j.some(e=>E(e,b));he&&Le&&x(Se,a());let Fe={messages:this.mutableMessages,setMessages:e=>{this.mutableMessages=e(this.mutableMessages)},onChangeAPIKey:()=>{},handleElicitation:this.config.handleElicitation,options:{commands:M,debug:!1,tools:j,verbose:ne,mainLoopModel:Te,thinkingConfig:Re,mcpClients:re,mcpResources:{},ideInstallationStatus:null,isNonInteractiveSession:!0,customSystemPrompt:ce,appendSystemPrompt:_e,agentDefinitions:{activeAgents:be,allAgents:[]},theme:$(O().theme),maxBudgetUsd:ue},getAppState:fe,setAppState:Se,abortController:this.abortController,readFileState:this.readFileState,nestedMemoryAttachmentTriggers:new Set,loadedNestedMemoryPaths:this.loadedNestedMemoryPaths,dynamicSkillDirTriggers:new Set,discoveredSkillNames:this.discoveredSkillNames,setInProgressToolUseIDs:()=>{},setResponseLength:()=>{},updateFileHistoryState:e=>{Se(s=>{const t=e(s.fileHistory);return t===s.fileHistory?s:{...s,fileHistory:t}})},updateAttributionState:e=>{Se(s=>{const t=e(s.attribution);return t===s.attribution?s:{...s,attribution:t}})},setSDKStatus:Me};if(Oe&&!this.hasHandledOrphanedPermission){this.hasHandledOrphanedPermission=!0;for await(const e of se(Oe,j,this.mutableMessages,Fe))yield e}const{messages:Ne,shouldQuery:He,allowedTools:Ke,model:We,resultText:Xe}=await H({input:e,mode:"prompt",setToolJSX:()=>{},context:{...Fe,messages:this.mutableMessages},messages:this.mutableMessages,uuid:s?.uuid,isMeta:s?.isMeta,querySource:"sdk"});this.mutableMessages.push(...Ne);const Ge=[...this.mutableMessages];if(ve&&Ne.length>0){const e=G(Ge);D()||(await e,(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X())}const Be=Ne.filter(e=>"user"===e.type&&!e.isMeta&&!e.toolUseResult&&messageSelector().selectableUserMessagesFilter(e)||"system"===e.type&&"compact_boundary"===e.subtype),$e=Ce?Be:[];Se(e=>({...e,toolPermissionContext:{...e.toolPermissionContext,alwaysAllowRules:{...e.toolPermissionContext.alwaysAllowRules,command:Ke}}}));const qe=We??Te;Fe={messages:Ge,setMessages:()=>{},onChangeAPIKey:()=>{},handleElicitation:this.config.handleElicitation,options:{commands:M,debug:!1,tools:j,verbose:ne,mainLoopModel:qe,thinkingConfig:Re,mcpClients:re,mcpResources:{},ideInstallationStatus:null,isNonInteractiveSession:!0,customSystemPrompt:ce,appendSystemPrompt:_e,theme:$(O().theme),agentDefinitions:{activeAgents:be,allAgents:[]},maxBudgetUsd:ue},getAppState:fe,setAppState:Se,abortController:this.abortController,readFileState:this.readFileState,nestedMemoryAttachmentTriggers:new Set,loadedNestedMemoryPaths:this.loadedNestedMemoryPaths,dynamicSkillDirTriggers:new Set,discoveredSkillNames:this.discoveredSkillNames,setInProgressToolUseIDs:()=>{},setResponseLength:()=>{},updateFileHistoryState:Fe.updateFileHistoryState,updateAttributionState:Fe.updateAttributionState,setSDKStatus:Me},w("before_skills_plugins");const[Qe,{enabled:Ye}]=await Promise.all([p(v()),N()]);if(w("after_skills_plugins"),yield V({tools:j,mcpClients:re,model:qe,permissionMode:Ue.toolPermissionContext.mode,commands:M,agents:be,skills:Qe,plugins:Ye,fastMode:Ue.fastMode}),w("system_message_yielded"),!He){for(const e of Ne)"user"===e.type&&"string"==typeof e.message.content&&(e.message.content.includes(`<${c}>`)||e.message.content.includes(`<${d}>`)||e.isCompactSummary)&&(yield{type:"user",message:{...e.message,content:u(e.message.content)},session_id:a(),parent_tool_use_id:null,uuid:e.uuid,timestamp:e.timestamp,isReplay:!e.isCompactSummary,isSynthetic:e.isMeta||e.isVisibleInTranscriptOnly}),"system"===e.type&&"local_command"===e.subtype&&"string"==typeof e.content&&(e.content.includes(`<${c}>`)||e.content.includes(`<${d}>`))&&(yield Y(e.content,e.uuid)),"system"===e.type&&"compact_boundary"===e.subtype&&(yield{type:"system",subtype:"compact_boundary",session_id:a(),uuid:e.uuid,compact_metadata:J(e.compactMetadata)});return ve&&(await G(Ge),(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X()),void(yield{type:"result",subtype:"success",is_error:!1,duration_ms:Date.now()-De,duration_api_ms:g(),num_turns:Ge.length-1,result:Xe??"",stop_reason:null,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,fast_mode_state:T(qe,Ue.fastMode),uuid:o()})}R()&&ve&&Ne.filter(messageSelector().selectableUserMessagesFilter).forEach(e=>{A(e=>{Se(s=>({...s,fileHistory:e(s.fileHistory)}))},e.uuid)});let Je,Ve=l,ze=1,Ze=!1,es=null;const ss=P().at(-1),ts=he?I(this.mutableMessages,b):0,os="0"!==process.env.CORE_QUERY_ENABLED?new Q(this.config.onCoreQueryEvent):null;os?.emitSessionState("started");const emitCoreTerminalFailure=e=>{os?.emitResult(!0,es),os?.emitSessionState("cancelled"===e||"canceled"===e?"cancelled":"failed",e)};let is=null,as="",rs=!1;try{for await(const e of S({messages:Ge,systemPrompt:ke,userContext:Pe,systemContext:xe,canUseTool:wrappedCanUseTool,toolUseContext:Fe,fallbackModel:ye,querySource:"sdk",maxTurns:le,taskBudget:pe})){if(os?.emitRunning(),"assistant"===e.type||"user"===e.type||"system"===e.type&&"compact_boundary"===e.subtype){if(ve&&"system"===e.type&&"compact_boundary"===e.subtype){const s=e.compactMetadata?.preservedSegment?.tailUuid;if(s){const e=this.mutableMessages.findLastIndex(e=>e.uuid===s);-1!==e&&await G(this.mutableMessages.slice(0,e+1))}}if(Ge.push(e),ve&&("assistant"===e.type?G(Ge):await G(Ge)),!Ze&&$e.length>0){Ze=!0;for(const e of $e)"user"===e.type&&(yield{type:"user",message:e.message,session_id:a(),parent_tool_use_id:null,uuid:e.uuid,timestamp:e.timestamp,isReplay:!0})}}switch("user"===e.type&&(ze++,os?.setTurn(ze)),os?.emitFromQueryMessage(e),e.type){case"tombstone":case"stream_request_start":break;case"assistant":null!=e.message.stop_reason&&(es=e.message.stop_reason),this.mutableMessages.push(e),yield*oe(e);break;case"progress":this.mutableMessages.push(e),ve&&(Ge.push(e),G(Ge)),yield*oe(e);break;case"user":this.mutableMessages.push(e),yield*oe(e);break;case"stream_event":"message_start"===e.event.type&&(Ve=l,Ve=m(Ve,e.event.message.usage)),"message_delta"===e.event.type&&(Ve=m(Ve,e.event.usage),null!=e.event.delta.stop_reason&&(es=e.event.delta.stop_reason)),"message_stop"===e.event.type&&(this.totalUsage=n(this.totalUsage,Ve)),Ee&&(yield{type:"stream_event",event:e.event,session_id:a(),parent_tool_use_id:null,uuid:o()});break;case"attachment":if(this.mutableMessages.push(e),ve&&(Ge.push(e),G(Ge)),"structured_output"===e.attachment.type)Je=e.attachment.data;else{if("max_turns_reached"===e.attachment.type)return ve&&(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X(),yield{type:"result",subtype:"error_max_turns",duration_ms:Date.now()-De,duration_api_ms:g(),is_error:!0,num_turns:e.attachment.turnCount,stop_reason:es,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,fast_mode_state:T(qe,Ue.fastMode),uuid:o(),errors:[`Reached maximum number of turns (${e.attachment.maxTurns})`]},void emitCoreTerminalFailure("error_max_turns");Ce&&"queued_command"===e.attachment.type&&(yield{type:"user",message:{role:"user",content:e.attachment.prompt},session_id:a(),parent_tool_use_id:null,uuid:e.attachment.source_uuid||e.uuid,timestamp:e.timestamp,isReplay:!0})}break;case"system":{const s=this.config.snipReplay?.(e,this.mutableMessages);if(void 0!==s){s.executed&&(this.mutableMessages.length=0,this.mutableMessages.push(...s.messages));break}if(this.mutableMessages.push(e),"compact_boundary"===e.subtype&&e.compactMetadata){const s=this.mutableMessages.length-1;s>0&&this.mutableMessages.splice(0,s);const t=Ge.length-1;t>0&&Ge.splice(0,t),yield{type:"system",subtype:"compact_boundary",session_id:a(),uuid:e.uuid,compact_metadata:J(e.compactMetadata)}}"api_error"===e.subtype&&(yield{type:"system",subtype:"api_retry",attempt:e.retryAttempt,max_retries:e.maxRetries,retry_delay_ms:e.retryInMs,error_status:e.error.status??null,error:C(e.error),session_id:a(),uuid:e.uuid});break}case"tool_use_summary":yield{type:"tool_use_summary",summary:e.summary,preceding_tool_use_ids:e.precedingToolUseIds,session_id:a(),uuid:e.uuid}}if(void 0!==ue&&y()>=ue)return ve&&(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X(),yield{type:"result",subtype:"error_max_budget_usd",duration_ms:Date.now()-De,duration_api_ms:g(),is_error:!0,num_turns:ze,stop_reason:es,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,fast_mode_state:T(qe,Ue.fastMode),uuid:o(),errors:[`Reached maximum budget ($${ue})`]},void emitCoreTerminalFailure("error_max_budget_usd");if("user"===e.type&&he){const e=I(this.mutableMessages,b)-ts,s=parseInt(process.env.MAX_STRUCTURED_OUTPUT_RETRIES||"5",10);if(e>=s)return ve&&(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X(),yield{type:"result",subtype:"error_max_structured_output_retries",duration_ms:Date.now()-De,duration_api_ms:g(),is_error:!0,num_turns:ze,stop_reason:es,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,fast_mode_state:T(qe,Ue.fastMode),uuid:o(),errors:[`Failed to provide valid structured output after ${s} attempts`]},void emitCoreTerminalFailure("error_max_structured_output_retries")}}const e=Ge.findLast(e=>"assistant"===e.type||"user"===e.type),s=e?.type??"undefined",t="assistant"===e?.type?i(e.message.content)?.type??"none":"n/a";if(ve&&(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X(),!te(e,es))return yield{type:"result",subtype:"error_during_execution",duration_ms:Date.now()-De,duration_api_ms:g(),is_error:!0,num_turns:ze,stop_reason:es,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,fast_mode_state:T(qe,Ue.fastMode),uuid:o(),errors:(()=>{const e=P(),o=ss?e.lastIndexOf(ss)+1:0;return[`[ede_diagnostic] result_type=${s} last_content_type=${t} stop_reason=${es}`,...e.slice(o).map(e=>e.error)]})()},void emitCoreTerminalFailure("error_during_execution");if(as="",rs=!1,"assistant"===e.type){const s=i(e.message.content);"text"!==s?.type||k.has(s.text)||(as=s.text),rs=Boolean(e.isApiErrorMessage)}yield{type:"result",subtype:"success",is_error:rs,duration_ms:Date.now()-De,duration_api_ms:g(),num_turns:ze,result:as,stop_reason:es,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,structured_output:Je,fast_mode_state:T(qe,Ue.fastMode),uuid:o()}}catch(e){is=e}if(null!==is){const e=is,s="TimeoutError"===e?.name||e?.message?.toLowerCase().includes("timeout")||e?.message?.toLowerCase().includes("timed out"),t=ie(e)?"cancelled":s?"timeout":"error";return os?.emitError(e?.message||String(e),t),emitCoreTerminalFailure(t),ve&&(U(process.env.CONTEXT_CODE_EAGER_FLUSH)||U(process.env.CLAUDE_CODE_EAGER_FLUSH)||U(process.env.CONTEXT_CODE_IS_COWORK)||U(process.env.CLAUDE_CODE_IS_COWORK))&&await X(),void(yield{type:"result",subtype:"error_during_execution",duration_ms:Date.now()-De,duration_api_ms:g(),is_error:!0,num_turns:ze,stop_reason:es,session_id:a(),total_cost_usd:y(),usage:this.totalUsage,modelUsage:_(),permission_denials:this.permissionDenials,fast_mode_state:T(qe,Ue.fastMode),uuid:o(),errors:[e?.message||String(e)]})}var ns,ms;ns=rs,ms=as,os?.emitResult(ns,es,ms),os?.emitSessionState(ns?"failed":"completed")}interrupt(){this.abortController.abort()}getMessages(){return this.mutableMessages}getReadFileState(){return this.readFileState}getSessionId(){return a()}setModel(e){this.config.userSpecifiedModel=e}}export async function*ask({commands:s,prompt:t,promptUuid:o,isMeta:i,cwd:a,tools:r,mcpClients:n,verbose:m=!1,thinkingConfig:l,maxTurns:u,maxBudgetUsd:p,taskBudget:d,canUseTool:c,mutableMessages:_=[],getReadFileCache:g,setReadFileCache:y,customSystemPrompt:h,appendSystemPrompt:f,userSpecifiedModel:S,fallbackModel:C,jsonSchema:E,getAppState:b,setAppState:M,abortController:O,replayUserMessages:v=!1,includePartialMessages:D=!1,handleElicitation:U,agents:T=[],setSDKStatus:R,orphanedPermission:A,onCoreQueryEvent:w}){const x=new QueryEngine({cwd:a,tools:r,commands:s,mcpClients:n,agents:T,canUseTool:c,getAppState:b,setAppState:M,initialMessages:_,readFileCache:j(g()),customSystemPrompt:h,appendSystemPrompt:f,userSpecifiedModel:S,fallbackModel:C,thinkingConfig:l,maxTurns:u,maxBudgetUsd:p,taskBudget:d,jsonSchema:E,verbose:m,handleElicitation:U,replayUserMessages:v,includePartialMessages:D,setSDKStatus:R,abortController:O,orphanedPermission:A,onCoreQueryEvent:w,...e("HISTORY_SNIP")?{snipReplay:(e,s)=>{if(ne.isSnipBoundaryMessage(e))return re.snipCompactIfNeeded(s,{force:!0})}}:{}});try{yield*x.submitMessage(t,{uuid:o,isMeta:i})}finally{y(x.getReadFileState())}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{clearAuthRelatedCaches as e,performLogout as o}from"../../commands/logout/logout.js";import{setMainLoopModelOverride as i}from"../../bootstrap/state.js";import{getSecureStorage as t}from"../../utils/secureStorage/index.js";import{logEvent as r}from"../../services/analytics/index.js";import{getSSLErrorHint as s}from"../../services/api/errorUtils.js";import{fetchAndStoreClaudeCodeFirstTokenDate as a}from"../../services/api/firstTokenDate.js";import{createAndStoreApiKey as n,fetchAndStoreUserRoles as c,refreshOAuthToken as l,shouldUseClaudeAIAuth as
|
|
1
|
+
import{clearAuthRelatedCaches as e,performLogout as o}from"../../commands/logout/logout.js";import{setMainLoopModelOverride as i}from"../../bootstrap/state.js";import{getSecureStorage as t}from"../../utils/secureStorage/index.js";import{logEvent as r}from"../../services/analytics/index.js";import{getSSLErrorHint as s}from"../../services/api/errorUtils.js";import{fetchAndStoreClaudeCodeFirstTokenDate as a}from"../../services/api/firstTokenDate.js";import{createAndStoreApiKey as n,fetchAndStoreUserRoles as c,refreshOAuthToken as l,shouldUseClaudeAIAuth as p,storeOAuthAccountInfo as u}from"../../services/oauth/client.js";import{getOauthProfileFromOauthToken as d}from"../../services/oauth/getOauthProfile.js";import{OAuthService as m}from"../../services/oauth/index.js";import{startGeminiCliOAuthFlow as g}from"../../services/oauth/geminiCli.js";import{clearOAuthTokenCache as f,getAnthropicApiKeyWithSource as h,getAuthTokenSource as v,getClaudeAIOAuthTokens as w,getOpenAIOAuthTokens as _,getOauthAccountInfo as x,removeApiKey as A,saveOpenAIOAuthTokens as O,saveGeminiGoogleOAuthTokens as E,saveProviderApiKey as y,getSubscriptionType as C,isUsing3PServices as b,saveOAuthTokensIfNeeded as j,validateForceLoginOrg as T,removeProviderScopedCredentials as P,removeProviderApiKey as k}from"../../utils/auth.js";import{saveGlobalConfig as U}from"../../utils/config.js";import{logForDebugging as S}from"../../utils/debug.js";import{isRunningOnHomespace as $}from"../../utils/envUtils.js";import{errorMessage as I}from"../../utils/errors.js";import{logError as z}from"../../utils/log.js";import{getAPIProvider as H}from"../../utils/model/providers.js";import{setStoredActiveProviderPreference as L}from"../../utils/model/providerProfilesDb.js";import{isProfiledProvider as D,setActiveProfileForProvider as N}from"../../utils/model/providerProfiles.js";import{getLastUsedProviderProfile as R,removeProviderProfile as K}from"../../utils/model/providerProfiles.js";import{clearProviderBaseUrl as W,setProviderBaseUrl as B}from"../../utils/model/providerBaseUrls.js";import{getInitialSettings as F}from"../../utils/settings/settings.js";import{jsonStringify as M}from"../../utils/slowOperations.js";import{buildAccountProperties as X,buildAPIProviderProperties as Y}from"../../utils/status.js";export async function installOAuthTokens(o,s="anthropic",l){if(l||await async function(e){const{flushTelemetry:o}=await import("../../utils/telemetry/instrumentation.js");if(await o(),"openai"===e)return void _.cache?.clear?.();await A();const i=t(),r=i.read();if(r){const e=Object.fromEntries(Object.entries(r.providerProfileOauth??{}).filter(([e])=>!e.startsWith("claude/"))),{claudeAiOauth:o,...t}=r,s={...t,providerProfileOauth:e};Object.keys(s).length>0?i.update(s):i.delete()}w.cache?.clear?.(),U(e=>({...e,oauthAccount:void 0}))}(s),"anthropic"===s){const e=o.profile??await d(o.accessToken);e?u({accountUuid:e.account.uuid,emailAddress:e.account.email,organizationUuid:e.organization.uuid,displayName:e.account.display_name||void 0,hasExtraUsageEnabled:e.organization.has_extra_usage_enabled??void 0,billingType:e.organization.billing_type??void 0,subscriptionCreatedAt:e.organization.subscription_created_at??void 0,accountCreatedAt:e.account.created_at}):o.tokenAccount&&u({accountUuid:o.tokenAccount.uuid,emailAddress:o.tokenAccount.emailAddress,organizationUuid:o.tokenAccount.organizationUuid})}const m="openai"===s?O(o,l):j(o,l);if(f(),m.warning&&r("tengu_oauth_storage_warning",{warning:m.warning}),"anthropic"===s&&await c(o.accessToken).catch(e=>S(String(e),{level:"error"})),"anthropic"===s&&p(o.scopes))await a().catch(e=>S(String(e),{level:"error"}));else if("anthropic"===s){if(!await n(o.accessToken))throw new Error("No se pudo crear la API key. El servidor aceptó la solicitud pero no devolvió una clave.")}L("openai"===s?"openai":"claude"),i(void 0),await e()}export async function authLogin({email:e,sso:o,console:i,claudeai:t,provider:a}){i&&t&&(process.stderr.write("Error: --console and --claudeai cannot be used together.\n"),process.exit(1));const n=F(),c=n.forceLoginMethod?"claudeai"===n.forceLoginMethod:!i,u=n.forceLoginOrgUUID,d=a?.trim().toLowerCase(),f=process.env.CONTEXT_CODE_OAUTH_REFRESH_TOKEN??process.env.CLAUDE_CODE_OAUTH_REFRESH_TOKEN;if(f){const e=process.env.CONTEXT_CODE_OAUTH_SCOPES??process.env.CLAUDE_CODE_OAUTH_SCOPES;e||(process.stderr.write('CONTEXT_CODE_OAUTH_SCOPES (legacy: CLAUDE_CODE_OAUTH_SCOPES) is required when using CONTEXT_CODE_OAUTH_REFRESH_TOKEN.\nSet it to the space-separated scopes the refresh token was issued with\n(e.g. "user:inference" or "user:profile user:inference user:sessions:claude_code user:mcp_servers").\n'),process.exit(1));const o=e.split(/\s+/).filter(Boolean);try{r("tengu_login_from_refresh_token",{});const e=await l(f,{scopes:o});await installOAuthTokens(e);const i=await T();i.valid||(process.stderr.write(i.message+"\n"),process.exit(1)),U(e=>e.hasCompletedOnboarding?e:{...e,hasCompletedOnboarding:!0}),r("tengu_oauth_success",{loginWithClaudeAi:p(e.scopes)}),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0)}catch(e){z(e);const o=s(e);process.stderr.write(`Error al iniciar sesión: ${I(e)}\n${o?o+"\n":""}`),process.exit(1)}}const h=o?"sso":void 0,v=new m;try{if(r("tengu_oauth_flow_start",{loginWithClaudeAi:c}),"gemini-google"===d){const e=await g();E(e),L("gemini-google"),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0)}const o="openai"===d?"openai":"anthropic",i="openai"!==o&&c,t=await v.startOAuthFlow(async e=>{process.stdout.write("Abriendo el navegador para iniciar sesión…\n"),process.stdout.write(`Si el navegador no se abre, visita: ${e}\n`)},{loginWithClaudeAi:i,provider:o,loginHint:e,loginMethod:h,orgUUID:u});if(await installOAuthTokens(t,o),"anthropic"===o){const e=await T();e.valid||(process.stderr.write(e.message+"\n"),process.exit(1))}r("tengu_oauth_success",{loginWithClaudeAi:i}),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0)}catch(e){z(e);const o=s(e);process.stderr.write(`Error al iniciar sesión: ${I(e)}\n${o?o+"\n":""}`),process.exit(1)}finally{v.cleanup()}}export async function authStatus(e){const{source:o,hasToken:i}=v(),{source:t}=h(),r=!!process.env.ANTHROPIC_API_KEY&&!$(),s=H(),a=x(),n=C(),c=b(),l=i||"none"!==t||r||c;let p="none";if("openai"===s?p="openai":c?p="third_party":"claude.ai"===o?p="claude.ai":"apiKeyHelper"===o?p="api_key_helper":"none"!==o?p="oauth_token":"ANTHROPIC_API_KEY"===t||r?p="api_key":"/login managed key"===t&&(p="claude.ai"),e.text){const e=[...X(),...Y()];let o=!1;for(const i of e){const e="string"==typeof i.value?i.value:Array.isArray(i.value)?i.value.join(", "):null;null!==e&&"none"!==e&&(o=!0,i.label?process.stdout.write(`${i.label}: ${e}\n`):process.stdout.write(`${e}\n`))}!o&&r&&process.stdout.write("API key: ANTHROPIC_API_KEY\n"),l||process.stdout.write("openai"===s?"Sesión no iniciada. Ejecuta context auth login para autenticarte con OpenAI / Codex.\n":"Sesión no iniciada. Ejecuta context auth login para autenticarte.\n")}else{const e="none"!==t?t:r?"ANTHROPIC_API_KEY":null,o={loggedIn:l,authMethod:p,apiProvider:s};e&&(o.apiKeySource=e),"claude.ai"===p&&(o.email=a?.emailAddress??null,o.orgId=a?.organizationUuid??null,o.orgName=a?.organizationName??null,o.subscriptionType=n??null),process.stdout.write(M(o,null,2)+"\n")}process.exit(l?0:1)}export async function authLogout(){try{await o({clearOnboarding:!1})}catch{process.stderr.write("Error al cerrar sesión.\n"),process.exit(1)}process.stdout.write(`Sesión cerrada exitosamente de tu cuenta ${function(){const e=H();return"openai"===e?"OpenAI / Codex":"bedrock"===e?"AWS Bedrock":"vertex"===e?"Google Vertex AI":"foundry"===e?"Microsoft Foundry":"Anthropic"}()}.\n`),process.exit(0)}export async function authProviderApiKey(e){const o=e.provider.trim().toLowerCase(),i=["openrouter","ollama-cloud","gemini-api","zai","minimax","nvidia","deepseek","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi","openai"];i.includes(o)||(process.stderr.write(`Provider no soportado para API key: ${o}. Soportados: ${i.join(", ")}\n`),process.exit(1));const t=e.profile?.trim();t&&D(o)&&N(o,t),await y(o,e.apiKey),L(o),process.stdout.write(`API key guardada para ${o}${t?` (perfil ${t})`:""}.\n`),process.exit(0)}export async function authProviderBaseUrl(e){const o=e.provider.trim().toLowerCase(),i=["ollama","ollama-cloud","openrouter","gemini-google","zai","minimax","nvidia","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"];i.includes(o)||(process.stderr.write(`Provider no soportado para base URL: ${o}. Soportados: ${i.join(", ")}\n`),process.exit(1));const t=e.profile?.trim();t&&D(o)&&N(o,t);const r=B(o,e.baseUrl);L(o),process.stdout.write(`Base URL guardada para ${o}: ${r}${t?` (perfil ${t})`:""}.\n`),process.exit(0)}export async function authSetProviderPreference(e){const o=e.provider.trim().toLowerCase();L(o),process.stdout.write(`Provider activo establecido a ${o}.\n`),process.exit(0)}export async function authProviderRemove(e){const o=e.provider.trim().toLowerCase();o||(process.stderr.write("Debes indicar un provider.\n"),process.exit(1));const i=o,t=e.profile?.trim();let r=null;if(D(i)){const e=t||R(i)?.name;if(e){const o=K(i,e);o&&(await P(o.id),r=`${o.provider}/${o.name}`)}}["openrouter","ollama-cloud","gemini-api","zai","minimax","nvidia","deepseek","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi","openai"].includes(o)&&await k(o);["ollama","ollama-cloud","openrouter","gemini-google","zai","minimax","nvidia","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"].includes(o)&&W(o),process.stdout.write(r?`Proveedor eliminado: ${r}.\n`:`Credenciales/base URL limpiadas para ${o}.\n`),process.exit(0)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{fetchProviderModels as e}from"../../utils/model/providerModels.js";import{VISIBLE_PROVIDERS as
|
|
1
|
+
import{fetchProviderModels as e}from"../../utils/model/providerModels.js";import{VISIBLE_PROVIDERS as i}from"../../utils/model/providerCatalog.js";import{getAPIProvider as o}from"../../utils/model/providers.js";const r=[{id:"claude-opus-4-7",label:"Opus 4.7",description:"Mas capaz, ideal para tareas complejas."},{id:"claude-sonnet-4-6",label:"Sonnet 4.6",description:"Balanceado, recomendado para uso general."},{id:"claude-haiku-4-5-20251001",label:"Haiku 4.5",description:"Rapido y economico."},{id:"opus",label:"opus (alias)",description:"Alias dinamico al Opus por defecto."},{id:"sonnet",label:"sonnet (alias)",description:"Alias dinamico al Sonnet por defecto."},{id:"haiku",label:"haiku (alias)",description:"Alias dinamico al Haiku por defecto."}],a={claude:"firstParty",openai:"openai",openrouter:"openrouter",ollama:"ollama","ollama-cloud":"ollama-cloud","gemini-api":"gemini-api","gemini-google":"gemini-google",zai:"zai",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",bedrock:"bedrock",vertex:"vertex",foundry:"foundry",firstparty:"firstParty",anthropic:"firstParty"};export async function modelListHandler(t){let n;if(t.provider){const e=function(e){if(!e)return null;const o=e.trim().toLowerCase();if(a[o])return a[o];const r=i.find(e=>e.label.toLowerCase()===o);if(r)return a[r.id]??null;const t=i.find(e=>e.label.toLowerCase().includes(o)||o.includes(e.id));return t?a[t.id]??null:null}(t.provider);e||(process.stderr.write(`Provider desconocido: ${t.provider}\n`),process.exit(2)),n=e}else n=o();let s=[],l=null;try{s=(await e(n)).map(e=>({id:e.value,label:e.label,description:e.description}))}catch(e){l=e instanceof Error?e.message:String(e)}if(0===s.length&&function(e){return"firstParty"===e||"bedrock"===e||"vertex"===e||"foundry"===e}(n)&&(s=r),t.json)process.stdout.write(JSON.stringify({provider:n,models:s,error:l})+"\n");else{process.stdout.write(`Modelos disponibles (${n}):\n`),0===s.length&&(process.stdout.write(" (sin modelos detectados)\n"),l&&process.stdout.write(` Error: ${l}\n`));for(const e of s)process.stdout.write(` ${e.id}${e.label&&e.label!==e.id?` - ${e.label}`:""}\n`),e.description&&process.stdout.write(` ${e.description}\n`)}process.exit(0)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{feature as e}from"../recovery/bunBundleShim.js";import{randomUUID as s}from"crypto";import{SDKControlElicitationResponseSchema as t}from"../entrypoints/sdk/controlSchemas.js";import{hookJSONOutputSchema as o}from"../types/hooks.js";import{logForDebugging as r}from"../utils/debug.js";import{logForDiagnosticsNoPII as n}from"../utils/diagLogs.js";import{AbortError as i}from"../utils/errors.js";import{permissionPromptToolResultToPermissionDecision as a,outputSchema as u}from"../utils/permissions/PermissionPromptToolResultSchema.js";import{hasPermissionsToUseTool as l}from"../utils/permissions/permissions.js";import{writeToStdout as c}from"../utils/process.js";import{jsonStringify as p}from"../utils/slowOperations.js";import{z as d}from"zod/v4";import{notifyCommandLifecycle as m}from"../utils/commandLifecycle.js";import{normalizeControlMessageKeys as h}from"../utils/controlMessageCompat.js";import{executePermissionRequestHooks as y}from"../utils/hooks.js";import{applyPermissionUpdates as _,persistPermissionUpdates as f}from"../utils/permissions/PermissionUpdate.js";import{notifySessionStateChanged as g}from"../utils/sessionState.js";import{jsonParse as q}from"../utils/slowOperations.js";import{Stream as v}from"../utils/stream.js";import{ndjsonSafeStringify as b}from"./ndjsonSafeStringify.js";export const SANDBOX_NETWORK_ACCESS_TOOL_NAME="SandboxNetworkAccess";function serializeDecisionReason(s){if(s){if((e("BASH_CLASSIFIER")||e("TRANSCRIPT_CLASSIFIER"))&&"classifier"===s.type)return s.reason;switch(s.type){case"rule":case"mode":case"subcommandResults":case"permissionPromptTool":return;case"hook":case"asyncAgent":case"sandboxOverride":case"workingDir":case"safetyCheck":case"other":return s.reason}}}export class StructuredIO{input;replayUserMessages;structuredInput;pendingRequests=new Map;restoredWorkerState=Promise.resolve(null);inputClosed=!1;unexpectedResponseCallback;resolvedToolUseIds=new Set;prependedLines=[];onControlRequestSent;onControlRequestResolved;outbound=new v;constructor(e,s){this.input=e,this.replayUserMessages=s,this.input=e,this.structuredInput=this.read()}trackResolvedToolUseId(e){if("can_use_tool"===e.request.subtype&&(this.resolvedToolUseIds.add(e.request.tool_use_id),this.resolvedToolUseIds.size>1e3)){const e=this.resolvedToolUseIds.values().next().value;void 0!==e&&this.resolvedToolUseIds.delete(e)}}flushInternalEvents(){return Promise.resolve()}get internalEventsPending(){return 0}prependUserMessage(e){this.prependedLines.push(p({type:"user",session_id:"",message:{role:"user",content:e},parent_tool_use_id:null})+"\n")}async*read(){let e="";const s=async function*(){for(;;){this.prependedLines.length>0&&(e=this.prependedLines.join("")+e,this.prependedLines=[]);const s=e.indexOf("\n");if(-1===s)break;const t=e.slice(0,s);e=e.slice(s+1);const o=await this.processLine(t);o&&(n("info","cli_stdin_message_parsed",{type:o.type}),yield o)}}.bind(this);yield*s();for await(const t of this.input)e+=t,yield*s();if(e){const s=await this.processLine(e);s&&(yield s)}this.inputClosed=!0;for(const e of this.pendingRequests.values())e.reject(new Error("Tool permission stream closed before response received"))}getPendingPermissionRequests(){return Array.from(this.pendingRequests.values()).map(e=>e.request).filter(e=>"can_use_tool"===e.request.subtype)}setUnexpectedResponseCallback(e){this.unexpectedResponseCallback=e}injectControlResponse(e){const s=e.response?.request_id;if(!s)return;const t=this.pendingRequests.get(s);if(t)if(this.trackResolvedToolUseId(t.request),this.pendingRequests.delete(s),this.write({type:"control_cancel_request",request_id:s}),"error"===e.response.subtype)t.reject(new Error(e.response.error));else{const s=e.response.response;if(t.schema)try{t.resolve(t.schema.parse(s))}catch(e){t.reject(e)}else t.resolve({})}}setOnControlRequestSent(e){this.onControlRequestSent=e}setOnControlRequestResolved(e){this.onControlRequestResolved=e}async processLine(e){if(e)try{const s=h(q(e));if("keep_alive"===s.type)return;if("update_environment_variables"===s.type){const e=Object.keys(s.variables);for(const[e,t]of Object.entries(s.variables))process.env[e]=t;return void r(`[structuredIO] applied update_environment_variables: ${e.join(", ")}`)}if("control_response"===s.type){const e="uuid"in s&&"string"==typeof s.uuid?s.uuid:void 0;e&&m(e,"completed");const t=this.pendingRequests.get(s.response.request_id);if(!t){const e="success"===s.response.subtype?s.response.response:void 0,t=e?.toolUseID;return"string"==typeof t&&this.resolvedToolUseIds.has(t)?void r(`Ignoring duplicate control_response for already-resolved toolUseID=${t} request_id=${s.response.request_id}`):void(this.unexpectedResponseCallback&&await this.unexpectedResponseCallback(s))}if(this.trackResolvedToolUseId(t.request),this.pendingRequests.delete(s.response.request_id),"can_use_tool"===t.request.request.subtype&&this.onControlRequestResolved&&this.onControlRequestResolved(s.response.request_id),"error"===s.response.subtype)return void t.reject(new Error(s.response.error));const o=s.response.response;if(t.schema)try{t.resolve(t.schema.parse(o))}catch(e){t.reject(e)}else t.resolve({});return this.replayUserMessages?s:void 0}return"user"!==s.type&&"control_request"!==s.type&&"assistant"!==s.type&&"system"!==s.type?void r(`Ignoring unknown message type: ${s.type}`,{level:"warn"}):"control_request"===s.type?(s.request||exitWithMessage("Error: Missing request on control_request"),s):("assistant"===s.type||"system"===s.type||"user"!==s.message.role&&exitWithMessage(`Error: Expected message role 'user', got '${s.message.role}'`),s)}catch(s){console.error(`Error parsing streaming input line: ${e}: ${s}`),process.exit(1)}}async write(e){c(b(e)+"\n")}async sendRequest(e,t,o,r=s()){const n={type:"control_request",request_id:r,request:e};if(this.inputClosed)throw new Error("Stream closed");if(o?.aborted)throw new Error("Request aborted");this.outbound.enqueue(n),"can_use_tool"===e.subtype&&this.onControlRequestSent&&this.onControlRequestSent(n);const aborted=()=>{this.outbound.enqueue({type:"control_cancel_request",request_id:r});const e=this.pendingRequests.get(r);e&&(this.trackResolvedToolUseId(e.request),e.reject(new i))};o&&o.addEventListener("abort",aborted,{once:!0});try{return await new Promise((s,o)=>{this.pendingRequests.set(r,{request:{type:"control_request",request_id:r,request:e},resolve:e=>{s(e)},reject:o,schema:t})})}finally{o&&o.removeEventListener("abort",aborted),this.pendingRequests.delete(r)}}createCanUseTool(e){return async(t,o,r,n,i,c)=>{const p=c??await l(t,o,r,n,i);if("allow"===p.behavior||"deny"===p.behavior)return p;const d=new AbortController,m=r.abortController.signal,onParentAbort=()=>d.abort();m.addEventListener("abort",onParentAbort,{once:!0});try{const n=async function(e,s,t,o,r){const n=o.getAppState(),i=n.toolPermissionContext.mode,a=y(e,s,t,o,i,r,o.abortController.signal);for await(const e of a)if(e.permissionRequestResult&&("allow"===e.permissionRequestResult.behavior||"deny"===e.permissionRequestResult.behavior)){const s=e.permissionRequestResult;if("allow"===s.behavior){const e=s.updatedInput||t,r=s.updatedPermissions??[];if(r.length>0){f(r);const e=o.getAppState(),s=_(e.toolPermissionContext,r);o.setAppState(e=>e.toolPermissionContext===s?e:{...e,toolPermissionContext:s})}return{behavior:"allow",updatedInput:e,userModified:!1,decisionReason:{type:"hook",hookName:"PermissionRequest"}}}return{behavior:"deny",message:s.message||"Permission denied by PermissionRequest hook",decisionReason:{type:"hook",hookName:"PermissionRequest"}}}return}(t.name,i,o,r,p.suggestions).then(e=>({source:"hook",decision:e})),l=s();e?.(function(e,s,t,o){let r;try{r=e.getActivityDescription?.(s)??e.getToolUseSummary?.(s)??e.userFacingName(s)}catch{r=e.name}return{tool_name:e.name,action_description:r,tool_use_id:t,request_id:o,input:s}}(t,o,i,l));const c=this.sendRequest({subtype:"can_use_tool",tool_name:t.name,input:o,permission_suggestions:p.suggestions,blocked_path:p.blockedPath,decision_reason:serializeDecisionReason(p.decisionReason),tool_use_id:i,agent_id:r.agentId},u(),d.signal,l).then(e=>({source:"sdk",result:e})),m=await Promise.race([n,c]);if("hook"===m.source){if(m.decision)return c.catch(()=>{}),d.abort(),m.decision;const e=await c;return a(e.result,t,o,r)}return a(m.result,t,o,r)}catch(e){return a({behavior:"deny",message:`Tool permission request failed: ${e}`,toolUseID:i},t,o,r)}finally{0===this.getPendingPermissionRequests().length&&g("running"),m.removeEventListener("abort",onParentAbort)}}}createHookCallback(e,s){return{type:"callback",timeout:s,callback:async(s,t,r)=>{try{return await this.sendRequest({subtype:"hook_callback",callback_id:e,input:s,tool_use_id:t||void 0},o(),r)}catch(s){return console.error(`Error in hook callback ${e}:`,s),{}}}}}async handleElicitation(e,s,o,r,n,i,a){try{return await this.sendRequest({subtype:"elicitation",mcp_server_name:e,message:s,mode:n,url:i,elicitation_id:a,requested_schema:o},t(),r)}catch{return{action:"cancel"}}}createSandboxAskCallback(){return async e=>{try{return"allow"===(await this.sendRequest({subtype:"can_use_tool",tool_name:"SandboxNetworkAccess",input:{host:e.host},tool_use_id:s(),description:`Allow network connection to ${e.host}?`},u())).behavior}catch{return!1}}}async sendMcpMessage(e,s){return(await this.sendRequest({subtype:"mcp_message",server_name:e,message:s},d.object({mcp_response:d.any()}))).mcp_response}}function exitWithMessage(e){console.error(e),process.exit(1)}
|
|
1
|
+
import{feature as e}from"../recovery/bunBundleShim.js";import{randomUUID as s}from"crypto";import{SDKControlElicitationResponseSchema as t}from"../entrypoints/sdk/controlSchemas.js";import{hookJSONOutputSchema as o}from"../types/hooks.js";import{logForDebugging as r}from"../utils/debug.js";import{logForDiagnosticsNoPII as n}from"../utils/diagLogs.js";import{AbortError as i}from"../utils/errors.js";import{permissionPromptToolResultToPermissionDecision as a,outputSchema as u}from"../utils/permissions/PermissionPromptToolResultSchema.js";import{hasPermissionsToUseTool as c}from"../utils/permissions/permissions.js";import{writeToStdout as l}from"../utils/process.js";import{jsonStringify as p}from"../utils/slowOperations.js";import{z as d}from"zod/v4";import{notifyCommandLifecycle as m}from"../utils/commandLifecycle.js";import{normalizeControlMessageKeys as h}from"../utils/controlMessageCompat.js";import{executePermissionRequestHooks as y}from"../utils/hooks.js";import{applyPermissionUpdates as f,persistPermissionUpdates as g}from"../utils/permissions/PermissionUpdate.js";import{notifySessionStateChanged as _}from"../utils/sessionState.js";import{jsonParse as b}from"../utils/slowOperations.js";import{Stream as v}from"../utils/stream.js";import{ndjsonSafeStringify as q}from"./ndjsonSafeStringify.js";import*as R from"../webapp/server.js";export const SANDBOX_NETWORK_ACCESS_TOOL_NAME="SandboxNetworkAccess";function serializeDecisionReason(s){if(s){if((e("BASH_CLASSIFIER")||e("TRANSCRIPT_CLASSIFIER"))&&"classifier"===s.type)return s.reason;switch(s.type){case"rule":case"mode":case"subcommandResults":case"permissionPromptTool":return;case"hook":case"asyncAgent":case"sandboxOverride":case"workingDir":case"safetyCheck":case"other":return s.reason}}}export class StructuredIO{input;replayUserMessages;structuredInput;pendingRequests=new Map;restoredWorkerState=Promise.resolve(null);inputClosed=!1;unexpectedResponseCallback;resolvedToolUseIds=new Set;prependedLines=[];onControlRequestSent;onControlRequestResolved;outbound=new v;constructor(e,s){this.input=e,this.replayUserMessages=s,this.input=e,this.structuredInput=this.read()}trackResolvedToolUseId(e){if("can_use_tool"===e.request.subtype&&(this.resolvedToolUseIds.add(e.request.tool_use_id),this.resolvedToolUseIds.size>1e3)){const e=this.resolvedToolUseIds.values().next().value;void 0!==e&&this.resolvedToolUseIds.delete(e)}}flushInternalEvents(){return Promise.resolve()}get internalEventsPending(){return 0}prependUserMessage(e){this.prependedLines.push(p({type:"user",session_id:"",message:{role:"user",content:e},parent_tool_use_id:null})+"\n")}async*read(){let e="";const s=async function*(){for(;;){this.prependedLines.length>0&&(e=this.prependedLines.join("")+e,this.prependedLines=[]);const s=e.indexOf("\n");if(-1===s)break;const t=e.slice(0,s);e=e.slice(s+1);const o=await this.processLine(t);o&&(n("info","cli_stdin_message_parsed",{type:o.type}),yield o)}}.bind(this);yield*s();for await(const t of this.input)e+=t,yield*s();if(e){const s=await this.processLine(e);s&&(yield s)}this.inputClosed=!0;for(const e of this.pendingRequests.values())e.reject(new Error("Tool permission stream closed before response received"))}getPendingPermissionRequests(){return Array.from(this.pendingRequests.values()).map(e=>e.request).filter(e=>"can_use_tool"===e.request.subtype)}setUnexpectedResponseCallback(e){this.unexpectedResponseCallback=e}injectControlResponse(e){const s=e.response?.request_id;if(!s)return;const t=this.pendingRequests.get(s);if(t)if(this.trackResolvedToolUseId(t.request),this.pendingRequests.delete(s),this.write({type:"control_cancel_request",request_id:s}),"error"===e.response.subtype)t.reject(new Error(e.response.error));else{const s=e.response.response;if(t.schema)try{t.resolve(t.schema.parse(s))}catch(e){t.reject(e)}else t.resolve({})}}setOnControlRequestSent(e){this.onControlRequestSent=e}setOnControlRequestResolved(e){this.onControlRequestResolved=e}async processLine(e){if(e)try{const s=h(b(e));if("keep_alive"===s.type)return;if("update_environment_variables"===s.type){const e=Object.keys(s.variables);for(const[e,t]of Object.entries(s.variables))process.env[e]=t;return void r(`[structuredIO] applied update_environment_variables: ${e.join(", ")}`)}if("control_response"===s.type){const e="uuid"in s&&"string"==typeof s.uuid?s.uuid:void 0;e&&m(e,"completed");const t=this.pendingRequests.get(s.response.request_id);if(!t){const e="success"===s.response.subtype?s.response.response:void 0,t=e?.toolUseID;return"string"==typeof t&&this.resolvedToolUseIds.has(t)?void r(`Ignoring duplicate control_response for already-resolved toolUseID=${t} request_id=${s.response.request_id}`):void(this.unexpectedResponseCallback&&await this.unexpectedResponseCallback(s))}if(this.trackResolvedToolUseId(t.request),this.pendingRequests.delete(s.response.request_id),"can_use_tool"===t.request.request.subtype&&this.onControlRequestResolved&&this.onControlRequestResolved(s.response.request_id),"error"===s.response.subtype)return void t.reject(new Error(s.response.error));const o=s.response.response;if(t.schema)try{t.resolve(t.schema.parse(o))}catch(e){t.reject(e)}else t.resolve({});return this.replayUserMessages?s:void 0}if("user"!==s.type&&"control_request"!==s.type&&"assistant"!==s.type&&"system"!==s.type)return void r(`Ignoring unknown message type: ${s.type}`,{level:"warn"});if("control_request"===s.type)return s.request||exitWithMessage("Error: Missing request on control_request"),s;if("assistant"===s.type||"system"===s.type)return s;"user"!==s.message.role&&exitWithMessage(`Error: Expected message role 'user', got '${s.message.role}'`);const t=s.message.content;let o="";if("string"==typeof t)o=t;else if(Array.isArray(t)){const e=t.find(e=>e&&"text"===e.type);e&&"string"==typeof e.text&&(o=e.text)}const n=o.trim();if(n.startsWith("/webapp")){const e=(n.split(/\s+/)[1]??"").toLowerCase();return void("start"===e||"iniciar"===e?(r("[structuredIO] Interceptado /webapp start, iniciando servidor..."),(async()=>{try{const e=await R.startWebappServer();if(r(`[structuredIO] startWebappServer: ${e.message}`),e.ok){const e=R.getWebappUrl(),{exec:s}=await import("node:child_process"),t=process.platform;s("win32"===t?`start "" "${e}"`:"darwin"===t?`open "${e}"`:`xdg-open "${e}"`)}}catch(e){r(`[structuredIO] Error al iniciar webapp: ${e}`)}})()):"stop"!==e&&"detener"!==e||(r("[structuredIO] Interceptado /webapp stop, deteniendo servidor..."),(async()=>{try{const e=await R.stopWebappServer();r(`[structuredIO] stopWebappServer: ${e.message}`)}catch(e){r(`[structuredIO] Error al detener webapp: ${e}`)}})()))}return s}catch(s){console.error(`Error parsing streaming input line: ${e}: ${s}`),process.exit(1)}}async write(e){l(q(e)+"\n")}async sendRequest(e,t,o,r=s()){const n={type:"control_request",request_id:r,request:e};if(this.inputClosed)throw new Error("Stream closed");if(o?.aborted)throw new Error("Request aborted");this.outbound.enqueue(n),"can_use_tool"===e.subtype&&this.onControlRequestSent&&this.onControlRequestSent(n);const aborted=()=>{this.outbound.enqueue({type:"control_cancel_request",request_id:r});const e=this.pendingRequests.get(r);e&&(this.trackResolvedToolUseId(e.request),e.reject(new i))};o&&o.addEventListener("abort",aborted,{once:!0});try{return await new Promise((s,o)=>{this.pendingRequests.set(r,{request:{type:"control_request",request_id:r,request:e},resolve:e=>{s(e)},reject:o,schema:t})})}finally{o&&o.removeEventListener("abort",aborted),this.pendingRequests.delete(r)}}createCanUseTool(e){return async(t,o,r,n,i,l)=>{const p=l??await c(t,o,r,n,i);if("allow"===p.behavior||"deny"===p.behavior)return p;const d=new AbortController,m=r.abortController.signal,onParentAbort=()=>d.abort();m.addEventListener("abort",onParentAbort,{once:!0});try{const n=async function(e,s,t,o,r){const n=o.getAppState(),i=n.toolPermissionContext.mode,a=y(e,s,t,o,i,r,o.abortController.signal);for await(const e of a)if(e.permissionRequestResult&&("allow"===e.permissionRequestResult.behavior||"deny"===e.permissionRequestResult.behavior)){const s=e.permissionRequestResult;if("allow"===s.behavior){const e=s.updatedInput||t,r=s.updatedPermissions??[];if(r.length>0){g(r);const e=o.getAppState(),s=f(e.toolPermissionContext,r);o.setAppState(e=>e.toolPermissionContext===s?e:{...e,toolPermissionContext:s})}return{behavior:"allow",updatedInput:e,userModified:!1,decisionReason:{type:"hook",hookName:"PermissionRequest"}}}return{behavior:"deny",message:s.message||"Permission denied by PermissionRequest hook",decisionReason:{type:"hook",hookName:"PermissionRequest"}}}return}(t.name,i,o,r,p.suggestions).then(e=>({source:"hook",decision:e})),c=s();e?.(function(e,s,t,o){let r;try{r=e.getActivityDescription?.(s)??e.getToolUseSummary?.(s)??e.userFacingName(s)}catch{r=e.name}return{tool_name:e.name,action_description:r,tool_use_id:t,request_id:o,input:s}}(t,o,i,c));const l=this.sendRequest({subtype:"can_use_tool",tool_name:t.name,input:o,permission_suggestions:p.suggestions,blocked_path:p.blockedPath,decision_reason:serializeDecisionReason(p.decisionReason),tool_use_id:i,agent_id:r.agentId},u(),d.signal,c).then(e=>({source:"sdk",result:e})),m=await Promise.race([n,l]);if("hook"===m.source){if(m.decision)return l.catch(()=>{}),d.abort(),m.decision;const e=await l;return a(e.result,t,o,r)}return a(m.result,t,o,r)}catch(e){return a({behavior:"deny",message:`Tool permission request failed: ${e}`,toolUseID:i},t,o,r)}finally{0===this.getPendingPermissionRequests().length&&_("running"),m.removeEventListener("abort",onParentAbort)}}}createHookCallback(e,s){return{type:"callback",timeout:s,callback:async(s,t,r)=>{try{return await this.sendRequest({subtype:"hook_callback",callback_id:e,input:s,tool_use_id:t||void 0},o(),r)}catch(s){return console.error(`Error in hook callback ${e}:`,s),{}}}}}async handleElicitation(e,s,o,r,n,i,a){try{return await this.sendRequest({subtype:"elicitation",mcp_server_name:e,message:s,mode:n,url:i,elicitation_id:a,requested_schema:o},t(),r)}catch{return{action:"cancel"}}}createSandboxAskCallback(){return async e=>{try{return"allow"===(await this.sendRequest({subtype:"can_use_tool",tool_name:"SandboxNetworkAccess",input:{host:e.host},tool_use_id:s(),description:`Allow network connection to ${e.host}?`},u())).behavior}catch{return!1}}}async sendMcpMessage(e,s){return(await this.sendRequest({subtype:"mcp_message",server_name:e,message:s},d.object({mcp_response:d.any()}))).mcp_response}}function exitWithMessage(e){console.error(e),process.exit(1)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{feature as a}from"../../recovery/bunBundleShim.js";const e={type:"local-jsx",name:"branch",aliases:["rama"
|
|
1
|
+
import{feature as a}from"../../recovery/bunBundleShim.js";const e={type:"local-jsx",name:"branch",aliases:["rama",...a("FORK_SUBAGENT")?[]:["fork"]],description:"Crear una rama de la conversación actual en este punto",argumentHint:"[nombre]",load:()=>import("./branch.js")};export default e;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{feature as e}from"../../recovery/bunBundleShim.js";import{jsx as r,jsxs as o}from"react/jsx-runtime";import{resetCostState as t}from"../../bootstrap/state.js";import{clearTrustedDeviceToken as i,enrollTrustedDevice as n}from"../../bridge/trustedDevice.js";import{ConfigurableShortcutHint as
|
|
1
|
+
import{feature as e}from"../../recovery/bunBundleShim.js";import{jsx as r,jsxs as o}from"react/jsx-runtime";import{resetCostState as t}from"../../bootstrap/state.js";import{clearTrustedDeviceToken as i,enrollTrustedDevice as n}from"../../bridge/trustedDevice.js";import{ConfigurableShortcutHint as a}from"../../components/ConfigurableShortcutHint.js";import{ConsoleOAuthFlow as s}from"../../components/ConsoleOAuthFlow.js";import{Dialog as m}from"../../components/design-system/Dialog.js";import{useMainLoopModel as l}from"../../hooks/useMainLoopModel.js";import{Text as c}from"../../ink.js";import{refreshGrowthBookAfterAuthChange as d}from"../../services/analytics/growthbook.js";import{refreshPolicyLimits as p}from"../../services/policyLimits/index.js";import{refreshRemoteManagedSettings as u}from"../../services/remoteManagedSettings/index.js";import{stripSignatureBlocks as g}from"../../utils/messages.js";import{checkAndDisableAutoModeIfNeeded as f,checkAndDisableBypassPermissionsIfNeeded as P,resetAutoModeGateCheck as v,resetBypassPermissionsCheck as M}from"../../utils/permissions/bypassPermissionsKillswitch.js";import{getAPIProvider as N}from"../../utils/model/providers.js";import{switchProviderPreference as x}from"../../utils/model/providerSwitch.js";import{resetUserCache as j}from"../../utils/user.js";import{applySuccessfulLogin as h,isCoreAuthEnabled as S,parseLoginProfileName as I}from"../../core/auth/loginCore.js";export async function call(o,a,s){const m=I(s);return r(Login,{profileName:m,onDone:async(r,s,l,c)=>{if(a.onChangeAPIKey(),a.setMessages(g),r){if(S()){const r=h({context:a,profileName:m,previousModel:s,previousProvider:l,targetProvider:c,transcriptClassifierEnabled:e("TRANSCRIPT_CLASSIFIER")});return r.shouldOpenModelPicker?void o(r.message,{nextInput:"/model",submitNextInput:!0}):void o(r.message)}const r="openai"===c?x({currentModel:s,currentProvider:l,targetProvider:"openai",targetProfileName:m}):"openrouter"===c?x({currentModel:s,currentProvider:l,targetProvider:"openrouter",targetProfileName:m}):"ollama"===c?x({currentModel:s,currentProvider:l,targetProvider:"ollama",targetProfileName:m}):"ollama-cloud"===c?x({currentModel:s,currentProvider:l,targetProvider:"ollama-cloud",targetProfileName:m}):"gemini-api"===c?x({currentModel:s,currentProvider:l,targetProvider:"gemini-api",targetProfileName:m}):"gemini-google"===c?x({currentModel:s,currentProvider:l,targetProvider:"gemini-google",targetProfileName:m}):"zai"===c?x({currentModel:s,currentProvider:l,targetProvider:"zai",targetProfileName:m}):"minimax"===c?x({currentModel:s,currentProvider:l,targetProvider:"minimax",targetProfileName:m}):"nvidia"===c?x({currentModel:s,currentProvider:l,targetProvider:"nvidia",targetProfileName:m}):"deepseek"===c?x({currentModel:s,currentProvider:l,targetProvider:"deepseek",targetProfileName:m}):"custom-openai"===c?x({currentModel:s,currentProvider:l,targetProvider:"custom-openai",targetProfileName:m}):"custom-anthropic"===c?x({currentModel:s,currentProvider:l,targetProvider:"custom-anthropic",targetProfileName:m}):c&&["xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"].includes(c)?x({currentModel:s,currentProvider:l,targetProvider:c,targetProfileName:m}):x({currentModel:s,currentProvider:l,targetProvider:"claude",targetProfileName:m});t(),u(),p(),j(),d(),i(),n(),M();const g=a.getAppState();if(P(g.toolPermissionContext,a.setAppState),e("TRANSCRIPT_CLASSIFIER")&&(v(),f(g.toolPermissionContext,a.setAppState,g.fastMode)),a.setAppState(e=>({...e,mainLoopModel:r,mainLoopModelForSession:r,authVersion:e.authVersion+1})),!r)return void o(m?`Inicio de sesion exitoso en el perfil "${m}". Selecciona ahora el modelo para este perfil.`:"Inicio de sesion exitoso. Selecciona ahora el modelo para este perfil.",{nextInput:"/model",submitNextInput:!0})}o(r?"Inicio de sesión exitoso":"Acceso interrumpido")}})}export function Login(e){const t=l(),i=N();return r(m,{title:"Iniciar sesión",onCancel:()=>e.onDone(!1,t,i),color:"permission",inputGuide:e=>e.pending?o(c,{children:["Presiona ",e.keyName," de nuevo para salir"]}):r(a,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancelar"}),children:r(s,{onDone:r=>e.onDone(!0,t,i,r),startingMessage:e.startingMessage,profileName:e.profileName})})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export default{aliases:["
|
|
1
|
+
export default{aliases:["profile","profiles","perfiles"],type:"local-jsx",name:"perfil",description:"Listar, inspeccionar y cambiar perfiles de proveedor",argumentHint:"[list|current|migrate|create <proveedor> <perfil>|use <proveedor> [perfil]|rename <proveedor> <actual> <nuevo>|remove <proveedor> <perfil>|remove all|clear all|model <proveedor> <perfil> <modelo|clear>]",isEnabled:()=>!0,load:()=>import("./profile.js")};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as e,jsxs as r}from"react/jsx-runtime";import*as o from"react";import{Box as i,Text as n,useInput as l}from"../../ink.js";import{Dialog as t}from"../../components/design-system/Dialog.js";import{useMainLoopModel as a}from"../../hooks/useMainLoopModel.js";import{useSetAppState as s}from"../../state/AppState.js";import{getAPIProvider as u}from"../../utils/model/providers.js";import{finalizeProviderProfilesMigration as c,getProviderProfilesDbPath as d,getProviderProfilesStorageBackend as m,getProviderProfilesStorageMode as f,purgeLegacyProviderStateInConfig as p,setStoredActiveProviderPreference as v}from"../../utils/model/providerProfilesDb.js";import{clearAllProviderProfiles as g,createProviderProfile as $,findProviderProfileByName as N,getActiveProviderProfile as P,getLastUsedProviderProfile as h,getProviderProfile as L,isProfiledProvider as w,listProviderProfiles as C,removeProviderProfile as j,renameProviderProfile as y,setActiveProviderProfile as S,setProviderProfileAgentNameByName as x,setProviderProfileLastModelByName as b}from"../../utils/model/providerProfiles.js";import{fetchProviderModels as M}from"../../utils/model/providerModels.js";import{switchProviderPreference as A}from"../../utils/model/providerSwitch.js";import{removeAllProviderScopedCredentials as I,removeProviderScopedCredentials as E,renameProviderScopedCredentials as z}from"../../utils/auth.js";import{clearAuthRelatedCaches as B}from"../logout/logout.js";import{getSecureStorage as D}from"../../utils/secureStorage/index.js";import{getLegacyCredentialsFilePath as U,getSecureStorageDbPath as q,getSecureStorageKeyPath as O,hasLegacyCredentialsFile as k,isSecureStorageEncrypted as K}from"../../utils/secureStorage/sqliteStorage.js";function normalizeProviderInput(e){if(e)switch(e.trim().toLowerCase()){case"z.ai":case"z-ai":return"zai";case"open-router":return"openrouter";case"ollama-cloud":case"ollama_cloud":case"ollamacloud":return"ollama-cloud";case"gemini":case"gemini-api-key":case"google-ai":return"gemini-api";case"gemini-google":case"google":case"google-oauth":return"gemini-google";default:return e.trim().toLowerCase()}}function getProviderLabel(e){switch(e){case"claude":return"Context";case"openai":return"OpenAI";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"}}function formatProfileLine(e,r){const o=L(r);if(!o)return null;const i=P(),n=h(e),l=[i?.id===o.id?"active":null,n?.id===o.id?"last":null].filter(Boolean),t=l.length>0?` [${l.join(", ")}]`:"",a=[`agent=${o.agentName}`,o.baseUrl?`url=${o.baseUrl}`:null,o.lastModel?`model=${o.lastModel}`:null].filter(Boolean).join(" | ");return`- ${o.provider}/${o.name}${t}${a?` -> ${a}`:""}`}function getProviderStorageModeLabel(){const e=m(),r=f();return"sqlite"!==e?"Legacy fallback":"sqlite-only"===r?"SQLite-only":"SQLite (migracion pendiente)"}function reconcileActiveProviderProfileState(){const e=P();if(e)return void v(e.provider);const r=C()[0];r?(S(r.id),v(r.provider)):v(null)}function RemoveAllProfilesConfirmation({onDone:a,context:s}){const[u,c]=o.useState(!1);return l((e,r)=>{if(!u)return"y"===e||"Y"===e?(c(!0),void async function(e,r){try{const o=g();reconcileActiveProviderProfileState(),await I(),await B(),r.onChangeAPIKey(),e(o.length>0?`Se eliminaron todos los perfiles guardados (${o.length}).`:"No habia perfiles guardados para eliminar.")}catch(r){e(`No se pudieron eliminar todos los perfiles: ${r instanceof Error?r.message:String(r)}`)}}(a,s)):void(("n"===e||"N"===e||r.escape)&&a("Eliminacion de perfiles cancelada."))},{isActive:!0}),e(t,{title:"Eliminar todos los perfiles",subtitle:"Esta accion elimina todos los perfiles guardados y sus credenciales asociadas por perfil.",onCancel:()=>{u||a("Eliminacion de perfiles cancelada.")},color:"error",inputGuide:()=>e(n,{children:"y: confirmar eliminacion total · n/Esc: cancelar"}),children:r(i,{flexDirection:"column",children:[e(n,{children:"Se borraran todos los perfiles persistidos de proveedores."}),e(n,{dimColor:!0,children:"Los fallbacks legacy de compatibilidad no se eliminan con este comando."}),u?e(n,{children:"Eliminando perfiles..."}):null]})})}function SwitchProfileOnMount({onDone:e,context:r,provider:i,profileName:n}){const l=a(),t=s();return o.useEffect(()=>{(async()=>{try{const o=A({currentModel:l,currentProvider:u(),targetProvider:i,targetProfileName:n});await B(),r.onChangeAPIKey(),t(e=>({...e,mainLoopModel:o,mainLoopModelForSession:null}));const a=h(i);e(o?`Perfil activo cambiado a ${i}/${a?.name??n} - modelo restaurado: ${o}`:`Perfil activo cambiado a ${i}/${a?.name??n}`)}catch(r){const o=r instanceof Error?r.message:String(r);e(`No se pudo activar el perfil: ${o}`)}})()},[r,l,e,n,i,t]),null}export async function call(r,o,i){const n=i?.trim();if(!n||"list"===n.toLowerCase())return r(function(){const e=["claude","openai","openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax"],r=[],o=P();r.push(o?`Perfil activo: ${o.provider}/${o.name} (${o.agentName})`:"Perfil activo: ninguno");for(const o of e){const e=C(o);if(r.push(""),r.push(`${getProviderLabel(o)}:`),0!==e.length)for(const i of e){const e=formatProfileLine(o,i.id);e&&r.push(e)}else r.push("- sin perfiles guardados")}return r.join("\n")}()),null;if("current"===n.toLowerCase())return r(function(){const e=P();return e?[`Proveedor: ${getProviderLabel(e.provider)}`,`Perfil: ${e.name}`,`AgentName: ${e.agentName}`,e.baseUrl?`Base URL: ${e.baseUrl}`:null,e.lastModel?`Ultimo modelo: ${e.lastModel}`:null].filter(Boolean).join("\n"):"No hay perfil activo."}()),null;if(function(e){if(!e)return!1;const r=e.trim().toLowerCase();return"migrate"===r||"migrar"===r||"finalize-migration"===r||"finalizar-migracion"===r}(n))return r(function(){const e=D();try{c()}catch{p()}"sqlite"===e.name&&e.read();const r=["Migracion revisada.",`Persistencia providers: ${getProviderStorageModeLabel()}`,`Provider DB: ${d()}`,`Credenciales providers: ${"sqlite"===e.name?"SQLite (cifrado local)":e.name}`];return"sqlite"===e.name&&(r.push(`Credenciales DB: ${q()}`),r.push(`Clave cifrado: ${O()}`),r.push("Estado cifrado credenciales: "+(K()?"Cifrado activo":"Sin payload o pendiente")),r.push("Legacy credentials file: "+(k()?`Presente (${U()})`:"No presente"))),r.join("\n")}()),null;const l=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("create"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r.slice(2).join(" ").trim();return i?{provider:o,profileName:i}:null}(n);if(l){const e=N(l.provider,l.profileName);if(e)return r(`Ya existe el perfil ${e.provider}/${e.name}.`),null;const o=$({provider:l.provider,name:l.profileName});return reconcileActiveProviderProfileState(),r(`Perfil creado: ${o.provider}/${o.name}`),null}const t=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("use"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r.slice(2).join(" ").trim();return i?{provider:o,profileName:i}:null}(n);if(t)return e(SwitchProfileOnMount,{onDone:r,context:o,provider:t.provider,profileName:t.profileName});const a=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("rename"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r[2]?.trim(),n=r.slice(3).join(" ").trim();return i&&n?{provider:o,currentName:i,nextName:n}:null}(n);if(a){if(!N(a.provider,a.currentName))return r(`No existe el perfil ${a.provider}/${a.currentName}.`),null;try{const e=y(a.provider,a.currentName,a.nextName);if(!e)return r(`No existe el perfil ${a.provider}/${a.currentName}.`),null;await z(e.previousId,e.profile.id),await B(),o.onChangeAPIKey(),r(`Perfil renombrado: ${a.provider}/${a.currentName} -> ${e.profile.name}`)}catch(e){r(`No se pudo renombrar el perfil: ${e instanceof Error?e.message:String(e)}`)}return null}const s=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("remove"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r.slice(2).join(" ").trim();return i?{provider:o,profileName:i}:null}(n);if(s){if(!N(s.provider,s.profileName))return r(`No existe el perfil ${s.provider}/${s.profileName}.`),null;try{const e=j(s.provider,s.profileName);if(!e)return r(`No existe el perfil ${s.provider}/${s.profileName}.`),null;await E(e.id),reconcileActiveProviderProfileState(),await B(),o.onChangeAPIKey(),r(`Perfil eliminado: ${e.provider}/${e.name}`)}catch(e){r(`No se pudo eliminar el perfil: ${e instanceof Error?e.message:String(e)}`)}return null}if(function(e){if(!e)return!1;const r=e.trim().split(/\s+/).filter(Boolean);return"remove"===r[0]?.toLowerCase()&&"all"===r[1]?.toLowerCase()&&2===r.length}(n))return e(RemoveAllProfilesConfirmation,{onDone:r,context:o});const m=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("model"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r[2]?.trim(),n=r.slice(3).join(" ").trim();return i&&n?{provider:o,profileName:i,model:["clear","default","reset","none"].includes(n.toLowerCase())?null:n}:null}(n);if(m){if(!N(m.provider,m.profileName))return r(`No existe el perfil ${m.provider}/${m.profileName}.`),null;const e=await async function(e,r){if(!r||"claude"===e)return{valid:!0};const o=await M(e);if(0===o.length)return{valid:!0,warning:`No se pudo validar el catálogo de ${getProviderLabel(e)}. El modelo se guardó sin validación remota.`};const i=r.toLowerCase();return o.some(e=>e.value.toLowerCase()===i||e.label.toLowerCase()===i)?{valid:!0}:{valid:!1,error:`El modelo '${r}' no pertenece al catálogo actual de ${getProviderLabel(e)}.`}}(m.provider,m.model);if(!e.valid)return r(e.error),null;const i=b(m.provider,m.profileName,m.model);if(!i)return r(`No existe el perfil ${m.provider}/${m.profileName}.`),null;const n=P();return n?.id===i.id&&u()===i.provider&&(await B(),o.onChangeAPIKey()),r(m.model?`${e.warning?`${e.warning} `:""}Modelo guardado para ${i.provider}/${i.name}: ${m.model}`:`Modelo limpiado para ${i.provider}/${i.name}`),null}const f=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("agent"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r[2]?.trim(),n=r.slice(3).join(" ").trim();return i&&n?{provider:o,profileName:i,agentName:n}:null}(n);if(f){if(!N(f.provider,f.profileName))return r(`No existe el perfil ${f.provider}/${f.profileName}.`),null;try{const e=x(f.provider,f.profileName,f.agentName);if(!e)return r(`No existe el perfil ${f.provider}/${f.profileName}.`),null;r(`AgentName guardado para ${e.provider}/${e.name}: ${e.agentName}`)}catch(e){r(`No se pudo guardar el agentName: ${e instanceof Error?e.message:String(e)}`)}return null}return r("Uso: /profile, /profile list, /profile current, /profile migrate, /profile create <proveedor> <perfil>, /profile use <proveedor> <perfil>, /profile rename <proveedor> <actual> <nuevo>, /profile remove <proveedor> <perfil>, /profile remove all, /profile model <proveedor> <perfil> <modelo|clear>, /profile agent <proveedor> <perfil> <agentName>"),null}
|
|
1
|
+
import{jsx as e,jsxs as r}from"react/jsx-runtime";import*as o from"react";import{Box as i,Text as n,useInput as l}from"../../ink.js";import{Dialog as t}from"../../components/design-system/Dialog.js";import{useMainLoopModel as a}from"../../hooks/useMainLoopModel.js";import{useSetAppState as s}from"../../state/AppState.js";import{getAPIProvider as c}from"../../utils/model/providers.js";import{finalizeProviderProfilesMigration as u,getProviderProfilesDbPath as d,getProviderProfilesStorageBackend as f,getProviderProfilesStorageMode as m,purgeLegacyProviderStateInConfig as p,setStoredActiveProviderPreference as v}from"../../utils/model/providerProfilesDb.js";import{clearAllProviderProfiles as g,createProviderProfile as $,findProviderProfileByName as N,getActiveProviderProfile as P,getLastUsedProviderProfile as h,getProviderProfile as L,isProfiledProvider as w,listProviderProfiles as C,removeProviderProfile as j,renameProviderProfile as y,setActiveProviderProfile as S,setProviderProfileAgentNameByName as b,setProviderProfileLastModelByName as x}from"../../utils/model/providerProfiles.js";import{fetchProviderModels as M}from"../../utils/model/providerModels.js";import{VISIBLE_PROVIDERS as A}from"../../utils/model/providerCatalog.js";import{switchProviderPreference as E}from"../../utils/model/providerSwitch.js";import{removeAllProviderScopedCredentials as B,removeProviderScopedCredentials as I,renameProviderScopedCredentials as z}from"../../utils/auth.js";import{clearAuthRelatedCaches as D}from"../logout/logout.js";import{getSecureStorage as U}from"../../utils/secureStorage/index.js";import{getLegacyCredentialsFilePath as q,getSecureStorageDbPath as k,getSecureStorageKeyPath as K,hasLegacyCredentialsFile as Q,isSecureStorageEncrypted as R}from"../../utils/secureStorage/sqliteStorage.js";function normalizeProviderInput(e){if(e)switch(e.trim().toLowerCase()){case"z.ai":case"z-ai":return"zai";case"open-router":return"openrouter";case"ollama-cloud":case"ollama_cloud":case"ollamacloud":return"ollama-cloud";case"gemini":case"gemini-api-key":case"google-ai":return"gemini-api";case"gemini-google":case"google":case"google-oauth":return"gemini-google";default:return e.trim().toLowerCase()}}function getProviderLabel(e){return A.find(r=>r.id===e)?.label??e}function formatProfileLine(e,r){const o=L(r);if(!o)return null;const i=P(),n=h(e),l=[i?.id===o.id?"active":null,n?.id===o.id?"last":null].filter(Boolean),t=l.length>0?` [${l.join(", ")}]`:"",a=[`agent=${o.agentName}`,o.baseUrl?`url=${o.baseUrl}`:null,o.lastModel?`model=${o.lastModel}`:null].filter(Boolean).join(" | ");return`- ${o.provider}/${o.name}${t}${a?` -> ${a}`:""}`}function getProviderStorageModeLabel(){const e=f(),r=m();return"sqlite"!==e?"Legacy fallback":"sqlite-only"===r?"SQLite-only":"SQLite (migracion pendiente)"}function reconcileActiveProviderProfileState(){const e=P();if(e)return void v(e.provider);const r=C()[0];r?(S(r.id),v(r.provider)):v(null)}function RemoveAllProfilesConfirmation({onDone:a,context:s}){const[c,u]=o.useState(!1);return l((e,r)=>{if(!c)return"y"===e||"Y"===e?(u(!0),void async function(e,r){try{const o=g();reconcileActiveProviderProfileState(),await B(),await D(),r.onChangeAPIKey(),e(o.length>0?`Se eliminaron todos los perfiles guardados (${o.length}).`:"No habia perfiles guardados para eliminar.")}catch(r){e(`No se pudieron eliminar todos los perfiles: ${r instanceof Error?r.message:String(r)}`)}}(a,s)):void(("n"===e||"N"===e||r.escape)&&a("Eliminacion de perfiles cancelada."))},{isActive:!0}),e(t,{title:"Eliminar todos los perfiles",subtitle:"Esta accion elimina todos los perfiles guardados y sus credenciales asociadas por perfil.",onCancel:()=>{c||a("Eliminacion de perfiles cancelada.")},color:"error",inputGuide:()=>e(n,{children:"y: confirmar eliminacion total · n/Esc: cancelar"}),children:r(i,{flexDirection:"column",children:[e(n,{children:"Se borraran todos los perfiles persistidos de proveedores."}),e(n,{dimColor:!0,children:"Los fallbacks legacy de compatibilidad no se eliminan con este comando."}),c?e(n,{children:"Eliminando perfiles..."}):null]})})}function SwitchProfileOnMount({onDone:e,context:r,provider:i,profileName:n}){const l=a(),t=s();return o.useEffect(()=>{(async()=>{try{const o=E({currentModel:l,currentProvider:c(),targetProvider:i,targetProfileName:n});await D(),r.onChangeAPIKey(),t(e=>({...e,mainLoopModel:o,mainLoopModelForSession:null}));const a=h(i);e(o?`Perfil activo cambiado a ${i}/${a?.name??n} - modelo restaurado: ${o}`:`Perfil activo cambiado a ${i}/${a?.name??n}`)}catch(r){const o=r instanceof Error?r.message:String(r);e(`No se pudo activar el perfil: ${o}`)}})()},[r,l,e,n,i,t]),null}export async function call(r,o,i){const n=i?.trim();if(!n||"list"===n.toLowerCase())return r(function(){const e=A.map(e=>e.id).filter(w),r=[],o=P();r.push(o?`Perfil activo: ${o.provider}/${o.name} (${o.agentName})`:"Perfil activo: ninguno");for(const o of e){const e=C(o);if(r.push(""),r.push(`${getProviderLabel(o)}:`),0!==e.length)for(const i of e){const e=formatProfileLine(o,i.id);e&&r.push(e)}else r.push("- sin perfiles guardados")}return r.join("\n")}()),null;if("current"===n.toLowerCase())return r(function(){const e=P();return e?[`Proveedor: ${getProviderLabel(e.provider)}`,`Perfil: ${e.name}`,`AgentName: ${e.agentName}`,e.baseUrl?`Base URL: ${e.baseUrl}`:null,e.lastModel?`Ultimo modelo: ${e.lastModel}`:null].filter(Boolean).join("\n"):"No hay perfil activo."}()),null;if(function(e){if(!e)return!1;const r=e.trim().toLowerCase();return"migrate"===r||"migrar"===r||"finalize-migration"===r||"finalizar-migracion"===r}(n))return r(function(){const e=U();try{u()}catch{p()}"sqlite"===e.name&&e.read();const r=["Migracion revisada.",`Persistencia providers: ${getProviderStorageModeLabel()}`,`Provider DB: ${d()}`,`Credenciales providers: ${"sqlite"===e.name?"SQLite (cifrado local)":e.name}`];return"sqlite"===e.name&&(r.push(`Credenciales DB: ${k()}`),r.push(`Clave cifrado: ${K()}`),r.push("Estado cifrado credenciales: "+(R()?"Cifrado activo":"Sin payload o pendiente")),r.push("Legacy credentials file: "+(Q()?`Presente (${q()})`:"No presente"))),r.join("\n")}()),null;const l=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("create"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r.slice(2).join(" ").trim();return i?{provider:o,profileName:i}:null}(n);if(l){const e=N(l.provider,l.profileName);if(e)return r(`Ya existe el perfil ${e.provider}/${e.name}.`),null;const o=$({provider:l.provider,name:l.profileName});return reconcileActiveProviderProfileState(),r(`Perfil creado: ${o.provider}/${o.name}`),null}const t=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("use"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);return o&&w(o)?{provider:o,profileName:r.slice(2).join(" ").trim()||void 0}:null}(n);if(t)return e(SwitchProfileOnMount,{onDone:r,context:o,provider:t.provider,profileName:t.profileName});const a=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("rename"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r[2]?.trim(),n=r.slice(3).join(" ").trim();return i&&n?{provider:o,currentName:i,nextName:n}:null}(n);if(a){if(!N(a.provider,a.currentName))return r(`No existe el perfil ${a.provider}/${a.currentName}.`),null;try{const e=y(a.provider,a.currentName,a.nextName);if(!e)return r(`No existe el perfil ${a.provider}/${a.currentName}.`),null;await z(e.previousId,e.profile.id),await D(),o.onChangeAPIKey(),r(`Perfil renombrado: ${a.provider}/${a.currentName} -> ${e.profile.name}`)}catch(e){r(`No se pudo renombrar el perfil: ${e instanceof Error?e.message:String(e)}`)}return null}const s=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("remove"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r.slice(2).join(" ").trim();return i?{provider:o,profileName:i}:null}(n);if(s){if(!N(s.provider,s.profileName))return r(`No existe el perfil ${s.provider}/${s.profileName}.`),null;try{const e=j(s.provider,s.profileName);if(!e)return r(`No existe el perfil ${s.provider}/${s.profileName}.`),null;await I(e.id),reconcileActiveProviderProfileState(),await D(),o.onChangeAPIKey(),r(`Perfil eliminado: ${e.provider}/${e.name}`)}catch(e){r(`No se pudo eliminar el perfil: ${e instanceof Error?e.message:String(e)}`)}return null}if(function(e){if(!e)return!1;const r=e.trim().split(/\s+/).filter(Boolean),o=r[0]?.toLowerCase(),i=r[1]?.toLowerCase();return"remove"===o&&"all"===i&&2===r.length||"clear-all"===o&&1===r.length||"clear"===o&&1===r.length||"clear"===o&&"all"===i&&2===r.length}(n))return e(RemoveAllProfilesConfirmation,{onDone:r,context:o});const f=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("model"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r[2]?.trim(),n=r.slice(3).join(" ").trim();return i&&n?{provider:o,profileName:i,model:["clear","default","reset","none"].includes(n.toLowerCase())?null:n}:null}(n);if(f){if(!N(f.provider,f.profileName))return r(`No existe el perfil ${f.provider}/${f.profileName}.`),null;const e=await async function(e,r){if(!r||"claude"===e)return{valid:!0};const o=await M(e);if(0===o.length)return{valid:!0,warning:`No se pudo validar el catálogo de ${getProviderLabel(e)}. El modelo se guardó sin validación remota.`};const i=r.toLowerCase();return o.some(e=>e.value.toLowerCase()===i||e.label.toLowerCase()===i)?{valid:!0}:{valid:!1,error:`El modelo '${r}' no pertenece al catálogo actual de ${getProviderLabel(e)}.`}}(f.provider,f.model);if(!e.valid)return r(e.error),null;const i=x(f.provider,f.profileName,f.model);if(!i)return r(`No existe el perfil ${f.provider}/${f.profileName}.`),null;const n=P();return n?.id===i.id&&c()===i.provider&&(await D(),o.onChangeAPIKey()),r(f.model?`${e.warning?`${e.warning} `:""}Modelo guardado para ${i.provider}/${i.name}: ${f.model}`:`Modelo limpiado para ${i.provider}/${i.name}`),null}const m=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("agent"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r[2]?.trim(),n=r.slice(3).join(" ").trim();return i&&n?{provider:o,profileName:i,agentName:n}:null}(n);if(m){if(!N(m.provider,m.profileName))return r(`No existe el perfil ${m.provider}/${m.profileName}.`),null;try{const e=b(m.provider,m.profileName,m.agentName);if(!e)return r(`No existe el perfil ${m.provider}/${m.profileName}.`),null;r(`AgentName guardado para ${e.provider}/${e.name}: ${e.agentName}`)}catch(e){r(`No se pudo guardar el agentName: ${e instanceof Error?e.message:String(e)}`)}return null}return r("Uso: /perfil, /perfil list, /perfil current, /perfil migrate, /perfil create <proveedor> <perfil>, /perfil use <proveedor> [perfil], /perfil rename <proveedor> <actual> <nuevo>, /perfil remove <proveedor> <perfil>, /perfil remove all, /perfil clear, /perfil clear all, /perfil model <proveedor> <perfil> <modelo|clear>, /perfil agent <proveedor> <perfil> <agentName>"),null}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export default{type:"local-jsx",name:"provider",aliases:["proveedor","proveedores"],description:"Cambiar entre proveedores y configurar endpoints sin cerrar sesion",argumentHint:"[list|current|claude|openai|openrouter|ollama|ollama-cloud|gemini-api|gemini-google|zai|minimax|nvidia|deepseek|custom-openai|custom-anthropic] [baseURL|clear]",isEnabled:()=>!0,load:()=>import("./provider.js")};
|
|
1
|
+
export default{type:"local-jsx",name:"provider",aliases:["proveedor","proveedores"],description:"Cambiar entre proveedores y configurar endpoints sin cerrar sesion",argumentHint:"[list|current|clear all|claude|openai|openrouter|ollama|ollama-cloud|gemini-api|gemini-google|zai|minimax|nvidia|deepseek|custom-openai|custom-anthropic] [baseURL|clear]",isEnabled:()=>!0,load:()=>import("./provider.js")};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as e,jsxs as r}from"react/jsx-runtime";import{Select as o}from"../../components/CustomSelect/select.js";import*as i from"react";import{Box as a,Text as n}from"../../ink.js";import{useMainLoopModel as t}from"../../hooks/useMainLoopModel.js";import{useSetAppState as l}from"../../state/AppState.js";import{getStoredActiveProviderPreference as d}from"../../utils/model/providerProfilesDb.js";import{getCoreCurrentProviderProfile as s,getCoreProviderLabel as u,isCoreProviderEnabled as c,isCoreSelectedProfileReady as p,listCoreProviderProfiles as m,normalizeCoreProviderInput as g,setCoreActiveProfile as f,switchCoreProvider as v}from"../../core/providers/providerCore.js";import{getAPIProvider as b,isGeminiApiProviderConfigured as P,isGeminiGoogleProviderConfigured as h,isNvidiaProviderConfigured as y,isOllamaCloudProviderConfigured as $,isMiniMaxProviderConfigured as U,isOpenAIProviderConfigured as C,isOpenRouterProviderConfigured as L,isZAIProviderConfigured as S}from"../../utils/model/providers.js";import{clearProviderBaseUrl as w,getConfiguredProviderBaseUrl as M,getDefaultProviderBaseUrl as x,isProviderBaseUrlCustomized as A,setProviderBaseUrl as I}from"../../utils/model/providerBaseUrls.js";import{getVisibleProvider as k,VISIBLE_PROVIDERS as R}from"../../utils/model/providerCatalog.js";import{getActiveProviderProfile as E,getLastUsedProviderProfile as j,isProfiledProvider as N,listProviderProfiles as z,setActiveProfileForProvider as O}from"../../utils/model/providerProfiles.js";import{switchProviderPreference as B}from"../../utils/model/providerSwitch.js";import{clearAuthRelatedCaches as D}from"../logout/logout.js";import{call as G}from"../login/login.js";import{call as q}from"../login-openai/login-openai.js";import T from"chalk";import{getStoredProviderOAuthTokens as V,hasStoredProviderApiKey as W,hasStoredProviderOAuthTokens as F}from"../../utils/auth.js";const K=["openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","nvidia","deepseek","custom-openai","custom-anthropic"];function isConfigurableBaseUrlProvider(e){return K.includes(e)}function getProviderLabel(e){return c()?u(e):k(e).label}function getCurrentProviderBaseUrl(e){return A(e)?M(e):x(e)}function getProviderSetupMessage(e){const r=getCurrentProviderBaseUrl(e);switch(e){case"ollama":return`Ollama usa un servidor local compatible. Endpoint actual: ${r}. Puedes cambiarlo con /provider ollama <baseURL> o restaurar el default con /provider ollama clear.`;case"ollama-cloud":return`Ollama Cloud usa por defecto tu host local autenticado. Endpoint actual: ${r}. Ejecuta 'ollama signin' y luego usa /provider ollama-cloud.`;case"gemini-api":return`Gemini API requiere una API key de Google AI Studio. Endpoint actual: ${r}. Usa /login para guardarla o /provider gemini-api <baseURL> para cambiar el endpoint.`;case"gemini-google":return`Gemini Google usa OAuth compatible con Gemini CLI. Endpoint actual: ${r}. Usa /login y elige Gemini Google para abrir el navegador y guardar el token.`;case"zai":return"Z.AI requiere una API key. Usa /login para guardarla y /provider zai <baseURL> para cambiar el endpoint si hace falta.";case"minimax":return"MiniMax requiere una API key. Usa /login para guardarla. El endpoint por defecto es Anthropic-compatible (https://api.minimax.io/anthropic) y puedes cambiarlo con /provider minimax <baseURL>.";case"nvidia":return"NVIDIA requiere una API key. Usa /login para guardarla. El endpoint por defecto es https://integrate.api.nvidia.com/v1 y puedes cambiarlo con /provider nvidia <baseURL>.";case"deepseek":return`DeepSeek requiere una API key. Usa /login para guardarla. Endpoint actual: ${r}. Puedes cambiarlo con /provider deepseek <baseURL>.`;case"custom-openai":return`Custom OpenAI usa un endpoint y API key personalizados. Endpoint actual: ${r}. Usa /login para configurarlo desde cero o /provider custom-openai <baseURL> para cambiar solo el endpoint.`;case"custom-anthropic":return`Custom Anthropic usa un endpoint y API key personalizados. Endpoint actual: ${r}. Usa /login para configurarlo desde cero o /provider custom-anthropic <baseURL> para cambiar solo el endpoint.`;default:return"OpenRouter requiere una API key. Usa /login para guardarla y /provider openrouter <baseURL> para cambiar el endpoint si hace falta."}}function isUrlLike(e){const r=e.toLowerCase();return!(!r.startsWith("http://")&&!r.startsWith("https://"))||(!!r.startsWith("localhost")||(/\.[a-z]{2,}/i.test(r)||/:\d+/.test(r)||/^(\d{1,3}\.){3}\d{1,3}/.test(r)))}async function switchProvider(e){const r=c()?v({currentModel:e.currentModel,currentProvider:e.currentProvider,targetProvider:e.target,targetProfileName:e.targetProfileName}).restoredModel:B({currentModel:e.currentModel,currentProvider:e.currentProvider,targetProvider:e.target,targetProfileName:e.targetProfileName});await D(),e.context.onChangeAPIKey();const o=N(e.target)&&j(e.target)?` · perfil ${j(e.target).name}`:"";return{message:r?`Proveedor cambiado a ${getProviderLabel(e.target)}${o} - modelo restaurado: ${r}`:`Proveedor cambiado a ${getProviderLabel(e.target)}${o} - cargando modelo predeterminado`,restoredModel:r}}function getProviderSelectionMessage(e,r){if("claude"===e)return"Redirigiendo a inicio de sesion de Claude...";if("openai"===e)return"Redirigiendo a inicio de sesion de OpenAI...";const o=isConfigurableBaseUrlProvider(e)?getProviderSetupMessage(e):null;return r&&o?`${r} - ${o}`:r??o??`Proveedor preparado: ${getProviderLabel(e)}`}function isSelectedProfileReady(e,r){if(c())return p(e,r);if(!r||!N(e))return!0;const o=j(e);return!!o&&("claude"===e?F("claude",o.id):"openai"===e?F("openai",o.id):"openrouter"===e?W("openrouter",o.id):"gemini-api"===e?W("gemini-api",o.id):"gemini-google"===e?h():"zai"===e?W("zai",o.id):"minimax"===e?W("minimax",o.id):"nvidia"!==e||W("nvidia",o.id))}export async function call(r,o,i){const a=i?.trim(),n=a?.split(/\s+/).filter(Boolean)??[],t=n[0]?.toLowerCase();if("list"===t){const e=c(),o=e?m():null,i=e?Object.values(o.providers).flat():z(),a=e?o.activeProfile:E(),n=e?o.providers:i.reduce((e,r)=>(e[r.provider]||(e[r.provider]=[]),e[r.provider].push(r),e),{});let t="\n"+T.cyan.bold(" +----------------------------------------------------------+")+"\n";t+=T.cyan.bold(" | ")+T.white.bold("GESTIÓN DE PROVEEDORES Y CUENTAS")+T.cyan.bold(" |")+"\n",t+=T.cyan.bold(" +----------------------------------------------------------+")+"\n";const l=R.filter(e=>e.implemented);for(const e of l){const r=e.id,o=n[r]??[];if(t+=`\n ${T.magenta.bold("♦")}${T.bgMagenta.white.bold(" "+e.label.toUpperCase()+" ")}${T.magenta.bold("♦")} ${T.dim("("+r+")")}\n`,0===o.length){let e=!1;"claude"===r?e=F("claude"):"openai"===r?e=C():"openrouter"===r?e=L():"gemini-api"===r?e=P():"gemini-google"===r?e=h():"zai"===r?e=S():"minimax"===r?e=U():"nvidia"===r?e=y():"ollama"===r?e=!0:"ollama-cloud"===r?e=$():"deepseek"===r?e=W("deepseek"):"custom-openai"===r?e=W("custom-openai"):"custom-anthropic"===r&&(e=W("custom-anthropic"));const o=e?T.green("● Configurado (sin perfil creado)"):T.yellow("○ Sin perfiles");t+=` ${T.dim("•")} ${T.white("sin perfiles".padEnd(15))} ${o}\n`;continue}for(const e of o){const r=e.id===a?.id;let o=!1;"claude"===e.provider||"openai"===e.provider?o=!!V(e.provider,e.id):["openrouter","zai","minimax","nvidia","deepseek","gemini-api","custom-openai","custom-anthropic"].includes(e.provider)?o=W(e.provider,e.id):"ollama"!==e.provider&&"ollama-cloud"!==e.provider||(o=!0);t+=` ${r?T.cyan("●"):T.dim("○")} ${r?T.cyan.bold(e.name.padEnd(15)):T.white(e.name.padEnd(15))} ${o?T.green("● Conectado"):T.red("○ Desconectado")} ${r?T.bgCyan.black(" ACTUAL "):""}\n`,e.baseUrl&&(t+=` ${T.dim("+-")} ${T.blue("→")} ${T.dim(e.baseUrl)}\n`)}}return t+="\n"+T.cyan.bold(" ► Guía rápida:")+"\n",t+=` ${T.dim("•")} Cambiar perfil: ${T.yellow("/provider [id] profile [nombre]")}\n`,t+=` ${T.dim("•")} Nueva cuenta: ${T.yellow("/login --profile [nombre]")}\n`,t+=` ${T.dim("•")} Ver actual: ${T.yellow("/provider current")}\n`,r(t),null}if("current"===t){const e=c()?s().activeProfile:E();if(!e)return r(T.yellow("No hay un perfil de proveedor activo configurado.")),null;const o=k(e.provider);let i=`\n${T.cyan.bold("Perfil actual:")}\n`;return i+=`${T.white("Proveedor:")} ${T.magenta(o.label)}\n`,i+=`${T.white("Nombre:")} ${T.cyan(e.name)}\n`,e.baseUrl&&(i+=`${T.white("Endpoint:")} ${T.blue(e.baseUrl)}\n`),r(i),null}const l=function(e){if(c())return g(e);if(e)switch(e.trim().toLowerCase()){case"z.ai":case"z-ai":return"zai";case"open-router":return"openrouter";case"ollama-cloud":case"ollama_cloud":case"ollamacloud":return"ollama-cloud";case"gemini":case"gemini-api-key":case"google-ai":case"google-ai-studio":return"gemini-api";case"gemini-google":case"google":case"google-oauth":return"gemini-google";default:return e.trim().toLowerCase()}}(t);if(l){if(!R.find(e=>e.id===l))return r(`Proveedor no reconocido: ${l}. Opciones: ${R.map(e=>e.id).join(", ")}`),null;const i=function(e,r){if(!r||!N(e))return null;const o=r.trim().split(/\s+/).filter(Boolean);if(o.length<2)return null;if("profile"===o[1]?.toLowerCase())return o.slice(2).join(" ").trim()||null;const i=o[1];return["set","set-url","base-url","baseurl","url","endpoint","clear","reset","default","restore"].includes(i.toLowerCase())||isUrlLike(i)?null:i}(l,a);if(i&&N(l)&&(c()?f(l,i):O(l,i)),!("claude"!==l||F("claude")&&isSelectedProfileReady(l,i)))return G(r,o);if(!("openai"!==l||C()&&isSelectedProfileReady(l,i)))return q(r,o);const n=function(e,r){if(!r||!isConfigurableBaseUrlProvider(e))return{};const o=r.trim().split(/\s+/).filter(Boolean);if(o.length<2)return{};if("profile"===o[1]?.toLowerCase())return{};const i=o[1]?.toLowerCase(),a=["set","set-url","base-url","baseurl","url","endpoint"].includes(i),n=(a?o.slice(2):o.slice(1)).join(" ").trim();return n?["clear","reset","default","restore"].includes(n.toLowerCase())?{clear:!0}:a||isUrlLike(n)?{baseUrl:n}:{}:{}}(l,a);let t=null;if(n.clear&&isConfigurableBaseUrlProvider(l))w(l),t=`Base URL de ${getProviderLabel(l)} restaurada a ${getCurrentProviderBaseUrl(l)}`;else if(n.baseUrl&&isConfigurableBaseUrlProvider(l))try{const e=I(l,n.baseUrl);t=`Base URL de ${getProviderLabel(l)} guardada: ${e}`}catch(e){return r(e instanceof Error?e.message:`No se pudo guardar la base URL para ${getProviderLabel(l)}.`),null}return("openrouter"!==l||L())&&(("openrouter"!==l||isSelectedProfileReady(l,i))&&("gemini-api"!==l||P()&&isSelectedProfileReady(l,i))&&("zai"!==l||S()&&isSelectedProfileReady(l,i))&&("minimax"!==l||U())&&("minimax"!==l||isSelectedProfileReady(l,i))&&("nvidia"!==l||y())&&("nvidia"!==l||isSelectedProfileReady(l,i)))?e(SwitchProviderOnMount,{onDone:r,context:o,target:l,baseUrlMessage:t,targetProfileName:i}):(r(getProviderSelectionMessage(l,t)),null)}return e(ProviderPicker,{onDone:r,context:o})}function SwitchProviderOnMount({onDone:e,context:r,target:o,baseUrlMessage:a,targetProfileName:n}){const d=t(),s=l();return i.useEffect(()=>{(async()=>{try{const i=await switchProvider({context:r,currentModel:d,currentProvider:b(),target:o,targetProfileName:n});s(e=>({...e,mainLoopModel:i.restoredModel,mainLoopModelForSession:null})),e(a?`${a} - ${i.message}`:i.message)}catch(r){const o=r instanceof Error?r.message:String(r);e(`No se pudo cambiar de proveedor: ${o}`)}})()},[a,r,d,e,s,o,n]),null}function ProviderPicker({onDone:i,context:s}){const u=t(),c=l(),p=b(),m=d(),g=R.filter(e=>e.implemented).map(e=>{const r="claude"===e.id&&"firstParty"===p||e.id===p,o="claude"===e.id&&F("claude")||"openai"===e.id&&C()||"openrouter"===e.id&&L()||"gemini-api"===e.id&&P()||"gemini-google"===e.id&&h()||"ollama"===e.id||"ollama-cloud"===e.id&&$()||"zai"===e.id&&S()||"minimax"===e.id&&U()||"nvidia"===e.id&&y(),i=r?" [active]":o?" [ready]":" [setup]";return{label:`${e.label}${i}`,value:e.id}});const f=m??("firstParty"===p?"claude":p);return r(a,{flexDirection:"column",gap:1,children:[e(n,{bold:!0,color:"cyan",children:"Selecciona el proveedor de IA para Context Code:"}),e(n,{dimColor:!0,children:"Puedes usar la API oficial de Claude, OpenAI o proveedores compatibles con OpenAI."}),e(o,{options:g,defaultValue:f,onChange:async function(e){try{const r=e;if("claude"===r&&!F("claude"))return void i("No hay sesión de Claude. Lanzando /login...",{nextInput:"/login",submitNextInput:!0});if("openai"===r&&!C())return void i("No hay sesión de OpenAI. Lanzando /login-openai...",{nextInput:"/login-openai",submitNextInput:!0});if("openrouter"===r&&!L())return void i(getProviderSetupMessage(r));if("gemini-api"===r&&!P())return void i(getProviderSetupMessage(r));if("zai"===r&&!S())return void i(getProviderSetupMessage(r));if("minimax"===r&&!U())return void i(getProviderSetupMessage(r));if("nvidia"===r&&!y())return void i(getProviderSetupMessage(r));const o=await switchProvider({context:s,currentModel:u,currentProvider:p,target:r});c(e=>({...e,mainLoopModel:o.restoredModel,mainLoopModelForSession:null})),i(o.message)}catch(e){const r=e instanceof Error?e.message:String(e);i(`No se pudo cambiar de proveedor: ${r}`)}}}),r(a,{marginTop:1,flexDirection:"column",children:[r(n,{dimColor:!0,children:["- Usa ",e(n,{bold:!0,children:"/login"})," para configurar las API keys."]}),r(n,{dimColor:!0,children:["- Usa ",e(n,{bold:!0,children:"/provider openrouter https://..."})," para guardar una base URL personalizada."]}),r(n,{dimColor:!0,children:["- ",e(n,{bold:!0,children:"Ollama"})," usa ",getCurrentProviderBaseUrl("ollama")," por defecto."]})]})]})}
|
|
1
|
+
import{jsx as e,jsxs as r}from"react/jsx-runtime";import{Select as o}from"../../components/CustomSelect/select.js";import*as a from"react";import{Box as i,Text as n,useInput as t}from"../../ink.js";import{Dialog as l}from"../../components/design-system/Dialog.js";import{useMainLoopModel as s}from"../../hooks/useMainLoopModel.js";import{useSetAppState as d}from"../../state/AppState.js";import{getStoredActiveProviderPreference as c,setStoredActiveProviderPreference as u}from"../../utils/model/providerProfilesDb.js";import{getCoreCurrentProviderProfile as p,getCoreProviderLabel as m,isCoreProviderEnabled as g,isCoreSelectedProfileReady as f,listCoreProviderProfiles as v,normalizeCoreProviderInput as b,setCoreActiveProfile as P,switchCoreProvider as h}from"../../core/providers/providerCore.js";import{getAPIProvider as y,isGeminiApiProviderConfigured as $,isGeminiGoogleProviderConfigured as C,isNvidiaProviderConfigured as U,isOllamaCloudProviderConfigured as L,isMiniMaxProviderConfigured as w,isOpenAIProviderConfigured as A,isOpenRouterProviderConfigured as I,isZAIProviderConfigured as E}from"../../utils/model/providers.js";import{clearProviderBaseUrl as k,getConfiguredProviderBaseUrl as x,getDefaultProviderBaseUrl as S,isProviderBaseUrlCustomized as M,setProviderBaseUrl as R}from"../../utils/model/providerBaseUrls.js";import{getVisibleProvider as j,VISIBLE_PROVIDERS as N}from"../../utils/model/providerCatalog.js";import{clearAllProviderProfiles as O,getActiveProviderProfile as D,getLastUsedProviderProfile as z,isProfiledProvider as B,listProviderProfiles as G,setActiveProfileForProvider as q,setActiveProviderProfile as T}from"../../utils/model/providerProfiles.js";import{switchProviderPreference as V}from"../../utils/model/providerSwitch.js";import{clearAuthRelatedCaches as W}from"../logout/logout.js";import{call as F}from"../login/login.js";import{call as K}from"../login-openai/login-openai.js";import Y from"chalk";import{getStoredProviderOAuthTokens as Z,hasStoredProviderApiKey as _,hasStoredProviderOAuthTokens as H,removeAllProviderScopedCredentials as J}from"../../utils/auth.js";const Q=["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"];function isConfigurableBaseUrlProvider(e){return Q.includes(e)}function isProviderConfigured(e){return"claude"===e?H("claude"):"openai"===e?A():"openrouter"===e?I():"gemini-api"===e?$():"gemini-google"===e?C():"ollama"===e||("ollama-cloud"===e?L():"zai"===e?E():"minimax"===e?w():"nvidia"===e?U():_(e))}function getProviderLabel(e){return g()?m(e):j(e).label}function getCurrentProviderBaseUrl(e){return M(e)?x(e):S(e)}function getProviderSetupMessage(e){const r=getCurrentProviderBaseUrl(e);switch(e){case"ollama":return`Ollama usa un servidor local compatible. Endpoint actual: ${r}. Puedes cambiarlo con /provider ollama <baseURL> o restaurar el default con /provider ollama clear.`;case"ollama-cloud":return`Ollama Cloud usa por defecto tu host local autenticado. Endpoint actual: ${r}. Ejecuta 'ollama signin' y luego usa /provider ollama-cloud.`;case"gemini-api":return`Gemini API requiere una API key de Google AI Studio. Endpoint actual: ${r}. Usa /login para guardarla o /provider gemini-api <baseURL> para cambiar el endpoint.`;case"gemini-google":return`Gemini Google usa OAuth compatible con Gemini CLI. Endpoint actual: ${r}. Usa /login y elige Gemini Google para abrir el navegador y guardar el token.`;case"zai":return"Z.AI requiere una API key. Usa /login para guardarla y /provider zai <baseURL> para cambiar el endpoint si hace falta.";case"minimax":return"MiniMax requiere una API key. Usa /login para guardarla. El endpoint por defecto es Anthropic-compatible (https://api.minimax.io/anthropic) y puedes cambiarlo con /provider minimax <baseURL>.";case"nvidia":return"NVIDIA requiere una API key. Usa /login para guardarla. El endpoint por defecto es https://integrate.api.nvidia.com/v1 y puedes cambiarlo con /provider nvidia <baseURL>.";case"deepseek":return`DeepSeek requiere una API key. Usa /login para guardarla. Endpoint actual: ${r}. Puedes cambiarlo con /provider deepseek <baseURL>.`;case"custom-openai":return`Custom OpenAI usa un endpoint y API key personalizados. Endpoint actual: ${r}. Usa /login para configurarlo desde cero o /provider custom-openai <baseURL> para cambiar solo el endpoint.`;case"custom-anthropic":return`Custom Anthropic usa un endpoint y API key personalizados. Endpoint actual: ${r}. Usa /login para configurarlo desde cero o /provider custom-anthropic <baseURL> para cambiar solo el endpoint.`;default:if(["xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"].includes(e)){return`${getProviderLabel(e)} requiere una API key. Usa /login para guardarla y /provider ${e} <baseURL> para cambiar el endpoint si hace falta.`}return"OpenRouter requiere una API key. Usa /login para guardarla y /provider openrouter <baseURL> para cambiar el endpoint si hace falta."}}function isUrlLike(e){const r=e.toLowerCase();return!(!r.startsWith("http://")&&!r.startsWith("https://"))||(!!r.startsWith("localhost")||(/\.[a-z]{2,}/i.test(r)||/:\d+/.test(r)||/^(\d{1,3}\.){3}\d{1,3}/.test(r)))}async function switchProvider(e){const r=g()?h({currentModel:e.currentModel,currentProvider:e.currentProvider,targetProvider:e.target,targetProfileName:e.targetProfileName}).restoredModel:V({currentModel:e.currentModel,currentProvider:e.currentProvider,targetProvider:e.target,targetProfileName:e.targetProfileName});await W(),e.context.onChangeAPIKey();const o=B(e.target)&&z(e.target)?` · perfil ${z(e.target).name}`:"";return{message:r?`Proveedor cambiado a ${getProviderLabel(e.target)}${o} - modelo restaurado: ${r}`:`Proveedor cambiado a ${getProviderLabel(e.target)}${o} - cargando modelo predeterminado`,restoredModel:r}}function isSelectedProfileReady(e,r){if(g())return f(e,r);if(!r||!B(e))return!0;const o=z(e);return!!o&&("claude"===e?H("claude",o.id):"openai"===e?H("openai",o.id):"gemini-google"===e?C():"ollama"===e||"ollama-cloud"===e||_(e,o.id))}function RemoveAllProvidersConfirmation({onDone:o,context:s}){const[d,c]=a.useState(!1);return t((e,r)=>{if(!d)return"y"===e||"Y"===e?(c(!0),void async function(e,r){try{const o=O(),a=D();if(a)u(a.provider);else{const e=G()[0];e?(T(e.id),u(e.provider)):u(null)}await J(),await W(),r.onChangeAPIKey(),e(o.length>0?`Se eliminaron correctamente todos los perfiles (${o.length}) y credenciales de los proveedores de IA.`:"Se eliminaron correctamente todas las credenciales de proveedores. No habia perfiles guardados.")}catch(r){e(`No se pudieron eliminar las credenciales y perfiles de proveedores: ${r instanceof Error?r.message:String(r)}`)}}(o,s)):void(("n"===e||"N"===e||r.escape)&&o("Eliminacion de proveedores y credenciales cancelada."))},{isActive:!0}),e(l,{title:"Eliminar todos los proveedores y perfiles",subtitle:"Esta accion elimina todos los perfiles guardados, sus credenciales asociadas y limpia todas las API keys persistidas.",onCancel:()=>{d||o("Eliminacion de proveedores y credenciales cancelada.")},color:"error",inputGuide:()=>e(n,{children:"y: confirmar eliminacion total · n/Esc: cancelar"}),children:r(i,{flexDirection:"column",children:[e(n,{children:"Se borraran todas las credenciales (API keys / OAuth) y perfiles persistidos de todos los proveedores."}),e(n,{dimColor:!0,children:"Esta accion es irreversible y te desconectara de todos los servicios de IA."}),d?e(n,{children:"Eliminando configuraciones..."}):null]})})}export async function call(r,o,a){const i=a?.trim(),n=i?.split(/\s+/).filter(Boolean)??[],t=n[0]?.toLowerCase(),l=n[1]?.toLowerCase();if("clear"===t&&"all"===l&&2===n.length||"clear-all"===t&&1===n.length||"clear"===t&&1===n.length||"remove"===t&&"all"===l&&2===n.length)return e(RemoveAllProvidersConfirmation,{onDone:r,context:o});if("list"===t){const e=g(),o=e?v():null,a=e?Object.values(o.providers).flat():G(),i=e?o.activeProfile:D(),n=e?o.providers:a.reduce((e,r)=>(e[r.provider]||(e[r.provider]=[]),e[r.provider].push(r),e),{});let t="\n"+Y.cyan.bold(" +----------------------------------------------------------+")+"\n";t+=Y.cyan.bold(" | ")+Y.white.bold("GESTIÓN DE PROVEEDORES Y CUENTAS")+Y.cyan.bold(" |")+"\n",t+=Y.cyan.bold(" +----------------------------------------------------------+")+"\n";const l=N.filter(e=>e.implemented);for(const e of l){const r=e.id,o=n[r]??[];if(t+=`\n ${Y.magenta.bold("♦")}${Y.bgMagenta.white.bold(" "+e.label.toUpperCase()+" ")}${Y.magenta.bold("♦")} ${Y.dim("("+r+")")}\n`,0===o.length){const e=isProviderConfigured(r)?Y.green("● Configurado (sin perfil creado)"):Y.yellow("○ Sin perfiles");t+=` ${Y.dim("•")} ${Y.white("sin perfiles".padEnd(15))} ${e}\n`;continue}for(const e of o){const r=e.id===i?.id;let o=!1;o="claude"===e.provider||"openai"===e.provider?!!Z(e.provider,e.id):"ollama"===e.provider||"ollama-cloud"===e.provider||_(e.provider,e.id);t+=` ${r?Y.cyan("●"):Y.dim("○")} ${r?Y.cyan.bold(e.name.padEnd(15)):Y.white(e.name.padEnd(15))} ${o?Y.green("● Conectado"):Y.red("○ Desconectado")} ${r?Y.bgCyan.black(" ACTUAL "):""}\n`,e.baseUrl&&(t+=` ${Y.dim("+-")} ${Y.blue("→")} ${Y.dim(e.baseUrl)}\n`)}}return t+="\n"+Y.cyan.bold(" ► Guía rápida:")+"\n",t+=` ${Y.dim("•")} Cambiar perfil: ${Y.yellow("/provider [id] perfil [nombre]")}\n`,t+=` ${Y.dim("•")} Nueva cuenta: ${Y.yellow("/login --profile [nombre]")}\n`,t+=` ${Y.dim("•")} Ver actual: ${Y.yellow("/provider current")}\n`,t+=` ${Y.dim("•")} Limpiar todo: ${Y.yellow("/provider clear all")}\n`,r(t),null}if("current"===t){const e=g()?p().activeProfile:D();if(!e)return r(Y.yellow("No hay un perfil de proveedor activo configurado.")),null;const o=j(e.provider);let a=`\n${Y.cyan.bold("Perfil actual:")}\n`;return a+=`${Y.white("Proveedor:")} ${Y.magenta(o.label)}\n`,a+=`${Y.white("Nombre:")} ${Y.cyan(e.name)}\n`,e.baseUrl&&(a+=`${Y.white("Endpoint:")} ${Y.blue(e.baseUrl)}\n`),r(a),null}const s=function(e){if(g())return b(e);if(e)switch(e.trim().toLowerCase()){case"z.ai":case"z-ai":return"zai";case"open-router":return"openrouter";case"ollama-cloud":case"ollama_cloud":case"ollamacloud":return"ollama-cloud";case"gemini":case"gemini-api-key":case"google-ai":case"google-ai-studio":return"gemini-api";case"gemini-google":case"google":case"google-oauth":return"gemini-google";default:return e.trim().toLowerCase()}}(t);if(s){if(!N.find(e=>e.id===s))return r(`Proveedor no reconocido: ${s}. Opciones: ${N.map(e=>e.id).join(", ")}`),null;const a=function(e,r){if(!r||!B(e))return null;const o=r.trim().split(/\s+/).filter(Boolean);if(o.length<2)return null;if("profile"===o[1]?.toLowerCase()||"perfil"===o[1]?.toLowerCase())return o.slice(2).join(" ").trim()||null;const a=o[1];return["set","set-url","base-url","baseurl","url","endpoint","clear","reset","default","restore"].includes(a.toLowerCase())||isUrlLike(a)?null:a}(s,i);if(a&&B(s)&&(g()?P(s,a):q(s,a)),!("claude"!==s||H("claude")&&isSelectedProfileReady(s,a)))return F(r,o);if(!("openai"!==s||A()&&isSelectedProfileReady(s,a)))return K(r,o);const n=function(e,r){if(!r||!isConfigurableBaseUrlProvider(e))return{};const o=r.trim().split(/\s+/).filter(Boolean);if(o.length<2)return{};if("profile"===o[1]?.toLowerCase()||"perfil"===o[1]?.toLowerCase())return{};const a=o[1]?.toLowerCase(),i=["set","set-url","base-url","baseurl","url","endpoint"].includes(a),n=(i?o.slice(2):o.slice(1)).join(" ").trim();return n?["clear","reset","default","restore"].includes(n.toLowerCase())?{clear:!0}:i||isUrlLike(n)?{baseUrl:n}:{}:{}}(s,i);let t=null;if(n.clear&&isConfigurableBaseUrlProvider(s))k(s),t=`Base URL de ${getProviderLabel(s)} restaurada a ${getCurrentProviderBaseUrl(s)}`;else if(n.baseUrl&&isConfigurableBaseUrlProvider(s))try{const e=R(s,n.baseUrl);t=`Base URL de ${getProviderLabel(s)} guardada: ${e}`}catch(e){return r(e instanceof Error?e.message:`No se pudo guardar la base URL para ${getProviderLabel(s)}.`),null}return isProviderConfigured(s)&&isSelectedProfileReady(s,a)?e(SwitchProviderOnMount,{onDone:r,context:o,target:s,baseUrlMessage:t,targetProfileName:a}):(r(function(e,r){if("claude"===e)return"Redirigiendo a inicio de sesion de Claude...";if("openai"===e)return"Redirigiendo a inicio de sesion de OpenAI...";const o=isConfigurableBaseUrlProvider(e)?getProviderSetupMessage(e):null;return r&&o?`${r} - ${o}`:r??o??`Proveedor preparado: ${getProviderLabel(e)}`}(s,t)),null)}return e(ProviderPicker,{onDone:r,context:o})}function SwitchProviderOnMount({onDone:e,context:r,target:o,baseUrlMessage:i,targetProfileName:n}){const t=s(),l=d();return a.useEffect(()=>{(async()=>{try{const a=await switchProvider({context:r,currentModel:t,currentProvider:y(),target:o,targetProfileName:n});l(e=>({...e,mainLoopModel:a.restoredModel,mainLoopModelForSession:null})),e(i?`${i} - ${a.message}`:a.message)}catch(r){const o=r instanceof Error?r.message:String(r);e(`No se pudo cambiar de proveedor: ${o}`)}})()},[i,r,t,e,l,o,n]),null}function ProviderPicker({onDone:a,context:t}){const l=s(),u=d(),p=y(),m=c(),g=N.filter(e=>e.implemented).map(e=>{const r="claude"===e.id&&"firstParty"===p||e.id===p,o=isProviderConfigured(e.id),a=r?" [active]":o?" [ready]":" [setup]";return{label:`${e.label}${a}`,value:e.id}});const f=m??("firstParty"===p?"claude":p);return r(i,{flexDirection:"column",gap:1,children:[e(n,{bold:!0,color:"cyan",children:"Selecciona el proveedor de IA para Context Code:"}),e(n,{dimColor:!0,children:"Puedes usar la API oficial de Claude, OpenAI o proveedores compatibles con OpenAI."}),e(o,{options:g,defaultValue:f,onChange:async function(e){try{const r=e;if("claude"===r&&!H("claude"))return void a("No hay sesión de Claude. Lanzando /login...",{nextInput:"/login",submitNextInput:!0});if("openai"===r&&!A())return void a("No hay sesión de OpenAI. Lanzando /login-openai...",{nextInput:"/login-openai",submitNextInput:!0});if(!isProviderConfigured(r))return void a(getProviderSetupMessage(r));const o=await switchProvider({context:t,currentModel:l,currentProvider:p,target:r});u(e=>({...e,mainLoopModel:o.restoredModel,mainLoopModelForSession:null})),a(o.message)}catch(e){const r=e instanceof Error?e.message:String(e);a(`No se pudo cambiar de proveedor: ${r}`)}}}),r(i,{marginTop:1,flexDirection:"column",children:[r(n,{dimColor:!0,children:["- Usa ",e(n,{bold:!0,children:"/login"})," para configurar las API keys."]}),r(n,{dimColor:!0,children:["- Usa ",e(n,{bold:!0,children:"/provider openrouter https://..."})," para guardar una base URL personalizada."]}),r(n,{dimColor:!0,children:["- ",e(n,{bold:!0,children:"Ollama"})," usa ",getCurrentProviderBaseUrl("ollama")," por defecto."]})]})]})}
|