goatchain-cli 0.0.66-beta.0 → 0.0.66-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/ink.mjs +13 -13
  2. package/package.json +6 -6
package/dist/ink.mjs CHANGED
@@ -1111,7 +1111,7 @@ ${epoch}`).digest("hex");return record4.cachedPromptCacheKey={signature,value},v
1111
1111
  `}function writeLine2(filePath,line){try{appendFileSync2(filePath,line)}catch{}}function debugLogPath2(){let raw=readPrefixedEnv2(void 0,"DEBUG_LOG");if(raw)return raw;let dir=logsDir2();return ensureDir2(dir),path32.join(dir,"dimcode-debug.log")}function debugLog2(eventName,payload){if(!isDebugEnabled2())return;writeLine2(debugLogPath2(),formatLine2(eventName,payload))}function debugLogSubagent(eventName,payload){if(!isDebugEnabled2())return;let dir=logsDir2();ensureDir2(dir);let filePath=path32.join(dir,"subagent-events.log");writeLine2(filePath,formatLine2(eventName,payload))}function readCliRuntimeConfig(env,configOpts){return resolveRuntimeConfigFromEnv(env,configOpts)}function buildRuntimeConfigFromContext(context,configOpts){let rc=context.runtimeConfig;if(!rc)return resolveRuntimeConfigFromEnv(context.env,configOpts);return{modelId:rc.modelId,...rc.adapter?{adapter:rc.adapter}:{},...rc.provider?{provider:rc.provider}:{},...rc.baseUrl?{baseUrl:rc.baseUrl}:{},...configOpts?.baseUrl&&!rc.baseUrl?{baseUrl:configOpts.baseUrl}:{},...rc.apiKey?{apiKey:rc.apiKey}:{},...rc.nextApiOAuth?{nextApiOAuth:!0}:{},...rc.responsesAutoPromptCacheKey?{responsesAutoPromptCacheKey:!0}:{},...rc.responsesUseSessionId?{responsesUseSessionId:!0}:{},...rc.modelCapabilities?{modelCapabilities:rc.modelCapabilities}:{},...rc.maxInputTokens?{maxInputTokens:rc.maxInputTokens}:{},...rc.maxOutputTokens?{maxOutputTokens:rc.maxOutputTokens}:{}}}function buildCliCreateAgentRuntimeOptions(opts){let configOpts=opts.baseUrl?{baseUrl:opts.baseUrl}:void 0,runtimeConfig=buildRuntimeConfigFromContext(opts.context,configOpts);return{systemPrompt:opts.context.system,modelId:runtimeConfig.modelId,adapter:runtimeConfig.adapter,provider:runtimeConfig.provider,baseUrl:runtimeConfig.baseUrl,apiKey:runtimeConfig.apiKey,nextApiOAuth:runtimeConfig.nextApiOAuth,responsesAutoPromptCacheKey:runtimeConfig.responsesAutoPromptCacheKey,responsesUseSessionId:runtimeConfig.responsesUseSessionId,modelCapabilities:runtimeConfig.modelCapabilities,maxInputTokens:runtimeConfig.maxInputTokens,maxOutputTokens:runtimeConfig.maxOutputTokens,stateDir:opts.stateDir,cliTools:!0,delegateTasks:!0,...opts.tools?{tools:opts.tools}:{},...opts.mcpServers?{mcpServers:opts.mcpServers}:{},...opts.mcpInitialState?{mcpInitialState:opts.mcpInitialState}:{},resolveRuntimeConfig:(input)=>{let current=buildRuntimeConfigFromContext(opts.context,configOpts),persistedWithoutTokenLimits=input.persisted?{...input.persisted,maxInputTokens:void 0,maxOutputTokens:void 0}:void 0;return input.requested?mergeRuntimeConfig(input.current??current,input.requested,{preferSourceMaxInputTokens:!0}):mergeRuntimeConfig(current,persistedWithoutTokenLimits,{preferSourceMaxInputTokens:!1})}}}async function createCliRuntime(opts){return await createAgentRuntime(buildCliCreateAgentRuntimeOptions(opts))}var RUNTIME_SESSION_METADATA_KEY2="dimAgentRuntime",DEBUG_LOG_FILE_NAME="<session-id>.jsonl";function createDefaultDebugLogState(){let directory=path33.join(os6.homedir(),".dimcode","debug");return{enabled:!1,directory,logFilePath:path33.join(directory,DEBUG_LOG_FILE_NAME)}}function normalizeText9(value){return String(value??"").trim()}function normalizeModeId(value){return value==="plan"?"plan":"agent"}function normalizeToolApprovalMode(value){if(value==="auto"||value==="normal"||value==="strict")return value;if(value==="all")return"auto";return}function cloneJson(value){return JSON.parse(JSON.stringify(value??null))}function cloneMetadata2(value){return value?cloneJson(value):void 0}function cloneEnvRecord3(source){return Object.entries(source??{}).reduce((next,[key,value])=>{return next[key]=value,next},{})}function readTruthyFlag(value){let normalized=normalizeText9(value).toLowerCase();return normalized==="1"||normalized==="true"||normalized==="yes"||normalized==="on"}function readNoInteractionFlag(config3){return readTruthyFlag(config3?.env?.DIMCODE_NO_INTERACTION)}function runtimeConfigsMatch(left,right){return normalizeText9(left?.modelId)===normalizeText9(right?.modelId)&&normalizeText9(left?.adapter)===normalizeText9(right?.adapter)&&normalizeText9(left?.provider)===normalizeText9(right?.provider)&&normalizeText9(left?.baseUrl)===normalizeText9(right?.baseUrl)&&normalizeText9(left?.apiKey)===normalizeText9(right?.apiKey)&&Boolean(left?.nextApiOAuth)===Boolean(right?.nextApiOAuth)&&Boolean(left?.responsesAutoPromptCacheKey)===Boolean(right?.responsesAutoPromptCacheKey)&&Boolean(left?.responsesUseSessionId)===Boolean(right?.responsesUseSessionId)&&JSON.stringify(cloneModelCapabilities(left?.modelCapabilities)??null)===JSON.stringify(cloneModelCapabilities(right?.modelCapabilities)??null)&&Number(left?.maxInputTokens??0)===Number(right?.maxInputTokens??0)&&Number(left?.maxOutputTokens??0)===Number(right?.maxOutputTokens??0)&&readNoInteractionFlag(left)===readNoInteractionFlag(right)}function mcpServersMatch(left,right){return JSON.stringify(left??[])===JSON.stringify(right??[])}function parseRuntimeConfig(raw,fallback){let record4=raw??{},persisted={modelId:normalizeText9(record4.modelId)||fallback.modelId,...normalizeText9(record4.adapter)?{adapter:normalizeText9(record4.adapter)}:{},...normalizeText9(record4.provider)?{provider:normalizeText9(record4.provider)}:{},...normalizeText9(record4.baseUrl)?{baseUrl:normalizeText9(record4.baseUrl)}:{},...record4.nextApiOAuth===!0?{nextApiOAuth:!0}:{},...record4.responsesAutoPromptCacheKey===!0?{responsesAutoPromptCacheKey:!0}:{},...record4.responsesUseSessionId===!0?{responsesUseSessionId:!0}:{},...cloneModelCapabilities(record4.modelCapabilities)?{modelCapabilities:cloneModelCapabilities(record4.modelCapabilities)}:{},...Number(record4.maxInputTokens)>0?{maxInputTokens:Number(record4.maxInputTokens)}:{},...Number(record4.maxOutputTokens)>0?{maxOutputTokens:Number(record4.maxOutputTokens)}:{}};return mergeRuntimeConfig(fallback,{...persisted,maxInputTokens:void 0,maxOutputTokens:void 0},{preferSourceMaxInputTokens:!1})}function readRuntimeEnvelopeFromSnapshot(snapshot,fallback){let runtimeMeta=(snapshot?.metadata??{})[RUNTIME_SESSION_METADATA_KEY2]??{},runtimeConfig=runtimeMeta.runtimeConfig??{};return{runtimeConfig:snapshot?parseRuntimeConfig(runtimeMeta.runtimeConfig,{...fallback,modelId:normalizeText9(runtimeConfig.modelId)||fallback.modelId}):null,modeId:normalizeModeId(runtimeMeta.modeId),toolApprovalMode:normalizeToolApprovalMode(runtimeMeta.toolApprovalMode),mcpServers:Array.isArray(runtimeMeta.mcpServers)?cloneJson(runtimeMeta.mcpServers):[]}}function createCliAgent(opts){let stateDir=path33.resolve(opts.stateDir),pendingMode="agent",runtimePromise=null,resolvedRuntime=null,facadeDebugLogState=createDefaultDebugLogState(),pendingRuntimeConfigReloads=new Set,getStateEnv=()=>({...cloneEnvRecord3(opts.context.env??{}),...cloneEnvRecord3(opts.processEnv)}),getRuntimeConfig=()=>{let rc=opts.context.runtimeConfig;if(rc)return{modelId:rc.modelId,...rc.adapter?{adapter:rc.adapter}:{},...rc.provider?{provider:rc.provider}:{},...rc.baseUrl?{baseUrl:rc.baseUrl}:{},...!rc.baseUrl&&opts.baseUrl?{baseUrl:opts.baseUrl}:{},...rc.apiKey?{apiKey:rc.apiKey}:{},...rc.nextApiOAuth?{nextApiOAuth:!0}:{},...rc.responsesAutoPromptCacheKey?{responsesAutoPromptCacheKey:!0}:{},...rc.responsesUseSessionId?{responsesUseSessionId:!0}:{},...rc.modelCapabilities?{modelCapabilities:rc.modelCapabilities}:{},...rc.maxInputTokens?{maxInputTokens:rc.maxInputTokens}:{},...rc.maxOutputTokens?{maxOutputTokens:rc.maxOutputTokens}:{}};return readCliRuntimeConfig({...getStateEnv(),...cloneEnvRecord3(typeof process<"u"?process.env:void 0)},{baseUrl:opts.baseUrl})},logSessionPersistence=(sessionId)=>{let normalizedSessionId=normalizeText9(sessionId);if(!normalizedSessionId)return;debugLog2("cli.session.persistence",{sessionId:normalizedSessionId,stateDir,snapshotPath:runtimeSnapshotPath(stateDir,normalizedSessionId)})},ensureRuntime=async()=>{if(runtimePromise)return await runtimePromise;runtimePromise=(async()=>{let runtime=await createCliRuntime({context:opts.context,stateDir,processEnv:opts.processEnv,tools:opts.tools,mcpServers:opts.mcpServers,mcpInitialState:opts.mcpInitialState});return resolvedRuntime=runtime,facadeDebugLogState=runtime.getDebugLogState(),runtime})();try{return await runtimePromise}catch(error41){throw runtimePromise=null,resolvedRuntime=null,error41}},runtimeSessions={list:async(options)=>{let runtime=await ensureRuntime();if(options)return await runtime.sessions.list(options);return await runtime.sessions.list()},get:async(sessionId)=>(await ensureRuntime()).sessions.get(sessionId),create:async(input)=>(await ensureRuntime()).sessions.create(input),createWithMessages:async(messages,input)=>await(await ensureRuntime()).sessions.createWithMessages(messages,input),destroy:async(sessionId)=>await(await ensureRuntime()).sessions.destroy(sessionId),rename:async(sessionId,title)=>await(await ensureRuntime()).sessions.rename(sessionId,title),updateMetadata:async(sessionId,metadata)=>await(await ensureRuntime()).sessions.updateMetadata(sessionId,metadata),interrupt:async(sessionId)=>await(await ensureRuntime()).sessions.interrupt(sessionId),getUsageSummary:async(sessionId)=>await(await ensureRuntime()).sessions.getUsageSummary(sessionId),getUsageLedger:async(sessionId)=>await(await ensureRuntime()).sessions.getUsageLedger(sessionId),getTurnUsage:async(sessionId,turnId)=>await(await ensureRuntime()).sessions.getTurnUsage(sessionId,turnId),listTurnUsages:async(sessionId)=>await(await ensureRuntime()).sessions.listTurnUsages(sessionId),listRequestUsages:async(sessionId,filter2)=>await(await ensureRuntime()).sessions.listRequestUsages(sessionId,filter2)},runtimeFacade={sessions:runtimeSessions,listSessions:async(options)=>{let runtime=await ensureRuntime();if(options)return await runtime.listSessions(options);return await runtime.listSessions()},openSession:async(sessionId)=>await(await ensureRuntime()).openSession(sessionId),createSession:async(input)=>await(await ensureRuntime()).createSession(input),destroySession:async(sessionId)=>await(await ensureRuntime()).destroySession(sessionId),getSessionState:async(sessionId)=>await(await ensureRuntime()).getSessionState(sessionId),replaceSessionSnapshot:async(sessionId,snapshot,update)=>{await(await ensureRuntime()).replaceSessionSnapshot(sessionId,snapshot,update)},persistSession:async(sessionId)=>{await(await ensureRuntime()).persistSession(sessionId)},unloadSession:async(sessionId,options)=>await(await ensureRuntime()).unloadSession(sessionId,options),runSubagent:(spec)=>runSubagentViaFacade(spec),getSessionHandle:async(sessionId)=>await(await ensureRuntime()).getSessionHandle(sessionId),getMcpState:async()=>await(await ensureRuntime()).getMcpState(),syncMcpServers:async(configs)=>await(await ensureRuntime()).syncMcpServers(configs),getDebugLogState:()=>resolvedRuntime?.getDebugLogState()??{...facadeDebugLogState},setDebugLogState:async(update)=>{let next=await(await ensureRuntime()).setDebugLogState(update);return facadeDebugLogState=next,next}};function runSubagentViaFacade(spec){let placeholderId=`subagent-pending-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`,resolvedHandle=null,cancelQueued=!1,resultPromise=(async()=>{let handle=(await ensureRuntime()).runSubagent(spec);if(resolvedHandle=handle,cancelQueued)handle.cancel();return await handle.result})();return{get subagentId(){return resolvedHandle?.subagentId??placeholderId},...spec.ownerSessionId?{ownerSessionId:spec.ownerSessionId}:{},get status(){return resolvedHandle?.status??"pending"},cancel:(reason)=>{if(resolvedHandle)resolvedHandle.cancel(reason);else cancelQueued=!0},result:resultPromise}}let openSession=async(sessionId)=>{let normalizedSessionId=normalizeText9(sessionId);if(!normalizedSessionId)return;return await(await ensureRuntime()).openSession(normalizedSessionId)},ensureSession=async(input)=>{let requestedSessionId=normalizeText9(input?.sessionId),runtime=requestedSessionId?await ensureRuntime():await ensureRuntime(),nextMode=normalizeModeId(input?.modeId??pendingMode),nextCwd=normalizeText9(input?.cwd)||normalizeText9(opts.context.cwd)||process.cwd(),nextRuntimeConfig=input?.runtimeConfig??getRuntimeConfig(),hasToolApprovalMode=Object.prototype.hasOwnProperty.call(input??{},"toolApprovalMode"),nextToolApprovalMode=normalizeToolApprovalMode(input?.toolApprovalMode),forceNoInteractionRuntimeConfigUpdate=readNoInteractionFlag(nextRuntimeConfig),hasMcpServers=Array.isArray(input?.mcpServers),nextMcpServers=Array.isArray(input?.mcpServers)?cloneJson(input.mcpServers):void 0,nextMetadata=cloneMetadata2(input?.metadata);if(requestedSessionId){let existing=await runtime.openSession(requestedSessionId);if(existing){let snapshot=await runtime.sessions.get(existing.id),envelope=readRuntimeEnvelopeFromSnapshot(snapshot,nextRuntimeConfig),runtimeMcpState=await runtime.getMcpState(),update={};if(normalizeText9(snapshot?.cwd)!==nextCwd)update.cwd=nextCwd;if(pendingRuntimeConfigReloads.delete(existing.id)||forceNoInteractionRuntimeConfigUpdate||!runtimeConfigsMatch(envelope.runtimeConfig,nextRuntimeConfig))update.runtimeConfig=nextRuntimeConfig;if(envelope.modeId!==nextMode)await existing.setMode(nextMode);if(hasToolApprovalMode&&envelope.toolApprovalMode!==nextToolApprovalMode)update.toolApprovalMode=nextToolApprovalMode;if(hasMcpServers&&Array.isArray(nextMcpServers)&&!mcpServersMatch(runtimeMcpState?.configs??envelope.mcpServers,nextMcpServers))update.mcpServers=nextMcpServers;if(nextMetadata)update.metadata=nextMetadata;if(Object.keys(update).length>0)await existing.updateConfig(update);return logSessionPersistence(existing.id),existing}}let created=await runtime.createSession({sessionId:requestedSessionId||void 0,cwd:nextCwd,modeId:nextMode,runtimeConfig:nextRuntimeConfig,...hasToolApprovalMode?{toolApprovalMode:nextToolApprovalMode}:{},...hasMcpServers?{mcpServers:nextMcpServers}:{},...nextMetadata?{metadata:nextMetadata}:{}});return logSessionPersistence(created.id),created};return{runtime:runtimeFacade,sessions:runtimeSessions,openSession,ensureSession,async steerSession(sessionId,input){let session=await openSession(sessionId);if(!session)return!1;return await session.steer(input)},setMode(modeId){pendingMode=normalizeModeId(modeId)},getMode(){return pendingMode},async triggerManualCompression(sessionId,options){let normalizedSessionId=normalizeText9(sessionId);if(!(normalizedSessionId?await openSession(normalizedSessionId):null))return{success:!1,error:normalizedSessionId?`Session not found: ${normalizedSessionId}`:"Manual compaction requires an active session id"};return await(await ensureSession({...options,sessionId:normalizedSessionId})).triggerManualCompaction()},invalidateSession(sessionId){let id=normalizeText9(sessionId);if(id)pendingRuntimeConfigReloads.add(id)},async getMcpState(){return await(await ensureRuntime()).getMcpState()},async syncMcpServers(configs){return await(await ensureRuntime()).syncMcpServers(configs)},async getDebugLogState(){return runtimeFacade.getDebugLogState()},async setDebugLogState(update){return await runtimeFacade.setDebugLogState(update)}}}function shouldInferCustomProviderFallbackMetadata2(adapter){if(!adapter)return!0;return adapter==="openai"||adapter==="openai-responses"||adapter==="gemini"||adapter==="anthropic"}function hasConfiguredModelMetadata(model){let limit=model.limit??{},hasContext=typeof limit.context==="number"&&Number.isFinite(limit.context),hasOutput=typeof limit.output==="number"&&Number.isFinite(limit.output);return hasContext||hasOutput||model.userDefined===!0||model.outputIsUserDefined===!0||typeof model.vision==="boolean"||model.reasoning?.supported===!0||model.extra_capabilities?.reasoning?.supported===!0}function inferCustomModelLimit(modelId,adapter){if(!shouldInferCustomProviderFallbackMetadata2(adapter))return;return getCustomProviderModelFallbackLimitForModelId(modelId)}function backfillCustomProviderModels(models,opts={}){if(!shouldInferCustomProviderFallbackMetadata2(opts.adapter))return[...models];let onlyIds=opts.onlyIds;return models.map((model)=>{let id=String(model?.id??"").trim();if(!id)return model;if(onlyIds&&!onlyIds.has(id))return model;if(hasConfiguredModelMetadata(model))return model;let currentLimit=model.limit??{},hasContext=typeof currentLimit.context==="number"&&Number.isFinite(currentLimit.context),hasOutput=typeof currentLimit.output==="number"&&Number.isFinite(currentLimit.output),hasVision=typeof model.vision==="boolean",hasReasoning=model.reasoning?.supported===!0,hasExtraReasoning=model.extra_capabilities?.reasoning?.supported===!0,inferredLimit=hasContext&&hasOutput?void 0:inferCustomModelLimit(id,opts.adapter),inferredCapabilities=hasVision&&hasReasoning?void 0:getCustomProviderModelFallbackCapabilitiesForModelId(id),inferredExtraReasoning=hasExtraReasoning?void 0:getCustomProviderModelFallbackReasoningEffortCapability(id),nextLimit={...currentLimit,...!hasContext&&typeof inferredLimit?.context==="number"?{context:inferredLimit.context}:{},...!hasOutput&&typeof inferredLimit?.output==="number"?{output:inferredLimit.output}:{}};return{...model,...Object.keys(nextLimit).length>0?{limit:nextLimit}:{},...!hasVision&&typeof inferredCapabilities?.vision==="boolean"?{vision:inferredCapabilities.vision}:{},...!hasReasoning&&inferredCapabilities?.reasoning?.supported?{reasoning:inferredCapabilities.reasoning}:{},...!hasExtraReasoning&&inferredExtraReasoning?{extra_capabilities:{...model.extra_capabilities??{},reasoning:inferredExtraReasoning}}:{}}})}var SYSTEM_SECTION_IDS=["system.sections.security","system.sections.code-safety","system.sections.url-policy","system.sections.tone-and-style","system.sections.professional-objectivity","system.sections.engineering-approach","system.sections.git-and-execution-guardrails","system.sections.doing-tasks","system.sections.capability-aware-guidance","system.sections.code-references"];function joinPromptSections(sections){return sections.filter((section)=>typeof section==="string"&&section.trim().length>0).map((section)=>section.trim()).join(`
1112
1112
 
1113
1113
  `)}var DIMCODE_SHARED_SYSTEM_PROMPT=joinPromptSections(SYSTEM_SECTION_IDS.map((promptId)=>renderPrompt(promptId)));function buildDimCodeSystemPrompt(options){return joinPromptSections([options?.intro??renderPrompt("system.intro.default"),DIMCODE_SHARED_SYSTEM_PROMPT,...options?.extraSections??[]])}var DIMCODE_SYSTEM_PROMPT=buildDimCodeSystemPrompt();function readOptionalString3(value){if(typeof value==="string")return value.trim()||void 0;if(typeof value==="number"||typeof value==="boolean")return String(value).trim()||void 0;return}function readOptionalNumber2(value){if(typeof value==="number"&&Number.isFinite(value))return value;if(typeof value==="string"){let trimmed=value.trim();if(!trimmed)return;let parsed=Number(trimmed);return Number.isFinite(parsed)?parsed:void 0}return}var RUNTIME_ENV_KEYS=new Set(["DIMCODE_NO_INTERACTION"]);function isTruthyFlag2(value){let normalized=String(value??"").trim().toLowerCase();return normalized==="1"||normalized==="true"||normalized==="yes"||normalized==="on"}function resolveSystemPrompt(env){if(!isTruthyFlag2(env.DIMCODE_NO_INTERACTION))return DIMCODE_SYSTEM_PROMPT;return buildDimCodeSystemPrompt({intro:"You are DimCode, a non-interactive CLI coding agent running a one-shot software engineering task.",extraSections:[["# Non-interactive execution","This run is operating in non-interactive agent mode.","Tool approvals are already handled automatically.","Do not ask the user follow-up questions and do not rely on AskUserQuestion being available.","Make reasonable assumptions from the repository, the prompt, and available tool output so you can complete the task in one pass when practical.","Only stop early for a real external blocker or a genuinely unsafe ambiguity that cannot be resolved from local context.","When you make an important assumption, state it briefly in the final response."].join(`
1114
- `)]})}async function createDimcodeContext(opts){let fastStartRaw=String(opts.env.DIMCODE_FAST_START??"").trim().toLowerCase(),fastStart=fastStartRaw==="1"||fastStartRaw==="true"||fastStartRaw==="yes"||fastStartRaw==="on",version3=readOptionalString3("0.0.66-beta.0")??(fastStart?null:await readRepoPackageVersion(opts.cwd)),resolveToolsPath=async()=>{let[{homedir:homedir3},path34]=await Promise.all([import("node:os"),import("node:path")]),dimcodeHome=readOptionalString3(opts.env.DIMCODE_HOME);if(dimcodeHome){let dir2=path34.resolve(dimcodeHome);return{dir:dir2,filePath:path34.join(dir2,"tools.json")}}let dir=path34.resolve(homedir3(),".dimcode");return{dir,filePath:path34.join(dir,"tools.json")}},[loadedCache,loadedConfig,loadedTools,loadedMcp]=fastStart?await(async()=>{let[cacheDir,configDir,toolsPath,path34]=await Promise.all([getDimcodeUserDir(opts.env),getDimcodeConfigDir(opts.env),resolveToolsPath(),import("node:path")]),cacheFile=path34.join(cacheDir,"cache.json"),configFile=path34.join(configDir,"config.json"),mcpJsonFile=path34.join(toolsPath.dir,"mcp.json");return[{dir:cacheDir,filePath:cacheFile,cache:{version:1,updatedAt:0}},{dir:configDir,filePath:configFile,config:{version:1,updatedAt:0}},{dir:toolsPath.dir,filePath:toolsPath.filePath,tools:{version:1,updatedAt:0}},{dir:toolsPath.dir,filePath:mcpJsonFile,servers:[]}]})():await Promise.all([loadDimcodeUserCache(opts.env),loadDimcodeUserConfig(opts.env),loadDimcodeUserTools(opts.env),loadMcpJson(opts.env)]),cache=loadedCache.cache,config3=loadedConfig.config,saved=cache.settings??{},savedConfig=config3.settings??{},savedCwd=readOptionalString3(saved.cwd),savedFocusFiles=Array.isArray(saved.focusFiles)?saved.focusFiles.map((file2)=>String(file2??"")).filter(Boolean):void 0,cwd=opts.cwd||savedCwd||".",v2=(key)=>readOptionalString3(opts.env[key]),explicitRuntimeEnv=Object.fromEntries(Object.entries(opts.env).flatMap(([key,value])=>{let canonical=String(key??"").trim(),normalized=readOptionalString3(value);if(!canonical||!RUNTIME_ENV_KEYS.has(canonical)||!normalized)return[];return[[canonical,normalized]]})),applyRuntimeEnvIfMissing=(target,key,source)=>{let value=source[key];if(!value||target[key])return;target[key]=value},mergedEnv={DIMCODE_VERSION:version3??"dev",...v2("DIMCODE_STARTUP_TOAST")?{DIMCODE_STARTUP_TOAST:v2("DIMCODE_STARTUP_TOAST")}:{}},savedProviderId=normalizeProviderId(savedConfig.providerId),savedConnections=savedConfig.providerConnections??{},savedActiveModelByProvider=savedConfig.activeModelByProvider??{},normalizedSavedCustomProviders=(Array.isArray(savedConfig.customProviders)?savedConfig.customProviders:[]).map((provider)=>{let adapter2=String(provider?.adapter??"").trim(),models=Array.isArray(provider?.models)?backfillCustomProviderModels(provider.models,{adapter:adapter2}):provider?.models;return{...provider,...Array.isArray(models)?{models}:{}}}),legacyCustom=savedConfig.customProvider??{},legacyBaseUrl=readOptionalString3(legacyCustom?.baseUrl),legacyApiKey=readOptionalString3(legacyCustom?.apiKey),rawProviderId=(()=>{if(isLegacyCustomProviderId(savedProviderId)&&normalizedSavedCustomProviders.length){let fallbackId=readOptionalString3(normalizedSavedCustomProviders[0]?.id);if(fallbackId){if(config3.settings)config3.settings.providerId=fallbackId;return fallbackId}}return savedProviderId})(),{candidates,existingProviderIds}=buildProviderSelectionCandidates({connections:savedConnections,customProviders:normalizedSavedCustomProviders,legacyCustom,rememberedModels:{...savedActiveModelByProvider}}),rememberedModels=stripUnknownActiveModelSelections({...savedActiveModelByProvider},existingProviderIds),selection=resolveProviderSelection({candidates,preferredProviderId:rawProviderId,rememberedModels}),providerId=readOptionalString3(selection.providerId),providerModel=readOptionalString3(selection.modelId);if(config3.settings)if(providerId)config3.settings.providerId=providerId;else delete config3.settings.providerId;let customProvider=isCustomProviderId(providerId)?normalizedSavedCustomProviders.find((p2)=>String(p2?.id??"").trim()===providerId):void 0,builtin=providerId&&!isCustomProviderId(providerId)&&!isLegacyCustomProviderId(providerId)?getBuiltinProvider(providerId):void 0,savedConnection=savedConnections[providerId??""],savedConnectionBaseUrl=readOptionalString3(savedConnection?.baseUrl),builtinBaseUrl=readOptionalString3(getProviderBaseUrl(builtin)),adapter=isCustomProviderId(providerId)?String(customProvider?.adapter??"").trim():isLegacyCustomProviderId(providerId)?"openai":providerId==="openai"&&savedConnectionBaseUrl&&savedConnectionBaseUrl!==builtinBaseUrl?"openai":getProviderAdapter(builtin),providerBaseUrl=isCustomProviderId(providerId)?readOptionalString3(customProvider?.baseUrl):isLegacyCustomProviderId(providerId)?legacyBaseUrl:readOptionalString3(resolveBuiltinProviderBaseUrl(builtin,savedConnection?.baseUrl)),providerApiKey=isCustomProviderId(providerId)?readOptionalString3(customProvider?.apiKey):isLegacyCustomProviderId(providerId)?legacyApiKey:readOptionalString3(savedConnection?.apiKey),modelCapabilityFallbackModels=isCustomProviderId(providerId)||isLegacyCustomProviderId(providerId)||builtin?.customModels?listCustomProviderModelFallbackModels():void 0,resolvedModelContextWindow=resolveProviderSelectionContextWindow({providerId,modelId:providerModel,connections:savedConnections,customProviders:normalizedSavedCustomProviders}),resolvedModelMaxOutputTokens=resolveProviderSelectionMaxOutputTokens({providerId,modelId:providerModel,connections:savedConnections,customProviders:normalizedSavedCustomProviders});if(isLegacyCustomProviderId(providerId)&&!providerBaseUrl&&!providerApiKey&&!providerModel)throw Error("Legacy custom provider config is missing. Please run /connect to add a custom provider and select a model.");let modelCapabilities=resolveProviderModelCapabilities({providerId,modelId:providerModel,connectionModels:savedConnection?.models,builtinModels:builtin?.models,customProviderModels:customProvider?.models,legacyCustomModels:Array.isArray(legacyCustom?.models)?legacyCustom.models:void 0,fallbackModels:modelCapabilityFallbackModels}),runtimeConfig={modelId:providerModel??"deepseek-v3.1",adapter:adapter||"openai",provider:providerId??adapter,baseUrl:providerBaseUrl,apiKey:providerApiKey,nextApiOAuth:providerId==="dimcode-api-oauth"||void 0,...customProvider?.responsesAutoPromptCacheKey===!0?{responsesAutoPromptCacheKey:!0}:{},...customProvider?.responsesUseSessionId===!0?{responsesUseSessionId:!0}:{},...modelCapabilities?{modelCapabilities}:{},...typeof resolvedModelContextWindow==="number"&&resolvedModelContextWindow>0?{maxInputTokens:resolvedModelContextWindow}:{},...typeof resolvedModelMaxOutputTokens==="number"&&resolvedModelMaxOutputTokens>0?{maxOutputTokens:resolvedModelMaxOutputTokens}:{},temperature:readOptionalNumber2(saved.temperature)??void 0,interleavedThinking:typeof saved.interleavedThinking==="boolean"?saved.interleavedThinking:void 0,reasoningEffort:resolveSelectedReasoningEffort({modelId:providerModel,reasoningEffort:saved.reasoningEffort,reasoningEffortByModel:saved.reasoningEffortByModel})};if(!mergedEnv.DIMCODE_TOOL_APPROVALS&&saved.toolApprovals){let raw=String(saved.toolApprovals),mapped=raw==="auto"||raw==="all"?"auto":raw==="strict"||raw==="manual"?"strict":raw==="normal"?"normal":void 0;if(mapped)mergedEnv.DIMCODE_TOOL_APPROVALS=mapped}if(!mergedEnv.DIMCODE_LANG&&readOptionalString3(saved.locale))mergedEnv.DIMCODE_LANG=readOptionalString3(saved.locale);if(!mergedEnv.DIMCODE_THEME&&readOptionalString3(saved.themeMode))mergedEnv.DIMCODE_THEME=readOptionalString3(saved.themeMode);if(!mergedEnv.DIMCODE_REASONING_EFFORT){let resolved=resolveSelectedReasoningEffort({modelId:providerModel,reasoningEffort:saved.reasoningEffort,reasoningEffortByModel:saved.reasoningEffortByModel});if(resolved)mergedEnv.DIMCODE_REASONING_EFFORT=resolved}if(usesCcMock(builtin))mergedEnv.DIMCODE_CCMOCK="1";else delete mergedEnv.DIMCODE_CCMOCK;return applyRuntimeEnvIfMissing(mergedEnv,"DIMCODE_NO_INTERACTION",explicitRuntimeEnv),{context:{system:resolveSystemPrompt(mergedEnv),cwd,env:mergedEnv,runtimeConfig,...savedFocusFiles?.length?{focusFiles:savedFocusFiles}:{}},cacheDir:loadedCache.dir,cacheFile:loadedCache.filePath,cache,configDir:loadedConfig.dir,configFile:loadedConfig.filePath,config:config3,toolsFile:loadedTools.filePath,tools:loadedTools.tools,mcpJsonFile:loadedMcp.filePath,mcpServers:loadedMcp.servers,mcpPhase:fastStart?"deferred":"syncing",mcpConnectedCount:0,mcpConfiguredCount:loadedMcp.servers.length}}async function readRepoPackageVersion(cwd){try{let[{readFile:readFile11},path34]=await Promise.all([import("node:fs/promises"),import("node:path")]),raw=await readFile11(path34.join(cwd,"package.json"),"utf8"),parsed=JSON.parse(raw),v2=typeof parsed?.version==="string"?parsed.version:null;return v2&&v2.trim()?v2.trim():null}catch{return null}}import{createHash as createHash4,randomUUID as randomUUID8}from"node:crypto";import{copyFile as copyFile2,mkdir as mkdir11,readdir as readdir7,readFile as readFile11,rename as rename2,rm as rm7,stat as stat7,writeFile as writeFile10}from"node:fs/promises";import{homedir as homedir3}from"node:os";import path34 from"node:path";import process12 from"node:process";var BLOB_CACHE_DIR2="blob-cache",BLOB_DIR2="blobs",ATTACHMENTS_DIR2="attachments",META_DIR2="meta",BLOB_TTL_MS2=86400000,CLEANUP_MIN_INTERVAL_MS2=3600000,FILE_ID_PATTERN=/^[\w.-]{1,128}$/,HOME_SESSION_CACHE_ID="_home",IMAGE_EXTENSIONS=new Set(["png","jpg","jpeg","gif","svg","webp","bmp","ico"]),TEXT_LIKE_EXTENSIONS=new Set(["txt","text","md","markdown","mdx","rst","log","json","jsonl","json5","yaml","yml","toml","ini","cfg","conf","properties","env","xml","csv","tsv","html","htm","css","scss","less","sass","js","jsx","ts","tsx","mjs","cjs","mts","cts","vue","svelte","astro","py","rb","php","go","rs","java","kt","swift","c","cc","cpp","cxx","h","hh","hpp","hxx","m","mm","cs","sh","bash","zsh","fish","ps1","sql","graphql","gql","proto","diff","patch","gitignore","gitattributes","editorconfig","dockerfile","makefile","mk","lock"]),EXT_MIME={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".ico":"image/x-icon",".svg":"image/svg+xml",".mp4":"video/mp4",".mov":"video/quicktime",".m4v":"video/x-m4v",".webm":"video/webm",".avi":"video/x-msvideo",".mkv":"video/x-matroska",".mpeg":"video/mpeg",".mpg":"video/mpeg",".wmv":"video/x-ms-wmv",".3gp":"video/3gpp",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".pdf":"application/pdf",".txt":"text/plain",".md":"text/markdown",".json":"application/json",".yaml":"text/yaml",".yml":"text/yaml",".toml":"text/plain",".ini":"text/plain",".xml":"application/xml",".csv":"text/csv"},lastCleanupAt2=0;function resolveStateDir3(){let dimcodeHome=String(process12.env.DIMCODE_HOME??"").trim();if(dimcodeHome)return path34.resolve(dimcodeHome,"state");return path34.resolve(homedir3(),".dimcode","state")}function resolveSessionCacheDir2(sessionId){return path34.resolve(resolveStateDir3(),BLOB_CACHE_DIR2,sessionId)}function normalizeSessionId2(raw){let value=String(raw??"").trim();if(!value)return null;if(value==="."||value==="..")return null;if(value.includes("/")||value.includes("\\"))return null;if(value.includes("\x00"))return null;return value}function getFileExtension(filePath){let ext=path34.extname(filePath||"").toLowerCase();if(!ext)return"";return ext.startsWith(".")?ext.slice(1):ext}function basenameFromPath(filePath){return path34.basename(String(filePath??"").trim())}function parseAttachmentPathInfo(absPath){let blobMatch=normalizeMaybePath(absPath).match(/\/blob-cache\/([^/]+)\/attachments\/([^/]+)$/);if(!blobMatch)return null;let sessionId=normalizeSessionId2(blobMatch[1]??""),fileName=basenameFromPath(blobMatch[2]??"");if(!sessionId||!fileName)return null;return{sessionId,fileName}}function isTextLikeFilePath(filePath){let ext=getFileExtension(filePath);return Boolean(ext&&TEXT_LIKE_EXTENSIONS.has(ext))}function shouldCacheFileToSessionAttachment(filePath){return!isTextLikeFilePath(filePath)}function isSessionCachedImagePath(absPath){let info=parseAttachmentPathInfo(absPath);if(!info)return!1;let ext=getFileExtension(info.fileName);return Boolean(ext&&IMAGE_EXTENSIONS.has(ext))}function isHomeSessionAttachmentPath(absPath){let info=parseAttachmentPathInfo(absPath);return Boolean(info&&info.sessionId===HOME_SESSION_CACHE_ID)}function guessMimeTypeFromPath(filePath){let ext=path34.extname(filePath).toLowerCase();return EXT_MIME[ext]||"application/octet-stream"}function countLines2(text){if(!text)return 0;return text.split(`
1114
+ `)]})}async function createDimcodeContext(opts){let fastStartRaw=String(opts.env.DIMCODE_FAST_START??"").trim().toLowerCase(),fastStart=fastStartRaw==="1"||fastStartRaw==="true"||fastStartRaw==="yes"||fastStartRaw==="on",version3=readOptionalString3("0.0.66-beta.2")??(fastStart?null:await readRepoPackageVersion(opts.cwd)),resolveToolsPath=async()=>{let[{homedir:homedir3},path34]=await Promise.all([import("node:os"),import("node:path")]),dimcodeHome=readOptionalString3(opts.env.DIMCODE_HOME);if(dimcodeHome){let dir2=path34.resolve(dimcodeHome);return{dir:dir2,filePath:path34.join(dir2,"tools.json")}}let dir=path34.resolve(homedir3(),".dimcode");return{dir,filePath:path34.join(dir,"tools.json")}},[loadedCache,loadedConfig,loadedTools,loadedMcp]=fastStart?await(async()=>{let[cacheDir,configDir,toolsPath,path34]=await Promise.all([getDimcodeUserDir(opts.env),getDimcodeConfigDir(opts.env),resolveToolsPath(),import("node:path")]),cacheFile=path34.join(cacheDir,"cache.json"),configFile=path34.join(configDir,"config.json"),mcpJsonFile=path34.join(toolsPath.dir,"mcp.json");return[{dir:cacheDir,filePath:cacheFile,cache:{version:1,updatedAt:0}},{dir:configDir,filePath:configFile,config:{version:1,updatedAt:0}},{dir:toolsPath.dir,filePath:toolsPath.filePath,tools:{version:1,updatedAt:0}},{dir:toolsPath.dir,filePath:mcpJsonFile,servers:[]}]})():await Promise.all([loadDimcodeUserCache(opts.env),loadDimcodeUserConfig(opts.env),loadDimcodeUserTools(opts.env),loadMcpJson(opts.env)]),cache=loadedCache.cache,config3=loadedConfig.config,saved=cache.settings??{},savedConfig=config3.settings??{},savedCwd=readOptionalString3(saved.cwd),savedFocusFiles=Array.isArray(saved.focusFiles)?saved.focusFiles.map((file2)=>String(file2??"")).filter(Boolean):void 0,cwd=opts.cwd||savedCwd||".",v2=(key)=>readOptionalString3(opts.env[key]),explicitRuntimeEnv=Object.fromEntries(Object.entries(opts.env).flatMap(([key,value])=>{let canonical=String(key??"").trim(),normalized=readOptionalString3(value);if(!canonical||!RUNTIME_ENV_KEYS.has(canonical)||!normalized)return[];return[[canonical,normalized]]})),applyRuntimeEnvIfMissing=(target,key,source)=>{let value=source[key];if(!value||target[key])return;target[key]=value},mergedEnv={DIMCODE_VERSION:version3??"dev",...v2("DIMCODE_STARTUP_TOAST")?{DIMCODE_STARTUP_TOAST:v2("DIMCODE_STARTUP_TOAST")}:{}},savedProviderId=normalizeProviderId(savedConfig.providerId),savedConnections=savedConfig.providerConnections??{},savedActiveModelByProvider=savedConfig.activeModelByProvider??{},normalizedSavedCustomProviders=(Array.isArray(savedConfig.customProviders)?savedConfig.customProviders:[]).map((provider)=>{let adapter2=String(provider?.adapter??"").trim(),models=Array.isArray(provider?.models)?backfillCustomProviderModels(provider.models,{adapter:adapter2}):provider?.models;return{...provider,...Array.isArray(models)?{models}:{}}}),legacyCustom=savedConfig.customProvider??{},legacyBaseUrl=readOptionalString3(legacyCustom?.baseUrl),legacyApiKey=readOptionalString3(legacyCustom?.apiKey),rawProviderId=(()=>{if(isLegacyCustomProviderId(savedProviderId)&&normalizedSavedCustomProviders.length){let fallbackId=readOptionalString3(normalizedSavedCustomProviders[0]?.id);if(fallbackId){if(config3.settings)config3.settings.providerId=fallbackId;return fallbackId}}return savedProviderId})(),{candidates,existingProviderIds}=buildProviderSelectionCandidates({connections:savedConnections,customProviders:normalizedSavedCustomProviders,legacyCustom,rememberedModels:{...savedActiveModelByProvider}}),rememberedModels=stripUnknownActiveModelSelections({...savedActiveModelByProvider},existingProviderIds),selection=resolveProviderSelection({candidates,preferredProviderId:rawProviderId,rememberedModels}),providerId=readOptionalString3(selection.providerId),providerModel=readOptionalString3(selection.modelId);if(config3.settings)if(providerId)config3.settings.providerId=providerId;else delete config3.settings.providerId;let customProvider=isCustomProviderId(providerId)?normalizedSavedCustomProviders.find((p2)=>String(p2?.id??"").trim()===providerId):void 0,builtin=providerId&&!isCustomProviderId(providerId)&&!isLegacyCustomProviderId(providerId)?getBuiltinProvider(providerId):void 0,savedConnection=savedConnections[providerId??""],savedConnectionBaseUrl=readOptionalString3(savedConnection?.baseUrl),builtinBaseUrl=readOptionalString3(getProviderBaseUrl(builtin)),adapter=isCustomProviderId(providerId)?String(customProvider?.adapter??"").trim():isLegacyCustomProviderId(providerId)?"openai":providerId==="openai"&&savedConnectionBaseUrl&&savedConnectionBaseUrl!==builtinBaseUrl?"openai":getProviderAdapter(builtin),providerBaseUrl=isCustomProviderId(providerId)?readOptionalString3(customProvider?.baseUrl):isLegacyCustomProviderId(providerId)?legacyBaseUrl:readOptionalString3(resolveBuiltinProviderBaseUrl(builtin,savedConnection?.baseUrl)),providerApiKey=isCustomProviderId(providerId)?readOptionalString3(customProvider?.apiKey):isLegacyCustomProviderId(providerId)?legacyApiKey:readOptionalString3(savedConnection?.apiKey),modelCapabilityFallbackModels=isCustomProviderId(providerId)||isLegacyCustomProviderId(providerId)||builtin?.customModels?listCustomProviderModelFallbackModels():void 0,resolvedModelContextWindow=resolveProviderSelectionContextWindow({providerId,modelId:providerModel,connections:savedConnections,customProviders:normalizedSavedCustomProviders}),resolvedModelMaxOutputTokens=resolveProviderSelectionMaxOutputTokens({providerId,modelId:providerModel,connections:savedConnections,customProviders:normalizedSavedCustomProviders});if(isLegacyCustomProviderId(providerId)&&!providerBaseUrl&&!providerApiKey&&!providerModel)throw Error("Legacy custom provider config is missing. Please run /connect to add a custom provider and select a model.");let modelCapabilities=resolveProviderModelCapabilities({providerId,modelId:providerModel,connectionModels:savedConnection?.models,builtinModels:builtin?.models,customProviderModels:customProvider?.models,legacyCustomModels:Array.isArray(legacyCustom?.models)?legacyCustom.models:void 0,fallbackModels:modelCapabilityFallbackModels}),runtimeConfig={modelId:providerModel??"deepseek-v3.1",adapter:adapter||"openai",provider:providerId??adapter,baseUrl:providerBaseUrl,apiKey:providerApiKey,nextApiOAuth:providerId==="dimcode-api-oauth"||void 0,...customProvider?.responsesAutoPromptCacheKey===!0?{responsesAutoPromptCacheKey:!0}:{},...customProvider?.responsesUseSessionId===!0?{responsesUseSessionId:!0}:{},...modelCapabilities?{modelCapabilities}:{},...typeof resolvedModelContextWindow==="number"&&resolvedModelContextWindow>0?{maxInputTokens:resolvedModelContextWindow}:{},...typeof resolvedModelMaxOutputTokens==="number"&&resolvedModelMaxOutputTokens>0?{maxOutputTokens:resolvedModelMaxOutputTokens}:{},temperature:readOptionalNumber2(saved.temperature)??void 0,interleavedThinking:typeof saved.interleavedThinking==="boolean"?saved.interleavedThinking:void 0,reasoningEffort:resolveSelectedReasoningEffort({modelId:providerModel,reasoningEffort:saved.reasoningEffort,reasoningEffortByModel:saved.reasoningEffortByModel})};if(!mergedEnv.DIMCODE_TOOL_APPROVALS&&saved.toolApprovals){let raw=String(saved.toolApprovals),mapped=raw==="auto"||raw==="all"?"auto":raw==="strict"||raw==="manual"?"strict":raw==="normal"?"normal":void 0;if(mapped)mergedEnv.DIMCODE_TOOL_APPROVALS=mapped}if(!mergedEnv.DIMCODE_LANG&&readOptionalString3(saved.locale))mergedEnv.DIMCODE_LANG=readOptionalString3(saved.locale);if(!mergedEnv.DIMCODE_THEME&&readOptionalString3(saved.themeMode))mergedEnv.DIMCODE_THEME=readOptionalString3(saved.themeMode);if(!mergedEnv.DIMCODE_REASONING_EFFORT){let resolved=resolveSelectedReasoningEffort({modelId:providerModel,reasoningEffort:saved.reasoningEffort,reasoningEffortByModel:saved.reasoningEffortByModel});if(resolved)mergedEnv.DIMCODE_REASONING_EFFORT=resolved}if(usesCcMock(builtin))mergedEnv.DIMCODE_CCMOCK="1";else delete mergedEnv.DIMCODE_CCMOCK;return applyRuntimeEnvIfMissing(mergedEnv,"DIMCODE_NO_INTERACTION",explicitRuntimeEnv),{context:{system:resolveSystemPrompt(mergedEnv),cwd,env:mergedEnv,runtimeConfig,...savedFocusFiles?.length?{focusFiles:savedFocusFiles}:{}},cacheDir:loadedCache.dir,cacheFile:loadedCache.filePath,cache,configDir:loadedConfig.dir,configFile:loadedConfig.filePath,config:config3,toolsFile:loadedTools.filePath,tools:loadedTools.tools,mcpJsonFile:loadedMcp.filePath,mcpServers:loadedMcp.servers,mcpPhase:fastStart?"deferred":"syncing",mcpConnectedCount:0,mcpConfiguredCount:loadedMcp.servers.length}}async function readRepoPackageVersion(cwd){try{let[{readFile:readFile11},path34]=await Promise.all([import("node:fs/promises"),import("node:path")]),raw=await readFile11(path34.join(cwd,"package.json"),"utf8"),parsed=JSON.parse(raw),v2=typeof parsed?.version==="string"?parsed.version:null;return v2&&v2.trim()?v2.trim():null}catch{return null}}import{createHash as createHash4,randomUUID as randomUUID8}from"node:crypto";import{copyFile as copyFile2,mkdir as mkdir11,readdir as readdir7,readFile as readFile11,rename as rename2,rm as rm7,stat as stat7,writeFile as writeFile10}from"node:fs/promises";import{homedir as homedir3}from"node:os";import path34 from"node:path";import process12 from"node:process";var BLOB_CACHE_DIR2="blob-cache",BLOB_DIR2="blobs",ATTACHMENTS_DIR2="attachments",META_DIR2="meta",BLOB_TTL_MS2=86400000,CLEANUP_MIN_INTERVAL_MS2=3600000,FILE_ID_PATTERN=/^[\w.-]{1,128}$/,HOME_SESSION_CACHE_ID="_home",IMAGE_EXTENSIONS=new Set(["png","jpg","jpeg","gif","svg","webp","bmp","ico"]),TEXT_LIKE_EXTENSIONS=new Set(["txt","text","md","markdown","mdx","rst","log","json","jsonl","json5","yaml","yml","toml","ini","cfg","conf","properties","env","xml","csv","tsv","html","htm","css","scss","less","sass","js","jsx","ts","tsx","mjs","cjs","mts","cts","vue","svelte","astro","py","rb","php","go","rs","java","kt","swift","c","cc","cpp","cxx","h","hh","hpp","hxx","m","mm","cs","sh","bash","zsh","fish","ps1","sql","graphql","gql","proto","diff","patch","gitignore","gitattributes","editorconfig","dockerfile","makefile","mk","lock"]),EXT_MIME={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".ico":"image/x-icon",".svg":"image/svg+xml",".mp4":"video/mp4",".mov":"video/quicktime",".m4v":"video/x-m4v",".webm":"video/webm",".avi":"video/x-msvideo",".mkv":"video/x-matroska",".mpeg":"video/mpeg",".mpg":"video/mpeg",".wmv":"video/x-ms-wmv",".3gp":"video/3gpp",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".pdf":"application/pdf",".txt":"text/plain",".md":"text/markdown",".json":"application/json",".yaml":"text/yaml",".yml":"text/yaml",".toml":"text/plain",".ini":"text/plain",".xml":"application/xml",".csv":"text/csv"},lastCleanupAt2=0;function resolveStateDir3(){let dimcodeHome=String(process12.env.DIMCODE_HOME??"").trim();if(dimcodeHome)return path34.resolve(dimcodeHome,"state");return path34.resolve(homedir3(),".dimcode","state")}function resolveSessionCacheDir2(sessionId){return path34.resolve(resolveStateDir3(),BLOB_CACHE_DIR2,sessionId)}function normalizeSessionId2(raw){let value=String(raw??"").trim();if(!value)return null;if(value==="."||value==="..")return null;if(value.includes("/")||value.includes("\\"))return null;if(value.includes("\x00"))return null;return value}function getFileExtension(filePath){let ext=path34.extname(filePath||"").toLowerCase();if(!ext)return"";return ext.startsWith(".")?ext.slice(1):ext}function basenameFromPath(filePath){return path34.basename(String(filePath??"").trim())}function parseAttachmentPathInfo(absPath){let blobMatch=normalizeMaybePath(absPath).match(/\/blob-cache\/([^/]+)\/attachments\/([^/]+)$/);if(!blobMatch)return null;let sessionId=normalizeSessionId2(blobMatch[1]??""),fileName=basenameFromPath(blobMatch[2]??"");if(!sessionId||!fileName)return null;return{sessionId,fileName}}function isTextLikeFilePath(filePath){let ext=getFileExtension(filePath);return Boolean(ext&&TEXT_LIKE_EXTENSIONS.has(ext))}function shouldCacheFileToSessionAttachment(filePath){return!isTextLikeFilePath(filePath)}function isSessionCachedImagePath(absPath){let info=parseAttachmentPathInfo(absPath);if(!info)return!1;let ext=getFileExtension(info.fileName);return Boolean(ext&&IMAGE_EXTENSIONS.has(ext))}function isHomeSessionAttachmentPath(absPath){let info=parseAttachmentPathInfo(absPath);return Boolean(info&&info.sessionId===HOME_SESSION_CACHE_ID)}function guessMimeTypeFromPath(filePath){let ext=path34.extname(filePath).toLowerCase();return EXT_MIME[ext]||"application/octet-stream"}function countLines2(text){if(!text)return 0;return text.split(`
1115
1115
  `).length}function normalizeMaybePath(raw){return String(raw??"").replace(/\\/g,"/")}async function ensureBlobDirs2(sessionDir){let blobsDir=path34.join(sessionDir,BLOB_DIR2),metaDir=path34.join(sessionDir,META_DIR2);try{return await mkdir11(blobsDir,{recursive:!0}),await mkdir11(metaDir,{recursive:!0}),{blobsDir,metaDir}}catch{return null}}async function ensureAttachmentDirs(sessionDir){let attachmentsDir=path34.join(sessionDir,ATTACHMENTS_DIR2),metaDir=path34.join(sessionDir,META_DIR2);try{return await mkdir11(attachmentsDir,{recursive:!0}),await mkdir11(metaDir,{recursive:!0}),{attachmentsDir,metaDir}}catch{return null}}async function copyFileUnique(src,destDir,baseName){let safeBaseName=basenameFromPath(baseName)||basenameFromPath(src)||"attachment",ext=path34.extname(safeBaseName),stem=ext?safeBaseName.slice(0,-ext.length):safeBaseName,candidate=path34.join(destDir,safeBaseName);for(let i2=0;i2<40;i2++){try{await copyFile2(src,candidate);let info=await stat7(candidate);if(info.isFile()&&info.size>0)return candidate}catch{}let suffix=`-${i2+1}`;candidate=path34.join(destDir,`${stem}${suffix}${ext}`)}return null}async function readAttachmentMetaByPath(absPath){let info=parseAttachmentPathInfo(absPath);if(!info)return null;let metaDir=path34.join(resolveSessionCacheDir2(info.sessionId),META_DIR2),entries=[];try{entries=await readdir7(metaDir)}catch{return null}for(let entry of entries){if(!entry.endsWith(".json"))continue;let metaPath=path34.join(metaDir,entry);try{let raw=await readFile11(metaPath,"utf8"),meta2=JSON.parse(raw);if(!meta2||typeof meta2!=="object")continue;if(String(meta2.kind??"")!=="attachment")continue;if(String(meta2.stored_name??"")!==info.fileName)continue;let fileId=String(meta2.file_id??"").trim();if(!FILE_ID_PATTERN.test(fileId))continue;return{fileId,metaPath,meta:meta2}}catch{}}return null}async function writeSessionBlob2(opts){let sessionDir=resolveSessionCacheDir2(opts.sessionId),dirs=await ensureBlobDirs2(sessionDir);if(!dirs)return null;let fileId=`blob-${randomUUID8().replace(/-/g,"")}`,blobPath=path34.join(dirs.blobsDir,`${fileId}.txt`),metaPath=path34.join(dirs.metaDir,`${fileId}.json`),lineCount=countLines2(opts.content),sha256=createHash4("sha256").update(opts.content).digest("hex"),byteSize=Buffer.byteLength(opts.content,"utf-8"),nowIso=new Date().toISOString();try{return await writeFile10(blobPath,opts.content,"utf8"),await writeFile10(metaPath,JSON.stringify({file_id:fileId,kind:"text",sha256,line_count:lineCount,byte_size:byteSize,created_at:nowIso,source:String(opts.source??"unknown")},null,2),"utf8"),{fileId,filePath:blobPath,lineCount,sha256,byteSize}}catch{return null}}async function cacheFileToSessionAttachment(opts){let cleanedPath=String(opts.sourcePath??"").trim();if(!cleanedPath)return null;let sessionId=normalizeSessionId2(opts.sessionId);if(!sessionId)return null;let sourceInfo;try{sourceInfo=await stat7(cleanedPath)}catch{return null}if(!sourceInfo.isFile()||sourceInfo.size<=0)return null;await cleanupExpiredSessionCaches2({ttlMs:BLOB_TTL_MS2,logger:opts.logger}).catch(()=>{});let sessionDir=resolveSessionCacheDir2(sessionId),dirs=await ensureAttachmentDirs(sessionDir);if(!dirs)return null;let fileId=`att-${randomUUID8().replace(/-/g,"")}`,preferredBaseName=basenameFromPath(String(opts.preferredBaseName??"").trim()||basenameFromPath(cleanedPath)),storedPath=await copyFileUnique(cleanedPath,dirs.attachmentsDir,preferredBaseName);if(!storedPath)return null;let metaPath=path34.join(dirs.metaDir,`${fileId}.json`),mediaType=String(opts.mediaType??"").trim()||guessMimeTypeFromPath(storedPath),originalName=basenameFromPath(cleanedPath),storedName=basenameFromPath(storedPath),nowIso=new Date().toISOString();try{return await writeFile10(metaPath,JSON.stringify({file_id:fileId,kind:"attachment",byte_size:sourceInfo.size,created_at:nowIso,source:String(opts.source??"unknown"),media_type:mediaType,original_name:originalName,stored_name:storedName},null,2),"utf8"),opts.logger?.("session_attachment_cached",{sessionId,fileId,byteSize:sourceInfo.size,mediaType,originalName,storedName}),{fileId,filePath:storedPath,byteSize:sourceInfo.size,mediaType,originalName}}catch{return await rm7(storedPath,{force:!0}).catch(()=>{}),null}}async function deleteSessionAttachmentByPath(absPath,logger){let info=parseAttachmentPathInfo(absPath);if(!info)return!1;try{await rm7(absPath,{force:!0});let metaMatch=await readAttachmentMetaByPath(absPath);if(metaMatch)await rm7(metaMatch.metaPath,{force:!0});return await Promise.all([removeDirIfEmpty(path34.join(resolveSessionCacheDir2(info.sessionId),ATTACHMENTS_DIR2)),removeDirIfEmpty(path34.join(resolveSessionCacheDir2(info.sessionId),META_DIR2)),removeDirIfEmpty(resolveSessionCacheDir2(info.sessionId))]),logger?.("session_attachment_deleted",{sessionId:info.sessionId,fileName:info.fileName}),!0}catch{return!1}}async function relocateSessionAttachmentPath(absPath,targetSessionId,logger){let sourceInfo=parseAttachmentPathInfo(absPath),targetSid=normalizeSessionId2(targetSessionId);if(!sourceInfo||!targetSid)return null;if(sourceInfo.sessionId===targetSid)return absPath;let metaMatch=await readAttachmentMetaByPath(absPath),preferredBaseName=String(metaMatch?.meta.stored_name??basenameFromPath(absPath)).trim()||basenameFromPath(absPath),mediaType=String(metaMatch?.meta.media_type??"").trim()||guessMimeTypeFromPath(absPath),source=String(metaMatch?.meta.source??"attachment_relocate").trim()||"attachment_relocate",cached3=await cacheFileToSessionAttachment({sourcePath:absPath,sessionId:targetSid,source,preferredBaseName,mediaType,logger});if(!cached3)return null;return await deleteSessionAttachmentByPath(absPath,logger).catch(()=>!1),cached3.filePath}async function cleanupExpiredSessionCaches2(opts){let now=Date.now();if(now-lastCleanupAt2<CLEANUP_MIN_INTERVAL_MS2)return;lastCleanupAt2=now;let ttlMs=Math.max(1000,Math.floor(opts?.ttlMs??BLOB_TTL_MS2)),cutoff=now-ttlMs;await cleanupDedicatedCacheRoot2(path34.join(resolveStateDir3(),BLOB_CACHE_DIR2),cutoff,opts?.logger)}async function cleanupDedicatedCacheRoot2(cacheRoot,cutoff,logger){let entries=[];try{entries=await readdir7(cacheRoot)}catch{return}await Promise.all(entries.map(async(entry)=>{let sid=normalizeSessionId2(entry);if(!sid)return;let sessionDir=path34.join(cacheRoot,sid),candidates=[sessionDir,path34.join(sessionDir,BLOB_DIR2),path34.join(sessionDir,ATTACHMENTS_DIR2),path34.join(sessionDir,META_DIR2)],mtimes=[];for(let candidate of candidates)try{let info=await stat7(candidate);if(info.isDirectory()||info.isFile())mtimes.push(info.mtimeMs)}catch{}if(!mtimes.length)return;if(Math.max(...mtimes)>=cutoff)return;try{await rm7(sessionDir,{recursive:!0,force:!0}),logger?.("session_cache_ttl_deleted",{sessionId:sid,mtimeMs:Math.max(...mtimes),cutoff})}catch{}}))}async function removeDirIfEmpty(dir){try{if((await readdir7(dir)).length===0)await rm7(dir,{recursive:!0,force:!0})}catch{}}var COMMIT_ID_RE=/^[0-9a-f]{7,40}$/i;function getCommitIdFromMention(value){let raw=String(value||"");if(!raw.startsWith("git:commit:"))return null;let sha=raw.slice(11).trim();if(!COMMIT_ID_RE.test(sha))return null;return sha}function formatCommitObjectPath(sha){let safe=String(sha||"").trim();if(!safe)return"";return`.git/objects/${safe.slice(0,2)}/${safe}`}function renderCommitMarkdownLink(sha){let safe=String(sha||"").trim();if(!safe)return"";let path35=formatCommitObjectPath(safe);return`[${safe}](${path35})`}function stripLeadingFocusFilesBlock(text){let normalized=String(text??"").replace(/\r/g,"");if(!normalized)return"";let lines=normalized.split(`
1116
1116
  `),header=String(lines[0]??"").trim();if(header!=="[focus_files]"&&header!=="[user_focus_files]"){let inlineStripped=((raw)=>{let s2=String(raw??"");if(!s2)return null;let idx=0,matched2=0;while(idx<s2.length){while(idx<s2.length&&(s2[idx]===" "||s2[idx]==="\t"||s2[idx]===`
1117
1117
  `))idx++;let m2=s2.slice(idx).match(/^\[([^\]]*)\]\(((?:\\\)|[^)])+)\)/);if(!m2)break;let path35=String(m2[2]??"").trim();if(path35.startsWith("<")&&path35.endsWith(">"))path35=path35.slice(1,-1);if(path35=path35.replace(/\\\)/g,")").trim(),!(path35.startsWith("/")||/^[A-Z]:[\\/]/i.test(path35)))break;matched2++,idx+=m2[0].length}if(!matched2)return null;let rest=s2.slice(idx);if(rest=rest.replace(/^[ \t]+/g,""),rest.startsWith(`
@@ -1126,47 +1126,47 @@ ${text}
1126
1126
  `))}return out.length>0?out:null}catch{return null}}function takeFirstLinesFast(text,maxLines){let raw=String(text??"").replace(/\r/g,"");if(maxLines<=0)return{head:"",truncated:raw.length>0};let linesSeen=1;for(let i2=0;i2<raw.length;i2++)if(raw.charCodeAt(i2)===10){if(linesSeen++,linesSeen>maxLines)return{head:raw.slice(0,i2),truncated:!0}}return{head:raw,truncated:!1}}function truncateReadToolOutput(output,opts){let maxLines=Math.max(1,Math.floor(opts?.maxLines??10)),maxJsonParseChars=Math.max(0,Math.floor(opts?.maxJsonParseChars??200000)),ellipsisLine=String(opts?.ellipsisLine??"..."),raw=String(output??"").replace(/\r/g,"");if(!raw.trim())return{output:raw,truncated:!1};if(raw.length<=maxJsonParseChars){let jsonLines=extractTextLinesFromJsonish(raw);if(jsonLines&&jsonLines.length>0){let shown=jsonLines.slice(0,maxLines).join(`
1127
1127
  `),truncated=jsonLines.length>maxLines;return{output:truncated?`${shown}
1128
1128
  ${ellipsisLine}`:shown,truncated}}}let taken=takeFirstLinesFast(raw,maxLines);return{output:taken.truncated?`${taken.head}
1129
- ${ellipsisLine}`:taken.head,truncated:taken.truncated}}function normalizeMessageId(value){return String(value??"").trim()}function isCompactTranscriptMessageId(value){let id=normalizeMessageId(value);return id.startsWith("compact-")||id.startsWith("compact-restored-")||id.startsWith("restored-compact-")}function isCompressionTranscriptMessageId(value){let id=normalizeMessageId(value);return id.startsWith("compression-")||id.startsWith("compression-restored-")||id.startsWith("restored-compression-")}var de_default2={common:{apply:"Anwenden",cancel:"Abbrechen",close:"Schließen",confirm:"Bestätigen",yes:"Ja",no:"Nein",exit:"Beenden",back:"Zurück",next:"Weiter",save:"Speichern",empty:"—",unknownError:"Unbekannter Fehler",inputClearTip:"Ctrl+C löschen",total:"Gesamt"},configDialog:{title:"Einstellungen",hint:"Tab/Shift+Tab Feld wechseln • Enter Anwenden • Esc Abbrechen",modelsTitle:"Modelle (benutzerdefiniert)",modelsPlaceholder:"modell-a, modell-b",contextWindowTitle:"Kontextfenster",contextWindowLocked:"Kontextfenster (modelldefiniert)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperatur",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperatur: nur Zahlen und "."',maxTokensTitle:"Max. Ausgabe-Tokens",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL (OpenAI-kompatibel)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Aktuell:",apiKeyNotSet:"(nicht gesetzt)",apiKeyTitle:"API Key",apiKeyPlaceholder:"Neuen Key einfügen zum Aktualisieren (leer = beibehalten)",interleavedThinkingTitle:"Verschränktes Denken (Leertaste umschalten)",interleavedThinkingLocked:"Verschränktes Denken (modelldefiniert)",interleavedThinkingOpen:"An",interleavedThinkingClose:"Aus",tipIntensityTitle:"Tipp-Intensität",tipIntensityOff:"Aus",tipIntensityLow:"Niedrig",tipIntensityStandard:"Standard",shortcutsTitle:"Tastenkürzel",shortcutCommandsLabel:"Befehle",shortcutTimelineLabel:"Zeitleiste",shortcutNewSessionLabel:"Neue Sitzung",shortcutsPlaceholder:"z.B. mod+p",shortcutsHint:"Verwende mod/ctrl/alt/shift + Taste (a-z, 0-9, F1-F12)."},languageDialog:{title:"Sprache",hint:"Enter Anwenden • Esc Abbrechen",languageTitle:"Sprache",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Denkstärke",hint:"Enter Anwenden • Esc Abbrechen",effortTitle:"Denkstärke",applied:"Denkstärke auf {effort} gesetzt",option:{low:"Niedrig",medium:"Mittel",high:"Hoch",xhigh:"Sehr hoch",max:"Maximum",minimal:"Minimal",none:"Keine",off:"Aus",auto:"Auto"}},toolSettingsDialog:{title:"Werkzeugeinstellungen",hint:"Enter Anwenden • Esc Abbrechen",websearchTitle:"WebSearch API Key",apiKeyCurrentPrefix:"Aktuell:",apiKeyNotSet:"(nicht gesetzt)",apiKeyInvalidCjk:"API-Schlüssel darf keine chinesischen Zeichen enthalten.",apiKeyInvalidSpaces:"API-Schlüssel darf keine Leerzeichen enthalten.",apiKeyPlaceholder:"Serper API Key einfügen"},pluginsDialog:{title:"Plugins",hint:"Plugin zum Konfigurieren wählen • Esc Schließen",serperSearch:"Serper Search",serperSearchDetail:"Websuche über Serper API",configured:"Konfiguriert",notConfigured:"Nicht konfiguriert",serperConfigTitle:"Serper Search Einstellungen",serperConfigHint:"Tab Wechseln • Enter Anwenden • Esc Abbrechen"},skillsDialog:{title:"Skills",hint:"Enter Anwenden • Esc Abbrechen",empty:"Keine Skills verfügbar",emptyFiltered:"Keine passenden Skills"},timelineDialog:{title:"Verlauf",hint:"Tab Filter • Enter Öffnen • Esc Schließen",empty:"Noch keine Nachrichten",emptyFiltered:"Keine passenden Einträge",filterAll:"Alle Nachrichten",filterUser:"Nutzernachrichten",filterTool:"Tool-Aufrufe"},mcpSettingsDialog:{title:"MCP",hint:"mcp.json bearbeiten, um MCP-Server zu konfigurieren • Esc Schließen",configFileLabel:"Konfigdatei:",noServersHint:"Noch keine MCP-Server konfiguriert.",serverCount:"{count} Server konfiguriert",guideText:"Bearbeite die Datei oben, um MCP-Server hinzuzufügen oder zu ändern.",openFile:"Datei öffnen",reload:"Neu laden",close:"Schließen",reloaded:"MCP-Konfiguration neu geladen.",reloadFailed:"Neuladen fehlgeschlagen: {error}",status:"Status",toolCount:"Werkzeuge",disabled:"deaktiviert",testConnection:"Testen",testing:"Verbindungen testen...",testComplete:"Test abgeschlossen.",testPartial:"Test mit Fehlern abgeschlossen.",testFailed:"Verbindung fehlgeschlagen: {error}",invalidJson:"Ungültiges JSON: {error}",invalidShape:'Ungültiges MCP-JSON: "mcpServers" erwartet.',invalidServer:"Ungültiger MCP-Server: {name}",noServers:"Keine MCP-Server gefunden.",lintOk:"JSON-Syntax OK",lintAt:"{error} (Zeile {line}, Spalte {column})",lintUnclosed:"Nicht geschlossenes {char} (Zeile {line}, Spalte {column})",lintInvalid:"{error}",exampleFormat:"Beispielformat:"},toolApprovalsDialog:{title:"Werkzeugfreigaben",useAuto:"Auto",useNormal:"Normal",useStrict:"Streng",close:"Schließen",focusedTitleAuto:"AUTO",focusedTitleNormal:"NORMAL",focusedTitleStrict:"STRENG",focusedTitleClose:"SCHLIEẞEN",focusedDescAuto:"Alle Werkzeugaufrufe automatisch freigeben. Keine Bestätigung (schnellsten, am wenigsten sicher).",focusedDescNormal:"Nur-Lese-Werkzeuge automatisch freigeben. Vor Schreib-/Ausführungswerkzeugen nachfragen.",focusedDescStrict:"Jeden Werkzeugaufruf bestätigen (am sichersten, am langsamsten).",focusedDescClose:"Dialog schließen, ohne die aktuelle Einstellung zu ändern.",currentPrefix:"Aktuell: {mode}",tip:"Tipp: Tab oder ↑/↓ zwischen Schaltflächen, Enter bestätigen, Esc schließen."},settingsDialog:{pendingApproval:"Bitte die ausstehende Freigabe vor Einstellungsänderung erledigen.",invalidShortcut:"Ungültiges Kürzel für {label}: {value}",shortcutCommands:"Kürzel für Befehle",shortcutTimeline:"Kürzel für Zeitleiste",shortcutNewSession:"Kürzel für neue Sitzung",toolApprovalsApplied:"Werkzeugfreigaben: {mode}",applied:"Einstellungen angewendet."},exitAppDialog:{title:"DimCode beenden",confirm:"Jetzt beenden?",warning:"Eine Agent-Antwort ist noch in Bearbeitung. Beenden bricht sie ab.",reasonPrefix:"Grund: {reason}"},approvalDialog:{title:"Werkzeugberechtigung freigeben",toolLabel:"Werkzeug: {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Berechtigung: {permission} ({risk})",descriptionLabel:"Beschreibung: {description}",commandLabel:"Befehl:",inlineActionHint:"↑/← Zurück ↓/→ Weiter Enter Bestätigen 1/2/3 Wählen",inlineActionHintCompact:"←/→ Bewegen Enter Bestätigen 1/2/3 Wählen",buttons:{approve:"Freigeben",alwaysApprove:"Immer freigeben",deny:"Ablehnen",always:"Immer",ok:"OK",no:"Nein",y:"J",all:"Alle",n:"N"}},askUserDialog:{noQuestionsTitle:"Keine Fragen",noQuestionsBody:"Keine Fragen zu beantworten.",title:"Frage {index}/{total}: {header}",defaultHeader:"Frage",prev:"Zurück",next:"Weiter",submit:"Absenden",otherOption:"Sonstiges",otherDetail:"Eigene Antwort eingeben",inlineHintOptions:"Tasten: ↑↓ bewegen, ←→ Frage wechseln, Enter auswählen.",inlineHintMulti:"Mehrfachauswahl: Leertaste schaltet Häkchen um.",inlineHintButtons:"Tab zu Schaltflächen, ←→ wechseln, Enter aktivieren, ↑ zurück zu Optionen.",inlineHintNav:"Ctrl+Left / Ctrl+Right (oder Ctrl+A / Ctrl+E) Frage wechseln.",inlineHintSubmit:"Ctrl+Enter absenden, Esc abbrechen.",inlineButtonPrev:"[Zurück]",inlineButtonNext:"[Weiter]",inlineButtonSubmit:"[Absenden]",inlineButtonCancel:"[Abbrechen]",inlineActionHint:"Leertaste Wählen ← Zurück → Weiter Enter Weiter/Absenden Esc Abbrechen",inlineActionHintCompact:"Leertaste Wählen ←/→ Zurück/Weiter Enter Weiter/Absenden Esc Abbrechen",optionsSummaryAll:"{count} Optionen",optionsSummaryVisibleMore:"{count} Optionen ({start}-{end}) ↓ mehr",multiSelectHint:"[Mehrfachauswahl] Leertaste umschalten, Enter bestätigen",singleSelectHint:"[Einzelauswahl] Pfeiltasten, Enter bestätigen",customAnswerLabel:"Eigene Antwort:",customAnswerPlaceholder:"Antwort eingeben...",otherPlaceholder:"Sonstiges gewählt — Antwort eingeben und Enter drücken."},nextApiOAuthDialog:{title:"DimCode OAuth Anmeldung",copyUrl:"URL kopieren",login:"Anmelden",logout:"Abmelden",statusTitle:"Status",statusAuthenticated:"✓ Angemeldet als {email}",statusLoading:"⏳ Authentifizierung...",statusNotLoggedIn:"✗ Nicht angemeldet",instructionAuthenticated:"↑↓ navigieren, Enter auswählen oder Zahlen 1-9",instructionLoading:"C drücken, um die URL zu kopieren, falls der Browser nicht geöffnet wurde",instructionNeedsSetup:"OAuth redirect_uri, Scopes und Aktivierungsstatus prüfen, dann erneut versuchen",instructionWithUrl:"C drücken, um die OAuth-URL zu kopieren, oder Enter drücken, um den Browser zu öffnen",instructionUnauthed:"Enter drücken, um sich mit DimCode OAuth anzumelden, oder Esc zum Schließen",instructionManualCallback:"Kopieren Sie die URL unten, melden Sie sich im Browser an und fügen Sie die weitergeleitete URL in das Eingabefeld ein.",oauthUrlTitleLoading:"OAuth URL (kopieren, falls Browser nicht geöffnet)",oauthUrlTitleReady:"OAuth URL (bereit)",scrollIndicator:" [{start}-{end} von {total}]",selectModelTitle:"Modell wählen (↑↓/1-9, Enter zum Auswählen){indicator}",aboutTitle:"Über DimCode OAuth",setupTitle:"OAuth-Anmeldefehler",aboutBulletOne:"• Verwendet den integrierten DimCode OAuth-Client",aboutBulletTwo:"• Ruft Relay-Modelle nach Anmeldung ab und speichert die Anbieterkonfiguration",aboutBulletThree:"• Verwendet OAuth-Refresh-Tokens statt eines langlebigen API Keys",viewAllPlans:"Alle Pläne ansehen →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"DimCode-Konto",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"OAuth-URL wird generiert...",urlReady:"OAuth-URL bereit! Kopieren oder Enter drücken, um den Browser zu öffnen.",generateUrlFailed:"OAuth-URL konnte nicht generiert werden: {error}",startingLogin:"OAuth-Anmeldung wird gestartet...",browserOpened:"Browser geöffnet. Falls nicht, URL aus dem Dialog kopieren.",copyUrlToLogin:"OAuth-URL aus dem Dialog kopieren zum Anmelden.",urlCopied:"OAuth-URL in die Zwischenablage kopiert.",urlCopyFailed:"OAuth-URL konnte nicht kopiert werden.",authSuccess:"Erfolgreich mit DimCode OAuth authentifiziert!",loginFailed:"OAuth-Anmeldung fehlgeschlagen: {error}",loggedOut:"Von DimCode OAuth abgemeldet",loggedOutWithRemoteWarning:"Von DimCode OAuth abgemeldet, aber Remote-Widerruf fehlgeschlagen: {error}",logoutFailed:"Abmeldung fehlgeschlagen: {error}",initFailed:"Dialog-Initialisierungsfehler: {error}",modelSwitched:"Modell gewechselt zu {model}",selectModelFailed:"Modellauswahl fehlgeschlagen: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Debug",titleDebugging:"Debugging",copy:"kopieren",proceed:"fortfahren",fixed:"behoben",body:"Ich habe Debug-Logs (und möglicherweise einen Fix) hinzugefügt. Bitte versuche nun, das Problem zu reproduzieren, und wähle dann ein Ergebnis."},exitSessionDialog:{title:"Sitzung beenden",confirm:"Aktuelle Sitzung beenden und zur Startseite?",note:"Die nächste Nachricht startet eine neue Sitzung."},messageActionsDialog:{title:"Nachrichtenaktionen",revert:"Nachrichten zurücksetzen",revertWithFiles:"Nachrichten und Dateiänderungen zurücksetzen",revertKeepFiles:"Nachrichten zurücksetzen (Dateiänderungen behalten)",revertFilesOnly:"Nur Dateiänderungen zurücksetzen",copy:"Nachrichtentext in Zwischenablage kopieren",fork:"Abspalten — neue Sitzung erstellen",pin:"Nachricht anheften",unpin:"Nachricht lösen"},pathPickerDialog:{hint:"↑/↓ wählen • Tab vervollständigen • Enter bestätigen • Esc schließen"},providerConnectDialog:{title:"{provider} verbinden",providerFallback:"Anbieter",hint:"Tab wechseln • Ctrl+C löschen • Enter Anwenden",hintOpenAI:"Tab wechseln • Ctrl+C löschen • Enter Anwenden",hintGemini:"Tab wechseln • Ctrl+C löschen • Enter Anwenden",hintAnthropic:"Tab wechseln • Ctrl+C löschen • Enter Anwenden",hintGeneric:"Tab wechseln • Ctrl+C löschen • Enter Anwenden",applyingHint:"Verbindung wird getestet, bitte warten...",applyingButton:"Anwenden...",testConnection:"Verbindung testen",baseUrlStatusAutoFix:"Auto-Korrektur: {value}",baseUrlStatusInvalid:"Base URL muss http(s) sein",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API Key",apiKeyPlaceholder:"Neuen Key einfügen zum Aktualisieren (leer = beibehalten)",apiKeyCurrent:"Aktuell: {value}",apiKeyNotSet:"Aktuell: (nicht gesetzt)",apiKeyInvalidCjk:"API-Schlüssel darf keine chinesischen Zeichen enthalten.",apiKeyInvalidSpaces:"API-Schlüssel darf keine Leerzeichen enthalten.",clearKey:"Löschen",useDetectedKey:"{name} verwenden",disconnectButton:"Trennen",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"Aus",toggleOn:"An",toggleHint:"Tab wechseln • ←/→ ändern • Leertaste umschalten"},redoConfirmDialog:{title:"Wiederherstellen bestätigen",body:"Bist du sicher, dass du die zurückgesetzten Nachrichten wiederherstellen möchtest?"},renameSessionDialog:{title:"Sitzung umbenennen",label:"Sitzungsname",placeholder:"z.B. Planungsnotizen"},sessionsDialog:{timeNow:"jetzt",timeMinutes:"{count} Min.",timeHours:"{count} Std.",timeDays:"{count} T.",newSession:"Neue Sitzung",title:"Sitzungen ({count})",titleScoped:"Sitzungen ({count}/{total})",scope:"Bereich: {cwd}",loading:"Laden…",confirmDelete:"Löschen bestätigen: Nochmal Entf drücken",header:"{count} Sitzungen • Pfeiltasten navigieren • Enter auswählen{range}{activity}",headerRange:" • Anzeige {start}-{end}",runningCount:"{count} aktiv",pausedCount:"{count} warten auf Bestätigung",hint:"Tippen zum Springen • ←/→ Schaltflächen • Enter bestätigen • Esc schließen",focusPrefix:"Fokus: {focus}",focusList:"Liste",focusButtons:"Schaltflächen",noSessionsCwd:"Keine Sitzungen in diesem Verzeichnis",noSessions:"Noch keine gespeicherten Sitzungen",nodeOnly:"Sitzungen sind nur im Node/CLI-Modus verfügbar.",newSessionTitle:"Neue Sitzung",newSessionTarget:"eine neue Sitzung",busy:{agentResponding:"Agent antwortet noch",awaitingAskUser:"Warte auf AskUser-Antwort",awaitingToolApproval:"Warte auf Werkzeugfreigabe",pendingApproval:"Freigabe ausstehend"},buttons:{open:"Öffnen",delete:"Löschen",deleteConfirm:"Löschen (bestätigen)",scope:"Bereich: {scope}",scopeCwd:"VZ",scopeAll:"Alle",refresh:"Aktualisieren"}},sessionsOverlay:{title:"Sitzungen",hint:"Enter Auswählen • Esc Schließen • Strg+R Aktualisieren",loading:"Sitzungen werden geladen...",empty:"Noch keine gespeicherten Sitzungen."},switchSessionDialog:{title:"Sitzung wechseln",confirm:"Wechseln & Unterbrechen",target:"Zu {target} wechseln?",fallback:"Sitzung jetzt wechseln?",warning:"Dadurch wird die aktuelle Antwort/der aktuelle Ablauf in der aktiven Sitzung unterbrochen.",reason:"Grund: {reason}"},themeDialog:{title:"Design",hint:"Enter Anwenden • Esc Abbrechen",mode:"Modus",light:"Hell",dark:"Dunkel",unavailable:"Dieses Terminal unterstützt keine wechselbaren Designs.",fallback:"Ein festes Hell/Dunkel-ANSI-Fallback-Design wird hier verwendet.",tip:"Tipp: Standard folgt dem Systemdesign."},commandPalette:{searchPlaceholder:"Suchen…",noMatches:"Keine Treffer",hint:"Tippen zum Filtern • Enter: öffnen • Esc: schließen",title:"Befehle"},skills:{title:"Fähigkeiten"},help:{title:"Hilfe",modeLabel:"Modus: {mode}",modeDetail:"Aktueller Assistentenmodus.",shortcutsLabel:"Tastenkürzel",onboarding:`Willkommen! Schnellstart:
1129
+ ${ellipsisLine}`:taken.head,truncated:taken.truncated}}function normalizeMessageId(value){return String(value??"").trim()}function isCompactTranscriptMessageId(value){let id=normalizeMessageId(value);return id.startsWith("compact-")||id.startsWith("compact-restored-")||id.startsWith("restored-compact-")}function isCompressionTranscriptMessageId(value){let id=normalizeMessageId(value);return id.startsWith("compression-")||id.startsWith("compression-restored-")||id.startsWith("restored-compression-")}var de_default2={common:{apply:"Anwenden",cancel:"Abbrechen",close:"Schließen",confirm:"Bestätigen",yes:"Ja",no:"Nein",exit:"Beenden",back:"Zurück",next:"Weiter",save:"Speichern",empty:"—",unknownError:"Unbekannter Fehler",inputClearTip:"Ctrl+C löschen",total:"Gesamt"},configDialog:{title:"Einstellungen",hint:"Tab/Shift+Tab Feld wechseln • Enter Anwenden • Esc Abbrechen",modelsTitle:"Modelle (benutzerdefiniert)",modelsPlaceholder:"modell-a, modell-b",contextWindowTitle:"Kontextfenster",contextWindowLocked:"Kontextfenster (modelldefiniert)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperatur",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperatur: nur Zahlen und "."',maxTokensTitle:"Max. Ausgabe-Tokens",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL (OpenAI-kompatibel)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Aktuell:",apiKeyNotSet:"(nicht gesetzt)",apiKeyTitle:"API Key",apiKeyPlaceholder:"Neuen Key einfügen zum Aktualisieren (leer = beibehalten)",interleavedThinkingTitle:"Verschränktes Denken (Leertaste umschalten)",interleavedThinkingLocked:"Verschränktes Denken (modelldefiniert)",interleavedThinkingOpen:"An",interleavedThinkingClose:"Aus",tipIntensityTitle:"Tipp-Intensität",tipIntensityOff:"Aus",tipIntensityLow:"Niedrig",tipIntensityStandard:"Standard",shortcutsTitle:"Tastenkürzel",shortcutCommandsLabel:"Befehle",shortcutTimelineLabel:"Zeitleiste",shortcutNewSessionLabel:"Neue Sitzung",shortcutsPlaceholder:"z.B. mod+p",shortcutsHint:"Verwende mod/ctrl/alt/shift + Taste (a-z, 0-9, F1-F12)."},languageDialog:{title:"Sprache",hint:"Enter Anwenden • Esc Abbrechen",languageTitle:"Sprache",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Denkstärke",hint:"Enter Anwenden • Esc Abbrechen",effortTitle:"Denkstärke",applied:"Denkstärke auf {effort} gesetzt",option:{low:"Niedrig",medium:"Mittel",high:"Hoch",xhigh:"Sehr hoch",max:"Maximum",minimal:"Minimal",none:"Keine",off:"Aus",auto:"Auto"}},toolSettingsDialog:{title:"Werkzeugeinstellungen",hint:"Enter Anwenden • Esc Abbrechen",websearchTitle:"WebSearch API Key",apiKeyCurrentPrefix:"Aktuell:",apiKeyNotSet:"(nicht gesetzt)",apiKeyInvalidCjk:"API-Schlüssel darf keine chinesischen Zeichen enthalten.",apiKeyInvalidSpaces:"API-Schlüssel darf keine Leerzeichen enthalten.",apiKeyPlaceholder:"Serper API Key einfügen"},pluginsDialog:{title:"Plugins",hint:"Plugin zum Konfigurieren wählen • Esc Schließen",serperSearch:"Serper Search",serperSearchDetail:"Websuche über Serper API",configured:"Konfiguriert",notConfigured:"Nicht konfiguriert",serperConfigTitle:"Serper Search Einstellungen",serperConfigHint:"Tab Wechseln • Enter Anwenden • Esc Abbrechen"},skillsDialog:{title:"Skills",hint:"Enter Anwenden • Esc Abbrechen",empty:"Keine Skills verfügbar",emptyFiltered:"Keine passenden Skills"},timelineDialog:{title:"Verlauf",hint:"Tab Filter • Enter Öffnen • Esc Schließen",empty:"Noch keine Nachrichten",emptyFiltered:"Keine passenden Einträge",filterAll:"Alle Nachrichten",filterUser:"Nutzernachrichten",filterTool:"Tool-Aufrufe"},mcpSettingsDialog:{title:"MCP",hint:"mcp.json bearbeiten, um MCP-Server zu konfigurieren • Esc Schließen",configFileLabel:"Konfigdatei:",noServersHint:"Noch keine MCP-Server konfiguriert.",serverCount:"{count} Server konfiguriert",guideText:"Bearbeite die Datei oben, um MCP-Server hinzuzufügen oder zu ändern.",openFile:"Datei öffnen",reload:"Neu laden",close:"Schließen",reloaded:"MCP-Konfiguration neu geladen.",reloadFailed:"Neuladen fehlgeschlagen: {error}",status:"Status",toolCount:"Werkzeuge",disabled:"deaktiviert",testConnection:"Testen",testing:"Verbindungen testen...",testComplete:"Test abgeschlossen.",testPartial:"Test mit Fehlern abgeschlossen.",testFailed:"Verbindung fehlgeschlagen: {error}",invalidJson:"Ungültiges JSON: {error}",invalidShape:'Ungültiges MCP-JSON: "mcpServers" erwartet.',invalidServer:"Ungültiger MCP-Server: {name}",noServers:"Keine MCP-Server gefunden.",lintOk:"JSON-Syntax OK",lintAt:"{error} (Zeile {line}, Spalte {column})",lintUnclosed:"Nicht geschlossenes {char} (Zeile {line}, Spalte {column})",lintInvalid:"{error}",exampleFormat:"Beispielformat:"},toolApprovalsDialog:{title:"Werkzeugfreigaben",useAuto:"Auto",useNormal:"Normal",useStrict:"Streng",close:"Schließen",focusedTitleAuto:"AUTO",focusedTitleNormal:"NORMAL",focusedTitleStrict:"STRENG",focusedTitleClose:"SCHLIEẞEN",focusedDescAuto:"Alle Werkzeugaufrufe automatisch freigeben. Keine Bestätigung (schnellsten, am wenigsten sicher).",focusedDescNormal:"Nur-Lese-Werkzeuge automatisch freigeben. Vor Schreib-/Ausführungswerkzeugen nachfragen.",focusedDescStrict:"Jeden Werkzeugaufruf bestätigen (am sichersten, am langsamsten).",focusedDescClose:"Dialog schließen, ohne die aktuelle Einstellung zu ändern.",currentPrefix:"Aktuell: {mode}",tip:"Tipp: Tab oder ↑/↓ zwischen Schaltflächen, Enter bestätigen, Esc schließen."},settingsDialog:{pendingApproval:"Bitte die ausstehende Freigabe vor Einstellungsänderung erledigen.",invalidShortcut:"Ungültiges Kürzel für {label}: {value}",shortcutCommands:"Kürzel für Befehle",shortcutTimeline:"Kürzel für Zeitleiste",shortcutNewSession:"Kürzel für neue Sitzung",toolApprovalsApplied:"Werkzeugfreigaben: {mode}",applied:"Einstellungen angewendet."},exitAppDialog:{title:"DimCode beenden",confirm:"Jetzt beenden?",warning:"Eine Agent-Antwort ist noch in Bearbeitung. Beenden bricht sie ab.",reasonPrefix:"Grund: {reason}"},approvalDialog:{title:"Werkzeugberechtigung freigeben",toolLabel:"Werkzeug: {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Berechtigung: {permission} ({risk})",descriptionLabel:"Beschreibung: {description}",commandLabel:"Befehl:",inlineActionHint:"↑/← Zurück ↓/→ Weiter Enter Bestätigen 1/2/3 Wählen",inlineActionHintCompact:"←/→ Bewegen Enter Bestätigen 1/2/3 Wählen",buttons:{approve:"Freigeben",alwaysApprove:"Immer freigeben",deny:"Ablehnen",always:"Immer",ok:"OK",no:"Nein",y:"J",all:"Alle",n:"N"}},askUserDialog:{noQuestionsTitle:"Keine Fragen",noQuestionsBody:"Keine Fragen zu beantworten.",title:"Frage {index}/{total}: {header}",defaultHeader:"Frage",prev:"Zurück",next:"Weiter",submit:"Absenden",otherOption:"Sonstiges",otherDetail:"Eigene Antwort eingeben",inlineHintOptions:"Tasten: ↑↓ bewegen, ←→ Frage wechseln, Enter auswählen.",inlineHintMulti:"Mehrfachauswahl: Leertaste schaltet Häkchen um.",inlineHintButtons:"Tab zu Schaltflächen, ←→ wechseln, Enter aktivieren, ↑ zurück zu Optionen.",inlineHintNav:"Ctrl+Left / Ctrl+Right (oder Ctrl+A / Ctrl+E) Frage wechseln.",inlineHintSubmit:"Ctrl+Enter absenden, Esc abbrechen.",inlineButtonPrev:"[Zurück]",inlineButtonNext:"[Weiter]",inlineButtonSubmit:"[Absenden]",inlineButtonCancel:"[Abbrechen]",inlineActionHint:"Leertaste Wählen ← Zurück → Weiter Enter Weiter/Absenden Esc Abbrechen",inlineActionHintCompact:"Leertaste Wählen ←/→ Zurück/Weiter Enter Weiter/Absenden Esc Abbrechen",optionsSummaryAll:"{count} Optionen",optionsSummaryVisibleMore:"{count} Optionen ({start}-{end}) ↓ mehr",multiSelectHint:"[Mehrfachauswahl] Leertaste umschalten, Enter bestätigen",singleSelectHint:"[Einzelauswahl] Pfeiltasten, Enter bestätigen",customAnswerLabel:"Eigene Antwort:",customAnswerPlaceholder:"Antwort eingeben...",otherPlaceholder:"Sonstiges gewählt — Antwort eingeben und Enter drücken."},nextApiOAuthDialog:{title:"DimCode OAuth Anmeldung",copyUrl:"URL kopieren",login:"Anmelden",logout:"Abmelden",statusTitle:"Status",statusAuthenticated:"✓ Angemeldet als {email}",statusLoading:"⏳ Authentifizierung...",statusNotLoggedIn:"✗ Nicht angemeldet",instructionAuthenticated:"↑↓ navigieren, Enter auswählen oder Zahlen 1-9",instructionLoading:"C drücken, um die URL zu kopieren, falls der Browser nicht geöffnet wurde",instructionNeedsSetup:"OAuth redirect_uri, Scopes und Aktivierungsstatus prüfen, dann erneut versuchen",instructionWithUrl:"C drücken, um die OAuth-URL zu kopieren, oder Enter drücken, um den Browser zu öffnen",instructionUnauthed:"Enter drücken, um sich mit DimCode OAuth anzumelden, oder Esc zum Schließen",instructionManualCallback:"Kopieren Sie die URL unten, melden Sie sich im Browser an und fügen Sie die weitergeleitete URL in das Eingabefeld ein.",oauthUrlTitleLoading:"OAuth URL (kopieren, falls Browser nicht geöffnet)",oauthUrlTitleReady:"OAuth URL (bereit)",scrollIndicator:" [{start}-{end} von {total}]",selectModelTitle:"Modell wählen (↑↓/1-9, Enter zum Auswählen){indicator}",aboutTitle:"Über DimCode OAuth",setupTitle:"OAuth-Anmeldefehler",aboutBulletOne:"• Verwendet den integrierten DimCode OAuth-Client",aboutBulletTwo:"• Ruft Relay-Modelle nach Anmeldung ab und speichert die Anbieterkonfiguration",aboutBulletThree:"• Verwendet OAuth-Refresh-Tokens statt eines langlebigen API Keys",viewAllPlans:"Alle Pläne ansehen →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"DimCode-Konto",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"OAuth-URL wird generiert...",urlReady:"OAuth-URL bereit! Kopieren oder Enter drücken, um den Browser zu öffnen.",generateUrlFailed:"OAuth-URL konnte nicht generiert werden: {error}",startingLogin:"OAuth-Anmeldung wird gestartet...",browserOpened:"Browser geöffnet. Falls nicht, URL aus dem Dialog kopieren.",copyUrlToLogin:"OAuth-URL aus dem Dialog kopieren zum Anmelden.",urlCopied:"OAuth-URL in die Zwischenablage kopiert.",urlCopyFailed:"OAuth-URL konnte nicht kopiert werden.",authSuccess:"Erfolgreich mit DimCode OAuth authentifiziert!",loginFailed:"OAuth-Anmeldung fehlgeschlagen: {error}",loggedOut:"Von DimCode OAuth abgemeldet",loggedOutWithRemoteWarning:"Von DimCode OAuth abgemeldet, aber Remote-Widerruf fehlgeschlagen: {error}",logoutFailed:"Abmeldung fehlgeschlagen: {error}",initFailed:"Dialog-Initialisierungsfehler: {error}",modelSwitched:"Modell gewechselt zu {model}",selectModelFailed:"Modellauswahl fehlgeschlagen: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Debug",titleDebugging:"Debugging",copy:"kopieren",proceed:"fortfahren",fixed:"behoben",body:"Ich habe Debug-Logs (und möglicherweise einen Fix) hinzugefügt. Bitte versuche nun, das Problem zu reproduzieren, und wähle dann ein Ergebnis."},exitSessionDialog:{title:"Sitzung beenden",confirm:"Aktuelle Sitzung beenden und zur Startseite?",note:"Die nächste Nachricht startet eine neue Sitzung."},messageActionsDialog:{title:"Nachrichtenaktionen",revert:"Nachrichten zurücksetzen",revertWithFiles:"Nachrichten und Dateiänderungen zurücksetzen",revertKeepFiles:"Nachrichten zurücksetzen (Dateiänderungen behalten)",revertFilesOnly:"Nur Dateiänderungen zurücksetzen",copy:"Nachrichtentext in Zwischenablage kopieren",fork:"Abspalten — neue Sitzung erstellen",pin:"Nachricht anheften",unpin:"Nachricht lösen"},pathPickerDialog:{hint:"↑/↓ wählen • Tab vervollständigen • Enter bestätigen • Esc schließen"},providerConnectDialog:{title:"{provider} verbinden",providerFallback:"Anbieter",hint:"Tab wechseln • Ctrl+C löschen • Enter Anwenden",hintOpenAI:"Tab wechseln • Ctrl+C löschen • Enter Anwenden",hintGemini:"Tab wechseln • Ctrl+C löschen • Enter Anwenden",hintAnthropic:"Tab wechseln • Ctrl+C löschen • Enter Anwenden",hintGeneric:"Tab wechseln • Ctrl+C löschen • Enter Anwenden",applyingHint:"Verbindung wird getestet, bitte warten...",applyingButton:"Anwenden...",testConnection:"Verbindung testen",baseUrlStatusAutoFix:"Auto-Korrektur: {value}",baseUrlStatusInvalid:"Base URL muss http(s) sein",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API Key",apiKeyPlaceholder:"Neuen Key einfügen zum Aktualisieren (leer = beibehalten)",apiKeyCurrent:"Aktuell: {value}",apiKeyNotSet:"Aktuell: (nicht gesetzt)",apiKeyInvalidCjk:"API-Schlüssel darf keine chinesischen Zeichen enthalten.",apiKeyInvalidSpaces:"API-Schlüssel darf keine Leerzeichen enthalten.",clearKey:"Löschen",useDetectedKey:"{name} verwenden",disconnectButton:"Trennen",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"Aus",toggleOn:"An",toggleHint:"Tab wechseln • ←/→ ändern • Leertaste umschalten"},redoConfirmDialog:{title:"Wiederherstellen bestätigen",body:"Bist du sicher, dass du die zurückgesetzten Nachrichten wiederherstellen möchtest?"},renameSessionDialog:{title:"Sitzung umbenennen",label:"Sitzungsname",placeholder:"z.B. Planungsnotizen"},sessionsDialog:{timeNow:"jetzt",timeMinutes:"{count} Min.",timeHours:"{count} Std.",timeDays:"{count} T.",newSession:"Neue Sitzung",title:"Sitzungen ({count})",titleScoped:"Sitzungen ({count}/{total})",scope:"Bereich: {cwd}",loading:"Laden…",confirmDelete:"Löschen bestätigen: Nochmal Entf drücken",header:"{count} Sitzungen • Pfeiltasten navigieren • Enter auswählen{range}{activity}",headerRange:" • Anzeige {start}-{end}",runningCount:"{count} aktiv",pausedCount:"{count} warten auf Bestätigung",hint:"Tippen zum Springen • ←/→ Schaltflächen • Enter bestätigen • Esc schließen",focusPrefix:"Fokus: {focus}",focusList:"Liste",focusButtons:"Schaltflächen",noSessionsCwd:"Keine Sitzungen in diesem Verzeichnis",noSessions:"Noch keine gespeicherten Sitzungen",nodeOnly:"Sitzungen sind nur im Node/CLI-Modus verfügbar.",newSessionTitle:"Neue Sitzung",newSessionTarget:"eine neue Sitzung",busy:{agentResponding:"Agent antwortet noch",awaitingAskUser:"Warte auf AskUser-Antwort",awaitingToolApproval:"Warte auf Werkzeugfreigabe",pendingApproval:"Freigabe ausstehend"},buttons:{open:"Öffnen",delete:"Löschen",deleteConfirm:"Löschen (bestätigen)",scope:"Bereich: {scope}",scopeCwd:"VZ",scopeAll:"Alle",refresh:"Aktualisieren"}},sessionsOverlay:{title:"Sitzungen",hint:"Enter Auswählen • Esc Schließen • Strg+R Aktualisieren • Strg+W Bereich",loading:"Sitzungen werden geladen...",empty:"Noch keine gespeicherten Sitzungen.",loadingMore:"Lade weitere…",hasMore:"↓ mehr",scope:{cwdOnly:"nur cwd",allCwd:"alle cwds"}},switchSessionDialog:{title:"Sitzung wechseln",confirm:"Wechseln & Unterbrechen",target:"Zu {target} wechseln?",fallback:"Sitzung jetzt wechseln?",warning:"Dadurch wird die aktuelle Antwort/der aktuelle Ablauf in der aktiven Sitzung unterbrochen.",reason:"Grund: {reason}"},themeDialog:{title:"Design",hint:"Enter Anwenden • Esc Abbrechen",mode:"Modus",light:"Hell",dark:"Dunkel",unavailable:"Dieses Terminal unterstützt keine wechselbaren Designs.",fallback:"Ein festes Hell/Dunkel-ANSI-Fallback-Design wird hier verwendet.",tip:"Tipp: Standard folgt dem Systemdesign."},commandPalette:{searchPlaceholder:"Suchen…",noMatches:"Keine Treffer",hint:"Tippen zum Filtern • Enter: öffnen • Esc: schließen",title:"Befehle"},skills:{title:"Fähigkeiten"},help:{title:"Hilfe",modeLabel:"Modus: {mode}",modeDetail:"Aktueller Assistentenmodus.",shortcutsLabel:"Tastenkürzel",onboarding:`Willkommen! Schnellstart:
1130
1130
  1) /connect: Anbieter verbinden
1131
1131
  2) /models: Modell wählen
1132
1132
  3) "hallo" senden zum Starten
1133
- Tipp: {commandsKey} öffnet die Befehlspalette.`,items:{help:"Hilfe und Tastenkürzel (F1)",commands:"Befehlspalette (Ctrl+P)",back:"Zurück zum vorherigen Sprung",status:"Statusdetails umschalten"}},commands:{help:{label:"Hilfe",detail:"Tastenkürzel + häufige Befehle (F1)"},sessions:{label:"Sitzungen",detail:"Sitzung wählen oder erstellen (/sessions)"},timeline:{label:"Zeitleiste",detail:"Zu einer Benutzernachricht springen (/timeline)"},newSession:{label:"Neue Sitzung",detail:"Neue Sitzung starten (/new)"},connectProvider:{label:"Anbieter verbinden",detail:"Einen Anbieter verbinden (/connect)"},models:{label:"Modelle",detail:"Modell auswählen (/models)"},toolApprovals:{label:"Werkzeugfreigaben",detail:"Freigaben konfigurieren (/approvals)"},toolSettings:{label:"Werkzeugeinstellungen",detail:"Werkzeugspezifische Einstellungen (/tool-settings)"},mcpHub:{label:"MCP",detail:"MCP-Connectors und Einstellungen verwalten (/mcp)"},plugins:{label:"Plugins",detail:"Plugins verwalten (/plugins)"},debug:{label:"Debug",detail:"SDK-Observability-Logs (/debug)"},mcpSettings:{label:"MCP (Erweitertes JSON)",detail:"Rohes MCP-Server-JSON konfigurieren (/mcp-settings)"},language:{label:"Sprache",detail:"UI-Sprache wechseln (/language)"},settings:{label:"Einstellungen",detail:"Benutzerdefinierte Anbietereinstellungen (/settings, Ctrl+K)"}},homePage:{multilineTitle:"Mehrzeiliger Text",multilineTitleWithCount:"Mehrzeiliger Text ({count} Zeilen)",providerCustom:"Benutzerdefiniert",reviewPrompt:"hilf mir die Code-Änderungen zu überprüfen",footerCwd:"vz {cwd}",hints:{switchMode:"Modus wechseln",commands:"Befehle"},tips:{greeting:"Willkommen zurück! Versuche {commandsKey} oder {init} für den Einstieg.",commandsAlias:"Tipp: {key} öffnet die Befehlspalette."},prompts:{help:"Hilfe & Tastenkürzel (F1)",sessions:"Sitzungen auflisten/wählen",connect:"Anbieter verbinden",models:"Modell auswählen",newSession:"Neue Sitzung starten",approvals:"Werkzeugfreigaben konfigurieren (auto/normal/streng)",commands:"Befehlspalette öffnen",toolSettings:"Werkzeugspezifische Einstellungen",mcpSettings:"MCP öffnen",plugins:"Plugins verwalten",language:"UI-Sprache wechseln",theme:"Design auswählen",status:"Statusdetails umschalten",review:"Code-Änderungen überprüfen",init:"AGENTS.md initialisieren/verbessern",skills:"Geladene Skills auflisten",exit:"Anwendung beenden",debug:"Debug-Dialog (Chat)",settings:"Benutzerdefinierte Anbietereinstellungen"},commandPalette:{connect:"Anbieter verbinden",models:"Modell auswählen"},commands:{debugLabel:"Debug",debugDetail:"SDK-Observability-Logs (/debug)"},toast:{approvalsUsage:"Verwende /approvals (kein an/aus).",customProviderOnly:"Einstellungen nur für benutzerdefinierte Anbieter.",redoChatOnly:"Wiederherstellen nur in der Chat-Ansicht verfügbar.",retryChatOnly:"Wiederholen nur in der Chat-Ansicht verfügbar.",pinsChatOnly:"Angeheftete nur in der Chat-Ansicht verfügbar.",renameChatOnly:"Umbenennen nur in der Chat-Ansicht verfügbar (/rename <titel>).",commandRemoved:"Dieser Befehl ist nicht mehr verfügbar: {command}",helpAliasRemoved:"F1 für Hilfe drücken.",deleteConfirm:"Nochmal Entf drücken zum Bestätigen.",themeToggled:"Design: {mode}",pasteImagePending:"Bild wird noch verarbeitet. Bitte warten."}},chatPage:{placeholder:"Frage etwas... (Neue Zeile: Shift+Enter oder Ctrl+J)",placeholderAwaitingApproval:"Blockiert durch Freigabe: Freigeben / Ablehnen wählen zum Fortfahren.",reviewPrompt:"hilf mir die Code-Änderungen zu überprüfen",notification:{approvalTitle:"[Freigabe erforderlich] Werkzeugberechtigung",approvalMessage:"DimCode wartet auf Werkzeugfreigabe: {tool}.",doneTitle:"[Aufgabe erledigt]",doneMessage:"DimCode hat diese Aufgabe abgeschlossen.",doneMessageWithDuration:"DimCode hat diese Aufgabe in {duration} abgeschlossen.",doneMessageWithTools:"DimCode hat diese Aufgabe nach {tools} Werkzeugaufruf/en abgeschlossen.",doneMessageWithToolsAndDuration:"DimCode hat diese Aufgabe in {duration} mit {tools} Werkzeugaufruf/en abgeschlossen."},headerStats:"{messages} Nchr. · Gesamt {tokens}",contextChip:"≈{pct}% / {tokens} Tok.",contextChipCompact:"{pct}%",thinkingWords:"Zusammenführen,Dachten,Überlegen,Planen,Analysieren,Synthetisieren,Verfeinern,Verfassen",modelFallback:"Modell",mode:{plan:"Planen",agent:"Agent",debug:"Debug"},status:{approvalsAuto:"AUTO",approvalsAll:"ALLE",blockedByApproval:"Blockiert durch Freigabe",awaitingApprovalAction:"Warte auf deine Freigabe: Freigeben / Ablehnen wählen zum Fortfahren."},footer:{dragSelect:"ziehen zum Auswählen",openLink:"Ctrl+Klick um Dateien oder Links zu öffnen",esc:"esc",interrupt:"abbrechen",approvalPaused:"⏸ Pausiert",approvalPausedHint:"Warte auf Freigabe (Enter zum Wählen).",shortcuts:"Ctrl+K: Einstellungen Ctrl+O: Tools & Denken ein/aus Cmd+Delete/Ctrl+W: Eingabe löschen Tab: Modus wechseln {commandsKey}: Befehle",shortcutsCompact:"Ctrl+K: Einstell. Ctrl+O: Tools/Denken Cmd+Delete/Ctrl+W: löschen Tab: Modus {commandsKey}: Befehle",shortcutsMicro:"Ctrl+O: Tools {commandsKey}: Befehle",shortcutsMini:"{commandsKey}: Befehle"},session:{new:"neu"},timeline:{title:"Zeitleiste",empty:"(leer)",filterAll:"Alle Nachrichten",filterUser:"Benutzernachrichten",filterTool:"Werkzeugaufrufe"},pins:{title:"Angeheftet",empty:"(leer)"},jumpToBottom:{button:"↓"},prompts:{help:"Hilfe & Tastenkürzel (F1)",newSession:"Neue Sitzung starten",resume:"Angehaltene Warteschlange fortsetzen",sessions:"Sitzungen auflisten/wählen",timeline:"Zu einer Benutzernachricht springen",pins:"Angeheftete Nachrichten öffnen",pin:"Letzte Nachricht anheften",back:"Zurück zum vorherigen Sprung",connect:"Anbieter verbinden",models:"Modell auswählen",theme:"Design wechseln",approvals:"Werkzeugfreigaben konfigurieren (auto/normal/streng)",commands:"Befehlspalette öffnen",toolSettings:"Werkzeugspezifische Einstellungen",mcpSettings:"MCP öffnen",plugins:"Plugins verwalten",language:"UI-Sprache wechseln",status:"Statusdetails umschalten",review:"Code-Änderungen überprüfen",retry:"Letzte Benutzernachricht wiederholen",compact:"Sitzungskontext komprimieren",init:"AGENTS.md initialisieren/verbessern",rename:"Aktuelle Sitzung umbenennen",skills:"Geladene Skills auflisten",exit:"Anwendung beenden",debug:"Debug-Dialog",settings:"Benutzerdefinierte Anbietereinstellungen"},commands:{pinsLabel:"Angeheftet",pinsDetail:"Angeheftete Nachrichten öffnen",backLabel:"Zurück",backDetail:"Zum vorherigen Sprung zurückkehren",debugLabel:"Debug",debugDetail:"SDK-Observability-Logs (/debug)",statusLabel:"Status",statusDetail:"Statusdetails umschalten",themeLabel:"Design",themeDetail:"Farbdesign wechseln"},tips:{contextWarn:"Tipp: Kontext wird voll. Verwende /compact oder /new, um Antworten präzise zu halten.",contextCritical:"Tipp: Du bist nah am Kontextlimit. Starte eine neue Sitzung mit /new (oder zuerst /compact).",timeline:"Tipp: Langer Chat? Verwende /tl, um zu einer bestimmten Benutzernachricht zu springen.",timelineAlias:"Tipp: /tl ist eine Kurzform für /timeline.",commandsAlias:"Tipp: {key} öffnet die Befehlspalette.",errorRecovery:"Tipp: Wenn etwas fehlgeschlagen ist, versuche /compact oder /new.",greeting:"Willkommen zurück! Versuche {commandsKey} oder {init} für den Einstieg.",compactDelight:"Schön! Schlanker Kontext hilft.",addTests:'Alles klar! Soll ich Tests hinzufügen? Antworte "ja" oder "ok".'},confirm:{addTests:"Bitte füge Tests für die gerade gemachten Änderungen hinzu."},toast:{customProviderOnly:"Einstellungen nur für benutzerdefinierte Anbieter.",renameNodeOnly:"Umbenennen nur im Node/CLI-Modus verfügbar.",noActiveSession:"Keine aktive Sitzung zum Umbenennen.",sessionNameEmpty:"Sitzungsname darf nicht leer sein.",sessionRenamed:"Sitzung umbenannt zu: {title}",renameFailed:"Sitzung konnte nicht umbenannt werden.",linkOpenHint:"Tipp: Ctrl+Klick um Dateien oder Links zu öffnen.",copySuccess:"Kopiert",copyFailed:"Kopieren fehlgeschlagen",forkFailed:"Abspaltung der Sitzung fehlgeschlagen.",backEmpty:"Kein vorheriger Sprung zum Zurückkehren.",pinsEmpty:"Noch keine angehefteten Nachrichten.",pinEmpty:"Keine Nachricht zum Anheften.",pinned:"Nachricht angeheftet.",unpinned:"Nachricht gelöst.",debugUnavailable:"Debug-Server ist nicht verfügbar.",approvalsUsage:"Verwende /approvals (kein an/aus).",debugDialogOpened:"Debug-Dialog geöffnet.",debugDialogClosed:"Debug-Dialog geschlossen.",renameUsage:"Verwendung: /rename <titel>",themeToggled:"Design: {mode}",statusCompactOn:"Status: kompakt",statusCompactOff:"Status: detailliert",compactingSession:"Sitzung wird komprimiert...",compactSuccess:"Sitzung komprimiert: {message}",compactWarning:"Sitzung komprimiert mit begrenztem Gewinn: {message}",compactSuccessDetailWithTokens:"Die ersten {count} Verlaufsnachrichten zu einer Zusammenfassung zusammengefasst. Geschätzte Eingabe {before} -> {after} Tokens, ca. {saved} Tokens eingespart.",compactSuccessDetailNotReduced:"Die ersten {count} Verlaufsnachrichten zu einer Zusammenfassung zusammengefasst, aber die geschätzte Eingabe änderte sich von {before} auf {after} Tokens, daher wurde die Anfragegröße nicht reduziert.",compactSuccessDetailCountOnly:"Die ersten {count} Verlaufsnachrichten zu einer Zusammenfassung zusammengefasst.",compactSuccessDetailSummaryOnly:"Neue Gesprächszusammenfassung erstellt.",compactFailed:"Sitzungskomprimierung fehlgeschlagen: {error}",compactFailedTokenLimit:"Komprimierung wegen unzureichendem Kontextbudget fehlgeschlagen. DIMCODE_CONTEXT_WINDOW korrekt setzen, zu einem Modell mit größerem Kontext wechseln oder /new verwenden. Detail: {error}",retryEmpty:"Keine vorherige Benutzernachricht zum Wiederholen.",commandRemoved:"Dieser Befehl ist nicht mehr verfügbar: {command}",helpAliasRemoved:"F1 für Hilfe drücken.",waitForResponse:"Bitte warte, bis die aktuelle Antwort abgeschlossen ist, oder drücke Esc zum Abbrechen.",pasteImagePending:"Bild wird noch verarbeitet. Bitte warten.",pendingApproval:"Bitte zuerst tool_approve erledigen.",awaitingApprovalAction:"Pausiert: Handlung nötig. Freigeben / Immer freigeben / Ablehnen in der Berechtigungskarte wählen.",awaitingApprovalStillWaiting:"Warte weiterhin auf Freigabe ({seconds}s). Das Modell fährt nicht fort, bis du freigibst oder ablehnst.",pendingAskUser:"Bitte zuerst ask_user erledigen.",notificationSessionBusy:"Diese Benachrichtigung gehört zu einer anderen beschäftigten Sitzung. Beende diese Arbeit oder wechsle zuerst manuell die Sitzung.",notificationSessionUnavailable:"Die Sitzung für diese Benachrichtigung kann hier nicht geöffnet werden.",notificationSessionSwitchFailed:"Sitzung für diese Benachrichtigung konnte nicht geöffnet werden.",approvalNotActive:"Diese Freigabe ist in der Warteschlange. Erledige zuerst die aktive.",askUserNotActive:"Diese ask_user-Anfrage ist nicht mehr aktiv."}},chatQueue:{label:"Warteschlange ({count})",labelCompact:"Warteschl. {count}",more:"+{count} weitere…",resumeToken:"/resume",resumePlainToken:"fortsetzen",resumeLegacyToken:"Warteschlange fortsetzen",state:{idle:"Ausstehend",running:"Läuft",paused:"Pausiert",error:"Fehler"},item:{steerAction:"Lenken",steerReady:"Erstens",steerPending:"Nächstes",steerPaused:"Pausiert"},toast:{enqueued:"Zur Warteschlange hinzugefügt (#{count}).",full:"Warteschlange ist voll (max. 5). Lösche eine oder starte /new.",cleared:"{count} Warteschlangenelement/e gelöscht.",deleted:"{count} Warteschlangenelement/e gelöscht. Ctrl+Z zum Rückgängig machen.",steerPromoted:"Zu Lenkung hochgestuft. Wird zuerst ausgeführt, wenn die Warteschlange fortgesetzt wird.",steerQueued:"Lenkung kann nicht sofort eingespeist werden. Sie wurde hochgestuft und wird in der nächsten Runde zuerst ausgeführt.",steerSent:"Lenkung akzeptiert. Wird vor dem nächsten Modellaufruf in dieser Runde eingespeist.",undo:"Warteschlangen-Löschen rückgängig gemacht.",pausedTip:"Warteschlange pausiert. Verwende {resume} oder {resumeText} zum Fortsetzen, oder sende eine neue Nachricht zum Entscheiden.",stale:"Warteschlange pausiert: Anfrage scheint festzustecken."},confirm:{title:"Nachrichten in der Warteschlange fortsetzen?",description:"Vorherige Anfrage nicht abgeschlossen. {count} Nachricht/en in der Warteschlange.",hint:"Fortsetzen, um das nächste Element zu senden, oder Warteschlange pausieren.",continue:"Fortsetzen",pause:"Pausieren",reason:"Grund: {reason}"},reason:{network_error:"Netzwerkfehler.",timeout:"Zeitüberschreitung der Anfrage.",canceled_by_user:"Vom Benutzer abgebrochen.",rate_limited:"Ratenlimit erreicht.",config_unavailable:"Gespeicherte Konfiguration nicht verfügbar.",unknown:"Anfrage fehlgeschlagen."},draftDecision:{title:"Warteschlange ist pausiert",description:"{count} Nachricht/en in der Warteschlange warten noch. Entscheide, was mit deiner neuen Eingabe passieren soll.",previewLabel:"Neue Eingabe:",continue:"Warteschlange fortsetzen",append:"An Warteschlange anhängen",replace:"Warteschlange verwerfen & senden"}},chatStatus:{done:"Fertig.",error:"Fehler.",interrupted:"Abgebrochen.",permissionDenied:"Berechtigung verweigert.",planning:"Planen…",drafting:"Entwerfen…",retrying:"Wiederholen ({retry}/{maxAttempts})…",runningTool:"{tool} ausführen…",runningTools:"{count} Werkzeuge ausführen…",approvalPendingOther:"Eine andere Freigabe ist ausstehend ({permission})…",awaitingApproval:"Warte auf Freigabe…",awaitingApprovalWithPerm:"Warte auf Freigabe ({permission})…",awaitingApprovalWithRisk:"Warte auf Freigabe ({risk})…",awaitingAnswers:"Warte auf Antworten…",resumingApproved:"Freigegeben. Fortsetzen…",resumingDenied:"Abgelehnt. Fortsetzen…",resuming:"Fortsetzen…",autoApprovingWithRisk:"Auto-Freigabe ({risk})…",riskFallback:"Risiko",toolFallback:"Werkzeug",thinking:"Denken…",autoCompactionRequired:"Kontext nahe dem Limit. Komprimierung erforderlich.",autoCompactionRequiredDetailed:"Kontext nahe dem Limit · nächste Anfrage auf geschätzt {estimated} Tokens, Auto-Komprimierung startet bei {threshold} Tokens, daher ist Komprimierung erforderlich.",compressed:"Kontext komprimiert · {removed} ältere Nachrichten zu einer Zusammenfassung zusammengefasst, ca. {saved} Eingabe-Tokens eingespart ({elapsed}ms)",autoCompactedDetailed:"Auto-Komprimierung abgeschlossen · {removed} ältere Nachrichten zu einer Zusammenfassung zusammengefasst, geschätzte Eingabe {before} -> {after} Tokens, ca. {saved} Tokens eingespart",autoCompactedNotReduced:"Auto-Komprimierung abgeschlossen · {removed} ältere Nachrichten zu einer Zusammenfassung zusammengefasst, aber die geschätzte Eingabe änderte sich von {before} auf {after} Tokens, daher wurde die Anfragegröße nicht reduziert",autoCompactedSaved:"Auto-Komprimierung abgeschlossen · {removed} ältere Nachrichten zu einer Zusammenfassung zusammengefasst, ca. {saved} Tokens eingespart",autoCompactedCountOnly:"Auto-Komprimierung abgeschlossen · {removed} ältere Nachrichten zu einer Zusammenfassung zusammengefasst",interruptedMarkdown:"> **Abgebrochen** · Antwort vom Benutzer abgebrochen (`Esc`).",awaitingApprovalPrefix:"Warte auf Freigabe",awaitingAnswersPrefix:"Warte auf Antworten",approvalPendingPrefix:"Andere Freigabe ist ausstehend",autoApprovingPrefix:"Auto-Freigabe"},chatParts:{thinking:"Denken",plan:"Plan",todo:"Aufgaben"},chatRender:{userLabel:"Benutzer",outputLabel:"↳ Ausgabe",outputLabelShort:"Ausg.:",canceled:"abgebrochen",inputLabel:"Eing.:",collapse:"... (einklappen)",moreLines:"... ({count} weitere Zeilen)",moreLinesOmitted:"... ({count} weitere Zeilen ausgelassen; {envVar} erhöhen)",streamingTail:"… (Streaming: letzte {shown} Zeichen; {omitted} ausgelassen)",copy:"Kopieren",userResponses:"Benutzerantworten:",approvalQueued:"Warte auf vorherige Freigabe...",proposedPlan:{title:"Vorgeschlagener Plan"},llmMeta:{changedFiles:"{count} Datei/en geändert: {files}",changedFilesMore:"+{count} weitere",revertHint:"Tipp: Diese Nachricht anklicken -> Nachrichten zurücksetzen, um diesen Zug rückgängig zu machen.",changedFilesCardTitle:"{count} Dateien geändert:",revertButton:"Zurücksetzen"},toolName:{explore:"Erkunden",subagent:"Unteragent"},toolSuffix:{offset:"Versatz {value}",limit:"Limit {value}",matches:"{count} Treffer",todos:"{count} Aufgaben",results:"{count} Ergebnisse",results_one:"{count} Ergebnis"},toolGroup:{readFiles:"{count} Dateien lesen",writeFiles:"{count} Dateien schreiben",editFiles:"{count} Dateien bearbeiten",globPatterns:"Glob {count} Muster",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} Muster",bashCommands:"{count} Befehle ausführen",searchQueries:"{count} Suchanfragen",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"Suche kann auf das Netzwerk zugreifen.",bash:"Bash kann Befehle ausführen.",edit:"Dateiänderungen können lokale Dateien verändern.",grep:"Grep kann lokale Dateien lesen."},inlineHint:"Tasten: ↑↓←→ bewegen, Enter auswählen.",awaitingUserAction:"Warte auf deine Aktion: Freigeben / Immer freigeben / Ablehnen wählen.",decision:{userDenied:"Benutzer hat Freigabe abgelehnt"},denied:{title:"# Werkzeugberechtigung abgelehnt",toolLine:"- Werkzeug: `{tool}`",permissionLine:"- Berechtigung: `{permission}`",hint:"Du kannst den tool_call neu auswählen und es erneut versuchen."},summary:{title:"# Freigegebenes + ausgeführtes Werkzeug",permissionLine:"Berechtigung `{permission}` freigegeben für `{tool}`."},required:"Freigabe erforderlich ({risk}).",args:{commandWithDescription:"Befehl: {command} - {description}",command:"Befehl: {command}",description:"Beschreibung: {description}",raw:"Args: {args}"}},pathPicker:{titleWorkspace:"Arbeitsbereich wählen",titleFile:"Datei wählen",placeholderWorkspace:"Pfad eingeben (../ usw). Tab zum Vervollständigen. Enter wählt ein Verzeichnis.",placeholderFile:"Pfad eingeben (../ usw). Tab zum Vervollständigen. Enter wählt eine Datei."},providerDialogs:{customLabel:"Benutzerdefiniert",customDetail:"benutzerdefiniert",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Mit DimCode OAuth anmelden",addCustomLabel:"Benutzerdef. Anbieter hinzufügen",addCustomDetail:"benutzerdef. Anbieter hinzufügen",providerFallback:"Anbieter",adapter:{openai:"OpenAI",openaiOpenRouter:"OpenAI-kompatibel (OpenRouter)",openaiLocal:"OpenAI-kompatibel (Lokaler Endpunkt)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Konfiguriert",notConfigured:"Nicht konfiguriert"},manage:{title:"Benutzerdef. Anbieter: {provider}",connect:"Verbinden",connectDetail:"API Key / Base URL bearbeiten",rename:"Umbenennen",renameDetail:"Anbieternamen bearbeiten",models:"Modelle bearbeiten",modelsDetail:"Verfügbare Modell-IDs aktualisieren",delete:"Löschen",deleteDetail:"Diesen Anbieter entfernen"},deleteConfirm:{title:"{provider} löschen?",confirm:"Löschen (bestätigen)",confirmDetail:"Dies kann nicht rückgängig gemacht werden",cancelDetail:"Anbieter behalten"},nameDialog:{title:"Benutzerdef. Anbieter benennen",label:"Anbietername",placeholder:"z.B. DeepSeek (Proxy)"},modelsDialog:{title:"Modelle des benutzerdef. Anbieters",modelsTitle:"Modelle",modelsPlaceholder:"Modell-IDs (, oder neue Zeilen)",hint:", / Neue Zeile • Shift+Enter Neue Zeile • Enter Anwenden",fetch:"Modelle abrufen",fetching:"Modelle werden abgerufen…"},modelsFetchDialog:{title:"Modelle auswählen",searchPlaceholder:"Modelle filtern",hint:"Leertaste umschalten • Enter bestätigen • Esc abbrechen"},toast:{modelSet:"Modell gesetzt auf {provider} / {model}.",noModels:"Noch keine Modelle verfügbar. Zuerst Anbieter verbinden (/connect).",connectFirst:"Bitte verbinde zuerst einen Anbieter (/connect), bevor du deine erste Nachricht sendest.",apiKeyRequired:"API Key ist erforderlich.",baseUrlRequired:"Base URL ist erforderlich.",baseUrlInvalid:"Base URL muss mit http:// oder https:// beginnen",connected:"Verbunden mit {provider}.",connectedSelectModel:"Verbunden mit {provider}. Wähle ein Modell.",connectedCheckFailed:"Verbunden mit {provider}, aber Selbstprüfung fehlgeschlagen: {reason}",connectionTestPassed:"Verbindungstest bestanden: {provider}.",connectionTestFailed:"Verbindungstest fehlgeschlagen: {provider} - {reason}",connectionActionUpdateKey:"Aktion: Verbinden erneut öffnen und API Key aktualisieren, dann erneut testen.",connectionActionFixBaseUrl:"Aktion: Base-URL-Pfad prüfen (endet normalerweise mit /v1), dann erneut testen.",connectionActionSwitchKey:"Aktion: Einen Moment warten oder zu einem anderen Key/Anbieter wechseln.",connectionActionRetryTest:"Aktion: Netzwerk/Proxy prüfen und Verbindungstest erneut ausführen.",noModelsFetching:"Noch keine Modelle. Modellliste wird abgerufen…",firstUseGuide:'Schnellstart: 1) /connect 2) /models 3) "hallo" senden',firstUseSendHello:'Nächster Schritt: erste Nachricht senden (z.B.: "hallo").',connectionCheckUnauthorized:"401 Nicht autorisiert: API Key und Anbietertyp prüfen.",connectionCheckForbidden:"403 Verboten: Dein Key hat möglicherweise keinen Zugriff auf diesen Anbieter/dieses Modell.",connectionCheckNotFound:"404 Nicht gefunden: Base-URL-Pfad prüfen (OpenAI-kompatibel endet normalerweise mit /v1).",connectionCheckRateLimited:"429 Ratenlimit: Warten und erneut versuchen oder zu einem anderen Key/Anbieter wechseln.",connectionCheckTimeout:"Zeitüberschreitung: Netzwerk/Proxy prüfen und erneut versuchen.",connectionCheckNetwork:"Netzwerkverbindung fehlgeschlagen: DNS/Proxy/Base URL prüfen.",connectionCheckFailed:"Verbindungsprüfung fehlgeschlagen: {error}",apiKeyCleared:"API Key gelöscht für {provider}.",customAdded:"Benutzerdef. Anbieter hinzugefügt: {provider}.",customRenamed:"Benutzerdef. Anbieter umbenannt: {provider}.",customModelsUpdated:"Benutzerdef. Anbieter-Modelle aktualisiert: {provider}.",customDeleted:"Benutzerdef. Anbieter gelöscht: {provider}.",modelsRequired:"Mindestens ein Modell hinzufügen.",modelsEmpty:"Keine Modelle gefunden.",modelsFetchFailed:"Modelle konnten nicht abgerufen werden: {error}",modelsFetchChatCompletions:"Modellliste nicht unterstützt für /chat/completions oder /responses Base URL.",manualModelsRequired:"Dieser Endpunkt unterstützt keine automatische Modellerkennung. Bitte gib Modellnamen manuell in der Modellkonfiguration ein.",nameRequired:"Anbietername ist erforderlich.",nameConflict:"Anbietername existiert bereits."}},copyToast:{copiedToClipboard:"In Zwischenablage kopiert"}};var en_default4={common:{apply:"Apply",cancel:"Cancel",close:"Close",confirm:"Confirm",yes:"Yes",no:"No",exit:"Exit",back:"Back",next:"Next",save:"Save",empty:"—",unknownError:"Unknown error",inputClearTip:"Ctrl+C clear",total:"Total"},configDialog:{title:"Settings",hint:"Tab/Shift+Tab switch field • Enter Apply • Esc Cancel",modelsTitle:"Models (custom)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"Context Window",contextWindowLocked:"Context Window (model-defined)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperature",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperature: only numbers and "."',maxTokensTitle:"Max Output Tokens",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL (OpenAI-compatible)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Current:",apiKeyNotSet:"(not set)",apiKeyTitle:"API Key",apiKeyPlaceholder:"Paste a new key to update (leave empty to keep)",interleavedThinkingTitle:"Interleaved Thinking (Space to toggle)",interleavedThinkingLocked:"Interleaved Thinking (model-defined)",interleavedThinkingOpen:"Open",interleavedThinkingClose:"Close",tipIntensityTitle:"Tip Intensity",tipIntensityOff:"Off",tipIntensityLow:"Low",tipIntensityStandard:"Standard",shortcutsTitle:"Shortcuts",shortcutCommandsLabel:"Commands",shortcutTimelineLabel:"Timeline",shortcutNewSessionLabel:"New session",shortcutsPlaceholder:"e.g. mod+p",shortcutsHint:"Use mod/ctrl/alt/shift + key (a-z, 0-9, F1-F12)."},languageDialog:{title:"Language",hint:"Enter Apply • Esc Cancel",languageTitle:"Language",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Thinking Effort",hint:"Enter Apply • Esc Cancel",effortTitle:"Reasoning Effort",applied:"Reasoning effort set to {effort}",option:{low:"Low",medium:"Medium",high:"High",xhigh:"Extra High",max:"Max",minimal:"Minimal",none:"None",off:"Off",auto:"Auto"}},toolSettingsDialog:{title:"Tool Settings",hint:"Enter Apply • Esc Cancel",websearchTitle:"WebSearch API Key",apiKeyCurrentPrefix:"Current:",apiKeyNotSet:"(not set)",apiKeyInvalidCjk:"API Key cannot contain Chinese characters.",apiKeyInvalidSpaces:"API Key cannot contain spaces.",apiKeyPlaceholder:"Paste Serper API key"},pluginsDialog:{title:"Plugins",hint:"Select a plugin to configure • Esc Close",serperSearch:"Serper Search",serperSearchDetail:"Web search via Serper API",configured:"Configured",notConfigured:"Not configured",serperConfigTitle:"Serper Search Settings",serperConfigHint:"Tab Switch • Enter Apply • Esc Cancel"},skillsDialog:{title:"Skills",hint:"Enter Apply • Esc Cancel",empty:"No skills available",emptyFiltered:"No matching skills"},timelineDialog:{title:"Timeline",hint:"Tab Filter • Enter Open • Esc Close",empty:"No messages yet",emptyFiltered:"No matching entries",filterAll:"All messages",filterUser:"User messages",filterTool:"Tool calls"},mcpSettingsDialog:{title:"MCP",hint:"Edit the mcp.json file to configure MCP servers • Esc Close",configFileLabel:"Config file:",noServersHint:"No MCP servers configured yet.",serverCount:"{count} server(s) configured",guideText:"Edit the file above to add or modify MCP servers.",openFile:"Open File",reload:"Reload",close:"Close",reloaded:"MCP config reloaded.",reloadFailed:"Failed to reload: {error}",status:"Status",toolCount:"Tools",disabled:"disabled",testConnection:"Test",testing:"Testing connections...",testComplete:"Test complete.",testPartial:"Test complete with errors.",testFailed:"Connection failed: {error}",invalidJson:"Invalid JSON: {error}",invalidShape:'Invalid MCP JSON: expected "mcpServers".',invalidServer:"Invalid MCP server: {name}",noServers:"No MCP servers found.",lintOk:"JSON syntax OK",lintAt:"{error} (line {line}, col {column})",lintUnclosed:"Unclosed {char} (line {line}, col {column})",lintInvalid:"{error}",exampleFormat:"Example format:"},toolApprovalsDialog:{title:"Tool Approvals",useAuto:"Auto",useNormal:"Normal",useStrict:"Strict",close:"Close",focusedTitleAuto:"AUTO",focusedTitleNormal:"NORMAL",focusedTitleStrict:"STRICT",focusedTitleClose:"CLOSE",focusedDescAuto:"Auto-approve all tool calls. No approval prompts (fastest, least safe).",focusedDescNormal:"Auto-approve read-only tools. Prompt before write/execute tools.",focusedDescStrict:"Require confirmation for every tool call (safest, slowest).",focusedDescClose:"Close this dialog without changing the current setting.",currentPrefix:"Current: {mode}",tip:"Tip: Tab or ↑/↓ to move between buttons, Enter to confirm, Esc to close."},settingsDialog:{pendingApproval:"Resolve the pending approval before changing settings.",invalidShortcut:"Invalid shortcut for {label}: {value}",shortcutCommands:"Commands shortcut",shortcutTimeline:"Timeline shortcut",shortcutNewSession:"New session shortcut",toolApprovalsApplied:"Tool approvals: {mode}",applied:"Settings applied."},exitAppDialog:{title:"Exit DimCode",confirm:"Exit now?",warning:"An agent response is still in progress. Exiting will interrupt it.",reasonPrefix:"Reason: {reason}"},approvalDialog:{title:"Approve Tool Permission",toolLabel:"Tool: {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Permission: {permission} ({risk})",descriptionLabel:"Description: {description}",commandLabel:"Command:",inlineActionHint:"↑/← Prev ↓/→ Next Enter Confirm 1/2/3 Choose",inlineActionHintCompact:"←/→ Move Enter Confirm 1/2/3 Choose",buttons:{approve:"Approve",alwaysApprove:"Always approve",deny:"Deny",always:"Always",ok:"OK",no:"No",y:"Y",all:"All",n:"N"}},askUserDialog:{noQuestionsTitle:"No Questions",noQuestionsBody:"No questions to answer.",title:"Question {index}/{total}: {header}",defaultHeader:"Question",prev:"Prev",next:"Next",submit:"Submit",otherOption:"Other",otherDetail:"Provide a custom answer",inlineHintOptions:"Keys: ↑↓ to move, ←→ to switch questions, Enter to select.",inlineHintMulti:"Multi-select: Space toggles checked state.",inlineHintButtons:"Tab to buttons, ←→ to switch, Enter to activate, ↑ returns to options.",inlineHintNav:"Ctrl+Left / Ctrl+Right (or Ctrl+A / Ctrl+E) to switch questions.",inlineHintSubmit:"Ctrl+Enter submits, Esc cancels.",inlineButtonPrev:"[Prev]",inlineButtonNext:"[Next]",inlineButtonSubmit:"[Submit]",inlineButtonCancel:"[Cancel]",inlineActionHint:"Space Select ← Prev → Next Enter Next/Submit Esc Cancel",inlineActionHintCompact:"Space Select ←/→ Prev/Next Enter Next/Submit Esc Cancel",optionsSummaryAll:"{count} options",optionsSummaryVisibleMore:"{count} options ({start}-{end}) ↓ more",multiSelectHint:"[Multi-select] Space to toggle, Enter to confirm",singleSelectHint:"[Single-select] Use arrows, Enter to confirm",customAnswerLabel:"Custom answer:",customAnswerPlaceholder:"Type your answer...",otherPlaceholder:"Other selected — type your answer and press Enter to fill."},nextApiOAuthDialog:{title:"DimCode OAuth Login",copyUrl:"Copy URL",login:"Login",logout:"Logout",statusTitle:"Status",statusAuthenticated:"✓ Logged in as {email}",statusLoading:"⏳ Authenticating...",statusNotLoggedIn:"✗ Not logged in",instructionAuthenticated:"Use ↑↓ to navigate, Enter to select, or numbers 1-9",instructionLoading:"Press C to copy the URL below if browser did not open",instructionNeedsSetup:"Check the DimCode OAuth redirect_uri, scopes, and enabled state, then try again",instructionWithUrl:"Press C to copy the OAuth URL below, or press Enter to open browser",instructionUnauthed:"Press Enter to login with DimCode OAuth, or Esc to close",instructionManualCallback:"Copy the URL below, sign in in your browser, then paste the redirected URL into the input box.",oauthUrlTitleLoading:"OAuth URL (copy if browser did not open)",oauthUrlTitleReady:"OAuth URL (ready to use)",scrollIndicator:" [{start}-{end} of {total}]",selectModelTitle:"Select Model (↑↓/1-9, Enter to select){indicator}",aboutTitle:"About DimCode OAuth",setupTitle:"OAuth login error",aboutBulletOne:"• Uses the built-in DimCode OAuth client",aboutBulletTwo:"• Fetches relay models after login and stores provider config",aboutBulletThree:"• Uses OAuth refresh tokens instead of a long-lived API key",viewAllPlans:"View All Plans →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"DimCode Account",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"Generating OAuth URL...",urlReady:"OAuth URL ready! Copy it or press Enter to open browser.",generateUrlFailed:"Failed to generate OAuth URL: {error}",startingLogin:"Starting OAuth login...",browserOpened:"Browser opened. If not, copy the URL from the dialog.",copyUrlToLogin:"Copy the OAuth URL from the dialog to login.",urlCopied:"OAuth URL copied to clipboard.",urlCopyFailed:"Failed to copy OAuth URL.",authSuccess:"Successfully authenticated with DimCode OAuth!",loginFailed:"OAuth login failed: {error}",loggedOut:"Logged out from DimCode OAuth",loggedOutWithRemoteWarning:"Logged out from DimCode OAuth, but remote revoke failed: {error}",logoutFailed:"Logout failed: {error}",initFailed:"Dialog initialization error: {error}",modelSwitched:"Model switched to {model}",selectModelFailed:"Failed to select model: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Debug",titleDebugging:"Debugging",copy:"copy",proceed:"proceed",fixed:"fixed",body:"I’ve added debug logs (and possibly a fix). Please try to reproduce the issue now, then choose an outcome."},exitSessionDialog:{title:"Exit Session",confirm:"Exit the current session and return to Home?",note:"Next message will start a new session."},messageActionsDialog:{title:"Message Actions",revert:"Revert messages",revertWithFiles:"Revert messages and file changes",revertKeepFiles:"Revert messages (keep file changes)",revertFilesOnly:"Revert file changes only",copy:"Copy message text to clipboard",fork:"Fork create a new session",pin:"Pin message",unpin:"Unpin message"},pathPickerDialog:{hint:"↑/↓ select • Tab complete • Enter confirm • Esc close"},providerConnectDialog:{title:"Connect {provider}",providerFallback:"Provider",hint:"Tab switch • Ctrl+C clear • Enter Apply",hintOpenAI:"Tab switch • Ctrl+C clear • Enter Apply",hintGemini:"Tab switch • Ctrl+C clear • Enter Apply",hintAnthropic:"Tab switch • Ctrl+C clear • Enter Apply",hintGeneric:"Tab switch • Ctrl+C clear • Enter Apply",applyingHint:"Testing connection, please wait...",applyingButton:"Applying...",testConnection:"Test connection",baseUrlStatusAutoFix:"Auto-fix: {value}",baseUrlStatusInvalid:"Base URL must be http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API Key",apiKeyPlaceholder:"Paste a new key to update (leave empty to keep)",apiKeyCurrent:"Current: {value}",apiKeyNotSet:"Current: (not set)",apiKeyInvalidCjk:"API Key cannot contain Chinese characters.",apiKeyInvalidSpaces:"API Key cannot contain spaces.",clearKey:"Delete",useDetectedKey:"Use {name}",disconnectButton:"Disconnect"},redoConfirmDialog:{title:"Confirm Redo",body:"Are you sure you want to restore the reverted messages?"},renameSessionDialog:{title:"Rename session",label:"Session name",placeholder:"e.g. Planning notes"},sessionsDialog:{timeNow:"now",timeMinutes:"{count} min",timeHours:"{count} hr",timeDays:"{count} d",newSession:"New session",title:"Sessions ({count})",titleScoped:"Sessions ({count}/{total})",scope:"Scope: {cwd}",loading:"Loading…",confirmDelete:"Confirm delete: press Delete again",header:"{count} sessions • Arrow keys to navigate • Enter selects{range}{activity}",headerRange:" • Showing {start}-{end}",runningCount:"{count} running",pausedCount:"{count} waiting confirmation",hint:"Type to jump • ←/→ buttons • Enter confirm • Esc close",focusPrefix:"Focus: {focus}",focusList:"List",focusButtons:"Buttons",noSessionsCwd:"No sessions in this cwd",noSessions:"No saved sessions yet",nodeOnly:"Sessions are only available in Node/CLI mode.",newSessionTitle:"New Session",newSessionTarget:"a new session",busy:{agentResponding:"Agent is still responding",awaitingAskUser:"Awaiting AskUser answers",awaitingToolApproval:"Awaiting tool approval",pendingApproval:"Pending approval"},buttons:{open:"Open",delete:"Delete",deleteConfirm:"Delete (confirm)",scope:"Scope: {scope}",scopeCwd:"CWD",scopeAll:"All",refresh:"Refresh"}},sessionsOverlay:{title:"Sessions",hint:"Enter Select • Esc Close • Ctrl+R Refresh",loading:"Loading sessions...",empty:"No saved sessions yet."},switchSessionDialog:{title:"Switch Session",confirm:"Switch & Interrupt",target:"Switch to {target}?",fallback:"Switch sessions now?",warning:"This will interrupt the current response/flow in the active session.",reason:"Reason: {reason}"},themeDialog:{title:"Theme",hint:"Enter Apply • Esc Cancel",mode:"Mode",light:"Light",dark:"Dark",unavailable:"This terminal does not support switchable themes.",fallback:"A fixed light/dark ANSI fallback theme is used here.",tip:"Tip: default follows system theme."},commandPalette:{searchPlaceholder:"Search…",noMatches:"No matches",hint:"Type to filter • Enter: open • Esc: close",title:"Commands"},skills:{title:"Skills"},help:{title:"Help",modeLabel:"Mode: {mode}",modeDetail:"Current assistant mode.",shortcutsLabel:"Shortcuts",onboarding:`Welcome! Quick start:
1133
+ Tipp: {commandsKey} öffnet die Befehlspalette.`,items:{help:"Hilfe und Tastenkürzel (F1)",commands:"Befehlspalette (Ctrl+P)",back:"Zurück zum vorherigen Sprung",status:"Statusdetails umschalten"}},commands:{help:{label:"Hilfe",detail:"Tastenkürzel + häufige Befehle (F1)"},sessions:{label:"Sitzungen",detail:"Sitzung wählen oder erstellen (/sessions)"},timeline:{label:"Zeitleiste",detail:"Zu einer Benutzernachricht springen (/timeline)"},newSession:{label:"Neue Sitzung",detail:"Neue Sitzung starten (/new)"},connectProvider:{label:"Anbieter verbinden",detail:"Einen Anbieter verbinden (/connect)"},models:{label:"Modelle",detail:"Modell auswählen (/models)"},toolApprovals:{label:"Werkzeugfreigaben",detail:"Freigaben konfigurieren (/approvals)"},toolSettings:{label:"Werkzeugeinstellungen",detail:"Werkzeugspezifische Einstellungen (/tool-settings)"},mcpHub:{label:"MCP",detail:"MCP-Connectors und Einstellungen verwalten (/mcp)"},plugins:{label:"Plugins",detail:"Plugins verwalten (/plugins)"},debug:{label:"Debug",detail:"SDK-Observability-Logs (/debug)"},mcpSettings:{label:"MCP (Erweitertes JSON)",detail:"Rohes MCP-Server-JSON konfigurieren (/mcp-settings)"},language:{label:"Sprache",detail:"UI-Sprache wechseln (/language)"},settings:{label:"Einstellungen",detail:"Benutzerdefinierte Anbietereinstellungen (/settings, Ctrl+K)"}},homePage:{multilineTitle:"Mehrzeiliger Text",multilineTitleWithCount:"Mehrzeiliger Text ({count} Zeilen)",providerCustom:"Benutzerdefiniert",reviewPrompt:"hilf mir die Code-Änderungen zu überprüfen",footerCwd:"vz {cwd}",hints:{switchMode:"Modus wechseln",commands:"Befehle"},tips:{greeting:"Willkommen zurück! Versuche {commandsKey} oder {init} für den Einstieg.",commandsAlias:"Tipp: {key} öffnet die Befehlspalette."},prompts:{help:"Hilfe & Tastenkürzel (F1)",sessions:"Sitzungen auflisten/wählen",connect:"Anbieter verbinden",models:"Modell auswählen",newSession:"Neue Sitzung starten",approvals:"Werkzeugfreigaben konfigurieren (auto/normal/streng)",commands:"Befehlspalette öffnen",toolSettings:"Werkzeugspezifische Einstellungen",mcpSettings:"MCP öffnen",plugins:"Plugins verwalten",language:"UI-Sprache wechseln",theme:"Design auswählen",status:"Statusdetails umschalten",review:"Code-Änderungen überprüfen",init:"AGENTS.md initialisieren/verbessern",skills:"Geladene Skills auflisten",exit:"Anwendung beenden",debug:"Debug-Dialog (Chat)",settings:"Benutzerdefinierte Anbietereinstellungen"},commandPalette:{connect:"Anbieter verbinden",models:"Modell auswählen"},commands:{debugLabel:"Debug",debugDetail:"SDK-Observability-Logs (/debug)"},toast:{approvalsUsage:"Verwende /approvals (kein an/aus).",customProviderOnly:"Einstellungen nur für benutzerdefinierte Anbieter.",redoChatOnly:"Wiederherstellen nur in der Chat-Ansicht verfügbar.",retryChatOnly:"Wiederholen nur in der Chat-Ansicht verfügbar.",pinsChatOnly:"Angeheftete nur in der Chat-Ansicht verfügbar.",renameChatOnly:"Umbenennen nur in der Chat-Ansicht verfügbar (/rename <titel>).",commandRemoved:"Dieser Befehl ist nicht mehr verfügbar: {command}",helpAliasRemoved:"F1 für Hilfe drücken.",deleteConfirm:"Nochmal Entf drücken zum Bestätigen.",themeToggled:"Design: {mode}",pasteImagePending:"Bild wird noch verarbeitet. Bitte warten."}},chatPage:{placeholder:"Frage etwas... (Neue Zeile: Shift+Enter oder Ctrl+J)",placeholderAwaitingApproval:"Blockiert durch Freigabe: Freigeben / Ablehnen wählen zum Fortfahren.",reviewPrompt:"hilf mir die Code-Änderungen zu überprüfen",notification:{approvalTitle:"[Freigabe erforderlich] Werkzeugberechtigung",approvalMessage:"DimCode wartet auf Werkzeugfreigabe: {tool}.",doneTitle:"[Aufgabe erledigt]",doneMessage:"DimCode hat diese Aufgabe abgeschlossen.",doneMessageWithDuration:"DimCode hat diese Aufgabe in {duration} abgeschlossen.",doneMessageWithTools:"DimCode hat diese Aufgabe nach {tools} Werkzeugaufruf/en abgeschlossen.",doneMessageWithToolsAndDuration:"DimCode hat diese Aufgabe in {duration} mit {tools} Werkzeugaufruf/en abgeschlossen."},headerStats:"{messages} Nchr. · Gesamt {tokens}",contextChip:"≈{pct}% / {tokens} Tok.",contextChipCompact:"{pct}%",thinkingWords:"Zusammenführen,Dachten,Überlegen,Planen,Analysieren,Synthetisieren,Verfeinern,Verfassen",modelFallback:"Modell",mode:{plan:"Planen",agent:"Agent",debug:"Debug"},status:{approvalsAuto:"AUTO",approvalsAll:"ALLE",blockedByApproval:"Blockiert durch Freigabe",awaitingApprovalAction:"Warte auf deine Freigabe: Freigeben / Ablehnen wählen zum Fortfahren."},footer:{dragSelect:"ziehen zum Auswählen",openLink:"Ctrl+Klick um Dateien oder Links zu öffnen",esc:"esc",interrupt:"abbrechen",approvalPaused:"⏸ Pausiert",approvalPausedHint:"Warte auf Freigabe (Enter zum Wählen).",shortcuts:"Ctrl+K: Einstellungen Ctrl+O: Tools & Denken ein/aus Cmd+Delete/Ctrl+W: Eingabe löschen Tab: Modus wechseln {commandsKey}: Befehle",shortcutsCompact:"Ctrl+K: Einstell. Ctrl+O: Tools/Denken Cmd+Delete/Ctrl+W: löschen Tab: Modus {commandsKey}: Befehle",shortcutsMicro:"Ctrl+O: Tools {commandsKey}: Befehle",shortcutsMini:"{commandsKey}: Befehle"},session:{new:"neu"},timeline:{title:"Zeitleiste",empty:"(leer)",filterAll:"Alle Nachrichten",filterUser:"Benutzernachrichten",filterTool:"Werkzeugaufrufe"},pins:{title:"Angeheftet",empty:"(leer)"},jumpToBottom:{button:"↓"},prompts:{help:"Hilfe & Tastenkürzel (F1)",newSession:"Neue Sitzung starten",resume:"Angehaltene Warteschlange fortsetzen",sessions:"Sitzungen auflisten/wählen",timeline:"Zu einer Benutzernachricht springen",pins:"Angeheftete Nachrichten öffnen",pin:"Letzte Nachricht anheften",back:"Zurück zum vorherigen Sprung",connect:"Anbieter verbinden",models:"Modell auswählen",theme:"Design wechseln",approvals:"Werkzeugfreigaben konfigurieren (auto/normal/streng)",commands:"Befehlspalette öffnen",toolSettings:"Werkzeugspezifische Einstellungen",mcpSettings:"MCP öffnen",plugins:"Plugins verwalten",language:"UI-Sprache wechseln",status:"Statusdetails umschalten",review:"Code-Änderungen überprüfen",retry:"Letzte Benutzernachricht wiederholen",compact:"Sitzungskontext komprimieren",init:"AGENTS.md initialisieren/verbessern",rename:"Aktuelle Sitzung umbenennen",skills:"Geladene Skills auflisten",exit:"Anwendung beenden",debug:"Debug-Dialog",settings:"Benutzerdefinierte Anbietereinstellungen"},commands:{pinsLabel:"Angeheftet",pinsDetail:"Angeheftete Nachrichten öffnen",backLabel:"Zurück",backDetail:"Zum vorherigen Sprung zurückkehren",debugLabel:"Debug",debugDetail:"SDK-Observability-Logs (/debug)",statusLabel:"Status",statusDetail:"Statusdetails umschalten",themeLabel:"Design",themeDetail:"Farbdesign wechseln"},tips:{contextWarn:"Tipp: Kontext wird voll. Verwende /compact oder /new, um Antworten präzise zu halten.",contextCritical:"Tipp: Du bist nah am Kontextlimit. Starte eine neue Sitzung mit /new (oder zuerst /compact).",timeline:"Tipp: Langer Chat? Verwende /tl, um zu einer bestimmten Benutzernachricht zu springen.",timelineAlias:"Tipp: /tl ist eine Kurzform für /timeline.",commandsAlias:"Tipp: {key} öffnet die Befehlspalette.",errorRecovery:"Tipp: Wenn etwas fehlgeschlagen ist, versuche /compact oder /new.",greeting:"Willkommen zurück! Versuche {commandsKey} oder {init} für den Einstieg.",compactDelight:"Schön! Schlanker Kontext hilft.",addTests:'Alles klar! Soll ich Tests hinzufügen? Antworte "ja" oder "ok".'},confirm:{addTests:"Bitte füge Tests für die gerade gemachten Änderungen hinzu."},toast:{customProviderOnly:"Einstellungen nur für benutzerdefinierte Anbieter.",renameNodeOnly:"Umbenennen nur im Node/CLI-Modus verfügbar.",noActiveSession:"Keine aktive Sitzung zum Umbenennen.",sessionNameEmpty:"Sitzungsname darf nicht leer sein.",sessionRenamed:"Sitzung umbenannt zu: {title}",renameFailed:"Sitzung konnte nicht umbenannt werden.",linkOpenHint:"Tipp: Ctrl+Klick um Dateien oder Links zu öffnen.",copySuccess:"Kopiert",copyFailed:"Kopieren fehlgeschlagen",forkFailed:"Abspaltung der Sitzung fehlgeschlagen.",backEmpty:"Kein vorheriger Sprung zum Zurückkehren.",pinsEmpty:"Noch keine angehefteten Nachrichten.",pinEmpty:"Keine Nachricht zum Anheften.",pinned:"Nachricht angeheftet.",unpinned:"Nachricht gelöst.",debugUnavailable:"Debug-Server ist nicht verfügbar.",approvalsUsage:"Verwende /approvals (kein an/aus).",debugDialogOpened:"Debug-Dialog geöffnet.",debugDialogClosed:"Debug-Dialog geschlossen.",renameUsage:"Verwendung: /rename <titel>",themeToggled:"Design: {mode}",statusCompactOn:"Status: kompakt",statusCompactOff:"Status: detailliert",compactingSession:"Sitzung wird komprimiert...",compactSuccess:"Sitzung komprimiert: {message}",compactWarning:"Sitzung komprimiert mit begrenztem Gewinn: {message}",compactSuccessDetailWithTokens:"Die ersten {count} Verlaufsnachrichten zu einer Zusammenfassung zusammengefasst. Geschätzte Eingabe {before} -> {after} Tokens, ca. {saved} Tokens eingespart.",compactSuccessDetailNotReduced:"Die ersten {count} Verlaufsnachrichten zu einer Zusammenfassung zusammengefasst, aber die geschätzte Eingabe änderte sich von {before} auf {after} Tokens, daher wurde die Anfragegröße nicht reduziert.",compactSuccessDetailCountOnly:"Die ersten {count} Verlaufsnachrichten zu einer Zusammenfassung zusammengefasst.",compactSuccessDetailSummaryOnly:"Neue Gesprächszusammenfassung erstellt.",compactFailed:"Sitzungskomprimierung fehlgeschlagen: {error}",compactFailedTokenLimit:"Komprimierung wegen unzureichendem Kontextbudget fehlgeschlagen. DIMCODE_CONTEXT_WINDOW korrekt setzen, zu einem Modell mit größerem Kontext wechseln oder /new verwenden. Detail: {error}",retryEmpty:"Keine vorherige Benutzernachricht zum Wiederholen.",commandRemoved:"Dieser Befehl ist nicht mehr verfügbar: {command}",helpAliasRemoved:"F1 für Hilfe drücken.",waitForResponse:"Bitte warte, bis die aktuelle Antwort abgeschlossen ist, oder drücke Esc zum Abbrechen.",pasteImagePending:"Bild wird noch verarbeitet. Bitte warten.",pendingApproval:"Bitte zuerst tool_approve erledigen.",awaitingApprovalAction:"Pausiert: Handlung nötig. Freigeben / Immer freigeben / Ablehnen in der Berechtigungskarte wählen.",awaitingApprovalStillWaiting:"Warte weiterhin auf Freigabe ({seconds}s). Das Modell fährt nicht fort, bis du freigibst oder ablehnst.",pendingAskUser:"Bitte zuerst ask_user erledigen.",notificationSessionBusy:"Diese Benachrichtigung gehört zu einer anderen beschäftigten Sitzung. Beende diese Arbeit oder wechsle zuerst manuell die Sitzung.",notificationSessionUnavailable:"Die Sitzung für diese Benachrichtigung kann hier nicht geöffnet werden.",notificationSessionSwitchFailed:"Sitzung für diese Benachrichtigung konnte nicht geöffnet werden.",approvalNotActive:"Diese Freigabe ist in der Warteschlange. Erledige zuerst die aktive.",askUserNotActive:"Diese ask_user-Anfrage ist nicht mehr aktiv."}},chatQueue:{label:"Warteschlange ({count})",labelCompact:"Warteschl. {count}",more:"+{count} weitere…",resumeToken:"/resume",resumePlainToken:"fortsetzen",resumeLegacyToken:"Warteschlange fortsetzen",state:{idle:"Ausstehend",running:"Läuft",paused:"Pausiert",error:"Fehler"},item:{steerAction:"Lenken",steerReady:"Erstens",steerPending:"Nächstes",steerPaused:"Pausiert"},toast:{enqueued:"Zur Warteschlange hinzugefügt (#{count}).",full:"Warteschlange ist voll (max. 5). Lösche eine oder starte /new.",cleared:"{count} Warteschlangenelement/e gelöscht.",deleted:"{count} Warteschlangenelement/e gelöscht. Ctrl+Z zum Rückgängig machen.",steerPromoted:"Zu Lenkung hochgestuft. Wird zuerst ausgeführt, wenn die Warteschlange fortgesetzt wird.",steerQueued:"Lenkung kann nicht sofort eingespeist werden. Sie wurde hochgestuft und wird in der nächsten Runde zuerst ausgeführt.",steerSent:"Lenkung akzeptiert. Wird vor dem nächsten Modellaufruf in dieser Runde eingespeist.",undo:"Warteschlangen-Löschen rückgängig gemacht.",pausedTip:"Warteschlange pausiert. Verwende {resume} oder {resumeText} zum Fortsetzen, oder sende eine neue Nachricht zum Entscheiden.",stale:"Warteschlange pausiert: Anfrage scheint festzustecken."},confirm:{title:"Nachrichten in der Warteschlange fortsetzen?",description:"Vorherige Anfrage nicht abgeschlossen. {count} Nachricht/en in der Warteschlange.",hint:"Fortsetzen, um das nächste Element zu senden, oder Warteschlange pausieren.",continue:"Fortsetzen",pause:"Pausieren",reason:"Grund: {reason}"},reason:{network_error:"Netzwerkfehler.",timeout:"Zeitüberschreitung der Anfrage.",canceled_by_user:"Vom Benutzer abgebrochen.",rate_limited:"Ratenlimit erreicht.",config_unavailable:"Gespeicherte Konfiguration nicht verfügbar.",unknown:"Anfrage fehlgeschlagen."},draftDecision:{title:"Warteschlange ist pausiert",description:"{count} Nachricht/en in der Warteschlange warten noch. Entscheide, was mit deiner neuen Eingabe passieren soll.",previewLabel:"Neue Eingabe:",continue:"Warteschlange fortsetzen",append:"An Warteschlange anhängen",replace:"Warteschlange verwerfen & senden"}},chatStatus:{done:"Fertig.",error:"Fehler.",interrupted:"Abgebrochen.",permissionDenied:"Berechtigung verweigert.",planning:"Planen…",drafting:"Entwerfen…",retrying:"Wiederholen ({retry}/{maxAttempts})…",runningTool:"{tool} ausführen…",runningTools:"{count} Werkzeuge ausführen…",approvalPendingOther:"Eine andere Freigabe ist ausstehend ({permission})…",awaitingApproval:"Warte auf Freigabe…",awaitingApprovalWithPerm:"Warte auf Freigabe ({permission})…",awaitingApprovalWithRisk:"Warte auf Freigabe ({risk})…",awaitingAnswers:"Warte auf Antworten…",resumingApproved:"Freigegeben. Fortsetzen…",resumingDenied:"Abgelehnt. Fortsetzen…",resuming:"Fortsetzen…",autoApprovingWithRisk:"Auto-Freigabe ({risk})…",riskFallback:"Risiko",toolFallback:"Werkzeug",thinking:"Denken…",autoCompactionRequired:"Kontext nahe dem Limit. Komprimierung erforderlich.",autoCompactionRequiredDetailed:"Kontext nahe dem Limit · nächste Anfrage auf geschätzt {estimated} Tokens, Auto-Komprimierung startet bei {threshold} Tokens, daher ist Komprimierung erforderlich.",compressed:"Kontext komprimiert · {removed} ältere Nachrichten zu einer Zusammenfassung zusammengefasst, ca. {saved} Eingabe-Tokens eingespart ({elapsed}ms)",autoCompactedDetailed:"Auto-Komprimierung abgeschlossen · {removed} ältere Nachrichten zu einer Zusammenfassung zusammengefasst, geschätzte Eingabe {before} -> {after} Tokens, ca. {saved} Tokens eingespart",autoCompactedNotReduced:"Auto-Komprimierung abgeschlossen · {removed} ältere Nachrichten zu einer Zusammenfassung zusammengefasst, aber die geschätzte Eingabe änderte sich von {before} auf {after} Tokens, daher wurde die Anfragegröße nicht reduziert",autoCompactedSaved:"Auto-Komprimierung abgeschlossen · {removed} ältere Nachrichten zu einer Zusammenfassung zusammengefasst, ca. {saved} Tokens eingespart",autoCompactedCountOnly:"Auto-Komprimierung abgeschlossen · {removed} ältere Nachrichten zu einer Zusammenfassung zusammengefasst",interruptedMarkdown:"> **Abgebrochen** · Antwort vom Benutzer abgebrochen (`Esc`).",awaitingApprovalPrefix:"Warte auf Freigabe",awaitingAnswersPrefix:"Warte auf Antworten",approvalPendingPrefix:"Andere Freigabe ist ausstehend",autoApprovingPrefix:"Auto-Freigabe"},chatParts:{thinking:"Denken",plan:"Plan",todo:"Aufgaben"},chatRender:{userLabel:"Benutzer",outputLabel:"↳ Ausgabe",outputLabelShort:"Ausg.:",canceled:"abgebrochen",inputLabel:"Eing.:",collapse:"... (einklappen)",moreLines:"... ({count} weitere Zeilen)",moreLinesOmitted:"... ({count} weitere Zeilen ausgelassen; {envVar} erhöhen)",streamingTail:"… (Streaming: letzte {shown} Zeichen; {omitted} ausgelassen)",copy:"Kopieren",userResponses:"Benutzerantworten:",approvalQueued:"Warte auf vorherige Freigabe...",proposedPlan:{title:"Vorgeschlagener Plan"},llmMeta:{changedFiles:"{count} Datei/en geändert: {files}",changedFilesMore:"+{count} weitere",revertHint:"Tipp: Diese Nachricht anklicken -> Nachrichten zurücksetzen, um diesen Zug rückgängig zu machen.",changedFilesCardTitle:"{count} Dateien geändert:",revertButton:"Zurücksetzen"},toolName:{explore:"Erkunden",subagent:"Unteragent"},toolSuffix:{offset:"Versatz {value}",limit:"Limit {value}",matches:"{count} Treffer",todos:"{count} Aufgaben",results:"{count} Ergebnisse",results_one:"{count} Ergebnis"},toolGroup:{readFiles:"{count} Dateien lesen",writeFiles:"{count} Dateien schreiben",editFiles:"{count} Dateien bearbeiten",globPatterns:"Glob {count} Muster",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} Muster",bashCommands:"{count} Befehle ausführen",searchQueries:"{count} Suchanfragen",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"Suche kann auf das Netzwerk zugreifen.",bash:"Bash kann Befehle ausführen.",edit:"Dateiänderungen können lokale Dateien verändern.",grep:"Grep kann lokale Dateien lesen."},inlineHint:"Tasten: ↑↓←→ bewegen, Enter auswählen.",awaitingUserAction:"Warte auf deine Aktion: Freigeben / Immer freigeben / Ablehnen wählen.",decision:{userDenied:"Benutzer hat Freigabe abgelehnt"},denied:{title:"# Werkzeugberechtigung abgelehnt",toolLine:"- Werkzeug: `{tool}`",permissionLine:"- Berechtigung: `{permission}`",hint:"Du kannst den tool_call neu auswählen und es erneut versuchen."},summary:{title:"# Freigegebenes + ausgeführtes Werkzeug",permissionLine:"Berechtigung `{permission}` freigegeben für `{tool}`."},required:"Freigabe erforderlich ({risk}).",args:{commandWithDescription:"Befehl: {command} - {description}",command:"Befehl: {command}",description:"Beschreibung: {description}",raw:"Args: {args}"}},pathPicker:{titleWorkspace:"Arbeitsbereich wählen",titleFile:"Datei wählen",placeholderWorkspace:"Pfad eingeben (../ usw). Tab zum Vervollständigen. Enter wählt ein Verzeichnis.",placeholderFile:"Pfad eingeben (../ usw). Tab zum Vervollständigen. Enter wählt eine Datei."},providerDialogs:{customLabel:"Benutzerdefiniert",customDetail:"benutzerdefiniert",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Mit DimCode OAuth anmelden",addCustomLabel:"Benutzerdef. Anbieter hinzufügen",addCustomDetail:"benutzerdef. Anbieter hinzufügen",providerFallback:"Anbieter",adapter:{openai:"OpenAI",openaiOpenRouter:"OpenAI-kompatibel (OpenRouter)",openaiLocal:"OpenAI-kompatibel (Lokaler Endpunkt)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Konfiguriert",notConfigured:"Nicht konfiguriert"},manage:{title:"Benutzerdef. Anbieter: {provider}",connect:"Verbinden",connectDetail:"API Key / Base URL bearbeiten",rename:"Umbenennen",renameDetail:"Anbieternamen bearbeiten",models:"Modelle bearbeiten",modelsDetail:"Verfügbare Modell-IDs aktualisieren",delete:"Löschen",deleteDetail:"Diesen Anbieter entfernen"},deleteConfirm:{title:"{provider} löschen?",confirm:"Löschen (bestätigen)",confirmDetail:"Dies kann nicht rückgängig gemacht werden",cancelDetail:"Anbieter behalten"},nameDialog:{title:"Benutzerdef. Anbieter benennen",label:"Anbietername",placeholder:"z.B. DeepSeek (Proxy)"},modelsDialog:{title:"Modelle des benutzerdef. Anbieters",modelsTitle:"Modelle",modelsPlaceholder:"Modell-IDs (, oder neue Zeilen)",hint:", / Neue Zeile • Shift+Enter Neue Zeile • Enter Anwenden",fetch:"Modelle abrufen",fetching:"Modelle werden abgerufen…"},modelsFetchDialog:{title:"Modelle auswählen",searchPlaceholder:"Modelle filtern",hint:"Leertaste umschalten • Enter bestätigen • Esc abbrechen"},toast:{modelSet:"Modell gesetzt auf {provider} / {model}.",noModels:"Noch keine Modelle verfügbar. Zuerst Anbieter verbinden (/connect).",connectFirst:"Bitte verbinde zuerst einen Anbieter (/connect), bevor du deine erste Nachricht sendest.",apiKeyRequired:"API Key ist erforderlich.",baseUrlRequired:"Base URL ist erforderlich.",baseUrlInvalid:"Base URL muss mit http:// oder https:// beginnen",connected:"Verbunden mit {provider}.",connectedSelectModel:"Verbunden mit {provider}. Wähle ein Modell.",connectedCheckFailed:"Verbunden mit {provider}, aber Selbstprüfung fehlgeschlagen: {reason}",connectionTestPassed:"Verbindungstest bestanden: {provider}.",connectionTestFailed:"Verbindungstest fehlgeschlagen: {provider} - {reason}",connectionActionUpdateKey:"Aktion: Verbinden erneut öffnen und API Key aktualisieren, dann erneut testen.",connectionActionFixBaseUrl:"Aktion: Base-URL-Pfad prüfen (endet normalerweise mit /v1), dann erneut testen.",connectionActionSwitchKey:"Aktion: Einen Moment warten oder zu einem anderen Key/Anbieter wechseln.",connectionActionRetryTest:"Aktion: Netzwerk/Proxy prüfen und Verbindungstest erneut ausführen.",noModelsFetching:"Noch keine Modelle. Modellliste wird abgerufen…",firstUseGuide:'Schnellstart: 1) /connect 2) /models 3) "hallo" senden',firstUseSendHello:'Nächster Schritt: erste Nachricht senden (z.B.: "hallo").',connectionCheckUnauthorized:"401 Nicht autorisiert: API Key und Anbietertyp prüfen.",connectionCheckForbidden:"403 Verboten: Dein Key hat möglicherweise keinen Zugriff auf diesen Anbieter/dieses Modell.",connectionCheckNotFound:"404 Nicht gefunden: Base-URL-Pfad prüfen (OpenAI-kompatibel endet normalerweise mit /v1).",connectionCheckRateLimited:"429 Ratenlimit: Warten und erneut versuchen oder zu einem anderen Key/Anbieter wechseln.",connectionCheckTimeout:"Zeitüberschreitung: Netzwerk/Proxy prüfen und erneut versuchen.",connectionCheckNetwork:"Netzwerkverbindung fehlgeschlagen: DNS/Proxy/Base URL prüfen.",connectionCheckFailed:"Verbindungsprüfung fehlgeschlagen: {error}",apiKeyCleared:"API Key gelöscht für {provider}.",customAdded:"Benutzerdef. Anbieter hinzugefügt: {provider}.",customRenamed:"Benutzerdef. Anbieter umbenannt: {provider}.",customModelsUpdated:"Benutzerdef. Anbieter-Modelle aktualisiert: {provider}.",customDeleted:"Benutzerdef. Anbieter gelöscht: {provider}.",modelsRequired:"Mindestens ein Modell hinzufügen.",modelsEmpty:"Keine Modelle gefunden.",modelsFetchFailed:"Modelle konnten nicht abgerufen werden: {error}",modelsFetchChatCompletions:"Modellliste nicht unterstützt für /chat/completions oder /responses Base URL.",manualModelsRequired:"Dieser Endpunkt unterstützt keine automatische Modellerkennung. Bitte gib Modellnamen manuell in der Modellkonfiguration ein.",nameRequired:"Anbietername ist erforderlich.",nameConflict:"Anbietername existiert bereits."}},copyToast:{copiedToClipboard:"In Zwischenablage kopiert"}};var en_default4={common:{apply:"Apply",cancel:"Cancel",close:"Close",confirm:"Confirm",yes:"Yes",no:"No",exit:"Exit",back:"Back",next:"Next",save:"Save",empty:"—",unknownError:"Unknown error",inputClearTip:"Ctrl+C clear",total:"Total"},configDialog:{title:"Settings",hint:"Tab/Shift+Tab switch field • Enter Apply • Esc Cancel",modelsTitle:"Models (custom)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"Context Window",contextWindowLocked:"Context Window (model-defined)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperature",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperature: only numbers and "."',maxTokensTitle:"Max Output Tokens",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL (OpenAI-compatible)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Current:",apiKeyNotSet:"(not set)",apiKeyTitle:"API Key",apiKeyPlaceholder:"Paste a new key to update (leave empty to keep)",interleavedThinkingTitle:"Interleaved Thinking (Space to toggle)",interleavedThinkingLocked:"Interleaved Thinking (model-defined)",interleavedThinkingOpen:"Open",interleavedThinkingClose:"Close",tipIntensityTitle:"Tip Intensity",tipIntensityOff:"Off",tipIntensityLow:"Low",tipIntensityStandard:"Standard",shortcutsTitle:"Shortcuts",shortcutCommandsLabel:"Commands",shortcutTimelineLabel:"Timeline",shortcutNewSessionLabel:"New session",shortcutsPlaceholder:"e.g. mod+p",shortcutsHint:"Use mod/ctrl/alt/shift + key (a-z, 0-9, F1-F12)."},languageDialog:{title:"Language",hint:"Enter Apply • Esc Cancel",languageTitle:"Language",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Thinking Effort",hint:"Enter Apply • Esc Cancel",effortTitle:"Reasoning Effort",applied:"Reasoning effort set to {effort}",option:{low:"Low",medium:"Medium",high:"High",xhigh:"Extra High",max:"Max",minimal:"Minimal",none:"None",off:"Off",auto:"Auto"}},toolSettingsDialog:{title:"Tool Settings",hint:"Enter Apply • Esc Cancel",websearchTitle:"WebSearch API Key",apiKeyCurrentPrefix:"Current:",apiKeyNotSet:"(not set)",apiKeyInvalidCjk:"API Key cannot contain Chinese characters.",apiKeyInvalidSpaces:"API Key cannot contain spaces.",apiKeyPlaceholder:"Paste Serper API key"},pluginsDialog:{title:"Plugins",hint:"Select a plugin to configure • Esc Close",serperSearch:"Serper Search",serperSearchDetail:"Web search via Serper API",configured:"Configured",notConfigured:"Not configured",serperConfigTitle:"Serper Search Settings",serperConfigHint:"Tab Switch • Enter Apply • Esc Cancel"},skillsDialog:{title:"Skills",hint:"Enter Apply • Esc Cancel",empty:"No skills available",emptyFiltered:"No matching skills"},timelineDialog:{title:"Timeline",hint:"Tab Filter • Enter Open • Esc Close",empty:"No messages yet",emptyFiltered:"No matching entries",filterAll:"All messages",filterUser:"User messages",filterTool:"Tool calls"},mcpSettingsDialog:{title:"MCP",hint:"Edit the mcp.json file to configure MCP servers • Esc Close",configFileLabel:"Config file:",noServersHint:"No MCP servers configured yet.",serverCount:"{count} server(s) configured",guideText:"Edit the file above to add or modify MCP servers.",openFile:"Open File",reload:"Reload",close:"Close",reloaded:"MCP config reloaded.",reloadFailed:"Failed to reload: {error}",status:"Status",toolCount:"Tools",disabled:"disabled",testConnection:"Test",testing:"Testing connections...",testComplete:"Test complete.",testPartial:"Test complete with errors.",testFailed:"Connection failed: {error}",invalidJson:"Invalid JSON: {error}",invalidShape:'Invalid MCP JSON: expected "mcpServers".',invalidServer:"Invalid MCP server: {name}",noServers:"No MCP servers found.",lintOk:"JSON syntax OK",lintAt:"{error} (line {line}, col {column})",lintUnclosed:"Unclosed {char} (line {line}, col {column})",lintInvalid:"{error}",exampleFormat:"Example format:"},toolApprovalsDialog:{title:"Tool Approvals",useAuto:"Auto",useNormal:"Normal",useStrict:"Strict",close:"Close",focusedTitleAuto:"AUTO",focusedTitleNormal:"NORMAL",focusedTitleStrict:"STRICT",focusedTitleClose:"CLOSE",focusedDescAuto:"Auto-approve all tool calls. No approval prompts (fastest, least safe).",focusedDescNormal:"Auto-approve read-only tools. Prompt before write/execute tools.",focusedDescStrict:"Require confirmation for every tool call (safest, slowest).",focusedDescClose:"Close this dialog without changing the current setting.",currentPrefix:"Current: {mode}",tip:"Tip: Tab or ↑/↓ to move between buttons, Enter to confirm, Esc to close."},settingsDialog:{pendingApproval:"Resolve the pending approval before changing settings.",invalidShortcut:"Invalid shortcut for {label}: {value}",shortcutCommands:"Commands shortcut",shortcutTimeline:"Timeline shortcut",shortcutNewSession:"New session shortcut",toolApprovalsApplied:"Tool approvals: {mode}",applied:"Settings applied."},exitAppDialog:{title:"Exit DimCode",confirm:"Exit now?",warning:"An agent response is still in progress. Exiting will interrupt it.",reasonPrefix:"Reason: {reason}"},approvalDialog:{title:"Approve Tool Permission",toolLabel:"Tool: {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Permission: {permission} ({risk})",descriptionLabel:"Description: {description}",commandLabel:"Command:",inlineActionHint:"↑/← Prev ↓/→ Next Enter Confirm 1/2/3 Choose",inlineActionHintCompact:"←/→ Move Enter Confirm 1/2/3 Choose",buttons:{approve:"Approve",alwaysApprove:"Always approve",deny:"Deny",always:"Always",ok:"OK",no:"No",y:"Y",all:"All",n:"N"}},askUserDialog:{noQuestionsTitle:"No Questions",noQuestionsBody:"No questions to answer.",title:"Question {index}/{total}: {header}",defaultHeader:"Question",prev:"Prev",next:"Next",submit:"Submit",otherOption:"Other",otherDetail:"Provide a custom answer",inlineHintOptions:"Keys: ↑↓ to move, ←→ to switch questions, Enter to select.",inlineHintMulti:"Multi-select: Space toggles checked state.",inlineHintButtons:"Tab to buttons, ←→ to switch, Enter to activate, ↑ returns to options.",inlineHintNav:"Ctrl+Left / Ctrl+Right (or Ctrl+A / Ctrl+E) to switch questions.",inlineHintSubmit:"Ctrl+Enter submits, Esc cancels.",inlineButtonPrev:"[Prev]",inlineButtonNext:"[Next]",inlineButtonSubmit:"[Submit]",inlineButtonCancel:"[Cancel]",inlineActionHint:"Space Select ← Prev → Next Enter Next/Submit Esc Cancel",inlineActionHintCompact:"Space Select ←/→ Prev/Next Enter Next/Submit Esc Cancel",optionsSummaryAll:"{count} options",optionsSummaryVisibleMore:"{count} options ({start}-{end}) ↓ more",multiSelectHint:"[Multi-select] Space to toggle, Enter to confirm",singleSelectHint:"[Single-select] Use arrows, Enter to confirm",customAnswerLabel:"Custom answer:",customAnswerPlaceholder:"Type your answer...",otherPlaceholder:"Other selected — type your answer and press Enter to fill."},nextApiOAuthDialog:{title:"DimCode OAuth Login",copyUrl:"Copy URL",login:"Login",logout:"Logout",statusTitle:"Status",statusAuthenticated:"✓ Logged in as {email}",statusLoading:"⏳ Authenticating...",statusNotLoggedIn:"✗ Not logged in",instructionAuthenticated:"Use ↑↓ to navigate, Enter to select, or numbers 1-9",instructionLoading:"Press C to copy the URL below if browser did not open",instructionNeedsSetup:"Check the DimCode OAuth redirect_uri, scopes, and enabled state, then try again",instructionWithUrl:"Press C to copy the OAuth URL below, or press Enter to open browser",instructionUnauthed:"Press Enter to login with DimCode OAuth, or Esc to close",instructionManualCallback:"Copy the URL below, sign in in your browser, then paste the redirected URL into the input box.",oauthUrlTitleLoading:"OAuth URL (copy if browser did not open)",oauthUrlTitleReady:"OAuth URL (ready to use)",scrollIndicator:" [{start}-{end} of {total}]",selectModelTitle:"Select Model (↑↓/1-9, Enter to select){indicator}",aboutTitle:"About DimCode OAuth",setupTitle:"OAuth login error",aboutBulletOne:"• Uses the built-in DimCode OAuth client",aboutBulletTwo:"• Fetches relay models after login and stores provider config",aboutBulletThree:"• Uses OAuth refresh tokens instead of a long-lived API key",viewAllPlans:"View All Plans →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"DimCode Account",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"Generating OAuth URL...",urlReady:"OAuth URL ready! Copy it or press Enter to open browser.",generateUrlFailed:"Failed to generate OAuth URL: {error}",startingLogin:"Starting OAuth login...",browserOpened:"Browser opened. If not, copy the URL from the dialog.",copyUrlToLogin:"Copy the OAuth URL from the dialog to login.",urlCopied:"OAuth URL copied to clipboard.",urlCopyFailed:"Failed to copy OAuth URL.",authSuccess:"Successfully authenticated with DimCode OAuth!",loginFailed:"OAuth login failed: {error}",loggedOut:"Logged out from DimCode OAuth",loggedOutWithRemoteWarning:"Logged out from DimCode OAuth, but remote revoke failed: {error}",logoutFailed:"Logout failed: {error}",initFailed:"Dialog initialization error: {error}",modelSwitched:"Model switched to {model}",selectModelFailed:"Failed to select model: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Debug",titleDebugging:"Debugging",copy:"copy",proceed:"proceed",fixed:"fixed",body:"I’ve added debug logs (and possibly a fix). Please try to reproduce the issue now, then choose an outcome."},exitSessionDialog:{title:"Exit Session",confirm:"Exit the current session and return to Home?",note:"Next message will start a new session."},messageActionsDialog:{title:"Message Actions",revert:"Revert messages",revertWithFiles:"Revert messages and file changes",revertKeepFiles:"Revert messages (keep file changes)",revertFilesOnly:"Revert file changes only",copy:"Copy message text to clipboard",fork:"Fork create a new session",pin:"Pin message",unpin:"Unpin message"},pathPickerDialog:{hint:"↑/↓ select • Tab complete • Enter confirm • Esc close"},providerConnectDialog:{title:"Connect {provider}",providerFallback:"Provider",hint:"Tab switch • Ctrl+C clear • Enter Apply",hintOpenAI:"Tab switch • Ctrl+C clear • Enter Apply",hintGemini:"Tab switch • Ctrl+C clear • Enter Apply",hintAnthropic:"Tab switch • Ctrl+C clear • Enter Apply",hintGeneric:"Tab switch • Ctrl+C clear • Enter Apply",applyingHint:"Testing connection, please wait...",applyingButton:"Applying...",testConnection:"Test connection",baseUrlStatusAutoFix:"Auto-fix: {value}",baseUrlStatusInvalid:"Base URL must be http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API Key",apiKeyPlaceholder:"Paste a new key to update (leave empty to keep)",apiKeyCurrent:"Current: {value}",apiKeyNotSet:"Current: (not set)",apiKeyInvalidCjk:"API Key cannot contain Chinese characters.",apiKeyInvalidSpaces:"API Key cannot contain spaces.",clearKey:"Delete",useDetectedKey:"Use {name}",disconnectButton:"Disconnect"},redoConfirmDialog:{title:"Confirm Redo",body:"Are you sure you want to restore the reverted messages?"},renameSessionDialog:{title:"Rename session",label:"Session name",placeholder:"e.g. Planning notes"},sessionsDialog:{timeNow:"now",timeMinutes:"{count} min",timeHours:"{count} hr",timeDays:"{count} d",newSession:"New session",title:"Sessions ({count})",titleScoped:"Sessions ({count}/{total})",scope:"Scope: {cwd}",loading:"Loading…",confirmDelete:"Confirm delete: press Delete again",header:"{count} sessions • Arrow keys to navigate • Enter selects{range}{activity}",headerRange:" • Showing {start}-{end}",runningCount:"{count} running",pausedCount:"{count} waiting confirmation",hint:"Type to jump • ←/→ buttons • Enter confirm • Esc close",focusPrefix:"Focus: {focus}",focusList:"List",focusButtons:"Buttons",noSessionsCwd:"No sessions in this cwd",noSessions:"No saved sessions yet",nodeOnly:"Sessions are only available in Node/CLI mode.",newSessionTitle:"New Session",newSessionTarget:"a new session",busy:{agentResponding:"Agent is still responding",awaitingAskUser:"Awaiting AskUser answers",awaitingToolApproval:"Awaiting tool approval",pendingApproval:"Pending approval"},buttons:{open:"Open",delete:"Delete",deleteConfirm:"Delete (confirm)",scope:"Scope: {scope}",scopeCwd:"CWD",scopeAll:"All",refresh:"Refresh"}},sessionsOverlay:{title:"Sessions",hint:"Enter Select • Esc Close • Ctrl+R Refresh • Ctrl+W Scope",loading:"Loading sessions...",empty:"No saved sessions yet.",loadingMore:"Loading more…",hasMore:"↓ more",scope:{cwdOnly:"cwd only",allCwd:"all cwds"}},switchSessionDialog:{title:"Switch Session",confirm:"Switch & Interrupt",target:"Switch to {target}?",fallback:"Switch sessions now?",warning:"This will interrupt the current response/flow in the active session.",reason:"Reason: {reason}"},themeDialog:{title:"Theme",hint:"Enter Apply • Esc Cancel",mode:"Mode",light:"Light",dark:"Dark",unavailable:"This terminal does not support switchable themes.",fallback:"A fixed light/dark ANSI fallback theme is used here.",tip:"Tip: default follows system theme."},commandPalette:{searchPlaceholder:"Search…",noMatches:"No matches",hint:"Type to filter • Enter: open • Esc: close",title:"Commands"},skills:{title:"Skills"},help:{title:"Help",modeLabel:"Mode: {mode}",modeDetail:"Current assistant mode.",shortcutsLabel:"Shortcuts",onboarding:`Welcome! Quick start:
1134
1134
  1) /connect: connect a provider
1135
1135
  2) /models: pick a model
1136
1136
  3) send "hello" to start chatting
1137
- Tip: {commandsKey} opens command palette.`,items:{help:"Help and shortcuts (F1)",commands:"Command palette (Ctrl+P)",back:"Back to the previous jump",status:"Toggle status details"}},commands:{help:{label:"Help",detail:"Shortcuts + common commands (F1)"},sessions:{label:"Sessions",detail:"Pick or create a session"},timeline:{label:"Timeline",detail:"Jump to a user message"},newSession:{label:"New Session",detail:"Start a new session"},connectProvider:{label:"Connect Provider",detail:"Connect a provider"},models:{label:"Models",detail:"Select a model"},toolApprovals:{label:"Tool Approvals",detail:"Configure approvals"},toolSettings:{label:"Tool Settings",detail:"Configure tool-specific settings"},mcpHub:{label:"MCP",detail:"Manage MCP connectors and settings"},plugins:{label:"Plugins",detail:"Manage plugins"},debug:{label:"Debug",detail:"SDK observability logs (/debug)"},mcpSettings:{label:"MCP (Advanced JSON)",detail:"Configure raw MCP server JSON"},language:{label:"Language",detail:"Switch UI language (/language)"},settings:{label:"Settings",detail:"Custom provider settings (Ctrl+K)"}},homePage:{multilineTitle:"Multiline Text",multilineTitleWithCount:"Multiline Text ({count} lines)",providerCustom:"Custom",reviewPrompt:"help me review the code changes",footerCwd:"cwd {cwd}",hints:{switchMode:"switch mode",commands:"commands"},tips:{greeting:"Welcome back! Try {commandsKey} or {init} to get started.",commandsAlias:"Tip: {key} opens the command palette."},prompts:{help:"Help & shortcuts (F1)",sessions:"List/pick sessions",connect:"Connect a provider",models:"Select a model",newSession:"Start a new session",approvals:"Configure tool approvals (auto/normal/strict)",commands:"Open command palette",toolSettings:"Configure tool-specific settings",mcpSettings:"Open MCP",plugins:"Manage plugins",language:"Switch UI language",theme:"Select a theme",status:"Toggle status details",review:"Review code changes",init:"Initialize/improve AGENTS.md",skills:"List loaded skills",exit:"Exit the application",debug:"SDK observability logs",settings:"Custom provider settings"},commandPalette:{connect:"Connect a provider",models:"Select a model"},commands:{debugLabel:"Debug",debugDetail:"SDK observability logs (/debug)"},toast:{approvalsUsage:"Use /approvals (no on/off).",customProviderOnly:"Settings only for custom providers.",redoChatOnly:"Redo is only available in the chat view.",retryChatOnly:"Retry is only available in the chat view.",pinsChatOnly:"Pins are only available in the chat view.",renameChatOnly:"Rename is only available in the chat view (/rename <title>).",commandRemoved:"This command is no longer available: {command}",helpAliasRemoved:"Press F1 for help.",deleteConfirm:"Press Delete again to confirm.",themeToggled:"Theme: {mode}",pasteImagePending:"Image is still processing. Please wait."}},chatPage:{placeholder:"Ask anything... (newline: Shift+Enter or Ctrl+J)",placeholderAwaitingApproval:"Blocked by approval: select Approve / Deny to continue.",reviewPrompt:"help me review the code changes",notification:{approvalTitle:"[Approval Required] Tool Permission",approvalMessage:"DimCode is waiting for tool approval: {tool}.",doneTitle:"[Task Complete]",doneMessage:"DimCode finished this task.",doneMessageWithDuration:"DimCode finished this task in {duration}.",doneMessageWithTools:"DimCode finished this task after {tools} tool call(s).",doneMessageWithToolsAndDuration:"DimCode finished this task in {duration} with {tools} tool call(s)."},headerStats:"{messages} msgs · total {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"Coalescing,Thinking,Reasoning,Planning,Analyzing,Synthesizing,Refining,Composing",modelFallback:"model",mode:{plan:"plan",agent:"agent",debug:"debug"},status:{approvalsAuto:"AUTO",approvalsAll:"ALL",blockedByApproval:"Blocked by approval",awaitingApprovalAction:"Waiting for your approval: choose Approve / Deny to continue."},footer:{dragSelect:"drag to select",openLink:"Ctrl+Click to open files or links",esc:"esc",interrupt:"interrupt",approvalPaused:"⏸ Paused",approvalPausedHint:"Waiting for approval (Enter to choose).",shortcuts:"Cmd+Delete/Ctrl+W: clear input Tab: switch mode {commandsKey}: commands",shortcutsCompact:"Cmd+Delete/Ctrl+W: clear Tab: switch mode {commandsKey}: commands",shortcutsMicro:"{commandsKey}: commands",shortcutsMini:"{commandsKey}: commands"},session:{new:"new"},timeline:{title:"Timeline",empty:"(empty)",filterAll:"All messages",filterUser:"User messages",filterTool:"Tool calls"},pins:{title:"Pinned",empty:"(empty)"},jumpToBottom:{button:"↓"},prompts:{help:"Help & shortcuts (F1)",newSession:"Start a new session",resume:"Resume the paused queue",sessions:"List/pick sessions",timeline:"Jump to a user message",pins:"Open pinned messages",pin:"Pin the last message",back:"Back to previous jump",connect:"Connect a provider",models:"Select a model",theme:"Switch UI theme",approvals:"Configure tool approvals (auto/normal/strict)",commands:"Open command palette",toolSettings:"Configure tool-specific settings",mcpSettings:"Open MCP",plugins:"Manage plugins",language:"Switch UI language",status:"Toggle status details",review:"Review code changes",retry:"Retry the last user message",compact:"Compact session context",init:"Initialize/improve AGENTS.md",rename:"Rename current session",skills:"List loaded skills",exit:"Exit the application",debug:"SDK observability logs",settings:"Custom provider settings"},commands:{pinsLabel:"Pins",pinsDetail:"Open pinned messages",backLabel:"Back",backDetail:"Return to the previous jump",debugLabel:"Debug",debugDetail:"SDK observability logs (/debug)",statusLabel:"Status",statusDetail:"Toggle status details",themeLabel:"Theme",themeDetail:"Switch color theme"},tips:{contextWarn:"Tip: Context is getting full. Consider /compact or /new to keep replies sharp.",contextCritical:"Tip: You are near the context limit. Start a new session with /new (or /compact first).",timeline:"Tip: Long chat? Use /tl to jump back to a specific user message.",timelineAlias:"Tip: /tl is a short alias for /timeline.",commandsAlias:"Tip: {key} opens the command palette.",errorRecovery:"Tip: If something failed, try /compact or /new.",greeting:"Welcome back! Try {commandsKey} or {init} to get started.",compactDelight:"Nice! Keeping context lean helps.",addTests:"All set! Want me to add tests? Reply “yes” or “ok”."},confirm:{addTests:"Please add tests for the changes we just made."},toast:{customProviderOnly:"Settings only for custom providers.",renameNodeOnly:"Rename is only available in Node/CLI mode.",noActiveSession:"No active session to rename.",sessionNameEmpty:"Session name cannot be empty.",sessionRenamed:"Renamed session to: {title}",renameFailed:"Failed to rename session.",linkOpenHint:"Tip: Ctrl+Click to open files or links.",copySuccess:"Copied",copyFailed:"Copy failed",forkFailed:"Failed to fork session.",backEmpty:"No previous jump to return to.",pinsEmpty:"No pinned messages yet.",pinEmpty:"No message to pin yet.",pinned:"Pinned message.",unpinned:"Unpinned message.",debugUnavailable:"Debug server is unavailable.",approvalsUsage:"Use /approvals (no on/off).",debugDialogOpened:"Debug dialog opened.",debugDialogClosed:"Debug dialog closed.",renameUsage:"Usage: /rename <title>",themeToggled:"Theme: {mode}",statusCompactOn:"Status: compact",statusCompactOff:"Status: detailed",compactingSession:"Compacting session...",compactSuccess:"Session compacted: {message}",compactWarning:"Session compacted with limited gain: {message}",compactSuccessDetailWithTokens:"Folded the first {count} history messages into a summary. Estimated input {before} -> {after} tokens, saving about {saved} tokens.",compactSuccessDetailNotReduced:"Folded the first {count} history messages into a summary, but the estimated input changed from {before} to {after} tokens, so this did not reduce request size.",compactSuccessDetailCountOnly:"Folded the first {count} history messages into a summary.",compactSuccessDetailSummaryOnly:"Generated a fresh conversation summary.",compactFailed:"Failed to compact session: {error}",compactFailedTokenLimit:"Compaction failed due to insufficient context budget. Set DIMCODE_CONTEXT_WINDOW correctly, switch to a larger-context model, or use /new. Detail: {error}",retryEmpty:"No previous user message to retry.",commandRemoved:"This command is no longer available: {command}",helpAliasRemoved:"Press F1 for help.",waitForResponse:"Please wait for the current response to complete, or press Esc to interrupt.",pasteImagePending:"Image is still processing. Please wait.",pendingApproval:"Please handle tool_approve first.",awaitingApprovalAction:"Paused: action needed. Choose Approve / Always approve / Deny in the permission card.",awaitingApprovalStillWaiting:"Still waiting for approval ({seconds}s). The model will not continue until you approve or deny.",pendingAskUser:"Please handle ask_user first.",notificationSessionBusy:"This notification belongs to another busy session. Finish that work or switch sessions manually first.",notificationSessionUnavailable:"Cannot open the session for this notification here.",notificationSessionSwitchFailed:"Failed to open the session for this notification.",approvalNotActive:"This approval is queued. Resolve the active one first.",askUserNotActive:"This ask_user request is no longer active."}},chatQueue:{label:"Queue ({count})",labelCompact:"Queue {count}",more:"+{count} more…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"resume queue",state:{idle:"Pending",running:"Running",paused:"Paused",error:"Error"},item:{steerAction:"Steer",steerReady:"First",steerPending:"Next",steerPaused:"Paused"},toast:{enqueued:"Added to queue (#{count}).",full:"Queue is full (max 5). Delete one or start /new.",cleared:"Cleared {count} queued item(s).",deleted:"Deleted {count} queued item(s). Ctrl+Z to undo.",steerPromoted:"Upgraded to steer. It will run first when the queue resumes.",steerQueued:"Steer cannot be injected immediately. It was promoted and will run first on the next round.",steerSent:"Steer accepted. It will be injected before the next model call in this round.",undo:"Queue delete undone.",pausedTip:"Queue paused. Use {resume} or {resumeText} to continue, or send a new message to choose what to do.",stale:"Queue paused: request looks stuck."},confirm:{title:"Continue queued messages?",description:"Previous request did not finish. {count} queued message(s) waiting.",hint:"Continue to send the next item, or pause the queue.",continue:"Continue",pause:"Pause",reason:"Reason: {reason}"},reason:{network_error:"Network error.",timeout:"Request timed out.",canceled_by_user:"Canceled by user.",rate_limited:"Rate limited.",config_unavailable:"Saved config unavailable.",unknown:"Request failed."},draftDecision:{title:"Queue is paused",description:"{count} queued message(s) are still waiting. Decide what to do with your new input.",previewLabel:"New input:",continue:"Continue queue",append:"Append to queue",replace:"Discard queue & send"}},chatStatus:{done:"Done.",error:"Error.",interrupted:"Interrupted.",permissionDenied:"Permission denied.",planning:"Planning…",drafting:"Drafting…",retrying:"Retry ({retry}/{maxAttempts})…",runningTool:"Running {tool}…",runningTools:"Running {count} tools…",approvalPendingOther:"Another approval is pending ({permission})…",awaitingApproval:"Awaiting approval…",awaitingApprovalWithPerm:"Awaiting approval ({permission})…",awaitingApprovalWithRisk:"Awaiting approval ({risk})…",awaitingAnswers:"Awaiting answers…",resumingApproved:"Approved. Resuming…",resumingDenied:"Denied. Resuming…",resuming:"Resuming…",autoApprovingWithRisk:"Auto-approving ({risk})…",riskFallback:"risk",toolFallback:"tool",thinking:"Thinking…",autoCompactionRequired:"Context is near the limit. Compaction is required first.",autoCompactionRequiredDetailed:"Context is near the limit · the next request is estimated at {estimated} tokens, and auto-compaction starts at {threshold} tokens, so compaction is required first.",compressed:"Context compacted · folded {removed} older messages into a summary, saving an estimated {saved} input tokens ({elapsed}ms)",autoCompactedDetailed:"Auto-compaction completed · folded {removed} older messages into a summary, estimated input {before} -> {after} tokens, saving about {saved} tokens",autoCompactedNotReduced:"Auto-compaction completed · folded {removed} older messages into a summary, but the estimated input changed from {before} to {after} tokens, so this did not reduce request size",autoCompactedSaved:"Auto-compaction completed · folded {removed} older messages into a summary, saving about {saved} tokens",autoCompactedCountOnly:"Auto-compaction completed · folded {removed} older messages into a summary",interruptedMarkdown:"> **Interrupted** · Response canceled by user (`Esc`).",awaitingApprovalPrefix:"Awaiting approval",awaitingAnswersPrefix:"Awaiting answers",approvalPendingPrefix:"Another approval is pending",autoApprovingPrefix:"Auto-approving"},chatParts:{thinking:"Thinking",plan:"Plan",todo:"Todo"},chatRender:{userLabel:"user",outputLabel:"↳ output",outputLabelShort:"out:",canceled:"canceled",inputLabel:"in:",collapse:"... (collapse)",moreLines:"... ({count} more lines)",moreLinesOmitted:"... ({count} more lines omitted; set {envVar} to increase)",streamingTail:"… (streaming: showing last {shown} chars; {omitted} omitted)",copy:"Copy",userResponses:"User responses:",approvalQueued:"Waiting for earlier approval...",proposedPlan:{title:"Proposed Plan"},llmMeta:{changedFiles:"Changed {count} file(s): {files}",changedFilesMore:"+{count} more",revertHint:"Tip: Click this message -> Revert messages to undo this turn.",changedFilesCardTitle:"changed {count} files:",revertButton:"Revert"},toolName:{explore:"Explore",subagent:"Subagent"},toolSuffix:{offset:"offset {value}",limit:"limit {value}",matches:"{count} matches",todos:"{count} todos",results:"{count} results",results_one:"{count} result"},toolGroup:{readFiles:"Read {count} files",writeFiles:"Write {count} files",editFiles:"Edit {count} files",globPatterns:"Glob {count} patterns",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} patterns",bashCommands:"Run {count} commands",searchQueries:"Search {count} queries",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"Search may access the network.",bash:"Bash can execute commands.",edit:"File changes can modify local files.",grep:"Grep may read local files."},inlineHint:"Keys: ↑↓←→ to move, Enter to select.",awaitingUserAction:"Waiting for your action: choose Approve / Always approve / Deny.",decision:{userDenied:"User denied approval"},denied:{title:"# Tool permission denied",toolLine:"- tool: `{tool}`",permissionLine:"- permission: `{permission}`",hint:"You can re-select the tool_call and try again."},summary:{title:"# Approved + executed tool",permissionLine:"Permission `{permission}` approved for `{tool}`."},required:"Approval required ({risk}).",args:{commandWithDescription:"Command: {command} - {description}",command:"Command: {command}",description:"Description: {description}",raw:"Args: {args}"}},pathPicker:{titleWorkspace:"Select Workspace",titleFile:"Select File",placeholderWorkspace:"Type a path (../ etc). Tab to complete. Enter selects a directory.",placeholderFile:"Type a path (../ etc). Tab to complete. Enter selects a file."},providerDialogs:{customLabel:"Custom",customDetail:"custom",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Login with DimCode OAuth",addCustomLabel:"Add custom provider",addCustomDetail:"add custom provider",providerFallback:"Provider",adapter:{openai:"OpenAI",openaiOpenRouter:"OpenAI-compatible (OpenRouter)",openaiLocal:"OpenAI-compatible (Local endpoint)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Configured",notConfigured:"Not configured"},manage:{title:"Custom provider: {provider}",connect:"Connect",connectDetail:"Edit API key / Base URL",rename:"Rename",renameDetail:"Edit provider name",models:"Edit models",modelsDetail:"Update available model IDs",delete:"Delete",deleteDetail:"Remove this provider"},deleteConfirm:{title:"Delete {provider}?",confirm:"Delete (confirm)",confirmDetail:"This cannot be undone",cancelDetail:"Keep provider"},nameDialog:{title:"Name custom provider",label:"Provider name",placeholder:"e.g. DeepSeek (Proxy)"},modelsDialog:{title:"Custom provider models",modelsTitle:"Models",modelsPlaceholder:"Model IDs (, or new lines)",hint:", / newline • Shift+Enter newline • Enter Apply",fetch:"Fetch models",fetching:"Fetching models…"},modelsFetchDialog:{title:"Select models",searchPlaceholder:"Filter models",hint:"Space toggle • Enter confirm • Esc cancel"},toast:{modelSet:"Model set to {provider} / {model}.",noModels:"No models available yet. Connect a provider first (/connect).",connectFirst:"Please connect a provider first (/connect) before sending your first message.",apiKeyRequired:"API key is required.",baseUrlRequired:"Base URL is required.",baseUrlInvalid:"Base URL must start with http:// or https://",connected:"Connected to {provider}.",connectedSelectModel:"Connected to {provider}. Choose a model.",connectedCheckFailed:"Connected to {provider}, but self-check failed: {reason}",connectionTestPassed:"Connection test passed: {provider}.",connectionTestFailed:"Connection test failed: {provider} - {reason}",connectionActionUpdateKey:"Action: reopen Connect and update API key, then test again.",connectionActionFixBaseUrl:"Action: check Base URL path (usually ends with /v1), then test again.",connectionActionSwitchKey:"Action: wait a moment or switch to another key/provider.",connectionActionRetryTest:"Action: check network/proxy and run Test connection again.",noModelsFetching:"No models yet. Fetching model list…",firstUseGuide:'Quick start: 1) /connect 2) /models 3) send "hello"',firstUseSendHello:'Next step: send your first message (for example: "hello").',connectionCheckUnauthorized:"401 Unauthorized: check API key and provider type.",connectionCheckForbidden:"403 Forbidden: your key may not have access to this provider/model.",connectionCheckNotFound:"404 Not Found: check Base URL path (OpenAI-compatible usually ends with /v1).",connectionCheckRateLimited:"429 Rate limited: wait and retry, or switch to another key/provider.",connectionCheckTimeout:"Connection timed out: check network/proxy and retry.",connectionCheckNetwork:"Network connection failed: check DNS/proxy/Base URL.",connectionCheckFailed:"Connection check failed: {error}",apiKeyCleared:"API key cleared for {provider}.",customAdded:"Custom provider added: {provider}.",customRenamed:"Custom provider renamed: {provider}.",customModelsUpdated:"Custom provider models updated: {provider}.",customDeleted:"Custom provider deleted: {provider}.",modelsRequired:"Add at least one model.",modelsEmpty:"No models found.",modelsFetchFailed:"Failed to fetch models: {error}",modelsFetchChatCompletions:"Model list not supported for /chat/completions or /responses base URL.",manualModelsRequired:"This endpoint doesn't support automatic model discovery. Please manually enter model names in the models configuration.",nameRequired:"Provider name is required.",nameConflict:"Provider name already exists."}},copyToast:{copiedToClipboard:"Copied to clipboard"}};var es_default2={common:{apply:"Aplicar",cancel:"Cancelar",close:"Cerrar",confirm:"Confirmar",yes:"Sí",no:"No",exit:"Salir",back:"Atrás",next:"Siguiente",save:"Guardar",empty:"—",unknownError:"Error desconocido",inputClearTip:"Ctrl+C limpiar",total:"Total"},configDialog:{title:"Configuración",hint:"Tab/Shift+Tab cambiar campo • Enter Aplicar • Esc Cancelar",modelsTitle:"Modelos (personalizados)",modelsPlaceholder:"modelo-a, modelo-b",contextWindowTitle:"Ventana de contexto",contextWindowLocked:"Ventana de contexto (definida por el modelo)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperatura",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperatura: solo números y "."',maxTokensTitle:"Máx. tokens de salida",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL (compatible con OpenAI)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Actual:",apiKeyNotSet:"(no configurada)",apiKeyTitle:"API Key",apiKeyPlaceholder:"Pega una nueva clave para actualizar (déjalo vacío para mantener)",interleavedThinkingTitle:"Pensamiento intercalado (Espacio para alternar)",interleavedThinkingLocked:"Pensamiento intercalado (definido por el modelo)",interleavedThinkingOpen:"Abierto",interleavedThinkingClose:"Cerrado",tipIntensityTitle:"Intensidad de consejos",tipIntensityOff:"Desactivado",tipIntensityLow:"Bajo",tipIntensityStandard:"Estándar",shortcutsTitle:"Atajos",shortcutCommandsLabel:"Comandos",shortcutTimelineLabel:"Línea de tiempo",shortcutNewSessionLabel:"Nueva sesión",shortcutsPlaceholder:"ej. mod+p",shortcutsHint:"Usa mod/ctrl/alt/shift + tecla (a-z, 0-9, F1-F12)."},languageDialog:{title:"Idioma",hint:"Enter Aplicar • Esc Cancelar",languageTitle:"Idioma",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Esfuerzo de pensamiento",hint:"Enter Aplicar • Esc Cancelar",effortTitle:"Esfuerzo de razonamiento",applied:"Esfuerzo de razonamiento establecido en {effort}",option:{low:"Bajo",medium:"Medio",high:"Alto",xhigh:"Muy alto",max:"Máx",minimal:"Mínimo",none:"Ninguno",off:"Desactivado",auto:"Auto"}},toolSettingsDialog:{title:"Configuración de herramientas",hint:"Enter Aplicar • Esc Cancelar",websearchTitle:"Clave API de WebSearch",apiKeyCurrentPrefix:"Actual:",apiKeyNotSet:"(no configurada)",apiKeyInvalidCjk:"La clave API no puede contener caracteres chinos.",apiKeyInvalidSpaces:"La clave API no puede contener espacios.",apiKeyPlaceholder:"Pega la clave API de Serper"},pluginsDialog:{title:"Plugins",hint:"Selecciona un plugin para configurar • Esc Cerrar",serperSearch:"Búsqueda Serper",serperSearchDetail:"Búsqueda web vía API de Serper",configured:"Configurado",notConfigured:"No configurado",serperConfigTitle:"Configuración de Búsqueda Serper",serperConfigHint:"Tab Cambiar • Enter Aplicar • Esc Cancelar"},skillsDialog:{title:"Habilidades",hint:"Enter Aplicar • Esc Cancelar",empty:"No hay habilidades disponibles",emptyFiltered:"Sin habilidades coincidentes"},timelineDialog:{title:"Cronología",hint:"Tab Filtrar • Enter Abrir • Esc Cerrar",empty:"Aún no hay mensajes",emptyFiltered:"Sin entradas coincidentes",filterAll:"Todos los mensajes",filterUser:"Mensajes del usuario",filterTool:"Llamadas de herramientas"},mcpSettingsDialog:{title:"MCP",hint:"Edita el archivo mcp.json para configurar servidores MCP • Esc Cerrar",configFileLabel:"Archivo de configuración:",noServersHint:"Aún no hay servidores MCP configurados.",serverCount:"{count} servidor(es) configurado(s)",guideText:"Edita el archivo de arriba para agregar o modificar servidores MCP.",openFile:"Abrir archivo",reload:"Recargar",close:"Cerrar",reloaded:"Configuración MCP recargada.",reloadFailed:"Error al recargar: {error}",status:"Estado",toolCount:"Herramientas",disabled:"desactivado",testConnection:"Probar",testing:"Probando conexiones...",testComplete:"Prueba completada.",testPartial:"Prueba completada con errores.",testFailed:"Conexión fallida: {error}",invalidJson:"JSON inválido: {error}",invalidShape:'JSON de MCP inválido: se esperaba "mcpServers".',invalidServer:"Servidor MCP inválido: {name}",noServers:"No se encontraron servidores MCP.",lintOk:"Sintaxis JSON correcta",lintAt:"{error} (línea {line}, col {column})",lintUnclosed:"{char} sin cerrar (línea {line}, col {column})",lintInvalid:"{error}",exampleFormat:"Formato de ejemplo:"},toolApprovalsDialog:{title:"Aprobaciones de herramientas",useAuto:"Automático",useNormal:"Normal",useStrict:"Estricto",close:"Cerrar",focusedTitleAuto:"AUTOMÁTICO",focusedTitleNormal:"NORMAL",focusedTitleStrict:"ESTRICTO",focusedTitleClose:"CERRAR",focusedDescAuto:"Aprobar automáticamente todas las llamadas de herramientas. Sin solicitud de aprobación (más rápido, menos seguro).",focusedDescNormal:"Aprobar automáticamente herramientas de solo lectura. Preguntar antes de herramientas de escritura/ejecución.",focusedDescStrict:"Requerir confirmación para cada llamada de herramienta (más seguro, más lento).",focusedDescClose:"Cerrar este diálogo sin cambiar la configuración actual.",currentPrefix:"Actual: {mode}",tip:"Consejo: Tab o ↑/↓ para moverte entre botones, Enter para confirmar, Esc para cerrar."},settingsDialog:{pendingApproval:"Resuelve la aprobación pendiente antes de cambiar la configuración.",invalidShortcut:"Atajo inválido para {label}: {value}",shortcutCommands:"Atajo de comandos",shortcutTimeline:"Atajo de línea de tiempo",shortcutNewSession:"Atajo de nueva sesión",toolApprovalsApplied:"Aprobaciones de herramientas: {mode}",applied:"Configuración aplicada."},exitAppDialog:{title:"Salir de DimCode",confirm:"¿Salir ahora?",warning:"Una respuesta del agente aún está en progreso. Salir la interrumpirá.",reasonPrefix:"Razón: {reason}"},approvalDialog:{title:"Aprobar permiso de herramienta",toolLabel:"Herramienta: {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Permiso: {permission} ({risk})",descriptionLabel:"Descripción: {description}",commandLabel:"Comando:",inlineActionHint:"↑/← Anterior ↓/→ Siguiente Enter Confirmar 1/2/3 Elegir",inlineActionHintCompact:"←/→ Mover Enter Confirmar 1/2/3 Elegir",buttons:{approve:"Aprobar",alwaysApprove:"Siempre aprobar",deny:"Denegar",always:"Siempre",ok:"OK",no:"No",y:"S",all:"Todos",n:"N"}},askUserDialog:{noQuestionsTitle:"Sin preguntas",noQuestionsBody:"No hay preguntas para responder.",title:"Pregunta {index}/{total}: {header}",defaultHeader:"Pregunta",prev:"Anterior",next:"Siguiente",submit:"Enviar",otherOption:"Otro",otherDetail:"Proporciona una respuesta personalizada",inlineHintOptions:"Teclas: ↑↓ para moverte, ←→ para cambiar pregunta, Enter para seleccionar.",inlineHintMulti:"Selección múltiple: Espacio alterna el estado marcado.",inlineHintButtons:"Tab a botones, ←→ para cambiar, Enter para activar, ↑ regresa a opciones.",inlineHintNav:"Ctrl+Left / Ctrl+Right (o Ctrl+A / Ctrl+E) para cambiar de pregunta.",inlineHintSubmit:"Ctrl+Enter envía, Esc cancela.",inlineButtonPrev:"[Anterior]",inlineButtonNext:"[Siguiente]",inlineButtonSubmit:"[Enviar]",inlineButtonCancel:"[Cancelar]",inlineActionHint:"Espacio Seleccionar ← Anterior → Siguiente Enter Siguiente/Enviar Esc Cancelar",inlineActionHintCompact:"Espacio Seleccionar ←/→ Anterior/Siguiente Enter Siguiente/Enviar Esc Cancelar",optionsSummaryAll:"{count} opciones",optionsSummaryVisibleMore:"{count} opciones ({start}-{end}) ↓ más",multiSelectHint:"[Selección múltiple] Espacio para alternar, Enter para confirmar",singleSelectHint:"[Selección única] Usa flechas, Enter para confirmar",customAnswerLabel:"Respuesta personalizada:",customAnswerPlaceholder:"Escribe tu respuesta...",otherPlaceholder:"Otro seleccionado — escribe tu respuesta y presiona Enter para completar."},nextApiOAuthDialog:{title:"Inicio de sesión DimCode OAuth",copyUrl:"Copiar URL",login:"Iniciar sesión",logout:"Cerrar sesión",statusTitle:"Estado",statusAuthenticated:"✓ Sesión iniciada como {email}",statusLoading:"⏳ Autenticando...",statusNotLoggedIn:"✗ No has iniciado sesión",instructionAuthenticated:"Usa ↑↓ para navegar, Enter para seleccionar, o números 1-9",instructionLoading:"Presiona C para copiar la URL de abajo si el navegador no se abrió",instructionNeedsSetup:"Verifica el redirect_uri, los scopes y el estado habilitado de DimCode OAuth, luego intenta de nuevo",instructionWithUrl:"Presiona C para copiar la URL de OAuth de abajo, o presiona Enter para abrir el navegador",instructionUnauthed:"Presiona Enter para iniciar sesión con DimCode OAuth, o Esc para cerrar",instructionManualCallback:"Copia la URL de abajo, inicia sesión en tu navegador y pega la URL redirigida en el cuadro de entrada.",oauthUrlTitleLoading:"URL de OAuth (copia si el navegador no se abrió)",oauthUrlTitleReady:"URL de OAuth (lista para usar)",scrollIndicator:" [{start}-{end} de {total}]",selectModelTitle:"Seleccionar modelo (↑↓/1-9, Enter para seleccionar){indicator}",aboutTitle:"Acerca de DimCode OAuth",setupTitle:"Error de inicio de sesión OAuth",aboutBulletOne:"• Usa el cliente OAuth integrado de DimCode",aboutBulletTwo:"• Obtiene modelos relay después de iniciar sesión y guarda la configuración del proveedor",aboutBulletThree:"• Usa tokens de actualización OAuth en lugar de una clave API de larga duración",viewAllPlans:"Ver todos los planes →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"Cuenta DimCode",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"Generando URL de OAuth...",urlReady:"¡URL de OAuth lista! Cópiarla o presionar Enter para abrir el navegador.",generateUrlFailed:"Error al generar la URL de OAuth: {error}",startingLogin:"Iniciando sesión con OAuth...",browserOpened:"Navegador abierto. Si no, copia la URL del diálogo.",copyUrlToLogin:"Copia la URL de OAuth del diálogo para iniciar sesión.",urlCopied:"URL de OAuth copiada al portapapeles.",urlCopyFailed:"Error al copiar la URL de OAuth.",authSuccess:"¡Autenticación exitosa con DimCode OAuth!",loginFailed:"Error de inicio de sesión OAuth: {error}",loggedOut:"Sesión cerrada de DimCode OAuth",loggedOutWithRemoteWarning:"Sesión cerrada de DimCode OAuth, pero la revocación remota falló: {error}",logoutFailed:"Error al cerrar sesión: {error}",initFailed:"Error de inicialización del diálogo: {error}",modelSwitched:"Modelo cambiado a {model}",selectModelFailed:"Error al seleccionar modelo: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Depuración",titleDebugging:"Depurando",copy:"copiar",proceed:"continuar",fixed:"corregido",body:"He añadido registros de depuración (y posiblemente una corrección). Por favor intenta reproducir el problema ahora, luego elige un resultado."},exitSessionDialog:{title:"Salir de la sesión",confirm:"¿Salir de la sesión actual y volver al inicio?",note:"El siguiente mensaje iniciará una nueva sesión."},messageActionsDialog:{title:"Acciones del mensaje",revert:"Revertir mensajes",revertWithFiles:"Revertir mensajes y cambios de archivos",revertKeepFiles:"Revertir mensajes (mantener cambios de archivos)",revertFilesOnly:"Revertir solo cambios de archivos",copy:"Copiar texto del mensaje al portapapeles",fork:"Bifurcar para crear una nueva sesión",pin:"Fijar mensaje",unpin:"Desfijar mensaje"},pathPickerDialog:{hint:"↑/↓ seleccionar • Tab completar • Enter confirmar • Esc cerrar"},providerConnectDialog:{title:"Conectar {provider}",providerFallback:"Proveedor",hint:"Tab cambiar • Ctrl+C limpiar • Enter Aplicar",hintOpenAI:"Tab cambiar • Ctrl+C limpiar • Enter Aplicar",hintGemini:"Tab cambiar • Ctrl+C limpiar • Enter Aplicar",hintAnthropic:"Tab cambiar • Ctrl+C limpiar • Enter Aplicar",hintGeneric:"Tab cambiar • Ctrl+C limpiar • Enter Aplicar",applyingHint:"Probando conexión, espera...",applyingButton:"Aplicando...",testConnection:"Probar conexión",baseUrlStatusAutoFix:"Corrección automática: {value}",baseUrlStatusInvalid:"Base URL debe ser http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API Key",apiKeyPlaceholder:"Pega una nueva clave para actualizar (déjalo vacío para mantener)",apiKeyCurrent:"Actual: {value}",apiKeyNotSet:"Actual: (no configurada)",apiKeyInvalidCjk:"La clave API no puede contener caracteres chinos.",apiKeyInvalidSpaces:"La clave API no puede contener espacios.",clearKey:"Eliminar",useDetectedKey:"Usar {name}",disconnectButton:"Desconectar",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"Desactivado",toggleOn:"Activado",toggleHint:"Tab cambiar • ←/→ cambiar • Espacio alternar"},redoConfirmDialog:{title:"Confirmar rehacer",body:"¿Estás seguro de que quieres restaurar los mensajes revertidos?"},renameSessionDialog:{title:"Renombrar sesión",label:"Nombre de la sesión",placeholder:"ej. Notas de planificación"},sessionsDialog:{timeNow:"ahora",timeMinutes:"{count} min",timeHours:"{count} hr",timeDays:"{count} d",newSession:"Nueva sesión",title:"Sesiones ({count})",titleScoped:"Sesiones ({count}/{total})",scope:"Alcance: {cwd}",loading:"Cargando…",confirmDelete:"Confirmar eliminación: presiona Delete de nuevo",header:"{count} sesiones • Flechas para navegar • Enter selecciona{range}{activity}",headerRange:" • Mostrando {start}-{end}",runningCount:"{count} en ejecución",pausedCount:"{count} esperando confirmación",hint:"Escribe para saltar • ←/→ botones • Enter confirmar • Esc cerrar",focusPrefix:"Enfoque: {focus}",focusList:"Lista",focusButtons:"Botones",noSessionsCwd:"No hay sesiones en este directorio",noSessions:"Aún no hay sesiones guardadas",nodeOnly:"Las sesiones solo están disponibles en modo Node/CLI.",newSessionTitle:"Nueva sesión",newSessionTarget:"una nueva sesión",busy:{agentResponding:"El agente sigue respondiendo",awaitingAskUser:"Esperando respuestas de AskUser",awaitingToolApproval:"Esperando aprobación de herramienta",pendingApproval:"Aprobación pendiente"},buttons:{open:"Abrir",delete:"Eliminar",deleteConfirm:"Eliminar (confirmar)",scope:"Alcance: {scope}",scopeCwd:"CWD",scopeAll:"Todo",refresh:"Actualizar"}},sessionsOverlay:{title:"Sesiones",hint:"Enter Seleccionar • Esc Cerrar • Ctrl+R Actualizar",loading:"Cargando sesiones...",empty:"Aún no hay sesiones guardadas."},switchSessionDialog:{title:"Cambiar sesión",confirm:"Cambiar e interrumpir",target:"¿Cambiar a {target}?",fallback:"¿Cambiar de sesión ahora?",warning:"Esto interrumpirá la respuesta/flujo actual en la sesión activa.",reason:"Razón: {reason}"},themeDialog:{title:"Tema",hint:"Enter Aplicar • Esc Cancelar",mode:"Modo",light:"Claro",dark:"Oscuro",unavailable:"Esta terminal no soporta temas intercambiables.",fallback:"Se usa un tema fijo alternativo claro/oscuro ANSI aquí.",tip:"Consejo: el predeterminado sigue el tema del sistema."},commandPalette:{searchPlaceholder:"Buscar…",noMatches:"Sin resultados",hint:"Escribe para filtrar • Enter: abrir • Esc: cerrar",title:"Comandos"},skills:{title:"Habilidades"},help:{title:"Ayuda",modeLabel:"Modo: {mode}",modeDetail:"Modo actual del asistente.",shortcutsLabel:"Atajos",onboarding:`¡Bienvenido! Inicio rápido:
1137
+ Tip: {commandsKey} opens command palette.`,items:{help:"Help and shortcuts (F1)",commands:"Command palette (Ctrl+P)",back:"Back to the previous jump",status:"Toggle status details"}},commands:{help:{label:"Help",detail:"Shortcuts + common commands (F1)"},sessions:{label:"Sessions",detail:"Pick or create a session"},timeline:{label:"Timeline",detail:"Jump to a user message"},newSession:{label:"New Session",detail:"Start a new session"},connectProvider:{label:"Connect Provider",detail:"Connect a provider"},models:{label:"Models",detail:"Select a model"},toolApprovals:{label:"Tool Approvals",detail:"Configure approvals"},toolSettings:{label:"Tool Settings",detail:"Configure tool-specific settings"},mcpHub:{label:"MCP",detail:"Manage MCP connectors and settings"},plugins:{label:"Plugins",detail:"Manage plugins"},debug:{label:"Debug",detail:"SDK observability logs (/debug)"},mcpSettings:{label:"MCP (Advanced JSON)",detail:"Configure raw MCP server JSON"},language:{label:"Language",detail:"Switch UI language (/language)"},settings:{label:"Settings",detail:"Custom provider settings (Ctrl+K)"}},homePage:{multilineTitle:"Multiline Text",multilineTitleWithCount:"Multiline Text ({count} lines)",providerCustom:"Custom",reviewPrompt:"help me review the code changes",footerCwd:"cwd {cwd}",hints:{switchMode:"switch mode",commands:"commands"},tips:{greeting:"Welcome back! Try {commandsKey} or {init} to get started.",commandsAlias:"Tip: {key} opens the command palette."},prompts:{help:"Help & shortcuts (F1)",sessions:"List/pick sessions",connect:"Connect a provider",models:"Select a model",newSession:"Start a new session",approvals:"Configure tool approvals (auto/normal/strict)",commands:"Open command palette",toolSettings:"Configure tool-specific settings",mcpSettings:"Open MCP",plugins:"Manage plugins",language:"Switch UI language",theme:"Select a theme",status:"Toggle status details",review:"Review code changes",init:"Initialize/improve AGENTS.md",skills:"List loaded skills",exit:"Exit the application",debug:"SDK observability logs",settings:"Custom provider settings"},commandPalette:{connect:"Connect a provider",models:"Select a model"},commands:{debugLabel:"Debug",debugDetail:"SDK observability logs (/debug)"},toast:{approvalsUsage:"Use /approvals (no on/off).",customProviderOnly:"Settings only for custom providers.",redoChatOnly:"Redo is only available in the chat view.",retryChatOnly:"Retry is only available in the chat view.",pinsChatOnly:"Pins are only available in the chat view.",renameChatOnly:"Rename is only available in the chat view (/rename <title>).",commandRemoved:"This command is no longer available: {command}",helpAliasRemoved:"Press F1 for help.",deleteConfirm:"Press Delete again to confirm.",themeToggled:"Theme: {mode}",pasteImagePending:"Image is still processing. Please wait."}},chatPage:{placeholder:"Ask anything... (newline: Shift+Enter or Ctrl+J)",placeholderAwaitingApproval:"Blocked by approval: select Approve / Deny to continue.",reviewPrompt:"help me review the code changes",notification:{approvalTitle:"[Approval Required] Tool Permission",approvalMessage:"DimCode is waiting for tool approval: {tool}.",doneTitle:"[Task Complete]",doneMessage:"DimCode finished this task.",doneMessageWithDuration:"DimCode finished this task in {duration}.",doneMessageWithTools:"DimCode finished this task after {tools} tool call(s).",doneMessageWithToolsAndDuration:"DimCode finished this task in {duration} with {tools} tool call(s)."},headerStats:"{messages} msgs · total {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"Coalescing,Thinking,Reasoning,Planning,Analyzing,Synthesizing,Refining,Composing",modelFallback:"model",mode:{plan:"plan",agent:"agent",debug:"debug"},status:{approvalsAuto:"AUTO",approvalsAll:"ALL",blockedByApproval:"Blocked by approval",awaitingApprovalAction:"Waiting for your approval: choose Approve / Deny to continue."},footer:{dragSelect:"drag to select",openLink:"Ctrl+Click to open files or links",esc:"esc",interrupt:"interrupt",approvalPaused:"⏸ Paused",approvalPausedHint:"Waiting for approval (Enter to choose).",shortcuts:"Cmd+Delete/Ctrl+W: clear input Tab: switch mode {commandsKey}: commands",shortcutsCompact:"Cmd+Delete/Ctrl+W: clear Tab: switch mode {commandsKey}: commands",shortcutsMicro:"{commandsKey}: commands",shortcutsMini:"{commandsKey}: commands"},session:{new:"new"},timeline:{title:"Timeline",empty:"(empty)",filterAll:"All messages",filterUser:"User messages",filterTool:"Tool calls"},pins:{title:"Pinned",empty:"(empty)"},jumpToBottom:{button:"↓"},prompts:{help:"Help & shortcuts (F1)",newSession:"Start a new session",resume:"Resume the paused queue",sessions:"List/pick sessions",timeline:"Jump to a user message",pins:"Open pinned messages",pin:"Pin the last message",back:"Back to previous jump",connect:"Connect a provider",models:"Select a model",theme:"Switch UI theme",approvals:"Configure tool approvals (auto/normal/strict)",commands:"Open command palette",toolSettings:"Configure tool-specific settings",mcpSettings:"Open MCP",plugins:"Manage plugins",language:"Switch UI language",status:"Toggle status details",review:"Review code changes",retry:"Retry the last user message",compact:"Compact session context",init:"Initialize/improve AGENTS.md",rename:"Rename current session",skills:"List loaded skills",exit:"Exit the application",debug:"SDK observability logs",settings:"Custom provider settings"},commands:{pinsLabel:"Pins",pinsDetail:"Open pinned messages",backLabel:"Back",backDetail:"Return to the previous jump",debugLabel:"Debug",debugDetail:"SDK observability logs (/debug)",statusLabel:"Status",statusDetail:"Toggle status details",themeLabel:"Theme",themeDetail:"Switch color theme"},tips:{contextWarn:"Tip: Context is getting full. Consider /compact or /new to keep replies sharp.",contextCritical:"Tip: You are near the context limit. Start a new session with /new (or /compact first).",timeline:"Tip: Long chat? Use /tl to jump back to a specific user message.",timelineAlias:"Tip: /tl is a short alias for /timeline.",commandsAlias:"Tip: {key} opens the command palette.",errorRecovery:"Tip: If something failed, try /compact or /new.",greeting:"Welcome back! Try {commandsKey} or {init} to get started.",compactDelight:"Nice! Keeping context lean helps.",addTests:"All set! Want me to add tests? Reply “yes” or “ok”."},confirm:{addTests:"Please add tests for the changes we just made."},toast:{customProviderOnly:"Settings only for custom providers.",renameNodeOnly:"Rename is only available in Node/CLI mode.",noActiveSession:"No active session to rename.",sessionNameEmpty:"Session name cannot be empty.",sessionRenamed:"Renamed session to: {title}",renameFailed:"Failed to rename session.",linkOpenHint:"Tip: Ctrl+Click to open files or links.",copySuccess:"Copied",copyFailed:"Copy failed",forkFailed:"Failed to fork session.",backEmpty:"No previous jump to return to.",pinsEmpty:"No pinned messages yet.",pinEmpty:"No message to pin yet.",pinned:"Pinned message.",unpinned:"Unpinned message.",debugUnavailable:"Debug server is unavailable.",approvalsUsage:"Use /approvals (no on/off).",debugDialogOpened:"Debug dialog opened.",debugDialogClosed:"Debug dialog closed.",renameUsage:"Usage: /rename <title>",themeToggled:"Theme: {mode}",statusCompactOn:"Status: compact",statusCompactOff:"Status: detailed",compactingSession:"Compacting session...",compactSuccess:"Session compacted: {message}",compactWarning:"Session compacted with limited gain: {message}",compactSuccessDetailWithTokens:"Folded the first {count} history messages into a summary. Estimated input {before} -> {after} tokens, saving about {saved} tokens.",compactSuccessDetailNotReduced:"Folded the first {count} history messages into a summary, but the estimated input changed from {before} to {after} tokens, so this did not reduce request size.",compactSuccessDetailCountOnly:"Folded the first {count} history messages into a summary.",compactSuccessDetailSummaryOnly:"Generated a fresh conversation summary.",compactFailed:"Failed to compact session: {error}",compactFailedTokenLimit:"Compaction failed due to insufficient context budget. Set DIMCODE_CONTEXT_WINDOW correctly, switch to a larger-context model, or use /new. Detail: {error}",retryEmpty:"No previous user message to retry.",commandRemoved:"This command is no longer available: {command}",helpAliasRemoved:"Press F1 for help.",waitForResponse:"Please wait for the current response to complete, or press Esc to interrupt.",pasteImagePending:"Image is still processing. Please wait.",pendingApproval:"Please handle tool_approve first.",awaitingApprovalAction:"Paused: action needed. Choose Approve / Always approve / Deny in the permission card.",awaitingApprovalStillWaiting:"Still waiting for approval ({seconds}s). The model will not continue until you approve or deny.",pendingAskUser:"Please handle ask_user first.",notificationSessionBusy:"This notification belongs to another busy session. Finish that work or switch sessions manually first.",notificationSessionUnavailable:"Cannot open the session for this notification here.",notificationSessionSwitchFailed:"Failed to open the session for this notification.",approvalNotActive:"This approval is queued. Resolve the active one first.",askUserNotActive:"This ask_user request is no longer active."}},chatQueue:{label:"Queue ({count})",labelCompact:"Queue {count}",more:"+{count} more…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"resume queue",state:{idle:"Pending",running:"Running",paused:"Paused",error:"Error"},item:{steerAction:"Steer",steerReady:"First",steerPending:"Next",steerPaused:"Paused"},toast:{enqueued:"Added to queue (#{count}).",full:"Queue is full (max 5). Delete one or start /new.",cleared:"Cleared {count} queued item(s).",deleted:"Deleted {count} queued item(s). Ctrl+Z to undo.",steerPromoted:"Upgraded to steer. It will run first when the queue resumes.",steerQueued:"Steer cannot be injected immediately. It was promoted and will run first on the next round.",steerSent:"Steer accepted. It will be injected before the next model call in this round.",undo:"Queue delete undone.",pausedTip:"Queue paused. Use {resume} or {resumeText} to continue, or send a new message to choose what to do.",stale:"Queue paused: request looks stuck."},confirm:{title:"Continue queued messages?",description:"Previous request did not finish. {count} queued message(s) waiting.",hint:"Continue to send the next item, or pause the queue.",continue:"Continue",pause:"Pause",reason:"Reason: {reason}"},reason:{network_error:"Network error.",timeout:"Request timed out.",canceled_by_user:"Canceled by user.",rate_limited:"Rate limited.",config_unavailable:"Saved config unavailable.",unknown:"Request failed."},draftDecision:{title:"Queue is paused",description:"{count} queued message(s) are still waiting. Decide what to do with your new input.",previewLabel:"New input:",continue:"Continue queue",append:"Append to queue",replace:"Discard queue & send"}},chatStatus:{done:"Done.",error:"Error.",interrupted:"Interrupted.",permissionDenied:"Permission denied.",planning:"Planning…",drafting:"Drafting…",retrying:"Retry ({retry}/{maxAttempts})…",runningTool:"Running {tool}…",runningTools:"Running {count} tools…",approvalPendingOther:"Another approval is pending ({permission})…",awaitingApproval:"Awaiting approval…",awaitingApprovalWithPerm:"Awaiting approval ({permission})…",awaitingApprovalWithRisk:"Awaiting approval ({risk})…",awaitingAnswers:"Awaiting answers…",resumingApproved:"Approved. Resuming…",resumingDenied:"Denied. Resuming…",resuming:"Resuming…",autoApprovingWithRisk:"Auto-approving ({risk})…",riskFallback:"risk",toolFallback:"tool",thinking:"Thinking…",autoCompactionRequired:"Context is near the limit. Compaction is required first.",autoCompactionRequiredDetailed:"Context is near the limit · the next request is estimated at {estimated} tokens, and auto-compaction starts at {threshold} tokens, so compaction is required first.",compressed:"Context compacted · folded {removed} older messages into a summary, saving an estimated {saved} input tokens ({elapsed}ms)",autoCompactedDetailed:"Auto-compaction completed · folded {removed} older messages into a summary, estimated input {before} -> {after} tokens, saving about {saved} tokens",autoCompactedNotReduced:"Auto-compaction completed · folded {removed} older messages into a summary, but the estimated input changed from {before} to {after} tokens, so this did not reduce request size",autoCompactedSaved:"Auto-compaction completed · folded {removed} older messages into a summary, saving about {saved} tokens",autoCompactedCountOnly:"Auto-compaction completed · folded {removed} older messages into a summary",interruptedMarkdown:"> **Interrupted** · Response canceled by user (`Esc`).",awaitingApprovalPrefix:"Awaiting approval",awaitingAnswersPrefix:"Awaiting answers",approvalPendingPrefix:"Another approval is pending",autoApprovingPrefix:"Auto-approving"},chatParts:{thinking:"Thinking",plan:"Plan",todo:"Todo"},chatRender:{userLabel:"user",outputLabel:"↳ output",outputLabelShort:"out:",canceled:"canceled",inputLabel:"in:",collapse:"... (collapse)",moreLines:"... ({count} more lines)",moreLinesOmitted:"... ({count} more lines omitted; set {envVar} to increase)",streamingTail:"… (streaming: showing last {shown} chars; {omitted} omitted)",copy:"Copy",userResponses:"User responses:",approvalQueued:"Waiting for earlier approval...",proposedPlan:{title:"Proposed Plan"},llmMeta:{changedFiles:"Changed {count} file(s): {files}",changedFilesMore:"+{count} more",revertHint:"Tip: Click this message -> Revert messages to undo this turn.",changedFilesCardTitle:"changed {count} files:",revertButton:"Revert"},toolName:{explore:"Explore",subagent:"Subagent"},toolSuffix:{offset:"offset {value}",limit:"limit {value}",matches:"{count} matches",todos:"{count} todos",results:"{count} results",results_one:"{count} result"},toolGroup:{readFiles:"Read {count} files",writeFiles:"Write {count} files",editFiles:"Edit {count} files",globPatterns:"Glob {count} patterns",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} patterns",bashCommands:"Run {count} commands",searchQueries:"Search {count} queries",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"Search may access the network.",bash:"Bash can execute commands.",edit:"File changes can modify local files.",grep:"Grep may read local files."},inlineHint:"Keys: ↑↓←→ to move, Enter to select.",awaitingUserAction:"Waiting for your action: choose Approve / Always approve / Deny.",decision:{userDenied:"User denied approval"},denied:{title:"# Tool permission denied",toolLine:"- tool: `{tool}`",permissionLine:"- permission: `{permission}`",hint:"You can re-select the tool_call and try again."},summary:{title:"# Approved + executed tool",permissionLine:"Permission `{permission}` approved for `{tool}`."},required:"Approval required ({risk}).",args:{commandWithDescription:"Command: {command} - {description}",command:"Command: {command}",description:"Description: {description}",raw:"Args: {args}"}},pathPicker:{titleWorkspace:"Select Workspace",titleFile:"Select File",placeholderWorkspace:"Type a path (../ etc). Tab to complete. Enter selects a directory.",placeholderFile:"Type a path (../ etc). Tab to complete. Enter selects a file."},providerDialogs:{customLabel:"Custom",customDetail:"custom",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Login with DimCode OAuth",addCustomLabel:"Add custom provider",addCustomDetail:"add custom provider",providerFallback:"Provider",adapter:{openai:"OpenAI",openaiOpenRouter:"OpenAI-compatible (OpenRouter)",openaiLocal:"OpenAI-compatible (Local endpoint)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Configured",notConfigured:"Not configured"},manage:{title:"Custom provider: {provider}",connect:"Connect",connectDetail:"Edit API key / Base URL",rename:"Rename",renameDetail:"Edit provider name",models:"Edit models",modelsDetail:"Update available model IDs",delete:"Delete",deleteDetail:"Remove this provider"},deleteConfirm:{title:"Delete {provider}?",confirm:"Delete (confirm)",confirmDetail:"This cannot be undone",cancelDetail:"Keep provider"},nameDialog:{title:"Name custom provider",label:"Provider name",placeholder:"e.g. DeepSeek (Proxy)"},modelsDialog:{title:"Custom provider models",modelsTitle:"Models",modelsPlaceholder:"Model IDs (, or new lines)",hint:", / newline • Shift+Enter newline • Enter Apply",fetch:"Fetch models",fetching:"Fetching models…"},modelsFetchDialog:{title:"Select models",searchPlaceholder:"Filter models",hint:"Space toggle • Enter confirm • Esc cancel"},toast:{modelSet:"Model set to {provider} / {model}.",noModels:"No models available yet. Connect a provider first (/connect).",connectFirst:"Please connect a provider first (/connect) before sending your first message.",apiKeyRequired:"API key is required.",baseUrlRequired:"Base URL is required.",baseUrlInvalid:"Base URL must start with http:// or https://",connected:"Connected to {provider}.",connectedSelectModel:"Connected to {provider}. Choose a model.",connectedCheckFailed:"Connected to {provider}, but self-check failed: {reason}",connectionTestPassed:"Connection test passed: {provider}.",connectionTestFailed:"Connection test failed: {provider} - {reason}",connectionActionUpdateKey:"Action: reopen Connect and update API key, then test again.",connectionActionFixBaseUrl:"Action: check Base URL path (usually ends with /v1), then test again.",connectionActionSwitchKey:"Action: wait a moment or switch to another key/provider.",connectionActionRetryTest:"Action: check network/proxy and run Test connection again.",noModelsFetching:"No models yet. Fetching model list…",firstUseGuide:'Quick start: 1) /connect 2) /models 3) send "hello"',firstUseSendHello:'Next step: send your first message (for example: "hello").',connectionCheckUnauthorized:"401 Unauthorized: check API key and provider type.",connectionCheckForbidden:"403 Forbidden: your key may not have access to this provider/model.",connectionCheckNotFound:"404 Not Found: check Base URL path (OpenAI-compatible usually ends with /v1).",connectionCheckRateLimited:"429 Rate limited: wait and retry, or switch to another key/provider.",connectionCheckTimeout:"Connection timed out: check network/proxy and retry.",connectionCheckNetwork:"Network connection failed: check DNS/proxy/Base URL.",connectionCheckFailed:"Connection check failed: {error}",apiKeyCleared:"API key cleared for {provider}.",customAdded:"Custom provider added: {provider}.",customRenamed:"Custom provider renamed: {provider}.",customModelsUpdated:"Custom provider models updated: {provider}.",customDeleted:"Custom provider deleted: {provider}.",modelsRequired:"Add at least one model.",modelsEmpty:"No models found.",modelsFetchFailed:"Failed to fetch models: {error}",modelsFetchChatCompletions:"Model list not supported for /chat/completions or /responses base URL.",manualModelsRequired:"This endpoint doesn't support automatic model discovery. Please manually enter model names in the models configuration.",nameRequired:"Provider name is required.",nameConflict:"Provider name already exists."}},copyToast:{copiedToClipboard:"Copied to clipboard"}};var es_default2={common:{apply:"Aplicar",cancel:"Cancelar",close:"Cerrar",confirm:"Confirmar",yes:"Sí",no:"No",exit:"Salir",back:"Atrás",next:"Siguiente",save:"Guardar",empty:"—",unknownError:"Error desconocido",inputClearTip:"Ctrl+C limpiar",total:"Total"},configDialog:{title:"Configuración",hint:"Tab/Shift+Tab cambiar campo • Enter Aplicar • Esc Cancelar",modelsTitle:"Modelos (personalizados)",modelsPlaceholder:"modelo-a, modelo-b",contextWindowTitle:"Ventana de contexto",contextWindowLocked:"Ventana de contexto (definida por el modelo)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperatura",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperatura: solo números y "."',maxTokensTitle:"Máx. tokens de salida",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL (compatible con OpenAI)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Actual:",apiKeyNotSet:"(no configurada)",apiKeyTitle:"API Key",apiKeyPlaceholder:"Pega una nueva clave para actualizar (déjalo vacío para mantener)",interleavedThinkingTitle:"Pensamiento intercalado (Espacio para alternar)",interleavedThinkingLocked:"Pensamiento intercalado (definido por el modelo)",interleavedThinkingOpen:"Abierto",interleavedThinkingClose:"Cerrado",tipIntensityTitle:"Intensidad de consejos",tipIntensityOff:"Desactivado",tipIntensityLow:"Bajo",tipIntensityStandard:"Estándar",shortcutsTitle:"Atajos",shortcutCommandsLabel:"Comandos",shortcutTimelineLabel:"Línea de tiempo",shortcutNewSessionLabel:"Nueva sesión",shortcutsPlaceholder:"ej. mod+p",shortcutsHint:"Usa mod/ctrl/alt/shift + tecla (a-z, 0-9, F1-F12)."},languageDialog:{title:"Idioma",hint:"Enter Aplicar • Esc Cancelar",languageTitle:"Idioma",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Esfuerzo de pensamiento",hint:"Enter Aplicar • Esc Cancelar",effortTitle:"Esfuerzo de razonamiento",applied:"Esfuerzo de razonamiento establecido en {effort}",option:{low:"Bajo",medium:"Medio",high:"Alto",xhigh:"Muy alto",max:"Máx",minimal:"Mínimo",none:"Ninguno",off:"Desactivado",auto:"Auto"}},toolSettingsDialog:{title:"Configuración de herramientas",hint:"Enter Aplicar • Esc Cancelar",websearchTitle:"Clave API de WebSearch",apiKeyCurrentPrefix:"Actual:",apiKeyNotSet:"(no configurada)",apiKeyInvalidCjk:"La clave API no puede contener caracteres chinos.",apiKeyInvalidSpaces:"La clave API no puede contener espacios.",apiKeyPlaceholder:"Pega la clave API de Serper"},pluginsDialog:{title:"Plugins",hint:"Selecciona un plugin para configurar • Esc Cerrar",serperSearch:"Búsqueda Serper",serperSearchDetail:"Búsqueda web vía API de Serper",configured:"Configurado",notConfigured:"No configurado",serperConfigTitle:"Configuración de Búsqueda Serper",serperConfigHint:"Tab Cambiar • Enter Aplicar • Esc Cancelar"},skillsDialog:{title:"Habilidades",hint:"Enter Aplicar • Esc Cancelar",empty:"No hay habilidades disponibles",emptyFiltered:"Sin habilidades coincidentes"},timelineDialog:{title:"Cronología",hint:"Tab Filtrar • Enter Abrir • Esc Cerrar",empty:"Aún no hay mensajes",emptyFiltered:"Sin entradas coincidentes",filterAll:"Todos los mensajes",filterUser:"Mensajes del usuario",filterTool:"Llamadas de herramientas"},mcpSettingsDialog:{title:"MCP",hint:"Edita el archivo mcp.json para configurar servidores MCP • Esc Cerrar",configFileLabel:"Archivo de configuración:",noServersHint:"Aún no hay servidores MCP configurados.",serverCount:"{count} servidor(es) configurado(s)",guideText:"Edita el archivo de arriba para agregar o modificar servidores MCP.",openFile:"Abrir archivo",reload:"Recargar",close:"Cerrar",reloaded:"Configuración MCP recargada.",reloadFailed:"Error al recargar: {error}",status:"Estado",toolCount:"Herramientas",disabled:"desactivado",testConnection:"Probar",testing:"Probando conexiones...",testComplete:"Prueba completada.",testPartial:"Prueba completada con errores.",testFailed:"Conexión fallida: {error}",invalidJson:"JSON inválido: {error}",invalidShape:'JSON de MCP inválido: se esperaba "mcpServers".',invalidServer:"Servidor MCP inválido: {name}",noServers:"No se encontraron servidores MCP.",lintOk:"Sintaxis JSON correcta",lintAt:"{error} (línea {line}, col {column})",lintUnclosed:"{char} sin cerrar (línea {line}, col {column})",lintInvalid:"{error}",exampleFormat:"Formato de ejemplo:"},toolApprovalsDialog:{title:"Aprobaciones de herramientas",useAuto:"Automático",useNormal:"Normal",useStrict:"Estricto",close:"Cerrar",focusedTitleAuto:"AUTOMÁTICO",focusedTitleNormal:"NORMAL",focusedTitleStrict:"ESTRICTO",focusedTitleClose:"CERRAR",focusedDescAuto:"Aprobar automáticamente todas las llamadas de herramientas. Sin solicitud de aprobación (más rápido, menos seguro).",focusedDescNormal:"Aprobar automáticamente herramientas de solo lectura. Preguntar antes de herramientas de escritura/ejecución.",focusedDescStrict:"Requerir confirmación para cada llamada de herramienta (más seguro, más lento).",focusedDescClose:"Cerrar este diálogo sin cambiar la configuración actual.",currentPrefix:"Actual: {mode}",tip:"Consejo: Tab o ↑/↓ para moverte entre botones, Enter para confirmar, Esc para cerrar."},settingsDialog:{pendingApproval:"Resuelve la aprobación pendiente antes de cambiar la configuración.",invalidShortcut:"Atajo inválido para {label}: {value}",shortcutCommands:"Atajo de comandos",shortcutTimeline:"Atajo de línea de tiempo",shortcutNewSession:"Atajo de nueva sesión",toolApprovalsApplied:"Aprobaciones de herramientas: {mode}",applied:"Configuración aplicada."},exitAppDialog:{title:"Salir de DimCode",confirm:"¿Salir ahora?",warning:"Una respuesta del agente aún está en progreso. Salir la interrumpirá.",reasonPrefix:"Razón: {reason}"},approvalDialog:{title:"Aprobar permiso de herramienta",toolLabel:"Herramienta: {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Permiso: {permission} ({risk})",descriptionLabel:"Descripción: {description}",commandLabel:"Comando:",inlineActionHint:"↑/← Anterior ↓/→ Siguiente Enter Confirmar 1/2/3 Elegir",inlineActionHintCompact:"←/→ Mover Enter Confirmar 1/2/3 Elegir",buttons:{approve:"Aprobar",alwaysApprove:"Siempre aprobar",deny:"Denegar",always:"Siempre",ok:"OK",no:"No",y:"S",all:"Todos",n:"N"}},askUserDialog:{noQuestionsTitle:"Sin preguntas",noQuestionsBody:"No hay preguntas para responder.",title:"Pregunta {index}/{total}: {header}",defaultHeader:"Pregunta",prev:"Anterior",next:"Siguiente",submit:"Enviar",otherOption:"Otro",otherDetail:"Proporciona una respuesta personalizada",inlineHintOptions:"Teclas: ↑↓ para moverte, ←→ para cambiar pregunta, Enter para seleccionar.",inlineHintMulti:"Selección múltiple: Espacio alterna el estado marcado.",inlineHintButtons:"Tab a botones, ←→ para cambiar, Enter para activar, ↑ regresa a opciones.",inlineHintNav:"Ctrl+Left / Ctrl+Right (o Ctrl+A / Ctrl+E) para cambiar de pregunta.",inlineHintSubmit:"Ctrl+Enter envía, Esc cancela.",inlineButtonPrev:"[Anterior]",inlineButtonNext:"[Siguiente]",inlineButtonSubmit:"[Enviar]",inlineButtonCancel:"[Cancelar]",inlineActionHint:"Espacio Seleccionar ← Anterior → Siguiente Enter Siguiente/Enviar Esc Cancelar",inlineActionHintCompact:"Espacio Seleccionar ←/→ Anterior/Siguiente Enter Siguiente/Enviar Esc Cancelar",optionsSummaryAll:"{count} opciones",optionsSummaryVisibleMore:"{count} opciones ({start}-{end}) ↓ más",multiSelectHint:"[Selección múltiple] Espacio para alternar, Enter para confirmar",singleSelectHint:"[Selección única] Usa flechas, Enter para confirmar",customAnswerLabel:"Respuesta personalizada:",customAnswerPlaceholder:"Escribe tu respuesta...",otherPlaceholder:"Otro seleccionado — escribe tu respuesta y presiona Enter para completar."},nextApiOAuthDialog:{title:"Inicio de sesión DimCode OAuth",copyUrl:"Copiar URL",login:"Iniciar sesión",logout:"Cerrar sesión",statusTitle:"Estado",statusAuthenticated:"✓ Sesión iniciada como {email}",statusLoading:"⏳ Autenticando...",statusNotLoggedIn:"✗ No has iniciado sesión",instructionAuthenticated:"Usa ↑↓ para navegar, Enter para seleccionar, o números 1-9",instructionLoading:"Presiona C para copiar la URL de abajo si el navegador no se abrió",instructionNeedsSetup:"Verifica el redirect_uri, los scopes y el estado habilitado de DimCode OAuth, luego intenta de nuevo",instructionWithUrl:"Presiona C para copiar la URL de OAuth de abajo, o presiona Enter para abrir el navegador",instructionUnauthed:"Presiona Enter para iniciar sesión con DimCode OAuth, o Esc para cerrar",instructionManualCallback:"Copia la URL de abajo, inicia sesión en tu navegador y pega la URL redirigida en el cuadro de entrada.",oauthUrlTitleLoading:"URL de OAuth (copia si el navegador no se abrió)",oauthUrlTitleReady:"URL de OAuth (lista para usar)",scrollIndicator:" [{start}-{end} de {total}]",selectModelTitle:"Seleccionar modelo (↑↓/1-9, Enter para seleccionar){indicator}",aboutTitle:"Acerca de DimCode OAuth",setupTitle:"Error de inicio de sesión OAuth",aboutBulletOne:"• Usa el cliente OAuth integrado de DimCode",aboutBulletTwo:"• Obtiene modelos relay después de iniciar sesión y guarda la configuración del proveedor",aboutBulletThree:"• Usa tokens de actualización OAuth en lugar de una clave API de larga duración",viewAllPlans:"Ver todos los planes →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"Cuenta DimCode",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"Generando URL de OAuth...",urlReady:"¡URL de OAuth lista! Cópiarla o presionar Enter para abrir el navegador.",generateUrlFailed:"Error al generar la URL de OAuth: {error}",startingLogin:"Iniciando sesión con OAuth...",browserOpened:"Navegador abierto. Si no, copia la URL del diálogo.",copyUrlToLogin:"Copia la URL de OAuth del diálogo para iniciar sesión.",urlCopied:"URL de OAuth copiada al portapapeles.",urlCopyFailed:"Error al copiar la URL de OAuth.",authSuccess:"¡Autenticación exitosa con DimCode OAuth!",loginFailed:"Error de inicio de sesión OAuth: {error}",loggedOut:"Sesión cerrada de DimCode OAuth",loggedOutWithRemoteWarning:"Sesión cerrada de DimCode OAuth, pero la revocación remota falló: {error}",logoutFailed:"Error al cerrar sesión: {error}",initFailed:"Error de inicialización del diálogo: {error}",modelSwitched:"Modelo cambiado a {model}",selectModelFailed:"Error al seleccionar modelo: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Depuración",titleDebugging:"Depurando",copy:"copiar",proceed:"continuar",fixed:"corregido",body:"He añadido registros de depuración (y posiblemente una corrección). Por favor intenta reproducir el problema ahora, luego elige un resultado."},exitSessionDialog:{title:"Salir de la sesión",confirm:"¿Salir de la sesión actual y volver al inicio?",note:"El siguiente mensaje iniciará una nueva sesión."},messageActionsDialog:{title:"Acciones del mensaje",revert:"Revertir mensajes",revertWithFiles:"Revertir mensajes y cambios de archivos",revertKeepFiles:"Revertir mensajes (mantener cambios de archivos)",revertFilesOnly:"Revertir solo cambios de archivos",copy:"Copiar texto del mensaje al portapapeles",fork:"Bifurcar para crear una nueva sesión",pin:"Fijar mensaje",unpin:"Desfijar mensaje"},pathPickerDialog:{hint:"↑/↓ seleccionar • Tab completar • Enter confirmar • Esc cerrar"},providerConnectDialog:{title:"Conectar {provider}",providerFallback:"Proveedor",hint:"Tab cambiar • Ctrl+C limpiar • Enter Aplicar",hintOpenAI:"Tab cambiar • Ctrl+C limpiar • Enter Aplicar",hintGemini:"Tab cambiar • Ctrl+C limpiar • Enter Aplicar",hintAnthropic:"Tab cambiar • Ctrl+C limpiar • Enter Aplicar",hintGeneric:"Tab cambiar • Ctrl+C limpiar • Enter Aplicar",applyingHint:"Probando conexión, espera...",applyingButton:"Aplicando...",testConnection:"Probar conexión",baseUrlStatusAutoFix:"Corrección automática: {value}",baseUrlStatusInvalid:"Base URL debe ser http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API Key",apiKeyPlaceholder:"Pega una nueva clave para actualizar (déjalo vacío para mantener)",apiKeyCurrent:"Actual: {value}",apiKeyNotSet:"Actual: (no configurada)",apiKeyInvalidCjk:"La clave API no puede contener caracteres chinos.",apiKeyInvalidSpaces:"La clave API no puede contener espacios.",clearKey:"Eliminar",useDetectedKey:"Usar {name}",disconnectButton:"Desconectar",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"Desactivado",toggleOn:"Activado",toggleHint:"Tab cambiar • ←/→ cambiar • Espacio alternar"},redoConfirmDialog:{title:"Confirmar rehacer",body:"¿Estás seguro de que quieres restaurar los mensajes revertidos?"},renameSessionDialog:{title:"Renombrar sesión",label:"Nombre de la sesión",placeholder:"ej. Notas de planificación"},sessionsDialog:{timeNow:"ahora",timeMinutes:"{count} min",timeHours:"{count} hr",timeDays:"{count} d",newSession:"Nueva sesión",title:"Sesiones ({count})",titleScoped:"Sesiones ({count}/{total})",scope:"Alcance: {cwd}",loading:"Cargando…",confirmDelete:"Confirmar eliminación: presiona Delete de nuevo",header:"{count} sesiones • Flechas para navegar • Enter selecciona{range}{activity}",headerRange:" • Mostrando {start}-{end}",runningCount:"{count} en ejecución",pausedCount:"{count} esperando confirmación",hint:"Escribe para saltar • ←/→ botones • Enter confirmar • Esc cerrar",focusPrefix:"Enfoque: {focus}",focusList:"Lista",focusButtons:"Botones",noSessionsCwd:"No hay sesiones en este directorio",noSessions:"Aún no hay sesiones guardadas",nodeOnly:"Las sesiones solo están disponibles en modo Node/CLI.",newSessionTitle:"Nueva sesión",newSessionTarget:"una nueva sesión",busy:{agentResponding:"El agente sigue respondiendo",awaitingAskUser:"Esperando respuestas de AskUser",awaitingToolApproval:"Esperando aprobación de herramienta",pendingApproval:"Aprobación pendiente"},buttons:{open:"Abrir",delete:"Eliminar",deleteConfirm:"Eliminar (confirmar)",scope:"Alcance: {scope}",scopeCwd:"CWD",scopeAll:"Todo",refresh:"Actualizar"}},sessionsOverlay:{title:"Sesiones",hint:"Enter Seleccionar • Esc Cerrar • Ctrl+R Actualizar • Ctrl+W Alcance",loading:"Cargando sesiones...",empty:"Aún no hay sesiones guardadas.",loadingMore:"Cargando más…",hasMore:"↓ más",scope:{cwdOnly:"solo cwd",allCwd:"todos los cwds"}},switchSessionDialog:{title:"Cambiar sesión",confirm:"Cambiar e interrumpir",target:"¿Cambiar a {target}?",fallback:"¿Cambiar de sesión ahora?",warning:"Esto interrumpirá la respuesta/flujo actual en la sesión activa.",reason:"Razón: {reason}"},themeDialog:{title:"Tema",hint:"Enter Aplicar • Esc Cancelar",mode:"Modo",light:"Claro",dark:"Oscuro",unavailable:"Esta terminal no soporta temas intercambiables.",fallback:"Se usa un tema fijo alternativo claro/oscuro ANSI aquí.",tip:"Consejo: el predeterminado sigue el tema del sistema."},commandPalette:{searchPlaceholder:"Buscar…",noMatches:"Sin resultados",hint:"Escribe para filtrar • Enter: abrir • Esc: cerrar",title:"Comandos"},skills:{title:"Habilidades"},help:{title:"Ayuda",modeLabel:"Modo: {mode}",modeDetail:"Modo actual del asistente.",shortcutsLabel:"Atajos",onboarding:`¡Bienvenido! Inicio rápido:
1138
1138
  1) /connect: conectar un proveedor
1139
1139
  2) /models: elegir un modelo
1140
1140
  3) envía "hola" para empezar a chatear
1141
- Consejo: {commandsKey} abre la paleta de comandos.`,items:{help:"Ayuda y atajos (F1)",commands:"Paleta de comandos (Ctrl+P)",back:"Volver al salto anterior",status:"Alternar detalles de estado"}},commands:{help:{label:"Ayuda",detail:"Atajos + comandos comunes (F1)"},sessions:{label:"Sesiones",detail:"Elegir o crear una sesión (/sessions)"},timeline:{label:"Línea de tiempo",detail:"Saltar a un mensaje de usuario (/timeline)"},newSession:{label:"Nueva sesión",detail:"Iniciar una nueva sesión (/new)"},connectProvider:{label:"Conectar proveedor",detail:"Conectar un proveedor (/connect)"},models:{label:"Modelos",detail:"Seleccionar un modelo (/models)"},toolApprovals:{label:"Aprobaciones de herramientas",detail:"Configurar aprobaciones (/approvals)"},toolSettings:{label:"Config. de herramientas",detail:"Configurar ajustes específicos de herramientas (/tool-settings)"},mcpHub:{label:"MCP",detail:"Gestionar conectores y ajustes MCP (/mcp)"},plugins:{label:"Plugins",detail:"Gestionar plugins (/plugins)"},debug:{label:"Depuración",detail:"Logs de observabilidad SDK (/debug)"},mcpSettings:{label:"MCP (JSON avanzado)",detail:"Configurar JSON sin formato de servidores MCP (/mcp-settings)"},language:{label:"Idioma",detail:"Cambiar idioma de la interfaz (/language)"},settings:{label:"Configuración",detail:"Ajustes de proveedor personalizado (/settings, Ctrl+K)"}},homePage:{multilineTitle:"Texto multilínea",multilineTitleWithCount:"Texto multilínea ({count} líneas)",providerCustom:"Personalizado",reviewPrompt:"ayúdame a revisar los cambios del código",footerCwd:"cwd {cwd}",hints:{switchMode:"cambiar modo",commands:"comandos"},tips:{greeting:"¡Bienvenido de nuevo! Prueba {commandsKey} o {init} para empezar.",commandsAlias:"Consejo: {key} abre la paleta de comandos."},prompts:{help:"Ayuda y atajos (F1)",sessions:"Listar/elegir sesiones",connect:"Conectar un proveedor",models:"Seleccionar un modelo",newSession:"Iniciar una nueva sesión",approvals:"Configurar aprobaciones de herramientas (auto/normal/estricto)",commands:"Abrir paleta de comandos",toolSettings:"Configurar ajustes de herramientas",mcpSettings:"Abrir MCP",plugins:"Gestionar plugins",language:"Cambiar idioma de la interfaz",theme:"Seleccionar un tema",status:"Alternar detalles de estado",review:"Revisar cambios del código",init:"Inicializar/mejorar AGENTS.md",skills:"Listar habilidades cargadas",exit:"Salir de la aplicación",debug:"Diálogo de depuración (chat)",settings:"Ajustes de proveedor personalizado"},commandPalette:{connect:"Conectar un proveedor",models:"Seleccionar un modelo"},commands:{debugLabel:"Depuración",debugDetail:"Logs de observabilidad SDK (/debug)"},toast:{approvalsUsage:"Usa /approvals (sin activar/desactivar).",customProviderOnly:"Configuración solo para proveedores personalizados.",redoChatOnly:"Rehacer solo está disponible en la vista de chat.",retryChatOnly:"Reintentar solo está disponible en la vista de chat.",pinsChatOnly:"Los fijados solo están disponibles en la vista de chat.",renameChatOnly:"Renombrar solo está disponible en la vista de chat (/rename <título>).",commandRemoved:"Este comando ya no está disponible: {command}",helpAliasRemoved:"Presiona F1 para ayuda.",deleteConfirm:"Presiona Delete de nuevo para confirmar.",themeToggled:"Tema: {mode}",pasteImagePending:"La imagen aún se está procesando. Espera un momento."}},chatPage:{placeholder:"Pregunta lo que quieras... (nueva línea: Shift+Enter o Ctrl+J)",placeholderAwaitingApproval:"Bloqueado por aprobación: selecciona Aprobar / Denegar para continuar.",reviewPrompt:"ayúdame a revisar los cambios del código",notification:{approvalTitle:"[Aprobación requerida] Permiso de herramienta",approvalMessage:"DimCode está esperando aprobación de herramienta: {tool}.",doneTitle:"[Tarea completada]",doneMessage:"DimCode completó esta tarea.",doneMessageWithDuration:"DimCode completó esta tarea en {duration}.",doneMessageWithTools:"DimCode completó esta tarea después de {tools} llamada(s) de herramienta.",doneMessageWithToolsAndDuration:"DimCode completó esta tarea en {duration} con {tools} llamada(s) de herramienta."},headerStats:"{messages} msgs · total {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"Consolidando,Pensando,Razonando,Planificando,Analizando,Sintetizando,Refinando,Componiendo",modelFallback:"modelo",mode:{plan:"plan",agent:"agente",debug:"depuración"},status:{approvalsAuto:"AUTO",approvalsAll:"TODO",blockedByApproval:"Bloqueado por aprobación",awaitingApprovalAction:"Esperando tu aprobación: elige Aprobar / Denegar para continuar."},footer:{dragSelect:"arrastra para seleccionar",openLink:"Ctrl+Clic para abrir archivos o enlaces",esc:"esc",interrupt:"interrumpir",approvalPaused:"⏸ Pausado",approvalPausedHint:"Esperando aprobación (Enter para elegir).",shortcuts:"Ctrl+K: config Ctrl+O: expandir/colapsar herramientas y pensamiento Cmd+Delete/Ctrl+W: limpiar entrada Tab: cambiar modo {commandsKey}: comandos",shortcutsCompact:"Ctrl+K: config Ctrl+O: herram./pensam. Cmd+Delete/Ctrl+W: limpiar Tab: cambiar modo {commandsKey}: comandos",shortcutsMicro:"Ctrl+O: herramientas {commandsKey}: comandos",shortcutsMini:"{commandsKey}: comandos"},session:{new:"nueva"},timeline:{title:"Línea de tiempo",empty:"(vacío)",filterAll:"Todos los mensajes",filterUser:"Mensajes de usuario",filterTool:"Llamadas de herramienta"},pins:{title:"Fijados",empty:"(vacío)"},jumpToBottom:{button:"↓"},prompts:{help:"Ayuda y atajos (F1)",newSession:"Iniciar una nueva sesión",resume:"Reanudar la cola pausada",sessions:"Listar/elegir sesiones",timeline:"Saltar a un mensaje de usuario",pins:"Abrir mensajes fijados",pin:"Fijar el último mensaje",back:"Volver al salto anterior",connect:"Conectar un proveedor",models:"Seleccionar un modelo",theme:"Cambiar tema de la interfaz",approvals:"Configurar aprobaciones de herramientas (auto/normal/estricto)",commands:"Abrir paleta de comandos",toolSettings:"Configurar ajustes de herramientas",mcpSettings:"Abrir MCP",plugins:"Gestionar plugins",language:"Cambiar idioma de la interfaz",status:"Alternar detalles de estado",review:"Revisar cambios del código",retry:"Reintentar el último mensaje de usuario",compact:"Compactar contexto de la sesión",init:"Inicializar/mejorar AGENTS.md",rename:"Renombrar sesión actual",skills:"Listar habilidades cargadas",exit:"Salir de la aplicación",debug:"Diálogo de depuración",settings:"Ajustes de proveedor personalizado"},commands:{pinsLabel:"Fijados",pinsDetail:"Abrir mensajes fijados",backLabel:"Atrás",backDetail:"Volver al salto anterior",debugLabel:"Depuración",debugDetail:"Logs de observabilidad SDK (/debug)",statusLabel:"Estado",statusDetail:"Alternar detalles de estado",themeLabel:"Tema",themeDetail:"Cambiar tema de colores"},tips:{contextWarn:"Consejo: El contexto se está llenando. Considera /compact o /new para mantener las respuestas precisas.",contextCritical:"Consejo: Estás cerca del límite de contexto. Inicia una nueva sesión con /new (o /compact primero).",timeline:"Consejo: ¿Chat largo? Usa /tl para volver a un mensaje de usuario específico.",timelineAlias:"Consejo: /tl es un alias corto de /timeline.",commandsAlias:"Consejo: {key} abre la paleta de comandos.",errorRecovery:"Consejo: Si algo falló, prueba /compact o /new.",greeting:"¡Bienvenido de nuevo! Prueba {commandsKey} o {init} para empezar.",compactDelight:"¡Bien! Mantener el contexto ligero ayuda.",addTests:'¡Todo listo! ¿Quieres que agregue pruebas? Responde "sí" u "ok".'},confirm:{addTests:"Por favor agrega pruebas para los cambios que acabamos de hacer."},toast:{customProviderOnly:"Configuración solo para proveedores personalizados.",renameNodeOnly:"Renombrar solo está disponible en modo Node/CLI.",noActiveSession:"No hay sesión activa para renombrar.",sessionNameEmpty:"El nombre de la sesión no puede estar vacío.",sessionRenamed:"Sesión renombrada a: {title}",renameFailed:"Error al renombrar la sesión.",linkOpenHint:"Consejo: Ctrl+Clic para abrir archivos o enlaces.",copySuccess:"Copiado",copyFailed:"Error al copiar",forkFailed:"Error al bifurcar la sesión.",backEmpty:"No hay salto anterior al que volver.",pinsEmpty:"Aún no hay mensajes fijados.",pinEmpty:"Aún no hay mensaje para fijar.",pinned:"Mensaje fijado.",unpinned:"Mensaje desfijado.",debugUnavailable:"El servidor de depuración no está disponible.",approvalsUsage:"Usa /approvals (sin activar/desactivar).",debugDialogOpened:"Diálogo de depuración abierto.",debugDialogClosed:"Diálogo de depuración cerrado.",renameUsage:"Uso: /rename <título>",themeToggled:"Tema: {mode}",statusCompactOn:"Estado: compacto",statusCompactOff:"Estado: detallado",compactingSession:"Compactando sesión...",compactSuccess:"Sesión compactada: {message}",compactWarning:"Sesión compactada con ganancia limitada: {message}",compactSuccessDetailWithTokens:"Se plegaron las primeras {count} mensajes del historial en un resumen. Tokens de entrada estimados {before} -> {after}, ahorrando aproximadamente {saved} tokens.",compactSuccessDetailNotReduced:"Se plegaron las primeras {count} mensajes del historial en un resumen, pero los tokens de entrada estimados cambiaron de {before} a {after}, por lo que esto no redujo el tamaño de la solicitud.",compactSuccessDetailCountOnly:"Se plegaron las primeras {count} mensajes del historial en un resumen.",compactSuccessDetailSummaryOnly:"Se generó un nuevo resumen de conversación.",compactFailed:"Error al compactar la sesión: {error}",compactFailedTokenLimit:"La compactación falló por presupuesto de contexto insuficiente. Configura DIMCODE_CONTEXT_WINDOW correctamente, cambia a un modelo con más contexto, o usa /new. Detalle: {error}",retryEmpty:"No hay mensaje de usuario anterior para reintentar.",commandRemoved:"Este comando ya no está disponible: {command}",helpAliasRemoved:"Presiona F1 para ayuda.",waitForResponse:"Espera a que se complete la respuesta actual, o presiona Esc para interrumpir.",pasteImagePending:"La imagen aún se está procesando. Espera un momento.",pendingApproval:"Por favor maneja tool_approve primero.",awaitingApprovalAction:"Pausado: acción necesaria. Elige Aprobar / Siempre aprobar / Denegar en la tarjeta de permiso.",awaitingApprovalStillWaiting:"Aún esperando aprobación ({seconds}s). El modelo no continuará hasta que apruebes o deniegues.",pendingAskUser:"Por favor maneja ask_user primero.",notificationSessionBusy:"Esta notificación pertenece a otra sesión ocupada. Termina ese trabajo o cambia de sesión manualmente primero.",notificationSessionUnavailable:"No se puede abrir la sesión para esta notificación aquí.",notificationSessionSwitchFailed:"Error al abrir la sesión para esta notificación.",approvalNotActive:"Esta aprobación está en cola. Resuelve la activa primero.",askUserNotActive:"Esta solicitud de ask_user ya no está activa."}},chatQueue:{label:"Cola ({count})",labelCompact:"Cola {count}",more:"+{count} más…",resumeToken:"/resume",resumePlainToken:"reanudar",resumeLegacyToken:"reanudar cola",state:{idle:"Pendiente",running:"En ejecución",paused:"Pausado",error:"Error"},item:{steerAction:"Dirigir",steerReady:"Primero",steerPending:"Siguiente",steerPaused:"Pausado"},toast:{enqueued:"Agregado a la cola (#{count}).",full:"La cola está llena (máx. 5). Elimina uno o inicia /new.",cleared:"Se limpiaron {count} elemento(s) en cola.",deleted:"Se eliminaron {count} elemento(s) en cola. Ctrl+Z para deshacer.",steerPromoted:"Promovido a dirigir. Se ejecutará primero cuando la cola se reanude.",steerQueued:"No se pudo inyectar la dirección inmediatamente. Fue promovida y se ejecutará primero en la próxima ronda.",steerSent:"Dirección aceptada. Se inyectará antes de la próxima llamada del modelo en esta ronda.",undo:"Eliminación de cola deshecha.",pausedTip:"Cola pausada. Usa {resume} o {resumeText} para continuar, o envía un nuevo mensaje para elegir qué hacer.",stale:"Cola pausada: la solicitud parece atascada."},confirm:{title:"¿Continuar mensajes en cola?",description:"La solicitud anterior no terminó. {count} mensaje(s) en cola esperando.",hint:"Continúa para enviar el siguiente elemento, o pausa la cola.",continue:"Continuar",pause:"Pausar",reason:"Razón: {reason}"},reason:{network_error:"Error de red.",timeout:"La solicitud expiró.",canceled_by_user:"Cancelado por el usuario.",rate_limited:"Limitado por tasa.",config_unavailable:"Configuración guardada no disponible.",unknown:"La solicitud falló."},draftDecision:{title:"La cola está pausada",description:"{count} mensaje(s) en cola aún están esperando. Decide qué hacer con tu nueva entrada.",previewLabel:"Nueva entrada:",continue:"Continuar cola",append:"Agregar a la cola",replace:"Descartar cola y enviar"}},chatStatus:{done:"Listo.",error:"Error.",interrupted:"Interrumpido.",permissionDenied:"Permiso denegado.",planning:"Planificando…",drafting:"Redactando…",retrying:"Reintentando ({retry}/{maxAttempts})…",runningTool:"Ejecutando {tool}…",runningTools:"Ejecutando {count} herramientas…",approvalPendingOther:"Otra aprobación está pendiente ({permission})…",awaitingApproval:"Esperando aprobación…",awaitingApprovalWithPerm:"Esperando aprobación ({permission})…",awaitingApprovalWithRisk:"Esperando aprobación ({risk})…",awaitingAnswers:"Esperando respuestas…",resumingApproved:"Aprobado. Reanudando…",resumingDenied:"Denegado. Reanudando…",resuming:"Reanudando…",autoApprovingWithRisk:"Auto-aprobando ({risk})…",riskFallback:"riesgo",toolFallback:"herramienta",thinking:"Pensando…",autoCompactionRequired:"El contexto está cerca del límite. Se requiere compactación primero.",autoCompactionRequiredDetailed:"El contexto está cerca del límite · la próxima solicitud se estima en {estimated} tokens, y la auto-compactación comienza a {threshold} tokens, por lo que se requiere compactación primero.",compressed:"Contexto compactado · se plegaron {removed} mensajes anteriores en un resumen, ahorrando aproximadamente {saved} tokens de entrada ({elapsed}ms)",autoCompactedDetailed:"Auto-compactación completada · se plegaron {removed} mensajes anteriores en un resumen, tokens de entrada estimados {before} -> {after}, ahorrando aproximadamente {saved} tokens",autoCompactedNotReduced:"Auto-compactación completada · se plegaron {removed} mensajes anteriores en un resumen, pero los tokens de entrada estimados cambiaron de {before} a {after}, por lo que esto no redujo el tamaño de la solicitud",autoCompactedSaved:"Auto-compactación completada · se plegaron {removed} mensajes anteriores en un resumen, ahorrando aproximadamente {saved} tokens",autoCompactedCountOnly:"Auto-compactación completada · se plegaron {removed} mensajes anteriores en un resumen",interruptedMarkdown:"> **Interrumpido** · Respuesta cancelada por el usuario (`Esc`).",awaitingApprovalPrefix:"Esperando aprobación",awaitingAnswersPrefix:"Esperando respuestas",approvalPendingPrefix:"Otra aprobación está pendiente",autoApprovingPrefix:"Auto-aprobando"},chatParts:{thinking:"Pensando",plan:"Plan",todo:"Pendientes"},chatRender:{userLabel:"usuario",outputLabel:"↳ salida",outputLabelShort:"sal:",canceled:"cancelado",inputLabel:"ent:",collapse:"... (colapsar)",moreLines:"... ({count} líneas más)",moreLinesOmitted:"... ({count} líneas más omitidas; configura {envVar} para aumentar)",streamingTail:"… (transmitiendo: mostrando últimos {shown} caracteres; {omitted} omitidos)",copy:"Copiar",userResponses:"Respuestas del usuario:",approvalQueued:"Esperando aprobación anterior...",proposedPlan:{title:"Plan propuesto"},llmMeta:{changedFiles:"Se modificaron {count} archivo(s): {files}",changedFilesMore:"+{count} más",revertHint:"Consejo: Haz clic en este mensaje -> Revertir mensajes para deshacer este turno.",changedFilesCardTitle:"se modificaron {count} archivos:",revertButton:"Revertir"},toolName:{explore:"Explorar",subagent:"Subagente"},toolSuffix:{offset:"desplazamiento {value}",limit:"límite {value}",matches:"{count} coincidencias",todos:"{count} pendientes",results:"{count} resultados",results_one:"{count} resultado"},toolGroup:{readFiles:"Leer {count} archivos",writeFiles:"Escribir {count} archivos",editFiles:"Editar {count} archivos",globPatterns:"Glob {count} patrones",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} patrones",bashCommands:"Ejecutar {count} comandos",searchQueries:"Buscar {count} consultas",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"La búsqueda puede acceder a la red.",bash:"Bash puede ejecutar comandos.",edit:"Los cambios de archivos pueden modificar archivos locales.",grep:"Grep puede leer archivos locales."},inlineHint:"Teclas: ↑↓←→ para moverte, Enter para seleccionar.",awaitingUserAction:"Esperando tu acción: elige Aprobar / Siempre aprobar / Denegar.",decision:{userDenied:"El usuario denegó la aprobación"},denied:{title:"# Permiso de herramienta denegado",toolLine:"- herramienta: `{tool}`",permissionLine:"- permiso: `{permission}`",hint:"Puedes volver a seleccionar la llamada de herramienta e intentarlo de nuevo."},summary:{title:"# Herramienta aprobada y ejecutada",permissionLine:"Permiso `{permission}` aprobado para `{tool}`."},required:"Aprobación requerida ({risk}).",args:{commandWithDescription:"Comando: {command} - {description}",command:"Comando: {command}",description:"Descripción: {description}",raw:"Args: {args}"}},pathPicker:{titleWorkspace:"Seleccionar espacio de trabajo",titleFile:"Seleccionar archivo",placeholderWorkspace:"Escribe una ruta (../ etc). Tab para completar. Enter selecciona un directorio.",placeholderFile:"Escribe una ruta (../ etc). Tab para completar. Enter selecciona un archivo."},providerDialogs:{customLabel:"Personalizado",customDetail:"personalizado",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Iniciar sesión con DimCode OAuth",addCustomLabel:"Agregar proveedor personalizado",addCustomDetail:"agregar proveedor personalizado",providerFallback:"Proveedor",adapter:{openai:"OpenAI",openaiOpenRouter:"Compatible con OpenAI (OpenRouter)",openaiLocal:"Compatible con OpenAI (Endpoint local)",openaiResponses:"Respuestas OpenAI",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Configurado",notConfigured:"No configurado"},manage:{title:"Proveedor personalizado: {provider}",connect:"Conectar",connectDetail:"Editar API Key / Base URL",rename:"Renombrar",renameDetail:"Editar nombre del proveedor",models:"Editar modelos",modelsDetail:"Actualizar IDs de modelos disponibles",delete:"Eliminar",deleteDetail:"Eliminar este proveedor"},deleteConfirm:{title:"¿Eliminar {provider}?",confirm:"Eliminar (confirmar)",confirmDetail:"Esto no se puede deshacer",cancelDetail:"Mantener proveedor"},nameDialog:{title:"Nombrar proveedor personalizado",label:"Nombre del proveedor",placeholder:"ej. DeepSeek (Proxy)"},modelsDialog:{title:"Modelos de proveedor personalizado",modelsTitle:"Modelos",modelsPlaceholder:"IDs de modelos (, o nuevas líneas)",hint:", / nueva línea • Shift+Enter nueva línea • Enter Aplicar",fetch:"Obtener modelos",fetching:"Obteniendo modelos…"},modelsFetchDialog:{title:"Seleccionar modelos",searchPlaceholder:"Filtrar modelos",hint:"Espacio alternar • Enter confirmar • Esc cancelar"},toast:{modelSet:"Modelo configurado a {provider} / {model}.",noModels:"Aún no hay modelos disponibles. Conecta un proveedor primero (/connect).",connectFirst:"Por favor conecta un proveedor primero (/connect) antes de enviar tu primer mensaje.",apiKeyRequired:"Se requiere una clave API.",baseUrlRequired:"Se requiere una Base URL.",baseUrlInvalid:"Base URL debe comenzar con http:// o https://",connected:"Conectado a {provider}.",connectedSelectModel:"Conectado a {provider}. Elige un modelo.",connectedCheckFailed:"Conectado a {provider}, pero la autocomprobación falló: {reason}",connectionTestPassed:"Prueba de conexión exitosa: {provider}.",connectionTestFailed:"Prueba de conexión fallida: {provider} - {reason}",connectionActionUpdateKey:"Acción: vuelve a abrir Conectar y actualiza la clave API, luego prueba de nuevo.",connectionActionFixBaseUrl:"Acción: verifica la ruta de Base URL (usualmente termina con /v1), luego prueba de nuevo.",connectionActionSwitchKey:"Acción: espera un momento o cambia a otra clave/proveedor.",connectionActionRetryTest:"Acción: verifica red/proxy y ejecuta Probar conexión de nuevo.",noModelsFetching:"Aún no hay modelos. Obteniendo lista de modelos…",firstUseGuide:'Inicio rápido: 1) /connect 2) /models 3) envía "hola"',firstUseSendHello:'Siguiente paso: envía tu primer mensaje (por ejemplo: "hola").',connectionCheckUnauthorized:"401 No autorizado: verifica la clave API y el tipo de proveedor.",connectionCheckForbidden:"403 Prohibido: tu clave puede no tener acceso a este proveedor/modelo.",connectionCheckNotFound:"404 No encontrado: verifica la ruta de Base URL (compatible con OpenAI usualmente termina con /v1).",connectionCheckRateLimited:"429 Limitado por tasa: espera y reintenta, o cambia a otra clave/proveedor.",connectionCheckTimeout:"Conexión expirada: verifica red/proxy y reintenta.",connectionCheckNetwork:"Conexión de red fallida: verifica DNS/proxy/Base URL.",connectionCheckFailed:"Verificación de conexión fallida: {error}",apiKeyCleared:"Clave API eliminada para {provider}.",customAdded:"Proveedor personalizado agregado: {provider}.",customRenamed:"Proveedor personalizado renombrado: {provider}.",customModelsUpdated:"Modelos de proveedor personalizado actualizados: {provider}.",customDeleted:"Proveedor personalizado eliminado: {provider}.",modelsRequired:"Agrega al menos un modelo.",modelsEmpty:"No se encontraron modelos.",modelsFetchFailed:"Error al obtener modelos: {error}",modelsFetchChatCompletions:"Lista de modelos no soportada para Base URL /chat/completions o /responses.",manualModelsRequired:"Este endpoint no soporta descubrimiento automático de modelos. Por favor ingresa manualmente los nombres de modelos en la configuración de modelos.",nameRequired:"Se requiere un nombre de proveedor.",nameConflict:"El nombre del proveedor ya existe."}},copyToast:{copiedToClipboard:"Copiado al portapapeles"}};var fr_default2={common:{apply:"Appliquer",cancel:"Annuler",close:"Fermer",confirm:"Confirmer",yes:"Oui",no:"Non",exit:"Quitter",back:"Retour",next:"Suivant",save:"Enregistrer",empty:"—",unknownError:"Erreur inconnue",inputClearTip:"Ctrl+C effacer",total:"Total"},configDialog:{title:"Paramètres",hint:"Tab/Shift+Tab changer champ • Entrée Appliquer • Échap Annuler",modelsTitle:"Modèles (personnalisés)",modelsPlaceholder:"modele-a, modele-b",contextWindowTitle:"Fenêtre de contexte",contextWindowLocked:"Fenêtre de contexte (définie par le modèle)",contextWindowPlaceholder:"128000",temperatureTitle:"Température",temperaturePlaceholder:"0.7",temperatureValidationError:"Température : chiffres et « . » uniquement",maxTokensTitle:"Max tokens en sortie",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL (compatible OpenAI)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Actuelle :",apiKeyNotSet:"(non définie)",apiKeyTitle:"Clé API",apiKeyPlaceholder:"Collez une nouvelle clé pour mettre à jour (laisser vide pour conserver)",interleavedThinkingTitle:"Thinking alterné (Espace pour basculer)",interleavedThinkingLocked:"Thinking alterné (défini par le modèle)",interleavedThinkingOpen:"Ouvert",interleavedThinkingClose:"Fermé",tipIntensityTitle:"Intensité des astuces",tipIntensityOff:"Désactivé",tipIntensityLow:"Faible",tipIntensityStandard:"Standard",shortcutsTitle:"Raccourcis",shortcutCommandsLabel:"Commandes",shortcutTimelineLabel:"Timeline",shortcutNewSessionLabel:"Nouvelle session",shortcutsPlaceholder:"ex. mod+p",shortcutsHint:"Utilisez mod/ctrl/alt/shift + touche (a-z, 0-9, F1-F12)."},languageDialog:{title:"Langue",hint:"Entrée Appliquer • Échap Annuler",languageTitle:"Langue",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Effort de réflexion",hint:"Entrée Appliquer • Échap Annuler",effortTitle:"Effort de raisonnement",applied:"Effort de raisonnement défini sur {effort}",option:{low:"Faible",medium:"Moyen",high:"Élevé",xhigh:"Très élevé",max:"Max",minimal:"Minimal",none:"Aucun",off:"Désactivé",auto:"Auto"}},toolSettingsDialog:{title:"Paramètres outils",hint:"Entrée Appliquer • Échap Annuler",websearchTitle:"Clé API WebSearch",apiKeyCurrentPrefix:"Actuelle :",apiKeyNotSet:"(non définie)",apiKeyInvalidCjk:"La clé API ne peut pas contenir de caractères chinois.",apiKeyInvalidSpaces:"La clé API ne peut pas contenir d'espaces.",apiKeyPlaceholder:"Collez la clé API Serper"},pluginsDialog:{title:"Plugins",hint:"Sélectionnez un plugin à configurer • Échap Fermer",serperSearch:"Serper Search",serperSearchDetail:"Recherche web via l'API Serper",configured:"Configuré",notConfigured:"Non configuré",serperConfigTitle:"Paramètres Serper Search",serperConfigHint:"Tab Changer • Entrée Appliquer • Échap Annuler"},skillsDialog:{title:"Compétences",hint:"Entrée Appliquer • Échap Annuler",empty:"Aucune compétence disponible",emptyFiltered:"Aucune compétence correspondante"},timelineDialog:{title:"Chronologie",hint:"Tab Filtrer • Entrée Ouvrir • Échap Fermer",empty:"Aucun message pour le moment",emptyFiltered:"Aucune entrée correspondante",filterAll:"Tous les messages",filterUser:"Messages utilisateur",filterTool:"Appels d'outils"},mcpSettingsDialog:{title:"MCP",hint:"Modifiez le fichier mcp.json pour configurer les serveurs MCP • Échap Fermer",configFileLabel:"Fichier config :",noServersHint:"Aucun serveur MCP configuré.",serverCount:"{count} serveur(s) configuré(s)",guideText:"Modifiez le fichier ci-dessus pour ajouter ou modifier des serveurs MCP.",openFile:"Ouvrir fichier",reload:"Recharger",close:"Fermer",reloaded:"Configuration MCP rechargée.",reloadFailed:"Échec du rechargement : {error}",status:"Statut",toolCount:"Outils",disabled:"désactivé",testConnection:"Test",testing:"Test des connexions...",testComplete:"Test terminé.",testPartial:"Test terminé avec des erreurs.",testFailed:"Échec de connexion : {error}",invalidJson:"JSON invalide : {error}",invalidShape:"JSON MCP invalide : « mcpServers » attendu.",invalidServer:"Serveur MCP invalide : {name}",noServers:"Aucun serveur MCP trouvé.",lintOk:"Syntaxe JSON OK",lintAt:"{error} (ligne {line}, col {column})",lintUnclosed:"{char} non fermé (ligne {line}, col {column})",lintInvalid:"{error}",exampleFormat:"Format d'exemple :"},toolApprovalsDialog:{title:"Approbations d'outils",useAuto:"Auto",useNormal:"Normal",useStrict:"Strict",close:"Fermer",focusedTitleAuto:"AUTO",focusedTitleNormal:"NORMAL",focusedTitleStrict:"STRICT",focusedTitleClose:"FERMER",focusedDescAuto:"Approuver automatiquement tous les appels d'outils. Aucune confirmation (le plus rapide, le moins sûr).",focusedDescNormal:"Approuver les outils en lecture seule. Confirmer avant écriture/exécution.",focusedDescStrict:"Demander confirmation pour chaque appel d'outil (le plus sûr, le plus lent).",focusedDescClose:"Fermer ce dialogue sans modifier le paramètre actuel.",currentPrefix:"Actuel : {mode}",tip:"Astuce : Tab ou ↑/↓ pour naviguer, Entrée pour confirmer, Échap pour fermer."},settingsDialog:{pendingApproval:"Résolvez l'approbation en attente avant de modifier les paramètres.",invalidShortcut:"Raccourci invalide pour {label} : {value}",shortcutCommands:"Raccourci commandes",shortcutTimeline:"Raccourci timeline",shortcutNewSession:"Raccourci nouvelle session",toolApprovalsApplied:"Approbations d'outils : {mode}",applied:"Paramètres appliqués."},exitAppDialog:{title:"Quitter DimCode",confirm:"Quitter maintenant ?",warning:"Une réponse de l'agent est encore en cours. Quitter l'interrompra.",reasonPrefix:"Raison : {reason}"},approvalDialog:{title:"Approuver la permission d'outil",toolLabel:"Outil : {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Permission : {permission} ({risk})",descriptionLabel:"Description : {description}",commandLabel:"Commande :",inlineActionHint:"↑/← Préc. ↓/→ Suiv. Entrée Confirmer 1/2/3 Choisir",inlineActionHintCompact:"←/→ Déplacer Entrée Confirmer 1/2/3 Choisir",buttons:{approve:"Approuver",alwaysApprove:"Toujours approuver",deny:"Refuser",always:"Toujours",ok:"OK",no:"Non",y:"O",all:"Tous",n:"N"}},askUserDialog:{noQuestionsTitle:"Aucune question",noQuestionsBody:"Aucune question à répondre.",title:"Question {index}/{total} : {header}",defaultHeader:"Question",prev:"Préc.",next:"Suiv.",submit:"Envoyer",otherOption:"Autre",otherDetail:"Fournir une réponse personnalisée",inlineHintOptions:"Touches : ↑↓ déplacer, ←→ changer de question, Entrée sélectionner.",inlineHintMulti:"Sélection multiple : Espace pour cocher/décocher.",inlineHintButtons:"Tab vers les boutons, ←→ changer, Entrée activer, ↑ retour aux options.",inlineHintNav:"Ctrl+Gauche / Ctrl+Droite (ou Ctrl+A / Ctrl+E) pour changer de question.",inlineHintSubmit:"Ctrl+Entrée pour envoyer, Échap pour annuler.",inlineButtonPrev:"[Préc.]",inlineButtonNext:"[Suiv.]",inlineButtonSubmit:"[Envoyer]",inlineButtonCancel:"[Annuler]",inlineActionHint:"Espace Sélectionner ← Préc. → Suiv. Entrée Suiv./Envoyer Échap Annuler",inlineActionHintCompact:"Espace Sélect. ←/→ Préc./Suiv. Entrée Suiv./Envoyer Échap Annuler",optionsSummaryAll:"{count} options",optionsSummaryVisibleMore:"{count} options ({start}-{end}) ↓ plus",multiSelectHint:"[Multi-sélection] Espace pour cocher, Entrée pour confirmer",singleSelectHint:"[Sélection unique] Flèches, Entrée pour confirmer",customAnswerLabel:"Réponse personnalisée :",customAnswerPlaceholder:"Tapez votre réponse...",otherPlaceholder:"Autre sélectionné — tapez votre réponse et Entrée pour remplir."},nextApiOAuthDialog:{title:"Connexion DimCode OAuth",copyUrl:"Copier l'URL",login:"Connexion",logout:"Déconnexion",statusTitle:"Statut",statusAuthenticated:"✓ Connecté en tant que {email}",statusLoading:"⏳ Authentification...",statusNotLoggedIn:"✗ Non connecté",instructionAuthenticated:"Utilisez ↑↓ pour naviguer, Entrée pour sélectionner, ou chiffres 1-9",instructionLoading:"Appuyez sur C pour copier l'URL ci-dessous si le navigateur ne s'est pas ouvert",instructionNeedsSetup:"Vérifiez le redirect_uri, les scopes et l'état activé de DimCode OAuth, puis réessayez",instructionWithUrl:"Appuyez sur C pour copier l'URL OAuth ci-dessous, ou Entrée pour ouvrir le navigateur",instructionUnauthed:"Appuyez sur Entrée pour vous connecter via DimCode OAuth, ou Échap pour fermer",instructionManualCallback:"Copiez l'URL ci-dessous, connectez-vous dans votre navigateur, puis collez l'URL redirigée dans la zone de saisie.",oauthUrlTitleLoading:"URL OAuth (copiez si le navigateur ne s'est pas ouvert)",oauthUrlTitleReady:"URL OAuth (prête)",scrollIndicator:" [{start}-{end} sur {total}]",selectModelTitle:"Sélectionner un modèle (↑↓/1-9, Entrée){indicator}",aboutTitle:"À propos de DimCode OAuth",setupTitle:"Erreur de connexion OAuth",aboutBulletOne:"• Utilise le client OAuth intégré de DimCode",aboutBulletTwo:"• Récupère les modèles relay après connexion et enregistre la config fournisseur",aboutBulletThree:"• Utilise des jetons de rafraîchissement OAuth au lieu d'une clé API permanente",viewAllPlans:"Voir tous les plans →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"Compte DimCode",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"Génération de l'URL OAuth...",urlReady:"URL OAuth prête ! Copiez-la ou Entrée pour ouvrir le navigateur.",generateUrlFailed:"Échec de génération de l'URL OAuth : {error}",startingLogin:"Démarrage de la connexion OAuth...",browserOpened:"Navigateur ouvert. Sinon, copiez l'URL depuis le dialogue.",copyUrlToLogin:"Copiez l'URL OAuth du dialogue pour vous connecter.",urlCopied:"URL OAuth copiée dans le presse-papier.",urlCopyFailed:"Échec de copie de l'URL OAuth.",authSuccess:"Authentification DimCode OAuth réussie !",loginFailed:"Échec de connexion OAuth : {error}",loggedOut:"Déconnecté de DimCode OAuth",loggedOutWithRemoteWarning:"Déconnecté de DimCode OAuth, mais la révocation à distance a échoué : {error}",logoutFailed:"Échec de déconnexion : {error}",initFailed:"Erreur d'initialisation du dialogue : {error}",modelSwitched:"Modèle changé vers {model}",selectModelFailed:"Échec de sélection du modèle : {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Débogage",titleDebugging:"Débogage en cours",copy:"copier",proceed:"continuer",fixed:"corrigé",body:"J'ai ajouté des logs de débogage (et éventuellement un correctif). Veuillez reproduire le problème, puis choisir un résultat."},exitSessionDialog:{title:"Quitter la session",confirm:"Quitter la session actuelle et revenir à l'accueil ?",note:"Le prochain message démarrera une nouvelle session."},messageActionsDialog:{title:"Actions sur le message",revert:"Annuler les messages",revertWithFiles:"Annuler les messages et les modifications de fichiers",revertKeepFiles:"Annuler les messages (conserver les fichiers)",revertFilesOnly:"Annuler uniquement les modifications de fichiers",copy:"Copier le texte du message",fork:"Créer une fourche (nouvelle session)",pin:"Épingler le message",unpin:"Désépingler le message"},pathPickerDialog:{hint:"↑/↓ sélection • Tab compléter • Entrée confirmer • Échap fermer"},providerConnectDialog:{title:"Connecter {provider}",providerFallback:"Fournisseur",hint:"Tab changer • Ctrl+C effacer • Entrée Appliquer",hintOpenAI:"Tab changer • Ctrl+C effacer • Entrée Appliquer",hintGemini:"Tab changer • Ctrl+C effacer • Entrée Appliquer",hintAnthropic:"Tab changer • Ctrl+C effacer • Entrée Appliquer",hintGeneric:"Tab changer • Ctrl+C effacer • Entrée Appliquer",applyingHint:"Test de connexion, veuillez patienter...",applyingButton:"Application...",testConnection:"Tester la connexion",baseUrlStatusAutoFix:"Correction auto : {value}",baseUrlStatusInvalid:"L'URL de base doit être http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"Clé API",apiKeyPlaceholder:"Collez une nouvelle clé pour mettre à jour (laisser vide pour conserver)",apiKeyCurrent:"Actuelle : {value}",apiKeyNotSet:"Actuelle : (non définie)",apiKeyInvalidCjk:"La clé API ne peut pas contenir de caractères chinois.",apiKeyInvalidSpaces:"La clé API ne peut pas contenir d'espaces.",clearKey:"Supprimer",useDetectedKey:"Utiliser {name}",disconnectButton:"Déconnecter",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"Désactivé",toggleOn:"Activé",toggleHint:"Tab changer • ←/→ modifier • Espace basculer"},redoConfirmDialog:{title:"Confirmer le rétablissement",body:"Voulez-vous vraiment restaurer les messages annulés ?"},renameSessionDialog:{title:"Renommer la session",label:"Nom de la session",placeholder:"ex. Notes de planification"},sessionsDialog:{timeNow:"maintenant",timeMinutes:"{count} min",timeHours:"{count} h",timeDays:"{count} j",newSession:"Nouvelle session",title:"Sessions ({count})",titleScoped:"Sessions ({count}/{total})",scope:"Périmètre : {cwd}",loading:"Chargement…",confirmDelete:"Confirmez la suppression : appuyez de nouveau sur Supprimer",header:"{count} sessions • Flèches pour naviguer • Entrée sélectionne{range}{activity}",headerRange:" • Affichage {start}-{end}",runningCount:"{count} en cours",pausedCount:"{count} en attente de confirmation",hint:"Tapez pour chercher • ←/→ boutons • Entrée confirmer • Échap fermer",focusPrefix:"Focus : {focus}",focusList:"Liste",focusButtons:"Boutons",noSessionsCwd:"Aucune session dans ce répertoire",noSessions:"Aucune session enregistrée",nodeOnly:"Les sessions sont disponibles uniquement en mode Node/CLI.",newSessionTitle:"Nouvelle session",newSessionTarget:"une nouvelle session",busy:{agentResponding:"L'agent répond encore",awaitingAskUser:"En attente de réponses AskUser",awaitingToolApproval:"En attente d'approbation d'outil",pendingApproval:"Approbation en attente"},buttons:{open:"Ouvrir",delete:"Supprimer",deleteConfirm:"Supprimer (confirmer)",scope:"Périmètre : {scope}",scopeCwd:"Rép. courant",scopeAll:"Tous",refresh:"Actualiser"}},sessionsOverlay:{title:"Sessions",hint:"Entrée Sélectionner • Échap Fermer • Ctrl+R Actualiser",loading:"Chargement des sessions...",empty:"Aucune session enregistrée."},switchSessionDialog:{title:"Changer de session",confirm:"Changer & Interrompre",target:"Passer à {target} ?",fallback:"Changer de session maintenant ?",warning:"Ceci interrompra la réponse/le flux en cours dans la session active.",reason:"Raison : {reason}"},themeDialog:{title:"Thème",hint:"Entrée Appliquer • Échap Annuler",mode:"Mode",light:"Clair",dark:"Sombre",unavailable:"Ce terminal ne prend pas en charge les thèmes dynamiques.",fallback:"Un thème ANSI clair/sombre fixe est utilisé ici.",tip:"Astuce : par défaut, le thème suit celui du système."},commandPalette:{searchPlaceholder:"Rechercher…",noMatches:"Aucun résultat",hint:"Tapez pour filtrer • Entrée : ouvrir • Échap : fermer",title:"Commandes"},skills:{title:"Compétences"},help:{title:"Aide",modeLabel:"Mode : {mode}",modeDetail:"Mode assistant actuel.",shortcutsLabel:"Raccourcis",onboarding:`Bienvenue ! Démarrage rapide :
1141
+ Consejo: {commandsKey} abre la paleta de comandos.`,items:{help:"Ayuda y atajos (F1)",commands:"Paleta de comandos (Ctrl+P)",back:"Volver al salto anterior",status:"Alternar detalles de estado"}},commands:{help:{label:"Ayuda",detail:"Atajos + comandos comunes (F1)"},sessions:{label:"Sesiones",detail:"Elegir o crear una sesión (/sessions)"},timeline:{label:"Línea de tiempo",detail:"Saltar a un mensaje de usuario (/timeline)"},newSession:{label:"Nueva sesión",detail:"Iniciar una nueva sesión (/new)"},connectProvider:{label:"Conectar proveedor",detail:"Conectar un proveedor (/connect)"},models:{label:"Modelos",detail:"Seleccionar un modelo (/models)"},toolApprovals:{label:"Aprobaciones de herramientas",detail:"Configurar aprobaciones (/approvals)"},toolSettings:{label:"Config. de herramientas",detail:"Configurar ajustes específicos de herramientas (/tool-settings)"},mcpHub:{label:"MCP",detail:"Gestionar conectores y ajustes MCP (/mcp)"},plugins:{label:"Plugins",detail:"Gestionar plugins (/plugins)"},debug:{label:"Depuración",detail:"Logs de observabilidad SDK (/debug)"},mcpSettings:{label:"MCP (JSON avanzado)",detail:"Configurar JSON sin formato de servidores MCP (/mcp-settings)"},language:{label:"Idioma",detail:"Cambiar idioma de la interfaz (/language)"},settings:{label:"Configuración",detail:"Ajustes de proveedor personalizado (/settings, Ctrl+K)"}},homePage:{multilineTitle:"Texto multilínea",multilineTitleWithCount:"Texto multilínea ({count} líneas)",providerCustom:"Personalizado",reviewPrompt:"ayúdame a revisar los cambios del código",footerCwd:"cwd {cwd}",hints:{switchMode:"cambiar modo",commands:"comandos"},tips:{greeting:"¡Bienvenido de nuevo! Prueba {commandsKey} o {init} para empezar.",commandsAlias:"Consejo: {key} abre la paleta de comandos."},prompts:{help:"Ayuda y atajos (F1)",sessions:"Listar/elegir sesiones",connect:"Conectar un proveedor",models:"Seleccionar un modelo",newSession:"Iniciar una nueva sesión",approvals:"Configurar aprobaciones de herramientas (auto/normal/estricto)",commands:"Abrir paleta de comandos",toolSettings:"Configurar ajustes de herramientas",mcpSettings:"Abrir MCP",plugins:"Gestionar plugins",language:"Cambiar idioma de la interfaz",theme:"Seleccionar un tema",status:"Alternar detalles de estado",review:"Revisar cambios del código",init:"Inicializar/mejorar AGENTS.md",skills:"Listar habilidades cargadas",exit:"Salir de la aplicación",debug:"Diálogo de depuración (chat)",settings:"Ajustes de proveedor personalizado"},commandPalette:{connect:"Conectar un proveedor",models:"Seleccionar un modelo"},commands:{debugLabel:"Depuración",debugDetail:"Logs de observabilidad SDK (/debug)"},toast:{approvalsUsage:"Usa /approvals (sin activar/desactivar).",customProviderOnly:"Configuración solo para proveedores personalizados.",redoChatOnly:"Rehacer solo está disponible en la vista de chat.",retryChatOnly:"Reintentar solo está disponible en la vista de chat.",pinsChatOnly:"Los fijados solo están disponibles en la vista de chat.",renameChatOnly:"Renombrar solo está disponible en la vista de chat (/rename <título>).",commandRemoved:"Este comando ya no está disponible: {command}",helpAliasRemoved:"Presiona F1 para ayuda.",deleteConfirm:"Presiona Delete de nuevo para confirmar.",themeToggled:"Tema: {mode}",pasteImagePending:"La imagen aún se está procesando. Espera un momento."}},chatPage:{placeholder:"Pregunta lo que quieras... (nueva línea: Shift+Enter o Ctrl+J)",placeholderAwaitingApproval:"Bloqueado por aprobación: selecciona Aprobar / Denegar para continuar.",reviewPrompt:"ayúdame a revisar los cambios del código",notification:{approvalTitle:"[Aprobación requerida] Permiso de herramienta",approvalMessage:"DimCode está esperando aprobación de herramienta: {tool}.",doneTitle:"[Tarea completada]",doneMessage:"DimCode completó esta tarea.",doneMessageWithDuration:"DimCode completó esta tarea en {duration}.",doneMessageWithTools:"DimCode completó esta tarea después de {tools} llamada(s) de herramienta.",doneMessageWithToolsAndDuration:"DimCode completó esta tarea en {duration} con {tools} llamada(s) de herramienta."},headerStats:"{messages} msgs · total {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"Consolidando,Pensando,Razonando,Planificando,Analizando,Sintetizando,Refinando,Componiendo",modelFallback:"modelo",mode:{plan:"plan",agent:"agente",debug:"depuración"},status:{approvalsAuto:"AUTO",approvalsAll:"TODO",blockedByApproval:"Bloqueado por aprobación",awaitingApprovalAction:"Esperando tu aprobación: elige Aprobar / Denegar para continuar."},footer:{dragSelect:"arrastra para seleccionar",openLink:"Ctrl+Clic para abrir archivos o enlaces",esc:"esc",interrupt:"interrumpir",approvalPaused:"⏸ Pausado",approvalPausedHint:"Esperando aprobación (Enter para elegir).",shortcuts:"Ctrl+K: config Ctrl+O: expandir/colapsar herramientas y pensamiento Cmd+Delete/Ctrl+W: limpiar entrada Tab: cambiar modo {commandsKey}: comandos",shortcutsCompact:"Ctrl+K: config Ctrl+O: herram./pensam. Cmd+Delete/Ctrl+W: limpiar Tab: cambiar modo {commandsKey}: comandos",shortcutsMicro:"Ctrl+O: herramientas {commandsKey}: comandos",shortcutsMini:"{commandsKey}: comandos"},session:{new:"nueva"},timeline:{title:"Línea de tiempo",empty:"(vacío)",filterAll:"Todos los mensajes",filterUser:"Mensajes de usuario",filterTool:"Llamadas de herramienta"},pins:{title:"Fijados",empty:"(vacío)"},jumpToBottom:{button:"↓"},prompts:{help:"Ayuda y atajos (F1)",newSession:"Iniciar una nueva sesión",resume:"Reanudar la cola pausada",sessions:"Listar/elegir sesiones",timeline:"Saltar a un mensaje de usuario",pins:"Abrir mensajes fijados",pin:"Fijar el último mensaje",back:"Volver al salto anterior",connect:"Conectar un proveedor",models:"Seleccionar un modelo",theme:"Cambiar tema de la interfaz",approvals:"Configurar aprobaciones de herramientas (auto/normal/estricto)",commands:"Abrir paleta de comandos",toolSettings:"Configurar ajustes de herramientas",mcpSettings:"Abrir MCP",plugins:"Gestionar plugins",language:"Cambiar idioma de la interfaz",status:"Alternar detalles de estado",review:"Revisar cambios del código",retry:"Reintentar el último mensaje de usuario",compact:"Compactar contexto de la sesión",init:"Inicializar/mejorar AGENTS.md",rename:"Renombrar sesión actual",skills:"Listar habilidades cargadas",exit:"Salir de la aplicación",debug:"Diálogo de depuración",settings:"Ajustes de proveedor personalizado"},commands:{pinsLabel:"Fijados",pinsDetail:"Abrir mensajes fijados",backLabel:"Atrás",backDetail:"Volver al salto anterior",debugLabel:"Depuración",debugDetail:"Logs de observabilidad SDK (/debug)",statusLabel:"Estado",statusDetail:"Alternar detalles de estado",themeLabel:"Tema",themeDetail:"Cambiar tema de colores"},tips:{contextWarn:"Consejo: El contexto se está llenando. Considera /compact o /new para mantener las respuestas precisas.",contextCritical:"Consejo: Estás cerca del límite de contexto. Inicia una nueva sesión con /new (o /compact primero).",timeline:"Consejo: ¿Chat largo? Usa /tl para volver a un mensaje de usuario específico.",timelineAlias:"Consejo: /tl es un alias corto de /timeline.",commandsAlias:"Consejo: {key} abre la paleta de comandos.",errorRecovery:"Consejo: Si algo falló, prueba /compact o /new.",greeting:"¡Bienvenido de nuevo! Prueba {commandsKey} o {init} para empezar.",compactDelight:"¡Bien! Mantener el contexto ligero ayuda.",addTests:'¡Todo listo! ¿Quieres que agregue pruebas? Responde "sí" u "ok".'},confirm:{addTests:"Por favor agrega pruebas para los cambios que acabamos de hacer."},toast:{customProviderOnly:"Configuración solo para proveedores personalizados.",renameNodeOnly:"Renombrar solo está disponible en modo Node/CLI.",noActiveSession:"No hay sesión activa para renombrar.",sessionNameEmpty:"El nombre de la sesión no puede estar vacío.",sessionRenamed:"Sesión renombrada a: {title}",renameFailed:"Error al renombrar la sesión.",linkOpenHint:"Consejo: Ctrl+Clic para abrir archivos o enlaces.",copySuccess:"Copiado",copyFailed:"Error al copiar",forkFailed:"Error al bifurcar la sesión.",backEmpty:"No hay salto anterior al que volver.",pinsEmpty:"Aún no hay mensajes fijados.",pinEmpty:"Aún no hay mensaje para fijar.",pinned:"Mensaje fijado.",unpinned:"Mensaje desfijado.",debugUnavailable:"El servidor de depuración no está disponible.",approvalsUsage:"Usa /approvals (sin activar/desactivar).",debugDialogOpened:"Diálogo de depuración abierto.",debugDialogClosed:"Diálogo de depuración cerrado.",renameUsage:"Uso: /rename <título>",themeToggled:"Tema: {mode}",statusCompactOn:"Estado: compacto",statusCompactOff:"Estado: detallado",compactingSession:"Compactando sesión...",compactSuccess:"Sesión compactada: {message}",compactWarning:"Sesión compactada con ganancia limitada: {message}",compactSuccessDetailWithTokens:"Se plegaron las primeras {count} mensajes del historial en un resumen. Tokens de entrada estimados {before} -> {after}, ahorrando aproximadamente {saved} tokens.",compactSuccessDetailNotReduced:"Se plegaron las primeras {count} mensajes del historial en un resumen, pero los tokens de entrada estimados cambiaron de {before} a {after}, por lo que esto no redujo el tamaño de la solicitud.",compactSuccessDetailCountOnly:"Se plegaron las primeras {count} mensajes del historial en un resumen.",compactSuccessDetailSummaryOnly:"Se generó un nuevo resumen de conversación.",compactFailed:"Error al compactar la sesión: {error}",compactFailedTokenLimit:"La compactación falló por presupuesto de contexto insuficiente. Configura DIMCODE_CONTEXT_WINDOW correctamente, cambia a un modelo con más contexto, o usa /new. Detalle: {error}",retryEmpty:"No hay mensaje de usuario anterior para reintentar.",commandRemoved:"Este comando ya no está disponible: {command}",helpAliasRemoved:"Presiona F1 para ayuda.",waitForResponse:"Espera a que se complete la respuesta actual, o presiona Esc para interrumpir.",pasteImagePending:"La imagen aún se está procesando. Espera un momento.",pendingApproval:"Por favor maneja tool_approve primero.",awaitingApprovalAction:"Pausado: acción necesaria. Elige Aprobar / Siempre aprobar / Denegar en la tarjeta de permiso.",awaitingApprovalStillWaiting:"Aún esperando aprobación ({seconds}s). El modelo no continuará hasta que apruebes o deniegues.",pendingAskUser:"Por favor maneja ask_user primero.",notificationSessionBusy:"Esta notificación pertenece a otra sesión ocupada. Termina ese trabajo o cambia de sesión manualmente primero.",notificationSessionUnavailable:"No se puede abrir la sesión para esta notificación aquí.",notificationSessionSwitchFailed:"Error al abrir la sesión para esta notificación.",approvalNotActive:"Esta aprobación está en cola. Resuelve la activa primero.",askUserNotActive:"Esta solicitud de ask_user ya no está activa."}},chatQueue:{label:"Cola ({count})",labelCompact:"Cola {count}",more:"+{count} más…",resumeToken:"/resume",resumePlainToken:"reanudar",resumeLegacyToken:"reanudar cola",state:{idle:"Pendiente",running:"En ejecución",paused:"Pausado",error:"Error"},item:{steerAction:"Dirigir",steerReady:"Primero",steerPending:"Siguiente",steerPaused:"Pausado"},toast:{enqueued:"Agregado a la cola (#{count}).",full:"La cola está llena (máx. 5). Elimina uno o inicia /new.",cleared:"Se limpiaron {count} elemento(s) en cola.",deleted:"Se eliminaron {count} elemento(s) en cola. Ctrl+Z para deshacer.",steerPromoted:"Promovido a dirigir. Se ejecutará primero cuando la cola se reanude.",steerQueued:"No se pudo inyectar la dirección inmediatamente. Fue promovida y se ejecutará primero en la próxima ronda.",steerSent:"Dirección aceptada. Se inyectará antes de la próxima llamada del modelo en esta ronda.",undo:"Eliminación de cola deshecha.",pausedTip:"Cola pausada. Usa {resume} o {resumeText} para continuar, o envía un nuevo mensaje para elegir qué hacer.",stale:"Cola pausada: la solicitud parece atascada."},confirm:{title:"¿Continuar mensajes en cola?",description:"La solicitud anterior no terminó. {count} mensaje(s) en cola esperando.",hint:"Continúa para enviar el siguiente elemento, o pausa la cola.",continue:"Continuar",pause:"Pausar",reason:"Razón: {reason}"},reason:{network_error:"Error de red.",timeout:"La solicitud expiró.",canceled_by_user:"Cancelado por el usuario.",rate_limited:"Limitado por tasa.",config_unavailable:"Configuración guardada no disponible.",unknown:"La solicitud falló."},draftDecision:{title:"La cola está pausada",description:"{count} mensaje(s) en cola aún están esperando. Decide qué hacer con tu nueva entrada.",previewLabel:"Nueva entrada:",continue:"Continuar cola",append:"Agregar a la cola",replace:"Descartar cola y enviar"}},chatStatus:{done:"Listo.",error:"Error.",interrupted:"Interrumpido.",permissionDenied:"Permiso denegado.",planning:"Planificando…",drafting:"Redactando…",retrying:"Reintentando ({retry}/{maxAttempts})…",runningTool:"Ejecutando {tool}…",runningTools:"Ejecutando {count} herramientas…",approvalPendingOther:"Otra aprobación está pendiente ({permission})…",awaitingApproval:"Esperando aprobación…",awaitingApprovalWithPerm:"Esperando aprobación ({permission})…",awaitingApprovalWithRisk:"Esperando aprobación ({risk})…",awaitingAnswers:"Esperando respuestas…",resumingApproved:"Aprobado. Reanudando…",resumingDenied:"Denegado. Reanudando…",resuming:"Reanudando…",autoApprovingWithRisk:"Auto-aprobando ({risk})…",riskFallback:"riesgo",toolFallback:"herramienta",thinking:"Pensando…",autoCompactionRequired:"El contexto está cerca del límite. Se requiere compactación primero.",autoCompactionRequiredDetailed:"El contexto está cerca del límite · la próxima solicitud se estima en {estimated} tokens, y la auto-compactación comienza a {threshold} tokens, por lo que se requiere compactación primero.",compressed:"Contexto compactado · se plegaron {removed} mensajes anteriores en un resumen, ahorrando aproximadamente {saved} tokens de entrada ({elapsed}ms)",autoCompactedDetailed:"Auto-compactación completada · se plegaron {removed} mensajes anteriores en un resumen, tokens de entrada estimados {before} -> {after}, ahorrando aproximadamente {saved} tokens",autoCompactedNotReduced:"Auto-compactación completada · se plegaron {removed} mensajes anteriores en un resumen, pero los tokens de entrada estimados cambiaron de {before} a {after}, por lo que esto no redujo el tamaño de la solicitud",autoCompactedSaved:"Auto-compactación completada · se plegaron {removed} mensajes anteriores en un resumen, ahorrando aproximadamente {saved} tokens",autoCompactedCountOnly:"Auto-compactación completada · se plegaron {removed} mensajes anteriores en un resumen",interruptedMarkdown:"> **Interrumpido** · Respuesta cancelada por el usuario (`Esc`).",awaitingApprovalPrefix:"Esperando aprobación",awaitingAnswersPrefix:"Esperando respuestas",approvalPendingPrefix:"Otra aprobación está pendiente",autoApprovingPrefix:"Auto-aprobando"},chatParts:{thinking:"Pensando",plan:"Plan",todo:"Pendientes"},chatRender:{userLabel:"usuario",outputLabel:"↳ salida",outputLabelShort:"sal:",canceled:"cancelado",inputLabel:"ent:",collapse:"... (colapsar)",moreLines:"... ({count} líneas más)",moreLinesOmitted:"... ({count} líneas más omitidas; configura {envVar} para aumentar)",streamingTail:"… (transmitiendo: mostrando últimos {shown} caracteres; {omitted} omitidos)",copy:"Copiar",userResponses:"Respuestas del usuario:",approvalQueued:"Esperando aprobación anterior...",proposedPlan:{title:"Plan propuesto"},llmMeta:{changedFiles:"Se modificaron {count} archivo(s): {files}",changedFilesMore:"+{count} más",revertHint:"Consejo: Haz clic en este mensaje -> Revertir mensajes para deshacer este turno.",changedFilesCardTitle:"se modificaron {count} archivos:",revertButton:"Revertir"},toolName:{explore:"Explorar",subagent:"Subagente"},toolSuffix:{offset:"desplazamiento {value}",limit:"límite {value}",matches:"{count} coincidencias",todos:"{count} pendientes",results:"{count} resultados",results_one:"{count} resultado"},toolGroup:{readFiles:"Leer {count} archivos",writeFiles:"Escribir {count} archivos",editFiles:"Editar {count} archivos",globPatterns:"Glob {count} patrones",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} patrones",bashCommands:"Ejecutar {count} comandos",searchQueries:"Buscar {count} consultas",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"La búsqueda puede acceder a la red.",bash:"Bash puede ejecutar comandos.",edit:"Los cambios de archivos pueden modificar archivos locales.",grep:"Grep puede leer archivos locales."},inlineHint:"Teclas: ↑↓←→ para moverte, Enter para seleccionar.",awaitingUserAction:"Esperando tu acción: elige Aprobar / Siempre aprobar / Denegar.",decision:{userDenied:"El usuario denegó la aprobación"},denied:{title:"# Permiso de herramienta denegado",toolLine:"- herramienta: `{tool}`",permissionLine:"- permiso: `{permission}`",hint:"Puedes volver a seleccionar la llamada de herramienta e intentarlo de nuevo."},summary:{title:"# Herramienta aprobada y ejecutada",permissionLine:"Permiso `{permission}` aprobado para `{tool}`."},required:"Aprobación requerida ({risk}).",args:{commandWithDescription:"Comando: {command} - {description}",command:"Comando: {command}",description:"Descripción: {description}",raw:"Args: {args}"}},pathPicker:{titleWorkspace:"Seleccionar espacio de trabajo",titleFile:"Seleccionar archivo",placeholderWorkspace:"Escribe una ruta (../ etc). Tab para completar. Enter selecciona un directorio.",placeholderFile:"Escribe una ruta (../ etc). Tab para completar. Enter selecciona un archivo."},providerDialogs:{customLabel:"Personalizado",customDetail:"personalizado",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Iniciar sesión con DimCode OAuth",addCustomLabel:"Agregar proveedor personalizado",addCustomDetail:"agregar proveedor personalizado",providerFallback:"Proveedor",adapter:{openai:"OpenAI",openaiOpenRouter:"Compatible con OpenAI (OpenRouter)",openaiLocal:"Compatible con OpenAI (Endpoint local)",openaiResponses:"Respuestas OpenAI",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Configurado",notConfigured:"No configurado"},manage:{title:"Proveedor personalizado: {provider}",connect:"Conectar",connectDetail:"Editar API Key / Base URL",rename:"Renombrar",renameDetail:"Editar nombre del proveedor",models:"Editar modelos",modelsDetail:"Actualizar IDs de modelos disponibles",delete:"Eliminar",deleteDetail:"Eliminar este proveedor"},deleteConfirm:{title:"¿Eliminar {provider}?",confirm:"Eliminar (confirmar)",confirmDetail:"Esto no se puede deshacer",cancelDetail:"Mantener proveedor"},nameDialog:{title:"Nombrar proveedor personalizado",label:"Nombre del proveedor",placeholder:"ej. DeepSeek (Proxy)"},modelsDialog:{title:"Modelos de proveedor personalizado",modelsTitle:"Modelos",modelsPlaceholder:"IDs de modelos (, o nuevas líneas)",hint:", / nueva línea • Shift+Enter nueva línea • Enter Aplicar",fetch:"Obtener modelos",fetching:"Obteniendo modelos…"},modelsFetchDialog:{title:"Seleccionar modelos",searchPlaceholder:"Filtrar modelos",hint:"Espacio alternar • Enter confirmar • Esc cancelar"},toast:{modelSet:"Modelo configurado a {provider} / {model}.",noModels:"Aún no hay modelos disponibles. Conecta un proveedor primero (/connect).",connectFirst:"Por favor conecta un proveedor primero (/connect) antes de enviar tu primer mensaje.",apiKeyRequired:"Se requiere una clave API.",baseUrlRequired:"Se requiere una Base URL.",baseUrlInvalid:"Base URL debe comenzar con http:// o https://",connected:"Conectado a {provider}.",connectedSelectModel:"Conectado a {provider}. Elige un modelo.",connectedCheckFailed:"Conectado a {provider}, pero la autocomprobación falló: {reason}",connectionTestPassed:"Prueba de conexión exitosa: {provider}.",connectionTestFailed:"Prueba de conexión fallida: {provider} - {reason}",connectionActionUpdateKey:"Acción: vuelve a abrir Conectar y actualiza la clave API, luego prueba de nuevo.",connectionActionFixBaseUrl:"Acción: verifica la ruta de Base URL (usualmente termina con /v1), luego prueba de nuevo.",connectionActionSwitchKey:"Acción: espera un momento o cambia a otra clave/proveedor.",connectionActionRetryTest:"Acción: verifica red/proxy y ejecuta Probar conexión de nuevo.",noModelsFetching:"Aún no hay modelos. Obteniendo lista de modelos…",firstUseGuide:'Inicio rápido: 1) /connect 2) /models 3) envía "hola"',firstUseSendHello:'Siguiente paso: envía tu primer mensaje (por ejemplo: "hola").',connectionCheckUnauthorized:"401 No autorizado: verifica la clave API y el tipo de proveedor.",connectionCheckForbidden:"403 Prohibido: tu clave puede no tener acceso a este proveedor/modelo.",connectionCheckNotFound:"404 No encontrado: verifica la ruta de Base URL (compatible con OpenAI usualmente termina con /v1).",connectionCheckRateLimited:"429 Limitado por tasa: espera y reintenta, o cambia a otra clave/proveedor.",connectionCheckTimeout:"Conexión expirada: verifica red/proxy y reintenta.",connectionCheckNetwork:"Conexión de red fallida: verifica DNS/proxy/Base URL.",connectionCheckFailed:"Verificación de conexión fallida: {error}",apiKeyCleared:"Clave API eliminada para {provider}.",customAdded:"Proveedor personalizado agregado: {provider}.",customRenamed:"Proveedor personalizado renombrado: {provider}.",customModelsUpdated:"Modelos de proveedor personalizado actualizados: {provider}.",customDeleted:"Proveedor personalizado eliminado: {provider}.",modelsRequired:"Agrega al menos un modelo.",modelsEmpty:"No se encontraron modelos.",modelsFetchFailed:"Error al obtener modelos: {error}",modelsFetchChatCompletions:"Lista de modelos no soportada para Base URL /chat/completions o /responses.",manualModelsRequired:"Este endpoint no soporta descubrimiento automático de modelos. Por favor ingresa manualmente los nombres de modelos en la configuración de modelos.",nameRequired:"Se requiere un nombre de proveedor.",nameConflict:"El nombre del proveedor ya existe."}},copyToast:{copiedToClipboard:"Copiado al portapapeles"}};var fr_default2={common:{apply:"Appliquer",cancel:"Annuler",close:"Fermer",confirm:"Confirmer",yes:"Oui",no:"Non",exit:"Quitter",back:"Retour",next:"Suivant",save:"Enregistrer",empty:"—",unknownError:"Erreur inconnue",inputClearTip:"Ctrl+C effacer",total:"Total"},configDialog:{title:"Paramètres",hint:"Tab/Shift+Tab changer champ • Entrée Appliquer • Échap Annuler",modelsTitle:"Modèles (personnalisés)",modelsPlaceholder:"modele-a, modele-b",contextWindowTitle:"Fenêtre de contexte",contextWindowLocked:"Fenêtre de contexte (définie par le modèle)",contextWindowPlaceholder:"128000",temperatureTitle:"Température",temperaturePlaceholder:"0.7",temperatureValidationError:"Température : chiffres et « . » uniquement",maxTokensTitle:"Max tokens en sortie",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL (compatible OpenAI)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Actuelle :",apiKeyNotSet:"(non définie)",apiKeyTitle:"Clé API",apiKeyPlaceholder:"Collez une nouvelle clé pour mettre à jour (laisser vide pour conserver)",interleavedThinkingTitle:"Thinking alterné (Espace pour basculer)",interleavedThinkingLocked:"Thinking alterné (défini par le modèle)",interleavedThinkingOpen:"Ouvert",interleavedThinkingClose:"Fermé",tipIntensityTitle:"Intensité des astuces",tipIntensityOff:"Désactivé",tipIntensityLow:"Faible",tipIntensityStandard:"Standard",shortcutsTitle:"Raccourcis",shortcutCommandsLabel:"Commandes",shortcutTimelineLabel:"Timeline",shortcutNewSessionLabel:"Nouvelle session",shortcutsPlaceholder:"ex. mod+p",shortcutsHint:"Utilisez mod/ctrl/alt/shift + touche (a-z, 0-9, F1-F12)."},languageDialog:{title:"Langue",hint:"Entrée Appliquer • Échap Annuler",languageTitle:"Langue",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Effort de réflexion",hint:"Entrée Appliquer • Échap Annuler",effortTitle:"Effort de raisonnement",applied:"Effort de raisonnement défini sur {effort}",option:{low:"Faible",medium:"Moyen",high:"Élevé",xhigh:"Très élevé",max:"Max",minimal:"Minimal",none:"Aucun",off:"Désactivé",auto:"Auto"}},toolSettingsDialog:{title:"Paramètres outils",hint:"Entrée Appliquer • Échap Annuler",websearchTitle:"Clé API WebSearch",apiKeyCurrentPrefix:"Actuelle :",apiKeyNotSet:"(non définie)",apiKeyInvalidCjk:"La clé API ne peut pas contenir de caractères chinois.",apiKeyInvalidSpaces:"La clé API ne peut pas contenir d'espaces.",apiKeyPlaceholder:"Collez la clé API Serper"},pluginsDialog:{title:"Plugins",hint:"Sélectionnez un plugin à configurer • Échap Fermer",serperSearch:"Serper Search",serperSearchDetail:"Recherche web via l'API Serper",configured:"Configuré",notConfigured:"Non configuré",serperConfigTitle:"Paramètres Serper Search",serperConfigHint:"Tab Changer • Entrée Appliquer • Échap Annuler"},skillsDialog:{title:"Compétences",hint:"Entrée Appliquer • Échap Annuler",empty:"Aucune compétence disponible",emptyFiltered:"Aucune compétence correspondante"},timelineDialog:{title:"Chronologie",hint:"Tab Filtrer • Entrée Ouvrir • Échap Fermer",empty:"Aucun message pour le moment",emptyFiltered:"Aucune entrée correspondante",filterAll:"Tous les messages",filterUser:"Messages utilisateur",filterTool:"Appels d'outils"},mcpSettingsDialog:{title:"MCP",hint:"Modifiez le fichier mcp.json pour configurer les serveurs MCP • Échap Fermer",configFileLabel:"Fichier config :",noServersHint:"Aucun serveur MCP configuré.",serverCount:"{count} serveur(s) configuré(s)",guideText:"Modifiez le fichier ci-dessus pour ajouter ou modifier des serveurs MCP.",openFile:"Ouvrir fichier",reload:"Recharger",close:"Fermer",reloaded:"Configuration MCP rechargée.",reloadFailed:"Échec du rechargement : {error}",status:"Statut",toolCount:"Outils",disabled:"désactivé",testConnection:"Test",testing:"Test des connexions...",testComplete:"Test terminé.",testPartial:"Test terminé avec des erreurs.",testFailed:"Échec de connexion : {error}",invalidJson:"JSON invalide : {error}",invalidShape:"JSON MCP invalide : « mcpServers » attendu.",invalidServer:"Serveur MCP invalide : {name}",noServers:"Aucun serveur MCP trouvé.",lintOk:"Syntaxe JSON OK",lintAt:"{error} (ligne {line}, col {column})",lintUnclosed:"{char} non fermé (ligne {line}, col {column})",lintInvalid:"{error}",exampleFormat:"Format d'exemple :"},toolApprovalsDialog:{title:"Approbations d'outils",useAuto:"Auto",useNormal:"Normal",useStrict:"Strict",close:"Fermer",focusedTitleAuto:"AUTO",focusedTitleNormal:"NORMAL",focusedTitleStrict:"STRICT",focusedTitleClose:"FERMER",focusedDescAuto:"Approuver automatiquement tous les appels d'outils. Aucune confirmation (le plus rapide, le moins sûr).",focusedDescNormal:"Approuver les outils en lecture seule. Confirmer avant écriture/exécution.",focusedDescStrict:"Demander confirmation pour chaque appel d'outil (le plus sûr, le plus lent).",focusedDescClose:"Fermer ce dialogue sans modifier le paramètre actuel.",currentPrefix:"Actuel : {mode}",tip:"Astuce : Tab ou ↑/↓ pour naviguer, Entrée pour confirmer, Échap pour fermer."},settingsDialog:{pendingApproval:"Résolvez l'approbation en attente avant de modifier les paramètres.",invalidShortcut:"Raccourci invalide pour {label} : {value}",shortcutCommands:"Raccourci commandes",shortcutTimeline:"Raccourci timeline",shortcutNewSession:"Raccourci nouvelle session",toolApprovalsApplied:"Approbations d'outils : {mode}",applied:"Paramètres appliqués."},exitAppDialog:{title:"Quitter DimCode",confirm:"Quitter maintenant ?",warning:"Une réponse de l'agent est encore en cours. Quitter l'interrompra.",reasonPrefix:"Raison : {reason}"},approvalDialog:{title:"Approuver la permission d'outil",toolLabel:"Outil : {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Permission : {permission} ({risk})",descriptionLabel:"Description : {description}",commandLabel:"Commande :",inlineActionHint:"↑/← Préc. ↓/→ Suiv. Entrée Confirmer 1/2/3 Choisir",inlineActionHintCompact:"←/→ Déplacer Entrée Confirmer 1/2/3 Choisir",buttons:{approve:"Approuver",alwaysApprove:"Toujours approuver",deny:"Refuser",always:"Toujours",ok:"OK",no:"Non",y:"O",all:"Tous",n:"N"}},askUserDialog:{noQuestionsTitle:"Aucune question",noQuestionsBody:"Aucune question à répondre.",title:"Question {index}/{total} : {header}",defaultHeader:"Question",prev:"Préc.",next:"Suiv.",submit:"Envoyer",otherOption:"Autre",otherDetail:"Fournir une réponse personnalisée",inlineHintOptions:"Touches : ↑↓ déplacer, ←→ changer de question, Entrée sélectionner.",inlineHintMulti:"Sélection multiple : Espace pour cocher/décocher.",inlineHintButtons:"Tab vers les boutons, ←→ changer, Entrée activer, ↑ retour aux options.",inlineHintNav:"Ctrl+Gauche / Ctrl+Droite (ou Ctrl+A / Ctrl+E) pour changer de question.",inlineHintSubmit:"Ctrl+Entrée pour envoyer, Échap pour annuler.",inlineButtonPrev:"[Préc.]",inlineButtonNext:"[Suiv.]",inlineButtonSubmit:"[Envoyer]",inlineButtonCancel:"[Annuler]",inlineActionHint:"Espace Sélectionner ← Préc. → Suiv. Entrée Suiv./Envoyer Échap Annuler",inlineActionHintCompact:"Espace Sélect. ←/→ Préc./Suiv. Entrée Suiv./Envoyer Échap Annuler",optionsSummaryAll:"{count} options",optionsSummaryVisibleMore:"{count} options ({start}-{end}) ↓ plus",multiSelectHint:"[Multi-sélection] Espace pour cocher, Entrée pour confirmer",singleSelectHint:"[Sélection unique] Flèches, Entrée pour confirmer",customAnswerLabel:"Réponse personnalisée :",customAnswerPlaceholder:"Tapez votre réponse...",otherPlaceholder:"Autre sélectionné — tapez votre réponse et Entrée pour remplir."},nextApiOAuthDialog:{title:"Connexion DimCode OAuth",copyUrl:"Copier l'URL",login:"Connexion",logout:"Déconnexion",statusTitle:"Statut",statusAuthenticated:"✓ Connecté en tant que {email}",statusLoading:"⏳ Authentification...",statusNotLoggedIn:"✗ Non connecté",instructionAuthenticated:"Utilisez ↑↓ pour naviguer, Entrée pour sélectionner, ou chiffres 1-9",instructionLoading:"Appuyez sur C pour copier l'URL ci-dessous si le navigateur ne s'est pas ouvert",instructionNeedsSetup:"Vérifiez le redirect_uri, les scopes et l'état activé de DimCode OAuth, puis réessayez",instructionWithUrl:"Appuyez sur C pour copier l'URL OAuth ci-dessous, ou Entrée pour ouvrir le navigateur",instructionUnauthed:"Appuyez sur Entrée pour vous connecter via DimCode OAuth, ou Échap pour fermer",instructionManualCallback:"Copiez l'URL ci-dessous, connectez-vous dans votre navigateur, puis collez l'URL redirigée dans la zone de saisie.",oauthUrlTitleLoading:"URL OAuth (copiez si le navigateur ne s'est pas ouvert)",oauthUrlTitleReady:"URL OAuth (prête)",scrollIndicator:" [{start}-{end} sur {total}]",selectModelTitle:"Sélectionner un modèle (↑↓/1-9, Entrée){indicator}",aboutTitle:"À propos de DimCode OAuth",setupTitle:"Erreur de connexion OAuth",aboutBulletOne:"• Utilise le client OAuth intégré de DimCode",aboutBulletTwo:"• Récupère les modèles relay après connexion et enregistre la config fournisseur",aboutBulletThree:"• Utilise des jetons de rafraîchissement OAuth au lieu d'une clé API permanente",viewAllPlans:"Voir tous les plans →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"Compte DimCode",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"Génération de l'URL OAuth...",urlReady:"URL OAuth prête ! Copiez-la ou Entrée pour ouvrir le navigateur.",generateUrlFailed:"Échec de génération de l'URL OAuth : {error}",startingLogin:"Démarrage de la connexion OAuth...",browserOpened:"Navigateur ouvert. Sinon, copiez l'URL depuis le dialogue.",copyUrlToLogin:"Copiez l'URL OAuth du dialogue pour vous connecter.",urlCopied:"URL OAuth copiée dans le presse-papier.",urlCopyFailed:"Échec de copie de l'URL OAuth.",authSuccess:"Authentification DimCode OAuth réussie !",loginFailed:"Échec de connexion OAuth : {error}",loggedOut:"Déconnecté de DimCode OAuth",loggedOutWithRemoteWarning:"Déconnecté de DimCode OAuth, mais la révocation à distance a échoué : {error}",logoutFailed:"Échec de déconnexion : {error}",initFailed:"Erreur d'initialisation du dialogue : {error}",modelSwitched:"Modèle changé vers {model}",selectModelFailed:"Échec de sélection du modèle : {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Débogage",titleDebugging:"Débogage en cours",copy:"copier",proceed:"continuer",fixed:"corrigé",body:"J'ai ajouté des logs de débogage (et éventuellement un correctif). Veuillez reproduire le problème, puis choisir un résultat."},exitSessionDialog:{title:"Quitter la session",confirm:"Quitter la session actuelle et revenir à l'accueil ?",note:"Le prochain message démarrera une nouvelle session."},messageActionsDialog:{title:"Actions sur le message",revert:"Annuler les messages",revertWithFiles:"Annuler les messages et les modifications de fichiers",revertKeepFiles:"Annuler les messages (conserver les fichiers)",revertFilesOnly:"Annuler uniquement les modifications de fichiers",copy:"Copier le texte du message",fork:"Créer une fourche (nouvelle session)",pin:"Épingler le message",unpin:"Désépingler le message"},pathPickerDialog:{hint:"↑/↓ sélection • Tab compléter • Entrée confirmer • Échap fermer"},providerConnectDialog:{title:"Connecter {provider}",providerFallback:"Fournisseur",hint:"Tab changer • Ctrl+C effacer • Entrée Appliquer",hintOpenAI:"Tab changer • Ctrl+C effacer • Entrée Appliquer",hintGemini:"Tab changer • Ctrl+C effacer • Entrée Appliquer",hintAnthropic:"Tab changer • Ctrl+C effacer • Entrée Appliquer",hintGeneric:"Tab changer • Ctrl+C effacer • Entrée Appliquer",applyingHint:"Test de connexion, veuillez patienter...",applyingButton:"Application...",testConnection:"Tester la connexion",baseUrlStatusAutoFix:"Correction auto : {value}",baseUrlStatusInvalid:"L'URL de base doit être http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"Clé API",apiKeyPlaceholder:"Collez une nouvelle clé pour mettre à jour (laisser vide pour conserver)",apiKeyCurrent:"Actuelle : {value}",apiKeyNotSet:"Actuelle : (non définie)",apiKeyInvalidCjk:"La clé API ne peut pas contenir de caractères chinois.",apiKeyInvalidSpaces:"La clé API ne peut pas contenir d'espaces.",clearKey:"Supprimer",useDetectedKey:"Utiliser {name}",disconnectButton:"Déconnecter",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"Désactivé",toggleOn:"Activé",toggleHint:"Tab changer • ←/→ modifier • Espace basculer"},redoConfirmDialog:{title:"Confirmer le rétablissement",body:"Voulez-vous vraiment restaurer les messages annulés ?"},renameSessionDialog:{title:"Renommer la session",label:"Nom de la session",placeholder:"ex. Notes de planification"},sessionsDialog:{timeNow:"maintenant",timeMinutes:"{count} min",timeHours:"{count} h",timeDays:"{count} j",newSession:"Nouvelle session",title:"Sessions ({count})",titleScoped:"Sessions ({count}/{total})",scope:"Périmètre : {cwd}",loading:"Chargement…",confirmDelete:"Confirmez la suppression : appuyez de nouveau sur Supprimer",header:"{count} sessions • Flèches pour naviguer • Entrée sélectionne{range}{activity}",headerRange:" • Affichage {start}-{end}",runningCount:"{count} en cours",pausedCount:"{count} en attente de confirmation",hint:"Tapez pour chercher • ←/→ boutons • Entrée confirmer • Échap fermer",focusPrefix:"Focus : {focus}",focusList:"Liste",focusButtons:"Boutons",noSessionsCwd:"Aucune session dans ce répertoire",noSessions:"Aucune session enregistrée",nodeOnly:"Les sessions sont disponibles uniquement en mode Node/CLI.",newSessionTitle:"Nouvelle session",newSessionTarget:"une nouvelle session",busy:{agentResponding:"L'agent répond encore",awaitingAskUser:"En attente de réponses AskUser",awaitingToolApproval:"En attente d'approbation d'outil",pendingApproval:"Approbation en attente"},buttons:{open:"Ouvrir",delete:"Supprimer",deleteConfirm:"Supprimer (confirmer)",scope:"Périmètre : {scope}",scopeCwd:"Rép. courant",scopeAll:"Tous",refresh:"Actualiser"}},sessionsOverlay:{title:"Sessions",hint:"Entrée Sélectionner • Échap Fermer • Ctrl+R Actualiser • Ctrl+W Portée",loading:"Chargement des sessions...",empty:"Aucune session enregistrée.",loadingMore:"Chargement…",hasMore:"↓ plus",scope:{cwdOnly:"cwd uniquement",allCwd:"tous les cwds"}},switchSessionDialog:{title:"Changer de session",confirm:"Changer & Interrompre",target:"Passer à {target} ?",fallback:"Changer de session maintenant ?",warning:"Ceci interrompra la réponse/le flux en cours dans la session active.",reason:"Raison : {reason}"},themeDialog:{title:"Thème",hint:"Entrée Appliquer • Échap Annuler",mode:"Mode",light:"Clair",dark:"Sombre",unavailable:"Ce terminal ne prend pas en charge les thèmes dynamiques.",fallback:"Un thème ANSI clair/sombre fixe est utilisé ici.",tip:"Astuce : par défaut, le thème suit celui du système."},commandPalette:{searchPlaceholder:"Rechercher…",noMatches:"Aucun résultat",hint:"Tapez pour filtrer • Entrée : ouvrir • Échap : fermer",title:"Commandes"},skills:{title:"Compétences"},help:{title:"Aide",modeLabel:"Mode : {mode}",modeDetail:"Mode assistant actuel.",shortcutsLabel:"Raccourcis",onboarding:`Bienvenue ! Démarrage rapide :
1142
1142
  1) /connect : connecter un fournisseur
1143
1143
  2) /models : choisir un modèle
1144
1144
  3) envoyez « bonjour » pour commencer
1145
- Astuce : {commandsKey} ouvre la palette de commandes.`,items:{help:"Aide et raccourcis (F1)",commands:"Palette de commandes (Ctrl+P)",back:"Revenir au saut précédent",status:"Afficher/masquer les détails du statut"}},commands:{help:{label:"Aide",detail:"Raccourcis + commandes courantes (F1)"},sessions:{label:"Sessions",detail:"Choisir ou créer une session (/sessions)"},timeline:{label:"Timeline",detail:"Aller à un message utilisateur (/timeline)"},newSession:{label:"Nouvelle session",detail:"Démarrer une nouvelle session (/new)"},connectProvider:{label:"Connecter fournisseur",detail:"Connecter un fournisseur (/connect)"},models:{label:"Modèles",detail:"Sélectionner un modèle (/models)"},toolApprovals:{label:"Approbations d'outils",detail:"Configurer les approbations (/approvals)"},toolSettings:{label:"Paramètres outils",detail:"Configurer les paramètres outils (/tool-settings)"},mcpHub:{label:"MCP",detail:"Gérer les connecteurs et paramètres MCP (/mcp)"},plugins:{label:"Plugins",detail:"Gérer les plugins (/plugins)"},debug:{label:"Débogage",detail:"Logs observability SDK (/debug)"},mcpSettings:{label:"MCP (JSON avancé)",detail:"Configurer le JSON brut des serveurs MCP (/mcp-settings)"},language:{label:"Langue",detail:"Changer la langue de l'interface (/language)"},settings:{label:"Paramètres",detail:"Paramètres fournisseur personnalisé (/settings, Ctrl+K)"}},homePage:{multilineTitle:"Texte multiligne",multilineTitleWithCount:"Texte multiligne ({count} lignes)",providerCustom:"Personnalisé",reviewPrompt:"aide-moi à revoir les modifications du code",footerCwd:"rép. {cwd}",hints:{switchMode:"changer mode",commands:"commandes"},tips:{greeting:"Bon retour ! Essayez {commandsKey} ou {init} pour commencer.",commandsAlias:"Astuce : {key} ouvre la palette de commandes."},prompts:{help:"Aide et raccourcis (F1)",sessions:"Lister/choisir sessions",connect:"Connecter un fournisseur",models:"Sélectionner un modèle",newSession:"Démarrer une nouvelle session",approvals:"Configurer les approbations d'outils (auto/normal/strict)",commands:"Ouvrir la palette de commandes",toolSettings:"Configurer les paramètres outils",mcpSettings:"Ouvrir MCP",plugins:"Gérer les plugins",language:"Changer la langue de l'interface",theme:"Sélectionner un thème",status:"Afficher/masquer les détails du statut",review:"Revoir les modifications du code",init:"Initialiser/améliorer AGENTS.md",skills:"Lister les compétences chargées",exit:"Quitter l'application",debug:"Dialogue de débogage (chat)",settings:"Paramètres fournisseur personnalisé"},commandPalette:{connect:"Connecter un fournisseur",models:"Sélectionner un modèle"},commands:{debugLabel:"Débogage",debugDetail:"Logs observability SDK (/debug)"},toast:{approvalsUsage:"Utilisez /approvals (pas on/off).",customProviderOnly:"Paramètres uniquement pour les fournisseurs personnalisés.",redoChatOnly:"Rétablir n'est disponible que dans la vue chat.",retryChatOnly:"Réessayer n'est disponible que dans la vue chat.",pinsChatOnly:"Les épingles ne sont disponibles que dans la vue chat.",renameChatOnly:"Renommer n'est disponible que dans la vue chat (/rename <titre>).",commandRemoved:"Cette commande n'est plus disponible : {command}",helpAliasRemoved:"Appuyez sur F1 pour l'aide.",deleteConfirm:"Appuyez de nouveau sur Supprimer pour confirmer.",themeToggled:"Thème : {mode}",pasteImagePending:"L'image est encore en traitement. Veuillez patienter."}},chatPage:{placeholder:"Posez votre question... (nouvelle ligne : Shift+Entrée ou Ctrl+J)",placeholderAwaitingApproval:"Bloqué par approbation : sélectionnez Approuver / Refuser pour continuer.",reviewPrompt:"aide-moi à revoir les modifications du code",notification:{approvalTitle:"[Approbation requise] Permission d'outil",approvalMessage:"DimCode attend une approbation d'outil : {tool}.",doneTitle:"[Tâche terminée]",doneMessage:"DimCode a terminé cette tâche.",doneMessageWithDuration:"DimCode a terminé cette tâche en {duration}.",doneMessageWithTools:"DimCode a terminé cette tâche après {tools} appel(s) d'outil.",doneMessageWithToolsAndDuration:"DimCode a terminé cette tâche en {duration} avec {tools} appel(s) d'outil."},headerStats:"{messages} msgs · total {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"Fusion,Réflexion,Raisonnement,Planification,Analyse,Synthèse,Raffinage,Rédaction",modelFallback:"modèle",mode:{plan:"plan",agent:"agent",debug:"débogage"},status:{approvalsAuto:"AUTO",approvalsAll:"TOUS",blockedByApproval:"Bloqué par approbation",awaitingApprovalAction:"En attente de votre approbation : choisissez Approuver / Refuser pour continuer."},footer:{dragSelect:"glisser pour sélectionner",openLink:"Ctrl+Clic pour ouvrir fichiers ou liens",esc:"échapp",interrupt:"interrompre",approvalPaused:"⏸ En pause",approvalPausedHint:"En attente d'approbation (Entrée pour choisir).",shortcuts:"Ctrl+K : config Ctrl+O : outils/thinking Cmd+Suppr/Ctrl+W : effacer Tab : changer mode {commandsKey} : commandes",shortcutsCompact:"Ctrl+K : config Ctrl+O : outils/thinking Cmd+Suppr/Ctrl+W : effacer Tab : mode {commandsKey} : commandes",shortcutsMicro:"Ctrl+O : outils {commandsKey} : commandes",shortcutsMini:"{commandsKey} : commandes"},session:{new:"nouvelle"},timeline:{title:"Timeline",empty:"(vide)",filterAll:"Tous les messages",filterUser:"Messages utilisateur",filterTool:"Appels d'outils"},pins:{title:"Épinglés",empty:"(vide)"},jumpToBottom:{button:"↓"},prompts:{help:"Aide et raccourcis (F1)",newSession:"Démarrer une nouvelle session",resume:"Reprendre la file en pause",sessions:"Lister/choisir sessions",timeline:"Aller à un message utilisateur",pins:"Ouvrir les messages épinglés",pin:"Épingler le dernier message",back:"Revenir au saut précédent",connect:"Connecter un fournisseur",models:"Sélectionner un modèle",theme:"Changer le thème de l'interface",approvals:"Configurer les approbations d'outils (auto/normal/strict)",commands:"Ouvrir la palette de commandes",toolSettings:"Configurer les paramètres outils",mcpSettings:"Ouvrir MCP",plugins:"Gérer les plugins",language:"Changer la langue de l'interface",status:"Afficher/masquer les détails du statut",review:"Revoir les modifications du code",retry:"Réessayer le dernier message utilisateur",compact:"Compacter le contexte de la session",init:"Initialiser/améliorer AGENTS.md",rename:"Renommer la session actuelle",skills:"Lister les compétences chargées",exit:"Quitter l'application",debug:"Dialogue de débogage",settings:"Paramètres fournisseur personnalisé"},commands:{pinsLabel:"Épingles",pinsDetail:"Ouvrir les messages épinglés",backLabel:"Retour",backDetail:"Revenir au saut précédent",debugLabel:"Débogage",debugDetail:"Logs observability SDK (/debug)",statusLabel:"Statut",statusDetail:"Afficher/masquer les détails du statut",themeLabel:"Thème",themeDetail:"Changer le thème de couleurs"},tips:{contextWarn:"Astuce : Le contexte se remplit. Utilisez /compact ou /new pour garder des réponses concises.",contextCritical:"Astuce : Vous êtes près de la limite de contexte. Démarrez une nouvelle session avec /new (ou /compact d'abord).",timeline:"Astuce : Chat long ? Utilisez /tl pour revenir à un message utilisateur spécifique.",timelineAlias:"Astuce : /tl est un alias court pour /timeline.",commandsAlias:"Astuce : {key} ouvre la palette de commandes.",errorRecovery:"Astuce : En cas d'échec, essayez /compact ou /new.",greeting:"Bon retour ! Essayez {commandsKey} ou {init} pour commencer.",compactDelight:"Bien ! Garder un contexte léger aide.",addTests:"C'est prêt ! Vous voulez que j'ajoute des tests ? Répondez « oui » ou « ok »."},confirm:{addTests:"Veuillez ajouter des tests pour les modifications que nous venons de faire."},toast:{customProviderOnly:"Paramètres uniquement pour les fournisseurs personnalisés.",renameNodeOnly:"Renommer n'est disponible qu'en mode Node/CLI.",noActiveSession:"Aucune session active à renommer.",sessionNameEmpty:"Le nom de la session ne peut pas être vide.",sessionRenamed:"Session renommée : {title}",renameFailed:"Échec du renommage de la session.",linkOpenHint:"Astuce : Ctrl+Clic pour ouvrir fichiers ou liens.",copySuccess:"Copié",copyFailed:"Échec de la copie",forkFailed:"Échec de la fourche de session.",backEmpty:"Aucun saut précédent pour revenir.",pinsEmpty:"Aucun message épinglé.",pinEmpty:"Aucun message à épingler.",pinned:"Message épinglé.",unpinned:"Message désépinglé.",debugUnavailable:"Le serveur de débogage n'est pas disponible.",approvalsUsage:"Utilisez /approvals (pas on/off).",debugDialogOpened:"Dialogue de débogage ouvert.",debugDialogClosed:"Dialogue de débogage fermé.",renameUsage:"Usage : /rename <titre>",themeToggled:"Thème : {mode}",statusCompactOn:"Statut : compact",statusCompactOff:"Statut : détaillé",compactingSession:"Compactage de la session...",compactSuccess:"Session compactée : {message}",compactWarning:"Session compactée avec un gain limité : {message}",compactSuccessDetailWithTokens:"Les {count} premiers messages d'historique ont été résumés. Estimation tokens entrée {before} -> {after}, économie d'environ {saved} tokens.",compactSuccessDetailNotReduced:"Les {count} premiers messages d'historique ont été résumés, mais l'estimation des tokens d'entrée est passée de {before} à {after}, donc la taille de la requête n'a pas diminué.",compactSuccessDetailCountOnly:"Les {count} premiers messages d'historique ont été résumés.",compactSuccessDetailSummaryOnly:"Un nouveau résumé de conversation a été généré.",compactFailed:"Échec du compactage de la session : {error}",compactFailedTokenLimit:"Le compactage a échoué par manque de budget de contexte. Définissez DIMCODE_CONTEXT_WINDOW correctement, passez à un modèle avec plus de contexte, ou utilisez /new. Détail : {error}",retryEmpty:"Aucun message utilisateur précédent à réessayer.",commandRemoved:"Cette commande n'est plus disponible : {command}",helpAliasRemoved:"Appuyez sur F1 pour l'aide.",waitForResponse:"Veuillez attendre la fin de la réponse en cours, ou Échap pour interrompre.",pasteImagePending:"L'image est encore en traitement. Veuillez patienter.",pendingApproval:"Veuillez d'abord traiter tool_approve.",awaitingApprovalAction:"En pause : action requise. Choisissez Approuver / Toujours approuver / Refuser dans la carte de permission.",awaitingApprovalStillWaiting:"Toujours en attente d'approbation ({seconds}s). Le modèle ne continuera pas tant que vous n'approuvez ou refusez.",pendingAskUser:"Veuillez d'abord traiter ask_user.",notificationSessionBusy:"Cette notification appartient à une autre session occupée. Terminez ce travail ou changez de session manuellement d'abord.",notificationSessionUnavailable:"Impossible d'ouvrir la session pour cette notification ici.",notificationSessionSwitchFailed:"Échec de l'ouverture de la session pour cette notification.",approvalNotActive:"Cette approbation est en file. Résolvez d'abord l'approbation active.",askUserNotActive:"Cette demande ask_user n'est plus active."}},chatQueue:{label:"File ({count})",labelCompact:"File {count}",more:"+{count} de plus…",resumeToken:"/resume",resumePlainToken:"reprendre",resumeLegacyToken:"reprendre la file",state:{idle:"En attente",running:"En cours",paused:"En pause",error:"Erreur"},item:{steerAction:"Réorienter",steerReady:"Premier",steerPending:"Suivant",steerPaused:"En pause"},toast:{enqueued:"Ajouté à la file (n°{count}).",full:"La file est pleine (max 5). Supprimez un élément ou /new.",cleared:"{count} élément(s) en file effacé(s).",deleted:"{count} élément(s) en file supprimé(s). Ctrl+Z pour annuler.",steerPromoted:"Promu en réorientation. Il s'exécutera en premier à la reprise de la file.",steerQueued:"La réorientation ne peut pas être injectée immédiatement. Elle a été promue et s'exécutera en premier au prochain tour.",steerSent:"Réorientation acceptée. Elle sera injectée avant le prochain appel au modèle dans ce tour.",undo:"Suppression de file annulée.",pausedTip:"File en pause. Utilisez {resume} ou {resumeText} pour continuer, ou envoyez un nouveau message pour choisir.",stale:"File en pause : la requête semble bloquée."},confirm:{title:"Continuer les messages en file ?",description:"La requête précédente ne s'est pas terminée. {count} message(s) en attente.",hint:"Continuez pour envoyer l'élément suivant, ou mettez la file en pause.",continue:"Continuer",pause:"Pause",reason:"Raison : {reason}"},reason:{network_error:"Erreur réseau.",timeout:"Délai d'attente dépassé.",canceled_by_user:"Annulé par l'utilisateur.",rate_limited:"Limite de débit atteinte.",config_unavailable:"Configuration sauvegardée indisponible.",unknown:"Échec de la requête."},draftDecision:{title:"La file est en pause",description:"{count} message(s) en file sont encore en attente. Décidez quoi faire avec votre nouvelle saisie.",previewLabel:"Nouvelle saisie :",continue:"Continuer la file",append:"Ajouter à la file",replace:"Ignorer la file & envoyer"}},chatStatus:{done:"Terminé.",error:"Erreur.",interrupted:"Interrompu.",permissionDenied:"Permission refusée.",planning:"Planification…",drafting:"Rédaction…",retrying:"Nouvelle tentative ({retry}/{maxAttempts})…",runningTool:"Exécution de {tool}…",runningTools:"Exécution de {count} outils…",approvalPendingOther:"Une autre approbation est en attente ({permission})…",awaitingApproval:"En attente d'approbation…",awaitingApprovalWithPerm:"En attente d'approbation ({permission})…",awaitingApprovalWithRisk:"En attente d'approbation ({risk})…",awaitingAnswers:"En attente de réponses…",resumingApproved:"Approuvé. Reprise…",resumingDenied:"Refusé. Reprise…",resuming:"Reprise…",autoApprovingWithRisk:"Approbation auto ({risk})…",riskFallback:"risque",toolFallback:"outil",thinking:"Réflexion…",autoCompactionRequired:"Le contexte est près de la limite. Compactage requis d'abord.",autoCompactionRequiredDetailed:"Le contexte est près de la limite · la prochaine requête est estimée à {estimated} tokens, et le compactage auto démarre à {threshold} tokens, un compactage est donc requis d'abord.",compressed:"Contexte compacté · {removed} anciens messages résumés, économie d'environ {saved} tokens d'entrée ({elapsed}ms)",autoCompactedDetailed:"Compactage auto terminé · {removed} anciens messages résumés, estimation tokens entrée {before} -> {after}, économie d'environ {saved} tokens",autoCompactedNotReduced:"Compactage auto terminé · {removed} anciens messages résumés, mais l'estimation des tokens d'entrée est passée de {before} à {after}, la taille de la requête n'a donc pas diminué",autoCompactedSaved:"Compactage auto terminé · {removed} anciens messages résumés, économie d'environ {saved} tokens",autoCompactedCountOnly:"Compactage auto terminé · {removed} anciens messages résumés",interruptedMarkdown:"> **Interrompu** · Réponse annulée par l'utilisateur (`Échap`).",awaitingApprovalPrefix:"En attente d'approbation",awaitingAnswersPrefix:"En attente de réponses",approvalPendingPrefix:"Une autre approbation est en attente",autoApprovingPrefix:"Approbation auto"},chatParts:{thinking:"Réflexion",plan:"Plan",todo:"À faire"},chatRender:{userLabel:"utilisateur",outputLabel:"↳ sortie",outputLabelShort:"sortie :",canceled:"annulé",inputLabel:"entrée :",collapse:"... (réduire)",moreLines:"... ({count} lignes supplémentaires)",moreLinesOmitted:"... ({count} lignes omises ; définissez {envVar} pour augmenter)",streamingTail:"… (diffusion : {shown} derniers caractères affichés ; {omitted} omis)",copy:"Copier",userResponses:"Réponses utilisateur :",approvalQueued:"En attente d'une approbation précédente...",proposedPlan:{title:"Plan proposé"},llmMeta:{changedFiles:"{count} fichier(s) modifié(s) : {files}",changedFilesMore:"+{count} de plus",revertHint:"Astuce : Cliquez ce message -> Annuler les messages pour défaire ce tour.",changedFilesCardTitle:"{count} fichiers modifiés :",revertButton:"Annuler"},toolName:{explore:"Explorer",subagent:"Sous-agent"},toolSuffix:{offset:"décalage {value}",limit:"limite {value}",matches:"{count} correspondances",todos:"{count} à faire",results:"{count} résultats",results_one:"{count} résultat"},toolGroup:{readFiles:"Lire {count} fichiers",writeFiles:"Écrire {count} fichiers",editFiles:"Modifier {count} fichiers",globPatterns:"Glob {count} motifs",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} motifs",bashCommands:"Exécuter {count} commandes",searchQueries:"Rechercher {count} requêtes",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"La recherche peut accéder au réseau.",bash:"Bash peut exécuter des commandes.",edit:"Les modifications de fichiers peuvent modifier des fichiers locaux.",grep:"Grep peut lire des fichiers locaux."},inlineHint:"Touches : ↑↓←→ pour déplacer, Entrée pour sélectionner.",awaitingUserAction:"En attente de votre action : choisissez Approuver / Toujours approuver / Refuser.",decision:{userDenied:"L'utilisateur a refusé l'approbation"},denied:{title:"# Permission d'outil refusée",toolLine:"- outil : `{tool}`",permissionLine:"- permission : `{permission}`",hint:"Vous pouvez re-sélectionner le tool_call et réessayer."},summary:{title:"# Outil approuvé + exécuté",permissionLine:"Permission `{permission}` approuvée pour `{tool}`."},required:"Approbation requise ({risk}).",args:{commandWithDescription:"Commande : {command} - {description}",command:"Commande : {command}",description:"Description : {description}",raw:"Args : {args}"}},pathPicker:{titleWorkspace:"Sélectionner l'espace de travail",titleFile:"Sélectionner un fichier",placeholderWorkspace:"Tapez un chemin (../ etc). Tab pour compléter. Entrée sélectionne un répertoire.",placeholderFile:"Tapez un chemin (../ etc). Tab pour compléter. Entrée sélectionne un fichier."},providerDialogs:{customLabel:"Personnalisé",customDetail:"personnalisé",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Se connecter avec DimCode OAuth",addCustomLabel:"Ajouter un fournisseur personnalisé",addCustomDetail:"ajouter un fournisseur personnalisé",providerFallback:"Fournisseur",adapter:{openai:"OpenAI",openaiOpenRouter:"Compatible OpenAI (OpenRouter)",openaiLocal:"Compatible OpenAI (point d'accès local)",openaiResponses:"Réponses OpenAI",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Configuré",notConfigured:"Non configuré"},manage:{title:"Fournisseur personnalisé : {provider}",connect:"Connecter",connectDetail:"Modifier clé API / Base URL",rename:"Renommer",renameDetail:"Modifier le nom du fournisseur",models:"Modifier les modèles",modelsDetail:"Mettre à jour les IDs de modèles disponibles",delete:"Supprimer",deleteDetail:"Supprimer ce fournisseur"},deleteConfirm:{title:"Supprimer {provider} ?",confirm:"Supprimer (confirmer)",confirmDetail:"Cette action est irréversible",cancelDetail:"Conserver le fournisseur"},nameDialog:{title:"Nommer le fournisseur personnalisé",label:"Nom du fournisseur",placeholder:"ex. DeepSeek (Proxy)"},modelsDialog:{title:"Modèles du fournisseur personnalisé",modelsTitle:"Modèles",modelsPlaceholder:"IDs de modèles (, ou nouvelles lignes)",hint:", / nouvelle ligne • Shift+Entrée nouvelle ligne • Entrée Appliquer",fetch:"Récupérer les modèles",fetching:"Récupération des modèles…"},modelsFetchDialog:{title:"Sélectionner les modèles",searchPlaceholder:"Filtrer les modèles",hint:"Epace basculer • Entrée confirmer • Échap annuler"},toast:{modelSet:"Modèle défini sur {provider} / {model}.",noModels:"Aucun modèle disponible. Connectez d'abord un fournisseur (/connect).",connectFirst:"Veuillez d'abord connecter un fournisseur (/connect) avant d'envoyer votre premier message.",apiKeyRequired:"La clé API est requise.",baseUrlRequired:"L'URL de base est requise.",baseUrlInvalid:"L'URL de base doit commencer par http:// ou https://",connected:"Connecté à {provider}.",connectedSelectModel:"Connecté à {provider}. Choisissez un modèle.",connectedCheckFailed:"Connecté à {provider}, mais la vérification a échoué : {reason}",connectionTestPassed:"Test de connexion réussi : {provider}.",connectionTestFailed:"Test de connexion échoué : {provider} - {reason}",connectionActionUpdateKey:"Action : rouvrez Connecter et mettez à jour la clé API, puis testez à nouveau.",connectionActionFixBaseUrl:"Action : vérifiez le chemin de la Base URL (se termine généralement par /v1), puis testez à nouveau.",connectionActionSwitchKey:"Action : attendez un moment ou passez à une autre clé/fournisseur.",connectionActionRetryTest:"Action : vérifiez réseau/proxy et relancez le test de connexion.",noModelsFetching:"Aucun modèle encore. Récupération de la liste…",firstUseGuide:"Démarrage rapide : 1) /connect 2) /models 3) envoyez « bonjour »",firstUseSendHello:"Prochaine étape : envoyez votre premier message (par exemple : « bonjour »).",connectionCheckUnauthorized:"401 Non autorisé : vérifiez la clé API et le type de fournisseur.",connectionCheckForbidden:"403 Interdit : votre clé n'a peut-être pas accès à ce fournisseur/modèle.",connectionCheckNotFound:"404 Non trouvé : vérifiez le chemin de la Base URL (compatible OpenAI se termine généralement par /v1).",connectionCheckRateLimited:"429 Limite de débit : attendez et réessayez, ou changez de clé/fournisseur.",connectionCheckTimeout:"Délai de connexion dépassé : vérifiez réseau/proxy et réessayez.",connectionCheckNetwork:"Échec de connexion réseau : vérifiez DNS/proxy/Base URL.",connectionCheckFailed:"Vérification de connexion échouée : {error}",apiKeyCleared:"Clé API effacée pour {provider}.",customAdded:"Fournisseur personnalisé ajouté : {provider}.",customRenamed:"Fournisseur personnalisé renommé : {provider}.",customModelsUpdated:"Modèles du fournisseur personnalisé mis à jour : {provider}.",customDeleted:"Fournisseur personnalisé supprimé : {provider}.",modelsRequired:"Ajoutez au moins un modèle.",modelsEmpty:"Aucun modèle trouvé.",modelsFetchFailed:"Échec de récupération des modèles : {error}",modelsFetchChatCompletions:"Liste de modèles non supportée pour l'URL de base /chat/completions ou /responses.",manualModelsRequired:"Ce point d'accès ne supporte pas la découverte automatique des modèles. Veuillez entrer manuellement les noms de modèles dans la configuration.",nameRequired:"Le nom du fournisseur est requis.",nameConflict:"Le nom du fournisseur existe déjà."}},copyToast:{copiedToClipboard:"Copié dans le presse-papier"}};var id_default2={common:{apply:"Terapkan",cancel:"Batal",close:"Tutup",confirm:"Konfirmasi",yes:"Ya",no:"Tidak",exit:"Keluar",back:"Kembali",next:"Berikutnya",save:"Simpan",empty:"—",unknownError:"Kesalahan tidak diketahui",inputClearTip:"Ctrl+C hapus",total:"Total"},configDialog:{title:"Pengaturan",hint:"Tab/Shift+Tab pindah field • Enter Terapkan • Esc Batal",modelsTitle:"Model (kustom)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"Jendela Konteks",contextWindowLocked:"Jendela Konteks (ditentukan model)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperature",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperature: hanya angka dan "."',maxTokensTitle:"Maks Token Output",maxTokensPlaceholder:"32000",baseUrlTitle:"URL Dasar (kompatibel OpenAI)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Saat ini:",apiKeyNotSet:"(belum diatur)",apiKeyTitle:"API Key",apiKeyPlaceholder:"Tempel key baru untuk memperbarui (biarkan kosong untuk tetap)",interleavedThinkingTitle:"Pikiran Berseling (Space untuk toggle)",interleavedThinkingLocked:"Pikiran Berseling (ditentukan model)",interleavedThinkingOpen:"Nyala",interleavedThinkingClose:"Mati",tipIntensityTitle:"Intensitas Tips",tipIntensityOff:"Mati",tipIntensityLow:"Rendah",tipIntensityStandard:"Standar",shortcutsTitle:"Pintasan",shortcutCommandsLabel:"Perintah",shortcutTimelineLabel:"Timeline",shortcutNewSessionLabel:"Sesi baru",shortcutsPlaceholder:"cth: mod+p",shortcutsHint:"Gunakan mod/ctrl/alt/shift + tombol (a-z, 0-9, F1-F12)."},languageDialog:{title:"Bahasa",hint:"Enter Terapkan • Esc Batal",languageTitle:"Bahasa",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Upaya Berpikir",hint:"Enter Terapkan • Esc Batal",effortTitle:"Upaya Penalaran",applied:"Upaya penalaran diatur ke {effort}",option:{low:"Rendah",medium:"Sedang",high:"Tinggi",xhigh:"Sangat Tinggi",max:"Maks",minimal:"Minimal",none:"Tidak ada",off:"Nonaktif",auto:"Otomatis"}},toolSettingsDialog:{title:"Pengaturan Alat",hint:"Enter Terapkan • Esc Batal",websearchTitle:"Kunci API WebSearch",apiKeyCurrentPrefix:"Saat ini:",apiKeyNotSet:"(belum diatur)",apiKeyInvalidCjk:"API Key tidak boleh berisi karakter Cina.",apiKeyInvalidSpaces:"API Key tidak boleh berisi spasi.",apiKeyPlaceholder:"Tempel Serper API key"},pluginsDialog:{title:"Plugin",hint:"Pilih plugin untuk dikonfigurasi • Esc Tutup",serperSearch:"Serper Search",serperSearchDetail:"Pencarian web via Serper API",configured:"Terkonfigurasi",notConfigured:"Belum dikonfigurasi",serperConfigTitle:"Pengaturan Serper Search",serperConfigHint:"Tab Beralih • Enter Terapkan • Esc Batal"},skillsDialog:{title:"Keterampilan",hint:"Enter Terapkan • Esc Batal",empty:"Tidak ada keterampilan yang tersedia",emptyFiltered:"Tidak ada keterampilan yang cocok"},timelineDialog:{title:"Linimasa",hint:"Tab Filter • Enter Buka • Esc Tutup",empty:"Belum ada pesan",emptyFiltered:"Tidak ada entri yang cocok",filterAll:"Semua pesan",filterUser:"Pesan pengguna",filterTool:"Panggilan alat"},mcpSettingsDialog:{title:"MCP",hint:"Edit file mcp.json untuk mengonfigurasi server MCP • Esc Tutup",configFileLabel:"File konfig:",noServersHint:"Belum ada server MCP yang dikonfigurasi.",serverCount:"{count} server dikonfigurasi",guideText:"Edit file di atas untuk menambah atau mengubah server MCP.",openFile:"Buka File",reload:"Muat Ulang",close:"Tutup",reloaded:"Konfigurasi MCP dimuat ulang.",reloadFailed:"Gagal memuat ulang: {error}",status:"Status",toolCount:"Alat",disabled:"dinonaktifkan",testConnection:"Tes",testing:"Menguji koneksi...",testComplete:"Tes selesai.",testPartial:"Tes selesai dengan error.",testFailed:"Koneksi gagal: {error}",invalidJson:"JSON tidak valid: {error}",invalidShape:'JSON MCP tidak valid: memerlukan "mcpServers".',invalidServer:"Server MCP tidak valid: {name}",noServers:"Tidak ada server MCP ditemukan.",lintOk:"Sintaks JSON OK",lintAt:"{error} (baris {line}, kolom {column})",lintUnclosed:"{char} tidak tertutup (baris {line}, kolom {column})",lintInvalid:"{error}",exampleFormat:"Format contoh:"},toolApprovalsDialog:{title:"Persetujuan Alat",useAuto:"Otomatis",useNormal:"Normal",useStrict:"Ketat",close:"Tutup",focusedTitleAuto:"OTOMATIS",focusedTitleNormal:"NORMAL",focusedTitleStrict:"KETAT",focusedTitleClose:"TUTUP",focusedDescAuto:"Setujui semua pemanggilan alat secara otomatis. Tanpa konfirmasi (tercepat, paling tidak aman).",focusedDescNormal:"Setujui alat read-only otomatis. Konfirmasi sebelum alat tulis/eksekusi.",focusedDescStrict:"Memerlukan konfirmasi untuk setiap pemanggilan alat (paling aman, paling lambat).",focusedDescClose:"Tutup dialog tanpa mengubah pengaturan saat ini.",currentPrefix:"Saat ini: {mode}",tip:"Tip: Tab atau ↑/↓ untuk berpindah tombol, Enter untuk konfirmasi, Esc untuk menutup."},settingsDialog:{pendingApproval:"Selesaikan persetujuan yang tertunda sebelum mengubah pengaturan.",invalidShortcut:"Pintasan tidak valid untuk {label}: {value}",shortcutCommands:"Pintasan perintah",shortcutTimeline:"Pintasan timeline",shortcutNewSession:"Pintasan sesi baru",toolApprovalsApplied:"Persetujuan alat: {mode}",applied:"Pengaturan diterapkan."},exitAppDialog:{title:"Keluar DimCode",confirm:"Keluar sekarang?",warning:"Respons agen masih berjalan. Keluar akan menginterupsinya.",reasonPrefix:"Alasan: {reason}"},approvalDialog:{title:"Setujui Izin Alat",toolLabel:"Alat: {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Izin: {permission} ({risk})",descriptionLabel:"Deskripsi: {description}",commandLabel:"Perintah:",inlineActionHint:"↑/← Sebelumnya ↓/→ Berikutnya Enter Konfirmasi 1/2/3 Pilih",inlineActionHintCompact:"←/→ Pindah Enter Konfirmasi 1/2/3 Pilih",buttons:{approve:"Setujui",alwaysApprove:"Selalu setujui",deny:"Tolak",always:"Selalu",ok:"OK",no:"Tidak",y:"Y",all:"Semua",n:"N"}},askUserDialog:{noQuestionsTitle:"Tidak Ada Pertanyaan",noQuestionsBody:"Tidak ada pertanyaan untuk dijawab.",title:"Pertanyaan {index}/{total}: {header}",defaultHeader:"Pertanyaan",prev:"Sebelumnya",next:"Berikutnya",submit:"Kirim",otherOption:"Lainnya",otherDetail:"Berikan jawaban kustom",inlineHintOptions:"Tombol: ↑↓ untuk berpindah, ←→ untuk ganti pertanyaan, Enter untuk memilih.",inlineHintMulti:"Multi-pilih: Space untuk toggle centang.",inlineHintButtons:"Tab ke tombol, ←→ untuk berpindah, Enter untuk mengaktifkan, ↑ kembali ke opsi.",inlineHintNav:"Ctrl+Left / Ctrl+Right (atau Ctrl+A / Ctrl+E) untuk ganti pertanyaan.",inlineHintSubmit:"Ctrl+Enter untuk kirim, Esc untuk batal.",inlineButtonPrev:"[Sebelumnya]",inlineButtonNext:"[Berikutnya]",inlineButtonSubmit:"[Kirim]",inlineButtonCancel:"[Batal]",inlineActionHint:"Space Pilih ← Sebelumnya → Berikutnya Enter Berikutnya/Kirim Esc Batal",inlineActionHintCompact:"Space Pilih ←/→ Sebelumnya/Berikutnya Enter Berikutnya/Kirim Esc Batal",optionsSummaryAll:"{count} opsi",optionsSummaryVisibleMore:"{count} opsi ({start}-{end}) ↓ lebih",multiSelectHint:"[Multi-pilih] Space untuk toggle, Enter untuk konfirmasi",singleSelectHint:"[Single-pilih] Gunakan panah, Enter untuk konfirmasi",customAnswerLabel:"Jawaban kustom:",customAnswerPlaceholder:"Ketik jawaban Anda...",otherPlaceholder:"Lainnya dipilih — ketik jawaban Anda dan tekan Enter."},nextApiOAuthDialog:{title:"Login DimCode OAuth",copyUrl:"Salin URL",login:"Login",logout:"Logout",statusTitle:"Status",statusAuthenticated:"✓ Login sebagai {email}",statusLoading:"⏳ Mengautentikasi...",statusNotLoggedIn:"✗ Belum login",instructionAuthenticated:"Gunakan ↑↓ untuk navigasi, Enter untuk memilih, atau angka 1-9",instructionLoading:"Tekan C untuk menyalin URL di bawah jika browser tidak terbuka",instructionNeedsSetup:"Periksa redirect_uri, scope, dan status aktif DimCode OAuth, lalu coba lagi",instructionWithUrl:"Tekan C untuk menyalin URL OAuth di bawah, atau tekan Enter untuk membuka browser",instructionUnauthed:"Tekan Enter untuk login dengan DimCode OAuth, atau Esc untuk menutup",instructionManualCallback:"Salin URL di bawah, login di browser, lalu tempel URL pengalihan ke kotak input.",oauthUrlTitleLoading:"URL OAuth (salin jika browser tidak terbuka)",oauthUrlTitleReady:"URL OAuth (siap digunakan)",scrollIndicator:" [{start}-{end} dari {total}]",selectModelTitle:"Pilih Model (↑↓/1-9, Enter untuk memilih){indicator}",aboutTitle:"Tentang DimCode OAuth",setupTitle:"Error login OAuth",aboutBulletOne:"• Menggunakan klien DimCode OAuth bawaan",aboutBulletTwo:"• Mengambil model relay setelah login dan menyimpan konfigurasi provider",aboutBulletThree:"• Menggunakan OAuth refresh token alih-alih API key jangka panjang",viewAllPlans:"Lihat Semua Paket →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"Akun DimCode",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"Membuat URL OAuth...",urlReady:"URL OAuth siap! Salin atau tekan Enter untuk membuka browser.",generateUrlFailed:"Gagal membuat URL OAuth: {error}",startingLogin:"Memulai login OAuth...",browserOpened:"Browser terbuka. Jika tidak, salin URL dari dialog.",copyUrlToLogin:"Salin URL OAuth dari dialog untuk login.",urlCopied:"URL OAuth disalin ke clipboard.",urlCopyFailed:"Gagal menyalin URL OAuth.",authSuccess:"Berhasil mengautentikasi dengan DimCode OAuth!",loginFailed:"Login OAuth gagal: {error}",loggedOut:"Logout dari DimCode OAuth",loggedOutWithRemoteWarning:"Logout dari DimCode OAuth, tapi pencabutan remote gagal: {error}",logoutFailed:"Logout gagal: {error}",initFailed:"Error inisialisasi dialog: {error}",modelSwitched:"Model diubah ke {model}",selectModelFailed:"Gagal memilih model: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Debug",titleDebugging:"Debugging",copy:"salin",proceed:"lanjutkan",fixed:"diperbaiki",body:"Saya telah menambahkan log debug (dan mungkin perbaikan). Silakan coba reproduksi masalahnya, lalu pilih hasilnya."},exitSessionDialog:{title:"Keluar Sesi",confirm:"Keluar dari sesi saat ini dan kembali ke Beranda?",note:"Pesan berikutnya akan memulai sesi baru."},messageActionsDialog:{title:"Aksi Pesan",revert:"Kembalikan pesan",revertWithFiles:"Kembalikan pesan dan perubahan file",revertKeepFiles:"Kembalikan pesan (pertahankan perubahan file)",revertFilesOnly:"Kembalikan perubahan file saja",copy:"Salin teks pesan ke clipboard",fork:"Fork buat sesi baru",pin:"Sematkan pesan",unpin:"Lepas sematan"},pathPickerDialog:{hint:"↑/↓ pilih • Tab autocomplete • Enter konfirmasi • Esc tutup"},providerConnectDialog:{title:"Hubungkan {provider}",providerFallback:"Provider",hint:"Tab pindah • Ctrl+C hapus • Enter Terapkan",hintOpenAI:"Tab pindah • Ctrl+C hapus • Enter Terapkan",hintGemini:"Tab pindah • Ctrl+C hapus • Enter Terapkan",hintAnthropic:"Tab pindah • Ctrl+C hapus • Enter Terapkan",hintGeneric:"Tab pindah • Ctrl+C hapus • Enter Terapkan",applyingHint:"Menguji koneksi, harap tunggu...",applyingButton:"Menerapkan...",testConnection:"Tes koneksi",baseUrlStatusAutoFix:"Perbaikan otomatis: {value}",baseUrlStatusInvalid:"Base URL harus http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API Key",apiKeyPlaceholder:"Tempel key baru untuk memperbarui (biarkan kosong untuk tetap)",apiKeyCurrent:"Saat ini: {value}",apiKeyNotSet:"Saat ini: (belum diatur)",apiKeyInvalidCjk:"API Key tidak boleh berisi karakter Cina.",apiKeyInvalidSpaces:"API Key tidak boleh berisi spasi.",clearKey:"Hapus",useDetectedKey:"Gunakan {name}",disconnectButton:"Putuskan",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"Mati",toggleOn:"Nyala",toggleHint:"Tab pindah • ←/→ ubah • Space toggle"},redoConfirmDialog:{title:"Konfirmasi Redo",body:"Apakah Anda yakin ingin mengembalikan pesan yang dikembalikan?"},renameSessionDialog:{title:"Ganti nama sesi",label:"Nama sesi",placeholder:"cth: Catatan perencanaan"},sessionsDialog:{timeNow:"sekarang",timeMinutes:"{count} mnt",timeHours:"{count} jam",timeDays:"{count} hari",newSession:"Sesi baru",title:"Sesi ({count})",titleScoped:"Sesi ({count}/{total})",scope:"Cakupan: {cwd}",loading:"Memuat…",confirmDelete:"Konfirmasi hapus: tekan Delete lagi",header:"{count} sesi • Tombol panah untuk navigasi • Enter memilih{range}{activity}",headerRange:" • Menampilkan {start}-{end}",runningCount:"{count} berjalan",pausedCount:"{count} menunggu konfirmasi",hint:"Ketik untuk lompat • ←/→ tombol • Enter konfirmasi • Esc tutup",focusPrefix:"Fokus: {focus}",focusList:"Daftar",focusButtons:"Tombol",noSessionsCwd:"Tidak ada sesi di cwd ini",noSessions:"Belum ada sesi tersimpan",nodeOnly:"Sesi hanya tersedia di mode Node/CLI.",newSessionTitle:"Sesi Baru",newSessionTarget:"sesi baru",busy:{agentResponding:"Agen masih merespons",awaitingAskUser:"Menunggu jawaban AskUser",awaitingToolApproval:"Menunggu persetujuan alat",pendingApproval:"Menunggu persetujuan"},buttons:{open:"Buka",delete:"Hapus",deleteConfirm:"Hapus (konfirmasi)",scope:"Cakupan: {scope}",scopeCwd:"CWD",scopeAll:"Semua",refresh:"Segarkan"}},sessionsOverlay:{title:"Sesi",hint:"Enter Pilih • Esc Tutup • Ctrl+R Segarkan",loading:"Memuat sesi...",empty:"Belum ada sesi tersimpan."},switchSessionDialog:{title:"Ganti Sesi",confirm:"Ganti & Interupsi",target:"Ganti ke {target}?",fallback:"Ganti sesi sekarang?",warning:"Ini akan menginterupsi respons/alur di sesi aktif.",reason:"Alasan: {reason}"},themeDialog:{title:"Tema",hint:"Enter Terapkan • Esc Batal",mode:"Mode",light:"Terang",dark:"Gelap",unavailable:"Terminal ini tidak mendukung tema yang dapat diganti.",fallback:"Tema fallback ANSI terang/gelap tetap digunakan di sini.",tip:"Tip: default mengikuti tema sistem."},commandPalette:{searchPlaceholder:"Cari…",noMatches:"Tidak ada kecocokan",hint:"Ketik untuk filter • Enter: buka • Esc: tutup",title:"Perintah"},skills:{title:"Keterampilan"},help:{title:"Bantuan",modeLabel:"Mode: {mode}",modeDetail:"Mode asisten saat ini.",shortcutsLabel:"Pintasan",onboarding:`Selamat datang! Mulai cepat:
1145
+ Astuce : {commandsKey} ouvre la palette de commandes.`,items:{help:"Aide et raccourcis (F1)",commands:"Palette de commandes (Ctrl+P)",back:"Revenir au saut précédent",status:"Afficher/masquer les détails du statut"}},commands:{help:{label:"Aide",detail:"Raccourcis + commandes courantes (F1)"},sessions:{label:"Sessions",detail:"Choisir ou créer une session (/sessions)"},timeline:{label:"Timeline",detail:"Aller à un message utilisateur (/timeline)"},newSession:{label:"Nouvelle session",detail:"Démarrer une nouvelle session (/new)"},connectProvider:{label:"Connecter fournisseur",detail:"Connecter un fournisseur (/connect)"},models:{label:"Modèles",detail:"Sélectionner un modèle (/models)"},toolApprovals:{label:"Approbations d'outils",detail:"Configurer les approbations (/approvals)"},toolSettings:{label:"Paramètres outils",detail:"Configurer les paramètres outils (/tool-settings)"},mcpHub:{label:"MCP",detail:"Gérer les connecteurs et paramètres MCP (/mcp)"},plugins:{label:"Plugins",detail:"Gérer les plugins (/plugins)"},debug:{label:"Débogage",detail:"Logs observability SDK (/debug)"},mcpSettings:{label:"MCP (JSON avancé)",detail:"Configurer le JSON brut des serveurs MCP (/mcp-settings)"},language:{label:"Langue",detail:"Changer la langue de l'interface (/language)"},settings:{label:"Paramètres",detail:"Paramètres fournisseur personnalisé (/settings, Ctrl+K)"}},homePage:{multilineTitle:"Texte multiligne",multilineTitleWithCount:"Texte multiligne ({count} lignes)",providerCustom:"Personnalisé",reviewPrompt:"aide-moi à revoir les modifications du code",footerCwd:"rép. {cwd}",hints:{switchMode:"changer mode",commands:"commandes"},tips:{greeting:"Bon retour ! Essayez {commandsKey} ou {init} pour commencer.",commandsAlias:"Astuce : {key} ouvre la palette de commandes."},prompts:{help:"Aide et raccourcis (F1)",sessions:"Lister/choisir sessions",connect:"Connecter un fournisseur",models:"Sélectionner un modèle",newSession:"Démarrer une nouvelle session",approvals:"Configurer les approbations d'outils (auto/normal/strict)",commands:"Ouvrir la palette de commandes",toolSettings:"Configurer les paramètres outils",mcpSettings:"Ouvrir MCP",plugins:"Gérer les plugins",language:"Changer la langue de l'interface",theme:"Sélectionner un thème",status:"Afficher/masquer les détails du statut",review:"Revoir les modifications du code",init:"Initialiser/améliorer AGENTS.md",skills:"Lister les compétences chargées",exit:"Quitter l'application",debug:"Dialogue de débogage (chat)",settings:"Paramètres fournisseur personnalisé"},commandPalette:{connect:"Connecter un fournisseur",models:"Sélectionner un modèle"},commands:{debugLabel:"Débogage",debugDetail:"Logs observability SDK (/debug)"},toast:{approvalsUsage:"Utilisez /approvals (pas on/off).",customProviderOnly:"Paramètres uniquement pour les fournisseurs personnalisés.",redoChatOnly:"Rétablir n'est disponible que dans la vue chat.",retryChatOnly:"Réessayer n'est disponible que dans la vue chat.",pinsChatOnly:"Les épingles ne sont disponibles que dans la vue chat.",renameChatOnly:"Renommer n'est disponible que dans la vue chat (/rename <titre>).",commandRemoved:"Cette commande n'est plus disponible : {command}",helpAliasRemoved:"Appuyez sur F1 pour l'aide.",deleteConfirm:"Appuyez de nouveau sur Supprimer pour confirmer.",themeToggled:"Thème : {mode}",pasteImagePending:"L'image est encore en traitement. Veuillez patienter."}},chatPage:{placeholder:"Posez votre question... (nouvelle ligne : Shift+Entrée ou Ctrl+J)",placeholderAwaitingApproval:"Bloqué par approbation : sélectionnez Approuver / Refuser pour continuer.",reviewPrompt:"aide-moi à revoir les modifications du code",notification:{approvalTitle:"[Approbation requise] Permission d'outil",approvalMessage:"DimCode attend une approbation d'outil : {tool}.",doneTitle:"[Tâche terminée]",doneMessage:"DimCode a terminé cette tâche.",doneMessageWithDuration:"DimCode a terminé cette tâche en {duration}.",doneMessageWithTools:"DimCode a terminé cette tâche après {tools} appel(s) d'outil.",doneMessageWithToolsAndDuration:"DimCode a terminé cette tâche en {duration} avec {tools} appel(s) d'outil."},headerStats:"{messages} msgs · total {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"Fusion,Réflexion,Raisonnement,Planification,Analyse,Synthèse,Raffinage,Rédaction",modelFallback:"modèle",mode:{plan:"plan",agent:"agent",debug:"débogage"},status:{approvalsAuto:"AUTO",approvalsAll:"TOUS",blockedByApproval:"Bloqué par approbation",awaitingApprovalAction:"En attente de votre approbation : choisissez Approuver / Refuser pour continuer."},footer:{dragSelect:"glisser pour sélectionner",openLink:"Ctrl+Clic pour ouvrir fichiers ou liens",esc:"échapp",interrupt:"interrompre",approvalPaused:"⏸ En pause",approvalPausedHint:"En attente d'approbation (Entrée pour choisir).",shortcuts:"Ctrl+K : config Ctrl+O : outils/thinking Cmd+Suppr/Ctrl+W : effacer Tab : changer mode {commandsKey} : commandes",shortcutsCompact:"Ctrl+K : config Ctrl+O : outils/thinking Cmd+Suppr/Ctrl+W : effacer Tab : mode {commandsKey} : commandes",shortcutsMicro:"Ctrl+O : outils {commandsKey} : commandes",shortcutsMini:"{commandsKey} : commandes"},session:{new:"nouvelle"},timeline:{title:"Timeline",empty:"(vide)",filterAll:"Tous les messages",filterUser:"Messages utilisateur",filterTool:"Appels d'outils"},pins:{title:"Épinglés",empty:"(vide)"},jumpToBottom:{button:"↓"},prompts:{help:"Aide et raccourcis (F1)",newSession:"Démarrer une nouvelle session",resume:"Reprendre la file en pause",sessions:"Lister/choisir sessions",timeline:"Aller à un message utilisateur",pins:"Ouvrir les messages épinglés",pin:"Épingler le dernier message",back:"Revenir au saut précédent",connect:"Connecter un fournisseur",models:"Sélectionner un modèle",theme:"Changer le thème de l'interface",approvals:"Configurer les approbations d'outils (auto/normal/strict)",commands:"Ouvrir la palette de commandes",toolSettings:"Configurer les paramètres outils",mcpSettings:"Ouvrir MCP",plugins:"Gérer les plugins",language:"Changer la langue de l'interface",status:"Afficher/masquer les détails du statut",review:"Revoir les modifications du code",retry:"Réessayer le dernier message utilisateur",compact:"Compacter le contexte de la session",init:"Initialiser/améliorer AGENTS.md",rename:"Renommer la session actuelle",skills:"Lister les compétences chargées",exit:"Quitter l'application",debug:"Dialogue de débogage",settings:"Paramètres fournisseur personnalisé"},commands:{pinsLabel:"Épingles",pinsDetail:"Ouvrir les messages épinglés",backLabel:"Retour",backDetail:"Revenir au saut précédent",debugLabel:"Débogage",debugDetail:"Logs observability SDK (/debug)",statusLabel:"Statut",statusDetail:"Afficher/masquer les détails du statut",themeLabel:"Thème",themeDetail:"Changer le thème de couleurs"},tips:{contextWarn:"Astuce : Le contexte se remplit. Utilisez /compact ou /new pour garder des réponses concises.",contextCritical:"Astuce : Vous êtes près de la limite de contexte. Démarrez une nouvelle session avec /new (ou /compact d'abord).",timeline:"Astuce : Chat long ? Utilisez /tl pour revenir à un message utilisateur spécifique.",timelineAlias:"Astuce : /tl est un alias court pour /timeline.",commandsAlias:"Astuce : {key} ouvre la palette de commandes.",errorRecovery:"Astuce : En cas d'échec, essayez /compact ou /new.",greeting:"Bon retour ! Essayez {commandsKey} ou {init} pour commencer.",compactDelight:"Bien ! Garder un contexte léger aide.",addTests:"C'est prêt ! Vous voulez que j'ajoute des tests ? Répondez « oui » ou « ok »."},confirm:{addTests:"Veuillez ajouter des tests pour les modifications que nous venons de faire."},toast:{customProviderOnly:"Paramètres uniquement pour les fournisseurs personnalisés.",renameNodeOnly:"Renommer n'est disponible qu'en mode Node/CLI.",noActiveSession:"Aucune session active à renommer.",sessionNameEmpty:"Le nom de la session ne peut pas être vide.",sessionRenamed:"Session renommée : {title}",renameFailed:"Échec du renommage de la session.",linkOpenHint:"Astuce : Ctrl+Clic pour ouvrir fichiers ou liens.",copySuccess:"Copié",copyFailed:"Échec de la copie",forkFailed:"Échec de la fourche de session.",backEmpty:"Aucun saut précédent pour revenir.",pinsEmpty:"Aucun message épinglé.",pinEmpty:"Aucun message à épingler.",pinned:"Message épinglé.",unpinned:"Message désépinglé.",debugUnavailable:"Le serveur de débogage n'est pas disponible.",approvalsUsage:"Utilisez /approvals (pas on/off).",debugDialogOpened:"Dialogue de débogage ouvert.",debugDialogClosed:"Dialogue de débogage fermé.",renameUsage:"Usage : /rename <titre>",themeToggled:"Thème : {mode}",statusCompactOn:"Statut : compact",statusCompactOff:"Statut : détaillé",compactingSession:"Compactage de la session...",compactSuccess:"Session compactée : {message}",compactWarning:"Session compactée avec un gain limité : {message}",compactSuccessDetailWithTokens:"Les {count} premiers messages d'historique ont été résumés. Estimation tokens entrée {before} -> {after}, économie d'environ {saved} tokens.",compactSuccessDetailNotReduced:"Les {count} premiers messages d'historique ont été résumés, mais l'estimation des tokens d'entrée est passée de {before} à {after}, donc la taille de la requête n'a pas diminué.",compactSuccessDetailCountOnly:"Les {count} premiers messages d'historique ont été résumés.",compactSuccessDetailSummaryOnly:"Un nouveau résumé de conversation a été généré.",compactFailed:"Échec du compactage de la session : {error}",compactFailedTokenLimit:"Le compactage a échoué par manque de budget de contexte. Définissez DIMCODE_CONTEXT_WINDOW correctement, passez à un modèle avec plus de contexte, ou utilisez /new. Détail : {error}",retryEmpty:"Aucun message utilisateur précédent à réessayer.",commandRemoved:"Cette commande n'est plus disponible : {command}",helpAliasRemoved:"Appuyez sur F1 pour l'aide.",waitForResponse:"Veuillez attendre la fin de la réponse en cours, ou Échap pour interrompre.",pasteImagePending:"L'image est encore en traitement. Veuillez patienter.",pendingApproval:"Veuillez d'abord traiter tool_approve.",awaitingApprovalAction:"En pause : action requise. Choisissez Approuver / Toujours approuver / Refuser dans la carte de permission.",awaitingApprovalStillWaiting:"Toujours en attente d'approbation ({seconds}s). Le modèle ne continuera pas tant que vous n'approuvez ou refusez.",pendingAskUser:"Veuillez d'abord traiter ask_user.",notificationSessionBusy:"Cette notification appartient à une autre session occupée. Terminez ce travail ou changez de session manuellement d'abord.",notificationSessionUnavailable:"Impossible d'ouvrir la session pour cette notification ici.",notificationSessionSwitchFailed:"Échec de l'ouverture de la session pour cette notification.",approvalNotActive:"Cette approbation est en file. Résolvez d'abord l'approbation active.",askUserNotActive:"Cette demande ask_user n'est plus active."}},chatQueue:{label:"File ({count})",labelCompact:"File {count}",more:"+{count} de plus…",resumeToken:"/resume",resumePlainToken:"reprendre",resumeLegacyToken:"reprendre la file",state:{idle:"En attente",running:"En cours",paused:"En pause",error:"Erreur"},item:{steerAction:"Réorienter",steerReady:"Premier",steerPending:"Suivant",steerPaused:"En pause"},toast:{enqueued:"Ajouté à la file (n°{count}).",full:"La file est pleine (max 5). Supprimez un élément ou /new.",cleared:"{count} élément(s) en file effacé(s).",deleted:"{count} élément(s) en file supprimé(s). Ctrl+Z pour annuler.",steerPromoted:"Promu en réorientation. Il s'exécutera en premier à la reprise de la file.",steerQueued:"La réorientation ne peut pas être injectée immédiatement. Elle a été promue et s'exécutera en premier au prochain tour.",steerSent:"Réorientation acceptée. Elle sera injectée avant le prochain appel au modèle dans ce tour.",undo:"Suppression de file annulée.",pausedTip:"File en pause. Utilisez {resume} ou {resumeText} pour continuer, ou envoyez un nouveau message pour choisir.",stale:"File en pause : la requête semble bloquée."},confirm:{title:"Continuer les messages en file ?",description:"La requête précédente ne s'est pas terminée. {count} message(s) en attente.",hint:"Continuez pour envoyer l'élément suivant, ou mettez la file en pause.",continue:"Continuer",pause:"Pause",reason:"Raison : {reason}"},reason:{network_error:"Erreur réseau.",timeout:"Délai d'attente dépassé.",canceled_by_user:"Annulé par l'utilisateur.",rate_limited:"Limite de débit atteinte.",config_unavailable:"Configuration sauvegardée indisponible.",unknown:"Échec de la requête."},draftDecision:{title:"La file est en pause",description:"{count} message(s) en file sont encore en attente. Décidez quoi faire avec votre nouvelle saisie.",previewLabel:"Nouvelle saisie :",continue:"Continuer la file",append:"Ajouter à la file",replace:"Ignorer la file & envoyer"}},chatStatus:{done:"Terminé.",error:"Erreur.",interrupted:"Interrompu.",permissionDenied:"Permission refusée.",planning:"Planification…",drafting:"Rédaction…",retrying:"Nouvelle tentative ({retry}/{maxAttempts})…",runningTool:"Exécution de {tool}…",runningTools:"Exécution de {count} outils…",approvalPendingOther:"Une autre approbation est en attente ({permission})…",awaitingApproval:"En attente d'approbation…",awaitingApprovalWithPerm:"En attente d'approbation ({permission})…",awaitingApprovalWithRisk:"En attente d'approbation ({risk})…",awaitingAnswers:"En attente de réponses…",resumingApproved:"Approuvé. Reprise…",resumingDenied:"Refusé. Reprise…",resuming:"Reprise…",autoApprovingWithRisk:"Approbation auto ({risk})…",riskFallback:"risque",toolFallback:"outil",thinking:"Réflexion…",autoCompactionRequired:"Le contexte est près de la limite. Compactage requis d'abord.",autoCompactionRequiredDetailed:"Le contexte est près de la limite · la prochaine requête est estimée à {estimated} tokens, et le compactage auto démarre à {threshold} tokens, un compactage est donc requis d'abord.",compressed:"Contexte compacté · {removed} anciens messages résumés, économie d'environ {saved} tokens d'entrée ({elapsed}ms)",autoCompactedDetailed:"Compactage auto terminé · {removed} anciens messages résumés, estimation tokens entrée {before} -> {after}, économie d'environ {saved} tokens",autoCompactedNotReduced:"Compactage auto terminé · {removed} anciens messages résumés, mais l'estimation des tokens d'entrée est passée de {before} à {after}, la taille de la requête n'a donc pas diminué",autoCompactedSaved:"Compactage auto terminé · {removed} anciens messages résumés, économie d'environ {saved} tokens",autoCompactedCountOnly:"Compactage auto terminé · {removed} anciens messages résumés",interruptedMarkdown:"> **Interrompu** · Réponse annulée par l'utilisateur (`Échap`).",awaitingApprovalPrefix:"En attente d'approbation",awaitingAnswersPrefix:"En attente de réponses",approvalPendingPrefix:"Une autre approbation est en attente",autoApprovingPrefix:"Approbation auto"},chatParts:{thinking:"Réflexion",plan:"Plan",todo:"À faire"},chatRender:{userLabel:"utilisateur",outputLabel:"↳ sortie",outputLabelShort:"sortie :",canceled:"annulé",inputLabel:"entrée :",collapse:"... (réduire)",moreLines:"... ({count} lignes supplémentaires)",moreLinesOmitted:"... ({count} lignes omises ; définissez {envVar} pour augmenter)",streamingTail:"… (diffusion : {shown} derniers caractères affichés ; {omitted} omis)",copy:"Copier",userResponses:"Réponses utilisateur :",approvalQueued:"En attente d'une approbation précédente...",proposedPlan:{title:"Plan proposé"},llmMeta:{changedFiles:"{count} fichier(s) modifié(s) : {files}",changedFilesMore:"+{count} de plus",revertHint:"Astuce : Cliquez ce message -> Annuler les messages pour défaire ce tour.",changedFilesCardTitle:"{count} fichiers modifiés :",revertButton:"Annuler"},toolName:{explore:"Explorer",subagent:"Sous-agent"},toolSuffix:{offset:"décalage {value}",limit:"limite {value}",matches:"{count} correspondances",todos:"{count} à faire",results:"{count} résultats",results_one:"{count} résultat"},toolGroup:{readFiles:"Lire {count} fichiers",writeFiles:"Écrire {count} fichiers",editFiles:"Modifier {count} fichiers",globPatterns:"Glob {count} motifs",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} motifs",bashCommands:"Exécuter {count} commandes",searchQueries:"Rechercher {count} requêtes",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"La recherche peut accéder au réseau.",bash:"Bash peut exécuter des commandes.",edit:"Les modifications de fichiers peuvent modifier des fichiers locaux.",grep:"Grep peut lire des fichiers locaux."},inlineHint:"Touches : ↑↓←→ pour déplacer, Entrée pour sélectionner.",awaitingUserAction:"En attente de votre action : choisissez Approuver / Toujours approuver / Refuser.",decision:{userDenied:"L'utilisateur a refusé l'approbation"},denied:{title:"# Permission d'outil refusée",toolLine:"- outil : `{tool}`",permissionLine:"- permission : `{permission}`",hint:"Vous pouvez re-sélectionner le tool_call et réessayer."},summary:{title:"# Outil approuvé + exécuté",permissionLine:"Permission `{permission}` approuvée pour `{tool}`."},required:"Approbation requise ({risk}).",args:{commandWithDescription:"Commande : {command} - {description}",command:"Commande : {command}",description:"Description : {description}",raw:"Args : {args}"}},pathPicker:{titleWorkspace:"Sélectionner l'espace de travail",titleFile:"Sélectionner un fichier",placeholderWorkspace:"Tapez un chemin (../ etc). Tab pour compléter. Entrée sélectionne un répertoire.",placeholderFile:"Tapez un chemin (../ etc). Tab pour compléter. Entrée sélectionne un fichier."},providerDialogs:{customLabel:"Personnalisé",customDetail:"personnalisé",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Se connecter avec DimCode OAuth",addCustomLabel:"Ajouter un fournisseur personnalisé",addCustomDetail:"ajouter un fournisseur personnalisé",providerFallback:"Fournisseur",adapter:{openai:"OpenAI",openaiOpenRouter:"Compatible OpenAI (OpenRouter)",openaiLocal:"Compatible OpenAI (point d'accès local)",openaiResponses:"Réponses OpenAI",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Configuré",notConfigured:"Non configuré"},manage:{title:"Fournisseur personnalisé : {provider}",connect:"Connecter",connectDetail:"Modifier clé API / Base URL",rename:"Renommer",renameDetail:"Modifier le nom du fournisseur",models:"Modifier les modèles",modelsDetail:"Mettre à jour les IDs de modèles disponibles",delete:"Supprimer",deleteDetail:"Supprimer ce fournisseur"},deleteConfirm:{title:"Supprimer {provider} ?",confirm:"Supprimer (confirmer)",confirmDetail:"Cette action est irréversible",cancelDetail:"Conserver le fournisseur"},nameDialog:{title:"Nommer le fournisseur personnalisé",label:"Nom du fournisseur",placeholder:"ex. DeepSeek (Proxy)"},modelsDialog:{title:"Modèles du fournisseur personnalisé",modelsTitle:"Modèles",modelsPlaceholder:"IDs de modèles (, ou nouvelles lignes)",hint:", / nouvelle ligne • Shift+Entrée nouvelle ligne • Entrée Appliquer",fetch:"Récupérer les modèles",fetching:"Récupération des modèles…"},modelsFetchDialog:{title:"Sélectionner les modèles",searchPlaceholder:"Filtrer les modèles",hint:"Epace basculer • Entrée confirmer • Échap annuler"},toast:{modelSet:"Modèle défini sur {provider} / {model}.",noModels:"Aucun modèle disponible. Connectez d'abord un fournisseur (/connect).",connectFirst:"Veuillez d'abord connecter un fournisseur (/connect) avant d'envoyer votre premier message.",apiKeyRequired:"La clé API est requise.",baseUrlRequired:"L'URL de base est requise.",baseUrlInvalid:"L'URL de base doit commencer par http:// ou https://",connected:"Connecté à {provider}.",connectedSelectModel:"Connecté à {provider}. Choisissez un modèle.",connectedCheckFailed:"Connecté à {provider}, mais la vérification a échoué : {reason}",connectionTestPassed:"Test de connexion réussi : {provider}.",connectionTestFailed:"Test de connexion échoué : {provider} - {reason}",connectionActionUpdateKey:"Action : rouvrez Connecter et mettez à jour la clé API, puis testez à nouveau.",connectionActionFixBaseUrl:"Action : vérifiez le chemin de la Base URL (se termine généralement par /v1), puis testez à nouveau.",connectionActionSwitchKey:"Action : attendez un moment ou passez à une autre clé/fournisseur.",connectionActionRetryTest:"Action : vérifiez réseau/proxy et relancez le test de connexion.",noModelsFetching:"Aucun modèle encore. Récupération de la liste…",firstUseGuide:"Démarrage rapide : 1) /connect 2) /models 3) envoyez « bonjour »",firstUseSendHello:"Prochaine étape : envoyez votre premier message (par exemple : « bonjour »).",connectionCheckUnauthorized:"401 Non autorisé : vérifiez la clé API et le type de fournisseur.",connectionCheckForbidden:"403 Interdit : votre clé n'a peut-être pas accès à ce fournisseur/modèle.",connectionCheckNotFound:"404 Non trouvé : vérifiez le chemin de la Base URL (compatible OpenAI se termine généralement par /v1).",connectionCheckRateLimited:"429 Limite de débit : attendez et réessayez, ou changez de clé/fournisseur.",connectionCheckTimeout:"Délai de connexion dépassé : vérifiez réseau/proxy et réessayez.",connectionCheckNetwork:"Échec de connexion réseau : vérifiez DNS/proxy/Base URL.",connectionCheckFailed:"Vérification de connexion échouée : {error}",apiKeyCleared:"Clé API effacée pour {provider}.",customAdded:"Fournisseur personnalisé ajouté : {provider}.",customRenamed:"Fournisseur personnalisé renommé : {provider}.",customModelsUpdated:"Modèles du fournisseur personnalisé mis à jour : {provider}.",customDeleted:"Fournisseur personnalisé supprimé : {provider}.",modelsRequired:"Ajoutez au moins un modèle.",modelsEmpty:"Aucun modèle trouvé.",modelsFetchFailed:"Échec de récupération des modèles : {error}",modelsFetchChatCompletions:"Liste de modèles non supportée pour l'URL de base /chat/completions ou /responses.",manualModelsRequired:"Ce point d'accès ne supporte pas la découverte automatique des modèles. Veuillez entrer manuellement les noms de modèles dans la configuration.",nameRequired:"Le nom du fournisseur est requis.",nameConflict:"Le nom du fournisseur existe déjà."}},copyToast:{copiedToClipboard:"Copié dans le presse-papier"}};var id_default2={common:{apply:"Terapkan",cancel:"Batal",close:"Tutup",confirm:"Konfirmasi",yes:"Ya",no:"Tidak",exit:"Keluar",back:"Kembali",next:"Berikutnya",save:"Simpan",empty:"—",unknownError:"Kesalahan tidak diketahui",inputClearTip:"Ctrl+C hapus",total:"Total"},configDialog:{title:"Pengaturan",hint:"Tab/Shift+Tab pindah field • Enter Terapkan • Esc Batal",modelsTitle:"Model (kustom)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"Jendela Konteks",contextWindowLocked:"Jendela Konteks (ditentukan model)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperature",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperature: hanya angka dan "."',maxTokensTitle:"Maks Token Output",maxTokensPlaceholder:"32000",baseUrlTitle:"URL Dasar (kompatibel OpenAI)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Saat ini:",apiKeyNotSet:"(belum diatur)",apiKeyTitle:"API Key",apiKeyPlaceholder:"Tempel key baru untuk memperbarui (biarkan kosong untuk tetap)",interleavedThinkingTitle:"Pikiran Berseling (Space untuk toggle)",interleavedThinkingLocked:"Pikiran Berseling (ditentukan model)",interleavedThinkingOpen:"Nyala",interleavedThinkingClose:"Mati",tipIntensityTitle:"Intensitas Tips",tipIntensityOff:"Mati",tipIntensityLow:"Rendah",tipIntensityStandard:"Standar",shortcutsTitle:"Pintasan",shortcutCommandsLabel:"Perintah",shortcutTimelineLabel:"Timeline",shortcutNewSessionLabel:"Sesi baru",shortcutsPlaceholder:"cth: mod+p",shortcutsHint:"Gunakan mod/ctrl/alt/shift + tombol (a-z, 0-9, F1-F12)."},languageDialog:{title:"Bahasa",hint:"Enter Terapkan • Esc Batal",languageTitle:"Bahasa",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Upaya Berpikir",hint:"Enter Terapkan • Esc Batal",effortTitle:"Upaya Penalaran",applied:"Upaya penalaran diatur ke {effort}",option:{low:"Rendah",medium:"Sedang",high:"Tinggi",xhigh:"Sangat Tinggi",max:"Maks",minimal:"Minimal",none:"Tidak ada",off:"Nonaktif",auto:"Otomatis"}},toolSettingsDialog:{title:"Pengaturan Alat",hint:"Enter Terapkan • Esc Batal",websearchTitle:"Kunci API WebSearch",apiKeyCurrentPrefix:"Saat ini:",apiKeyNotSet:"(belum diatur)",apiKeyInvalidCjk:"API Key tidak boleh berisi karakter Cina.",apiKeyInvalidSpaces:"API Key tidak boleh berisi spasi.",apiKeyPlaceholder:"Tempel Serper API key"},pluginsDialog:{title:"Plugin",hint:"Pilih plugin untuk dikonfigurasi • Esc Tutup",serperSearch:"Serper Search",serperSearchDetail:"Pencarian web via Serper API",configured:"Terkonfigurasi",notConfigured:"Belum dikonfigurasi",serperConfigTitle:"Pengaturan Serper Search",serperConfigHint:"Tab Beralih • Enter Terapkan • Esc Batal"},skillsDialog:{title:"Keterampilan",hint:"Enter Terapkan • Esc Batal",empty:"Tidak ada keterampilan yang tersedia",emptyFiltered:"Tidak ada keterampilan yang cocok"},timelineDialog:{title:"Linimasa",hint:"Tab Filter • Enter Buka • Esc Tutup",empty:"Belum ada pesan",emptyFiltered:"Tidak ada entri yang cocok",filterAll:"Semua pesan",filterUser:"Pesan pengguna",filterTool:"Panggilan alat"},mcpSettingsDialog:{title:"MCP",hint:"Edit file mcp.json untuk mengonfigurasi server MCP • Esc Tutup",configFileLabel:"File konfig:",noServersHint:"Belum ada server MCP yang dikonfigurasi.",serverCount:"{count} server dikonfigurasi",guideText:"Edit file di atas untuk menambah atau mengubah server MCP.",openFile:"Buka File",reload:"Muat Ulang",close:"Tutup",reloaded:"Konfigurasi MCP dimuat ulang.",reloadFailed:"Gagal memuat ulang: {error}",status:"Status",toolCount:"Alat",disabled:"dinonaktifkan",testConnection:"Tes",testing:"Menguji koneksi...",testComplete:"Tes selesai.",testPartial:"Tes selesai dengan error.",testFailed:"Koneksi gagal: {error}",invalidJson:"JSON tidak valid: {error}",invalidShape:'JSON MCP tidak valid: memerlukan "mcpServers".',invalidServer:"Server MCP tidak valid: {name}",noServers:"Tidak ada server MCP ditemukan.",lintOk:"Sintaks JSON OK",lintAt:"{error} (baris {line}, kolom {column})",lintUnclosed:"{char} tidak tertutup (baris {line}, kolom {column})",lintInvalid:"{error}",exampleFormat:"Format contoh:"},toolApprovalsDialog:{title:"Persetujuan Alat",useAuto:"Otomatis",useNormal:"Normal",useStrict:"Ketat",close:"Tutup",focusedTitleAuto:"OTOMATIS",focusedTitleNormal:"NORMAL",focusedTitleStrict:"KETAT",focusedTitleClose:"TUTUP",focusedDescAuto:"Setujui semua pemanggilan alat secara otomatis. Tanpa konfirmasi (tercepat, paling tidak aman).",focusedDescNormal:"Setujui alat read-only otomatis. Konfirmasi sebelum alat tulis/eksekusi.",focusedDescStrict:"Memerlukan konfirmasi untuk setiap pemanggilan alat (paling aman, paling lambat).",focusedDescClose:"Tutup dialog tanpa mengubah pengaturan saat ini.",currentPrefix:"Saat ini: {mode}",tip:"Tip: Tab atau ↑/↓ untuk berpindah tombol, Enter untuk konfirmasi, Esc untuk menutup."},settingsDialog:{pendingApproval:"Selesaikan persetujuan yang tertunda sebelum mengubah pengaturan.",invalidShortcut:"Pintasan tidak valid untuk {label}: {value}",shortcutCommands:"Pintasan perintah",shortcutTimeline:"Pintasan timeline",shortcutNewSession:"Pintasan sesi baru",toolApprovalsApplied:"Persetujuan alat: {mode}",applied:"Pengaturan diterapkan."},exitAppDialog:{title:"Keluar DimCode",confirm:"Keluar sekarang?",warning:"Respons agen masih berjalan. Keluar akan menginterupsinya.",reasonPrefix:"Alasan: {reason}"},approvalDialog:{title:"Setujui Izin Alat",toolLabel:"Alat: {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Izin: {permission} ({risk})",descriptionLabel:"Deskripsi: {description}",commandLabel:"Perintah:",inlineActionHint:"↑/← Sebelumnya ↓/→ Berikutnya Enter Konfirmasi 1/2/3 Pilih",inlineActionHintCompact:"←/→ Pindah Enter Konfirmasi 1/2/3 Pilih",buttons:{approve:"Setujui",alwaysApprove:"Selalu setujui",deny:"Tolak",always:"Selalu",ok:"OK",no:"Tidak",y:"Y",all:"Semua",n:"N"}},askUserDialog:{noQuestionsTitle:"Tidak Ada Pertanyaan",noQuestionsBody:"Tidak ada pertanyaan untuk dijawab.",title:"Pertanyaan {index}/{total}: {header}",defaultHeader:"Pertanyaan",prev:"Sebelumnya",next:"Berikutnya",submit:"Kirim",otherOption:"Lainnya",otherDetail:"Berikan jawaban kustom",inlineHintOptions:"Tombol: ↑↓ untuk berpindah, ←→ untuk ganti pertanyaan, Enter untuk memilih.",inlineHintMulti:"Multi-pilih: Space untuk toggle centang.",inlineHintButtons:"Tab ke tombol, ←→ untuk berpindah, Enter untuk mengaktifkan, ↑ kembali ke opsi.",inlineHintNav:"Ctrl+Left / Ctrl+Right (atau Ctrl+A / Ctrl+E) untuk ganti pertanyaan.",inlineHintSubmit:"Ctrl+Enter untuk kirim, Esc untuk batal.",inlineButtonPrev:"[Sebelumnya]",inlineButtonNext:"[Berikutnya]",inlineButtonSubmit:"[Kirim]",inlineButtonCancel:"[Batal]",inlineActionHint:"Space Pilih ← Sebelumnya → Berikutnya Enter Berikutnya/Kirim Esc Batal",inlineActionHintCompact:"Space Pilih ←/→ Sebelumnya/Berikutnya Enter Berikutnya/Kirim Esc Batal",optionsSummaryAll:"{count} opsi",optionsSummaryVisibleMore:"{count} opsi ({start}-{end}) ↓ lebih",multiSelectHint:"[Multi-pilih] Space untuk toggle, Enter untuk konfirmasi",singleSelectHint:"[Single-pilih] Gunakan panah, Enter untuk konfirmasi",customAnswerLabel:"Jawaban kustom:",customAnswerPlaceholder:"Ketik jawaban Anda...",otherPlaceholder:"Lainnya dipilih — ketik jawaban Anda dan tekan Enter."},nextApiOAuthDialog:{title:"Login DimCode OAuth",copyUrl:"Salin URL",login:"Login",logout:"Logout",statusTitle:"Status",statusAuthenticated:"✓ Login sebagai {email}",statusLoading:"⏳ Mengautentikasi...",statusNotLoggedIn:"✗ Belum login",instructionAuthenticated:"Gunakan ↑↓ untuk navigasi, Enter untuk memilih, atau angka 1-9",instructionLoading:"Tekan C untuk menyalin URL di bawah jika browser tidak terbuka",instructionNeedsSetup:"Periksa redirect_uri, scope, dan status aktif DimCode OAuth, lalu coba lagi",instructionWithUrl:"Tekan C untuk menyalin URL OAuth di bawah, atau tekan Enter untuk membuka browser",instructionUnauthed:"Tekan Enter untuk login dengan DimCode OAuth, atau Esc untuk menutup",instructionManualCallback:"Salin URL di bawah, login di browser, lalu tempel URL pengalihan ke kotak input.",oauthUrlTitleLoading:"URL OAuth (salin jika browser tidak terbuka)",oauthUrlTitleReady:"URL OAuth (siap digunakan)",scrollIndicator:" [{start}-{end} dari {total}]",selectModelTitle:"Pilih Model (↑↓/1-9, Enter untuk memilih){indicator}",aboutTitle:"Tentang DimCode OAuth",setupTitle:"Error login OAuth",aboutBulletOne:"• Menggunakan klien DimCode OAuth bawaan",aboutBulletTwo:"• Mengambil model relay setelah login dan menyimpan konfigurasi provider",aboutBulletThree:"• Menggunakan OAuth refresh token alih-alih API key jangka panjang",viewAllPlans:"Lihat Semua Paket →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"Akun DimCode",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"Membuat URL OAuth...",urlReady:"URL OAuth siap! Salin atau tekan Enter untuk membuka browser.",generateUrlFailed:"Gagal membuat URL OAuth: {error}",startingLogin:"Memulai login OAuth...",browserOpened:"Browser terbuka. Jika tidak, salin URL dari dialog.",copyUrlToLogin:"Salin URL OAuth dari dialog untuk login.",urlCopied:"URL OAuth disalin ke clipboard.",urlCopyFailed:"Gagal menyalin URL OAuth.",authSuccess:"Berhasil mengautentikasi dengan DimCode OAuth!",loginFailed:"Login OAuth gagal: {error}",loggedOut:"Logout dari DimCode OAuth",loggedOutWithRemoteWarning:"Logout dari DimCode OAuth, tapi pencabutan remote gagal: {error}",logoutFailed:"Logout gagal: {error}",initFailed:"Error inisialisasi dialog: {error}",modelSwitched:"Model diubah ke {model}",selectModelFailed:"Gagal memilih model: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Debug",titleDebugging:"Debugging",copy:"salin",proceed:"lanjutkan",fixed:"diperbaiki",body:"Saya telah menambahkan log debug (dan mungkin perbaikan). Silakan coba reproduksi masalahnya, lalu pilih hasilnya."},exitSessionDialog:{title:"Keluar Sesi",confirm:"Keluar dari sesi saat ini dan kembali ke Beranda?",note:"Pesan berikutnya akan memulai sesi baru."},messageActionsDialog:{title:"Aksi Pesan",revert:"Kembalikan pesan",revertWithFiles:"Kembalikan pesan dan perubahan file",revertKeepFiles:"Kembalikan pesan (pertahankan perubahan file)",revertFilesOnly:"Kembalikan perubahan file saja",copy:"Salin teks pesan ke clipboard",fork:"Fork buat sesi baru",pin:"Sematkan pesan",unpin:"Lepas sematan"},pathPickerDialog:{hint:"↑/↓ pilih • Tab autocomplete • Enter konfirmasi • Esc tutup"},providerConnectDialog:{title:"Hubungkan {provider}",providerFallback:"Provider",hint:"Tab pindah • Ctrl+C hapus • Enter Terapkan",hintOpenAI:"Tab pindah • Ctrl+C hapus • Enter Terapkan",hintGemini:"Tab pindah • Ctrl+C hapus • Enter Terapkan",hintAnthropic:"Tab pindah • Ctrl+C hapus • Enter Terapkan",hintGeneric:"Tab pindah • Ctrl+C hapus • Enter Terapkan",applyingHint:"Menguji koneksi, harap tunggu...",applyingButton:"Menerapkan...",testConnection:"Tes koneksi",baseUrlStatusAutoFix:"Perbaikan otomatis: {value}",baseUrlStatusInvalid:"Base URL harus http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API Key",apiKeyPlaceholder:"Tempel key baru untuk memperbarui (biarkan kosong untuk tetap)",apiKeyCurrent:"Saat ini: {value}",apiKeyNotSet:"Saat ini: (belum diatur)",apiKeyInvalidCjk:"API Key tidak boleh berisi karakter Cina.",apiKeyInvalidSpaces:"API Key tidak boleh berisi spasi.",clearKey:"Hapus",useDetectedKey:"Gunakan {name}",disconnectButton:"Putuskan",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"Mati",toggleOn:"Nyala",toggleHint:"Tab pindah • ←/→ ubah • Space toggle"},redoConfirmDialog:{title:"Konfirmasi Redo",body:"Apakah Anda yakin ingin mengembalikan pesan yang dikembalikan?"},renameSessionDialog:{title:"Ganti nama sesi",label:"Nama sesi",placeholder:"cth: Catatan perencanaan"},sessionsDialog:{timeNow:"sekarang",timeMinutes:"{count} mnt",timeHours:"{count} jam",timeDays:"{count} hari",newSession:"Sesi baru",title:"Sesi ({count})",titleScoped:"Sesi ({count}/{total})",scope:"Cakupan: {cwd}",loading:"Memuat…",confirmDelete:"Konfirmasi hapus: tekan Delete lagi",header:"{count} sesi • Tombol panah untuk navigasi • Enter memilih{range}{activity}",headerRange:" • Menampilkan {start}-{end}",runningCount:"{count} berjalan",pausedCount:"{count} menunggu konfirmasi",hint:"Ketik untuk lompat • ←/→ tombol • Enter konfirmasi • Esc tutup",focusPrefix:"Fokus: {focus}",focusList:"Daftar",focusButtons:"Tombol",noSessionsCwd:"Tidak ada sesi di cwd ini",noSessions:"Belum ada sesi tersimpan",nodeOnly:"Sesi hanya tersedia di mode Node/CLI.",newSessionTitle:"Sesi Baru",newSessionTarget:"sesi baru",busy:{agentResponding:"Agen masih merespons",awaitingAskUser:"Menunggu jawaban AskUser",awaitingToolApproval:"Menunggu persetujuan alat",pendingApproval:"Menunggu persetujuan"},buttons:{open:"Buka",delete:"Hapus",deleteConfirm:"Hapus (konfirmasi)",scope:"Cakupan: {scope}",scopeCwd:"CWD",scopeAll:"Semua",refresh:"Segarkan"}},sessionsOverlay:{title:"Sesi",hint:"Enter Pilih • Esc Tutup • Ctrl+R Segarkan • Ctrl+W Lingkup",loading:"Memuat sesi...",empty:"Belum ada sesi tersimpan.",loadingMore:"Memuat lainnya…",hasMore:"↓ lainnya",scope:{cwdOnly:"hanya cwd",allCwd:"semua cwd"}},switchSessionDialog:{title:"Ganti Sesi",confirm:"Ganti & Interupsi",target:"Ganti ke {target}?",fallback:"Ganti sesi sekarang?",warning:"Ini akan menginterupsi respons/alur di sesi aktif.",reason:"Alasan: {reason}"},themeDialog:{title:"Tema",hint:"Enter Terapkan • Esc Batal",mode:"Mode",light:"Terang",dark:"Gelap",unavailable:"Terminal ini tidak mendukung tema yang dapat diganti.",fallback:"Tema fallback ANSI terang/gelap tetap digunakan di sini.",tip:"Tip: default mengikuti tema sistem."},commandPalette:{searchPlaceholder:"Cari…",noMatches:"Tidak ada kecocokan",hint:"Ketik untuk filter • Enter: buka • Esc: tutup",title:"Perintah"},skills:{title:"Keterampilan"},help:{title:"Bantuan",modeLabel:"Mode: {mode}",modeDetail:"Mode asisten saat ini.",shortcutsLabel:"Pintasan",onboarding:`Selamat datang! Mulai cepat:
1146
1146
  1) /connect: hubungkan provider
1147
1147
  2) /models: pilih model
1148
1148
  3) kirim "hello" untuk mulai chat
1149
- Tip: {commandsKey} membuka palet perintah.`,items:{help:"Bantuan & pintasan (F1)",commands:"Palet perintah (Ctrl+P)",back:"Kembali ke lompatan sebelumnya",status:"Alihkan detail status"}},commands:{help:{label:"Bantuan",detail:"Pintasan + perintah umum (F1)"},sessions:{label:"Sesi",detail:"Pilih atau buat sesi (/sessions)"},timeline:{label:"Timeline",detail:"Lompat ke pesan pengguna (/timeline)"},newSession:{label:"Sesi Baru",detail:"Mulai sesi baru (/new)"},connectProvider:{label:"Hubungkan Provider",detail:"Hubungkan provider (/connect)"},models:{label:"Model",detail:"Pilih model (/models)"},toolApprovals:{label:"Persetujuan Alat",detail:"Konfigurasi persetujuan (/approvals)"},toolSettings:{label:"Pengaturan Alat",detail:"Konfigurasi pengaturan alat (/tool-settings)"},mcpHub:{label:"MCP",detail:"Kelola konektor & pengaturan MCP (/mcp)"},plugins:{label:"Plugin",detail:"Kelola plugin (/plugins)"},debug:{label:"Debug",detail:"Log observability SDK (/debug)"},mcpSettings:{label:"MCP (JSON Lanjutan)",detail:"Konfigurasi JSON server MCP mentah (/mcp-settings)"},language:{label:"Bahasa",detail:"Ganti bahasa UI (/language)"},settings:{label:"Pengaturan",detail:"Pengaturan provider kustom (/settings, Ctrl+K)"}},homePage:{multilineTitle:"Teks Multi-baris",multilineTitleWithCount:"Teks Multi-baris ({count} baris)",providerCustom:"Kustom",reviewPrompt:"bantu saya review perubahan kode",footerCwd:"cwd {cwd}",hints:{switchMode:"ganti mode",commands:"perintah"},tips:{greeting:"Selamat datang kembali! Coba {commandsKey} atau {init} untuk memulai.",commandsAlias:"Tip: {key} membuka palet perintah."},prompts:{help:"Bantuan & pintasan (F1)",sessions:"Daftar/pilih sesi",connect:"Hubungkan provider",models:"Pilih model",newSession:"Mulai sesi baru",approvals:"Konfigurasi persetujuan alat (auto/normal/strict)",commands:"Buka palet perintah",toolSettings:"Konfigurasi pengaturan alat",mcpSettings:"Buka MCP",plugins:"Kelola plugin",language:"Ganti bahasa UI",theme:"Pilih tema",status:"Alihkan detail status",review:"Tinjau perubahan kode",init:"Inisialisasi/perbaiki AGENTS.md",skills:"Daftar skill yang dimuat",exit:"Keluar aplikasi",debug:"Dialog debug (chat)",settings:"Pengaturan provider kustom"},commandPalette:{connect:"Hubungkan provider",models:"Pilih model"},commands:{debugLabel:"Debug",debugDetail:"Log observability SDK (/debug)"},toast:{approvalsUsage:"Gunakan /approvals (tanpa on/off).",customProviderOnly:"Pengaturan hanya untuk provider kustom.",redoChatOnly:"Redo hanya tersedia di tampilan chat.",retryChatOnly:"Retry hanya tersedia di tampilan chat.",pinsChatOnly:"Pin hanya tersedia di tampilan chat.",renameChatOnly:"Ganti nama hanya tersedia di tampilan chat (/rename <title>).",commandRemoved:"Perintah ini tidak lagi tersedia: {command}",helpAliasRemoved:"Tekan F1 untuk bantuan.",deleteConfirm:"Tekan Delete lagi untuk konfirmasi.",themeToggled:"Tema: {mode}",pasteImagePending:"Gambar masih diproses. Harap tunggu."}},chatPage:{placeholder:"Tanyakan apa saja... (baris baru: Shift+Enter atau Ctrl+J)",placeholderAwaitingApproval:"Diblokir oleh persetujuan: pilih Setujui / Tolak untuk melanjutkan.",reviewPrompt:"bantu saya review perubahan kode",notification:{approvalTitle:"[Persetujuan Diperlukan] Izin Alat",approvalMessage:"DimCode menunggu persetujuan alat: {tool}.",doneTitle:"[Tugas Selesai]",doneMessage:"DimCode menyelesaikan tugas ini.",doneMessageWithDuration:"DimCode menyelesaikan tugas ini dalam {duration}.",doneMessageWithTools:"DimCode menyelesaikan tugas ini setelah {tools} pemanggilan alat.",doneMessageWithToolsAndDuration:"DimCode menyelesaikan tugas ini dalam {duration} dengan {tools} pemanggilan alat."},headerStats:"{messages} pesan · total {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"Menggabungkan,Berpikir,Mempertimbangkan,Merencanakan,Menganalisis,Mensintesis,Menyempurnakan,Menyusun",modelFallback:"model",mode:{plan:"rencana",agent:"agen",debug:"debug"},status:{approvalsAuto:"OTOMATIS",approvalsAll:"SEMUA",blockedByApproval:"Diblokir oleh persetujuan",awaitingApprovalAction:"Menunggu persetujuan Anda: pilih Setujui / Tolak untuk melanjutkan."},footer:{dragSelect:"seret untuk memilih",openLink:"Ctrl+Klik untuk membuka file atau tautan",esc:"esc",interrupt:"interupsi",approvalPaused:"⏸ Dijeda",approvalPausedHint:"Menunggu persetujuan (Enter untuk memilih).",shortcuts:"Ctrl+K: konfigurasi Ctrl+O: expand/collapse alat & thinking Cmd+Delete/Ctrl+W: hapus input Tab: ganti mode {commandsKey}: perintah",shortcutsCompact:"Ctrl+K: konfigurasi Ctrl+O: alat/thinking Cmd+Delete/Ctrl+W: hapus Tab: ganti mode {commandsKey}: perintah",shortcutsMicro:"Ctrl+O: alat {commandsKey}: perintah",shortcutsMini:"{commandsKey}: perintah"},session:{new:"baru"},timeline:{title:"Timeline",empty:"(kosong)",filterAll:"Semua pesan",filterUser:"Pesan pengguna",filterTool:"Pemanggilan alat"},pins:{title:"Disematkan",empty:"(kosong)"},jumpToBottom:{button:"↓"},prompts:{help:"Bantuan & pintasan (F1)",newSession:"Mulai sesi baru",resume:"Lanjutkan antrian yang dijeda",sessions:"Daftar/pilih sesi",timeline:"Lompat ke pesan pengguna",pins:"Buka pesan yang disematkan",pin:"Sematkan pesan terakhir",back:"Kembali ke lompatan sebelumnya",connect:"Hubungkan provider",models:"Pilih model",theme:"Ganti tema UI",approvals:"Konfigurasi persetujuan alat (auto/normal/strict)",commands:"Buka palet perintah",toolSettings:"Konfigurasi pengaturan alat",mcpSettings:"Buka MCP",plugins:"Kelola plugin",language:"Ganti bahasa UI",status:"Alihkan detail status",review:"Tinjau perubahan kode",retry:"Coba ulang pesan pengguna terakhir",compact:"Kompakkan konteks sesi",init:"Inisialisasi/perbaiki AGENTS.md",rename:"Ganti nama sesi saat ini",skills:"Daftar skill yang dimuat",exit:"Keluar aplikasi",debug:"Dialog debug",settings:"Pengaturan provider kustom"},commands:{pinsLabel:"Pin",pinsDetail:"Buka pesan yang disematkan",backLabel:"Kembali",backDetail:"Kembali ke lompatan sebelumnya",debugLabel:"Debug",debugDetail:"Log observability SDK (/debug)",statusLabel:"Status",statusDetail:"Alihkan detail status",themeLabel:"Tema",themeDetail:"Ganti tema warna"},tips:{contextWarn:"Tip: Konteks hampir penuh. Pertimbangkan /compact atau /new untuk menjaga respons tetap tajam.",contextCritical:"Tip: Anda mendekati batas konteks. Mulai sesi baru dengan /new (atau /compact terlebih dahulu).",timeline:"Tip: Chat panjang? Gunakan /tl untuk kembali ke pesan pengguna tertentu.",timelineAlias:"Tip: /tl adalah alias singkat untuk /timeline.",commandsAlias:"Tip: {key} membuka palet perintah.",errorRecovery:"Tip: Jika ada yang gagal, coba /compact atau /new.",greeting:"Selamat datang kembali! Coba {commandsKey} atau {init} untuk memulai.",compactDelight:"Bagus! Menjaga konteks ringan membantu.",addTests:'Selesai! Mau saya tambahkan tes? Balas "yes" atau "ok".'},confirm:{addTests:"Silakan tambahkan tes untuk perubahan yang baru saja kami buat."},toast:{customProviderOnly:"Pengaturan hanya untuk provider kustom.",renameNodeOnly:"Ganti nama hanya tersedia di mode Node/CLI.",noActiveSession:"Tidak ada sesi aktif untuk diganti namanya.",sessionNameEmpty:"Nama sesi tidak boleh kosong.",sessionRenamed:"Nama sesi diubah ke: {title}",renameFailed:"Gagal mengganti nama sesi.",linkOpenHint:"Tip: Ctrl+Klik untuk membuka file atau tautan.",copySuccess:"Disalin",copyFailed:"Gagal menyalin",forkFailed:"Gagal fork sesi.",backEmpty:"Tidak ada lompatan sebelumnya untuk kembali.",pinsEmpty:"Belum ada pesan yang disematkan.",pinEmpty:"Belum ada pesan untuk disematkan.",pinned:"Pesan disematkan.",unpinned:"Sematan pesan dilepas.",debugUnavailable:"Server debug tidak tersedia.",approvalsUsage:"Gunakan /approvals (tanpa on/off).",debugDialogOpened:"Dialog debug dibuka.",debugDialogClosed:"Dialog debug ditutup.",renameUsage:"Penggunaan: /rename <title>",themeToggled:"Tema: {mode}",statusCompactOn:"Status: ringkas",statusCompactOff:"Status: detail",compactingSession:"Mengkompakkan sesi...",compactSuccess:"Sesi dikompakkan: {message}",compactWarning:"Sesi dikompakkan dengan peningkatan terbatas: {message}",compactSuccessDetailWithTokens:"Melipat {count} pesan historis pertama menjadi ringkasan. Input estimasi {before} -> {after} token, menghemat sekitar {saved} token.",compactSuccessDetailNotReduced:"Melipat {count} pesan historis pertama menjadi ringkasan, tapi input estimasi berubah dari {before} ke {after} token, jadi ini tidak mengurangi ukuran permintaan.",compactSuccessDetailCountOnly:"Melipat {count} pesan historis pertama menjadi ringkasan.",compactSuccessDetailSummaryOnly:"Menghasilkan ringkasan percakapan baru.",compactFailed:"Gagal mengkompakkan sesi: {error}",compactFailedTokenLimit:"Kompaksi gagal karena anggaran konteks tidak cukup. Atur DIMCODE_CONTEXT_WINDOW dengan benar, ganti ke model konteks lebih besar, atau gunakan /new. Detail: {error}",retryEmpty:"Tidak ada pesan pengguna sebelumnya untuk dicoba ulang.",commandRemoved:"Perintah ini tidak lagi tersedia: {command}",helpAliasRemoved:"Tekan F1 untuk bantuan.",waitForResponse:"Harap tunggu respons saat ini selesai, atau tekan Esc untuk menginterupsi.",pasteImagePending:"Gambar masih diproses. Harap tunggu.",pendingApproval:"Harap tangani tool_approve terlebih dahulu.",awaitingApprovalAction:"Dijeda: diperlukan tindakan. Pilih Setujui / Selalu setujui / Tolak di kartu izin.",awaitingApprovalStillWaiting:"Masih menunggu persetujuan ({seconds}d). Model tidak akan melanjutkan sampai Anda menyetujui atau menolak.",pendingAskUser:"Harap tangani ask_user terlebih dahulu.",notificationSessionBusy:"Notifikasi ini milik sesi lain yang sibuk. Selesaikan pekerjaan itu atau ganti sesi secara manual terlebih dahulu.",notificationSessionUnavailable:"Tidak dapat membuka sesi untuk notifikasi ini di sini.",notificationSessionSwitchFailed:"Gagal membuka sesi untuk notifikasi ini.",approvalNotActive:"Persetujuan ini dalam antrian. Selesaikan yang aktif terlebih dahulu.",askUserNotActive:"Permintaan ask_user ini tidak lagi aktif."}},chatQueue:{label:"Antrian ({count})",labelCompact:"Antrian {count}",more:"+{count} lagi…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"lanjutkan antrian",state:{idle:"Tertunda",running:"Berjalan",paused:"Dijeda",error:"Error"},item:{steerAction:"Arahkan",steerReady:"Pertama",steerPending:"Berikutnya",steerPaused:"Dijeda"},toast:{enqueued:"Ditambahkan ke antrian (#{count}).",full:"Antrian penuh (maks 5). Hapus satu atau mulai /new.",cleared:"Menghapus {count} item antrian.",deleted:"Menghapus {count} item antrian. Ctrl+Z untuk undo.",steerPromoted:"Ditingkatkan ke steer. Akan berjalan pertama saat antrian dilanjutkan.",steerQueued:"Steer tidak dapat disuntikkan segera. Dipromosikan dan akan berjalan pertama di ronde berikutnya.",steerSent:"Steer diterima. Akan disuntikkan sebelum pemanggilan model berikutnya di ronde ini.",undo:"Penghapusan antrian dibatalkan.",pausedTip:"Antrian dijeda. Gunakan {resume} atau {resumeText} untuk melanjutkan, atau kirim pesan baru untuk memilih apa yang harus dilakukan.",stale:"Antrian dijeda: permintaan tampaknya macet."},confirm:{title:"Lanjutkan pesan antrian?",description:"Permintaan sebelumnya tidak selesai. {count} pesan antrian menunggu.",hint:"Lanjutkan mengirim item berikutnya, atau jeda antrian.",continue:"Lanjutkan",pause:"Jeda",reason:"Alasan: {reason}"},reason:{network_error:"Kesalahan jaringan.",timeout:"Permintaan habis waktu.",canceled_by_user:"Dibatalkan oleh pengguna.",rate_limited:"Dibatasi laju.",config_unavailable:"Konfigurasi tersimpan tidak tersedia.",unknown:"Permintaan gagal."},draftDecision:{title:"Antrian dijeda",description:"{count} pesan antrian masih menunggu. Putuskan apa yang harus dilakukan dengan input baru Anda.",previewLabel:"Input baru:",continue:"Lanjutkan antrian",append:"Tambahkan ke antrian",replace:"Buang antrian & kirim"}},chatStatus:{done:"Selesai.",error:"Error.",interrupted:"Diinterupsi.",permissionDenied:"Izin ditolak.",planning:"Merencanakan…",drafting:"Membuat draf…",retrying:"Mencoba ulang ({retry}/{maxAttempts})…",runningTool:"Menjalankan {tool}…",runningTools:"Menjalankan {count} alat…",approvalPendingOther:"Persetujuan lain tertunda ({permission})…",awaitingApproval:"Menunggu persetujuan…",awaitingApprovalWithPerm:"Menunggu persetujuan ({permission})…",awaitingApprovalWithRisk:"Menunggu persetujuan ({risk})…",awaitingAnswers:"Menunggu jawaban…",resumingApproved:"Disetujui. Melanjutkan…",resumingDenied:"Ditolak. Melanjutkan…",resuming:"Melanjutkan…",autoApprovingWithRisk:"Otomatis menyetujui ({risk})…",riskFallback:"risiko",toolFallback:"alat",thinking:"Berpikir…",autoCompactionRequired:"Konteks mendekati batas. Kompaksi diperlukan terlebih dahulu.",autoCompactionRequiredDetailed:"Konteks mendekati batas · permintaan berikutnya diperkirakan {estimated} token, dan kompaksi otomatis dimulai pada {threshold} token, jadi kompaksi diperlukan terlebih dahulu.",compressed:"Konteks dikompaksi · melipat {removed} pesan lama menjadi ringkasan, menghemat sekitar {saved} token input ({elapsed}ms)",autoCompactedDetailed:"Kompaksi otomatis selesai · melipat {removed} pesan lama menjadi ringkasan, input estimasi {before} -> {after} token, menghemat sekitar {saved} token",autoCompactedNotReduced:"Kompaksi otomatis selesai · melipat {removed} pesan lama menjadi ringkasan, tapi input estimasi berubah dari {before} ke {after} token, jadi ini tidak mengurangi ukuran permintaan",autoCompactedSaved:"Kompaksi otomatis selesai · melipat {removed} pesan lama menjadi ringkasan, menghemat sekitar {saved} token",autoCompactedCountOnly:"Kompaksi otomatis selesai · melipat {removed} pesan lama menjadi ringkasan",interruptedMarkdown:"> **Diinterupsi** · Respons dibatalkan oleh pengguna (`Esc`).",awaitingApprovalPrefix:"Menunggu persetujuan",awaitingAnswersPrefix:"Menunggu jawaban",approvalPendingPrefix:"Persetujuan lain tertunda",autoApprovingPrefix:"Otomatis menyetujui"},chatParts:{thinking:"Berpikir",plan:"Rencana",todo:"Todo"},chatRender:{userLabel:"pengguna",outputLabel:"↳ output",outputLabelShort:"out:",canceled:"dibatalkan",inputLabel:"in:",collapse:"... (lipat)",moreLines:"... ({count} baris lagi)",moreLinesOmitted:"... ({count} baris dihilangkan; atur {envVar} untuk menambah)",streamingTail:"… (streaming: menampilkan {shown} karakter terakhir; {omitted} dihilangkan)",copy:"Salin",userResponses:"Respons pengguna:",approvalQueued:"Menunggu persetujuan sebelumnya...",proposedPlan:{title:"Rencana yang Diusulkan"},llmMeta:{changedFiles:"Mengubah {count} file: {files}",changedFilesMore:"+{count} lagi",revertHint:"Tip: Klik pesan ini -> Kembalikan pesan untuk membatalkan putaran ini.",changedFilesCardTitle:"mengubah {count} file:",revertButton:"Kembalikan"},toolName:{explore:"Jelajahi",subagent:"Subagen"},toolSuffix:{offset:"offset {value}",limit:"limit {value}",matches:"{count} kecocokan",todos:"{count} todo",results:"{count} hasil",results_one:"{count} hasil"},toolGroup:{readFiles:"Baca {count} file",writeFiles:"Tulis {count} file",editFiles:"Edit {count} file",globPatterns:"Glob {count} pola",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} pola",bashCommands:"Jalankan {count} perintah",searchQueries:"Cari {count} kueri",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"Pencarian mungkin mengakses jaringan.",bash:"Bash dapat mengeksekusi perintah.",edit:"Perubahan file dapat mengubah file lokal.",grep:"Grep mungkin membaca file lokal."},inlineHint:"Tombol: ↑↓←→ untuk berpindah, Enter untuk memilih.",awaitingUserAction:"Menunggu tindakan Anda: pilih Setujui / Selalu setujui / Tolak.",decision:{userDenied:"Pengguna menolak persetujuan"},denied:{title:"# Izin alat ditolak",toolLine:"- alat: `{tool}`",permissionLine:"- izin: `{permission}`",hint:"Anda dapat memilih ulang tool_call dan mencoba lagi."},summary:{title:"# Alat disetujui & dieksekusi",permissionLine:"Izin `{permission}` disetujui untuk `{tool}`."},required:"Persetujuan diperlukan ({risk}).",args:{commandWithDescription:"Perintah: {command} - {description}",command:"Perintah: {command}",description:"Deskripsi: {description}",raw:"Args: {args}"}},pathPicker:{titleWorkspace:"Pilih Workspace",titleFile:"Pilih File",placeholderWorkspace:"Ketik jalur (../ dll). Tab untuk autocomplete. Enter memilih direktori.",placeholderFile:"Ketik jalur (../ dll). Tab untuk autocomplete. Enter memilih file."},providerDialogs:{customLabel:"Kustom",customDetail:"kustom",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Login dengan DimCode OAuth",addCustomLabel:"Tambah provider kustom",addCustomDetail:"tambah provider kustom",providerFallback:"Provider",adapter:{openai:"OpenAI",openaiOpenRouter:"Kompatibel OpenAI (OpenRouter)",openaiLocal:"Kompatibel OpenAI (Endpoint lokal)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Terkonfigurasi",notConfigured:"Belum dikonfigurasi"},manage:{title:"Provider kustom: {provider}",connect:"Hubungkan",connectDetail:"Edit API Key / Base URL",rename:"Ganti nama",renameDetail:"Edit nama provider",models:"Edit model",modelsDetail:"Perbarui ID model yang tersedia",delete:"Hapus",deleteDetail:"Hapus provider ini"},deleteConfirm:{title:"Hapus {provider}?",confirm:"Hapus (konfirmasi)",confirmDetail:"Ini tidak dapat dibatalkan",cancelDetail:"Pertahankan provider"},nameDialog:{title:"Nama provider kustom",label:"Nama provider",placeholder:"cth: DeepSeek (Proxy)"},modelsDialog:{title:"Model provider kustom",modelsTitle:"Model",modelsPlaceholder:"ID Model (, atau baris baru)",hint:", / baris baru • Shift+Enter baris baru • Enter Terapkan",fetch:"Ambil model",fetching:"Mengambil model…"},modelsFetchDialog:{title:"Pilih model",searchPlaceholder:"Filter model",hint:"Space toggle • Enter konfirmasi • Esc batal"},toast:{modelSet:"Model diatur ke {provider} / {model}.",noModels:"Belum ada model tersedia. Hubungkan provider terlebih dahulu (/connect).",connectFirst:"Harap hubungkan provider terlebih dahulu (/connect) sebelum mengirim pesan pertama.",apiKeyRequired:"API Key diperlukan.",baseUrlRequired:"Base URL diperlukan.",baseUrlInvalid:"Base URL harus dimulai dengan http:// atau https://",connected:"Terhubung ke {provider}.",connectedSelectModel:"Terhubung ke {provider}. Pilih model.",connectedCheckFailed:"Terhubung ke {provider}, tapi self-check gagal: {reason}",connectionTestPassed:"Tes koneksi berhasil: {provider}.",connectionTestFailed:"Tes koneksi gagal: {provider} - {reason}",connectionActionUpdateKey:"Tindakan: buka kembali Hubungkan dan perbarui API key, lalu tes lagi.",connectionActionFixBaseUrl:"Tindakan: periksa jalur Base URL (biasanya berakhiran /v1), lalu tes lagi.",connectionActionSwitchKey:"Tindakan: tunggu sebentar atau ganti ke key/provider lain.",connectionActionRetryTest:"Tindakan: periksa jaringan/proxy dan jalankan Tes koneksi lagi.",noModelsFetching:"Belum ada model. Mengambil daftar model…",firstUseGuide:'Mulai cepat: 1) /connect 2) /models 3) kirim "hello"',firstUseSendHello:'Langkah berikutnya: kirim pesan pertama Anda (contoh: "hello").',connectionCheckUnauthorized:"401 Tidak Sah: periksa API key dan tipe provider.",connectionCheckForbidden:"403 Dilarang: key Anda mungkin tidak memiliki akses ke provider/model ini.",connectionCheckNotFound:"404 Tidak Ditemukan: periksa jalur Base URL (OpenAI-compatible biasanya berakhiran /v1).",connectionCheckRateLimited:"429 Dibatasi laju: tunggu dan coba lagi, atau ganti ke key/provider lain.",connectionCheckTimeout:"Koneksi habis waktu: periksa jaringan/proxy dan coba lagi.",connectionCheckNetwork:"Koneksi jaringan gagal: periksa DNS/proxy/Base URL.",connectionCheckFailed:"Pemeriksaan koneksi gagal: {error}",apiKeyCleared:"API key dihapus untuk {provider}.",customAdded:"Provider kustom ditambahkan: {provider}.",customRenamed:"Provider kustom diganti nama: {provider}.",customModelsUpdated:"Model provider kustom diperbarui: {provider}.",customDeleted:"Provider kustom dihapus: {provider}.",modelsRequired:"Tambahkan setidaknya satu model.",modelsEmpty:"Tidak ada model ditemukan.",modelsFetchFailed:"Gagal mengambil model: {error}",modelsFetchChatCompletions:"Daftar model tidak didukung untuk base URL /chat/completions atau /responses.",manualModelsRequired:"Endpoint ini tidak mendukung penemuan model otomatis. Silakan masukkan nama model secara manual di konfigurasi model.",nameRequired:"Nama provider diperlukan.",nameConflict:"Nama provider sudah ada."}},copyToast:{copiedToClipboard:"Disalin ke clipboard"}};var ja_default2={common:{apply:"適用",cancel:"キャンセル",close:"閉じる",confirm:"確認",yes:"はい",no:"いいえ",exit:"終了",back:"戻る",next:"次へ",save:"保存",empty:"—",unknownError:"不明なエラー",inputClearTip:"Ctrl+C クリア",total:"合計"},configDialog:{title:"設定",hint:"Tab/Shift+Tab フィールド切替 • Enter 適用 • Esc キャンセル",modelsTitle:"モデル(カスタム)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"コンテキストウィンドウ",contextWindowLocked:"コンテキストウィンドウ(モデル定義)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperature",temperaturePlaceholder:"0.7",temperatureValidationError:"Temperature: 数値と「.」のみ",maxTokensTitle:"最大出力トークン",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL(OpenAI 互換)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"現在:",apiKeyNotSet:"(未設定)",apiKeyTitle:"API キー",apiKeyPlaceholder:"新しいキーを貼り付け(空欄で保持)",interleavedThinkingTitle:"インターリーブ思考(Space で切替)",interleavedThinkingLocked:"インターリーブ思考(モデル定義)",interleavedThinkingOpen:"オン",interleavedThinkingClose:"オフ",tipIntensityTitle:"ヒント表示",tipIntensityOff:"オフ",tipIntensityLow:"低",tipIntensityStandard:"標準",shortcutsTitle:"ショートカット",shortcutCommandsLabel:"コマンド",shortcutTimelineLabel:"タイムライン",shortcutNewSessionLabel:"新セッション",shortcutsPlaceholder:"例: mod+p",shortcutsHint:"mod/ctrl/alt/shift + キー(a-z, 0-9, F1-F12)"},languageDialog:{title:"言語",hint:"Enter 適用 • Esc キャンセル",languageTitle:"言語",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"思考の強度",hint:"Enter 適用 • Esc キャンセル",effortTitle:"推論の強度",applied:"推論の強度を {effort} に設定しました",option:{low:"低",medium:"中",high:"高",xhigh:"超高",max:"最大",minimal:"最小",none:"なし",off:"オフ",auto:"自動"}},toolSettingsDialog:{title:"ツール設定",hint:"Enter 適用 • Esc キャンセル",websearchTitle:"WebSearch API キー",apiKeyCurrentPrefix:"現在:",apiKeyNotSet:"(未設定)",apiKeyInvalidCjk:"API Keyに中国語文字を含めることはできません。",apiKeyInvalidSpaces:"API Keyにスペースを含めることはできません。",apiKeyPlaceholder:"Serper API キーを貼り付け"},pluginsDialog:{title:"プラグイン",hint:"プラグインを選択して設定 • Esc 閉じる",serperSearch:"Serper Search",serperSearchDetail:"Serper API でウェブ検索",configured:"設定済み",notConfigured:"未設定",serperConfigTitle:"Serper Search 設定",serperConfigHint:"Tab 切替 • Enter 適用 • Esc キャンセル"},skillsDialog:{title:"スキル",hint:"Enter 適用 • Esc キャンセル",empty:"利用可能なスキルがありません",emptyFiltered:"一致するスキルがありません"},timelineDialog:{title:"タイムライン",hint:"Tab フィルター • Enter 開く • Esc 閉じる",empty:"まだメッセージがありません",emptyFiltered:"一致する項目がありません",filterAll:"すべてのメッセージ",filterUser:"ユーザーメッセージ",filterTool:"ツール呼び出し"},mcpSettingsDialog:{title:"MCP",hint:"mcp.json を編集して MCP サーバーを設定 • Esc 閉じる",configFileLabel:"設定ファイル:",noServersHint:"MCP サーバーが未設定です。",serverCount:"{count} 件のサーバーを設定済み",guideText:"上のファイルを編集して MCP サーバーを追加・変更してください。",openFile:"ファイルを開く",reload:"再読込",close:"閉じる",reloaded:"MCP 設定を再読込しました。",reloadFailed:"再読込失敗:{error}",status:"ステータス",toolCount:"ツール数",disabled:"無効",testConnection:"テスト",testing:"接続テスト中...",testComplete:"テスト完了。",testPartial:"テスト完了(エラーあり)。",testFailed:"接続失敗:{error}",invalidJson:"無効な JSON:{error}",invalidShape:'無効な MCP JSON:"mcpServers" が必要です。',invalidServer:"無効な MCP サーバー:{name}",noServers:"MCP サーバーが見つかりません。",lintOk:"JSON 構文 OK",lintAt:"{error}({line} 行, {column} 列)",lintUnclosed:"閉じられていない {char}({line} 行, {column} 列)",lintInvalid:"{error}",exampleFormat:"例:"},toolApprovalsDialog:{title:"ツール承認",useAuto:"自動",useNormal:"通常",useStrict:"厳格",close:"閉じる",focusedTitleAuto:"自動",focusedTitleNormal:"通常",focusedTitleStrict:"厳格",focusedTitleClose:"閉じる",focusedDescAuto:"すべてのツール呼び出しを自動承認(最速、最も危険)。",focusedDescNormal:"読み取り専用ツールは自動承認、書き込み/実行ツールは確認。",focusedDescStrict:"すべてのツール呼び出しで確認が必要(最安全、最遅)。",focusedDescClose:"現在の設定を変更せずに閉じる。",currentPrefix:"現在:{mode}",tip:"ヒント:Tab または ↑/↓ でボタン間を移動、Enter で確認、Esc で閉じる。"},settingsDialog:{pendingApproval:"保留中の承認を処理してから設定を変更してください。",invalidShortcut:"無効なショートカット:{label}({value})",shortcutCommands:"コマンドショートカット",shortcutTimeline:"タイムラインショートカット",shortcutNewSession:"新セッションショートカット",toolApprovalsApplied:"ツール承認:{mode}",applied:"設定を適用しました。"},exitAppDialog:{title:"DimCode 終了",confirm:"終了しますか?",warning:"エージェントの応答が進行中です。終了すると中断されます。",reasonPrefix:"理由:{reason}"},approvalDialog:{title:"ツール権限の承認",toolLabel:"ツール:{tool}{suffix}",toolLabelSuffix:"({description})",permissionLabel:"権限:{permission}({risk})",descriptionLabel:"説明:{description}",commandLabel:"コマンド:",inlineActionHint:"↑/← 前 ↓/→ 次 Enter 確認 1/2/3 選択",inlineActionHintCompact:"←/→ 移動 Enter 確認 1/2/3 選択",buttons:{approve:"承認",alwaysApprove:"常に承認",deny:"拒否",always:"常に",ok:"OK",no:"いいえ",y:"Y",all:"全",n:"N"}},askUserDialog:{noQuestionsTitle:"質問なし",noQuestionsBody:"回答すべき質問はありません。",title:"質問 {index}/{total}:{header}",defaultHeader:"質問",prev:"前へ",next:"次へ",submit:"送信",otherOption:"その他",otherDetail:"カスタム回答を入力",inlineHintOptions:"↑↓ 移動、←→ 質問切替、Enter 選択。",inlineHintMulti:"複数選択:Space でチェック切替。",inlineHintButtons:"Tab でボタンへ、←→ 切替、Enter 実行、↑ で選択肢に戻る。",inlineHintNav:"Ctrl+Left / Ctrl+Right(または Ctrl+A / Ctrl+E)で質問切替。",inlineHintSubmit:"Ctrl+Enter で送信、Esc でキャンセル。",inlineButtonPrev:"[前へ]",inlineButtonNext:"[次へ]",inlineButtonSubmit:"[送信]",inlineButtonCancel:"[キャンセル]",inlineActionHint:"Space 選択 ← 前 → 次 Enter 次/送信 Esc キャンセル",inlineActionHintCompact:"Space 選択 ←/→ 前/次 Enter 次/送信 Esc キャンセル",optionsSummaryAll:"{count} 件の選択肢",optionsSummaryVisibleMore:"{count} 件({start}-{end})↓ 続き",multiSelectHint:"[複数選択] Space で切替、Enter で確定",singleSelectHint:"[単一選択] 方向キーで移動、Enter で確定",customAnswerLabel:"カスタム回答:",customAnswerPlaceholder:"回答を入力…",otherPlaceholder:"「その他」選択中 — 回答を入力し Enter で確定。"},nextApiOAuthDialog:{title:"DimCode OAuth ログイン",copyUrl:"URL をコピー",login:"ログイン",logout:"ログアウト",statusTitle:"ステータス",statusAuthenticated:"✓ ログイン済み:{email}",statusLoading:"⏳ 認証中…",statusNotLoggedIn:"✗ 未ログイン",instructionAuthenticated:"↑↓ で移動、Enter で選択、1-9 で直接選択",instructionLoading:"ブラウザが開かない場合、C キーで下の URL をコピー",instructionNeedsSetup:"DimCode OAuth の redirect_uri、scope、有効状態を確認して再試行してください",instructionWithUrl:"C キーで OAuth URL をコピー、または Enter でブラウザを開く",instructionUnauthed:"Enter で DimCode OAuth ログイン、Esc で閉じる",instructionManualCallback:"下の URL をコピーしてブラウザでサインインし、リダイレクトされた URL を入力欄に貼り付けてください。",oauthUrlTitleLoading:"OAuth URL(ブラウザ未開時はコピー)",oauthUrlTitleReady:"OAuth URL(使用可能)",scrollIndicator:" [{start}-{end} / 全 {total}]",selectModelTitle:"モデル選択(↑↓/1-9、Enter で選択){indicator}",aboutTitle:"DimCode OAuth について",setupTitle:"OAuth ログインエラー",aboutBulletOne:"• 内蔵 DimCode OAuth クライアントを使用",aboutBulletTwo:"• ログイン後にリレーモデルを取得してプロバイダー設定を保存",aboutBulletThree:"• 長期間の API キーの代わりに OAuth リフレッシュトークンを使用",viewAllPlans:"すべてのプランを見る →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"DimCode アカウント",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"OAuth URL を生成中…",urlReady:"OAuth URL の準備完了!コピーするか Enter でブラウザを開いてください。",generateUrlFailed:"OAuth URL の生成に失敗:{error}",startingLogin:"OAuth ログインを開始…",browserOpened:"ブラウザを開きました。開かない場合はダイアログから URL をコピーしてください。",copyUrlToLogin:"ダイアログから OAuth URL をコピーしてログインしてください。",urlCopied:"OAuth URL をクリップボードにコピーしました。",urlCopyFailed:"OAuth URL のコピーに失敗しました。",authSuccess:"DimCode OAuth 認証に成功しました!",loginFailed:"OAuth ログイン失敗:{error}",loggedOut:"DimCode OAuth からログアウトしました",loggedOutWithRemoteWarning:"DimCode OAuth からログアウトしましたが、リモート無効化に失敗:{error}",logoutFailed:"ログアウト失敗:{error}",initFailed:"ダイアログの初期化エラー:{error}",modelSwitched:"モデルを切り替えました:{model}",selectModelFailed:"モデルの選択に失敗:{error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"デバッグ",titleDebugging:"デバッグ中",copy:"コピー",proceed:"続行",fixed:"修正済み",body:"デバッグログ(および修正)を追加しました。問題を再現してから結果を選択してください。"},exitSessionDialog:{title:"セッション終了",confirm:"現在のセッションを終了してホームに戻りますか?",note:"次のメッセージで新しいセッションが開始されます。"},messageActionsDialog:{title:"メッセージ操作",revert:"メッセージを差し戻し",revertWithFiles:"メッセージとファイル変更を差し戻し",revertKeepFiles:"メッセージを差し戻し(ファイル変更は保持)",revertFilesOnly:"ファイル変更のみ差し戻し",copy:"メッセージテキストをクリップボードにコピー",fork:"フォークして新セッション作成",pin:"メッセージをピン留め",unpin:"ピン留めを解除"},pathPickerDialog:{hint:"↑/↓ 選択 • Tab 補完 • Enter 確定 • Esc 閉じる"},providerConnectDialog:{title:"{provider} に接続",providerFallback:"プロバイダー",hint:"Tab 切替 • Ctrl+C クリア • Enter 適用",hintOpenAI:"Tab 切替 • Ctrl+C クリア • Enter 適用",hintGemini:"Tab 切替 • Ctrl+C クリア • Enter 適用",hintAnthropic:"Tab 切替 • Ctrl+C クリア • Enter 適用",hintGeneric:"Tab 切替 • Ctrl+C クリア • Enter 適用",applyingHint:"接続テスト中...",applyingButton:"適用中...",testConnection:"接続テスト",baseUrlStatusAutoFix:"自動修正:{value}",baseUrlStatusInvalid:"Base URL は http(s) である必要があります",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API キー",apiKeyPlaceholder:"新しいキーを貼り付け(空欄で保持)",apiKeyCurrent:"現在:{value}",apiKeyNotSet:"現在:(未設定)",apiKeyInvalidCjk:"API Keyに中国語文字を含めることはできません。",apiKeyInvalidSpaces:"API Keyにスペースを含めることはできません。",clearKey:"削除",useDetectedKey:"{name} を使用",disconnectButton:"切断",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"オフ",toggleOn:"オン",toggleHint:"Tab 切替 • ←/→ 変更 • Space 切替"},redoConfirmDialog:{title:"再実行の確認",body:"差し戻したメッセージを復元しますか?"},renameSessionDialog:{title:"セッション名変更",label:"セッション名",placeholder:"例:企画メモ"},sessionsDialog:{timeNow:"たった今",timeMinutes:"{count} 分前",timeHours:"{count} 時間前",timeDays:"{count} 日前",newSession:"新セッション",title:"セッション({count})",titleScoped:"セッション({count}/{total})",scope:"スコープ:{cwd}",loading:"読込中…",confirmDelete:"削除確認:もう一度 Delete を押してください",header:"{count} 件 • 方向キーで移動 • Enter で選択{range}{activity}",headerRange:" • {start}-{end} を表示",runningCount:"{count} 件実行中",pausedCount:"{count} 件確認待ち",hint:"入力で検索 • ←/→ ボタン • Enter 確定 • Esc 閉じる",focusPrefix:"フォーカス:{focus}",focusList:"リスト",focusButtons:"ボタン",noSessionsCwd:"このディレクトリにセッションはありません",noSessions:"保存されたセッションはありません",nodeOnly:"セッションは Node/CLI モードのみ利用可能です。",newSessionTitle:"新セッション",newSessionTarget:"新しいセッション",busy:{agentResponding:"エージェントが応答中",awaitingAskUser:"AskUser の回答待ち",awaitingToolApproval:"ツール承認待ち",pendingApproval:"承認待ち"},buttons:{open:"開く",delete:"削除",deleteConfirm:"削除(確認)",scope:"スコープ:{scope}",scopeCwd:"CWD",scopeAll:"すべて",refresh:"更新"}},sessionsOverlay:{title:"セッション",hint:"Enter 選択 • Esc 閉じる • Ctrl+R 更新",loading:"セッションを読み込み中...",empty:"保存されたセッションはまだありません。"},switchSessionDialog:{title:"セッション切替",confirm:"切替して中断",target:"{target} に切り替えますか?",fallback:"セッションを切り替えますか?",warning:"現在のセッションの応答/処理が中断されます。",reason:"理由:{reason}"},themeDialog:{title:"テーマ",hint:"Enter 適用 • Esc キャンセル",mode:"モード",light:"ライト",dark:"ダーク",unavailable:"この端末ではテーマ切替に対応していません。",fallback:"固定のライト/ダーク ANSI フォールバックテーマが使用されます。",tip:"ヒント:デフォルトはシステムテーマに従います。"},commandPalette:{searchPlaceholder:"検索…",noMatches:"一致なし",hint:"入力で絞込 • Enter: 実行 • Esc: 閉じる",title:"コマンド"},skills:{title:"スキル"},help:{title:"ヘルプ",modeLabel:"モード:{mode}",modeDetail:"現在のアシスタントモード。",shortcutsLabel:"ショートカット",onboarding:`ようこそ!クイックスタート:
1149
+ Tip: {commandsKey} membuka palet perintah.`,items:{help:"Bantuan & pintasan (F1)",commands:"Palet perintah (Ctrl+P)",back:"Kembali ke lompatan sebelumnya",status:"Alihkan detail status"}},commands:{help:{label:"Bantuan",detail:"Pintasan + perintah umum (F1)"},sessions:{label:"Sesi",detail:"Pilih atau buat sesi (/sessions)"},timeline:{label:"Timeline",detail:"Lompat ke pesan pengguna (/timeline)"},newSession:{label:"Sesi Baru",detail:"Mulai sesi baru (/new)"},connectProvider:{label:"Hubungkan Provider",detail:"Hubungkan provider (/connect)"},models:{label:"Model",detail:"Pilih model (/models)"},toolApprovals:{label:"Persetujuan Alat",detail:"Konfigurasi persetujuan (/approvals)"},toolSettings:{label:"Pengaturan Alat",detail:"Konfigurasi pengaturan alat (/tool-settings)"},mcpHub:{label:"MCP",detail:"Kelola konektor & pengaturan MCP (/mcp)"},plugins:{label:"Plugin",detail:"Kelola plugin (/plugins)"},debug:{label:"Debug",detail:"Log observability SDK (/debug)"},mcpSettings:{label:"MCP (JSON Lanjutan)",detail:"Konfigurasi JSON server MCP mentah (/mcp-settings)"},language:{label:"Bahasa",detail:"Ganti bahasa UI (/language)"},settings:{label:"Pengaturan",detail:"Pengaturan provider kustom (/settings, Ctrl+K)"}},homePage:{multilineTitle:"Teks Multi-baris",multilineTitleWithCount:"Teks Multi-baris ({count} baris)",providerCustom:"Kustom",reviewPrompt:"bantu saya review perubahan kode",footerCwd:"cwd {cwd}",hints:{switchMode:"ganti mode",commands:"perintah"},tips:{greeting:"Selamat datang kembali! Coba {commandsKey} atau {init} untuk memulai.",commandsAlias:"Tip: {key} membuka palet perintah."},prompts:{help:"Bantuan & pintasan (F1)",sessions:"Daftar/pilih sesi",connect:"Hubungkan provider",models:"Pilih model",newSession:"Mulai sesi baru",approvals:"Konfigurasi persetujuan alat (auto/normal/strict)",commands:"Buka palet perintah",toolSettings:"Konfigurasi pengaturan alat",mcpSettings:"Buka MCP",plugins:"Kelola plugin",language:"Ganti bahasa UI",theme:"Pilih tema",status:"Alihkan detail status",review:"Tinjau perubahan kode",init:"Inisialisasi/perbaiki AGENTS.md",skills:"Daftar skill yang dimuat",exit:"Keluar aplikasi",debug:"Dialog debug (chat)",settings:"Pengaturan provider kustom"},commandPalette:{connect:"Hubungkan provider",models:"Pilih model"},commands:{debugLabel:"Debug",debugDetail:"Log observability SDK (/debug)"},toast:{approvalsUsage:"Gunakan /approvals (tanpa on/off).",customProviderOnly:"Pengaturan hanya untuk provider kustom.",redoChatOnly:"Redo hanya tersedia di tampilan chat.",retryChatOnly:"Retry hanya tersedia di tampilan chat.",pinsChatOnly:"Pin hanya tersedia di tampilan chat.",renameChatOnly:"Ganti nama hanya tersedia di tampilan chat (/rename <title>).",commandRemoved:"Perintah ini tidak lagi tersedia: {command}",helpAliasRemoved:"Tekan F1 untuk bantuan.",deleteConfirm:"Tekan Delete lagi untuk konfirmasi.",themeToggled:"Tema: {mode}",pasteImagePending:"Gambar masih diproses. Harap tunggu."}},chatPage:{placeholder:"Tanyakan apa saja... (baris baru: Shift+Enter atau Ctrl+J)",placeholderAwaitingApproval:"Diblokir oleh persetujuan: pilih Setujui / Tolak untuk melanjutkan.",reviewPrompt:"bantu saya review perubahan kode",notification:{approvalTitle:"[Persetujuan Diperlukan] Izin Alat",approvalMessage:"DimCode menunggu persetujuan alat: {tool}.",doneTitle:"[Tugas Selesai]",doneMessage:"DimCode menyelesaikan tugas ini.",doneMessageWithDuration:"DimCode menyelesaikan tugas ini dalam {duration}.",doneMessageWithTools:"DimCode menyelesaikan tugas ini setelah {tools} pemanggilan alat.",doneMessageWithToolsAndDuration:"DimCode menyelesaikan tugas ini dalam {duration} dengan {tools} pemanggilan alat."},headerStats:"{messages} pesan · total {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"Menggabungkan,Berpikir,Mempertimbangkan,Merencanakan,Menganalisis,Mensintesis,Menyempurnakan,Menyusun",modelFallback:"model",mode:{plan:"rencana",agent:"agen",debug:"debug"},status:{approvalsAuto:"OTOMATIS",approvalsAll:"SEMUA",blockedByApproval:"Diblokir oleh persetujuan",awaitingApprovalAction:"Menunggu persetujuan Anda: pilih Setujui / Tolak untuk melanjutkan."},footer:{dragSelect:"seret untuk memilih",openLink:"Ctrl+Klik untuk membuka file atau tautan",esc:"esc",interrupt:"interupsi",approvalPaused:"⏸ Dijeda",approvalPausedHint:"Menunggu persetujuan (Enter untuk memilih).",shortcuts:"Ctrl+K: konfigurasi Ctrl+O: expand/collapse alat & thinking Cmd+Delete/Ctrl+W: hapus input Tab: ganti mode {commandsKey}: perintah",shortcutsCompact:"Ctrl+K: konfigurasi Ctrl+O: alat/thinking Cmd+Delete/Ctrl+W: hapus Tab: ganti mode {commandsKey}: perintah",shortcutsMicro:"Ctrl+O: alat {commandsKey}: perintah",shortcutsMini:"{commandsKey}: perintah"},session:{new:"baru"},timeline:{title:"Timeline",empty:"(kosong)",filterAll:"Semua pesan",filterUser:"Pesan pengguna",filterTool:"Pemanggilan alat"},pins:{title:"Disematkan",empty:"(kosong)"},jumpToBottom:{button:"↓"},prompts:{help:"Bantuan & pintasan (F1)",newSession:"Mulai sesi baru",resume:"Lanjutkan antrian yang dijeda",sessions:"Daftar/pilih sesi",timeline:"Lompat ke pesan pengguna",pins:"Buka pesan yang disematkan",pin:"Sematkan pesan terakhir",back:"Kembali ke lompatan sebelumnya",connect:"Hubungkan provider",models:"Pilih model",theme:"Ganti tema UI",approvals:"Konfigurasi persetujuan alat (auto/normal/strict)",commands:"Buka palet perintah",toolSettings:"Konfigurasi pengaturan alat",mcpSettings:"Buka MCP",plugins:"Kelola plugin",language:"Ganti bahasa UI",status:"Alihkan detail status",review:"Tinjau perubahan kode",retry:"Coba ulang pesan pengguna terakhir",compact:"Kompakkan konteks sesi",init:"Inisialisasi/perbaiki AGENTS.md",rename:"Ganti nama sesi saat ini",skills:"Daftar skill yang dimuat",exit:"Keluar aplikasi",debug:"Dialog debug",settings:"Pengaturan provider kustom"},commands:{pinsLabel:"Pin",pinsDetail:"Buka pesan yang disematkan",backLabel:"Kembali",backDetail:"Kembali ke lompatan sebelumnya",debugLabel:"Debug",debugDetail:"Log observability SDK (/debug)",statusLabel:"Status",statusDetail:"Alihkan detail status",themeLabel:"Tema",themeDetail:"Ganti tema warna"},tips:{contextWarn:"Tip: Konteks hampir penuh. Pertimbangkan /compact atau /new untuk menjaga respons tetap tajam.",contextCritical:"Tip: Anda mendekati batas konteks. Mulai sesi baru dengan /new (atau /compact terlebih dahulu).",timeline:"Tip: Chat panjang? Gunakan /tl untuk kembali ke pesan pengguna tertentu.",timelineAlias:"Tip: /tl adalah alias singkat untuk /timeline.",commandsAlias:"Tip: {key} membuka palet perintah.",errorRecovery:"Tip: Jika ada yang gagal, coba /compact atau /new.",greeting:"Selamat datang kembali! Coba {commandsKey} atau {init} untuk memulai.",compactDelight:"Bagus! Menjaga konteks ringan membantu.",addTests:'Selesai! Mau saya tambahkan tes? Balas "yes" atau "ok".'},confirm:{addTests:"Silakan tambahkan tes untuk perubahan yang baru saja kami buat."},toast:{customProviderOnly:"Pengaturan hanya untuk provider kustom.",renameNodeOnly:"Ganti nama hanya tersedia di mode Node/CLI.",noActiveSession:"Tidak ada sesi aktif untuk diganti namanya.",sessionNameEmpty:"Nama sesi tidak boleh kosong.",sessionRenamed:"Nama sesi diubah ke: {title}",renameFailed:"Gagal mengganti nama sesi.",linkOpenHint:"Tip: Ctrl+Klik untuk membuka file atau tautan.",copySuccess:"Disalin",copyFailed:"Gagal menyalin",forkFailed:"Gagal fork sesi.",backEmpty:"Tidak ada lompatan sebelumnya untuk kembali.",pinsEmpty:"Belum ada pesan yang disematkan.",pinEmpty:"Belum ada pesan untuk disematkan.",pinned:"Pesan disematkan.",unpinned:"Sematan pesan dilepas.",debugUnavailable:"Server debug tidak tersedia.",approvalsUsage:"Gunakan /approvals (tanpa on/off).",debugDialogOpened:"Dialog debug dibuka.",debugDialogClosed:"Dialog debug ditutup.",renameUsage:"Penggunaan: /rename <title>",themeToggled:"Tema: {mode}",statusCompactOn:"Status: ringkas",statusCompactOff:"Status: detail",compactingSession:"Mengkompakkan sesi...",compactSuccess:"Sesi dikompakkan: {message}",compactWarning:"Sesi dikompakkan dengan peningkatan terbatas: {message}",compactSuccessDetailWithTokens:"Melipat {count} pesan historis pertama menjadi ringkasan. Input estimasi {before} -> {after} token, menghemat sekitar {saved} token.",compactSuccessDetailNotReduced:"Melipat {count} pesan historis pertama menjadi ringkasan, tapi input estimasi berubah dari {before} ke {after} token, jadi ini tidak mengurangi ukuran permintaan.",compactSuccessDetailCountOnly:"Melipat {count} pesan historis pertama menjadi ringkasan.",compactSuccessDetailSummaryOnly:"Menghasilkan ringkasan percakapan baru.",compactFailed:"Gagal mengkompakkan sesi: {error}",compactFailedTokenLimit:"Kompaksi gagal karena anggaran konteks tidak cukup. Atur DIMCODE_CONTEXT_WINDOW dengan benar, ganti ke model konteks lebih besar, atau gunakan /new. Detail: {error}",retryEmpty:"Tidak ada pesan pengguna sebelumnya untuk dicoba ulang.",commandRemoved:"Perintah ini tidak lagi tersedia: {command}",helpAliasRemoved:"Tekan F1 untuk bantuan.",waitForResponse:"Harap tunggu respons saat ini selesai, atau tekan Esc untuk menginterupsi.",pasteImagePending:"Gambar masih diproses. Harap tunggu.",pendingApproval:"Harap tangani tool_approve terlebih dahulu.",awaitingApprovalAction:"Dijeda: diperlukan tindakan. Pilih Setujui / Selalu setujui / Tolak di kartu izin.",awaitingApprovalStillWaiting:"Masih menunggu persetujuan ({seconds}d). Model tidak akan melanjutkan sampai Anda menyetujui atau menolak.",pendingAskUser:"Harap tangani ask_user terlebih dahulu.",notificationSessionBusy:"Notifikasi ini milik sesi lain yang sibuk. Selesaikan pekerjaan itu atau ganti sesi secara manual terlebih dahulu.",notificationSessionUnavailable:"Tidak dapat membuka sesi untuk notifikasi ini di sini.",notificationSessionSwitchFailed:"Gagal membuka sesi untuk notifikasi ini.",approvalNotActive:"Persetujuan ini dalam antrian. Selesaikan yang aktif terlebih dahulu.",askUserNotActive:"Permintaan ask_user ini tidak lagi aktif."}},chatQueue:{label:"Antrian ({count})",labelCompact:"Antrian {count}",more:"+{count} lagi…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"lanjutkan antrian",state:{idle:"Tertunda",running:"Berjalan",paused:"Dijeda",error:"Error"},item:{steerAction:"Arahkan",steerReady:"Pertama",steerPending:"Berikutnya",steerPaused:"Dijeda"},toast:{enqueued:"Ditambahkan ke antrian (#{count}).",full:"Antrian penuh (maks 5). Hapus satu atau mulai /new.",cleared:"Menghapus {count} item antrian.",deleted:"Menghapus {count} item antrian. Ctrl+Z untuk undo.",steerPromoted:"Ditingkatkan ke steer. Akan berjalan pertama saat antrian dilanjutkan.",steerQueued:"Steer tidak dapat disuntikkan segera. Dipromosikan dan akan berjalan pertama di ronde berikutnya.",steerSent:"Steer diterima. Akan disuntikkan sebelum pemanggilan model berikutnya di ronde ini.",undo:"Penghapusan antrian dibatalkan.",pausedTip:"Antrian dijeda. Gunakan {resume} atau {resumeText} untuk melanjutkan, atau kirim pesan baru untuk memilih apa yang harus dilakukan.",stale:"Antrian dijeda: permintaan tampaknya macet."},confirm:{title:"Lanjutkan pesan antrian?",description:"Permintaan sebelumnya tidak selesai. {count} pesan antrian menunggu.",hint:"Lanjutkan mengirim item berikutnya, atau jeda antrian.",continue:"Lanjutkan",pause:"Jeda",reason:"Alasan: {reason}"},reason:{network_error:"Kesalahan jaringan.",timeout:"Permintaan habis waktu.",canceled_by_user:"Dibatalkan oleh pengguna.",rate_limited:"Dibatasi laju.",config_unavailable:"Konfigurasi tersimpan tidak tersedia.",unknown:"Permintaan gagal."},draftDecision:{title:"Antrian dijeda",description:"{count} pesan antrian masih menunggu. Putuskan apa yang harus dilakukan dengan input baru Anda.",previewLabel:"Input baru:",continue:"Lanjutkan antrian",append:"Tambahkan ke antrian",replace:"Buang antrian & kirim"}},chatStatus:{done:"Selesai.",error:"Error.",interrupted:"Diinterupsi.",permissionDenied:"Izin ditolak.",planning:"Merencanakan…",drafting:"Membuat draf…",retrying:"Mencoba ulang ({retry}/{maxAttempts})…",runningTool:"Menjalankan {tool}…",runningTools:"Menjalankan {count} alat…",approvalPendingOther:"Persetujuan lain tertunda ({permission})…",awaitingApproval:"Menunggu persetujuan…",awaitingApprovalWithPerm:"Menunggu persetujuan ({permission})…",awaitingApprovalWithRisk:"Menunggu persetujuan ({risk})…",awaitingAnswers:"Menunggu jawaban…",resumingApproved:"Disetujui. Melanjutkan…",resumingDenied:"Ditolak. Melanjutkan…",resuming:"Melanjutkan…",autoApprovingWithRisk:"Otomatis menyetujui ({risk})…",riskFallback:"risiko",toolFallback:"alat",thinking:"Berpikir…",autoCompactionRequired:"Konteks mendekati batas. Kompaksi diperlukan terlebih dahulu.",autoCompactionRequiredDetailed:"Konteks mendekati batas · permintaan berikutnya diperkirakan {estimated} token, dan kompaksi otomatis dimulai pada {threshold} token, jadi kompaksi diperlukan terlebih dahulu.",compressed:"Konteks dikompaksi · melipat {removed} pesan lama menjadi ringkasan, menghemat sekitar {saved} token input ({elapsed}ms)",autoCompactedDetailed:"Kompaksi otomatis selesai · melipat {removed} pesan lama menjadi ringkasan, input estimasi {before} -> {after} token, menghemat sekitar {saved} token",autoCompactedNotReduced:"Kompaksi otomatis selesai · melipat {removed} pesan lama menjadi ringkasan, tapi input estimasi berubah dari {before} ke {after} token, jadi ini tidak mengurangi ukuran permintaan",autoCompactedSaved:"Kompaksi otomatis selesai · melipat {removed} pesan lama menjadi ringkasan, menghemat sekitar {saved} token",autoCompactedCountOnly:"Kompaksi otomatis selesai · melipat {removed} pesan lama menjadi ringkasan",interruptedMarkdown:"> **Diinterupsi** · Respons dibatalkan oleh pengguna (`Esc`).",awaitingApprovalPrefix:"Menunggu persetujuan",awaitingAnswersPrefix:"Menunggu jawaban",approvalPendingPrefix:"Persetujuan lain tertunda",autoApprovingPrefix:"Otomatis menyetujui"},chatParts:{thinking:"Berpikir",plan:"Rencana",todo:"Todo"},chatRender:{userLabel:"pengguna",outputLabel:"↳ output",outputLabelShort:"out:",canceled:"dibatalkan",inputLabel:"in:",collapse:"... (lipat)",moreLines:"... ({count} baris lagi)",moreLinesOmitted:"... ({count} baris dihilangkan; atur {envVar} untuk menambah)",streamingTail:"… (streaming: menampilkan {shown} karakter terakhir; {omitted} dihilangkan)",copy:"Salin",userResponses:"Respons pengguna:",approvalQueued:"Menunggu persetujuan sebelumnya...",proposedPlan:{title:"Rencana yang Diusulkan"},llmMeta:{changedFiles:"Mengubah {count} file: {files}",changedFilesMore:"+{count} lagi",revertHint:"Tip: Klik pesan ini -> Kembalikan pesan untuk membatalkan putaran ini.",changedFilesCardTitle:"mengubah {count} file:",revertButton:"Kembalikan"},toolName:{explore:"Jelajahi",subagent:"Subagen"},toolSuffix:{offset:"offset {value}",limit:"limit {value}",matches:"{count} kecocokan",todos:"{count} todo",results:"{count} hasil",results_one:"{count} hasil"},toolGroup:{readFiles:"Baca {count} file",writeFiles:"Tulis {count} file",editFiles:"Edit {count} file",globPatterns:"Glob {count} pola",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} pola",bashCommands:"Jalankan {count} perintah",searchQueries:"Cari {count} kueri",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"Pencarian mungkin mengakses jaringan.",bash:"Bash dapat mengeksekusi perintah.",edit:"Perubahan file dapat mengubah file lokal.",grep:"Grep mungkin membaca file lokal."},inlineHint:"Tombol: ↑↓←→ untuk berpindah, Enter untuk memilih.",awaitingUserAction:"Menunggu tindakan Anda: pilih Setujui / Selalu setujui / Tolak.",decision:{userDenied:"Pengguna menolak persetujuan"},denied:{title:"# Izin alat ditolak",toolLine:"- alat: `{tool}`",permissionLine:"- izin: `{permission}`",hint:"Anda dapat memilih ulang tool_call dan mencoba lagi."},summary:{title:"# Alat disetujui & dieksekusi",permissionLine:"Izin `{permission}` disetujui untuk `{tool}`."},required:"Persetujuan diperlukan ({risk}).",args:{commandWithDescription:"Perintah: {command} - {description}",command:"Perintah: {command}",description:"Deskripsi: {description}",raw:"Args: {args}"}},pathPicker:{titleWorkspace:"Pilih Workspace",titleFile:"Pilih File",placeholderWorkspace:"Ketik jalur (../ dll). Tab untuk autocomplete. Enter memilih direktori.",placeholderFile:"Ketik jalur (../ dll). Tab untuk autocomplete. Enter memilih file."},providerDialogs:{customLabel:"Kustom",customDetail:"kustom",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Login dengan DimCode OAuth",addCustomLabel:"Tambah provider kustom",addCustomDetail:"tambah provider kustom",providerFallback:"Provider",adapter:{openai:"OpenAI",openaiOpenRouter:"Kompatibel OpenAI (OpenRouter)",openaiLocal:"Kompatibel OpenAI (Endpoint lokal)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Terkonfigurasi",notConfigured:"Belum dikonfigurasi"},manage:{title:"Provider kustom: {provider}",connect:"Hubungkan",connectDetail:"Edit API Key / Base URL",rename:"Ganti nama",renameDetail:"Edit nama provider",models:"Edit model",modelsDetail:"Perbarui ID model yang tersedia",delete:"Hapus",deleteDetail:"Hapus provider ini"},deleteConfirm:{title:"Hapus {provider}?",confirm:"Hapus (konfirmasi)",confirmDetail:"Ini tidak dapat dibatalkan",cancelDetail:"Pertahankan provider"},nameDialog:{title:"Nama provider kustom",label:"Nama provider",placeholder:"cth: DeepSeek (Proxy)"},modelsDialog:{title:"Model provider kustom",modelsTitle:"Model",modelsPlaceholder:"ID Model (, atau baris baru)",hint:", / baris baru • Shift+Enter baris baru • Enter Terapkan",fetch:"Ambil model",fetching:"Mengambil model…"},modelsFetchDialog:{title:"Pilih model",searchPlaceholder:"Filter model",hint:"Space toggle • Enter konfirmasi • Esc batal"},toast:{modelSet:"Model diatur ke {provider} / {model}.",noModels:"Belum ada model tersedia. Hubungkan provider terlebih dahulu (/connect).",connectFirst:"Harap hubungkan provider terlebih dahulu (/connect) sebelum mengirim pesan pertama.",apiKeyRequired:"API Key diperlukan.",baseUrlRequired:"Base URL diperlukan.",baseUrlInvalid:"Base URL harus dimulai dengan http:// atau https://",connected:"Terhubung ke {provider}.",connectedSelectModel:"Terhubung ke {provider}. Pilih model.",connectedCheckFailed:"Terhubung ke {provider}, tapi self-check gagal: {reason}",connectionTestPassed:"Tes koneksi berhasil: {provider}.",connectionTestFailed:"Tes koneksi gagal: {provider} - {reason}",connectionActionUpdateKey:"Tindakan: buka kembali Hubungkan dan perbarui API key, lalu tes lagi.",connectionActionFixBaseUrl:"Tindakan: periksa jalur Base URL (biasanya berakhiran /v1), lalu tes lagi.",connectionActionSwitchKey:"Tindakan: tunggu sebentar atau ganti ke key/provider lain.",connectionActionRetryTest:"Tindakan: periksa jaringan/proxy dan jalankan Tes koneksi lagi.",noModelsFetching:"Belum ada model. Mengambil daftar model…",firstUseGuide:'Mulai cepat: 1) /connect 2) /models 3) kirim "hello"',firstUseSendHello:'Langkah berikutnya: kirim pesan pertama Anda (contoh: "hello").',connectionCheckUnauthorized:"401 Tidak Sah: periksa API key dan tipe provider.",connectionCheckForbidden:"403 Dilarang: key Anda mungkin tidak memiliki akses ke provider/model ini.",connectionCheckNotFound:"404 Tidak Ditemukan: periksa jalur Base URL (OpenAI-compatible biasanya berakhiran /v1).",connectionCheckRateLimited:"429 Dibatasi laju: tunggu dan coba lagi, atau ganti ke key/provider lain.",connectionCheckTimeout:"Koneksi habis waktu: periksa jaringan/proxy dan coba lagi.",connectionCheckNetwork:"Koneksi jaringan gagal: periksa DNS/proxy/Base URL.",connectionCheckFailed:"Pemeriksaan koneksi gagal: {error}",apiKeyCleared:"API key dihapus untuk {provider}.",customAdded:"Provider kustom ditambahkan: {provider}.",customRenamed:"Provider kustom diganti nama: {provider}.",customModelsUpdated:"Model provider kustom diperbarui: {provider}.",customDeleted:"Provider kustom dihapus: {provider}.",modelsRequired:"Tambahkan setidaknya satu model.",modelsEmpty:"Tidak ada model ditemukan.",modelsFetchFailed:"Gagal mengambil model: {error}",modelsFetchChatCompletions:"Daftar model tidak didukung untuk base URL /chat/completions atau /responses.",manualModelsRequired:"Endpoint ini tidak mendukung penemuan model otomatis. Silakan masukkan nama model secara manual di konfigurasi model.",nameRequired:"Nama provider diperlukan.",nameConflict:"Nama provider sudah ada."}},copyToast:{copiedToClipboard:"Disalin ke clipboard"}};var ja_default2={common:{apply:"適用",cancel:"キャンセル",close:"閉じる",confirm:"確認",yes:"はい",no:"いいえ",exit:"終了",back:"戻る",next:"次へ",save:"保存",empty:"—",unknownError:"不明なエラー",inputClearTip:"Ctrl+C クリア",total:"合計"},configDialog:{title:"設定",hint:"Tab/Shift+Tab フィールド切替 • Enter 適用 • Esc キャンセル",modelsTitle:"モデル(カスタム)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"コンテキストウィンドウ",contextWindowLocked:"コンテキストウィンドウ(モデル定義)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperature",temperaturePlaceholder:"0.7",temperatureValidationError:"Temperature: 数値と「.」のみ",maxTokensTitle:"最大出力トークン",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL(OpenAI 互換)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"現在:",apiKeyNotSet:"(未設定)",apiKeyTitle:"API キー",apiKeyPlaceholder:"新しいキーを貼り付け(空欄で保持)",interleavedThinkingTitle:"インターリーブ思考(Space で切替)",interleavedThinkingLocked:"インターリーブ思考(モデル定義)",interleavedThinkingOpen:"オン",interleavedThinkingClose:"オフ",tipIntensityTitle:"ヒント表示",tipIntensityOff:"オフ",tipIntensityLow:"低",tipIntensityStandard:"標準",shortcutsTitle:"ショートカット",shortcutCommandsLabel:"コマンド",shortcutTimelineLabel:"タイムライン",shortcutNewSessionLabel:"新セッション",shortcutsPlaceholder:"例: mod+p",shortcutsHint:"mod/ctrl/alt/shift + キー(a-z, 0-9, F1-F12)"},languageDialog:{title:"言語",hint:"Enter 適用 • Esc キャンセル",languageTitle:"言語",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"思考の強度",hint:"Enter 適用 • Esc キャンセル",effortTitle:"推論の強度",applied:"推論の強度を {effort} に設定しました",option:{low:"低",medium:"中",high:"高",xhigh:"超高",max:"最大",minimal:"最小",none:"なし",off:"オフ",auto:"自動"}},toolSettingsDialog:{title:"ツール設定",hint:"Enter 適用 • Esc キャンセル",websearchTitle:"WebSearch API キー",apiKeyCurrentPrefix:"現在:",apiKeyNotSet:"(未設定)",apiKeyInvalidCjk:"API Keyに中国語文字を含めることはできません。",apiKeyInvalidSpaces:"API Keyにスペースを含めることはできません。",apiKeyPlaceholder:"Serper API キーを貼り付け"},pluginsDialog:{title:"プラグイン",hint:"プラグインを選択して設定 • Esc 閉じる",serperSearch:"Serper Search",serperSearchDetail:"Serper API でウェブ検索",configured:"設定済み",notConfigured:"未設定",serperConfigTitle:"Serper Search 設定",serperConfigHint:"Tab 切替 • Enter 適用 • Esc キャンセル"},skillsDialog:{title:"スキル",hint:"Enter 適用 • Esc キャンセル",empty:"利用可能なスキルがありません",emptyFiltered:"一致するスキルがありません"},timelineDialog:{title:"タイムライン",hint:"Tab フィルター • Enter 開く • Esc 閉じる",empty:"まだメッセージがありません",emptyFiltered:"一致する項目がありません",filterAll:"すべてのメッセージ",filterUser:"ユーザーメッセージ",filterTool:"ツール呼び出し"},mcpSettingsDialog:{title:"MCP",hint:"mcp.json を編集して MCP サーバーを設定 • Esc 閉じる",configFileLabel:"設定ファイル:",noServersHint:"MCP サーバーが未設定です。",serverCount:"{count} 件のサーバーを設定済み",guideText:"上のファイルを編集して MCP サーバーを追加・変更してください。",openFile:"ファイルを開く",reload:"再読込",close:"閉じる",reloaded:"MCP 設定を再読込しました。",reloadFailed:"再読込失敗:{error}",status:"ステータス",toolCount:"ツール数",disabled:"無効",testConnection:"テスト",testing:"接続テスト中...",testComplete:"テスト完了。",testPartial:"テスト完了(エラーあり)。",testFailed:"接続失敗:{error}",invalidJson:"無効な JSON:{error}",invalidShape:'無効な MCP JSON:"mcpServers" が必要です。',invalidServer:"無効な MCP サーバー:{name}",noServers:"MCP サーバーが見つかりません。",lintOk:"JSON 構文 OK",lintAt:"{error}({line} 行, {column} 列)",lintUnclosed:"閉じられていない {char}({line} 行, {column} 列)",lintInvalid:"{error}",exampleFormat:"例:"},toolApprovalsDialog:{title:"ツール承認",useAuto:"自動",useNormal:"通常",useStrict:"厳格",close:"閉じる",focusedTitleAuto:"自動",focusedTitleNormal:"通常",focusedTitleStrict:"厳格",focusedTitleClose:"閉じる",focusedDescAuto:"すべてのツール呼び出しを自動承認(最速、最も危険)。",focusedDescNormal:"読み取り専用ツールは自動承認、書き込み/実行ツールは確認。",focusedDescStrict:"すべてのツール呼び出しで確認が必要(最安全、最遅)。",focusedDescClose:"現在の設定を変更せずに閉じる。",currentPrefix:"現在:{mode}",tip:"ヒント:Tab または ↑/↓ でボタン間を移動、Enter で確認、Esc で閉じる。"},settingsDialog:{pendingApproval:"保留中の承認を処理してから設定を変更してください。",invalidShortcut:"無効なショートカット:{label}({value})",shortcutCommands:"コマンドショートカット",shortcutTimeline:"タイムラインショートカット",shortcutNewSession:"新セッションショートカット",toolApprovalsApplied:"ツール承認:{mode}",applied:"設定を適用しました。"},exitAppDialog:{title:"DimCode 終了",confirm:"終了しますか?",warning:"エージェントの応答が進行中です。終了すると中断されます。",reasonPrefix:"理由:{reason}"},approvalDialog:{title:"ツール権限の承認",toolLabel:"ツール:{tool}{suffix}",toolLabelSuffix:"({description})",permissionLabel:"権限:{permission}({risk})",descriptionLabel:"説明:{description}",commandLabel:"コマンド:",inlineActionHint:"↑/← 前 ↓/→ 次 Enter 確認 1/2/3 選択",inlineActionHintCompact:"←/→ 移動 Enter 確認 1/2/3 選択",buttons:{approve:"承認",alwaysApprove:"常に承認",deny:"拒否",always:"常に",ok:"OK",no:"いいえ",y:"Y",all:"全",n:"N"}},askUserDialog:{noQuestionsTitle:"質問なし",noQuestionsBody:"回答すべき質問はありません。",title:"質問 {index}/{total}:{header}",defaultHeader:"質問",prev:"前へ",next:"次へ",submit:"送信",otherOption:"その他",otherDetail:"カスタム回答を入力",inlineHintOptions:"↑↓ 移動、←→ 質問切替、Enter 選択。",inlineHintMulti:"複数選択:Space でチェック切替。",inlineHintButtons:"Tab でボタンへ、←→ 切替、Enter 実行、↑ で選択肢に戻る。",inlineHintNav:"Ctrl+Left / Ctrl+Right(または Ctrl+A / Ctrl+E)で質問切替。",inlineHintSubmit:"Ctrl+Enter で送信、Esc でキャンセル。",inlineButtonPrev:"[前へ]",inlineButtonNext:"[次へ]",inlineButtonSubmit:"[送信]",inlineButtonCancel:"[キャンセル]",inlineActionHint:"Space 選択 ← 前 → 次 Enter 次/送信 Esc キャンセル",inlineActionHintCompact:"Space 選択 ←/→ 前/次 Enter 次/送信 Esc キャンセル",optionsSummaryAll:"{count} 件の選択肢",optionsSummaryVisibleMore:"{count} 件({start}-{end})↓ 続き",multiSelectHint:"[複数選択] Space で切替、Enter で確定",singleSelectHint:"[単一選択] 方向キーで移動、Enter で確定",customAnswerLabel:"カスタム回答:",customAnswerPlaceholder:"回答を入力…",otherPlaceholder:"「その他」選択中 — 回答を入力し Enter で確定。"},nextApiOAuthDialog:{title:"DimCode OAuth ログイン",copyUrl:"URL をコピー",login:"ログイン",logout:"ログアウト",statusTitle:"ステータス",statusAuthenticated:"✓ ログイン済み:{email}",statusLoading:"⏳ 認証中…",statusNotLoggedIn:"✗ 未ログイン",instructionAuthenticated:"↑↓ で移動、Enter で選択、1-9 で直接選択",instructionLoading:"ブラウザが開かない場合、C キーで下の URL をコピー",instructionNeedsSetup:"DimCode OAuth の redirect_uri、scope、有効状態を確認して再試行してください",instructionWithUrl:"C キーで OAuth URL をコピー、または Enter でブラウザを開く",instructionUnauthed:"Enter で DimCode OAuth ログイン、Esc で閉じる",instructionManualCallback:"下の URL をコピーしてブラウザでサインインし、リダイレクトされた URL を入力欄に貼り付けてください。",oauthUrlTitleLoading:"OAuth URL(ブラウザ未開時はコピー)",oauthUrlTitleReady:"OAuth URL(使用可能)",scrollIndicator:" [{start}-{end} / 全 {total}]",selectModelTitle:"モデル選択(↑↓/1-9、Enter で選択){indicator}",aboutTitle:"DimCode OAuth について",setupTitle:"OAuth ログインエラー",aboutBulletOne:"• 内蔵 DimCode OAuth クライアントを使用",aboutBulletTwo:"• ログイン後にリレーモデルを取得してプロバイダー設定を保存",aboutBulletThree:"• 長期間の API キーの代わりに OAuth リフレッシュトークンを使用",viewAllPlans:"すべてのプランを見る →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"DimCode アカウント",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"OAuth URL を生成中…",urlReady:"OAuth URL の準備完了!コピーするか Enter でブラウザを開いてください。",generateUrlFailed:"OAuth URL の生成に失敗:{error}",startingLogin:"OAuth ログインを開始…",browserOpened:"ブラウザを開きました。開かない場合はダイアログから URL をコピーしてください。",copyUrlToLogin:"ダイアログから OAuth URL をコピーしてログインしてください。",urlCopied:"OAuth URL をクリップボードにコピーしました。",urlCopyFailed:"OAuth URL のコピーに失敗しました。",authSuccess:"DimCode OAuth 認証に成功しました!",loginFailed:"OAuth ログイン失敗:{error}",loggedOut:"DimCode OAuth からログアウトしました",loggedOutWithRemoteWarning:"DimCode OAuth からログアウトしましたが、リモート無効化に失敗:{error}",logoutFailed:"ログアウト失敗:{error}",initFailed:"ダイアログの初期化エラー:{error}",modelSwitched:"モデルを切り替えました:{model}",selectModelFailed:"モデルの選択に失敗:{error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"デバッグ",titleDebugging:"デバッグ中",copy:"コピー",proceed:"続行",fixed:"修正済み",body:"デバッグログ(および修正)を追加しました。問題を再現してから結果を選択してください。"},exitSessionDialog:{title:"セッション終了",confirm:"現在のセッションを終了してホームに戻りますか?",note:"次のメッセージで新しいセッションが開始されます。"},messageActionsDialog:{title:"メッセージ操作",revert:"メッセージを差し戻し",revertWithFiles:"メッセージとファイル変更を差し戻し",revertKeepFiles:"メッセージを差し戻し(ファイル変更は保持)",revertFilesOnly:"ファイル変更のみ差し戻し",copy:"メッセージテキストをクリップボードにコピー",fork:"フォークして新セッション作成",pin:"メッセージをピン留め",unpin:"ピン留めを解除"},pathPickerDialog:{hint:"↑/↓ 選択 • Tab 補完 • Enter 確定 • Esc 閉じる"},providerConnectDialog:{title:"{provider} に接続",providerFallback:"プロバイダー",hint:"Tab 切替 • Ctrl+C クリア • Enter 適用",hintOpenAI:"Tab 切替 • Ctrl+C クリア • Enter 適用",hintGemini:"Tab 切替 • Ctrl+C クリア • Enter 適用",hintAnthropic:"Tab 切替 • Ctrl+C クリア • Enter 適用",hintGeneric:"Tab 切替 • Ctrl+C クリア • Enter 適用",applyingHint:"接続テスト中...",applyingButton:"適用中...",testConnection:"接続テスト",baseUrlStatusAutoFix:"自動修正:{value}",baseUrlStatusInvalid:"Base URL は http(s) である必要があります",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API キー",apiKeyPlaceholder:"新しいキーを貼り付け(空欄で保持)",apiKeyCurrent:"現在:{value}",apiKeyNotSet:"現在:(未設定)",apiKeyInvalidCjk:"API Keyに中国語文字を含めることはできません。",apiKeyInvalidSpaces:"API Keyにスペースを含めることはできません。",clearKey:"削除",useDetectedKey:"{name} を使用",disconnectButton:"切断",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"オフ",toggleOn:"オン",toggleHint:"Tab 切替 • ←/→ 変更 • Space 切替"},redoConfirmDialog:{title:"再実行の確認",body:"差し戻したメッセージを復元しますか?"},renameSessionDialog:{title:"セッション名変更",label:"セッション名",placeholder:"例:企画メモ"},sessionsDialog:{timeNow:"たった今",timeMinutes:"{count} 分前",timeHours:"{count} 時間前",timeDays:"{count} 日前",newSession:"新セッション",title:"セッション({count})",titleScoped:"セッション({count}/{total})",scope:"スコープ:{cwd}",loading:"読込中…",confirmDelete:"削除確認:もう一度 Delete を押してください",header:"{count} 件 • 方向キーで移動 • Enter で選択{range}{activity}",headerRange:" • {start}-{end} を表示",runningCount:"{count} 件実行中",pausedCount:"{count} 件確認待ち",hint:"入力で検索 • ←/→ ボタン • Enter 確定 • Esc 閉じる",focusPrefix:"フォーカス:{focus}",focusList:"リスト",focusButtons:"ボタン",noSessionsCwd:"このディレクトリにセッションはありません",noSessions:"保存されたセッションはありません",nodeOnly:"セッションは Node/CLI モードのみ利用可能です。",newSessionTitle:"新セッション",newSessionTarget:"新しいセッション",busy:{agentResponding:"エージェントが応答中",awaitingAskUser:"AskUser の回答待ち",awaitingToolApproval:"ツール承認待ち",pendingApproval:"承認待ち"},buttons:{open:"開く",delete:"削除",deleteConfirm:"削除(確認)",scope:"スコープ:{scope}",scopeCwd:"CWD",scopeAll:"すべて",refresh:"更新"}},sessionsOverlay:{title:"セッション",hint:"Enter 選択 • Esc 閉じる • Ctrl+R 更新 • Ctrl+W 範囲",loading:"セッションを読み込み中...",empty:"保存されたセッションはまだありません。",loadingMore:"さらに読み込み中…",hasMore:"↓ もっと",scope:{cwdOnly:"cwd のみ",allCwd:"すべての cwd"}},switchSessionDialog:{title:"セッション切替",confirm:"切替して中断",target:"{target} に切り替えますか?",fallback:"セッションを切り替えますか?",warning:"現在のセッションの応答/処理が中断されます。",reason:"理由:{reason}"},themeDialog:{title:"テーマ",hint:"Enter 適用 • Esc キャンセル",mode:"モード",light:"ライト",dark:"ダーク",unavailable:"この端末ではテーマ切替に対応していません。",fallback:"固定のライト/ダーク ANSI フォールバックテーマが使用されます。",tip:"ヒント:デフォルトはシステムテーマに従います。"},commandPalette:{searchPlaceholder:"検索…",noMatches:"一致なし",hint:"入力で絞込 • Enter: 実行 • Esc: 閉じる",title:"コマンド"},skills:{title:"スキル"},help:{title:"ヘルプ",modeLabel:"モード:{mode}",modeDetail:"現在のアシスタントモード。",shortcutsLabel:"ショートカット",onboarding:`ようこそ!クイックスタート:
1150
1150
  1) /connect:プロバイダーに接続
1151
1151
  2) /models:モデルを選択
1152
1152
  3) 「hello」を送信して会話開始
1153
- ヒント:{commandsKey} でコマンドパレットを開きます。`,items:{help:"ヘルプとショートカット(F1)",commands:"コマンドパレット(Ctrl+P)",back:"前のジャンプに戻る",status:"ステータス詳細の切替"}},commands:{help:{label:"ヘルプ",detail:"ショートカットとコマンド(F1)"},sessions:{label:"セッション",detail:"セッションの選択・作成(/sessions)"},timeline:{label:"タイムライン",detail:"ユーザーメッセージにジャンプ(/timeline)"},newSession:{label:"新セッション",detail:"新しいセッションを開始(/new)"},connectProvider:{label:"プロバイダー接続",detail:"プロバイダーに接続(/connect)"},models:{label:"モデル",detail:"モデルを選択(/models)"},toolApprovals:{label:"ツール承認",detail:"承認設定(/approvals)"},toolSettings:{label:"ツール設定",detail:"ツール設定(/tool-settings)"},mcpHub:{label:"MCP",detail:"MCP コネクタと設定(/mcp)"},plugins:{label:"プラグイン",detail:"プラグイン管理(/plugins)"},debug:{label:"デバッグ",detail:"SDK observability ログ(/debug)"},mcpSettings:{label:"MCP(高度な JSON)",detail:"MCP サーバー JSON を直接設定(/mcp-settings)"},language:{label:"言語",detail:"UI 言語の切替(/language)"},settings:{label:"設定",detail:"カスタムプロバイダー設定(/settings, Ctrl+K)"}},homePage:{multilineTitle:"複数行テキスト",multilineTitleWithCount:"複数行テキスト({count} 行)",providerCustom:"カスタム",reviewPrompt:"コード変更をレビューして",footerCwd:"cwd {cwd}",hints:{switchMode:"モード切替",commands:"コマンド"},tips:{greeting:"おかえりなさい!{commandsKey} または {init} を試してみてください。",commandsAlias:"ヒント:{key} でコマンドパレットを開けます。"},prompts:{help:"ヘルプとショートカット(F1)",sessions:"セッション一覧・選択",connect:"プロバイダーに接続",models:"モデルを選択",newSession:"新しいセッションを開始",approvals:"ツール承認を設定(auto/normal/strict)",commands:"コマンドパレットを開く",toolSettings:"ツール設定",mcpSettings:"MCP を開く",plugins:"プラグイン管理",language:"UI 言語を切替",theme:"テーマを選択",status:"ステータス詳細の切替",review:"コード変更をレビュー",init:"AGENTS.md を初期化/改善",skills:"読み込み済みスキル一覧",exit:"アプリを終了",debug:"デバッグダイアログ(チャット)",settings:"カスタムプロバイダー設定"},commandPalette:{connect:"プロバイダーに接続",models:"モデルを選択"},commands:{debugLabel:"デバッグ",debugDetail:"SDK observability ログ(/debug)"},toast:{approvalsUsage:"/approvals を使用してください(on/off なし)。",customProviderOnly:"設定はカスタムプロバイダーのみ利用可能です。",redoChatOnly:"再実行はチャットビューのみ利用可能です。",retryChatOnly:"リトライはチャットビューのみ利用可能です。",pinsChatOnly:"ピン留めはチャットビューのみ利用可能です。",renameChatOnly:"名前変更はチャットビューのみ利用可能(/rename <title>)。",commandRemoved:"このコマンドは利用できなくなりました:{command}",helpAliasRemoved:"F1 を押してヘルプを表示。",deleteConfirm:"もう一度 Delete を押して削除を確認。",themeToggled:"テーマ:{mode}",pasteImagePending:"画像を処理中です。少々お待ちください。"}},chatPage:{placeholder:"何でも聞いてください…(改行:Shift+Enter または Ctrl+J)",placeholderAwaitingApproval:"承認待ち:承認 / 拒否 を選択して続行してください。",reviewPrompt:"コード変更をレビューして",notification:{approvalTitle:"[承認必要] ツール権限",approvalMessage:"DimCode がツールの承認待ちです:{tool}。",doneTitle:"[タスク完了]",doneMessage:"DimCode がタスクを完了しました。",doneMessageWithDuration:"DimCode がタスクを完了しました({duration})。",doneMessageWithTools:"DimCode がタスクを完了しました({tools} 件のツール呼び出し)。",doneMessageWithToolsAndDuration:"DimCode がタスクを完了しました({duration}、{tools} 件のツール呼び出し)。"},headerStats:"{messages} 件 · 合計 {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"集約中,思考中,推論中,計画中,分析中,統合中,最適化中,構成中",modelFallback:"モデル",mode:{plan:"プラン",agent:"エージェント",debug:"デバッグ"},status:{approvalsAuto:"AUTO",approvalsAll:"ALL",blockedByApproval:"承認待ち",awaitingApprovalAction:"承認をお待ちしています:承認 / 拒否 を選択して続行してください。"},footer:{dragSelect:"ドラッグで選択",openLink:"Ctrl+クリックでファイルやリンクを開く",esc:"esc",interrupt:"中断",approvalPaused:"⏸ 一時停止",approvalPausedHint:"承認待ち(Enter で選択)。",shortcuts:"Ctrl+K: 設定 Ctrl+O: ツール/思考の展開/折りたたみ Cmd+Delete/Ctrl+W: 入力クリア Tab: モード切替 {commandsKey}: コマンド",shortcutsCompact:"Ctrl+K: 設定 Ctrl+O: ツール/思考 Cmd+Delete/Ctrl+W: クリア Tab: モード切替 {commandsKey}: コマンド",shortcutsMicro:"Ctrl+O: ツール {commandsKey}: コマンド",shortcutsMini:"{commandsKey}: コマンド"},session:{new:"新規"},timeline:{title:"タイムライン",empty:"(空)",filterAll:"全メッセージ",filterUser:"ユーザーメッセージ",filterTool:"ツール呼び出し"},pins:{title:"ピン留め",empty:"(空)"},jumpToBottom:{button:"↓"},prompts:{help:"ヘルプとショートカット(F1)",newSession:"新しいセッションを開始",resume:"一時停止中のキューを再開",sessions:"セッション一覧・選択",timeline:"ユーザーメッセージにジャンプ",pins:"ピン留めメッセージを開く",pin:"最後のメッセージをピン留め",back:"前のジャンプに戻る",connect:"プロバイダーに接続",models:"モデルを選択",theme:"テーマを切替",approvals:"ツール承認を設定(auto/normal/strict)",commands:"コマンドパレットを開く",toolSettings:"ツール設定",mcpSettings:"MCP を開く",plugins:"プラグイン管理",language:"UI 言語を切替",status:"ステータス詳細の切替",review:"コード変更をレビュー",retry:"最後のユーザーメッセージをリトライ",compact:"セッションコンテキストを圧縮",init:"AGENTS.md を初期化/改善",rename:"セッション名を変更",skills:"読み込み済みスキル一覧",exit:"アプリを終了",debug:"デバッグダイアログ",settings:"カスタムプロバイダー設定"},commands:{pinsLabel:"ピン留め",pinsDetail:"ピン留めメッセージを開く",backLabel:"戻る",backDetail:"前のジャンプに戻る",debugLabel:"デバッグ",debugDetail:"SDK observability ログ(/debug)",statusLabel:"ステータス",statusDetail:"ステータス詳細の切替",themeLabel:"テーマ",themeDetail:"カラーテーマを切替"},tips:{contextWarn:"ヒント:コンテキストが一杯になりそうです。/compact または /new で応答精度を保ちましょう。",contextCritical:"ヒント:コンテキスト上限に近づいています。/new で新セッションを(または /compact を先に)。",timeline:"ヒント:長い会話なら /tl で特定のメッセージにジャンプできます。",timelineAlias:"ヒント:/tl は /timeline のショートカットです。",commandsAlias:"ヒント:{key} でコマンドパレットを開けます。",errorRecovery:"ヒント:失敗したら /compact や /new を試してみてください。",greeting:"おかえりなさい!{commandsKey} または {init} を試してみてください。",compactDelight:"いいですね!コンテキストをコンパクトに保つのがコツです。",addTests:"完了しました!テストを追加しましょうか?「はい」または「ok」で。"},confirm:{addTests:"今回の変更に対するテストを追加してください。"},toast:{customProviderOnly:"設定はカスタムプロバイダーのみ利用可能です。",renameNodeOnly:"名前変更は Node/CLI モードのみ利用可能です。",noActiveSession:"名前変更できるセッションがありません。",sessionNameEmpty:"セッション名は空にできません。",sessionRenamed:"セッション名を変更しました:{title}",renameFailed:"セッション名の変更に失敗しました。",linkOpenHint:"ヒント:Ctrl+クリックでファイルやリンクを開けます。",copySuccess:"コピーしました",copyFailed:"コピー失敗",forkFailed:"セッションのフォークに失敗しました。",backEmpty:"戻るべき前のジャンプがありません。",pinsEmpty:"ピン留めされたメッセージはまだありません。",pinEmpty:"ピン留めするメッセージがまだありません。",pinned:"メッセージをピン留めしました。",unpinned:"ピン留めを解除しました。",debugUnavailable:"デバッグサーバーは利用できません。",approvalsUsage:"/approvals を使用してください(on/off なし)。",debugDialogOpened:"デバッグダイアログを開きました。",debugDialogClosed:"デバッグダイアログを閉じました。",renameUsage:"使い方:/rename <title>",themeToggled:"テーマ:{mode}",statusCompactOn:"ステータス:コンパクト",statusCompactOff:"ステータス:詳細",compactingSession:"セッションを圧縮中...",compactSuccess:"セッションを圧縮しました:{message}",compactWarning:"セッションを圧縮しましたが効果が限定的です:{message}",compactSuccessDetailWithTokens:"最初の {count} 件の履歴メッセージを要約に折りたたみました。推定入力 {before} -> {after} トークン、約 {saved} トークン節約。",compactSuccessDetailNotReduced:"最初の {count} 件の履歴メッセージを要約に折りたたみましたが、推定入力が {before} から {after} トークンに変化し、リクエストサイズは削減されませんでした。",compactSuccessDetailCountOnly:"最初の {count} 件の履歴メッセージを要約に折りたたみました。",compactSuccessDetailSummaryOnly:"新しい会話要約を生成しました。",compactFailed:"セッションの圧縮に失敗しました:{error}",compactFailedTokenLimit:"コンテキスト予算不足で圧縮に失敗しました。DIMCODE_CONTEXT_WINDOW を正しく設定するか、より大きなコンテキストモデルに切り替えるか、/new を使用してください。詳細:{error}",retryEmpty:"リトライする前のユーザーメッセージがありません。",commandRemoved:"このコマンドは利用できなくなりました:{command}",helpAliasRemoved:"F1 を押してヘルプを表示。",waitForResponse:"現在の応答が完了するまでお待ちください。Esc で中断できます。",pasteImagePending:"画像を処理中です。少々お待ちください。",pendingApproval:"先に tool_approve を処理してください。",awaitingApprovalAction:"一時停止:操作が必要です。権限カードで承認 / 常に承認 / 拒否 を選択してください。",awaitingApprovalStillWaiting:"承認待ちです({seconds}秒)。承認または拒否するまでモデルは続行しません。",pendingAskUser:"先に ask_user を処理してください。",notificationSessionBusy:"この通知は別のビジー中のセッションのものです。先にそちらを完了するか、手動でセッションを切り替えてください。",notificationSessionUnavailable:"ここではこの通知のセッションを開けません。",notificationSessionSwitchFailed:"この通知のセッションを開けませんでした。",approvalNotActive:"この承認はキューにあります。先に現在の承認を処理してください。",askUserNotActive:"この ask_user リクエストは既に無効です。"}},chatQueue:{label:"キュー({count})",labelCompact:"キュー {count}",more:"+{count} 件…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"キューを再開",state:{idle:"待機中",running:"実行中",paused:"一時停止",error:"エラー"},item:{steerAction:"誘導",steerReady:"先頭",steerPending:"次",steerPaused:"一時停止"},toast:{enqueued:"キューに追加しました(#{count})。",full:"キューが満杯です(最大5件)。削除するか /new してください。",cleared:"{count} 件のキューアイテムをクリアしました。",deleted:"{count} 件のキューアイテムを削除しました。Ctrl+Z で元に戻せます。",steerPromoted:"steer に昇格しました。キュー再開時に最初に実行されます。",steerQueued:"steer を即座に注入できませんでした。昇格され、次のラウンドで最初に実行されます。",steerSent:"steer を受け付けました。現在のラウンドの次のモデル呼び出しの前に注入されます。",undo:"キューの削除を取り消しました。",pausedTip:"キューは一時停止中です。{resume} または {resumeText} で続行するか、新しいメッセージを送信して処理を選択してください。",stale:"キュー一時停止:リクエストがスタックしている可能性があります。"},confirm:{title:"キューのメッセージを続行しますか?",description:"前のリクエストが未完了です。{count} 件のメッセージがキューで待機中。",hint:"次のアイテムを送信するか、キューを一時停止してください。",continue:"続行",pause:"一時停止",reason:"理由:{reason}"},reason:{network_error:"ネットワークエラー。",timeout:"リクエストがタイムアウトしました。",canceled_by_user:"ユーザーによりキャンセルされました。",rate_limited:"レート制限に達しました。",config_unavailable:"保存された設定が利用できません。",unknown:"リクエストに失敗しました。"},draftDecision:{title:"キューは一時停止中",description:"{count} 件のキューメッセージが待機中です。新しい入力の処理方法を選択してください。",previewLabel:"新しい入力:",continue:"キューを続行",append:"キューに追加",replace:"キューを破棄して送信"}},chatStatus:{done:"完了。",error:"エラー。",interrupted:"中断されました。",permissionDenied:"権限が拒否されました。",planning:"計画中…",drafting:"作成中…",retrying:"リトライ({retry}/{maxAttempts})…",runningTool:"{tool} を実行中…",runningTools:"{count} 件のツールを実行中…",approvalPendingOther:"別の承認が保留中です({permission})…",awaitingApproval:"承認待ち…",awaitingApprovalWithPerm:"承認待ち({permission})…",awaitingApprovalWithRisk:"承認待ち({risk})…",awaitingAnswers:"回答待ち…",resumingApproved:"承認されました。再開中…",resumingDenied:"拒否されました。再開中…",resuming:"再開中…",autoApprovingWithRisk:"自動承認中({risk})…",riskFallback:"リスク",toolFallback:"ツール",thinking:"思考中…",autoCompactionRequired:"コンテキストが上限に近づいています。先に圧縮が必要です。",autoCompactionRequiredDetailed:"コンテキストが上限に近づいています · 次のリクエストは推定 {estimated} トークン、自動圧縮の閾値は {threshold} トークンのため、先に圧縮が必要です。",compressed:"コンテキスト圧縮済み · {removed} 件の古いメッセージを要約に折りたたみ、推定 {saved} 入力トークンを節約({elapsed}ms)",autoCompactedDetailed:"自動圧縮完了 · {removed} 件の古いメッセージを要約に折りたたみ、推定入力 {before} -> {after} トークン、約 {saved} トークン節約",autoCompactedNotReduced:"自動圧縮完了 · {removed} 件の古いメッセージを要約に折りたたみましたが、推定入力が {before} から {after} トークンに変化し、リクエストサイズは削減されませんでした",autoCompactedSaved:"自動圧縮完了 · {removed} 件の古いメッセージを要約に折りたたみ、約 {saved} トークン節約",autoCompactedCountOnly:"自動圧縮完了 · {removed} 件の古いメッセージを要約に折りたたみました",interruptedMarkdown:"> **中断されました** · ユーザーが応答をキャンセルしました(`Esc`)。",awaitingApprovalPrefix:"承認待ち",awaitingAnswersPrefix:"回答待ち",approvalPendingPrefix:"別の承認が保留中",autoApprovingPrefix:"自動承認中"},chatParts:{thinking:"思考",plan:"プラン",todo:"Todo"},chatRender:{userLabel:"ユーザー",outputLabel:"↳ 出力",outputLabelShort:"出力:",canceled:"キャンセル",inputLabel:"入力:",collapse:"...(折りたたむ)",moreLines:"...(あと {count} 行)",moreLinesOmitted:"...({count} 行省略;{envVar} で増やせます)",streamingTail:"…(ストリーミング:最後の {shown} 文字を表示;{omitted} 文字省略)",copy:"コピー",userResponses:"ユーザーの回答:",approvalQueued:"前の承認完了待ち…",proposedPlan:{title:"提案プラン"},llmMeta:{changedFiles:"{count} ファイルを変更:{files}",changedFilesMore:"+{count} 件",revertHint:"ヒント:このメッセージをクリック → メッセージを差し戻しでこのターンを取り消せます。",changedFilesCardTitle:"{count} ファイルを変更:",revertButton:"差し戻し"},toolName:{explore:"探索",subagent:"サブエージェント"},toolSuffix:{offset:"オフセット {value}",limit:"制限 {value}",matches:"{count} 件一致",todos:"{count} 件の Todo",results:"{count} 件の結果",results_one:"{count} 件の結果"},toolGroup:{readFiles:"{count} ファイルを読込",writeFiles:"{count} ファイルを書込",editFiles:"{count} ファイルを編集",globPatterns:"{count} パターンを Glob",globSingle:"{pattern} を Glob",grepPatterns:"{count} パターンを Grep",bashCommands:"{count} コマンドを実行",searchQueries:"{count} クエリを検索",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"検索はネットワークにアクセスする可能性があります。",bash:"Bash はコマンドを実行できます。",edit:"ファイル変更はローカルファイルを変更する可能性があります。",grep:"Grep はローカルファイルを読み取る可能性があります。"},inlineHint:"キー:↑↓←→ で移動、Enter で選択。",awaitingUserAction:"操作をお待ちしています:承認 / 常に承認 / 拒否 を選択してください。",decision:{userDenied:"ユーザーが承認を拒否しました"},denied:{title:"# ツール権限が拒否されました",toolLine:"- ツール:`{tool}`",permissionLine:"- 権限:`{permission}`",hint:"tool_call を再選択して再試行できます。"},summary:{title:"# 承認済み・実行されたツール",permissionLine:"`{tool}` の `{permission}` 権限が承認されました。"},required:"承認が必要です({risk})。",args:{commandWithDescription:"コマンド:{command} - {description}",command:"コマンド:{command}",description:"説明:{description}",raw:"引数:{args}"}},pathPicker:{titleWorkspace:"ワークスペースを選択",titleFile:"ファイルを選択",placeholderWorkspace:"パスを入力(../ など)。Tab で補完、Enter でディレクトリを選択。",placeholderFile:"パスを入力(../ など)。Tab で補完、Enter でファイルを選択。"},providerDialogs:{customLabel:"カスタム",customDetail:"カスタム",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"DimCode OAuth でログイン",addCustomLabel:"カスタムプロバイダーを追加",addCustomDetail:"カスタムプロバイダーを追加",providerFallback:"プロバイダー",adapter:{openai:"OpenAI",openaiOpenRouter:"OpenAI 互換(OpenRouter)",openaiLocal:"OpenAI 互換(ローカルエンドポイント)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"設定済み",notConfigured:"未設定"},manage:{title:"カスタムプロバイダー:{provider}",connect:"接続",connectDetail:"API キー / Base URL を編集",rename:"名前変更",renameDetail:"プロバイダー名を編集",models:"モデルを編集",modelsDetail:"利用可能なモデル ID を更新",delete:"削除",deleteDetail:"このプロバイダーを削除"},deleteConfirm:{title:"{provider} を削除しますか?",confirm:"削除(確認)",confirmDetail:"この操作は元に戻せません",cancelDetail:"プロバイダーを保持"},nameDialog:{title:"カスタムプロバイダー名",label:"プロバイダー名",placeholder:"例:DeepSeek(Proxy)"},modelsDialog:{title:"カスタムプロバイダーのモデル",modelsTitle:"モデル",modelsPlaceholder:"モデル ID(, または改行区切り)",hint:", / 改行区切り • Shift+Enter 改行 • Enter 適用",fetch:"モデルを取得",fetching:"モデルを取得中…"},modelsFetchDialog:{title:"モデルを選択",searchPlaceholder:"モデルを絞込",hint:"Space 切替 • Enter 確定 • Esc キャンセル"},toast:{modelSet:"モデルを {provider} / {model} に設定しました。",noModels:"利用可能なモデルがありません。先にプロバイダーに接続してください(/connect)。",connectFirst:"最初のメッセージを送信する前にプロバイダーに接続してください(/connect)。",apiKeyRequired:"API キーが必要です。",baseUrlRequired:"Base URL が必要です。",baseUrlInvalid:"Base URL は http:// または https:// で始まる必要があります。",connected:"{provider} に接続しました。",connectedSelectModel:"{provider} に接続しました。モデルを選択してください。",connectedCheckFailed:"{provider} に接続しましたが、自己チェックに失敗:{reason}",connectionTestPassed:"接続テストに合格しました:{provider}。",connectionTestFailed:"接続テストに失敗:{provider} - {reason}",connectionActionUpdateKey:"対応:接続を再度開き、API キーを更新してから再度テストしてください。",connectionActionFixBaseUrl:"対応:Base URL のパスを確認(通常 /v1 で終わる)してから再度テストしてください。",connectionActionSwitchKey:"対応:少し待つか、別のキー/プロバイダーに切り替えてください。",connectionActionRetryTest:"対応:ネットワーク/プロキシを確認して再度テストしてください。",noModelsFetching:"モデルがまだありません。モデルリストを取得中…",firstUseGuide:"クイックスタート:1) /connect 2) /models 3) 「hello」を送信",firstUseSendHello:"次のステップ:最初のメッセージを送信してください(例:「hello」)。",connectionCheckUnauthorized:"401 認証エラー:API キーとプロバイダータイプを確認してください。",connectionCheckForbidden:"403 アクセス禁止:このキーにはこのプロバイダー/モデルへの権限がない可能性があります。",connectionCheckNotFound:"404 見つかりません:Base URL のパスを確認してください(OpenAI 互換は通常 /v1 で終わる)。",connectionCheckRateLimited:"429 レート制限:少し待ってから再試行するか、別のキー/プロバイダーに切り替えてください。",connectionCheckTimeout:"接続タイムアウト:ネットワーク/プロキシを確認して再試行してください。",connectionCheckNetwork:"ネットワーク接続失敗:DNS/プロキシ/Base URL を確認してください。",connectionCheckFailed:"接続チェックに失敗:{error}",apiKeyCleared:"{provider} の API キーをクリアしました。",customAdded:"カスタムプロバイダーを追加しました:{provider}。",customRenamed:"カスタムプロバイダー名を変更しました:{provider}。",customModelsUpdated:"カスタムプロバイダーのモデルを更新しました:{provider}。",customDeleted:"カスタムプロバイダーを削除しました:{provider}。",modelsRequired:"モデルを少なくとも1つ追加してください。",modelsEmpty:"モデルが見つかりません。",modelsFetchFailed:"モデルの取得に失敗:{error}",modelsFetchChatCompletions:"/chat/completions または /responses の Base URL ではモデル一覧を取得できません。",manualModelsRequired:"このエンドポイントは自動モデル検出に対応していません。モデル設定で手動入力してください。",nameRequired:"プロバイダー名は必須です。",nameConflict:"プロバイダー名は既に存在します。"}},copyToast:{copiedToClipboard:"クリップボードにコピーしました"}};var ko_default2={common:{apply:"적용",cancel:"취소",close:"닫기",confirm:"확인",yes:"예",no:"아니요",exit:"종료",back:"뒤로",next:"다음",save:"저장",empty:"—",unknownError:"알 수 없는 오류",inputClearTip:"Ctrl+C 지우기",total:"전체"},configDialog:{title:"설정",hint:"Tab/Shift+Tab 필드 전환 • Enter 적용 • Esc 취소",modelsTitle:"모델(사용자 정의)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"컨텍스트 윈도우",contextWindowLocked:"컨텍스트 윈도우(모델 정의)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperature",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperature: 숫자와 "."만 입력',maxTokensTitle:"최대 출력 토큰",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL(OpenAI 호환)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"현재:",apiKeyNotSet:"(미설정)",apiKeyTitle:"API 키",apiKeyPlaceholder:"새 키를 붙여넣기 (비워두면 유지)",interleavedThinkingTitle:"인터리브 생각(Space 전환)",interleavedThinkingLocked:"인터리브 생각(모델 정의)",interleavedThinkingOpen:"켜기",interleavedThinkingClose:"끄기",tipIntensityTitle:"팁 표시",tipIntensityOff:"끄기",tipIntensityLow:"낮음",tipIntensityStandard:"표준",shortcutsTitle:"단축키",shortcutCommandsLabel:"명령",shortcutTimelineLabel:"타임라인",shortcutNewSessionLabel:"새 세션",shortcutsPlaceholder:"예: mod+p",shortcutsHint:"mod/ctrl/alt/shift + 키(a-z, 0-9, F1-F12)"},languageDialog:{title:"언어",hint:"Enter 적용 • Esc 취소",languageTitle:"언어",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"추론 강도",hint:"Enter 적용 • Esc 취소",effortTitle:"추론 강도",applied:"추론 강도를 {effort}로 설정했습니다",option:{low:"낮음",medium:"보통",high:"높음",xhigh:"매우 높음",max:"최대",minimal:"최소",none:"없음",off:"끔",auto:"자동"}},toolSettingsDialog:{title:"도구 설정",hint:"Enter 적용 • Esc 취소",websearchTitle:"WebSearch API 키",apiKeyCurrentPrefix:"현재:",apiKeyNotSet:"(미설정)",apiKeyInvalidCjk:"API Key에 중국어 문자를 포함할 수 없습니다.",apiKeyInvalidSpaces:"API Key에 공백을 포함할 수 없습니다.",apiKeyPlaceholder:"Serper API 키를 붙여넣기"},pluginsDialog:{title:"플러그인",hint:"플러그인을 선택하여 설정 • Esc 닫기",serperSearch:"Serper Search",serperSearchDetail:"Serper API로 웹 검색",configured:"설정됨",notConfigured:"미설정",serperConfigTitle:"Serper Search 설정",serperConfigHint:"Tab 전환 • Enter 적용 • Esc 취소"},skillsDialog:{title:"스킬",hint:"Enter 적용 • Esc 취소",empty:"사용 가능한 스킬 없음",emptyFiltered:"일치하는 스킬 없음"},timelineDialog:{title:"타임라인",hint:"Tab 필터 • Enter 열기 • Esc 닫기",empty:"아직 메시지가 없음",emptyFiltered:"일치하는 항목 없음",filterAll:"모든 메시지",filterUser:"사용자 메시지",filterTool:"도구 호출"},mcpSettingsDialog:{title:"MCP",hint:"mcp.json 파일을 편집하여 MCP 서버 설정 • Esc 닫기",configFileLabel:"설정 파일:",noServersHint:"MCP 서버가 아직 설정되지 않았습니다.",serverCount:"{count}개 서버 설정됨",guideText:"위 파일을 편집하여 MCP 서버를 추가하거나 수정하세요.",openFile:"파일 열기",reload:"다시 불러오기",close:"닫기",reloaded:"MCP 설정을 다시 불러왔습니다.",reloadFailed:"다시 불러오기 실패: {error}",status:"상태",toolCount:"도구 수",disabled:"비활성화",testConnection:"테스트",testing:"연결 테스트 중...",testComplete:"테스트 완료.",testPartial:"테스트 완료(오류 있음).",testFailed:"연결 실패: {error}",invalidJson:"잘못된 JSON: {error}",invalidShape:'잘못된 MCP JSON: "mcpServers"가 필요합니다.',invalidServer:"잘못된 MCP 서버: {name}",noServers:"MCP 서버를 찾을 수 없습니다.",lintOk:"JSON 문법 OK",lintAt:"{error}({line}행, {column}열)",lintUnclosed:"닫히지 않은 {char}({line}행, {column}열)",lintInvalid:"{error}",exampleFormat:"예시 형식:"},toolApprovalsDialog:{title:"도구 승인",useAuto:"자동",useNormal:"일반",useStrict:"엄격",close:"닫기",focusedTitleAuto:"자동",focusedTitleNormal:"일반",focusedTitleStrict:"엄격",focusedTitleClose:"닫기",focusedDescAuto:"모든 도구 호출을 자동 승인(가장 빠르지만 가장 덜 안전).",focusedDescNormal:"읽기 전용 도구는 자동 승인, 쓰기/실행 도구는 확인.",focusedDescStrict:"모든 도구 호출에 확인 필요(가장 안전하지만 가장 느림).",focusedDescClose:"현재 설정을 변경하지 않고 닫기.",currentPrefix:"현재: {mode}",tip:"팁: Tab 또는 ↑/↓로 버튼 이동, Enter로 확인, Esc로 닫기."},settingsDialog:{pendingApproval:"대기 중인 승인을 먼저 처리한 다음 설정을 변경하세요.",invalidShortcut:"잘못된 단축키: {label}({value})",shortcutCommands:"명령 단축키",shortcutTimeline:"타임라인 단축키",shortcutNewSession:"새 세션 단축키",toolApprovalsApplied:"도구 승인: {mode}",applied:"설정이 적용되었습니다."},exitAppDialog:{title:"DimCode 종료",confirm:"지금 종료하시겠습니까?",warning:"에이전트 응답이 아직 진행 중입니다. 종료하면 중단됩니다.",reasonPrefix:"이유: {reason}"},approvalDialog:{title:"도구 권한 승인",toolLabel:"도구: {tool}{suffix}",toolLabelSuffix:"({description})",permissionLabel:"권한: {permission}({risk})",descriptionLabel:"설명: {description}",commandLabel:"명령:",inlineActionHint:"↑/← 이전 ↓/→ 다음 Enter 확인 1/2/3 선택",inlineActionHintCompact:"←/→ 이동 Enter 확인 1/2/3 선택",buttons:{approve:"승인",alwaysApprove:"항상 승인",deny:"거부",always:"항상",ok:"확인",no:"아니요",y:"Y",all:"전체",n:"N"}},askUserDialog:{noQuestionsTitle:"질문 없음",noQuestionsBody:"답변할 질문이 없습니다.",title:"질문 {index}/{total}: {header}",defaultHeader:"질문",prev:"이전",next:"다음",submit:"제출",otherOption:"기타",otherDetail:"직접 답변 입력",inlineHintOptions:"↑↓ 이동, ←→ 질문 전환, Enter 선택.",inlineHintMulti:"다중 선택: Space로 체크 전환.",inlineHintButtons:"Tab으로 버튼 이동, ←→ 전환, Enter 실행, ↑로 선택지로 복귀.",inlineHintNav:"Ctrl+Left / Ctrl+Right(또는 Ctrl+A / Ctrl+E)로 질문 전환.",inlineHintSubmit:"Ctrl+Enter 제출, Esc 취소.",inlineButtonPrev:"[이전]",inlineButtonNext:"[다음]",inlineButtonSubmit:"[제출]",inlineButtonCancel:"[취소]",inlineActionHint:"Space 선택 ← 이전 → 다음 Enter 다음/제출 Esc 취소",inlineActionHintCompact:"Space 선택 ←/→ 이전/다음 Enter 다음/제출 Esc 취소",optionsSummaryAll:"{count}개 선택지",optionsSummaryVisibleMore:"{count}개({start}-{end}) ↓ 더 보기",multiSelectHint:"[다중 선택] Space로 전환, Enter로 확인",singleSelectHint:"[단일 선택] 방향키로 이동, Enter로 확인",customAnswerLabel:"직접 답변:",customAnswerPlaceholder:"답변을 입력하세요…",otherPlaceholder:"기타 선택됨 — 답변을 입력하고 Enter를 누르세요."},nextApiOAuthDialog:{title:"DimCode OAuth 로그인",copyUrl:"URL 복사",login:"로그인",logout:"로그아웃",statusTitle:"상태",statusAuthenticated:"✓ 로그인됨: {email}",statusLoading:"⏳ 인증 중…",statusNotLoggedIn:"✗ 로그인 안 됨",instructionAuthenticated:"↑↓로 이동, Enter로 선택, 1-9로 직접 선택",instructionLoading:"브라우저가 열리지 않으면 C 키로 아래 URL 복사",instructionNeedsSetup:"DimCode OAuth의 redirect_uri, scope, 활성화 상태를 확인한 후 다시 시도하세요",instructionWithUrl:"C 키로 OAuth URL 복사, 또는 Enter로 브라우저 열기",instructionUnauthed:"Enter로 DimCode OAuth 로그인, Esc로 닫기",instructionManualCallback:"아래 URL을 복사하여 브라우저에서 로그인한 후, 리디렉션된 URL을 입력란에 붙여넣으세요.",oauthUrlTitleLoading:"OAuth URL(브라우저가 열리지 않으면 복사)",oauthUrlTitleReady:"OAuth URL(사용 가능)",scrollIndicator:" [{start}-{end} / 전체 {total}]",selectModelTitle:"모델 선택(↑↓/1-9, Enter로 선택){indicator}",aboutTitle:"DimCode OAuth 정보",setupTitle:"OAuth 로그인 오류",aboutBulletOne:"• 내장 DimCode OAuth 클라이언트 사용",aboutBulletTwo:"• 로그인 후 릴레이 모델을 가져와 프로바이더 설정에 저장",aboutBulletThree:"• 장기 API 키 대신 OAuth 리프레시 토큰 사용",viewAllPlans:"모든 플랜 보기 →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"DimCode 계정",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"OAuth URL 생성 중…",urlReady:"OAuth URL 준비 완료! 복사하거나 Enter로 브라우저를 여세요.",generateUrlFailed:"OAuth URL 생성 실패: {error}",startingLogin:"OAuth 로그인 시작…",browserOpened:"브라우저가 열렸습니다. 열리지 않으면 대화상자에서 URL을 복사하세요.",copyUrlToLogin:"대화상자에서 OAuth URL을 복사하여 로그인하세요.",urlCopied:"OAuth URL이 클립보드에 복사되었습니다.",urlCopyFailed:"OAuth URL 복사 실패.",authSuccess:"DimCode OAuth 인증에 성공했습니다!",loginFailed:"OAuth 로그인 실패: {error}",loggedOut:"DimCode OAuth에서 로그아웃했습니다.",loggedOutWithRemoteWarning:"DimCode OAuth에서 로그아웃했지만 원격 해제 실패: {error}",logoutFailed:"로그아웃 실패: {error}",initFailed:"대화상자 초기화 오류: {error}",modelSwitched:"모델이 전환됨: {model}",selectModelFailed:"모델 선택 실패: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"디버그",titleDebugging:"디버깅 중",copy:"복사",proceed:"진행",fixed:"수정됨",body:"디버그 로그(및 수정 사항)를 추가했습니다. 문제를 재현한 후 결과를 선택하세요."},exitSessionDialog:{title:"세션 종료",confirm:"현재 세션을 종료하고 홈으로 돌아가시겠습니까?",note:"다음 메시지로 새 세션이 시작됩니다."},messageActionsDialog:{title:"메시지 작업",revert:"메시지 되돌리기",revertWithFiles:"메시지와 파일 변경 되돌리기",revertKeepFiles:"메시지 되돌리기(파일 변경 유지)",revertFilesOnly:"파일 변경만 되돌리기",copy:"메시지 텍스트를 클립보드에 복사",fork:"포크하여 새 세션 생성",pin:"메시지 고정",unpin:"고정 해제"},pathPickerDialog:{hint:"↑/↓ 선택 • Tab 자동완성 • Enter 확인 • Esc 닫기"},providerConnectDialog:{title:"{provider} 연결",providerFallback:"프로바이더",hint:"Tab 전환 • Ctrl+C 지우기 • Enter 적용",hintOpenAI:"Tab 전환 • Ctrl+C 지우기 • Enter 적용",hintGemini:"Tab 전환 • Ctrl+C 지우기 • Enter 적용",hintAnthropic:"Tab 전환 • Ctrl+C 지우기 • Enter 적용",hintGeneric:"Tab 전환 • Ctrl+C 지우기 • Enter 적용",applyingHint:"연결 테스트 중, 잠시 기다려주세요...",applyingButton:"적용 중...",testConnection:"연결 테스트",baseUrlStatusAutoFix:"자동 수정: {value}",baseUrlStatusInvalid:"Base URL은 http(s)여야 합니다",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API 키",apiKeyPlaceholder:"새 키를 붙여넣기 (비워두면 유지)",apiKeyCurrent:"현재: {value}",apiKeyNotSet:"현재: (미설정)",apiKeyInvalidCjk:"API Key에 중국어 문자를 포함할 수 없습니다.",apiKeyInvalidSpaces:"API Key에 공백을 포함할 수 없습니다.",clearKey:"삭제",useDetectedKey:"{name} 사용",disconnectButton:"연결 해제",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"끄기",toggleOn:"켜기",toggleHint:"Tab 전환 • ←/→ 변경 • Space 전환"},redoConfirmDialog:{title:"다시 실행 확인",body:"되돌린 메시지를 복원하시겠습니까?"},renameSessionDialog:{title:"세션 이름 변경",label:"세션 이름",placeholder:"예: 기획 노트"},sessionsDialog:{timeNow:"방금",timeMinutes:"{count}분 전",timeHours:"{count}시간 전",timeDays:"{count}일 전",newSession:"새 세션",title:"세션({count})",titleScoped:"세션({count}/{total})",scope:"범위: {cwd}",loading:"로딩 중…",confirmDelete:"삭제 확인: Delete를 다시 누르세요",header:"{count}개 세션 • 방향키로 이동 • Enter로 선택{range}{activity}",headerRange:" • {start}-{end} 표시",runningCount:"{count}개 실행 중",pausedCount:"{count}개 확인 대기",hint:"입력하여 검색 • ←/→ 버튼 • Enter 확인 • Esc 닫기",focusPrefix:"포커스: {focus}",focusList:"목록",focusButtons:"버튼",noSessionsCwd:"이 디렉토리에 세션이 없습니다",noSessions:"저장된 세션이 없습니다",nodeOnly:"세션은 Node/CLI 모드에서만 사용할 수 있습니다.",newSessionTitle:"새 세션",newSessionTarget:"새 세션",busy:{agentResponding:"에이전트가 응답 중",awaitingAskUser:"AskUser 응답 대기 중",awaitingToolApproval:"도구 승인 대기 중",pendingApproval:"승인 대기 중"},buttons:{open:"열기",delete:"삭제",deleteConfirm:"삭제(확인)",scope:"범위: {scope}",scopeCwd:"CWD",scopeAll:"전체",refresh:"새로고침"}},sessionsOverlay:{title:"세션",hint:"Enter 선택 • Esc 닫기 • Ctrl+R 새로고침",loading:"세션 로딩 중...",empty:"저장된 세션이 없습니다."},switchSessionDialog:{title:"세션 전환",confirm:"전환 및 중단",target:"{target}(으)로 전환하시겠습니까?",fallback:"세션을 전환하시겠습니까?",warning:"현재 세션의 응답/작업이 중단됩니다.",reason:"이유: {reason}"},themeDialog:{title:"테마",hint:"Enter 적용 • Esc 취소",mode:"모드",light:"라이트",dark:"다크",unavailable:"이 터미널은 테마 전환을 지원하지 않습니다.",fallback:"고정 라이트/다크 ANSI 폴백 테마가 사용됩니다.",tip:"팁: 기본값은 시스템 테마를 따릅니다."},commandPalette:{searchPlaceholder:"검색…",noMatches:"일치 항목 없음",hint:"입력하여 필터 • Enter: 열기 • Esc: 닫기",title:"명령"},skills:{title:"스킬"},help:{title:"도움말",modeLabel:"모드: {mode}",modeDetail:"현재 어시스턴트 모드.",shortcutsLabel:"단축키",onboarding:`환영합니다! 빠른 시작:
1153
+ ヒント:{commandsKey} でコマンドパレットを開きます。`,items:{help:"ヘルプとショートカット(F1)",commands:"コマンドパレット(Ctrl+P)",back:"前のジャンプに戻る",status:"ステータス詳細の切替"}},commands:{help:{label:"ヘルプ",detail:"ショートカットとコマンド(F1)"},sessions:{label:"セッション",detail:"セッションの選択・作成(/sessions)"},timeline:{label:"タイムライン",detail:"ユーザーメッセージにジャンプ(/timeline)"},newSession:{label:"新セッション",detail:"新しいセッションを開始(/new)"},connectProvider:{label:"プロバイダー接続",detail:"プロバイダーに接続(/connect)"},models:{label:"モデル",detail:"モデルを選択(/models)"},toolApprovals:{label:"ツール承認",detail:"承認設定(/approvals)"},toolSettings:{label:"ツール設定",detail:"ツール設定(/tool-settings)"},mcpHub:{label:"MCP",detail:"MCP コネクタと設定(/mcp)"},plugins:{label:"プラグイン",detail:"プラグイン管理(/plugins)"},debug:{label:"デバッグ",detail:"SDK observability ログ(/debug)"},mcpSettings:{label:"MCP(高度な JSON)",detail:"MCP サーバー JSON を直接設定(/mcp-settings)"},language:{label:"言語",detail:"UI 言語の切替(/language)"},settings:{label:"設定",detail:"カスタムプロバイダー設定(/settings, Ctrl+K)"}},homePage:{multilineTitle:"複数行テキスト",multilineTitleWithCount:"複数行テキスト({count} 行)",providerCustom:"カスタム",reviewPrompt:"コード変更をレビューして",footerCwd:"cwd {cwd}",hints:{switchMode:"モード切替",commands:"コマンド"},tips:{greeting:"おかえりなさい!{commandsKey} または {init} を試してみてください。",commandsAlias:"ヒント:{key} でコマンドパレットを開けます。"},prompts:{help:"ヘルプとショートカット(F1)",sessions:"セッション一覧・選択",connect:"プロバイダーに接続",models:"モデルを選択",newSession:"新しいセッションを開始",approvals:"ツール承認を設定(auto/normal/strict)",commands:"コマンドパレットを開く",toolSettings:"ツール設定",mcpSettings:"MCP を開く",plugins:"プラグイン管理",language:"UI 言語を切替",theme:"テーマを選択",status:"ステータス詳細の切替",review:"コード変更をレビュー",init:"AGENTS.md を初期化/改善",skills:"読み込み済みスキル一覧",exit:"アプリを終了",debug:"デバッグダイアログ(チャット)",settings:"カスタムプロバイダー設定"},commandPalette:{connect:"プロバイダーに接続",models:"モデルを選択"},commands:{debugLabel:"デバッグ",debugDetail:"SDK observability ログ(/debug)"},toast:{approvalsUsage:"/approvals を使用してください(on/off なし)。",customProviderOnly:"設定はカスタムプロバイダーのみ利用可能です。",redoChatOnly:"再実行はチャットビューのみ利用可能です。",retryChatOnly:"リトライはチャットビューのみ利用可能です。",pinsChatOnly:"ピン留めはチャットビューのみ利用可能です。",renameChatOnly:"名前変更はチャットビューのみ利用可能(/rename <title>)。",commandRemoved:"このコマンドは利用できなくなりました:{command}",helpAliasRemoved:"F1 を押してヘルプを表示。",deleteConfirm:"もう一度 Delete を押して削除を確認。",themeToggled:"テーマ:{mode}",pasteImagePending:"画像を処理中です。少々お待ちください。"}},chatPage:{placeholder:"何でも聞いてください…(改行:Shift+Enter または Ctrl+J)",placeholderAwaitingApproval:"承認待ち:承認 / 拒否 を選択して続行してください。",reviewPrompt:"コード変更をレビューして",notification:{approvalTitle:"[承認必要] ツール権限",approvalMessage:"DimCode がツールの承認待ちです:{tool}。",doneTitle:"[タスク完了]",doneMessage:"DimCode がタスクを完了しました。",doneMessageWithDuration:"DimCode がタスクを完了しました({duration})。",doneMessageWithTools:"DimCode がタスクを完了しました({tools} 件のツール呼び出し)。",doneMessageWithToolsAndDuration:"DimCode がタスクを完了しました({duration}、{tools} 件のツール呼び出し)。"},headerStats:"{messages} 件 · 合計 {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"集約中,思考中,推論中,計画中,分析中,統合中,最適化中,構成中",modelFallback:"モデル",mode:{plan:"プラン",agent:"エージェント",debug:"デバッグ"},status:{approvalsAuto:"AUTO",approvalsAll:"ALL",blockedByApproval:"承認待ち",awaitingApprovalAction:"承認をお待ちしています:承認 / 拒否 を選択して続行してください。"},footer:{dragSelect:"ドラッグで選択",openLink:"Ctrl+クリックでファイルやリンクを開く",esc:"esc",interrupt:"中断",approvalPaused:"⏸ 一時停止",approvalPausedHint:"承認待ち(Enter で選択)。",shortcuts:"Ctrl+K: 設定 Ctrl+O: ツール/思考の展開/折りたたみ Cmd+Delete/Ctrl+W: 入力クリア Tab: モード切替 {commandsKey}: コマンド",shortcutsCompact:"Ctrl+K: 設定 Ctrl+O: ツール/思考 Cmd+Delete/Ctrl+W: クリア Tab: モード切替 {commandsKey}: コマンド",shortcutsMicro:"Ctrl+O: ツール {commandsKey}: コマンド",shortcutsMini:"{commandsKey}: コマンド"},session:{new:"新規"},timeline:{title:"タイムライン",empty:"(空)",filterAll:"全メッセージ",filterUser:"ユーザーメッセージ",filterTool:"ツール呼び出し"},pins:{title:"ピン留め",empty:"(空)"},jumpToBottom:{button:"↓"},prompts:{help:"ヘルプとショートカット(F1)",newSession:"新しいセッションを開始",resume:"一時停止中のキューを再開",sessions:"セッション一覧・選択",timeline:"ユーザーメッセージにジャンプ",pins:"ピン留めメッセージを開く",pin:"最後のメッセージをピン留め",back:"前のジャンプに戻る",connect:"プロバイダーに接続",models:"モデルを選択",theme:"テーマを切替",approvals:"ツール承認を設定(auto/normal/strict)",commands:"コマンドパレットを開く",toolSettings:"ツール設定",mcpSettings:"MCP を開く",plugins:"プラグイン管理",language:"UI 言語を切替",status:"ステータス詳細の切替",review:"コード変更をレビュー",retry:"最後のユーザーメッセージをリトライ",compact:"セッションコンテキストを圧縮",init:"AGENTS.md を初期化/改善",rename:"セッション名を変更",skills:"読み込み済みスキル一覧",exit:"アプリを終了",debug:"デバッグダイアログ",settings:"カスタムプロバイダー設定"},commands:{pinsLabel:"ピン留め",pinsDetail:"ピン留めメッセージを開く",backLabel:"戻る",backDetail:"前のジャンプに戻る",debugLabel:"デバッグ",debugDetail:"SDK observability ログ(/debug)",statusLabel:"ステータス",statusDetail:"ステータス詳細の切替",themeLabel:"テーマ",themeDetail:"カラーテーマを切替"},tips:{contextWarn:"ヒント:コンテキストが一杯になりそうです。/compact または /new で応答精度を保ちましょう。",contextCritical:"ヒント:コンテキスト上限に近づいています。/new で新セッションを(または /compact を先に)。",timeline:"ヒント:長い会話なら /tl で特定のメッセージにジャンプできます。",timelineAlias:"ヒント:/tl は /timeline のショートカットです。",commandsAlias:"ヒント:{key} でコマンドパレットを開けます。",errorRecovery:"ヒント:失敗したら /compact や /new を試してみてください。",greeting:"おかえりなさい!{commandsKey} または {init} を試してみてください。",compactDelight:"いいですね!コンテキストをコンパクトに保つのがコツです。",addTests:"完了しました!テストを追加しましょうか?「はい」または「ok」で。"},confirm:{addTests:"今回の変更に対するテストを追加してください。"},toast:{customProviderOnly:"設定はカスタムプロバイダーのみ利用可能です。",renameNodeOnly:"名前変更は Node/CLI モードのみ利用可能です。",noActiveSession:"名前変更できるセッションがありません。",sessionNameEmpty:"セッション名は空にできません。",sessionRenamed:"セッション名を変更しました:{title}",renameFailed:"セッション名の変更に失敗しました。",linkOpenHint:"ヒント:Ctrl+クリックでファイルやリンクを開けます。",copySuccess:"コピーしました",copyFailed:"コピー失敗",forkFailed:"セッションのフォークに失敗しました。",backEmpty:"戻るべき前のジャンプがありません。",pinsEmpty:"ピン留めされたメッセージはまだありません。",pinEmpty:"ピン留めするメッセージがまだありません。",pinned:"メッセージをピン留めしました。",unpinned:"ピン留めを解除しました。",debugUnavailable:"デバッグサーバーは利用できません。",approvalsUsage:"/approvals を使用してください(on/off なし)。",debugDialogOpened:"デバッグダイアログを開きました。",debugDialogClosed:"デバッグダイアログを閉じました。",renameUsage:"使い方:/rename <title>",themeToggled:"テーマ:{mode}",statusCompactOn:"ステータス:コンパクト",statusCompactOff:"ステータス:詳細",compactingSession:"セッションを圧縮中...",compactSuccess:"セッションを圧縮しました:{message}",compactWarning:"セッションを圧縮しましたが効果が限定的です:{message}",compactSuccessDetailWithTokens:"最初の {count} 件の履歴メッセージを要約に折りたたみました。推定入力 {before} -> {after} トークン、約 {saved} トークン節約。",compactSuccessDetailNotReduced:"最初の {count} 件の履歴メッセージを要約に折りたたみましたが、推定入力が {before} から {after} トークンに変化し、リクエストサイズは削減されませんでした。",compactSuccessDetailCountOnly:"最初の {count} 件の履歴メッセージを要約に折りたたみました。",compactSuccessDetailSummaryOnly:"新しい会話要約を生成しました。",compactFailed:"セッションの圧縮に失敗しました:{error}",compactFailedTokenLimit:"コンテキスト予算不足で圧縮に失敗しました。DIMCODE_CONTEXT_WINDOW を正しく設定するか、より大きなコンテキストモデルに切り替えるか、/new を使用してください。詳細:{error}",retryEmpty:"リトライする前のユーザーメッセージがありません。",commandRemoved:"このコマンドは利用できなくなりました:{command}",helpAliasRemoved:"F1 を押してヘルプを表示。",waitForResponse:"現在の応答が完了するまでお待ちください。Esc で中断できます。",pasteImagePending:"画像を処理中です。少々お待ちください。",pendingApproval:"先に tool_approve を処理してください。",awaitingApprovalAction:"一時停止:操作が必要です。権限カードで承認 / 常に承認 / 拒否 を選択してください。",awaitingApprovalStillWaiting:"承認待ちです({seconds}秒)。承認または拒否するまでモデルは続行しません。",pendingAskUser:"先に ask_user を処理してください。",notificationSessionBusy:"この通知は別のビジー中のセッションのものです。先にそちらを完了するか、手動でセッションを切り替えてください。",notificationSessionUnavailable:"ここではこの通知のセッションを開けません。",notificationSessionSwitchFailed:"この通知のセッションを開けませんでした。",approvalNotActive:"この承認はキューにあります。先に現在の承認を処理してください。",askUserNotActive:"この ask_user リクエストは既に無効です。"}},chatQueue:{label:"キュー({count})",labelCompact:"キュー {count}",more:"+{count} 件…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"キューを再開",state:{idle:"待機中",running:"実行中",paused:"一時停止",error:"エラー"},item:{steerAction:"誘導",steerReady:"先頭",steerPending:"次",steerPaused:"一時停止"},toast:{enqueued:"キューに追加しました(#{count})。",full:"キューが満杯です(最大5件)。削除するか /new してください。",cleared:"{count} 件のキューアイテムをクリアしました。",deleted:"{count} 件のキューアイテムを削除しました。Ctrl+Z で元に戻せます。",steerPromoted:"steer に昇格しました。キュー再開時に最初に実行されます。",steerQueued:"steer を即座に注入できませんでした。昇格され、次のラウンドで最初に実行されます。",steerSent:"steer を受け付けました。現在のラウンドの次のモデル呼び出しの前に注入されます。",undo:"キューの削除を取り消しました。",pausedTip:"キューは一時停止中です。{resume} または {resumeText} で続行するか、新しいメッセージを送信して処理を選択してください。",stale:"キュー一時停止:リクエストがスタックしている可能性があります。"},confirm:{title:"キューのメッセージを続行しますか?",description:"前のリクエストが未完了です。{count} 件のメッセージがキューで待機中。",hint:"次のアイテムを送信するか、キューを一時停止してください。",continue:"続行",pause:"一時停止",reason:"理由:{reason}"},reason:{network_error:"ネットワークエラー。",timeout:"リクエストがタイムアウトしました。",canceled_by_user:"ユーザーによりキャンセルされました。",rate_limited:"レート制限に達しました。",config_unavailable:"保存された設定が利用できません。",unknown:"リクエストに失敗しました。"},draftDecision:{title:"キューは一時停止中",description:"{count} 件のキューメッセージが待機中です。新しい入力の処理方法を選択してください。",previewLabel:"新しい入力:",continue:"キューを続行",append:"キューに追加",replace:"キューを破棄して送信"}},chatStatus:{done:"完了。",error:"エラー。",interrupted:"中断されました。",permissionDenied:"権限が拒否されました。",planning:"計画中…",drafting:"作成中…",retrying:"リトライ({retry}/{maxAttempts})…",runningTool:"{tool} を実行中…",runningTools:"{count} 件のツールを実行中…",approvalPendingOther:"別の承認が保留中です({permission})…",awaitingApproval:"承認待ち…",awaitingApprovalWithPerm:"承認待ち({permission})…",awaitingApprovalWithRisk:"承認待ち({risk})…",awaitingAnswers:"回答待ち…",resumingApproved:"承認されました。再開中…",resumingDenied:"拒否されました。再開中…",resuming:"再開中…",autoApprovingWithRisk:"自動承認中({risk})…",riskFallback:"リスク",toolFallback:"ツール",thinking:"思考中…",autoCompactionRequired:"コンテキストが上限に近づいています。先に圧縮が必要です。",autoCompactionRequiredDetailed:"コンテキストが上限に近づいています · 次のリクエストは推定 {estimated} トークン、自動圧縮の閾値は {threshold} トークンのため、先に圧縮が必要です。",compressed:"コンテキスト圧縮済み · {removed} 件の古いメッセージを要約に折りたたみ、推定 {saved} 入力トークンを節約({elapsed}ms)",autoCompactedDetailed:"自動圧縮完了 · {removed} 件の古いメッセージを要約に折りたたみ、推定入力 {before} -> {after} トークン、約 {saved} トークン節約",autoCompactedNotReduced:"自動圧縮完了 · {removed} 件の古いメッセージを要約に折りたたみましたが、推定入力が {before} から {after} トークンに変化し、リクエストサイズは削減されませんでした",autoCompactedSaved:"自動圧縮完了 · {removed} 件の古いメッセージを要約に折りたたみ、約 {saved} トークン節約",autoCompactedCountOnly:"自動圧縮完了 · {removed} 件の古いメッセージを要約に折りたたみました",interruptedMarkdown:"> **中断されました** · ユーザーが応答をキャンセルしました(`Esc`)。",awaitingApprovalPrefix:"承認待ち",awaitingAnswersPrefix:"回答待ち",approvalPendingPrefix:"別の承認が保留中",autoApprovingPrefix:"自動承認中"},chatParts:{thinking:"思考",plan:"プラン",todo:"Todo"},chatRender:{userLabel:"ユーザー",outputLabel:"↳ 出力",outputLabelShort:"出力:",canceled:"キャンセル",inputLabel:"入力:",collapse:"...(折りたたむ)",moreLines:"...(あと {count} 行)",moreLinesOmitted:"...({count} 行省略;{envVar} で増やせます)",streamingTail:"…(ストリーミング:最後の {shown} 文字を表示;{omitted} 文字省略)",copy:"コピー",userResponses:"ユーザーの回答:",approvalQueued:"前の承認完了待ち…",proposedPlan:{title:"提案プラン"},llmMeta:{changedFiles:"{count} ファイルを変更:{files}",changedFilesMore:"+{count} 件",revertHint:"ヒント:このメッセージをクリック → メッセージを差し戻しでこのターンを取り消せます。",changedFilesCardTitle:"{count} ファイルを変更:",revertButton:"差し戻し"},toolName:{explore:"探索",subagent:"サブエージェント"},toolSuffix:{offset:"オフセット {value}",limit:"制限 {value}",matches:"{count} 件一致",todos:"{count} 件の Todo",results:"{count} 件の結果",results_one:"{count} 件の結果"},toolGroup:{readFiles:"{count} ファイルを読込",writeFiles:"{count} ファイルを書込",editFiles:"{count} ファイルを編集",globPatterns:"{count} パターンを Glob",globSingle:"{pattern} を Glob",grepPatterns:"{count} パターンを Grep",bashCommands:"{count} コマンドを実行",searchQueries:"{count} クエリを検索",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"検索はネットワークにアクセスする可能性があります。",bash:"Bash はコマンドを実行できます。",edit:"ファイル変更はローカルファイルを変更する可能性があります。",grep:"Grep はローカルファイルを読み取る可能性があります。"},inlineHint:"キー:↑↓←→ で移動、Enter で選択。",awaitingUserAction:"操作をお待ちしています:承認 / 常に承認 / 拒否 を選択してください。",decision:{userDenied:"ユーザーが承認を拒否しました"},denied:{title:"# ツール権限が拒否されました",toolLine:"- ツール:`{tool}`",permissionLine:"- 権限:`{permission}`",hint:"tool_call を再選択して再試行できます。"},summary:{title:"# 承認済み・実行されたツール",permissionLine:"`{tool}` の `{permission}` 権限が承認されました。"},required:"承認が必要です({risk})。",args:{commandWithDescription:"コマンド:{command} - {description}",command:"コマンド:{command}",description:"説明:{description}",raw:"引数:{args}"}},pathPicker:{titleWorkspace:"ワークスペースを選択",titleFile:"ファイルを選択",placeholderWorkspace:"パスを入力(../ など)。Tab で補完、Enter でディレクトリを選択。",placeholderFile:"パスを入力(../ など)。Tab で補完、Enter でファイルを選択。"},providerDialogs:{customLabel:"カスタム",customDetail:"カスタム",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"DimCode OAuth でログイン",addCustomLabel:"カスタムプロバイダーを追加",addCustomDetail:"カスタムプロバイダーを追加",providerFallback:"プロバイダー",adapter:{openai:"OpenAI",openaiOpenRouter:"OpenAI 互換(OpenRouter)",openaiLocal:"OpenAI 互換(ローカルエンドポイント)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"設定済み",notConfigured:"未設定"},manage:{title:"カスタムプロバイダー:{provider}",connect:"接続",connectDetail:"API キー / Base URL を編集",rename:"名前変更",renameDetail:"プロバイダー名を編集",models:"モデルを編集",modelsDetail:"利用可能なモデル ID を更新",delete:"削除",deleteDetail:"このプロバイダーを削除"},deleteConfirm:{title:"{provider} を削除しますか?",confirm:"削除(確認)",confirmDetail:"この操作は元に戻せません",cancelDetail:"プロバイダーを保持"},nameDialog:{title:"カスタムプロバイダー名",label:"プロバイダー名",placeholder:"例:DeepSeek(Proxy)"},modelsDialog:{title:"カスタムプロバイダーのモデル",modelsTitle:"モデル",modelsPlaceholder:"モデル ID(, または改行区切り)",hint:", / 改行区切り • Shift+Enter 改行 • Enter 適用",fetch:"モデルを取得",fetching:"モデルを取得中…"},modelsFetchDialog:{title:"モデルを選択",searchPlaceholder:"モデルを絞込",hint:"Space 切替 • Enter 確定 • Esc キャンセル"},toast:{modelSet:"モデルを {provider} / {model} に設定しました。",noModels:"利用可能なモデルがありません。先にプロバイダーに接続してください(/connect)。",connectFirst:"最初のメッセージを送信する前にプロバイダーに接続してください(/connect)。",apiKeyRequired:"API キーが必要です。",baseUrlRequired:"Base URL が必要です。",baseUrlInvalid:"Base URL は http:// または https:// で始まる必要があります。",connected:"{provider} に接続しました。",connectedSelectModel:"{provider} に接続しました。モデルを選択してください。",connectedCheckFailed:"{provider} に接続しましたが、自己チェックに失敗:{reason}",connectionTestPassed:"接続テストに合格しました:{provider}。",connectionTestFailed:"接続テストに失敗:{provider} - {reason}",connectionActionUpdateKey:"対応:接続を再度開き、API キーを更新してから再度テストしてください。",connectionActionFixBaseUrl:"対応:Base URL のパスを確認(通常 /v1 で終わる)してから再度テストしてください。",connectionActionSwitchKey:"対応:少し待つか、別のキー/プロバイダーに切り替えてください。",connectionActionRetryTest:"対応:ネットワーク/プロキシを確認して再度テストしてください。",noModelsFetching:"モデルがまだありません。モデルリストを取得中…",firstUseGuide:"クイックスタート:1) /connect 2) /models 3) 「hello」を送信",firstUseSendHello:"次のステップ:最初のメッセージを送信してください(例:「hello」)。",connectionCheckUnauthorized:"401 認証エラー:API キーとプロバイダータイプを確認してください。",connectionCheckForbidden:"403 アクセス禁止:このキーにはこのプロバイダー/モデルへの権限がない可能性があります。",connectionCheckNotFound:"404 見つかりません:Base URL のパスを確認してください(OpenAI 互換は通常 /v1 で終わる)。",connectionCheckRateLimited:"429 レート制限:少し待ってから再試行するか、別のキー/プロバイダーに切り替えてください。",connectionCheckTimeout:"接続タイムアウト:ネットワーク/プロキシを確認して再試行してください。",connectionCheckNetwork:"ネットワーク接続失敗:DNS/プロキシ/Base URL を確認してください。",connectionCheckFailed:"接続チェックに失敗:{error}",apiKeyCleared:"{provider} の API キーをクリアしました。",customAdded:"カスタムプロバイダーを追加しました:{provider}。",customRenamed:"カスタムプロバイダー名を変更しました:{provider}。",customModelsUpdated:"カスタムプロバイダーのモデルを更新しました:{provider}。",customDeleted:"カスタムプロバイダーを削除しました:{provider}。",modelsRequired:"モデルを少なくとも1つ追加してください。",modelsEmpty:"モデルが見つかりません。",modelsFetchFailed:"モデルの取得に失敗:{error}",modelsFetchChatCompletions:"/chat/completions または /responses の Base URL ではモデル一覧を取得できません。",manualModelsRequired:"このエンドポイントは自動モデル検出に対応していません。モデル設定で手動入力してください。",nameRequired:"プロバイダー名は必須です。",nameConflict:"プロバイダー名は既に存在します。"}},copyToast:{copiedToClipboard:"クリップボードにコピーしました"}};var ko_default2={common:{apply:"적용",cancel:"취소",close:"닫기",confirm:"확인",yes:"예",no:"아니요",exit:"종료",back:"뒤로",next:"다음",save:"저장",empty:"—",unknownError:"알 수 없는 오류",inputClearTip:"Ctrl+C 지우기",total:"전체"},configDialog:{title:"설정",hint:"Tab/Shift+Tab 필드 전환 • Enter 적용 • Esc 취소",modelsTitle:"모델(사용자 정의)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"컨텍스트 윈도우",contextWindowLocked:"컨텍스트 윈도우(모델 정의)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperature",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperature: 숫자와 "."만 입력',maxTokensTitle:"최대 출력 토큰",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL(OpenAI 호환)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"현재:",apiKeyNotSet:"(미설정)",apiKeyTitle:"API 키",apiKeyPlaceholder:"새 키를 붙여넣기 (비워두면 유지)",interleavedThinkingTitle:"인터리브 생각(Space 전환)",interleavedThinkingLocked:"인터리브 생각(모델 정의)",interleavedThinkingOpen:"켜기",interleavedThinkingClose:"끄기",tipIntensityTitle:"팁 표시",tipIntensityOff:"끄기",tipIntensityLow:"낮음",tipIntensityStandard:"표준",shortcutsTitle:"단축키",shortcutCommandsLabel:"명령",shortcutTimelineLabel:"타임라인",shortcutNewSessionLabel:"새 세션",shortcutsPlaceholder:"예: mod+p",shortcutsHint:"mod/ctrl/alt/shift + 키(a-z, 0-9, F1-F12)"},languageDialog:{title:"언어",hint:"Enter 적용 • Esc 취소",languageTitle:"언어",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"추론 강도",hint:"Enter 적용 • Esc 취소",effortTitle:"추론 강도",applied:"추론 강도를 {effort}로 설정했습니다",option:{low:"낮음",medium:"보통",high:"높음",xhigh:"매우 높음",max:"최대",minimal:"최소",none:"없음",off:"끔",auto:"자동"}},toolSettingsDialog:{title:"도구 설정",hint:"Enter 적용 • Esc 취소",websearchTitle:"WebSearch API 키",apiKeyCurrentPrefix:"현재:",apiKeyNotSet:"(미설정)",apiKeyInvalidCjk:"API Key에 중국어 문자를 포함할 수 없습니다.",apiKeyInvalidSpaces:"API Key에 공백을 포함할 수 없습니다.",apiKeyPlaceholder:"Serper API 키를 붙여넣기"},pluginsDialog:{title:"플러그인",hint:"플러그인을 선택하여 설정 • Esc 닫기",serperSearch:"Serper Search",serperSearchDetail:"Serper API로 웹 검색",configured:"설정됨",notConfigured:"미설정",serperConfigTitle:"Serper Search 설정",serperConfigHint:"Tab 전환 • Enter 적용 • Esc 취소"},skillsDialog:{title:"스킬",hint:"Enter 적용 • Esc 취소",empty:"사용 가능한 스킬 없음",emptyFiltered:"일치하는 스킬 없음"},timelineDialog:{title:"타임라인",hint:"Tab 필터 • Enter 열기 • Esc 닫기",empty:"아직 메시지가 없음",emptyFiltered:"일치하는 항목 없음",filterAll:"모든 메시지",filterUser:"사용자 메시지",filterTool:"도구 호출"},mcpSettingsDialog:{title:"MCP",hint:"mcp.json 파일을 편집하여 MCP 서버 설정 • Esc 닫기",configFileLabel:"설정 파일:",noServersHint:"MCP 서버가 아직 설정되지 않았습니다.",serverCount:"{count}개 서버 설정됨",guideText:"위 파일을 편집하여 MCP 서버를 추가하거나 수정하세요.",openFile:"파일 열기",reload:"다시 불러오기",close:"닫기",reloaded:"MCP 설정을 다시 불러왔습니다.",reloadFailed:"다시 불러오기 실패: {error}",status:"상태",toolCount:"도구 수",disabled:"비활성화",testConnection:"테스트",testing:"연결 테스트 중...",testComplete:"테스트 완료.",testPartial:"테스트 완료(오류 있음).",testFailed:"연결 실패: {error}",invalidJson:"잘못된 JSON: {error}",invalidShape:'잘못된 MCP JSON: "mcpServers"가 필요합니다.',invalidServer:"잘못된 MCP 서버: {name}",noServers:"MCP 서버를 찾을 수 없습니다.",lintOk:"JSON 문법 OK",lintAt:"{error}({line}행, {column}열)",lintUnclosed:"닫히지 않은 {char}({line}행, {column}열)",lintInvalid:"{error}",exampleFormat:"예시 형식:"},toolApprovalsDialog:{title:"도구 승인",useAuto:"자동",useNormal:"일반",useStrict:"엄격",close:"닫기",focusedTitleAuto:"자동",focusedTitleNormal:"일반",focusedTitleStrict:"엄격",focusedTitleClose:"닫기",focusedDescAuto:"모든 도구 호출을 자동 승인(가장 빠르지만 가장 덜 안전).",focusedDescNormal:"읽기 전용 도구는 자동 승인, 쓰기/실행 도구는 확인.",focusedDescStrict:"모든 도구 호출에 확인 필요(가장 안전하지만 가장 느림).",focusedDescClose:"현재 설정을 변경하지 않고 닫기.",currentPrefix:"현재: {mode}",tip:"팁: Tab 또는 ↑/↓로 버튼 이동, Enter로 확인, Esc로 닫기."},settingsDialog:{pendingApproval:"대기 중인 승인을 먼저 처리한 다음 설정을 변경하세요.",invalidShortcut:"잘못된 단축키: {label}({value})",shortcutCommands:"명령 단축키",shortcutTimeline:"타임라인 단축키",shortcutNewSession:"새 세션 단축키",toolApprovalsApplied:"도구 승인: {mode}",applied:"설정이 적용되었습니다."},exitAppDialog:{title:"DimCode 종료",confirm:"지금 종료하시겠습니까?",warning:"에이전트 응답이 아직 진행 중입니다. 종료하면 중단됩니다.",reasonPrefix:"이유: {reason}"},approvalDialog:{title:"도구 권한 승인",toolLabel:"도구: {tool}{suffix}",toolLabelSuffix:"({description})",permissionLabel:"권한: {permission}({risk})",descriptionLabel:"설명: {description}",commandLabel:"명령:",inlineActionHint:"↑/← 이전 ↓/→ 다음 Enter 확인 1/2/3 선택",inlineActionHintCompact:"←/→ 이동 Enter 확인 1/2/3 선택",buttons:{approve:"승인",alwaysApprove:"항상 승인",deny:"거부",always:"항상",ok:"확인",no:"아니요",y:"Y",all:"전체",n:"N"}},askUserDialog:{noQuestionsTitle:"질문 없음",noQuestionsBody:"답변할 질문이 없습니다.",title:"질문 {index}/{total}: {header}",defaultHeader:"질문",prev:"이전",next:"다음",submit:"제출",otherOption:"기타",otherDetail:"직접 답변 입력",inlineHintOptions:"↑↓ 이동, ←→ 질문 전환, Enter 선택.",inlineHintMulti:"다중 선택: Space로 체크 전환.",inlineHintButtons:"Tab으로 버튼 이동, ←→ 전환, Enter 실행, ↑로 선택지로 복귀.",inlineHintNav:"Ctrl+Left / Ctrl+Right(또는 Ctrl+A / Ctrl+E)로 질문 전환.",inlineHintSubmit:"Ctrl+Enter 제출, Esc 취소.",inlineButtonPrev:"[이전]",inlineButtonNext:"[다음]",inlineButtonSubmit:"[제출]",inlineButtonCancel:"[취소]",inlineActionHint:"Space 선택 ← 이전 → 다음 Enter 다음/제출 Esc 취소",inlineActionHintCompact:"Space 선택 ←/→ 이전/다음 Enter 다음/제출 Esc 취소",optionsSummaryAll:"{count}개 선택지",optionsSummaryVisibleMore:"{count}개({start}-{end}) ↓ 더 보기",multiSelectHint:"[다중 선택] Space로 전환, Enter로 확인",singleSelectHint:"[단일 선택] 방향키로 이동, Enter로 확인",customAnswerLabel:"직접 답변:",customAnswerPlaceholder:"답변을 입력하세요…",otherPlaceholder:"기타 선택됨 — 답변을 입력하고 Enter를 누르세요."},nextApiOAuthDialog:{title:"DimCode OAuth 로그인",copyUrl:"URL 복사",login:"로그인",logout:"로그아웃",statusTitle:"상태",statusAuthenticated:"✓ 로그인됨: {email}",statusLoading:"⏳ 인증 중…",statusNotLoggedIn:"✗ 로그인 안 됨",instructionAuthenticated:"↑↓로 이동, Enter로 선택, 1-9로 직접 선택",instructionLoading:"브라우저가 열리지 않으면 C 키로 아래 URL 복사",instructionNeedsSetup:"DimCode OAuth의 redirect_uri, scope, 활성화 상태를 확인한 후 다시 시도하세요",instructionWithUrl:"C 키로 OAuth URL 복사, 또는 Enter로 브라우저 열기",instructionUnauthed:"Enter로 DimCode OAuth 로그인, Esc로 닫기",instructionManualCallback:"아래 URL을 복사하여 브라우저에서 로그인한 후, 리디렉션된 URL을 입력란에 붙여넣으세요.",oauthUrlTitleLoading:"OAuth URL(브라우저가 열리지 않으면 복사)",oauthUrlTitleReady:"OAuth URL(사용 가능)",scrollIndicator:" [{start}-{end} / 전체 {total}]",selectModelTitle:"모델 선택(↑↓/1-9, Enter로 선택){indicator}",aboutTitle:"DimCode OAuth 정보",setupTitle:"OAuth 로그인 오류",aboutBulletOne:"• 내장 DimCode OAuth 클라이언트 사용",aboutBulletTwo:"• 로그인 후 릴레이 모델을 가져와 프로바이더 설정에 저장",aboutBulletThree:"• 장기 API 키 대신 OAuth 리프레시 토큰 사용",viewAllPlans:"모든 플랜 보기 →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"DimCode 계정",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"OAuth URL 생성 중…",urlReady:"OAuth URL 준비 완료! 복사하거나 Enter로 브라우저를 여세요.",generateUrlFailed:"OAuth URL 생성 실패: {error}",startingLogin:"OAuth 로그인 시작…",browserOpened:"브라우저가 열렸습니다. 열리지 않으면 대화상자에서 URL을 복사하세요.",copyUrlToLogin:"대화상자에서 OAuth URL을 복사하여 로그인하세요.",urlCopied:"OAuth URL이 클립보드에 복사되었습니다.",urlCopyFailed:"OAuth URL 복사 실패.",authSuccess:"DimCode OAuth 인증에 성공했습니다!",loginFailed:"OAuth 로그인 실패: {error}",loggedOut:"DimCode OAuth에서 로그아웃했습니다.",loggedOutWithRemoteWarning:"DimCode OAuth에서 로그아웃했지만 원격 해제 실패: {error}",logoutFailed:"로그아웃 실패: {error}",initFailed:"대화상자 초기화 오류: {error}",modelSwitched:"모델이 전환됨: {model}",selectModelFailed:"모델 선택 실패: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"디버그",titleDebugging:"디버깅 중",copy:"복사",proceed:"진행",fixed:"수정됨",body:"디버그 로그(및 수정 사항)를 추가했습니다. 문제를 재현한 후 결과를 선택하세요."},exitSessionDialog:{title:"세션 종료",confirm:"현재 세션을 종료하고 홈으로 돌아가시겠습니까?",note:"다음 메시지로 새 세션이 시작됩니다."},messageActionsDialog:{title:"메시지 작업",revert:"메시지 되돌리기",revertWithFiles:"메시지와 파일 변경 되돌리기",revertKeepFiles:"메시지 되돌리기(파일 변경 유지)",revertFilesOnly:"파일 변경만 되돌리기",copy:"메시지 텍스트를 클립보드에 복사",fork:"포크하여 새 세션 생성",pin:"메시지 고정",unpin:"고정 해제"},pathPickerDialog:{hint:"↑/↓ 선택 • Tab 자동완성 • Enter 확인 • Esc 닫기"},providerConnectDialog:{title:"{provider} 연결",providerFallback:"프로바이더",hint:"Tab 전환 • Ctrl+C 지우기 • Enter 적용",hintOpenAI:"Tab 전환 • Ctrl+C 지우기 • Enter 적용",hintGemini:"Tab 전환 • Ctrl+C 지우기 • Enter 적용",hintAnthropic:"Tab 전환 • Ctrl+C 지우기 • Enter 적용",hintGeneric:"Tab 전환 • Ctrl+C 지우기 • Enter 적용",applyingHint:"연결 테스트 중, 잠시 기다려주세요...",applyingButton:"적용 중...",testConnection:"연결 테스트",baseUrlStatusAutoFix:"자동 수정: {value}",baseUrlStatusInvalid:"Base URL은 http(s)여야 합니다",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API 키",apiKeyPlaceholder:"새 키를 붙여넣기 (비워두면 유지)",apiKeyCurrent:"현재: {value}",apiKeyNotSet:"현재: (미설정)",apiKeyInvalidCjk:"API Key에 중국어 문자를 포함할 수 없습니다.",apiKeyInvalidSpaces:"API Key에 공백을 포함할 수 없습니다.",clearKey:"삭제",useDetectedKey:"{name} 사용",disconnectButton:"연결 해제",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"끄기",toggleOn:"켜기",toggleHint:"Tab 전환 • ←/→ 변경 • Space 전환"},redoConfirmDialog:{title:"다시 실행 확인",body:"되돌린 메시지를 복원하시겠습니까?"},renameSessionDialog:{title:"세션 이름 변경",label:"세션 이름",placeholder:"예: 기획 노트"},sessionsDialog:{timeNow:"방금",timeMinutes:"{count}분 전",timeHours:"{count}시간 전",timeDays:"{count}일 전",newSession:"새 세션",title:"세션({count})",titleScoped:"세션({count}/{total})",scope:"범위: {cwd}",loading:"로딩 중…",confirmDelete:"삭제 확인: Delete를 다시 누르세요",header:"{count}개 세션 • 방향키로 이동 • Enter로 선택{range}{activity}",headerRange:" • {start}-{end} 표시",runningCount:"{count}개 실행 중",pausedCount:"{count}개 확인 대기",hint:"입력하여 검색 • ←/→ 버튼 • Enter 확인 • Esc 닫기",focusPrefix:"포커스: {focus}",focusList:"목록",focusButtons:"버튼",noSessionsCwd:"이 디렉토리에 세션이 없습니다",noSessions:"저장된 세션이 없습니다",nodeOnly:"세션은 Node/CLI 모드에서만 사용할 수 있습니다.",newSessionTitle:"새 세션",newSessionTarget:"새 세션",busy:{agentResponding:"에이전트가 응답 중",awaitingAskUser:"AskUser 응답 대기 중",awaitingToolApproval:"도구 승인 대기 중",pendingApproval:"승인 대기 중"},buttons:{open:"열기",delete:"삭제",deleteConfirm:"삭제(확인)",scope:"범위: {scope}",scopeCwd:"CWD",scopeAll:"전체",refresh:"새로고침"}},sessionsOverlay:{title:"세션",hint:"Enter 선택 • Esc 닫기 • Ctrl+R 새로고침 • Ctrl+W 범위",loading:"세션 로딩 중...",empty:"저장된 세션이 없습니다.",loadingMore:"더 불러오는 중…",hasMore:"↓ 더 보기",scope:{cwdOnly:"cwd만",allCwd:"모든 cwd"}},switchSessionDialog:{title:"세션 전환",confirm:"전환 및 중단",target:"{target}(으)로 전환하시겠습니까?",fallback:"세션을 전환하시겠습니까?",warning:"현재 세션의 응답/작업이 중단됩니다.",reason:"이유: {reason}"},themeDialog:{title:"테마",hint:"Enter 적용 • Esc 취소",mode:"모드",light:"라이트",dark:"다크",unavailable:"이 터미널은 테마 전환을 지원하지 않습니다.",fallback:"고정 라이트/다크 ANSI 폴백 테마가 사용됩니다.",tip:"팁: 기본값은 시스템 테마를 따릅니다."},commandPalette:{searchPlaceholder:"검색…",noMatches:"일치 항목 없음",hint:"입력하여 필터 • Enter: 열기 • Esc: 닫기",title:"명령"},skills:{title:"스킬"},help:{title:"도움말",modeLabel:"모드: {mode}",modeDetail:"현재 어시스턴트 모드.",shortcutsLabel:"단축키",onboarding:`환영합니다! 빠른 시작:
1154
1154
  1) /connect: 프로바이더 연결
1155
1155
  2) /models: 모델 선택
1156
1156
  3) "hello"를 보내 대화 시작
1157
- 팁: {commandsKey}(으)로 명령 팔레트를 엽니다.`,items:{help:"도움말 및 단축키(F1)",commands:"명령 팔레트(Ctrl+P)",back:"이전 점프로 돌아가기",status:"상태 세부정보 전환"}},commands:{help:{label:"도움말",detail:"단축키 및 명령(F1)"},sessions:{label:"세션",detail:"세션 선택/생성(/sessions)"},timeline:{label:"타임라인",detail:"사용자 메시지로 이동(/timeline)"},newSession:{label:"새 세션",detail:"새 세션 시작(/new)"},connectProvider:{label:"프로바이더 연결",detail:"프로바이더 연결(/connect)"},models:{label:"모델",detail:"모델 선택(/models)"},toolApprovals:{label:"도구 승인",detail:"승인 설정(/approvals)"},toolSettings:{label:"도구 설정",detail:"도구별 설정(/tool-settings)"},mcpHub:{label:"MCP",detail:"MCP 커넥터 및 설정 관리(/mcp)"},plugins:{label:"플러그인",detail:"플러그인 관리(/plugins)"},debug:{label:"디버그",detail:"SDK observability 로그(/debug)"},mcpSettings:{label:"MCP(고급 JSON)",detail:"MCP 서버 JSON 직접 설정(/mcp-settings)"},language:{label:"언어",detail:"UI 언어 전환(/language)"},settings:{label:"설정",detail:"사용자 정의 프로바이더 설정(/settings, Ctrl+K)"}},homePage:{multilineTitle:"여러 줄 텍스트",multilineTitleWithCount:"여러 줄 텍스트({count}줄)",providerCustom:"사용자 정의",reviewPrompt:"코드 변경 사항을 리뷰해줘",footerCwd:"cwd {cwd}",hints:{switchMode:"모드 전환",commands:"명령"},tips:{greeting:"다시 오셨군요! {commandsKey} 또는 {init}을(를) 시도해 보세요.",commandsAlias:"팁: {key}(으)로 명령 팔레트를 열 수 있습니다."},prompts:{help:"도움말 및 단축키(F1)",sessions:"세션 목록/선택",connect:"프로바이더 연결",models:"모델 선택",newSession:"새 세션 시작",approvals:"도구 승인 설정(auto/normal/strict)",commands:"명령 팔레트 열기",toolSettings:"도구별 설정",mcpSettings:"MCP 열기",plugins:"플러그인 관리",language:"UI 언어 전환",theme:"테마 선택",status:"상태 세부정보 전환",review:"코드 변경 리뷰",init:"AGENTS.md 초기화/개선",skills:"로드된 스킬 목록",exit:"앱 종료",debug:"디버그 대화상자(채팅)",settings:"사용자 정의 프로바이더 설정"},commandPalette:{connect:"프로바이더 연결",models:"모델 선택"},commands:{debugLabel:"디버그",debugDetail:"SDK observability 로그(/debug)"},toast:{approvalsUsage:"/approvals을 사용하세요(on/off 없음).",customProviderOnly:"설정은 사용자 정의 프로바이더만 가능합니다.",redoChatOnly:"다시 실행은 채팅 보기에서만 가능합니다.",retryChatOnly:"재시도는 채팅 보기에서만 가능합니다.",pinsChatOnly:"고정은 채팅 보기에서만 가능합니다.",renameChatOnly:"이름 변경은 채팅 보기에서만 가능(/rename <title>).",commandRemoved:"이 명령은 더 이상 사용할 수 없습니다: {command}",helpAliasRemoved:"F1을 눌러 도움말을 보세요.",deleteConfirm:"Delete를 다시 눌러 삭제를 확인하세요.",themeToggled:"테마: {mode}",pasteImagePending:"이미지 처리 중입니다. 잠시 기다려주세요."}},chatPage:{placeholder:"무엇이든 물어보세요…(줄바꿈: Shift+Enter 또는 Ctrl+J)",placeholderAwaitingApproval:"승인 대기 중: 승인 / 거부를 선택한 후 계속하세요.",reviewPrompt:"코드 변경 사항을 리뷰해줘",notification:{approvalTitle:"[승인 필요] 도구 권한",approvalMessage:"DimCode가 도구 승인을 기다리고 있습니다: {tool}.",doneTitle:"[작업 완료]",doneMessage:"DimCode가 작업을 완료했습니다.",doneMessageWithDuration:"DimCode가 작업을 완료했습니다({duration}).",doneMessageWithTools:"DimCode가 작업을 완료했습니다(도구 {tools}회 호출).",doneMessageWithToolsAndDuration:"DimCode가 작업을 완료했습니다({duration}, 도구 {tools}회 호출)."},headerStats:"{messages} 메시지 · 총 {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"집약,생각,추론,계획,분석,종합,개선,작성",modelFallback:"모델",mode:{plan:"계획",agent:"에이전트",debug:"디버그"},status:{approvalsAuto:"자동",approvalsAll:"전체",blockedByApproval:"승인 대기 중",awaitingApprovalAction:"승인을 기다리고 있습니다: 승인 / 거부를 선택하여 계속하세요."},footer:{dragSelect:"드래그하여 선택",openLink:"Ctrl+클릭으로 파일 또는 링크 열기",esc:"esc",interrupt:"중단",approvalPaused:"⏸ 일시정지",approvalPausedHint:"승인 대기 중(Enter로 선택).",shortcuts:"Ctrl+K: 설정 Ctrl+O: 도구/생각 펼치기/접기 Cmd+Delete/Ctrl+W: 입력 지우기 Tab: 모드 전환 {commandsKey}: 명령",shortcutsCompact:"Ctrl+K: 설정 Ctrl+O: 도구/생각 Cmd+Delete/Ctrl+W: 지우기 Tab: 모드 전환 {commandsKey}: 명령",shortcutsMicro:"Ctrl+O: 도구 {commandsKey}: 명령",shortcutsMini:"{commandsKey}: 명령"},session:{new:"새로"},timeline:{title:"타임라인",empty:"(비어 있음)",filterAll:"전체 메시지",filterUser:"사용자 메시지",filterTool:"도구 호출"},pins:{title:"고정",empty:"(비어 있음)"},jumpToBottom:{button:"↓"},prompts:{help:"도움말 및 단축키(F1)",newSession:"새 세션 시작",resume:"일시정지된 큐 재개",sessions:"세션 목록/선택",timeline:"사용자 메시지로 이동",pins:"고정된 메시지 열기",pin:"마지막 메시지 고정",back:"이전 점프로 돌아가기",connect:"프로바이더 연결",models:"모델 선택",theme:"테마 전환",approvals:"도구 승인 설정(auto/normal/strict)",commands:"명령 팔레트 열기",toolSettings:"도구별 설정",mcpSettings:"MCP 열기",plugins:"플러그인 관리",language:"UI 언어 전환",status:"상태 세부정보 전환",review:"코드 변경 리뷰",retry:"마지막 사용자 메시지 재시도",compact:"세션 컨텍스트 압축",init:"AGENTS.md 초기화/개선",rename:"현재 세션 이름 변경",skills:"로드된 스킬 목록",exit:"앱 종료",debug:"디버그 대화상자",settings:"사용자 정의 프로바이더 설정"},commands:{pinsLabel:"고정",pinsDetail:"고정된 메시지 열기",backLabel:"뒤로",backDetail:"이전 점프로 돌아가기",debugLabel:"디버그",debugDetail:"SDK observability 로그(/debug)",statusLabel:"상태",statusDetail:"상태 세부정보 전환",themeLabel:"테마",themeDetail:"색상 테마 전환"},tips:{contextWarn:"팁: 컨텍스트가 가득 차고 있습니다. /compact 또는 /new로 응답 품질을 유지하세요.",contextCritical:"팁: 컨텍스트 한계에 가까워지고 있습니다. /new로 새 세션을(또는 먼저 /compact) 시작하세요.",timeline:"팁: 대화가 길어지면 /tl로 특정 메시지로 돌아갈 수 있습니다.",timelineAlias:"팁: /tl은 /timeline의 단축키입니다.",commandsAlias:"팁: {key}(으)로 명령 팔레트를 열 수 있습니다.",errorRecovery:"팁: 문제가 생기면 /compact 또는 /new를 시도해 보세요.",greeting:"다시 오셨군요! {commandsKey} 또는 {init}을(를) 시도해 보세요.",compactDelight:"좋아요! 컨텍스트를 간결하게 유지하면 도움이 됩니다.",addTests:'완료! 테스트를 추가할까요? "예" 또는 "ok"로 답해주세요.'},confirm:{addTests:"방금 한 변경에 대한 테스트를 추가해 주세요."},toast:{customProviderOnly:"설정은 사용자 정의 프로바이더만 가능합니다.",renameNodeOnly:"이름 변경은 Node/CLI 모드에서만 가능합니다.",noActiveSession:"이름을 변경할 세션이 없습니다.",sessionNameEmpty:"세션 이름은 비워둘 수 없습니다.",sessionRenamed:"세션 이름이 변경됨: {title}",renameFailed:"세션 이름 변경에 실패했습니다.",linkOpenHint:"팁: Ctrl+클릭으로 파일이나 링크를 열 수 있습니다.",copySuccess:"복사됨",copyFailed:"복사 실패",forkFailed:"세션 포크에 실패했습니다.",backEmpty:"돌아갈 이전 점프가 없습니다.",pinsEmpty:"고정된 메시지가 아직 없습니다.",pinEmpty:"고정할 메시지가 아직 없습니다.",pinned:"메시지를 고정했습니다.",unpinned:"고정을 해제했습니다.",debugUnavailable:"디버그 서버를 사용할 수 없습니다.",approvalsUsage:"/approvals을 사용하세요(on/off 없음).",debugDialogOpened:"디버그 대화상자가 열렸습니다.",debugDialogClosed:"디버그 대화상자가 닫혔습니다.",renameUsage:"사용법: /rename <title>",themeToggled:"테마: {mode}",statusCompactOn:"상태: 간략",statusCompactOff:"상태: 상세",compactingSession:"세션 압축 중...",compactSuccess:"세션이 압축됨: {message}",compactWarning:"세션이 압축되었지만 효과가 제한적임: {message}",compactSuccessDetailWithTokens:"처음 {count}개의 기록 메시지를 요약으로 접었습니다. 예상 입력 {before} -> {after} 토큰, 약 {saved} 토큰 절약.",compactSuccessDetailNotReduced:"처음 {count}개의 기록 메시지를 요약으로 접었지만, 예상 입력이 {before}에서 {after} 토큰으로 변하여 요청 크기가 줄지 않았습니다.",compactSuccessDetailCountOnly:"처음 {count}개의 기록 메시지를 요약으로 접었습니다.",compactSuccessDetailSummaryOnly:"새 대화 요약이 생성되었습니다.",compactFailed:"세션 압축 실패: {error}",compactFailedTokenLimit:"컨텍스트 예산 부족으로 압축에 실패했습니다. DIMCODE_CONTEXT_WINDOW을 올바르게 설정하거나, 더 큰 컨텍스트 모델로 전환하거나, /new를 사용하세요. 상세: {error}",retryEmpty:"재시도할 이전 사용자 메시지가 없습니다.",commandRemoved:"이 명령은 더 이상 사용할 수 없습니다: {command}",helpAliasRemoved:"F1을 눌러 도움말을 보세요.",waitForResponse:"현재 응답이 완료될 때까지 기다리거나 Esc를 눌러 중단하세요.",pasteImagePending:"이미지 처리 중입니다. 잠시 기다려주세요.",pendingApproval:"먼저 tool_approve를 처리하세요.",awaitingApprovalAction:"일시정지: 작업이 필요합니다. 권한 카드에서 승인 / 항상 승인 / 거부를 선택하세요.",awaitingApprovalStillWaiting:"승인 대기 중({seconds}초). 승인하거나 거부할 때까지 모델이 계속하지 않습니다.",pendingAskUser:"먼저 ask_user를 처리하세요.",notificationSessionBusy:"이 알림은 다른 사용 중인 세션의 것입니다. 먼저 해당 작업을 완료하거나 수동으로 세션을 전환하세요.",notificationSessionUnavailable:"여기서 이 알림의 세션을 열 수 없습니다.",notificationSessionSwitchFailed:"이 알림의 세션을 열지 못했습니다.",approvalNotActive:"이 승인은 대기 중입니다. 먼저 현재 승인을 처리하세요.",askUserNotActive:"이 ask_user 요청은 더 이상 활성 상태가 아닙니다."}},chatQueue:{label:"큐({count})",labelCompact:"큐 {count}",more:"+{count}개 더…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"큐 재개",state:{idle:"대기 중",running:"실행 중",paused:"일시정지",error:"오류"},item:{steerAction:"조정",steerReady:"첫 번째",steerPending:"다음",steerPaused:"일시정지"},toast:{enqueued:"큐에 추가됨(#{count}).",full:"큐가 가득 참(최대 5개). 하나를 삭제하거나 /new하세요.",cleared:"{count}개의 큐 항목을 삭제했습니다.",deleted:"{count}개의 큐 항목을 삭제했습니다. Ctrl+Z로 되돌리기.",steerPromoted:"steer로 승격됨. 큐가 재개되면 먼저 실행됩니다.",steerQueued:"steer를 즉시 주입할 수 없습니다. 승격되어 다음 라운드에서 먼저 실행됩니다.",steerSent:"steer가 수락되었습니다. 이번 라운드의 다음 모델 호출 전에 주입됩니다.",undo:"큐 삭제가 취소되었습니다.",pausedTip:"큐가 일시정지됨. {resume} 또는 {resumeText}(으)로 계속하거나 새 메시지를 보내 처리 방법을 선택하세요.",stale:"큐 일시정지: 요청이 멈춘 것 같습니다."},confirm:{title:"큐의 메시지를 계속 보내시겠습니까?",description:"이전 요청이 완료되지 않았습니다. 큐에 {count}개의 메시지가 대기 중.",hint:"다음 항목을 보내거나 큐를 일시정지하세요.",continue:"계속",pause:"일시정지",reason:"이유: {reason}"},reason:{network_error:"네트워크 오류.",timeout:"요청 시간 초과.",canceled_by_user:"사용자에 의해 취소됨.",rate_limited:"요청 제한 도달.",config_unavailable:"저장된 설정을 사용할 수 없음.",unknown:"요청 실패."},draftDecision:{title:"큐가 일시정지됨",description:"{count}개의 큐 메시지가 대기 중입니다. 새 입력을 어떻게 처리할지 선택하세요.",previewLabel:"새 입력:",continue:"큐 계속",append:"큐에 추가",replace:"큐를 버리고 보내기"}},chatStatus:{done:"완료.",error:"오류.",interrupted:"중단됨.",permissionDenied:"권한 거부됨.",planning:"계획 중…",drafting:"작성 중…",retrying:"재시도({retry}/{maxAttempts})…",runningTool:"{tool} 실행 중…",runningTools:"{count}개 도구 실행 중…",approvalPendingOther:"다른 승인이 대기 중({permission})…",awaitingApproval:"승인 대기 중…",awaitingApprovalWithPerm:"승인 대기 중({permission})…",awaitingApprovalWithRisk:"승인 대기 중({risk})…",awaitingAnswers:"답변 대기 중…",resumingApproved:"승인됨. 재개 중…",resumingDenied:"거부됨. 재개 중…",resuming:"재개 중…",autoApprovingWithRisk:"자동 승인 중({risk})…",riskFallback:"위험",toolFallback:"도구",thinking:"생각 중…",autoCompactionRequired:"컨텍스트가 한계에 가까워졌습니다. 먼저 압축이 필요합니다.",autoCompactionRequiredDetailed:"컨텍스트가 한계에 가까움 · 다음 요청은 약 {estimated} 토큰, 자동 압축 시작 임계값은 {threshold} 토큰이므로 먼저 압축이 필요합니다.",compressed:"컨텍스트 압축됨 · {removed}개의 이전 메시지를 요약으로 접음, 약 {saved} 입력 토큰 절약({elapsed}ms)",autoCompactedDetailed:"자동 압축 완료 · {removed}개의 이전 메시지를 요약으로 접음, 예상 입력 {before} -> {after} 토큰, 약 {saved} 토큰 절약",autoCompactedNotReduced:"자동 압축 완료 · {removed}개의 이전 메시지를 요약으로 접었지만, 예상 입력이 {before}에서 {after} 토큰으로 변하여 요청 크기가 줄지 않았습니다",autoCompactedSaved:"자동 압축 완료 · {removed}개의 이전 메시지를 요약으로 접음, 약 {saved} 토큰 절약",autoCompactedCountOnly:"자동 압축 완료 · {removed}개의 이전 메시지를 요약으로 접었습니다",interruptedMarkdown:"> **중단됨** · 사용자가 응답을 취소했습니다(`Esc`).",awaitingApprovalPrefix:"승인 대기",awaitingAnswersPrefix:"답변 대기",approvalPendingPrefix:"다른 승인 대기 중",autoApprovingPrefix:"자동 승인 중"},chatParts:{thinking:"생각",plan:"계획",todo:"할 일"},chatRender:{userLabel:"사용자",outputLabel:"↳ 출력",outputLabelShort:"출력:",canceled:"취소됨",inputLabel:"입력:",collapse:"...(접기)",moreLines:"...({count}줄 더)",moreLinesOmitted:"...({count}줄 생략; {envVar}로 늘리기)",streamingTail:"…(스트리밍: 마지막 {shown}자 표시; {omitted}자 생략)",copy:"복사",userResponses:"사용자 응답:",approvalQueued:"이전 승인 완료 대기 중…",proposedPlan:{title:"제안된 계획"},llmMeta:{changedFiles:"{count}개 파일 변경: {files}",changedFilesMore:"+{count}개 더",revertHint:"팁: 이 메시지를 클릭 -> 메시지 되돌리기로 이 턴을 취소할 수 있습니다.",changedFilesCardTitle:"{count}개 파일 변경:",revertButton:"되돌리기"},toolName:{explore:"탐색",subagent:"서브에이전트"},toolSuffix:{offset:"오프셋 {value}",limit:"제한 {value}",matches:"{count}개 일치",todos:"{count}개 할 일",results:"{count}개 결과",results_one:"{count}개 결과"},toolGroup:{readFiles:"{count}개 파일 읽기",writeFiles:"{count}개 파일 쓰기",editFiles:"{count}개 파일 편집",globPatterns:"{count}개 패턴 Glob",globSingle:"{pattern} Glob",grepPatterns:"{count}개 패턴 Grep",bashCommands:"{count}개 명령 실행",searchQueries:"{count}개 쿼리 검색",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"검색은 네트워크에 접근할 수 있습니다.",bash:"Bash는 명령을 실행할 수 있습니다.",edit:"파일 변경은 로컬 파일을 수정할 수 있습니다.",grep:"Grep은 로컬 파일을 읽을 수 있습니다."},inlineHint:"키: ↑↓←→로 이동, Enter로 선택.",awaitingUserAction:"작업을 기다리고 있습니다: 승인 / 항상 승인 / 거부를 선택하세요.",decision:{userDenied:"사용자가 승인을 거부했습니다"},denied:{title:"# 도구 권한 거부됨",toolLine:"- 도구: `{tool}`",permissionLine:"- 권한: `{permission}`",hint:"tool_call을 다시 선택하여 재시도할 수 있습니다."},summary:{title:"# 승인 및 실행된 도구",permissionLine:"`{tool}`에 대한 `{permission}` 권한이 승인되었습니다."},required:"승인 필요({risk}).",args:{commandWithDescription:"명령: {command} - {description}",command:"명령: {command}",description:"설명: {description}",raw:"인자: {args}"}},pathPicker:{titleWorkspace:"작업 공간 선택",titleFile:"파일 선택",placeholderWorkspace:"경로를 입력(../ 등). Tab으로 자동완성, Enter로 디렉토리 선택.",placeholderFile:"경로를 입력(../ 등). Tab으로 자동완성, Enter로 파일 선택."},providerDialogs:{customLabel:"사용자 정의",customDetail:"사용자 정의",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"DimCode OAuth로 로그인",addCustomLabel:"사용자 정의 프로바이더 추가",addCustomDetail:"사용자 정의 프로바이더 추가",providerFallback:"프로바이더",adapter:{openai:"OpenAI",openaiOpenRouter:"OpenAI 호환(OpenRouter)",openaiLocal:"OpenAI 호환(로컬 엔드포인트)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"설정됨",notConfigured:"미설정"},manage:{title:"사용자 정의 프로바이더: {provider}",connect:"연결",connectDetail:"API 키 / Base URL 편집",rename:"이름 변경",renameDetail:"프로바이더 이름 편집",models:"모델 편집",modelsDetail:"사용 가능한 모델 ID 업데이트",delete:"삭제",deleteDetail:"이 프로바이더 제거"},deleteConfirm:{title:"{provider}을(를) 삭제하시겠습니까?",confirm:"삭제(확인)",confirmDetail:"이 작업은 되돌릴 수 없습니다",cancelDetail:"프로바이더 유지"},nameDialog:{title:"사용자 정의 프로바이더 이름",label:"프로바이더 이름",placeholder:"예: DeepSeek(Proxy)"},modelsDialog:{title:"사용자 정의 프로바이더 모델",modelsTitle:"모델",modelsPlaceholder:"모델 ID(, 또는 줄바꿈)",hint:", / 줄바꿈 구분 • Shift+Enter 줄바꿈 • Enter 적용",fetch:"모델 가져오기",fetching:"모델 가져오는 중…"},modelsFetchDialog:{title:"모델 선택",searchPlaceholder:"모델 필터",hint:"Space 전환 • Enter 확인 • Esc 취소"},toast:{modelSet:"모델이 {provider} / {model}(으)로 설정되었습니다.",noModels:"사용 가능한 모델이 없습니다. 먼저 프로바이더에 연결하세요(/connect).",connectFirst:"첫 메시지를 보내기 전에 프로바이더에 연결하세요(/connect).",apiKeyRequired:"API 키가 필요합니다.",baseUrlRequired:"Base URL이 필요합니다.",baseUrlInvalid:"Base URL은 http:// 또는 https://로 시작해야 합니다.",connected:"{provider}에 연결되었습니다.",connectedSelectModel:"{provider}에 연결되었습니다. 모델을 선택하세요.",connectedCheckFailed:"{provider}에 연결되었지만 자체 확인 실패: {reason}",connectionTestPassed:"연결 테스트 통과: {provider}.",connectionTestFailed:"연결 테스트 실패: {provider} - {reason}",connectionActionUpdateKey:"조치: 연결을 다시 열어 API 키를 업데이트한 후 다시 테스트하세요.",connectionActionFixBaseUrl:"조치: Base URL 경로를 확인(보통 /v1로 끝남)한 후 다시 테스트하세요.",connectionActionSwitchKey:"조치: 잠시 기다리거나 다른 키/프로바이더로 전환하세요.",connectionActionRetryTest:"조치: 네트워크/프록시를 확인하고 연결 테스트를 다시 실행하세요.",noModelsFetching:"모델이 아직 없습니다. 모델 목록을 가져오는 중…",firstUseGuide:'빠른 시작: 1) /connect 2) /models 3) "hello" 보내기',firstUseSendHello:'다음 단계: 첫 메시지를 보내세요(예: "hello").',connectionCheckUnauthorized:"401 인증 오류: API 키와 프로바이더 유형을 확인하세요.",connectionCheckForbidden:"403 접근 금지: 이 키에 이 프로바이더/모델에 대한 권한이 없을 수 있습니다.",connectionCheckNotFound:"404 찾을 수 없음: Base URL 경로를 확인하세요(OpenAI 호환은 보통 /v1로 끝남).",connectionCheckRateLimited:"429 요청 제한: 잠시 기다린 후 재시도하거나 다른 키/프로바이더로 전환하세요.",connectionCheckTimeout:"연결 시간 초과: 네트워크/프록시를 확인하고 재시도하세요.",connectionCheckNetwork:"네트워크 연결 실패: DNS/프록시/Base URL을 확인하세요.",connectionCheckFailed:"연결 확인 실패: {error}",apiKeyCleared:"{provider}의 API 키가 삭제되었습니다.",customAdded:"사용자 정의 프로바이더 추가됨: {provider}.",customRenamed:"사용자 정의 프로바이더 이름 변경됨: {provider}.",customModelsUpdated:"사용자 정의 프로바이더 모델 업데이트됨: {provider}.",customDeleted:"사용자 정의 프로바이더 삭제됨: {provider}.",modelsRequired:"모델을 최소 하나 추가하세요.",modelsEmpty:"모델을 찾을 수 없습니다.",modelsFetchFailed:"모델 가져오기 실패: {error}",modelsFetchChatCompletions:"/chat/completions 또는 /responses Base URL에서는 모델 목록을 가져올 수 없습니다.",manualModelsRequired:"이 엔드포인트는 자동 모델 검색을 지원하지 않습니다. 모델 설정에서 수동으로 입력하세요.",nameRequired:"프로바이더 이름은 필수입니다.",nameConflict:"프로바이더 이름이 이미 존재합니다."}},copyToast:{copiedToClipboard:"클립보드에 복사됨"}};var pt_BR_default={common:{apply:"Aplicar",cancel:"Cancelar",close:"Fechar",confirm:"Confirmar",yes:"Sim",no:"Não",exit:"Sair",back:"Voltar",next:"Próximo",save:"Salvar",empty:"—",unknownError:"Erro desconhecido",inputClearTip:"Ctrl+C limpar",total:"Total"},configDialog:{title:"Configurações",hint:"Tab/Shift+Tab trocar campo • Enter Aplicar • Esc Cancelar",modelsTitle:"Modelos (personalizado)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"Janela de Contexto",contextWindowLocked:"Janela de Contexto (definido pelo modelo)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperatura",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperatura: apenas números e "."',maxTokensTitle:"Máx. Tokens de Saída",maxTokensPlaceholder:"32000",baseUrlTitle:"URL Base (compatível com OpenAI)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Atual:",apiKeyNotSet:"(não definido)",apiKeyTitle:"Chave API",apiKeyPlaceholder:"Cole uma nova chave para atualizar (deixe vazio para manter)",interleavedThinkingTitle:"Pensamento Intercalado (Space para alternar)",interleavedThinkingLocked:"Pensamento Intercalado (definido pelo modelo)",interleavedThinkingOpen:"Ativado",interleavedThinkingClose:"Desativado",tipIntensityTitle:"Intensidade de Dicas",tipIntensityOff:"Desligado",tipIntensityLow:"Baixa",tipIntensityStandard:"Padrão",shortcutsTitle:"Atalhos",shortcutCommandsLabel:"Comandos",shortcutTimelineLabel:"Linha do tempo",shortcutNewSessionLabel:"Nova sessão",shortcutsPlaceholder:"ex: mod+p",shortcutsHint:"Use mod/ctrl/alt/shift + tecla (a-z, 0-9, F1-F12)."},languageDialog:{title:"Idioma",hint:"Enter Aplicar • Esc Cancelar",languageTitle:"Idioma",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Esforço de Pensamento",hint:"Enter Aplicar • Esc Cancelar",effortTitle:"Esforço de Raciocínio",applied:"Esforço de raciocínio definido como {effort}",option:{low:"Baixo",medium:"Médio",high:"Alto",xhigh:"Muito alto",max:"Máx",minimal:"Mínimo",none:"Nenhum",off:"Desligado",auto:"Automático"}},toolSettingsDialog:{title:"Config. de Ferramentas",hint:"Enter Aplicar • Esc Cancelar",websearchTitle:"Chave API WebSearch",apiKeyCurrentPrefix:"Atual:",apiKeyNotSet:"(não definido)",apiKeyInvalidCjk:"A chave API não pode conter caracteres chineses.",apiKeyInvalidSpaces:"A chave API não pode conter espaços.",apiKeyPlaceholder:"Cole a chave Serper API"},pluginsDialog:{title:"Plugins",hint:"Selecione um plugin para configurar • Esc Fechar",serperSearch:"Serper Search",serperSearchDetail:"Busca web via Serper API",configured:"Configurado",notConfigured:"Não configurado",serperConfigTitle:"Config. Serper Search",serperConfigHint:"Tab Alternar • Enter Aplicar • Esc Cancelar"},skillsDialog:{title:"Habilidades",hint:"Enter Aplicar • Esc Cancelar",empty:"Nenhuma habilidade disponível",emptyFiltered:"Nenhuma habilidade correspondente"},timelineDialog:{title:"Linha do tempo",hint:"Tab Filtrar • Enter Abrir • Esc Fechar",empty:"Ainda não há mensagens",emptyFiltered:"Nenhuma entrada correspondente",filterAll:"Todas as mensagens",filterUser:"Mensagens do usuário",filterTool:"Chamadas de ferramentas"},mcpSettingsDialog:{title:"MCP",hint:"Edite o arquivo mcp.json para configurar servidores MCP • Esc Fechar",configFileLabel:"Arquivo de config.:",noServersHint:"Nenhum servidor MCP configurado ainda.",serverCount:"{count} servidor(es) configurado(s)",guideText:"Edite o arquivo acima para adicionar ou modificar servidores MCP.",openFile:"Abrir Arquivo",reload:"Recarregar",close:"Fechar",reloaded:"Configuração MCP recarregada.",reloadFailed:"Falha ao recarregar: {error}",status:"Status",toolCount:"Ferramentas",disabled:"desativado",testConnection:"Testar",testing:"Testando conexões...",testComplete:"Teste concluído.",testPartial:"Teste concluído com erros.",testFailed:"Conexão falhou: {error}",invalidJson:"JSON inválido: {error}",invalidShape:'JSON MCP inválido: esperado "mcpServers".',invalidServer:"Servidor MCP inválido: {name}",noServers:"Nenhum servidor MCP encontrado.",lintOk:"Sintaxe JSON OK",lintAt:"{error} (linha {line}, coluna {column})",lintUnclosed:"{char} não fechado (linha {line}, coluna {column})",lintInvalid:"{error}",exampleFormat:"Formato de exemplo:"},toolApprovalsDialog:{title:"Aprovações de Ferramentas",useAuto:"Automático",useNormal:"Normal",useStrict:"Restrito",close:"Fechar",focusedTitleAuto:"AUTOMÁTICO",focusedTitleNormal:"NORMAL",focusedTitleStrict:"RESTRITO",focusedTitleClose:"FECHAR",focusedDescAuto:"Aprovar automaticamente todas as chamadas. Sem confirmação (mais rápido, menos seguro).",focusedDescNormal:"Aprovar automaticamente ferramentas de leitura. Confirmar antes de escrever/executar.",focusedDescStrict:"Exigir confirmação para toda chamada (mais seguro, mais lento).",focusedDescClose:"Fechar este diálogo sem alterar a configuração atual.",currentPrefix:"Atual: {mode}",tip:"Dica: Tab ou ↑/↓ para mover entre botões, Enter para confirmar, Esc para fechar."},settingsDialog:{pendingApproval:"Resolva a aprovação pendente antes de alterar as configurações.",invalidShortcut:"Atalho inválido para {label}: {value}",shortcutCommands:"Atalho de comandos",shortcutTimeline:"Atalho da linha do tempo",shortcutNewSession:"Atalho de nova sessão",toolApprovalsApplied:"Aprovações de ferramentas: {mode}",applied:"Configurações aplicadas."},exitAppDialog:{title:"Sair do DimCode",confirm:"Sair agora?",warning:"Uma resposta do agente ainda está em andamento. Sair irá interrompê-la.",reasonPrefix:"Motivo: {reason}"},approvalDialog:{title:"Aprovar Permissão de Ferramenta",toolLabel:"Ferramenta: {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Permissão: {permission} ({risk})",descriptionLabel:"Descrição: {description}",commandLabel:"Comando:",inlineActionHint:"↑/← Anterior ↓/→ Próximo Enter Confirmar 1/2/3 Escolher",inlineActionHintCompact:"←/→ Mover Enter Confirmar 1/2/3 Escolher",buttons:{approve:"Aprovar",alwaysApprove:"Sempre aprovar",deny:"Negar",always:"Sempre",ok:"OK",no:"Não",y:"S",all:"Tudo",n:"N"}},askUserDialog:{noQuestionsTitle:"Sem Perguntas",noQuestionsBody:"Nenhuma pergunta para responder.",title:"Pergunta {index}/{total}: {header}",defaultHeader:"Pergunta",prev:"Anterior",next:"Próxima",submit:"Enviar",otherOption:"Outro",otherDetail:"Forneça uma resposta personalizada",inlineHintOptions:"Teclas: ↑↓ mover, ←→ trocar pergunta, Enter selecionar.",inlineHintMulti:"Multi-seleção: Space para alternar seleção.",inlineHintButtons:"Tab para botões, ←→ trocar, Enter ativar, ↑ volta às opções.",inlineHintNav:"Ctrl+Left / Ctrl+Right (ou Ctrl+A / Ctrl+E) para trocar perguntas.",inlineHintSubmit:"Ctrl+Enter enviar, Esc cancelar.",inlineButtonPrev:"[Anterior]",inlineButtonNext:"[Próxima]",inlineButtonSubmit:"[Enviar]",inlineButtonCancel:"[Cancelar]",inlineActionHint:"Space Selecionar ← Anterior → Próxima Enter Próxima/Enviar Esc Cancelar",inlineActionHintCompact:"Space Selecionar ←/→ Anterior/Próxima Enter Próxima/Enviar Esc Cancelar",optionsSummaryAll:"{count} opções",optionsSummaryVisibleMore:"{count} opções ({start}-{end}) ↓ mais",multiSelectHint:"[Multi-seleção] Space para alternar, Enter para confirmar",singleSelectHint:"[Seleção única] Use setas, Enter para confirmar",customAnswerLabel:"Resposta personalizada:",customAnswerPlaceholder:"Digite sua resposta...",otherPlaceholder:"Outro selecionado — digite sua resposta e pressione Enter."},nextApiOAuthDialog:{title:"Login DimCode OAuth",copyUrl:"Copiar URL",login:"Entrar",logout:"Sair",statusTitle:"Status",statusAuthenticated:"✓ Conectado como {email}",statusLoading:"⏳ Autenticando...",statusNotLoggedIn:"✗ Não conectado",instructionAuthenticated:"Use ↑↓ para navegar, Enter para selecionar, ou números 1-9",instructionLoading:"Pressione C para copiar a URL abaixo se o navegador não abriu",instructionNeedsSetup:"Verifique o redirect_uri, scopes e estado ativo do DimCode OAuth, depois tente novamente",instructionWithUrl:"Pressione C para copiar a URL OAuth abaixo, ou Enter para abrir o navegador",instructionUnauthed:"Pressione Enter para entrar com DimCode OAuth, ou Esc para fechar",instructionManualCallback:"Copie a URL abaixo, faça login no navegador e cole a URL de redirecionamento na caixa de entrada.",oauthUrlTitleLoading:"URL OAuth (copie se o navegador não abriu)",oauthUrlTitleReady:"URL OAuth (pronto para usar)",scrollIndicator:" [{start}-{end} de {total}]",selectModelTitle:"Selecionar Modelo (↑↓/1-9, Enter para selecionar){indicator}",aboutTitle:"Sobre DimCode OAuth",setupTitle:"Erro de login OAuth",aboutBulletOne:"• Usa o cliente DimCode OAuth integrado",aboutBulletTwo:"• Obtém modelos relay após login e salva a configuração do provedor",aboutBulletThree:"• Usa OAuth refresh tokens em vez de API key de longa duração",viewAllPlans:"Ver Todos os Planos →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"Conta DimCode",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"Gerando URL OAuth...",urlReady:"URL OAuth pronta! Copie ou pressione Enter para abrir o navegador.",generateUrlFailed:"Falha ao gerar URL OAuth: {error}",startingLogin:"Iniciando login OAuth...",browserOpened:"Navegador aberto. Se não, copie a URL do diálogo.",copyUrlToLogin:"Copie a URL OAuth do diálogo para fazer login.",urlCopied:"URL OAuth copiada para a área de transferência.",urlCopyFailed:"Falha ao copiar URL OAuth.",authSuccess:"Autenticado com sucesso pelo DimCode OAuth!",loginFailed:"Login OAuth falhou: {error}",loggedOut:"Desconectado do DimCode OAuth",loggedOutWithRemoteWarning:"Desconectado do DimCode OAuth, mas revogação remota falhou: {error}",logoutFailed:"Falha ao sair: {error}",initFailed:"Erro de inicialização do diálogo: {error}",modelSwitched:"Modelo alterado para {model}",selectModelFailed:"Falha ao selecionar modelo: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Debug",titleDebugging:"Depurando",copy:"copiar",proceed:"prosseguir",fixed:"corrigido",body:"Adicionei logs de debug (e possivelmente uma correção). Tente reproduzir o problema e escolha um resultado."},exitSessionDialog:{title:"Sair da Sessão",confirm:"Sair da sessão atual e voltar ao Início?",note:"A próxima mensagem iniciará uma nova sessão."},messageActionsDialog:{title:"Ações da Mensagem",revert:"Reverter mensagens",revertWithFiles:"Reverter mensagens e alterações de arquivos",revertKeepFiles:"Reverter mensagens (manter alterações)",revertFilesOnly:"Reverter apenas alterações de arquivos",copy:"Copiar texto da mensagem",fork:"Bifurcar para criar nova sessão",pin:"Fixar mensagem",unpin:"Desafixar mensagem"},pathPickerDialog:{hint:"↑/↓ selecionar • Tab autocompletar • Enter confirmar • Esc fechar"},providerConnectDialog:{title:"Conectar {provider}",providerFallback:"Provedor",hint:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintOpenAI:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintGemini:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintAnthropic:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintGeneric:"Tab trocar • Ctrl+C limpar • Enter Aplicar",applyingHint:"Testando conexão, aguarde...",applyingButton:"Aplicando...",testConnection:"Testar conexão",baseUrlStatusAutoFix:"Correção automática: {value}",baseUrlStatusInvalid:"Base URL deve ser http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"Chave API",apiKeyPlaceholder:"Cole uma nova chave para atualizar (deixe vazio para manter)",apiKeyCurrent:"Atual: {value}",apiKeyNotSet:"Atual: (não definido)",apiKeyInvalidCjk:"A chave API não pode conter caracteres chineses.",apiKeyInvalidSpaces:"A chave API não pode conter espaços.",clearKey:"Excluir",useDetectedKey:"Usar {name}",disconnectButton:"Desconectar",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"Desligado",toggleOn:"Ligado",toggleHint:"Tab trocar • ←/→ alterar • Space alternar"},redoConfirmDialog:{title:"Confirmar Refazer",body:"Tem certeza de que deseja restaurar as mensagens revertidas?"},renameSessionDialog:{title:"Renomear sessão",label:"Nome da sessão",placeholder:"ex: Notas de planejamento"},sessionsDialog:{timeNow:"agora",timeMinutes:"{count} min",timeHours:"{count} h",timeDays:"{count} d",newSession:"Nova sessão",title:"Sessões ({count})",titleScoped:"Sessões ({count}/{total})",scope:"Escopo: {cwd}",loading:"Carregando…",confirmDelete:"Confirmar exclusão: pressione Delete novamente",header:"{count} sessões • Setas para navegar • Enter selecionar{range}{activity}",headerRange:" • Exibindo {start}-{end}",runningCount:"{count} em execução",pausedCount:"{count} aguardando confirmação",hint:"Digite para buscar • ←/→ botões • Enter confirmar • Esc fechar",focusPrefix:"Foco: {focus}",focusList:"Lista",focusButtons:"Botões",noSessionsCwd:"Nenhuma sessão neste diretório",noSessions:"Nenhuma sessão salva ainda",nodeOnly:"Sessões estão disponíveis apenas no modo Node/CLI.",newSessionTitle:"Nova Sessão",newSessionTarget:"uma nova sessão",busy:{agentResponding:"Agente ainda está respondendo",awaitingAskUser:"Aguardando respostas AskUser",awaitingToolApproval:"Aguardando aprovação de ferramenta",pendingApproval:"Aprovação pendente"},buttons:{open:"Abrir",delete:"Excluir",deleteConfirm:"Excluir (confirmar)",scope:"Escopo: {scope}",scopeCwd:"CWD",scopeAll:"Todos",refresh:"Atualizar"}},sessionsOverlay:{title:"Sessões",hint:"Enter Selecionar • Esc Fechar • Ctrl+R Atualizar",loading:"Carregando sessões...",empty:"Ainda não há sessões salvas."},switchSessionDialog:{title:"Trocar Sessão",confirm:"Trocar e Interromper",target:"Trocar para {target}?",fallback:"Trocar de sessão agora?",warning:"Isso interromperá a resposta/fluxo na sessão ativa.",reason:"Motivo: {reason}"},themeDialog:{title:"Tema",hint:"Enter Aplicar • Esc Cancelar",mode:"Modo",light:"Claro",dark:"Escuro",unavailable:"Este terminal não suporta temas alternáveis.",fallback:"Um tema fallback ANSI claro/escuro fixo é usado aqui.",tip:"Dica: o padrão segue o tema do sistema."},commandPalette:{searchPlaceholder:"Buscar…",noMatches:"Sem resultados",hint:"Digite para filtrar • Enter: abrir • Esc: fechar",title:"Comandos"},skills:{title:"Habilidades"},help:{title:"Ajuda",modeLabel:"Modo: {mode}",modeDetail:"Modo do assistente atual.",shortcutsLabel:"Atalhos",onboarding:`Bem-vindo! Início rápido:
1157
+ 팁: {commandsKey}(으)로 명령 팔레트를 엽니다.`,items:{help:"도움말 및 단축키(F1)",commands:"명령 팔레트(Ctrl+P)",back:"이전 점프로 돌아가기",status:"상태 세부정보 전환"}},commands:{help:{label:"도움말",detail:"단축키 및 명령(F1)"},sessions:{label:"세션",detail:"세션 선택/생성(/sessions)"},timeline:{label:"타임라인",detail:"사용자 메시지로 이동(/timeline)"},newSession:{label:"새 세션",detail:"새 세션 시작(/new)"},connectProvider:{label:"프로바이더 연결",detail:"프로바이더 연결(/connect)"},models:{label:"모델",detail:"모델 선택(/models)"},toolApprovals:{label:"도구 승인",detail:"승인 설정(/approvals)"},toolSettings:{label:"도구 설정",detail:"도구별 설정(/tool-settings)"},mcpHub:{label:"MCP",detail:"MCP 커넥터 및 설정 관리(/mcp)"},plugins:{label:"플러그인",detail:"플러그인 관리(/plugins)"},debug:{label:"디버그",detail:"SDK observability 로그(/debug)"},mcpSettings:{label:"MCP(고급 JSON)",detail:"MCP 서버 JSON 직접 설정(/mcp-settings)"},language:{label:"언어",detail:"UI 언어 전환(/language)"},settings:{label:"설정",detail:"사용자 정의 프로바이더 설정(/settings, Ctrl+K)"}},homePage:{multilineTitle:"여러 줄 텍스트",multilineTitleWithCount:"여러 줄 텍스트({count}줄)",providerCustom:"사용자 정의",reviewPrompt:"코드 변경 사항을 리뷰해줘",footerCwd:"cwd {cwd}",hints:{switchMode:"모드 전환",commands:"명령"},tips:{greeting:"다시 오셨군요! {commandsKey} 또는 {init}을(를) 시도해 보세요.",commandsAlias:"팁: {key}(으)로 명령 팔레트를 열 수 있습니다."},prompts:{help:"도움말 및 단축키(F1)",sessions:"세션 목록/선택",connect:"프로바이더 연결",models:"모델 선택",newSession:"새 세션 시작",approvals:"도구 승인 설정(auto/normal/strict)",commands:"명령 팔레트 열기",toolSettings:"도구별 설정",mcpSettings:"MCP 열기",plugins:"플러그인 관리",language:"UI 언어 전환",theme:"테마 선택",status:"상태 세부정보 전환",review:"코드 변경 리뷰",init:"AGENTS.md 초기화/개선",skills:"로드된 스킬 목록",exit:"앱 종료",debug:"디버그 대화상자(채팅)",settings:"사용자 정의 프로바이더 설정"},commandPalette:{connect:"프로바이더 연결",models:"모델 선택"},commands:{debugLabel:"디버그",debugDetail:"SDK observability 로그(/debug)"},toast:{approvalsUsage:"/approvals을 사용하세요(on/off 없음).",customProviderOnly:"설정은 사용자 정의 프로바이더만 가능합니다.",redoChatOnly:"다시 실행은 채팅 보기에서만 가능합니다.",retryChatOnly:"재시도는 채팅 보기에서만 가능합니다.",pinsChatOnly:"고정은 채팅 보기에서만 가능합니다.",renameChatOnly:"이름 변경은 채팅 보기에서만 가능(/rename <title>).",commandRemoved:"이 명령은 더 이상 사용할 수 없습니다: {command}",helpAliasRemoved:"F1을 눌러 도움말을 보세요.",deleteConfirm:"Delete를 다시 눌러 삭제를 확인하세요.",themeToggled:"테마: {mode}",pasteImagePending:"이미지 처리 중입니다. 잠시 기다려주세요."}},chatPage:{placeholder:"무엇이든 물어보세요…(줄바꿈: Shift+Enter 또는 Ctrl+J)",placeholderAwaitingApproval:"승인 대기 중: 승인 / 거부를 선택한 후 계속하세요.",reviewPrompt:"코드 변경 사항을 리뷰해줘",notification:{approvalTitle:"[승인 필요] 도구 권한",approvalMessage:"DimCode가 도구 승인을 기다리고 있습니다: {tool}.",doneTitle:"[작업 완료]",doneMessage:"DimCode가 작업을 완료했습니다.",doneMessageWithDuration:"DimCode가 작업을 완료했습니다({duration}).",doneMessageWithTools:"DimCode가 작업을 완료했습니다(도구 {tools}회 호출).",doneMessageWithToolsAndDuration:"DimCode가 작업을 완료했습니다({duration}, 도구 {tools}회 호출)."},headerStats:"{messages} 메시지 · 총 {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"집약,생각,추론,계획,분석,종합,개선,작성",modelFallback:"모델",mode:{plan:"계획",agent:"에이전트",debug:"디버그"},status:{approvalsAuto:"자동",approvalsAll:"전체",blockedByApproval:"승인 대기 중",awaitingApprovalAction:"승인을 기다리고 있습니다: 승인 / 거부를 선택하여 계속하세요."},footer:{dragSelect:"드래그하여 선택",openLink:"Ctrl+클릭으로 파일 또는 링크 열기",esc:"esc",interrupt:"중단",approvalPaused:"⏸ 일시정지",approvalPausedHint:"승인 대기 중(Enter로 선택).",shortcuts:"Ctrl+K: 설정 Ctrl+O: 도구/생각 펼치기/접기 Cmd+Delete/Ctrl+W: 입력 지우기 Tab: 모드 전환 {commandsKey}: 명령",shortcutsCompact:"Ctrl+K: 설정 Ctrl+O: 도구/생각 Cmd+Delete/Ctrl+W: 지우기 Tab: 모드 전환 {commandsKey}: 명령",shortcutsMicro:"Ctrl+O: 도구 {commandsKey}: 명령",shortcutsMini:"{commandsKey}: 명령"},session:{new:"새로"},timeline:{title:"타임라인",empty:"(비어 있음)",filterAll:"전체 메시지",filterUser:"사용자 메시지",filterTool:"도구 호출"},pins:{title:"고정",empty:"(비어 있음)"},jumpToBottom:{button:"↓"},prompts:{help:"도움말 및 단축키(F1)",newSession:"새 세션 시작",resume:"일시정지된 큐 재개",sessions:"세션 목록/선택",timeline:"사용자 메시지로 이동",pins:"고정된 메시지 열기",pin:"마지막 메시지 고정",back:"이전 점프로 돌아가기",connect:"프로바이더 연결",models:"모델 선택",theme:"테마 전환",approvals:"도구 승인 설정(auto/normal/strict)",commands:"명령 팔레트 열기",toolSettings:"도구별 설정",mcpSettings:"MCP 열기",plugins:"플러그인 관리",language:"UI 언어 전환",status:"상태 세부정보 전환",review:"코드 변경 리뷰",retry:"마지막 사용자 메시지 재시도",compact:"세션 컨텍스트 압축",init:"AGENTS.md 초기화/개선",rename:"현재 세션 이름 변경",skills:"로드된 스킬 목록",exit:"앱 종료",debug:"디버그 대화상자",settings:"사용자 정의 프로바이더 설정"},commands:{pinsLabel:"고정",pinsDetail:"고정된 메시지 열기",backLabel:"뒤로",backDetail:"이전 점프로 돌아가기",debugLabel:"디버그",debugDetail:"SDK observability 로그(/debug)",statusLabel:"상태",statusDetail:"상태 세부정보 전환",themeLabel:"테마",themeDetail:"색상 테마 전환"},tips:{contextWarn:"팁: 컨텍스트가 가득 차고 있습니다. /compact 또는 /new로 응답 품질을 유지하세요.",contextCritical:"팁: 컨텍스트 한계에 가까워지고 있습니다. /new로 새 세션을(또는 먼저 /compact) 시작하세요.",timeline:"팁: 대화가 길어지면 /tl로 특정 메시지로 돌아갈 수 있습니다.",timelineAlias:"팁: /tl은 /timeline의 단축키입니다.",commandsAlias:"팁: {key}(으)로 명령 팔레트를 열 수 있습니다.",errorRecovery:"팁: 문제가 생기면 /compact 또는 /new를 시도해 보세요.",greeting:"다시 오셨군요! {commandsKey} 또는 {init}을(를) 시도해 보세요.",compactDelight:"좋아요! 컨텍스트를 간결하게 유지하면 도움이 됩니다.",addTests:'완료! 테스트를 추가할까요? "예" 또는 "ok"로 답해주세요.'},confirm:{addTests:"방금 한 변경에 대한 테스트를 추가해 주세요."},toast:{customProviderOnly:"설정은 사용자 정의 프로바이더만 가능합니다.",renameNodeOnly:"이름 변경은 Node/CLI 모드에서만 가능합니다.",noActiveSession:"이름을 변경할 세션이 없습니다.",sessionNameEmpty:"세션 이름은 비워둘 수 없습니다.",sessionRenamed:"세션 이름이 변경됨: {title}",renameFailed:"세션 이름 변경에 실패했습니다.",linkOpenHint:"팁: Ctrl+클릭으로 파일이나 링크를 열 수 있습니다.",copySuccess:"복사됨",copyFailed:"복사 실패",forkFailed:"세션 포크에 실패했습니다.",backEmpty:"돌아갈 이전 점프가 없습니다.",pinsEmpty:"고정된 메시지가 아직 없습니다.",pinEmpty:"고정할 메시지가 아직 없습니다.",pinned:"메시지를 고정했습니다.",unpinned:"고정을 해제했습니다.",debugUnavailable:"디버그 서버를 사용할 수 없습니다.",approvalsUsage:"/approvals을 사용하세요(on/off 없음).",debugDialogOpened:"디버그 대화상자가 열렸습니다.",debugDialogClosed:"디버그 대화상자가 닫혔습니다.",renameUsage:"사용법: /rename <title>",themeToggled:"테마: {mode}",statusCompactOn:"상태: 간략",statusCompactOff:"상태: 상세",compactingSession:"세션 압축 중...",compactSuccess:"세션이 압축됨: {message}",compactWarning:"세션이 압축되었지만 효과가 제한적임: {message}",compactSuccessDetailWithTokens:"처음 {count}개의 기록 메시지를 요약으로 접었습니다. 예상 입력 {before} -> {after} 토큰, 약 {saved} 토큰 절약.",compactSuccessDetailNotReduced:"처음 {count}개의 기록 메시지를 요약으로 접었지만, 예상 입력이 {before}에서 {after} 토큰으로 변하여 요청 크기가 줄지 않았습니다.",compactSuccessDetailCountOnly:"처음 {count}개의 기록 메시지를 요약으로 접었습니다.",compactSuccessDetailSummaryOnly:"새 대화 요약이 생성되었습니다.",compactFailed:"세션 압축 실패: {error}",compactFailedTokenLimit:"컨텍스트 예산 부족으로 압축에 실패했습니다. DIMCODE_CONTEXT_WINDOW을 올바르게 설정하거나, 더 큰 컨텍스트 모델로 전환하거나, /new를 사용하세요. 상세: {error}",retryEmpty:"재시도할 이전 사용자 메시지가 없습니다.",commandRemoved:"이 명령은 더 이상 사용할 수 없습니다: {command}",helpAliasRemoved:"F1을 눌러 도움말을 보세요.",waitForResponse:"현재 응답이 완료될 때까지 기다리거나 Esc를 눌러 중단하세요.",pasteImagePending:"이미지 처리 중입니다. 잠시 기다려주세요.",pendingApproval:"먼저 tool_approve를 처리하세요.",awaitingApprovalAction:"일시정지: 작업이 필요합니다. 권한 카드에서 승인 / 항상 승인 / 거부를 선택하세요.",awaitingApprovalStillWaiting:"승인 대기 중({seconds}초). 승인하거나 거부할 때까지 모델이 계속하지 않습니다.",pendingAskUser:"먼저 ask_user를 처리하세요.",notificationSessionBusy:"이 알림은 다른 사용 중인 세션의 것입니다. 먼저 해당 작업을 완료하거나 수동으로 세션을 전환하세요.",notificationSessionUnavailable:"여기서 이 알림의 세션을 열 수 없습니다.",notificationSessionSwitchFailed:"이 알림의 세션을 열지 못했습니다.",approvalNotActive:"이 승인은 대기 중입니다. 먼저 현재 승인을 처리하세요.",askUserNotActive:"이 ask_user 요청은 더 이상 활성 상태가 아닙니다."}},chatQueue:{label:"큐({count})",labelCompact:"큐 {count}",more:"+{count}개 더…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"큐 재개",state:{idle:"대기 중",running:"실행 중",paused:"일시정지",error:"오류"},item:{steerAction:"조정",steerReady:"첫 번째",steerPending:"다음",steerPaused:"일시정지"},toast:{enqueued:"큐에 추가됨(#{count}).",full:"큐가 가득 참(최대 5개). 하나를 삭제하거나 /new하세요.",cleared:"{count}개의 큐 항목을 삭제했습니다.",deleted:"{count}개의 큐 항목을 삭제했습니다. Ctrl+Z로 되돌리기.",steerPromoted:"steer로 승격됨. 큐가 재개되면 먼저 실행됩니다.",steerQueued:"steer를 즉시 주입할 수 없습니다. 승격되어 다음 라운드에서 먼저 실행됩니다.",steerSent:"steer가 수락되었습니다. 이번 라운드의 다음 모델 호출 전에 주입됩니다.",undo:"큐 삭제가 취소되었습니다.",pausedTip:"큐가 일시정지됨. {resume} 또는 {resumeText}(으)로 계속하거나 새 메시지를 보내 처리 방법을 선택하세요.",stale:"큐 일시정지: 요청이 멈춘 것 같습니다."},confirm:{title:"큐의 메시지를 계속 보내시겠습니까?",description:"이전 요청이 완료되지 않았습니다. 큐에 {count}개의 메시지가 대기 중.",hint:"다음 항목을 보내거나 큐를 일시정지하세요.",continue:"계속",pause:"일시정지",reason:"이유: {reason}"},reason:{network_error:"네트워크 오류.",timeout:"요청 시간 초과.",canceled_by_user:"사용자에 의해 취소됨.",rate_limited:"요청 제한 도달.",config_unavailable:"저장된 설정을 사용할 수 없음.",unknown:"요청 실패."},draftDecision:{title:"큐가 일시정지됨",description:"{count}개의 큐 메시지가 대기 중입니다. 새 입력을 어떻게 처리할지 선택하세요.",previewLabel:"새 입력:",continue:"큐 계속",append:"큐에 추가",replace:"큐를 버리고 보내기"}},chatStatus:{done:"완료.",error:"오류.",interrupted:"중단됨.",permissionDenied:"권한 거부됨.",planning:"계획 중…",drafting:"작성 중…",retrying:"재시도({retry}/{maxAttempts})…",runningTool:"{tool} 실행 중…",runningTools:"{count}개 도구 실행 중…",approvalPendingOther:"다른 승인이 대기 중({permission})…",awaitingApproval:"승인 대기 중…",awaitingApprovalWithPerm:"승인 대기 중({permission})…",awaitingApprovalWithRisk:"승인 대기 중({risk})…",awaitingAnswers:"답변 대기 중…",resumingApproved:"승인됨. 재개 중…",resumingDenied:"거부됨. 재개 중…",resuming:"재개 중…",autoApprovingWithRisk:"자동 승인 중({risk})…",riskFallback:"위험",toolFallback:"도구",thinking:"생각 중…",autoCompactionRequired:"컨텍스트가 한계에 가까워졌습니다. 먼저 압축이 필요합니다.",autoCompactionRequiredDetailed:"컨텍스트가 한계에 가까움 · 다음 요청은 약 {estimated} 토큰, 자동 압축 시작 임계값은 {threshold} 토큰이므로 먼저 압축이 필요합니다.",compressed:"컨텍스트 압축됨 · {removed}개의 이전 메시지를 요약으로 접음, 약 {saved} 입력 토큰 절약({elapsed}ms)",autoCompactedDetailed:"자동 압축 완료 · {removed}개의 이전 메시지를 요약으로 접음, 예상 입력 {before} -> {after} 토큰, 약 {saved} 토큰 절약",autoCompactedNotReduced:"자동 압축 완료 · {removed}개의 이전 메시지를 요약으로 접었지만, 예상 입력이 {before}에서 {after} 토큰으로 변하여 요청 크기가 줄지 않았습니다",autoCompactedSaved:"자동 압축 완료 · {removed}개의 이전 메시지를 요약으로 접음, 약 {saved} 토큰 절약",autoCompactedCountOnly:"자동 압축 완료 · {removed}개의 이전 메시지를 요약으로 접었습니다",interruptedMarkdown:"> **중단됨** · 사용자가 응답을 취소했습니다(`Esc`).",awaitingApprovalPrefix:"승인 대기",awaitingAnswersPrefix:"답변 대기",approvalPendingPrefix:"다른 승인 대기 중",autoApprovingPrefix:"자동 승인 중"},chatParts:{thinking:"생각",plan:"계획",todo:"할 일"},chatRender:{userLabel:"사용자",outputLabel:"↳ 출력",outputLabelShort:"출력:",canceled:"취소됨",inputLabel:"입력:",collapse:"...(접기)",moreLines:"...({count}줄 더)",moreLinesOmitted:"...({count}줄 생략; {envVar}로 늘리기)",streamingTail:"…(스트리밍: 마지막 {shown}자 표시; {omitted}자 생략)",copy:"복사",userResponses:"사용자 응답:",approvalQueued:"이전 승인 완료 대기 중…",proposedPlan:{title:"제안된 계획"},llmMeta:{changedFiles:"{count}개 파일 변경: {files}",changedFilesMore:"+{count}개 더",revertHint:"팁: 이 메시지를 클릭 -> 메시지 되돌리기로 이 턴을 취소할 수 있습니다.",changedFilesCardTitle:"{count}개 파일 변경:",revertButton:"되돌리기"},toolName:{explore:"탐색",subagent:"서브에이전트"},toolSuffix:{offset:"오프셋 {value}",limit:"제한 {value}",matches:"{count}개 일치",todos:"{count}개 할 일",results:"{count}개 결과",results_one:"{count}개 결과"},toolGroup:{readFiles:"{count}개 파일 읽기",writeFiles:"{count}개 파일 쓰기",editFiles:"{count}개 파일 편집",globPatterns:"{count}개 패턴 Glob",globSingle:"{pattern} Glob",grepPatterns:"{count}개 패턴 Grep",bashCommands:"{count}개 명령 실행",searchQueries:"{count}개 쿼리 검색",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"검색은 네트워크에 접근할 수 있습니다.",bash:"Bash는 명령을 실행할 수 있습니다.",edit:"파일 변경은 로컬 파일을 수정할 수 있습니다.",grep:"Grep은 로컬 파일을 읽을 수 있습니다."},inlineHint:"키: ↑↓←→로 이동, Enter로 선택.",awaitingUserAction:"작업을 기다리고 있습니다: 승인 / 항상 승인 / 거부를 선택하세요.",decision:{userDenied:"사용자가 승인을 거부했습니다"},denied:{title:"# 도구 권한 거부됨",toolLine:"- 도구: `{tool}`",permissionLine:"- 권한: `{permission}`",hint:"tool_call을 다시 선택하여 재시도할 수 있습니다."},summary:{title:"# 승인 및 실행된 도구",permissionLine:"`{tool}`에 대한 `{permission}` 권한이 승인되었습니다."},required:"승인 필요({risk}).",args:{commandWithDescription:"명령: {command} - {description}",command:"명령: {command}",description:"설명: {description}",raw:"인자: {args}"}},pathPicker:{titleWorkspace:"작업 공간 선택",titleFile:"파일 선택",placeholderWorkspace:"경로를 입력(../ 등). Tab으로 자동완성, Enter로 디렉토리 선택.",placeholderFile:"경로를 입력(../ 등). Tab으로 자동완성, Enter로 파일 선택."},providerDialogs:{customLabel:"사용자 정의",customDetail:"사용자 정의",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"DimCode OAuth로 로그인",addCustomLabel:"사용자 정의 프로바이더 추가",addCustomDetail:"사용자 정의 프로바이더 추가",providerFallback:"프로바이더",adapter:{openai:"OpenAI",openaiOpenRouter:"OpenAI 호환(OpenRouter)",openaiLocal:"OpenAI 호환(로컬 엔드포인트)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"설정됨",notConfigured:"미설정"},manage:{title:"사용자 정의 프로바이더: {provider}",connect:"연결",connectDetail:"API 키 / Base URL 편집",rename:"이름 변경",renameDetail:"프로바이더 이름 편집",models:"모델 편집",modelsDetail:"사용 가능한 모델 ID 업데이트",delete:"삭제",deleteDetail:"이 프로바이더 제거"},deleteConfirm:{title:"{provider}을(를) 삭제하시겠습니까?",confirm:"삭제(확인)",confirmDetail:"이 작업은 되돌릴 수 없습니다",cancelDetail:"프로바이더 유지"},nameDialog:{title:"사용자 정의 프로바이더 이름",label:"프로바이더 이름",placeholder:"예: DeepSeek(Proxy)"},modelsDialog:{title:"사용자 정의 프로바이더 모델",modelsTitle:"모델",modelsPlaceholder:"모델 ID(, 또는 줄바꿈)",hint:", / 줄바꿈 구분 • Shift+Enter 줄바꿈 • Enter 적용",fetch:"모델 가져오기",fetching:"모델 가져오는 중…"},modelsFetchDialog:{title:"모델 선택",searchPlaceholder:"모델 필터",hint:"Space 전환 • Enter 확인 • Esc 취소"},toast:{modelSet:"모델이 {provider} / {model}(으)로 설정되었습니다.",noModels:"사용 가능한 모델이 없습니다. 먼저 프로바이더에 연결하세요(/connect).",connectFirst:"첫 메시지를 보내기 전에 프로바이더에 연결하세요(/connect).",apiKeyRequired:"API 키가 필요합니다.",baseUrlRequired:"Base URL이 필요합니다.",baseUrlInvalid:"Base URL은 http:// 또는 https://로 시작해야 합니다.",connected:"{provider}에 연결되었습니다.",connectedSelectModel:"{provider}에 연결되었습니다. 모델을 선택하세요.",connectedCheckFailed:"{provider}에 연결되었지만 자체 확인 실패: {reason}",connectionTestPassed:"연결 테스트 통과: {provider}.",connectionTestFailed:"연결 테스트 실패: {provider} - {reason}",connectionActionUpdateKey:"조치: 연결을 다시 열어 API 키를 업데이트한 후 다시 테스트하세요.",connectionActionFixBaseUrl:"조치: Base URL 경로를 확인(보통 /v1로 끝남)한 후 다시 테스트하세요.",connectionActionSwitchKey:"조치: 잠시 기다리거나 다른 키/프로바이더로 전환하세요.",connectionActionRetryTest:"조치: 네트워크/프록시를 확인하고 연결 테스트를 다시 실행하세요.",noModelsFetching:"모델이 아직 없습니다. 모델 목록을 가져오는 중…",firstUseGuide:'빠른 시작: 1) /connect 2) /models 3) "hello" 보내기',firstUseSendHello:'다음 단계: 첫 메시지를 보내세요(예: "hello").',connectionCheckUnauthorized:"401 인증 오류: API 키와 프로바이더 유형을 확인하세요.",connectionCheckForbidden:"403 접근 금지: 이 키에 이 프로바이더/모델에 대한 권한이 없을 수 있습니다.",connectionCheckNotFound:"404 찾을 수 없음: Base URL 경로를 확인하세요(OpenAI 호환은 보통 /v1로 끝남).",connectionCheckRateLimited:"429 요청 제한: 잠시 기다린 후 재시도하거나 다른 키/프로바이더로 전환하세요.",connectionCheckTimeout:"연결 시간 초과: 네트워크/프록시를 확인하고 재시도하세요.",connectionCheckNetwork:"네트워크 연결 실패: DNS/프록시/Base URL을 확인하세요.",connectionCheckFailed:"연결 확인 실패: {error}",apiKeyCleared:"{provider}의 API 키가 삭제되었습니다.",customAdded:"사용자 정의 프로바이더 추가됨: {provider}.",customRenamed:"사용자 정의 프로바이더 이름 변경됨: {provider}.",customModelsUpdated:"사용자 정의 프로바이더 모델 업데이트됨: {provider}.",customDeleted:"사용자 정의 프로바이더 삭제됨: {provider}.",modelsRequired:"모델을 최소 하나 추가하세요.",modelsEmpty:"모델을 찾을 수 없습니다.",modelsFetchFailed:"모델 가져오기 실패: {error}",modelsFetchChatCompletions:"/chat/completions 또는 /responses Base URL에서는 모델 목록을 가져올 수 없습니다.",manualModelsRequired:"이 엔드포인트는 자동 모델 검색을 지원하지 않습니다. 모델 설정에서 수동으로 입력하세요.",nameRequired:"프로바이더 이름은 필수입니다.",nameConflict:"프로바이더 이름이 이미 존재합니다."}},copyToast:{copiedToClipboard:"클립보드에 복사됨"}};var pt_BR_default={common:{apply:"Aplicar",cancel:"Cancelar",close:"Fechar",confirm:"Confirmar",yes:"Sim",no:"Não",exit:"Sair",back:"Voltar",next:"Próximo",save:"Salvar",empty:"—",unknownError:"Erro desconhecido",inputClearTip:"Ctrl+C limpar",total:"Total"},configDialog:{title:"Configurações",hint:"Tab/Shift+Tab trocar campo • Enter Aplicar • Esc Cancelar",modelsTitle:"Modelos (personalizado)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"Janela de Contexto",contextWindowLocked:"Janela de Contexto (definido pelo modelo)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperatura",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperatura: apenas números e "."',maxTokensTitle:"Máx. Tokens de Saída",maxTokensPlaceholder:"32000",baseUrlTitle:"URL Base (compatível com OpenAI)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Atual:",apiKeyNotSet:"(não definido)",apiKeyTitle:"Chave API",apiKeyPlaceholder:"Cole uma nova chave para atualizar (deixe vazio para manter)",interleavedThinkingTitle:"Pensamento Intercalado (Space para alternar)",interleavedThinkingLocked:"Pensamento Intercalado (definido pelo modelo)",interleavedThinkingOpen:"Ativado",interleavedThinkingClose:"Desativado",tipIntensityTitle:"Intensidade de Dicas",tipIntensityOff:"Desligado",tipIntensityLow:"Baixa",tipIntensityStandard:"Padrão",shortcutsTitle:"Atalhos",shortcutCommandsLabel:"Comandos",shortcutTimelineLabel:"Linha do tempo",shortcutNewSessionLabel:"Nova sessão",shortcutsPlaceholder:"ex: mod+p",shortcutsHint:"Use mod/ctrl/alt/shift + tecla (a-z, 0-9, F1-F12)."},languageDialog:{title:"Idioma",hint:"Enter Aplicar • Esc Cancelar",languageTitle:"Idioma",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Esforço de Pensamento",hint:"Enter Aplicar • Esc Cancelar",effortTitle:"Esforço de Raciocínio",applied:"Esforço de raciocínio definido como {effort}",option:{low:"Baixo",medium:"Médio",high:"Alto",xhigh:"Muito alto",max:"Máx",minimal:"Mínimo",none:"Nenhum",off:"Desligado",auto:"Automático"}},toolSettingsDialog:{title:"Config. de Ferramentas",hint:"Enter Aplicar • Esc Cancelar",websearchTitle:"Chave API WebSearch",apiKeyCurrentPrefix:"Atual:",apiKeyNotSet:"(não definido)",apiKeyInvalidCjk:"A chave API não pode conter caracteres chineses.",apiKeyInvalidSpaces:"A chave API não pode conter espaços.",apiKeyPlaceholder:"Cole a chave Serper API"},pluginsDialog:{title:"Plugins",hint:"Selecione um plugin para configurar • Esc Fechar",serperSearch:"Serper Search",serperSearchDetail:"Busca web via Serper API",configured:"Configurado",notConfigured:"Não configurado",serperConfigTitle:"Config. Serper Search",serperConfigHint:"Tab Alternar • Enter Aplicar • Esc Cancelar"},skillsDialog:{title:"Habilidades",hint:"Enter Aplicar • Esc Cancelar",empty:"Nenhuma habilidade disponível",emptyFiltered:"Nenhuma habilidade correspondente"},timelineDialog:{title:"Linha do tempo",hint:"Tab Filtrar • Enter Abrir • Esc Fechar",empty:"Ainda não há mensagens",emptyFiltered:"Nenhuma entrada correspondente",filterAll:"Todas as mensagens",filterUser:"Mensagens do usuário",filterTool:"Chamadas de ferramentas"},mcpSettingsDialog:{title:"MCP",hint:"Edite o arquivo mcp.json para configurar servidores MCP • Esc Fechar",configFileLabel:"Arquivo de config.:",noServersHint:"Nenhum servidor MCP configurado ainda.",serverCount:"{count} servidor(es) configurado(s)",guideText:"Edite o arquivo acima para adicionar ou modificar servidores MCP.",openFile:"Abrir Arquivo",reload:"Recarregar",close:"Fechar",reloaded:"Configuração MCP recarregada.",reloadFailed:"Falha ao recarregar: {error}",status:"Status",toolCount:"Ferramentas",disabled:"desativado",testConnection:"Testar",testing:"Testando conexões...",testComplete:"Teste concluído.",testPartial:"Teste concluído com erros.",testFailed:"Conexão falhou: {error}",invalidJson:"JSON inválido: {error}",invalidShape:'JSON MCP inválido: esperado "mcpServers".',invalidServer:"Servidor MCP inválido: {name}",noServers:"Nenhum servidor MCP encontrado.",lintOk:"Sintaxe JSON OK",lintAt:"{error} (linha {line}, coluna {column})",lintUnclosed:"{char} não fechado (linha {line}, coluna {column})",lintInvalid:"{error}",exampleFormat:"Formato de exemplo:"},toolApprovalsDialog:{title:"Aprovações de Ferramentas",useAuto:"Automático",useNormal:"Normal",useStrict:"Restrito",close:"Fechar",focusedTitleAuto:"AUTOMÁTICO",focusedTitleNormal:"NORMAL",focusedTitleStrict:"RESTRITO",focusedTitleClose:"FECHAR",focusedDescAuto:"Aprovar automaticamente todas as chamadas. Sem confirmação (mais rápido, menos seguro).",focusedDescNormal:"Aprovar automaticamente ferramentas de leitura. Confirmar antes de escrever/executar.",focusedDescStrict:"Exigir confirmação para toda chamada (mais seguro, mais lento).",focusedDescClose:"Fechar este diálogo sem alterar a configuração atual.",currentPrefix:"Atual: {mode}",tip:"Dica: Tab ou ↑/↓ para mover entre botões, Enter para confirmar, Esc para fechar."},settingsDialog:{pendingApproval:"Resolva a aprovação pendente antes de alterar as configurações.",invalidShortcut:"Atalho inválido para {label}: {value}",shortcutCommands:"Atalho de comandos",shortcutTimeline:"Atalho da linha do tempo",shortcutNewSession:"Atalho de nova sessão",toolApprovalsApplied:"Aprovações de ferramentas: {mode}",applied:"Configurações aplicadas."},exitAppDialog:{title:"Sair do DimCode",confirm:"Sair agora?",warning:"Uma resposta do agente ainda está em andamento. Sair irá interrompê-la.",reasonPrefix:"Motivo: {reason}"},approvalDialog:{title:"Aprovar Permissão de Ferramenta",toolLabel:"Ferramenta: {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Permissão: {permission} ({risk})",descriptionLabel:"Descrição: {description}",commandLabel:"Comando:",inlineActionHint:"↑/← Anterior ↓/→ Próximo Enter Confirmar 1/2/3 Escolher",inlineActionHintCompact:"←/→ Mover Enter Confirmar 1/2/3 Escolher",buttons:{approve:"Aprovar",alwaysApprove:"Sempre aprovar",deny:"Negar",always:"Sempre",ok:"OK",no:"Não",y:"S",all:"Tudo",n:"N"}},askUserDialog:{noQuestionsTitle:"Sem Perguntas",noQuestionsBody:"Nenhuma pergunta para responder.",title:"Pergunta {index}/{total}: {header}",defaultHeader:"Pergunta",prev:"Anterior",next:"Próxima",submit:"Enviar",otherOption:"Outro",otherDetail:"Forneça uma resposta personalizada",inlineHintOptions:"Teclas: ↑↓ mover, ←→ trocar pergunta, Enter selecionar.",inlineHintMulti:"Multi-seleção: Space para alternar seleção.",inlineHintButtons:"Tab para botões, ←→ trocar, Enter ativar, ↑ volta às opções.",inlineHintNav:"Ctrl+Left / Ctrl+Right (ou Ctrl+A / Ctrl+E) para trocar perguntas.",inlineHintSubmit:"Ctrl+Enter enviar, Esc cancelar.",inlineButtonPrev:"[Anterior]",inlineButtonNext:"[Próxima]",inlineButtonSubmit:"[Enviar]",inlineButtonCancel:"[Cancelar]",inlineActionHint:"Space Selecionar ← Anterior → Próxima Enter Próxima/Enviar Esc Cancelar",inlineActionHintCompact:"Space Selecionar ←/→ Anterior/Próxima Enter Próxima/Enviar Esc Cancelar",optionsSummaryAll:"{count} opções",optionsSummaryVisibleMore:"{count} opções ({start}-{end}) ↓ mais",multiSelectHint:"[Multi-seleção] Space para alternar, Enter para confirmar",singleSelectHint:"[Seleção única] Use setas, Enter para confirmar",customAnswerLabel:"Resposta personalizada:",customAnswerPlaceholder:"Digite sua resposta...",otherPlaceholder:"Outro selecionado — digite sua resposta e pressione Enter."},nextApiOAuthDialog:{title:"Login DimCode OAuth",copyUrl:"Copiar URL",login:"Entrar",logout:"Sair",statusTitle:"Status",statusAuthenticated:"✓ Conectado como {email}",statusLoading:"⏳ Autenticando...",statusNotLoggedIn:"✗ Não conectado",instructionAuthenticated:"Use ↑↓ para navegar, Enter para selecionar, ou números 1-9",instructionLoading:"Pressione C para copiar a URL abaixo se o navegador não abriu",instructionNeedsSetup:"Verifique o redirect_uri, scopes e estado ativo do DimCode OAuth, depois tente novamente",instructionWithUrl:"Pressione C para copiar a URL OAuth abaixo, ou Enter para abrir o navegador",instructionUnauthed:"Pressione Enter para entrar com DimCode OAuth, ou Esc para fechar",instructionManualCallback:"Copie a URL abaixo, faça login no navegador e cole a URL de redirecionamento na caixa de entrada.",oauthUrlTitleLoading:"URL OAuth (copie se o navegador não abriu)",oauthUrlTitleReady:"URL OAuth (pronto para usar)",scrollIndicator:" [{start}-{end} de {total}]",selectModelTitle:"Selecionar Modelo (↑↓/1-9, Enter para selecionar){indicator}",aboutTitle:"Sobre DimCode OAuth",setupTitle:"Erro de login OAuth",aboutBulletOne:"• Usa o cliente DimCode OAuth integrado",aboutBulletTwo:"• Obtém modelos relay após login e salva a configuração do provedor",aboutBulletThree:"• Usa OAuth refresh tokens em vez de API key de longa duração",viewAllPlans:"Ver Todos os Planos →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"Conta DimCode",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"Gerando URL OAuth...",urlReady:"URL OAuth pronta! Copie ou pressione Enter para abrir o navegador.",generateUrlFailed:"Falha ao gerar URL OAuth: {error}",startingLogin:"Iniciando login OAuth...",browserOpened:"Navegador aberto. Se não, copie a URL do diálogo.",copyUrlToLogin:"Copie a URL OAuth do diálogo para fazer login.",urlCopied:"URL OAuth copiada para a área de transferência.",urlCopyFailed:"Falha ao copiar URL OAuth.",authSuccess:"Autenticado com sucesso pelo DimCode OAuth!",loginFailed:"Login OAuth falhou: {error}",loggedOut:"Desconectado do DimCode OAuth",loggedOutWithRemoteWarning:"Desconectado do DimCode OAuth, mas revogação remota falhou: {error}",logoutFailed:"Falha ao sair: {error}",initFailed:"Erro de inicialização do diálogo: {error}",modelSwitched:"Modelo alterado para {model}",selectModelFailed:"Falha ao selecionar modelo: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Debug",titleDebugging:"Depurando",copy:"copiar",proceed:"prosseguir",fixed:"corrigido",body:"Adicionei logs de debug (e possivelmente uma correção). Tente reproduzir o problema e escolha um resultado."},exitSessionDialog:{title:"Sair da Sessão",confirm:"Sair da sessão atual e voltar ao Início?",note:"A próxima mensagem iniciará uma nova sessão."},messageActionsDialog:{title:"Ações da Mensagem",revert:"Reverter mensagens",revertWithFiles:"Reverter mensagens e alterações de arquivos",revertKeepFiles:"Reverter mensagens (manter alterações)",revertFilesOnly:"Reverter apenas alterações de arquivos",copy:"Copiar texto da mensagem",fork:"Bifurcar para criar nova sessão",pin:"Fixar mensagem",unpin:"Desafixar mensagem"},pathPickerDialog:{hint:"↑/↓ selecionar • Tab autocompletar • Enter confirmar • Esc fechar"},providerConnectDialog:{title:"Conectar {provider}",providerFallback:"Provedor",hint:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintOpenAI:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintGemini:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintAnthropic:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintGeneric:"Tab trocar • Ctrl+C limpar • Enter Aplicar",applyingHint:"Testando conexão, aguarde...",applyingButton:"Aplicando...",testConnection:"Testar conexão",baseUrlStatusAutoFix:"Correção automática: {value}",baseUrlStatusInvalid:"Base URL deve ser http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"Chave API",apiKeyPlaceholder:"Cole uma nova chave para atualizar (deixe vazio para manter)",apiKeyCurrent:"Atual: {value}",apiKeyNotSet:"Atual: (não definido)",apiKeyInvalidCjk:"A chave API não pode conter caracteres chineses.",apiKeyInvalidSpaces:"A chave API não pode conter espaços.",clearKey:"Excluir",useDetectedKey:"Usar {name}",disconnectButton:"Desconectar",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"Desligado",toggleOn:"Ligado",toggleHint:"Tab trocar • ←/→ alterar • Space alternar"},redoConfirmDialog:{title:"Confirmar Refazer",body:"Tem certeza de que deseja restaurar as mensagens revertidas?"},renameSessionDialog:{title:"Renomear sessão",label:"Nome da sessão",placeholder:"ex: Notas de planejamento"},sessionsDialog:{timeNow:"agora",timeMinutes:"{count} min",timeHours:"{count} h",timeDays:"{count} d",newSession:"Nova sessão",title:"Sessões ({count})",titleScoped:"Sessões ({count}/{total})",scope:"Escopo: {cwd}",loading:"Carregando…",confirmDelete:"Confirmar exclusão: pressione Delete novamente",header:"{count} sessões • Setas para navegar • Enter selecionar{range}{activity}",headerRange:" • Exibindo {start}-{end}",runningCount:"{count} em execução",pausedCount:"{count} aguardando confirmação",hint:"Digite para buscar • ←/→ botões • Enter confirmar • Esc fechar",focusPrefix:"Foco: {focus}",focusList:"Lista",focusButtons:"Botões",noSessionsCwd:"Nenhuma sessão neste diretório",noSessions:"Nenhuma sessão salva ainda",nodeOnly:"Sessões estão disponíveis apenas no modo Node/CLI.",newSessionTitle:"Nova Sessão",newSessionTarget:"uma nova sessão",busy:{agentResponding:"Agente ainda está respondendo",awaitingAskUser:"Aguardando respostas AskUser",awaitingToolApproval:"Aguardando aprovação de ferramenta",pendingApproval:"Aprovação pendente"},buttons:{open:"Abrir",delete:"Excluir",deleteConfirm:"Excluir (confirmar)",scope:"Escopo: {scope}",scopeCwd:"CWD",scopeAll:"Todos",refresh:"Atualizar"}},sessionsOverlay:{title:"Sessões",hint:"Enter Selecionar • Esc Fechar • Ctrl+R Atualizar • Ctrl+W Escopo",loading:"Carregando sessões...",empty:"Ainda não há sessões salvas.",loadingMore:"Carregando mais…",hasMore:"↓ mais",scope:{cwdOnly:"apenas cwd",allCwd:"todos os cwds"}},switchSessionDialog:{title:"Trocar Sessão",confirm:"Trocar e Interromper",target:"Trocar para {target}?",fallback:"Trocar de sessão agora?",warning:"Isso interromperá a resposta/fluxo na sessão ativa.",reason:"Motivo: {reason}"},themeDialog:{title:"Tema",hint:"Enter Aplicar • Esc Cancelar",mode:"Modo",light:"Claro",dark:"Escuro",unavailable:"Este terminal não suporta temas alternáveis.",fallback:"Um tema fallback ANSI claro/escuro fixo é usado aqui.",tip:"Dica: o padrão segue o tema do sistema."},commandPalette:{searchPlaceholder:"Buscar…",noMatches:"Sem resultados",hint:"Digite para filtrar • Enter: abrir • Esc: fechar",title:"Comandos"},skills:{title:"Habilidades"},help:{title:"Ajuda",modeLabel:"Modo: {mode}",modeDetail:"Modo do assistente atual.",shortcutsLabel:"Atalhos",onboarding:`Bem-vindo! Início rápido:
1158
1158
  1) /connect: conectar um provedor
1159
1159
  2) /models: escolher um modelo
1160
1160
  3) envie "hello" para começar
1161
- Dica: {commandsKey} abre a paleta de comandos.`,items:{help:"Ajuda e atalhos (F1)",commands:"Paleta de comandos (Ctrl+P)",back:"Voltar ao salto anterior",status:"Alternar detalhes do status"}},commands:{help:{label:"Ajuda",detail:"Atalhos + comandos comuns (F1)"},sessions:{label:"Sessões",detail:"Escolher ou criar sessão (/sessions)"},timeline:{label:"Linha do tempo",detail:"Ir para mensagem do usuário (/timeline)"},newSession:{label:"Nova Sessão",detail:"Iniciar nova sessão (/new)"},connectProvider:{label:"Conectar Provedor",detail:"Conectar um provedor (/connect)"},models:{label:"Modelos",detail:"Selecionar modelo (/models)"},toolApprovals:{label:"Aprovações",detail:"Configurar aprovações (/approvals)"},toolSettings:{label:"Config. Ferramentas",detail:"Configurar ferramentas (/tool-settings)"},mcpHub:{label:"MCP",detail:"Gerenciar conectores MCP (/mcp)"},plugins:{label:"Plugins",detail:"Gerenciar plugins (/plugins)"},debug:{label:"Debug",detail:"Logs de observabilidade SDK (/debug)"},mcpSettings:{label:"MCP (JSON Avançado)",detail:"Configurar JSON bruto do MCP (/mcp-settings)"},language:{label:"Idioma",detail:"Trocar idioma da UI (/language)"},settings:{label:"Configurações",detail:"Config. de provedor personalizado (/settings, Ctrl+K)"}},homePage:{multilineTitle:"Texto Multilinha",multilineTitleWithCount:"Texto Multilinha ({count} linhas)",providerCustom:"Personalizado",reviewPrompt:"ajude-me a revisar as mudanças no código",footerCwd:"cwd {cwd}",hints:{switchMode:"trocar modo",commands:"comandos"},tips:{greeting:"Bem-vindo de volta! Tente {commandsKey} ou {init} para começar.",commandsAlias:"Dica: {key} abre a paleta de comandos."},prompts:{help:"Ajuda e atalhos (F1)",sessions:"Listar/escolher sessões",connect:"Conectar um provedor",models:"Selecionar modelo",newSession:"Iniciar nova sessão",approvals:"Configurar aprovações (auto/normal/strict)",commands:"Abrir paleta de comandos",toolSettings:"Configurar ferramentas",mcpSettings:"Abrir MCP",plugins:"Gerenciar plugins",language:"Trocar idioma da UI",theme:"Selecionar tema",status:"Alternar detalhes do status",review:"Revisar mudanças no código",init:"Inicializar/melhorar AGENTS.md",skills:"Listar habilidades carregados",exit:"Sair do aplicativo",debug:"Diálogo de depuração (chat)",settings:"Config. de provedor personalizado"},commandPalette:{connect:"Conectar um provedor",models:"Selecionar modelo"},commands:{debugLabel:"Debug",debugDetail:"Logs de observabilidade SDK (/debug)"},toast:{approvalsUsage:"Use /approvals (sem on/off).",customProviderOnly:"Configurações apenas para provedores personalizados.",redoChatOnly:"Refazer está disponível apenas na visualização de chat.",retryChatOnly:"Tentar novamente está disponível apenas na visualização de chat.",pinsChatOnly:"Fixações estão disponíveis apenas na visualização de chat.",renameChatOnly:"Renomear está disponível apenas no chat (/rename <title>).",commandRemoved:"Este comando não está mais disponível: {command}",helpAliasRemoved:"Pressione F1 para ajuda.",deleteConfirm:"Pressione Delete novamente para confirmar.",themeToggled:"Tema: {mode}",pasteImagePending:"Imagem ainda está sendo processada. Aguarde."}},chatPage:{placeholder:"Pergunte qualquer coisa... (nova linha: Shift+Enter ou Ctrl+J)",placeholderAwaitingApproval:"Bloqueado por aprovação: selecione Aprovar / Negar para continuar.",reviewPrompt:"ajude-me a revisar as mudanças no código",notification:{approvalTitle:"[Aprovação Necessária] Permissão de Ferramenta",approvalMessage:"DimCode está aguardando aprovação de ferramenta: {tool}.",doneTitle:"[Tarefa Concluída]",doneMessage:"DimCode concluiu esta tarefa.",doneMessageWithDuration:"DimCode concluiu esta tarefa em {duration}.",doneMessageWithTools:"DimCode concluiu esta tarefa após {tools} chamada(s) de ferramenta.",doneMessageWithToolsAndDuration:"DimCode concluiu esta tarefa em {duration} com {tools} chamada(s) de ferramenta."},headerStats:"{messages} msgs · total {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"Consolidando,Pensando,Raciocinando,Planejando,Analisando,Sintetizando,Refinando,Compondo",modelFallback:"modelo",mode:{plan:"plano",agent:"agente",debug:"debug"},status:{approvalsAuto:"AUTO",approvalsAll:"TODOS",blockedByApproval:"Bloqueado por aprovação",awaitingApprovalAction:"Aguardando sua aprovação: escolha Aprovar / Negar para continuar."},footer:{dragSelect:"arrastar para selecionar",openLink:"Ctrl+Clique para abrir arquivos ou links",esc:"esc",interrupt:"interromper",approvalPaused:"⏸ Pausado",approvalPausedHint:"Aguardando aprovação (Enter para escolher).",shortcuts:"Ctrl+K: config Ctrl+O: expandir/recolher ferramentas e thinking Cmd+Delete/Ctrl+W: limpar entrada Tab: trocar modo {commandsKey}: comandos",shortcutsCompact:"Ctrl+K: config Ctrl+O: ferramentas/thinking Cmd+Delete/Ctrl+W: limpar Tab: trocar modo {commandsKey}: comandos",shortcutsMicro:"Ctrl+O: ferramentas {commandsKey}: comandos",shortcutsMini:"{commandsKey}: comandos"},session:{new:"novo"},timeline:{title:"Linha do tempo",empty:"(vazio)",filterAll:"Todas as mensagens",filterUser:"Mensagens do usuário",filterTool:"Chamadas de ferramenta"},pins:{title:"Fixados",empty:"(vazio)"},jumpToBottom:{button:"↓"},prompts:{help:"Ajuda e atalhos (F1)",newSession:"Iniciar nova sessão",resume:"Retomar fila pausada",sessions:"Listar/escolher sessões",timeline:"Ir para mensagem do usuário",pins:"Abrir mensagens fixadas",pin:"Fixar última mensagem",back:"Voltar ao salto anterior",connect:"Conectar um provedor",models:"Selecionar modelo",theme:"Trocar tema da UI",approvals:"Configurar aprovações (auto/normal/strict)",commands:"Abrir paleta de comandos",toolSettings:"Configurar ferramentas",mcpSettings:"Abrir MCP",plugins:"Gerenciar plugins",language:"Trocar idioma da UI",status:"Alternar detalhes do status",review:"Revisar mudanças no código",retry:"Tentar novamente a última mensagem",compact:"Compactar contexto da sessão",init:"Inicializar/melhorar AGENTS.md",rename:"Renomear sessão atual",skills:"Listar habilidades carregados",exit:"Sair do aplicativo",debug:"Diálogo de depuração",settings:"Config. de provedor personalizado"},commands:{pinsLabel:"Fixados",pinsDetail:"Abrir mensagens fixadas",backLabel:"Voltar",backDetail:"Retornar ao salto anterior",debugLabel:"Debug",debugDetail:"Logs de observabilidade SDK (/debug)",statusLabel:"Status",statusDetail:"Alternar detalhes do status",themeLabel:"Tema",themeDetail:"Trocar tema de cores"},tips:{contextWarn:"Dica: O contexto está ficando cheio. Considere /compact ou /new para manter respostas precisas.",contextCritical:"Dica: Você está perto do limite de contexto. Comece uma nova sessão com /new (ou /compact primeiro).",timeline:"Dica: Chat longo? Use /tl para voltar a uma mensagem específica.",timelineAlias:"Dica: /tl é um atalho para /timeline.",commandsAlias:"Dica: {key} abre a paleta de comandos.",errorRecovery:"Dica: Se algo falhou, tente /compact ou /new.",greeting:"Bem-vindo de volta! Tente {commandsKey} ou {init} para começar.",compactDelight:"Legal! Manter o contexto enxuto ajuda.",addTests:'Tudo pronto! Quer que eu adicione testes? Responda "sim" ou "ok".'},confirm:{addTests:"Adicione testes para as mudanças que acabamos de fazer."},toast:{customProviderOnly:"Configurações apenas para provedores personalizados.",renameNodeOnly:"Renomear está disponível apenas no modo Node/CLI.",noActiveSession:"Nenhuma sessão ativa para renomear.",sessionNameEmpty:"O nome da sessão não pode ficar vazio.",sessionRenamed:"Sessão renomeada para: {title}",renameFailed:"Falha ao renomear sessão.",linkOpenHint:"Dica: Ctrl+Clique para abrir arquivos ou links.",copySuccess:"Copiado",copyFailed:"Falha ao copiar",forkFailed:"Falha ao bifurcar sessão.",backEmpty:"Nenhum salto anterior para retornar.",pinsEmpty:"Nenhuma mensagem fixada ainda.",pinEmpty:"Nenhuma mensagem para fixar ainda.",pinned:"Mensagem fixada.",unpinned:"Mensagem desafixada.",debugUnavailable:"Servidor de debug indisponível.",approvalsUsage:"Use /approvals (sem on/off).",debugDialogOpened:"Diálogo de depuração aberto.",debugDialogClosed:"Diálogo de depuração fechado.",renameUsage:"Uso: /rename <title>",themeToggled:"Tema: {mode}",statusCompactOn:"Status: compacto",statusCompactOff:"Status: detalhado",compactingSession:"Compactando sessão...",compactSuccess:"Sessão compactada: {message}",compactWarning:"Sessão compactada com ganho limitado: {message}",compactSuccessDetailWithTokens:"{count} mensagens históricas foram compactadas em um resumo. Input estimado {before} -> {after} tokens, economizando cerca de {saved} tokens.",compactSuccessDetailNotReduced:"{count} mensagens históricas foram compactadas em um resumo, mas o input estimado mudou de {before} para {after} tokens, sem redução no tamanho da requisição.",compactSuccessDetailCountOnly:"{count} mensagens históricas foram compactadas em um resumo.",compactSuccessDetailSummaryOnly:"Novo resumo da conversa gerado.",compactFailed:"Falha ao compactar sessão: {error}",compactFailedTokenLimit:"Compactação falhou por orçamento de contexto insuficiente. Defina DIMCODE_CONTEXT_WINDOW corretamente, mude para um modelo de contexto maior, ou use /new. Detalhe: {error}",retryEmpty:"Nenhuma mensagem anterior para tentar novamente.",commandRemoved:"Este comando não está mais disponível: {command}",helpAliasRemoved:"Pressione F1 para ajuda.",waitForResponse:"Aguarde a resposta atual terminar, ou pressione Esc para interromper.",pasteImagePending:"Imagem ainda está sendo processada. Aguarde.",pendingApproval:"Trate tool_approve primeiro.",awaitingApprovalAction:"Pausado: ação necessária. Escolha Aprovar / Sempre aprovar / Negar no cartão de permissão.",awaitingApprovalStillWaiting:"Ainda aguardando aprovação ({seconds}s). O modelo não continuará até você aprovar ou negar.",pendingAskUser:"Trate ask_user primeiro.",notificationSessionBusy:"Esta notificação pertence a outra sessão ocupada. Finalize aquele trabalho ou troque de sessão manualmente.",notificationSessionUnavailable:"Não é possível abrir a sessão desta notificação aqui.",notificationSessionSwitchFailed:"Falha ao abrir a sessão desta notificação.",approvalNotActive:"Esta aprovação está na fila. Resolva a ativa primeiro.",askUserNotActive:"Esta requisição ask_user não está mais ativa."}},chatQueue:{label:"Fila ({count})",labelCompact:"Fila {count}",more:"+{count} mais…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"continuar fila",state:{idle:"Pendente",running:"Executando",paused:"Pausado",error:"Erro"},item:{steerAction:"Direcionar",steerReady:"Primeiro",steerPending:"Próximo",steerPaused:"Pausado"},toast:{enqueued:"Adicionado à fila (#{count}).",full:"Fila cheia (máx 5). Exclua um ou comece /new.",cleared:"{count} item(ns) da fila removido(s).",deleted:"{count} item(ns) da fila excluído(s). Ctrl+Z para desfazer.",steerPromoted:"Elevado para steer. Será executado primeiro quando a fila retomar.",steerQueued:"Steer não pôde ser injetado imediatamente. Foi promovido e executará primeiro na próxima rodada.",steerSent:"Steer aceito. Será injetado antes da próxima chamada do modelo nesta rodada.",undo:"Exclusão da fila desfeita.",pausedTip:"Fila pausada. Use {resume} ou {resumeText} para continuar, ou envie uma nova mensagem para escolher o que fazer.",stale:"Fila pausada: requisição parece travada."},confirm:{title:"Continuar mensagens na fila?",description:"Requisição anterior não finalizou. {count} mensagem(ns) aguardando na fila.",hint:"Continue enviando o próximo item, ou pause a fila.",continue:"Continuar",pause:"Pausar",reason:"Motivo: {reason}"},reason:{network_error:"Erro de rede.",timeout:"Requisição expirou.",canceled_by_user:"Cancelado pelo usuário.",rate_limited:"Limite de taxa atingido.",config_unavailable:"Configuração salva indisponível.",unknown:"Requisição falhou."},draftDecision:{title:"Fila pausada",description:"{count} mensagem(ns) na fila ainda aguardando. Decida o que fazer com sua nova entrada.",previewLabel:"Nova entrada:",continue:"Continuar fila",append:"Adicionar à fila",replace:"Descartar fila e enviar"}},chatStatus:{done:"Concluído.",error:"Erro.",interrupted:"Interrompido.",permissionDenied:"Permissão negada.",planning:"Planejando…",drafting:"Rascunhando…",retrying:"Tentando novamente ({retry}/{maxAttempts})…",runningTool:"Executando {tool}…",runningTools:"Executando {count} ferramentas…",approvalPendingOther:"Outra aprovação pendente ({permission})…",awaitingApproval:"Aguardando aprovação…",awaitingApprovalWithPerm:"Aguardando aprovação ({permission})…",awaitingApprovalWithRisk:"Aguardando aprovação ({risk})…",awaitingAnswers:"Aguardando respostas…",resumingApproved:"Aprovado. Retomando…",resumingDenied:"Negado. Retomando…",resuming:"Retomando…",autoApprovingWithRisk:"Aprovação automática ({risk})…",riskFallback:"risco",toolFallback:"ferramenta",thinking:"Pensando…",autoCompactionRequired:"Contexto próximo do limite. Compactação necessária primeiro.",autoCompactionRequiredDetailed:"Contexto próximo do limite · próxima requisição estimada em {estimated} tokens, compactação automática inicia em {threshold} tokens, compactação necessária primeiro.",compressed:"Contexto compactado · {removed} mensagens antigas foram compactadas em um resumo, economizando cerca de {saved} tokens de input ({elapsed}ms)",autoCompactedDetailed:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo, input estimado {before} -> {after} tokens, economizando cerca de {saved} tokens",autoCompactedNotReduced:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo, mas o input estimado mudou de {before} para {after} tokens, sem redução no tamanho da requisição",autoCompactedSaved:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo, economizando cerca de {saved} tokens",autoCompactedCountOnly:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo",interruptedMarkdown:"> **Interrompido** · Resposta cancelada pelo usuário (`Esc`).",awaitingApprovalPrefix:"Aguardando aprovação",awaitingAnswersPrefix:"Aguardando respostas",approvalPendingPrefix:"Outra aprovação pendente",autoApprovingPrefix:"Aprovação automática"},chatParts:{thinking:"Pensando",plan:"Plano",todo:"Todo"},chatRender:{userLabel:"usuário",outputLabel:"↳ saída",outputLabelShort:"saída:",canceled:"cancelado",inputLabel:"entrada:",collapse:"... (recolher)",moreLines:"... ({count} mais linhas)",moreLinesOmitted:"... ({count} linhas omitidas; defina {envVar} para aumentar)",streamingTail:"… (streaming: mostrando últimos {shown} chars; {omitted} omitidos)",copy:"Copiar",userResponses:"Respostas do usuário:",approvalQueued:"Aguardando aprovação anterior...",proposedPlan:{title:"Plano Proposto"},llmMeta:{changedFiles:"{count} arquivo(s) alterado(s): {files}",changedFilesMore:"+{count} mais",revertHint:"Dica: Clique nesta mensagem -> Reverter mensagens para desfazer esta rodada.",changedFilesCardTitle:"{count} arquivos alterados:",revertButton:"Reverter"},toolName:{explore:"Explorar",subagent:"Subagente"},toolSuffix:{offset:"offset {value}",limit:"limite {value}",matches:"{count} correspondências",todos:"{count} todos",results:"{count} resultados",results_one:"{count} resultado"},toolGroup:{readFiles:"Ler {count} arquivos",writeFiles:"Escrever {count} arquivos",editFiles:"Editar {count} arquivos",globPatterns:"Glob {count} padrões",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} padrões",bashCommands:"Executar {count} comandos",searchQueries:"Buscar {count} consultas",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"Busca pode acessar a rede.",bash:"Bash pode executar comandos.",edit:"Alterações de arquivo podem modificar arquivos locais.",grep:"Grep pode ler arquivos locais."},inlineHint:"Teclas: ↑↓←→ para mover, Enter para selecionar.",awaitingUserAction:"Aguardando sua ação: escolha Aprovar / Sempre aprovar / Negar.",decision:{userDenied:"Usuário negou a aprovação"},denied:{title:"# Permissão de ferramenta negada",toolLine:"- ferramenta: `{tool}`",permissionLine:"- permissão: `{permission}`",hint:"Você pode selecionar novamente o tool_call e tentar novamente."},summary:{title:"# Ferramenta aprovada e executada",permissionLine:"Permissão `{permission}` aprovada para `{tool}`."},required:"Aprovação necessária ({risk}).",args:{commandWithDescription:"Comando: {command} - {description}",command:"Comando: {command}",description:"Descrição: {description}",raw:"Args: {args}"}},pathPicker:{titleWorkspace:"Selecionar Workspace",titleFile:"Selecionar Arquivo",placeholderWorkspace:"Digite um caminho (../ etc). Tab para autocompletar. Enter seleciona diretório.",placeholderFile:"Digite um caminho (../ etc). Tab para autocompletar. Enter seleciona arquivo."},providerDialogs:{customLabel:"Personalizado",customDetail:"personalizado",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Entrar com DimCode OAuth",addCustomLabel:"Adicionar provedor personalizado",addCustomDetail:"adicionar provedor personalizado",providerFallback:"Provedor",adapter:{openai:"OpenAI",openaiOpenRouter:"Compatível com OpenAI (OpenRouter)",openaiLocal:"Compatível com OpenAI (Local)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Configurado",notConfigured:"Não configurado"},manage:{title:"Provedor personalizado: {provider}",connect:"Conectar",connectDetail:"Editar API Key / Base URL",rename:"Renomear",renameDetail:"Editar nome do provedor",models:"Editar modelos",modelsDetail:"Atualizar IDs de modelos disponíveis",delete:"Excluir",deleteDetail:"Remover este provedor"},deleteConfirm:{title:"Excluir {provider}?",confirm:"Excluir (confirmar)",confirmDetail:"Isso não pode ser desfeito",cancelDetail:"Manter provedor"},nameDialog:{title:"Nomear provedor personalizado",label:"Nome do provedor",placeholder:"ex: DeepSeek (Proxy)"},modelsDialog:{title:"Modelos do provedor personalizado",modelsTitle:"Modelos",modelsPlaceholder:"IDs dos modelos (, ou nova linha)",hint:", / nova linha • Shift+Enter nova linha • Enter Aplicar",fetch:"Buscar modelos",fetching:"Buscando modelos…"},modelsFetchDialog:{title:"Selecionar modelos",searchPlaceholder:"Filtrar modelos",hint:"Space alternar • Enter confirmar • Esc cancelar"},toast:{modelSet:"Modelo definido para {provider} / {model}.",noModels:"Nenhum modelo disponível ainda. Conecte um provedor primeiro (/connect).",connectFirst:"Conecte um provedor primeiro (/connect) antes de enviar sua primeira mensagem.",apiKeyRequired:"API Key é obrigatória.",baseUrlRequired:"Base URL é obrigatória.",baseUrlInvalid:"Base URL deve começar com http:// ou https://",connected:"Conectado a {provider}.",connectedSelectModel:"Conectado a {provider}. Escolha um modelo.",connectedCheckFailed:"Conectado a {provider}, mas verificação falhou: {reason}",connectionTestPassed:"Teste de conexão aprovado: {provider}.",connectionTestFailed:"Teste de conexão falhou: {provider} - {reason}",connectionActionUpdateKey:"Ação: reabra Conectar e atualize a API key, depois teste novamente.",connectionActionFixBaseUrl:"Ação: verifique o caminho do Base URL (geralmente termina com /v1), depois teste novamente.",connectionActionSwitchKey:"Ação: aguarde um momento ou mude para outra chave/provedor.",connectionActionRetryTest:"Ação: verifique rede/proxy e execute Testar conexão novamente.",noModelsFetching:"Sem modelos ainda. Buscando lista de modelos…",firstUseGuide:'Início rápido: 1) /connect 2) /models 3) envie "hello"',firstUseSendHello:'Próximo passo: envie sua primeira mensagem (ex: "hello").',connectionCheckUnauthorized:"401 Não autorizado: verifique a API key e o tipo de provedor.",connectionCheckForbidden:"403 Proibido: sua chave pode não ter acesso a este provedor/modelo.",connectionCheckNotFound:"404 Não encontrado: verifique o caminho do Base URL (compatível com OpenAI geralmente termina com /v1).",connectionCheckRateLimited:"429 Limite de taxa: aguarde e tente novamente, ou mude para outra chave/provedor.",connectionCheckTimeout:"Conexão expirou: verifique rede/proxy e tente novamente.",connectionCheckNetwork:"Conexão de rede falhou: verifique DNS/proxy/Base URL.",connectionCheckFailed:"Verificação de conexão falhou: {error}",apiKeyCleared:"API key limpa para {provider}.",customAdded:"Provedor personalizado adicionado: {provider}.",customRenamed:"Provedor personalizado renomeado: {provider}.",customModelsUpdated:"Modelos do provedor personalizado atualizados: {provider}.",customDeleted:"Provedor personalizado excluído: {provider}.",modelsRequired:"Adicione pelo menos um modelo.",modelsEmpty:"Nenhum modelo encontrado.",modelsFetchFailed:"Falha ao buscar modelos: {error}",modelsFetchChatCompletions:"Lista de modelos não suportada para base URL /chat/completions ou /responses.",manualModelsRequired:"Este endpoint não suporta descoberta automática de modelos. Insira os nomes manualmente na configuração.",nameRequired:"Nome do provedor é obrigatório.",nameConflict:"Nome do provedor já existe."}},copyToast:{copiedToClipboard:"Copiado para a área de transferência"}};var pt_PT_default={common:{apply:"Aplicar",cancel:"Cancelar",close:"Fechar",confirm:"Confirmar",yes:"Sim",no:"Não",exit:"Sair",back:"Voltar",next:"Próximo",save:"Salvar",empty:"—",unknownError:"Erro desconhecido",inputClearTip:"Ctrl+C limpar",total:"Total"},configDialog:{title:"Configurações",hint:"Tab/Shift+Tab trocar campo • Enter Aplicar • Esc Cancelar",modelsTitle:"Modelos (personalizado)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"Janela de Contexto",contextWindowLocked:"Janela de Contexto (definido pelo modelo)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperatura",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperatura: apenas números e "."',maxTokensTitle:"Máx. Tokens de Saída",maxTokensPlaceholder:"32000",baseUrlTitle:"URL Base (compatível com OpenAI)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Atual:",apiKeyNotSet:"(não definida)",apiKeyTitle:"Chave API",apiKeyPlaceholder:"Cole uma nova chave para actualizar (deixe vazio para manter)",interleavedThinkingTitle:"Pensamento Intercalado (Space para alternar)",interleavedThinkingLocked:"Pensamento Intercalado (definido pelo modelo)",interleavedThinkingOpen:"Ativado",interleavedThinkingClose:"Desativado",tipIntensityTitle:"Intensidade de Dicas",tipIntensityOff:"Desligado",tipIntensityLow:"Baixa",tipIntensityStandard:"Padrão",shortcutsTitle:"Atalhos",shortcutCommandsLabel:"Comandos",shortcutTimelineLabel:"Linha do tempo",shortcutNewSessionLabel:"Nova sessão",shortcutsPlaceholder:"ex: mod+p",shortcutsHint:"Use mod/ctrl/alt/shift + tecla (a-z, 0-9, F1-F12)."},languageDialog:{title:"Idioma",hint:"Enter Aplicar • Esc Cancelar",languageTitle:"Idioma",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Esforço de Pensamento",hint:"Enter Aplicar • Esc Cancelar",effortTitle:"Esforço de Raciocínio",applied:"Esforço de raciocínio definido como {effort}",option:{low:"Baixo",medium:"Médio",high:"Alto",xhigh:"Muito alto",max:"Máx",minimal:"Mínimo",none:"Nenhum",off:"Desligado",auto:"Automático"}},toolSettingsDialog:{title:"Config. de Ferramentas",hint:"Enter Aplicar • Esc Cancelar",websearchTitle:"Chave API WebSearch",apiKeyCurrentPrefix:"Atual:",apiKeyNotSet:"(não definida)",apiKeyInvalidCjk:"A chave API não pode conter caracteres chineses.",apiKeyInvalidSpaces:"A chave API não pode conter espaços.",apiKeyPlaceholder:"Cole a chave Serper API"},pluginsDialog:{title:"Plugins",hint:"Selecione um plugin para configurar • Esc Fechar",serperSearch:"Serper Search",serperSearchDetail:"Busca web via Serper API",configured:"Configurado",notConfigured:"Não configurado",serperConfigTitle:"Config. Serper Search",serperConfigHint:"Tab Alternar • Enter Aplicar • Esc Cancelar"},skillsDialog:{title:"Habilidades",hint:"Enter Aplicar • Esc Cancelar",empty:"Nenhuma habilidade disponível",emptyFiltered:"Nenhuma habilidade correspondente"},timelineDialog:{title:"Linha temporal",hint:"Tab Filtrar • Enter Abrir • Esc Fechar",empty:"Ainda não há mensagens",emptyFiltered:"Nenhuma entrada correspondente",filterAll:"Todas as mensagens",filterUser:"Mensagens do utilizador",filterTool:"Chamadas de ferramentas"},mcpSettingsDialog:{title:"MCP",hint:"Edite o arquivo mcp.json para configurar servidores MCP • Esc Fechar",configFileLabel:"Ficheiro de config.:",noServersHint:"Nenhum servidor MCP configurado ainda.",serverCount:"{count} servidor(es) configurado(s)",guideText:"Edite o arquivo acima para adicionar ou modificar servidores MCP.",openFile:"Abrir Ficheiro",reload:"Recarregar",close:"Fechar",reloaded:"Configuração MCP recarregada.",reloadFailed:"Falha ao recarregar: {error}",status:"Status",toolCount:"Ferramentas",disabled:"desativado",testConnection:"Testar",testing:"Testando conexões...",testComplete:"Teste concluído.",testPartial:"Teste concluído com erros.",testFailed:"Conexão falhou: {error}",invalidJson:"JSON inválido: {error}",invalidShape:'JSON MCP inválido: esperado "mcpServers".',invalidServer:"Servidor MCP inválido: {name}",noServers:"Nenhum servidor MCP encontrado.",lintOk:"Sintaxe JSON OK",lintAt:"{error} (linha {line}, coluna {column})",lintUnclosed:"{char} não fechado (linha {line}, coluna {column})",lintInvalid:"{error}",exampleFormat:"Formato de exemplo:"},toolApprovalsDialog:{title:"Aprovações de Ferramentas",useAuto:"Automático",useNormal:"Normal",useStrict:"Restrito",close:"Fechar",focusedTitleAuto:"AUTOMÁTICO",focusedTitleNormal:"NORMAL",focusedTitleStrict:"RESTRITO",focusedTitleClose:"FECHAR",focusedDescAuto:"Aprovar automaticamente todas as chamadas. Sem confirmação (mais rápido, menos seguro).",focusedDescNormal:"Aprovar automaticamente ferramentas de leitura. Confirmar antes de escrever/executar.",focusedDescStrict:"Exigir confirmação para toda chamada (mais seguro, mais lento).",focusedDescClose:"Fechar este diálogo sem alterar a configuração atual.",currentPrefix:"Atual: {mode}",tip:"Dica: Tab ou ↑/↓ para mover entre botões, Enter para confirmar, Esc para fechar."},settingsDialog:{pendingApproval:"Resolva a aprovação pendente antes de alterar as configurações.",invalidShortcut:"Atalho inválido para {label}: {value}",shortcutCommands:"Atalho de comandos",shortcutTimeline:"Atalho da linha do tempo",shortcutNewSession:"Atalho de nova sessão",toolApprovalsApplied:"Aprovações de ferramentas: {mode}",applied:"Configurações aplicadas."},exitAppDialog:{title:"Sair do DimCode",confirm:"Sair agora?",warning:"Uma resposta do agente ainda está em andamento. Sair irá interrompê-la.",reasonPrefix:"Motivo: {reason}"},approvalDialog:{title:"Aprovar Permissão de Ferramenta",toolLabel:"Ferramenta: {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Permissão: {permission} ({risk})",descriptionLabel:"Descrição: {description}",commandLabel:"Comando:",inlineActionHint:"↑/← Anterior ↓/→ Próximo Enter Confirmar 1/2/3 Escolher",inlineActionHintCompact:"←/→ Mover Enter Confirmar 1/2/3 Escolher",buttons:{approve:"Aprovar",alwaysApprove:"Sempre aprovar",deny:"Negar",always:"Sempre",ok:"OK",no:"Não",y:"S",all:"Tudo",n:"N"}},askUserDialog:{noQuestionsTitle:"Sem Perguntas",noQuestionsBody:"Nenhuma pergunta para responder.",title:"Pergunta {index}/{total}: {header}",defaultHeader:"Pergunta",prev:"Anterior",next:"Próxima",submit:"Enviar",otherOption:"Outro",otherDetail:"Forneça uma resposta personalizada",inlineHintOptions:"Teclas: ↑↓ mover, ←→ trocar pergunta, Enter selecionar.",inlineHintMulti:"Multi-seleção: Space para alternar seleção.",inlineHintButtons:"Tab para botões, ←→ trocar, Enter ativar, ↑ volta às opções.",inlineHintNav:"Ctrl+Left / Ctrl+Right (ou Ctrl+A / Ctrl+E) para trocar perguntas.",inlineHintSubmit:"Ctrl+Enter enviar, Esc cancelar.",inlineButtonPrev:"[Anterior]",inlineButtonNext:"[Próxima]",inlineButtonSubmit:"[Enviar]",inlineButtonCancel:"[Cancelar]",inlineActionHint:"Space Selecionar ← Anterior → Próxima Enter Próxima/Enviar Esc Cancelar",inlineActionHintCompact:"Space Selecionar ←/→ Anterior/Próxima Enter Próxima/Enviar Esc Cancelar",optionsSummaryAll:"{count} opções",optionsSummaryVisibleMore:"{count} opções ({start}-{end}) ↓ mais",multiSelectHint:"[Multi-seleção] Space para alternar, Enter para confirmar",singleSelectHint:"[Seleção única] Use setas, Enter para confirmar",customAnswerLabel:"Resposta personalizada:",customAnswerPlaceholder:"Digite sua resposta...",otherPlaceholder:"Outro selecionado — digite sua resposta e pressione Enter."},nextApiOAuthDialog:{title:"Login DimCode OAuth",copyUrl:"Copiar URL",login:"Entrar",logout:"Sair",statusTitle:"Status",statusAuthenticated:"✓ Conectado como {email}",statusLoading:"⏳ Autenticando...",statusNotLoggedIn:"✗ Não conectado",instructionAuthenticated:"Use ↑↓ para navegar, Enter para selecionar, ou números 1-9",instructionLoading:"Pressione C para copiar a URL abaixo se o navegador não abriu",instructionNeedsSetup:"Verifique o redirect_uri, scopes e estado ativo do DimCode OAuth, depois tente novamente",instructionWithUrl:"Pressione C para copiar a URL OAuth abaixo, ou Enter para abrir o navegador",instructionUnauthed:"Pressione Enter para entrar com DimCode OAuth, ou Esc para fechar",instructionManualCallback:"Copie a URL abaixo, inicie sessão no navegador e cole a URL redirecionada na caixa de entrada.",oauthUrlTitleLoading:"URL OAuth (copie se o navegador não abriu)",oauthUrlTitleReady:"URL OAuth (pronto para usar)",scrollIndicator:" [{start}-{end} de {total}]",selectModelTitle:"Selecionar Modelo (↑↓/1-9, Enter para selecionar){indicator}",aboutTitle:"Sobre DimCode OAuth",setupTitle:"Erro de login OAuth",aboutBulletOne:"• Usa o cliente DimCode OAuth integrado",aboutBulletTwo:"• Obtém modelos relay após login e salva a configuração do provedor",aboutBulletThree:"• Usa OAuth refresh tokens em vez de API key de longa duração",viewAllPlans:"Ver Todos os Planos →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"Conta DimCode",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"Gerando URL OAuth...",urlReady:"URL OAuth pronta! Copie ou pressione Enter para abrir o navegador.",generateUrlFailed:"Falha ao gerar URL OAuth: {error}",startingLogin:"Iniciando login OAuth...",browserOpened:"Navegador aberto. Se não, copie a URL do diálogo.",copyUrlToLogin:"Copie a URL OAuth do diálogo para fazer login.",urlCopied:"URL OAuth copiada para a área de transferência.",urlCopyFailed:"Falha ao copiar URL OAuth.",authSuccess:"Autenticado com sucesso pelo DimCode OAuth!",loginFailed:"Login OAuth falhou: {error}",loggedOut:"Desconectado do DimCode OAuth",loggedOutWithRemoteWarning:"Desconectado do DimCode OAuth, mas revogação remota falhou: {error}",logoutFailed:"Falha ao sair: {error}",initFailed:"Erro de inicialização do diálogo: {error}",modelSwitched:"Modelo alterado para {model}",selectModelFailed:"Falha ao selecionar modelo: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Debug",titleDebugging:"Depurando",copy:"copiar",proceed:"prosseguir",fixed:"corrigido",body:"Adicionei logs de debug (e possivelmente uma correção). Tente reproduzir o problema e escolha um resultado."},exitSessionDialog:{title:"Sair da Sessão",confirm:"Sair da sessão atual e voltar ao Início?",note:"A próxima mensagem iniciará uma nova sessão."},messageActionsDialog:{title:"Ações da Mensagem",revert:"Reverter mensagens",revertWithFiles:"Reverter mensagens e alterações de ficheiros",revertKeepFiles:"Reverter mensagens (manter alterações)",revertFilesOnly:"Reverter apenas alterações de ficheiros",copy:"Copiar texto da mensagem",fork:"Bifurcar para criar nova sessão",pin:"Fixar mensagem",unpin:"Desafixar mensagem"},pathPickerDialog:{hint:"↑/↓ selecionar • Tab autocompletar • Enter confirmar • Esc fechar"},providerConnectDialog:{title:"Conectar {provider}",providerFallback:"Provedor",hint:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintOpenAI:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintGemini:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintAnthropic:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintGeneric:"Tab trocar • Ctrl+C limpar • Enter Aplicar",applyingHint:"Testando conexão, aguarde...",applyingButton:"Aplicando...",testConnection:"Testar conexão",baseUrlStatusAutoFix:"Correção automática: {value}",baseUrlStatusInvalid:"Base URL deve ser http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"Chave API",apiKeyPlaceholder:"Cole uma nova chave para actualizar (deixe vazio para manter)",apiKeyCurrent:"Atual: {value}",apiKeyNotSet:"Atual: (não definida)",apiKeyInvalidCjk:"A chave API não pode conter caracteres chineses.",apiKeyInvalidSpaces:"A chave API não pode conter espaços.",clearKey:"Excluir",useDetectedKey:"Usar {name}",disconnectButton:"Desligar",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"Desligado",toggleOn:"Ligado",toggleHint:"Tab trocar • ←/→ alterar • Space alternar"},redoConfirmDialog:{title:"Confirmar Refazer",body:"Tem certeza de que deseja restaurar as mensagens revertidas?"},renameSessionDialog:{title:"Renomear sessão",label:"Nome da sessão",placeholder:"ex: Notas de planejamento"},sessionsDialog:{timeNow:"agora",timeMinutes:"{count} min",timeHours:"{count} h",timeDays:"{count} d",newSession:"Nova sessão",title:"Sessões ({count})",titleScoped:"Sessões ({count}/{total})",scope:"Escopo: {cwd}",loading:"Carregando…",confirmDelete:"Confirmar exclusão: pressione Delete novamente",header:"{count} sessões • Setas para navegar • Enter selecionar{range}{activity}",headerRange:" • Exibindo {start}-{end}",runningCount:"{count} em execução",pausedCount:"{count} aguardando confirmação",hint:"Digite para buscar • ←/→ botões • Enter confirmar • Esc fechar",focusPrefix:"Foco: {focus}",focusList:"Lista",focusButtons:"Botões",noSessionsCwd:"Nenhuma sessão neste diretório",noSessions:"Nenhuma sessão salva ainda",nodeOnly:"Sessões estão disponíveis apenas no modo Node/CLI.",newSessionTitle:"Nova Sessão",newSessionTarget:"uma nova sessão",busy:{agentResponding:"Agente ainda está respondendo",awaitingAskUser:"Aguardando respostas AskUser",awaitingToolApproval:"Aguardando aprovação de ferramenta",pendingApproval:"Aprovação pendente"},buttons:{open:"Abrir",delete:"Excluir",deleteConfirm:"Excluir (confirmar)",scope:"Escopo: {scope}",scopeCwd:"CWD",scopeAll:"Todos",refresh:"Atualizar"}},sessionsOverlay:{title:"Sessões",hint:"Enter Selecionar • Esc Fechar • Ctrl+R Atualizar",loading:"A carregar sessões...",empty:"Ainda não há sessões guardadas."},switchSessionDialog:{title:"Trocar Sessão",confirm:"Trocar e Interromper",target:"Trocar para {target}?",fallback:"Trocar de sessão agora?",warning:"Isso interromperá a resposta/fluxo na sessão ativa.",reason:"Motivo: {reason}"},themeDialog:{title:"Tema",hint:"Enter Aplicar • Esc Cancelar",mode:"Modo",light:"Claro",dark:"Escuro",unavailable:"Este terminal não suporta temas alternáveis.",fallback:"Um tema fallback ANSI claro/escuro fixo é usado aqui.",tip:"Dica: o padrão segue o tema do sistema."},commandPalette:{searchPlaceholder:"Buscar…",noMatches:"Sem resultados",hint:"Digite para filtrar • Enter: abrir • Esc: fechar",title:"Comandos"},skills:{title:"Habilidades"},help:{title:"Ajuda",modeLabel:"Modo: {mode}",modeDetail:"Modo do assistente atual.",shortcutsLabel:"Atalhos",onboarding:`Bem-vindo! Início rápido:
1161
+ Dica: {commandsKey} abre a paleta de comandos.`,items:{help:"Ajuda e atalhos (F1)",commands:"Paleta de comandos (Ctrl+P)",back:"Voltar ao salto anterior",status:"Alternar detalhes do status"}},commands:{help:{label:"Ajuda",detail:"Atalhos + comandos comuns (F1)"},sessions:{label:"Sessões",detail:"Escolher ou criar sessão (/sessions)"},timeline:{label:"Linha do tempo",detail:"Ir para mensagem do usuário (/timeline)"},newSession:{label:"Nova Sessão",detail:"Iniciar nova sessão (/new)"},connectProvider:{label:"Conectar Provedor",detail:"Conectar um provedor (/connect)"},models:{label:"Modelos",detail:"Selecionar modelo (/models)"},toolApprovals:{label:"Aprovações",detail:"Configurar aprovações (/approvals)"},toolSettings:{label:"Config. Ferramentas",detail:"Configurar ferramentas (/tool-settings)"},mcpHub:{label:"MCP",detail:"Gerenciar conectores MCP (/mcp)"},plugins:{label:"Plugins",detail:"Gerenciar plugins (/plugins)"},debug:{label:"Debug",detail:"Logs de observabilidade SDK (/debug)"},mcpSettings:{label:"MCP (JSON Avançado)",detail:"Configurar JSON bruto do MCP (/mcp-settings)"},language:{label:"Idioma",detail:"Trocar idioma da UI (/language)"},settings:{label:"Configurações",detail:"Config. de provedor personalizado (/settings, Ctrl+K)"}},homePage:{multilineTitle:"Texto Multilinha",multilineTitleWithCount:"Texto Multilinha ({count} linhas)",providerCustom:"Personalizado",reviewPrompt:"ajude-me a revisar as mudanças no código",footerCwd:"cwd {cwd}",hints:{switchMode:"trocar modo",commands:"comandos"},tips:{greeting:"Bem-vindo de volta! Tente {commandsKey} ou {init} para começar.",commandsAlias:"Dica: {key} abre a paleta de comandos."},prompts:{help:"Ajuda e atalhos (F1)",sessions:"Listar/escolher sessões",connect:"Conectar um provedor",models:"Selecionar modelo",newSession:"Iniciar nova sessão",approvals:"Configurar aprovações (auto/normal/strict)",commands:"Abrir paleta de comandos",toolSettings:"Configurar ferramentas",mcpSettings:"Abrir MCP",plugins:"Gerenciar plugins",language:"Trocar idioma da UI",theme:"Selecionar tema",status:"Alternar detalhes do status",review:"Revisar mudanças no código",init:"Inicializar/melhorar AGENTS.md",skills:"Listar habilidades carregados",exit:"Sair do aplicativo",debug:"Diálogo de depuração (chat)",settings:"Config. de provedor personalizado"},commandPalette:{connect:"Conectar um provedor",models:"Selecionar modelo"},commands:{debugLabel:"Debug",debugDetail:"Logs de observabilidade SDK (/debug)"},toast:{approvalsUsage:"Use /approvals (sem on/off).",customProviderOnly:"Configurações apenas para provedores personalizados.",redoChatOnly:"Refazer está disponível apenas na visualização de chat.",retryChatOnly:"Tentar novamente está disponível apenas na visualização de chat.",pinsChatOnly:"Fixações estão disponíveis apenas na visualização de chat.",renameChatOnly:"Renomear está disponível apenas no chat (/rename <title>).",commandRemoved:"Este comando não está mais disponível: {command}",helpAliasRemoved:"Pressione F1 para ajuda.",deleteConfirm:"Pressione Delete novamente para confirmar.",themeToggled:"Tema: {mode}",pasteImagePending:"Imagem ainda está sendo processada. Aguarde."}},chatPage:{placeholder:"Pergunte qualquer coisa... (nova linha: Shift+Enter ou Ctrl+J)",placeholderAwaitingApproval:"Bloqueado por aprovação: selecione Aprovar / Negar para continuar.",reviewPrompt:"ajude-me a revisar as mudanças no código",notification:{approvalTitle:"[Aprovação Necessária] Permissão de Ferramenta",approvalMessage:"DimCode está aguardando aprovação de ferramenta: {tool}.",doneTitle:"[Tarefa Concluída]",doneMessage:"DimCode concluiu esta tarefa.",doneMessageWithDuration:"DimCode concluiu esta tarefa em {duration}.",doneMessageWithTools:"DimCode concluiu esta tarefa após {tools} chamada(s) de ferramenta.",doneMessageWithToolsAndDuration:"DimCode concluiu esta tarefa em {duration} com {tools} chamada(s) de ferramenta."},headerStats:"{messages} msgs · total {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"Consolidando,Pensando,Raciocinando,Planejando,Analisando,Sintetizando,Refinando,Compondo",modelFallback:"modelo",mode:{plan:"plano",agent:"agente",debug:"debug"},status:{approvalsAuto:"AUTO",approvalsAll:"TODOS",blockedByApproval:"Bloqueado por aprovação",awaitingApprovalAction:"Aguardando sua aprovação: escolha Aprovar / Negar para continuar."},footer:{dragSelect:"arrastar para selecionar",openLink:"Ctrl+Clique para abrir arquivos ou links",esc:"esc",interrupt:"interromper",approvalPaused:"⏸ Pausado",approvalPausedHint:"Aguardando aprovação (Enter para escolher).",shortcuts:"Ctrl+K: config Ctrl+O: expandir/recolher ferramentas e thinking Cmd+Delete/Ctrl+W: limpar entrada Tab: trocar modo {commandsKey}: comandos",shortcutsCompact:"Ctrl+K: config Ctrl+O: ferramentas/thinking Cmd+Delete/Ctrl+W: limpar Tab: trocar modo {commandsKey}: comandos",shortcutsMicro:"Ctrl+O: ferramentas {commandsKey}: comandos",shortcutsMini:"{commandsKey}: comandos"},session:{new:"novo"},timeline:{title:"Linha do tempo",empty:"(vazio)",filterAll:"Todas as mensagens",filterUser:"Mensagens do usuário",filterTool:"Chamadas de ferramenta"},pins:{title:"Fixados",empty:"(vazio)"},jumpToBottom:{button:"↓"},prompts:{help:"Ajuda e atalhos (F1)",newSession:"Iniciar nova sessão",resume:"Retomar fila pausada",sessions:"Listar/escolher sessões",timeline:"Ir para mensagem do usuário",pins:"Abrir mensagens fixadas",pin:"Fixar última mensagem",back:"Voltar ao salto anterior",connect:"Conectar um provedor",models:"Selecionar modelo",theme:"Trocar tema da UI",approvals:"Configurar aprovações (auto/normal/strict)",commands:"Abrir paleta de comandos",toolSettings:"Configurar ferramentas",mcpSettings:"Abrir MCP",plugins:"Gerenciar plugins",language:"Trocar idioma da UI",status:"Alternar detalhes do status",review:"Revisar mudanças no código",retry:"Tentar novamente a última mensagem",compact:"Compactar contexto da sessão",init:"Inicializar/melhorar AGENTS.md",rename:"Renomear sessão atual",skills:"Listar habilidades carregados",exit:"Sair do aplicativo",debug:"Diálogo de depuração",settings:"Config. de provedor personalizado"},commands:{pinsLabel:"Fixados",pinsDetail:"Abrir mensagens fixadas",backLabel:"Voltar",backDetail:"Retornar ao salto anterior",debugLabel:"Debug",debugDetail:"Logs de observabilidade SDK (/debug)",statusLabel:"Status",statusDetail:"Alternar detalhes do status",themeLabel:"Tema",themeDetail:"Trocar tema de cores"},tips:{contextWarn:"Dica: O contexto está ficando cheio. Considere /compact ou /new para manter respostas precisas.",contextCritical:"Dica: Você está perto do limite de contexto. Comece uma nova sessão com /new (ou /compact primeiro).",timeline:"Dica: Chat longo? Use /tl para voltar a uma mensagem específica.",timelineAlias:"Dica: /tl é um atalho para /timeline.",commandsAlias:"Dica: {key} abre a paleta de comandos.",errorRecovery:"Dica: Se algo falhou, tente /compact ou /new.",greeting:"Bem-vindo de volta! Tente {commandsKey} ou {init} para começar.",compactDelight:"Legal! Manter o contexto enxuto ajuda.",addTests:'Tudo pronto! Quer que eu adicione testes? Responda "sim" ou "ok".'},confirm:{addTests:"Adicione testes para as mudanças que acabamos de fazer."},toast:{customProviderOnly:"Configurações apenas para provedores personalizados.",renameNodeOnly:"Renomear está disponível apenas no modo Node/CLI.",noActiveSession:"Nenhuma sessão ativa para renomear.",sessionNameEmpty:"O nome da sessão não pode ficar vazio.",sessionRenamed:"Sessão renomeada para: {title}",renameFailed:"Falha ao renomear sessão.",linkOpenHint:"Dica: Ctrl+Clique para abrir arquivos ou links.",copySuccess:"Copiado",copyFailed:"Falha ao copiar",forkFailed:"Falha ao bifurcar sessão.",backEmpty:"Nenhum salto anterior para retornar.",pinsEmpty:"Nenhuma mensagem fixada ainda.",pinEmpty:"Nenhuma mensagem para fixar ainda.",pinned:"Mensagem fixada.",unpinned:"Mensagem desafixada.",debugUnavailable:"Servidor de debug indisponível.",approvalsUsage:"Use /approvals (sem on/off).",debugDialogOpened:"Diálogo de depuração aberto.",debugDialogClosed:"Diálogo de depuração fechado.",renameUsage:"Uso: /rename <title>",themeToggled:"Tema: {mode}",statusCompactOn:"Status: compacto",statusCompactOff:"Status: detalhado",compactingSession:"Compactando sessão...",compactSuccess:"Sessão compactada: {message}",compactWarning:"Sessão compactada com ganho limitado: {message}",compactSuccessDetailWithTokens:"{count} mensagens históricas foram compactadas em um resumo. Input estimado {before} -> {after} tokens, economizando cerca de {saved} tokens.",compactSuccessDetailNotReduced:"{count} mensagens históricas foram compactadas em um resumo, mas o input estimado mudou de {before} para {after} tokens, sem redução no tamanho da requisição.",compactSuccessDetailCountOnly:"{count} mensagens históricas foram compactadas em um resumo.",compactSuccessDetailSummaryOnly:"Novo resumo da conversa gerado.",compactFailed:"Falha ao compactar sessão: {error}",compactFailedTokenLimit:"Compactação falhou por orçamento de contexto insuficiente. Defina DIMCODE_CONTEXT_WINDOW corretamente, mude para um modelo de contexto maior, ou use /new. Detalhe: {error}",retryEmpty:"Nenhuma mensagem anterior para tentar novamente.",commandRemoved:"Este comando não está mais disponível: {command}",helpAliasRemoved:"Pressione F1 para ajuda.",waitForResponse:"Aguarde a resposta atual terminar, ou pressione Esc para interromper.",pasteImagePending:"Imagem ainda está sendo processada. Aguarde.",pendingApproval:"Trate tool_approve primeiro.",awaitingApprovalAction:"Pausado: ação necessária. Escolha Aprovar / Sempre aprovar / Negar no cartão de permissão.",awaitingApprovalStillWaiting:"Ainda aguardando aprovação ({seconds}s). O modelo não continuará até você aprovar ou negar.",pendingAskUser:"Trate ask_user primeiro.",notificationSessionBusy:"Esta notificação pertence a outra sessão ocupada. Finalize aquele trabalho ou troque de sessão manualmente.",notificationSessionUnavailable:"Não é possível abrir a sessão desta notificação aqui.",notificationSessionSwitchFailed:"Falha ao abrir a sessão desta notificação.",approvalNotActive:"Esta aprovação está na fila. Resolva a ativa primeiro.",askUserNotActive:"Esta requisição ask_user não está mais ativa."}},chatQueue:{label:"Fila ({count})",labelCompact:"Fila {count}",more:"+{count} mais…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"continuar fila",state:{idle:"Pendente",running:"Executando",paused:"Pausado",error:"Erro"},item:{steerAction:"Direcionar",steerReady:"Primeiro",steerPending:"Próximo",steerPaused:"Pausado"},toast:{enqueued:"Adicionado à fila (#{count}).",full:"Fila cheia (máx 5). Exclua um ou comece /new.",cleared:"{count} item(ns) da fila removido(s).",deleted:"{count} item(ns) da fila excluído(s). Ctrl+Z para desfazer.",steerPromoted:"Elevado para steer. Será executado primeiro quando a fila retomar.",steerQueued:"Steer não pôde ser injetado imediatamente. Foi promovido e executará primeiro na próxima rodada.",steerSent:"Steer aceito. Será injetado antes da próxima chamada do modelo nesta rodada.",undo:"Exclusão da fila desfeita.",pausedTip:"Fila pausada. Use {resume} ou {resumeText} para continuar, ou envie uma nova mensagem para escolher o que fazer.",stale:"Fila pausada: requisição parece travada."},confirm:{title:"Continuar mensagens na fila?",description:"Requisição anterior não finalizou. {count} mensagem(ns) aguardando na fila.",hint:"Continue enviando o próximo item, ou pause a fila.",continue:"Continuar",pause:"Pausar",reason:"Motivo: {reason}"},reason:{network_error:"Erro de rede.",timeout:"Requisição expirou.",canceled_by_user:"Cancelado pelo usuário.",rate_limited:"Limite de taxa atingido.",config_unavailable:"Configuração salva indisponível.",unknown:"Requisição falhou."},draftDecision:{title:"Fila pausada",description:"{count} mensagem(ns) na fila ainda aguardando. Decida o que fazer com sua nova entrada.",previewLabel:"Nova entrada:",continue:"Continuar fila",append:"Adicionar à fila",replace:"Descartar fila e enviar"}},chatStatus:{done:"Concluído.",error:"Erro.",interrupted:"Interrompido.",permissionDenied:"Permissão negada.",planning:"Planejando…",drafting:"Rascunhando…",retrying:"Tentando novamente ({retry}/{maxAttempts})…",runningTool:"Executando {tool}…",runningTools:"Executando {count} ferramentas…",approvalPendingOther:"Outra aprovação pendente ({permission})…",awaitingApproval:"Aguardando aprovação…",awaitingApprovalWithPerm:"Aguardando aprovação ({permission})…",awaitingApprovalWithRisk:"Aguardando aprovação ({risk})…",awaitingAnswers:"Aguardando respostas…",resumingApproved:"Aprovado. Retomando…",resumingDenied:"Negado. Retomando…",resuming:"Retomando…",autoApprovingWithRisk:"Aprovação automática ({risk})…",riskFallback:"risco",toolFallback:"ferramenta",thinking:"Pensando…",autoCompactionRequired:"Contexto próximo do limite. Compactação necessária primeiro.",autoCompactionRequiredDetailed:"Contexto próximo do limite · próxima requisição estimada em {estimated} tokens, compactação automática inicia em {threshold} tokens, compactação necessária primeiro.",compressed:"Contexto compactado · {removed} mensagens antigas foram compactadas em um resumo, economizando cerca de {saved} tokens de input ({elapsed}ms)",autoCompactedDetailed:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo, input estimado {before} -> {after} tokens, economizando cerca de {saved} tokens",autoCompactedNotReduced:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo, mas o input estimado mudou de {before} para {after} tokens, sem redução no tamanho da requisição",autoCompactedSaved:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo, economizando cerca de {saved} tokens",autoCompactedCountOnly:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo",interruptedMarkdown:"> **Interrompido** · Resposta cancelada pelo usuário (`Esc`).",awaitingApprovalPrefix:"Aguardando aprovação",awaitingAnswersPrefix:"Aguardando respostas",approvalPendingPrefix:"Outra aprovação pendente",autoApprovingPrefix:"Aprovação automática"},chatParts:{thinking:"Pensando",plan:"Plano",todo:"Todo"},chatRender:{userLabel:"usuário",outputLabel:"↳ saída",outputLabelShort:"saída:",canceled:"cancelado",inputLabel:"entrada:",collapse:"... (recolher)",moreLines:"... ({count} mais linhas)",moreLinesOmitted:"... ({count} linhas omitidas; defina {envVar} para aumentar)",streamingTail:"… (streaming: mostrando últimos {shown} chars; {omitted} omitidos)",copy:"Copiar",userResponses:"Respostas do usuário:",approvalQueued:"Aguardando aprovação anterior...",proposedPlan:{title:"Plano Proposto"},llmMeta:{changedFiles:"{count} arquivo(s) alterado(s): {files}",changedFilesMore:"+{count} mais",revertHint:"Dica: Clique nesta mensagem -> Reverter mensagens para desfazer esta rodada.",changedFilesCardTitle:"{count} arquivos alterados:",revertButton:"Reverter"},toolName:{explore:"Explorar",subagent:"Subagente"},toolSuffix:{offset:"offset {value}",limit:"limite {value}",matches:"{count} correspondências",todos:"{count} todos",results:"{count} resultados",results_one:"{count} resultado"},toolGroup:{readFiles:"Ler {count} arquivos",writeFiles:"Escrever {count} arquivos",editFiles:"Editar {count} arquivos",globPatterns:"Glob {count} padrões",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} padrões",bashCommands:"Executar {count} comandos",searchQueries:"Buscar {count} consultas",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"Busca pode acessar a rede.",bash:"Bash pode executar comandos.",edit:"Alterações de arquivo podem modificar arquivos locais.",grep:"Grep pode ler arquivos locais."},inlineHint:"Teclas: ↑↓←→ para mover, Enter para selecionar.",awaitingUserAction:"Aguardando sua ação: escolha Aprovar / Sempre aprovar / Negar.",decision:{userDenied:"Usuário negou a aprovação"},denied:{title:"# Permissão de ferramenta negada",toolLine:"- ferramenta: `{tool}`",permissionLine:"- permissão: `{permission}`",hint:"Você pode selecionar novamente o tool_call e tentar novamente."},summary:{title:"# Ferramenta aprovada e executada",permissionLine:"Permissão `{permission}` aprovada para `{tool}`."},required:"Aprovação necessária ({risk}).",args:{commandWithDescription:"Comando: {command} - {description}",command:"Comando: {command}",description:"Descrição: {description}",raw:"Args: {args}"}},pathPicker:{titleWorkspace:"Selecionar Workspace",titleFile:"Selecionar Arquivo",placeholderWorkspace:"Digite um caminho (../ etc). Tab para autocompletar. Enter seleciona diretório.",placeholderFile:"Digite um caminho (../ etc). Tab para autocompletar. Enter seleciona arquivo."},providerDialogs:{customLabel:"Personalizado",customDetail:"personalizado",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Entrar com DimCode OAuth",addCustomLabel:"Adicionar provedor personalizado",addCustomDetail:"adicionar provedor personalizado",providerFallback:"Provedor",adapter:{openai:"OpenAI",openaiOpenRouter:"Compatível com OpenAI (OpenRouter)",openaiLocal:"Compatível com OpenAI (Local)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Configurado",notConfigured:"Não configurado"},manage:{title:"Provedor personalizado: {provider}",connect:"Conectar",connectDetail:"Editar API Key / Base URL",rename:"Renomear",renameDetail:"Editar nome do provedor",models:"Editar modelos",modelsDetail:"Atualizar IDs de modelos disponíveis",delete:"Excluir",deleteDetail:"Remover este provedor"},deleteConfirm:{title:"Excluir {provider}?",confirm:"Excluir (confirmar)",confirmDetail:"Isso não pode ser desfeito",cancelDetail:"Manter provedor"},nameDialog:{title:"Nomear provedor personalizado",label:"Nome do provedor",placeholder:"ex: DeepSeek (Proxy)"},modelsDialog:{title:"Modelos do provedor personalizado",modelsTitle:"Modelos",modelsPlaceholder:"IDs dos modelos (, ou nova linha)",hint:", / nova linha • Shift+Enter nova linha • Enter Aplicar",fetch:"Buscar modelos",fetching:"Buscando modelos…"},modelsFetchDialog:{title:"Selecionar modelos",searchPlaceholder:"Filtrar modelos",hint:"Space alternar • Enter confirmar • Esc cancelar"},toast:{modelSet:"Modelo definido para {provider} / {model}.",noModels:"Nenhum modelo disponível ainda. Conecte um provedor primeiro (/connect).",connectFirst:"Conecte um provedor primeiro (/connect) antes de enviar sua primeira mensagem.",apiKeyRequired:"API Key é obrigatória.",baseUrlRequired:"Base URL é obrigatória.",baseUrlInvalid:"Base URL deve começar com http:// ou https://",connected:"Conectado a {provider}.",connectedSelectModel:"Conectado a {provider}. Escolha um modelo.",connectedCheckFailed:"Conectado a {provider}, mas verificação falhou: {reason}",connectionTestPassed:"Teste de conexão aprovado: {provider}.",connectionTestFailed:"Teste de conexão falhou: {provider} - {reason}",connectionActionUpdateKey:"Ação: reabra Conectar e atualize a API key, depois teste novamente.",connectionActionFixBaseUrl:"Ação: verifique o caminho do Base URL (geralmente termina com /v1), depois teste novamente.",connectionActionSwitchKey:"Ação: aguarde um momento ou mude para outra chave/provedor.",connectionActionRetryTest:"Ação: verifique rede/proxy e execute Testar conexão novamente.",noModelsFetching:"Sem modelos ainda. Buscando lista de modelos…",firstUseGuide:'Início rápido: 1) /connect 2) /models 3) envie "hello"',firstUseSendHello:'Próximo passo: envie sua primeira mensagem (ex: "hello").',connectionCheckUnauthorized:"401 Não autorizado: verifique a API key e o tipo de provedor.",connectionCheckForbidden:"403 Proibido: sua chave pode não ter acesso a este provedor/modelo.",connectionCheckNotFound:"404 Não encontrado: verifique o caminho do Base URL (compatível com OpenAI geralmente termina com /v1).",connectionCheckRateLimited:"429 Limite de taxa: aguarde e tente novamente, ou mude para outra chave/provedor.",connectionCheckTimeout:"Conexão expirou: verifique rede/proxy e tente novamente.",connectionCheckNetwork:"Conexão de rede falhou: verifique DNS/proxy/Base URL.",connectionCheckFailed:"Verificação de conexão falhou: {error}",apiKeyCleared:"API key limpa para {provider}.",customAdded:"Provedor personalizado adicionado: {provider}.",customRenamed:"Provedor personalizado renomeado: {provider}.",customModelsUpdated:"Modelos do provedor personalizado atualizados: {provider}.",customDeleted:"Provedor personalizado excluído: {provider}.",modelsRequired:"Adicione pelo menos um modelo.",modelsEmpty:"Nenhum modelo encontrado.",modelsFetchFailed:"Falha ao buscar modelos: {error}",modelsFetchChatCompletions:"Lista de modelos não suportada para base URL /chat/completions ou /responses.",manualModelsRequired:"Este endpoint não suporta descoberta automática de modelos. Insira os nomes manualmente na configuração.",nameRequired:"Nome do provedor é obrigatório.",nameConflict:"Nome do provedor já existe."}},copyToast:{copiedToClipboard:"Copiado para a área de transferência"}};var pt_PT_default={common:{apply:"Aplicar",cancel:"Cancelar",close:"Fechar",confirm:"Confirmar",yes:"Sim",no:"Não",exit:"Sair",back:"Voltar",next:"Próximo",save:"Salvar",empty:"—",unknownError:"Erro desconhecido",inputClearTip:"Ctrl+C limpar",total:"Total"},configDialog:{title:"Configurações",hint:"Tab/Shift+Tab trocar campo • Enter Aplicar • Esc Cancelar",modelsTitle:"Modelos (personalizado)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"Janela de Contexto",contextWindowLocked:"Janela de Contexto (definido pelo modelo)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperatura",temperaturePlaceholder:"0.7",temperatureValidationError:'Temperatura: apenas números e "."',maxTokensTitle:"Máx. Tokens de Saída",maxTokensPlaceholder:"32000",baseUrlTitle:"URL Base (compatível com OpenAI)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"Atual:",apiKeyNotSet:"(não definida)",apiKeyTitle:"Chave API",apiKeyPlaceholder:"Cole uma nova chave para actualizar (deixe vazio para manter)",interleavedThinkingTitle:"Pensamento Intercalado (Space para alternar)",interleavedThinkingLocked:"Pensamento Intercalado (definido pelo modelo)",interleavedThinkingOpen:"Ativado",interleavedThinkingClose:"Desativado",tipIntensityTitle:"Intensidade de Dicas",tipIntensityOff:"Desligado",tipIntensityLow:"Baixa",tipIntensityStandard:"Padrão",shortcutsTitle:"Atalhos",shortcutCommandsLabel:"Comandos",shortcutTimelineLabel:"Linha do tempo",shortcutNewSessionLabel:"Nova sessão",shortcutsPlaceholder:"ex: mod+p",shortcutsHint:"Use mod/ctrl/alt/shift + tecla (a-z, 0-9, F1-F12)."},languageDialog:{title:"Idioma",hint:"Enter Aplicar • Esc Cancelar",languageTitle:"Idioma",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"Esforço de Pensamento",hint:"Enter Aplicar • Esc Cancelar",effortTitle:"Esforço de Raciocínio",applied:"Esforço de raciocínio definido como {effort}",option:{low:"Baixo",medium:"Médio",high:"Alto",xhigh:"Muito alto",max:"Máx",minimal:"Mínimo",none:"Nenhum",off:"Desligado",auto:"Automático"}},toolSettingsDialog:{title:"Config. de Ferramentas",hint:"Enter Aplicar • Esc Cancelar",websearchTitle:"Chave API WebSearch",apiKeyCurrentPrefix:"Atual:",apiKeyNotSet:"(não definida)",apiKeyInvalidCjk:"A chave API não pode conter caracteres chineses.",apiKeyInvalidSpaces:"A chave API não pode conter espaços.",apiKeyPlaceholder:"Cole a chave Serper API"},pluginsDialog:{title:"Plugins",hint:"Selecione um plugin para configurar • Esc Fechar",serperSearch:"Serper Search",serperSearchDetail:"Busca web via Serper API",configured:"Configurado",notConfigured:"Não configurado",serperConfigTitle:"Config. Serper Search",serperConfigHint:"Tab Alternar • Enter Aplicar • Esc Cancelar"},skillsDialog:{title:"Habilidades",hint:"Enter Aplicar • Esc Cancelar",empty:"Nenhuma habilidade disponível",emptyFiltered:"Nenhuma habilidade correspondente"},timelineDialog:{title:"Linha temporal",hint:"Tab Filtrar • Enter Abrir • Esc Fechar",empty:"Ainda não há mensagens",emptyFiltered:"Nenhuma entrada correspondente",filterAll:"Todas as mensagens",filterUser:"Mensagens do utilizador",filterTool:"Chamadas de ferramentas"},mcpSettingsDialog:{title:"MCP",hint:"Edite o arquivo mcp.json para configurar servidores MCP • Esc Fechar",configFileLabel:"Ficheiro de config.:",noServersHint:"Nenhum servidor MCP configurado ainda.",serverCount:"{count} servidor(es) configurado(s)",guideText:"Edite o arquivo acima para adicionar ou modificar servidores MCP.",openFile:"Abrir Ficheiro",reload:"Recarregar",close:"Fechar",reloaded:"Configuração MCP recarregada.",reloadFailed:"Falha ao recarregar: {error}",status:"Status",toolCount:"Ferramentas",disabled:"desativado",testConnection:"Testar",testing:"Testando conexões...",testComplete:"Teste concluído.",testPartial:"Teste concluído com erros.",testFailed:"Conexão falhou: {error}",invalidJson:"JSON inválido: {error}",invalidShape:'JSON MCP inválido: esperado "mcpServers".',invalidServer:"Servidor MCP inválido: {name}",noServers:"Nenhum servidor MCP encontrado.",lintOk:"Sintaxe JSON OK",lintAt:"{error} (linha {line}, coluna {column})",lintUnclosed:"{char} não fechado (linha {line}, coluna {column})",lintInvalid:"{error}",exampleFormat:"Formato de exemplo:"},toolApprovalsDialog:{title:"Aprovações de Ferramentas",useAuto:"Automático",useNormal:"Normal",useStrict:"Restrito",close:"Fechar",focusedTitleAuto:"AUTOMÁTICO",focusedTitleNormal:"NORMAL",focusedTitleStrict:"RESTRITO",focusedTitleClose:"FECHAR",focusedDescAuto:"Aprovar automaticamente todas as chamadas. Sem confirmação (mais rápido, menos seguro).",focusedDescNormal:"Aprovar automaticamente ferramentas de leitura. Confirmar antes de escrever/executar.",focusedDescStrict:"Exigir confirmação para toda chamada (mais seguro, mais lento).",focusedDescClose:"Fechar este diálogo sem alterar a configuração atual.",currentPrefix:"Atual: {mode}",tip:"Dica: Tab ou ↑/↓ para mover entre botões, Enter para confirmar, Esc para fechar."},settingsDialog:{pendingApproval:"Resolva a aprovação pendente antes de alterar as configurações.",invalidShortcut:"Atalho inválido para {label}: {value}",shortcutCommands:"Atalho de comandos",shortcutTimeline:"Atalho da linha do tempo",shortcutNewSession:"Atalho de nova sessão",toolApprovalsApplied:"Aprovações de ferramentas: {mode}",applied:"Configurações aplicadas."},exitAppDialog:{title:"Sair do DimCode",confirm:"Sair agora?",warning:"Uma resposta do agente ainda está em andamento. Sair irá interrompê-la.",reasonPrefix:"Motivo: {reason}"},approvalDialog:{title:"Aprovar Permissão de Ferramenta",toolLabel:"Ferramenta: {tool}{suffix}",toolLabelSuffix:" ({description})",permissionLabel:"Permissão: {permission} ({risk})",descriptionLabel:"Descrição: {description}",commandLabel:"Comando:",inlineActionHint:"↑/← Anterior ↓/→ Próximo Enter Confirmar 1/2/3 Escolher",inlineActionHintCompact:"←/→ Mover Enter Confirmar 1/2/3 Escolher",buttons:{approve:"Aprovar",alwaysApprove:"Sempre aprovar",deny:"Negar",always:"Sempre",ok:"OK",no:"Não",y:"S",all:"Tudo",n:"N"}},askUserDialog:{noQuestionsTitle:"Sem Perguntas",noQuestionsBody:"Nenhuma pergunta para responder.",title:"Pergunta {index}/{total}: {header}",defaultHeader:"Pergunta",prev:"Anterior",next:"Próxima",submit:"Enviar",otherOption:"Outro",otherDetail:"Forneça uma resposta personalizada",inlineHintOptions:"Teclas: ↑↓ mover, ←→ trocar pergunta, Enter selecionar.",inlineHintMulti:"Multi-seleção: Space para alternar seleção.",inlineHintButtons:"Tab para botões, ←→ trocar, Enter ativar, ↑ volta às opções.",inlineHintNav:"Ctrl+Left / Ctrl+Right (ou Ctrl+A / Ctrl+E) para trocar perguntas.",inlineHintSubmit:"Ctrl+Enter enviar, Esc cancelar.",inlineButtonPrev:"[Anterior]",inlineButtonNext:"[Próxima]",inlineButtonSubmit:"[Enviar]",inlineButtonCancel:"[Cancelar]",inlineActionHint:"Space Selecionar ← Anterior → Próxima Enter Próxima/Enviar Esc Cancelar",inlineActionHintCompact:"Space Selecionar ←/→ Anterior/Próxima Enter Próxima/Enviar Esc Cancelar",optionsSummaryAll:"{count} opções",optionsSummaryVisibleMore:"{count} opções ({start}-{end}) ↓ mais",multiSelectHint:"[Multi-seleção] Space para alternar, Enter para confirmar",singleSelectHint:"[Seleção única] Use setas, Enter para confirmar",customAnswerLabel:"Resposta personalizada:",customAnswerPlaceholder:"Digite sua resposta...",otherPlaceholder:"Outro selecionado — digite sua resposta e pressione Enter."},nextApiOAuthDialog:{title:"Login DimCode OAuth",copyUrl:"Copiar URL",login:"Entrar",logout:"Sair",statusTitle:"Status",statusAuthenticated:"✓ Conectado como {email}",statusLoading:"⏳ Autenticando...",statusNotLoggedIn:"✗ Não conectado",instructionAuthenticated:"Use ↑↓ para navegar, Enter para selecionar, ou números 1-9",instructionLoading:"Pressione C para copiar a URL abaixo se o navegador não abriu",instructionNeedsSetup:"Verifique o redirect_uri, scopes e estado ativo do DimCode OAuth, depois tente novamente",instructionWithUrl:"Pressione C para copiar a URL OAuth abaixo, ou Enter para abrir o navegador",instructionUnauthed:"Pressione Enter para entrar com DimCode OAuth, ou Esc para fechar",instructionManualCallback:"Copie a URL abaixo, inicie sessão no navegador e cole a URL redirecionada na caixa de entrada.",oauthUrlTitleLoading:"URL OAuth (copie se o navegador não abriu)",oauthUrlTitleReady:"URL OAuth (pronto para usar)",scrollIndicator:" [{start}-{end} de {total}]",selectModelTitle:"Selecionar Modelo (↑↓/1-9, Enter para selecionar){indicator}",aboutTitle:"Sobre DimCode OAuth",setupTitle:"Erro de login OAuth",aboutBulletOne:"• Usa o cliente DimCode OAuth integrado",aboutBulletTwo:"• Obtém modelos relay após login e salva a configuração do provedor",aboutBulletThree:"• Usa OAuth refresh tokens em vez de API key de longa duração",viewAllPlans:"Ver Todos os Planos →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"Conta DimCode",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"Gerando URL OAuth...",urlReady:"URL OAuth pronta! Copie ou pressione Enter para abrir o navegador.",generateUrlFailed:"Falha ao gerar URL OAuth: {error}",startingLogin:"Iniciando login OAuth...",browserOpened:"Navegador aberto. Se não, copie a URL do diálogo.",copyUrlToLogin:"Copie a URL OAuth do diálogo para fazer login.",urlCopied:"URL OAuth copiada para a área de transferência.",urlCopyFailed:"Falha ao copiar URL OAuth.",authSuccess:"Autenticado com sucesso pelo DimCode OAuth!",loginFailed:"Login OAuth falhou: {error}",loggedOut:"Desconectado do DimCode OAuth",loggedOutWithRemoteWarning:"Desconectado do DimCode OAuth, mas revogação remota falhou: {error}",logoutFailed:"Falha ao sair: {error}",initFailed:"Erro de inicialização do diálogo: {error}",modelSwitched:"Modelo alterado para {model}",selectModelFailed:"Falha ao selecionar modelo: {error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"Debug",titleDebugging:"Depurando",copy:"copiar",proceed:"prosseguir",fixed:"corrigido",body:"Adicionei logs de debug (e possivelmente uma correção). Tente reproduzir o problema e escolha um resultado."},exitSessionDialog:{title:"Sair da Sessão",confirm:"Sair da sessão atual e voltar ao Início?",note:"A próxima mensagem iniciará uma nova sessão."},messageActionsDialog:{title:"Ações da Mensagem",revert:"Reverter mensagens",revertWithFiles:"Reverter mensagens e alterações de ficheiros",revertKeepFiles:"Reverter mensagens (manter alterações)",revertFilesOnly:"Reverter apenas alterações de ficheiros",copy:"Copiar texto da mensagem",fork:"Bifurcar para criar nova sessão",pin:"Fixar mensagem",unpin:"Desafixar mensagem"},pathPickerDialog:{hint:"↑/↓ selecionar • Tab autocompletar • Enter confirmar • Esc fechar"},providerConnectDialog:{title:"Conectar {provider}",providerFallback:"Provedor",hint:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintOpenAI:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintGemini:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintAnthropic:"Tab trocar • Ctrl+C limpar • Enter Aplicar",hintGeneric:"Tab trocar • Ctrl+C limpar • Enter Aplicar",applyingHint:"Testando conexão, aguarde...",applyingButton:"Aplicando...",testConnection:"Testar conexão",baseUrlStatusAutoFix:"Correção automática: {value}",baseUrlStatusInvalid:"Base URL deve ser http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"Chave API",apiKeyPlaceholder:"Cole uma nova chave para actualizar (deixe vazio para manter)",apiKeyCurrent:"Atual: {value}",apiKeyNotSet:"Atual: (não definida)",apiKeyInvalidCjk:"A chave API não pode conter caracteres chineses.",apiKeyInvalidSpaces:"A chave API não pode conter espaços.",clearKey:"Excluir",useDetectedKey:"Usar {name}",disconnectButton:"Desligar",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"Desligado",toggleOn:"Ligado",toggleHint:"Tab trocar • ←/→ alterar • Space alternar"},redoConfirmDialog:{title:"Confirmar Refazer",body:"Tem certeza de que deseja restaurar as mensagens revertidas?"},renameSessionDialog:{title:"Renomear sessão",label:"Nome da sessão",placeholder:"ex: Notas de planejamento"},sessionsDialog:{timeNow:"agora",timeMinutes:"{count} min",timeHours:"{count} h",timeDays:"{count} d",newSession:"Nova sessão",title:"Sessões ({count})",titleScoped:"Sessões ({count}/{total})",scope:"Escopo: {cwd}",loading:"Carregando…",confirmDelete:"Confirmar exclusão: pressione Delete novamente",header:"{count} sessões • Setas para navegar • Enter selecionar{range}{activity}",headerRange:" • Exibindo {start}-{end}",runningCount:"{count} em execução",pausedCount:"{count} aguardando confirmação",hint:"Digite para buscar • ←/→ botões • Enter confirmar • Esc fechar",focusPrefix:"Foco: {focus}",focusList:"Lista",focusButtons:"Botões",noSessionsCwd:"Nenhuma sessão neste diretório",noSessions:"Nenhuma sessão salva ainda",nodeOnly:"Sessões estão disponíveis apenas no modo Node/CLI.",newSessionTitle:"Nova Sessão",newSessionTarget:"uma nova sessão",busy:{agentResponding:"Agente ainda está respondendo",awaitingAskUser:"Aguardando respostas AskUser",awaitingToolApproval:"Aguardando aprovação de ferramenta",pendingApproval:"Aprovação pendente"},buttons:{open:"Abrir",delete:"Excluir",deleteConfirm:"Excluir (confirmar)",scope:"Escopo: {scope}",scopeCwd:"CWD",scopeAll:"Todos",refresh:"Atualizar"}},sessionsOverlay:{title:"Sessões",hint:"Enter Selecionar • Esc Fechar • Ctrl+R Atualizar • Ctrl+W Âmbito",loading:"A carregar sessões...",empty:"Ainda não há sessões guardadas.",loadingMore:"A carregar mais…",hasMore:"↓ mais",scope:{cwdOnly:"apenas cwd",allCwd:"todos os cwds"}},switchSessionDialog:{title:"Trocar Sessão",confirm:"Trocar e Interromper",target:"Trocar para {target}?",fallback:"Trocar de sessão agora?",warning:"Isso interromperá a resposta/fluxo na sessão ativa.",reason:"Motivo: {reason}"},themeDialog:{title:"Tema",hint:"Enter Aplicar • Esc Cancelar",mode:"Modo",light:"Claro",dark:"Escuro",unavailable:"Este terminal não suporta temas alternáveis.",fallback:"Um tema fallback ANSI claro/escuro fixo é usado aqui.",tip:"Dica: o padrão segue o tema do sistema."},commandPalette:{searchPlaceholder:"Buscar…",noMatches:"Sem resultados",hint:"Digite para filtrar • Enter: abrir • Esc: fechar",title:"Comandos"},skills:{title:"Habilidades"},help:{title:"Ajuda",modeLabel:"Modo: {mode}",modeDetail:"Modo do assistente atual.",shortcutsLabel:"Atalhos",onboarding:`Bem-vindo! Início rápido:
1162
1162
  1) /connect: conectar um provedor
1163
1163
  2) /models: escolher um modelo
1164
1164
  3) envie "hello" para começar
1165
- Dica: {commandsKey} abre a paleta de comandos.`,items:{help:"Ajuda e atalhos (F1)",commands:"Paleta de comandos (Ctrl+P)",back:"Voltar ao salto anterior",status:"Alternar detalhes do status"}},commands:{help:{label:"Ajuda",detail:"Atalhos + comandos comuns (F1)"},sessions:{label:"Sessões",detail:"Escolher ou criar sessão (/sessions)"},timeline:{label:"Linha do tempo",detail:"Ir para mensagem do usuário (/timeline)"},newSession:{label:"Nova Sessão",detail:"Iniciar nova sessão (/new)"},connectProvider:{label:"Ligar Provedor",detail:"Ligar um provedor (/connect)"},models:{label:"Modelos",detail:"Selecionar modelo (/models)"},toolApprovals:{label:"Aprovações",detail:"Configurar aprovações (/approvals)"},toolSettings:{label:"Config. Ferramentas",detail:"Configurar ferramentas (/tool-settings)"},mcpHub:{label:"MCP",detail:"Gerenciar conectores MCP (/mcp)"},plugins:{label:"Plugins",detail:"Gerenciar plugins (/plugins)"},debug:{label:"Debug",detail:"Logs de observabilidade SDK (/debug)"},mcpSettings:{label:"MCP (JSON Avançado)",detail:"Configurar JSON bruto do MCP (/mcp-settings)"},language:{label:"Idioma",detail:"Trocar idioma da UI (/language)"},settings:{label:"Configurações",detail:"Config. de provedor personalizado (/settings, Ctrl+K)"}},homePage:{multilineTitle:"Texto Multilinha",multilineTitleWithCount:"Texto Multilinha ({count} linhas)",providerCustom:"Personalizado",reviewPrompt:"ajude-me a revisar as mudanças no código",footerCwd:"cwd {cwd}",hints:{switchMode:"trocar modo",commands:"comandos"},tips:{greeting:"Bem-vindo de volta! Tente {commandsKey} ou {init} para começar.",commandsAlias:"Dica: {key} abre a paleta de comandos."},prompts:{help:"Ajuda e atalhos (F1)",sessions:"Listar/escolher sessões",connect:"Ligar um provedor",models:"Selecionar modelo",newSession:"Iniciar nova sessão",approvals:"Configurar aprovações (auto/normal/strict)",commands:"Abrir paleta de comandos",toolSettings:"Configurar ferramentas",mcpSettings:"Abrir MCP",plugins:"Gerenciar plugins",language:"Trocar idioma da UI",theme:"Selecionar tema",status:"Alternar detalhes do status",review:"Revisar mudanças no código",init:"Inicializar/melhorar AGENTS.md",skills:"Listar habilidades carregados",exit:"Sair do aplicativo",debug:"Diálogo de depuração (chat)",settings:"Config. de provedor personalizado"},commandPalette:{connect:"Conectar um provedor",models:"Selecionar modelo"},commands:{debugLabel:"Debug",debugDetail:"Logs de observabilidade SDK (/debug)"},toast:{approvalsUsage:"Use /approvals (sem on/off).",customProviderOnly:"Configurações apenas para provedores personalizados.",redoChatOnly:"Refazer está disponível apenas na visualização de chat.",retryChatOnly:"Tentar novamente está disponível apenas na visualização de chat.",pinsChatOnly:"Fixações estão disponíveis apenas na visualização de chat.",renameChatOnly:"Renomear está disponível apenas no chat (/rename <title>).",commandRemoved:"Este comando não está mais disponível: {command}",helpAliasRemoved:"Pressione F1 para ajuda.",deleteConfirm:"Pressione Delete novamente para confirmar.",themeToggled:"Tema: {mode}",pasteImagePending:"Imagem ainda está sendo processada. Aguarde."}},chatPage:{placeholder:"Pergunte qualquer coisa... (nova linha: Shift+Enter ou Ctrl+J)",placeholderAwaitingApproval:"Bloqueado por aprovação: selecione Aprovar / Negar para continuar.",reviewPrompt:"ajude-me a revisar as mudanças no código",notification:{approvalTitle:"[Aprovação Necessária] Permissão de Ferramenta",approvalMessage:"DimCode está aguardando aprovação de ferramenta: {tool}.",doneTitle:"[Tarefa Concluída]",doneMessage:"DimCode concluiu esta tarefa.",doneMessageWithDuration:"DimCode concluiu esta tarefa em {duration}.",doneMessageWithTools:"DimCode concluiu esta tarefa após {tools} chamada(s) de ferramenta.",doneMessageWithToolsAndDuration:"DimCode concluiu esta tarefa em {duration} com {tools} chamada(s) de ferramenta."},headerStats:"{messages} msgs · total {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"Consolidando,Pensando,Raciocinando,Planejando,Analisando,Sintetizando,Refinando,Compondo",modelFallback:"modelo",mode:{plan:"plano",agent:"agente",debug:"debug"},status:{approvalsAuto:"AUTO",approvalsAll:"TODOS",blockedByApproval:"Bloqueado por aprovação",awaitingApprovalAction:"Aguardando sua aprovação: escolha Aprovar / Negar para continuar."},footer:{dragSelect:"arrastar para selecionar",openLink:"Ctrl+Clique para abrir arquivos ou links",esc:"esc",interrupt:"interromper",approvalPaused:"⏸ Pausado",approvalPausedHint:"Aguardando aprovação (Enter para escolher).",shortcuts:"Ctrl+K: config Ctrl+O: expandir/recolher ferramentas e thinking Cmd+Delete/Ctrl+W: limpar entrada Tab: trocar modo {commandsKey}: comandos",shortcutsCompact:"Ctrl+K: config Ctrl+O: ferramentas/thinking Cmd+Delete/Ctrl+W: limpar Tab: trocar modo {commandsKey}: comandos",shortcutsMicro:"Ctrl+O: ferramentas {commandsKey}: comandos",shortcutsMini:"{commandsKey}: comandos"},session:{new:"novo"},timeline:{title:"Linha do tempo",empty:"(vazio)",filterAll:"Todas as mensagens",filterUser:"Mensagens do usuário",filterTool:"Chamadas de ferramenta"},pins:{title:"Fixados",empty:"(vazio)"},jumpToBottom:{button:"↓"},prompts:{help:"Ajuda e atalhos (F1)",newSession:"Iniciar nova sessão",resume:"Retomar fila pausada",sessions:"Listar/escolher sessões",timeline:"Ir para mensagem do usuário",pins:"Abrir mensagens fixadas",pin:"Fixar última mensagem",back:"Voltar ao salto anterior",connect:"Ligar um provedor",models:"Selecionar modelo",theme:"Trocar tema da UI",approvals:"Configurar aprovações (auto/normal/strict)",commands:"Abrir paleta de comandos",toolSettings:"Configurar ferramentas",mcpSettings:"Abrir MCP",plugins:"Gerenciar plugins",language:"Trocar idioma da UI",status:"Alternar detalhes do status",review:"Revisar mudanças no código",retry:"Tentar novamente a última mensagem",compact:"Compactar contexto da sessão",init:"Inicializar/melhorar AGENTS.md",rename:"Renomear sessão atual",skills:"Listar habilidades carregados",exit:"Sair do aplicativo",debug:"Diálogo de depuração",settings:"Config. de provedor personalizado"},commands:{pinsLabel:"Fixados",pinsDetail:"Abrir mensagens fixadas",backLabel:"Voltar",backDetail:"Retornar ao salto anterior",debugLabel:"Debug",debugDetail:"Logs de observabilidade SDK (/debug)",statusLabel:"Status",statusDetail:"Alternar detalhes do status",themeLabel:"Tema",themeDetail:"Trocar tema de cores"},tips:{contextWarn:"Dica: O contexto está ficando cheio. Considere /compact ou /new para manter respostas precisas.",contextCritical:"Dica: Você está perto do limite de contexto. Comece uma nova sessão com /new (ou /compact primeiro).",timeline:"Dica: Chat longo? Use /tl para voltar a uma mensagem específica.",timelineAlias:"Dica: /tl é um atalho para /timeline.",commandsAlias:"Dica: {key} abre a paleta de comandos.",errorRecovery:"Dica: Se algo falhou, tente /compact ou /new.",greeting:"Bem-vindo de volta! Tente {commandsKey} ou {init} para começar.",compactDelight:"Legal! Manter o contexto enxuto ajuda.",addTests:'Tudo pronto! Quer que eu adicione testes? Responda "sim" ou "ok".'},confirm:{addTests:"Adicione testes para as mudanças que acabamos de fazer."},toast:{customProviderOnly:"Configurações apenas para provedores personalizados.",renameNodeOnly:"Renomear está disponível apenas no modo Node/CLI.",noActiveSession:"Nenhuma sessão ativa para renomear.",sessionNameEmpty:"O nome da sessão não pode ficar vazio.",sessionRenamed:"Sessão renomeada para: {title}",renameFailed:"Falha ao renomear sessão.",linkOpenHint:"Dica: Ctrl+Clique para abrir arquivos ou links.",copySuccess:"Copiado",copyFailed:"Falha ao copiar",forkFailed:"Falha ao bifurcar sessão.",backEmpty:"Nenhum salto anterior para retornar.",pinsEmpty:"Nenhuma mensagem fixada ainda.",pinEmpty:"Nenhuma mensagem para fixar ainda.",pinned:"Mensagem fixada.",unpinned:"Mensagem desafixada.",debugUnavailable:"Servidor de debug indisponível.",approvalsUsage:"Use /approvals (sem on/off).",debugDialogOpened:"Diálogo de depuração aberto.",debugDialogClosed:"Diálogo de depuração fechado.",renameUsage:"Uso: /rename <title>",themeToggled:"Tema: {mode}",statusCompactOn:"Status: compacto",statusCompactOff:"Status: detalhado",compactingSession:"Compactando sessão...",compactSuccess:"Sessão compactada: {message}",compactWarning:"Sessão compactada com ganho limitado: {message}",compactSuccessDetailWithTokens:"{count} mensagens históricas foram compactadas em um resumo. Input estimado {before} -> {after} tokens, economizando cerca de {saved} tokens.",compactSuccessDetailNotReduced:"{count} mensagens históricas foram compactadas em um resumo, mas o input estimado mudou de {before} para {after} tokens, sem redução no tamanho da requisição.",compactSuccessDetailCountOnly:"{count} mensagens históricas foram compactadas em um resumo.",compactSuccessDetailSummaryOnly:"Novo resumo da conversa gerado.",compactFailed:"Falha ao compactar sessão: {error}",compactFailedTokenLimit:"Compactação falhou por orçamento de contexto insuficiente. Defina DIMCODE_CONTEXT_WINDOW corretamente, mude para um modelo de contexto maior, ou use /new. Detalhe: {error}",retryEmpty:"Nenhuma mensagem anterior para tentar novamente.",commandRemoved:"Este comando não está mais disponível: {command}",helpAliasRemoved:"Pressione F1 para ajuda.",waitForResponse:"Aguarde a resposta atual terminar, ou pressione Esc para interromper.",pasteImagePending:"Imagem ainda está sendo processada. Aguarde.",pendingApproval:"Trate tool_approve primeiro.",awaitingApprovalAction:"Pausado: ação necessária. Escolha Aprovar / Sempre aprovar / Negar no cartão de permissão.",awaitingApprovalStillWaiting:"Ainda aguardando aprovação ({seconds}s). O modelo não continuará até você aprovar ou negar.",pendingAskUser:"Trate ask_user primeiro.",notificationSessionBusy:"Esta notificação pertence a outra sessão ocupada. Finalize aquele trabalho ou troque de sessão manualmente.",notificationSessionUnavailable:"Não é possível abrir a sessão desta notificação aqui.",notificationSessionSwitchFailed:"Falha ao abrir a sessão desta notificação.",approvalNotActive:"Esta aprovação está na fila. Resolva a ativa primeiro.",askUserNotActive:"Esta requisição ask_user não está mais ativa."}},chatQueue:{label:"Fila ({count})",labelCompact:"Fila {count}",more:"+{count} mais…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"continuar fila",state:{idle:"Pendente",running:"Executando",paused:"Pausado",error:"Erro"},item:{steerAction:"Direcionar",steerReady:"Primeiro",steerPending:"Próximo",steerPaused:"Pausado"},toast:{enqueued:"Adicionado à fila (#{count}).",full:"Fila cheia (máx 5). Exclua um ou comece /new.",cleared:"{count} item(ns) da fila removido(s).",deleted:"{count} item(ns) da fila excluído(s). Ctrl+Z para desfazer.",steerPromoted:"Elevado para steer. Será executado primeiro quando a fila retomar.",steerQueued:"Steer não pôde ser injetado imediatamente. Foi promovido e executará primeiro na próxima rodada.",steerSent:"Steer aceito. Será injetado antes da próxima chamada do modelo nesta rodada.",undo:"Exclusão da fila desfeita.",pausedTip:"Fila pausada. Use {resume} ou {resumeText} para continuar, ou envie uma nova mensagem para escolher o que fazer.",stale:"Fila pausada: requisição parece travada."},confirm:{title:"Continuar mensagens na fila?",description:"Requisição anterior não finalizou. {count} mensagem(ns) aguardando na fila.",hint:"Continue enviando o próximo item, ou pause a fila.",continue:"Continuar",pause:"Pausar",reason:"Motivo: {reason}"},reason:{network_error:"Erro de rede.",timeout:"Requisição expirou.",canceled_by_user:"Cancelado pelo usuário.",rate_limited:"Limite de taxa atingido.",config_unavailable:"Configuração salva indisponível.",unknown:"Requisição falhou."},draftDecision:{title:"Fila pausada",description:"{count} mensagem(ns) na fila ainda aguardando. Decida o que fazer com sua nova entrada.",previewLabel:"Nova entrada:",continue:"Continuar fila",append:"Adicionar à fila",replace:"Descartar fila e enviar"}},chatStatus:{done:"Concluído.",error:"Erro.",interrupted:"Interrompido.",permissionDenied:"Permissão negada.",planning:"Planejando…",drafting:"Rascunhando…",retrying:"Tentando novamente ({retry}/{maxAttempts})…",runningTool:"Executando {tool}…",runningTools:"Executando {count} ferramentas…",approvalPendingOther:"Outra aprovação pendente ({permission})…",awaitingApproval:"Aguardando aprovação…",awaitingApprovalWithPerm:"Aguardando aprovação ({permission})…",awaitingApprovalWithRisk:"Aguardando aprovação ({risk})…",awaitingAnswers:"Aguardando respostas…",resumingApproved:"Aprovado. Retomando…",resumingDenied:"Negado. Retomando…",resuming:"Retomando…",autoApprovingWithRisk:"Aprovação automática ({risk})…",riskFallback:"risco",toolFallback:"ferramenta",thinking:"Pensando…",autoCompactionRequired:"Contexto próximo do limite. Compactação necessária primeiro.",autoCompactionRequiredDetailed:"Contexto próximo do limite · próxima requisição estimada em {estimated} tokens, compactação automática inicia em {threshold} tokens, compactação necessária primeiro.",compressed:"Contexto compactado · {removed} mensagens antigas foram compactadas em um resumo, economizando cerca de {saved} tokens de input ({elapsed}ms)",autoCompactedDetailed:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo, input estimado {before} -> {after} tokens, economizando cerca de {saved} tokens",autoCompactedNotReduced:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo, mas o input estimado mudou de {before} para {after} tokens, sem redução no tamanho da requisição",autoCompactedSaved:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo, economizando cerca de {saved} tokens",autoCompactedCountOnly:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo",interruptedMarkdown:"> **Interrompido** · Resposta cancelada pelo usuário (`Esc`).",awaitingApprovalPrefix:"Aguardando aprovação",awaitingAnswersPrefix:"Aguardando respostas",approvalPendingPrefix:"Outra aprovação pendente",autoApprovingPrefix:"Aprovação automática"},chatParts:{thinking:"Pensando",plan:"Plano",todo:"Todo"},chatRender:{userLabel:"usuário",outputLabel:"↳ saída",outputLabelShort:"saída:",canceled:"cancelado",inputLabel:"entrada:",collapse:"... (recolher)",moreLines:"... ({count} mais linhas)",moreLinesOmitted:"... ({count} linhas omitidas; defina {envVar} para aumentar)",streamingTail:"… (streaming: mostrando últimos {shown} chars; {omitted} omitidos)",copy:"Copiar",userResponses:"Respostas do usuário:",approvalQueued:"Aguardando aprovação anterior...",proposedPlan:{title:"Plano Proposto"},llmMeta:{changedFiles:"{count} ficheiro(s) alterado(s): {files}",changedFilesMore:"+{count} mais",revertHint:"Dica: Clique nesta mensagem -> Reverter mensagens para desfazer esta rodada.",changedFilesCardTitle:"{count} ficheiros alterados:",revertButton:"Reverter"},toolName:{explore:"Explorar",subagent:"Subagente"},toolSuffix:{offset:"offset {value}",limit:"limite {value}",matches:"{count} correspondências",todos:"{count} todos",results:"{count} resultados",results_one:"{count} resultado"},toolGroup:{readFiles:"Ler {count} ficheiros",writeFiles:"Escrever {count} ficheiros",editFiles:"Editar {count} ficheiros",globPatterns:"Glob {count} padrões",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} padrões",bashCommands:"Executar {count} comandos",searchQueries:"Buscar {count} consultas",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"Busca pode acessar a rede.",bash:"Bash pode executar comandos.",edit:"Alterações de ficheiro podem modificar ficheiros locais.",grep:"Grep pode ler arquivos locais."},inlineHint:"Teclas: ↑↓←→ para mover, Enter para selecionar.",awaitingUserAction:"Aguardando sua ação: escolha Aprovar / Sempre aprovar / Negar.",decision:{userDenied:"Usuário negou a aprovação"},denied:{title:"# Permissão de ferramenta negada",toolLine:"- ferramenta: `{tool}`",permissionLine:"- permissão: `{permission}`",hint:"Você pode selecionar novamente o tool_call e tentar novamente."},summary:{title:"# Ferramenta aprovada e executada",permissionLine:"Permissão `{permission}` aprovada para `{tool}`."},required:"Aprovação necessária ({risk}).",args:{commandWithDescription:"Comando: {command} - {description}",command:"Comando: {command}",description:"Descrição: {description}",raw:"Args: {args}"}},pathPicker:{titleWorkspace:"Selecionar Workspace",titleFile:"Selecionar Ficheiro",placeholderWorkspace:"Digite um caminho (../ etc). Tab para autocompletar. Enter seleciona directório.",placeholderFile:"Digite um caminho (../ etc). Tab para autocompletar. Enter seleciona ficheiro."},providerDialogs:{customLabel:"Personalizado",customDetail:"personalizado",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Entrar com DimCode OAuth",addCustomLabel:"Adicionar provedor personalizado",addCustomDetail:"adicionar provedor personalizado",providerFallback:"Provedor",adapter:{openai:"OpenAI",openaiOpenRouter:"Compatível com OpenAI (OpenRouter)",openaiLocal:"Compatível com OpenAI (Local)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Configurado",notConfigured:"Não configurado"},manage:{title:"Provedor personalizado: {provider}",connect:"Conectar",connectDetail:"Editar API Key / Base URL",rename:"Renomear",renameDetail:"Editar nome do provedor",models:"Editar modelos",modelsDetail:"Atualizar IDs de modelos disponíveis",delete:"Excluir",deleteDetail:"Remover este provedor"},deleteConfirm:{title:"Excluir {provider}?",confirm:"Excluir (confirmar)",confirmDetail:"Isso não pode ser desfeito",cancelDetail:"Manter provedor"},nameDialog:{title:"Nomear provedor personalizado",label:"Nome do provedor",placeholder:"ex: DeepSeek (Proxy)"},modelsDialog:{title:"Modelos do provedor personalizado",modelsTitle:"Modelos",modelsPlaceholder:"IDs dos modelos (, ou nova linha)",hint:", / nova linha • Shift+Enter nova linha • Enter Aplicar",fetch:"Buscar modelos",fetching:"Buscando modelos…"},modelsFetchDialog:{title:"Selecionar modelos",searchPlaceholder:"Filtrar modelos",hint:"Space alternar • Enter confirmar • Esc cancelar"},toast:{modelSet:"Modelo definido para {provider} / {model}.",noModels:"Nenhum modelo disponível ainda. Conecte um provedor primeiro (/connect).",connectFirst:"Ligue um provedor primeiro (/connect) antes de enviar a sua primeira mensagem.",apiKeyRequired:"API Key é obrigatória.",baseUrlRequired:"Base URL é obrigatória.",baseUrlInvalid:"Base URL deve começar com http:// ou https://",connected:"Conectado a {provider}.",connectedSelectModel:"Conectado a {provider}. Escolha um modelo.",connectedCheckFailed:"Conectado a {provider}, mas verificação falhou: {reason}",connectionTestPassed:"Teste de conexão aprovado: {provider}.",connectionTestFailed:"Teste de conexão falhou: {provider} - {reason}",connectionActionUpdateKey:"Ação: reabra Conectar e atualize a API key, depois teste novamente.",connectionActionFixBaseUrl:"Ação: verifique o caminho do Base URL (geralmente termina com /v1), depois teste novamente.",connectionActionSwitchKey:"Ação: aguarde um momento ou mude para outra chave/provedor.",connectionActionRetryTest:"Ação: verifique rede/proxy e execute Testar conexão novamente.",noModelsFetching:"Sem modelos ainda. Buscando lista de modelos…",firstUseGuide:'Início rápido: 1) /connect 2) /models 3) envie "hello"',firstUseSendHello:'Próximo passo: envie sua primeira mensagem (ex: "hello").',connectionCheckUnauthorized:"401 Não autorizado: verifique a API key e o tipo de provedor.",connectionCheckForbidden:"403 Proibido: sua chave pode não ter acesso a este provedor/modelo.",connectionCheckNotFound:"404 Não encontrado: verifique o caminho do Base URL (compatível com OpenAI geralmente termina com /v1).",connectionCheckRateLimited:"429 Limite de taxa: aguarde e tente novamente, ou mude para outra chave/provedor.",connectionCheckTimeout:"Conexão expirou: verifique rede/proxy e tente novamente.",connectionCheckNetwork:"Conexão de rede falhou: verifique DNS/proxy/Base URL.",connectionCheckFailed:"Verificação de conexão falhou: {error}",apiKeyCleared:"API key limpa para {provider}.",customAdded:"Provedor personalizado adicionado: {provider}.",customRenamed:"Provedor personalizado renomeado: {provider}.",customModelsUpdated:"Modelos do provedor personalizado atualizados: {provider}.",customDeleted:"Provedor personalizado excluído: {provider}.",modelsRequired:"Adicione pelo menos um modelo.",modelsEmpty:"Nenhum modelo encontrado.",modelsFetchFailed:"Falha ao buscar modelos: {error}",modelsFetchChatCompletions:"Lista de modelos não suportada para base URL /chat/completions ou /responses.",manualModelsRequired:"Este endpoint não suporta descoberta automática de modelos. Insira os nomes manualmente na configuração.",nameRequired:"Nome do provedor é obrigatório.",nameConflict:"Nome do provedor já existe."}},copyToast:{copiedToClipboard:"Copiado para a área de transferência"}};var zh_CN_default2={common:{apply:"应用",cancel:"取消",close:"关闭",confirm:"确认",yes:"是",no:"否",exit:"退出",back:"返回",next:"下一步",save:"保存",empty:"—",unknownError:"未知错误",inputClearTip:"Ctrl+C 清空",total:"总计"},configDialog:{title:"设置",hint:"Tab/Shift+Tab 切换字段 • Enter 应用 • Esc 取消",modelsTitle:"模型(自定义)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"上下文窗口",contextWindowLocked:"上下文窗口(模型定义)",contextWindowPlaceholder:"128000",temperatureTitle:"温度",temperaturePlaceholder:"0.7",temperatureValidationError:"温度:只能输入数字和”.”",maxTokensTitle:"最大输出 Token 数",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL(OpenAI 兼容)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"当前:",apiKeyNotSet:"(未设置)",apiKeyTitle:"API 密钥",apiKeyPlaceholder:"粘贴新 Key 以更新(留空保持不变)",interleavedThinkingTitle:"交错思考(空格切换)",interleavedThinkingLocked:"交错思考(模型定义)",interleavedThinkingOpen:"开启",interleavedThinkingClose:"关闭",tipIntensityTitle:"提示强度",tipIntensityOff:"关闭",tipIntensityLow:"低",tipIntensityStandard:"标准",shortcutsTitle:"快捷键",shortcutCommandsLabel:"命令面板",shortcutTimelineLabel:"时间线",shortcutNewSessionLabel:"新会话",shortcutsPlaceholder:"如 mod+p",shortcutsHint:"使用 mod/ctrl/alt/shift + 键(a-z, 0-9, F1-F12)。"},languageDialog:{title:"语言",hint:"Enter 应用 • Esc 取消",languageTitle:"语言",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"思考强度",hint:"Enter 确认 • Esc 取消",effortTitle:"推理强度",applied:"推理强度已设置为 {effort}",option:{low:"低",medium:"中",high:"高",xhigh:"超高",max:"最大",minimal:"极简",none:"无",off:"关闭",auto:"自动"}},toolSettingsDialog:{title:"工具设置",hint:"Enter 应用 • Esc 取消",websearchTitle:"WebSearch API 密钥",apiKeyCurrentPrefix:"当前:",apiKeyNotSet:"(未设置)",apiKeyInvalidCjk:"API Key 不能包含中文字符。",apiKeyInvalidSpaces:"API Key 不能包含空格。",apiKeyPlaceholder:"粘贴 Serper API Key"},pluginsDialog:{title:"插件",hint:"选择一个插件进行配置 • Esc 关闭",serperSearch:"Serper Search",serperSearchDetail:"通过 Serper API 进行网络搜索",configured:"已配置",notConfigured:"未配置",serperConfigTitle:"Serper Search 设置",serperConfigHint:"Tab 切换 • Enter 应用 • Esc 取消"},skillsDialog:{title:"技能",hint:"Enter 应用 • Esc 取消",empty:"暂无可用技能",emptyFiltered:"无匹配技能"},timelineDialog:{title:"时间线",hint:"Tab 筛选 • Enter 打开 • Esc 关闭",empty:"暂无消息",emptyFiltered:"无匹配条目",filterAll:"全部消息",filterUser:"用户消息",filterTool:"工具调用"},mcpSettingsDialog:{title:"MCP",hint:"编辑 mcp.json 文件以配置 MCP 服务器 • Esc 关闭",configFileLabel:"配置文件:",noServersHint:"尚未配置 MCP 服务器。",serverCount:"已配置 {count} 个服务器",guideText:"编辑上方文件以添加或修改 MCP 服务器。",openFile:"打开文件",reload:"重新加载",close:"关闭",reloaded:"MCP 配置已重新加载。",reloadFailed:"重新加载失败:{error}",status:"状态",toolCount:"工具数",disabled:"禁用",testConnection:"测试",testing:"正在测试连接...",testComplete:"测试完成。",testPartial:"测试完成(有错误)。",testFailed:"连接失败:{error}",invalidJson:"JSON 无效:{error}",invalidShape:'MCP JSON 无效:需要 "mcpServers"。',invalidServer:"MCP 服务器配置无效:{name}",noServers:"没有找到 MCP 服务器。",lintOk:"JSON 语法正确",lintAt:"{error}(第 {line} 行,第 {column} 列)",lintUnclosed:"未闭合的 {char}(第 {line} 行,第 {column} 列)",lintInvalid:"{error}",exampleFormat:"示例格式:"},toolApprovalsDialog:{title:"工具审批",useAuto:"自动",useNormal:"普通",useStrict:"严格",close:"关闭",focusedTitleAuto:"自动",focusedTitleNormal:"普通",focusedTitleStrict:"严格",focusedTitleClose:"关闭",focusedDescAuto:"所有工具自动执行,不再提示(最快,最不安全)。",focusedDescNormal:"读取类自动通过,写入类需确认。",focusedDescStrict:"所有工具均须确认(最安全,最慢)。",focusedDescClose:"关闭此对话框,不更改当前设置。",currentPrefix:"当前:{mode}",tip:"提示:Tab 或 ↑/↓ 在按钮间移动,Enter 确认,Esc 关闭。"},settingsDialog:{pendingApproval:"请先处理待审批请求再更改设置。",invalidShortcut:"快捷键无效:{label}({value})",shortcutCommands:"命令面板快捷键",shortcutTimeline:"时间线快捷键",shortcutNewSession:"新会话快捷键",toolApprovalsApplied:"工具审批:{mode}",applied:"设置已应用。"},exitAppDialog:{title:"退出 DimCode",confirm:"现在退出?",warning:"仍有响应在进行中,退出将中断它。",reasonPrefix:"原因:{reason}"},approvalDialog:{title:"工具权限审批",toolLabel:"工具:{tool}{suffix}",toolLabelSuffix:"({description})",permissionLabel:"权限:{permission}({risk})",descriptionLabel:"说明:{description}",commandLabel:"命令:",inlineActionHint:"↑/← 上一个 ↓/→ 下一个 Enter 确认 1/2/3 选择",inlineActionHintCompact:"←/→ 移动 Enter 确认 1/2/3 选择",buttons:{approve:"允许",alwaysApprove:"总是允许",deny:"拒绝",always:"总是",ok:"确定",no:"否",y:"Y",all:"全",n:"N"}},askUserDialog:{noQuestionsTitle:"没有问题",noQuestionsBody:"没有需要回答的问题。",title:"问题 {index}/{total}:{header}",defaultHeader:"问题",prev:"上一题",next:"下一题",submit:"提交",otherOption:"其他",otherDetail:"填写自定义答案",inlineHintOptions:"按 ↑↓ 移动,按 ←→ 切题,按 Enter 选择。",inlineHintMulti:"多选:按 Space 勾选或取消勾选。",inlineHintButtons:"按 Tab 切到按钮,按 ←→ 切换,按 Enter 触发,按 ↑ 回到选项。",inlineHintNav:"Ctrl+Left / Ctrl+Right(或 Ctrl+A / Ctrl+E)切换问题。",inlineHintSubmit:"Ctrl+Enter 提交,Esc 取消。",inlineButtonPrev:"[上一题]",inlineButtonNext:"[下一题]",inlineButtonSubmit:"[提交]",inlineButtonCancel:"[取消]",inlineActionHint:"Space 选择 ← 上一题 → 下一题 Enter 下一题/提交 Esc 取消",inlineActionHintCompact:"Space 选择 ←/→ 切题 Enter 下一题/提交 Esc 取消",optionsSummaryAll:"共 {count} 个选项",optionsSummaryVisibleMore:"共 {count} 个选项({start}-{end})↓ 更多",multiSelectHint:"[多选] 空格切换,Enter 确认",singleSelectHint:"[单选] 方向键移动,Enter 确认",customAnswerLabel:"自定义答案:",customAnswerPlaceholder:"请输入答案…",otherPlaceholder:"已选“其他”:输入自定义答案,回车填入。"},nextApiOAuthDialog:{title:"DimCode OAuth 登录",copyUrl:"复制链接",login:"登录",logout:"退出登录",statusTitle:"状态",statusAuthenticated:"✓ 已登录:{email}",statusLoading:"⏳ 正在认证…",statusNotLoggedIn:"✗ 未登录",instructionAuthenticated:"使用 ↑↓ 导航,Enter 选择,或按 1-9",instructionLoading:"若浏览器未打开,按 C 复制下方链接",instructionNeedsSetup:"请检查 DimCode OAuth client 的 redirect_uri、scope 和启用状态后重试",instructionWithUrl:"按 C 复制下方 OAuth 链接,或按 Enter 打开浏览器",instructionUnauthed:"按 Enter 使用 DimCode OAuth 登录,或按 Esc 关闭",instructionManualCallback:"复制下方 URL,在浏览器中登录,然后把跳转后的地址粘贴到输入框。",oauthUrlTitleLoading:"OAuth 链接(浏览器未打开时复制)",oauthUrlTitleReady:"OAuth 链接(可直接使用)",scrollIndicator:" [{start}-{end} / 共 {total}]",selectModelTitle:"选择模型(↑↓/1-9,Enter 选择){indicator}",aboutTitle:"关于 DimCode OAuth",setupTitle:"OAuth 登录异常",aboutBulletOne:"• 内置使用 DimCode OAuth client",aboutBulletTwo:"• 登录后会拉取 relay 模型并保存 provider 配置",aboutBulletThree:"• 使用 OAuth refresh token,而不是长期 API Key",viewAllPlans:"查看所有方案 →",useModel:"使用该模型",submitCallbackUrl:"提交回调链接",defaultAccount:"DimCode 账号",callbackUrlLabel:"远程机器?粘贴回调链接(Enter 提交,Esc 关闭)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"按 Enter 提交,Esc 关闭。",toast:{generatingUrl:"正在生成 OAuth 链接…",urlReady:"OAuth 链接已就绪!复制或按 Enter 打开浏览器。",generateUrlFailed:"生成 OAuth 链接失败:{error}",startingLogin:"正在开始 OAuth 登录…",browserOpened:"已打开浏览器,如未打开请从对话框复制链接。",copyUrlToLogin:"请从对话框复制 OAuth 链接登录。",urlCopied:"OAuth 链接已复制到剪贴板。",urlCopyFailed:"复制 OAuth 链接失败。",authSuccess:"已成功通过 DimCode OAuth 认证!",loginFailed:"OAuth 登录失败:{error}",loggedOut:"已退出 DimCode OAuth 登录",loggedOutWithRemoteWarning:"已退出 DimCode OAuth 登录,但服务端撤销失败:{error}",logoutFailed:"退出登录失败:{error}",initFailed:"初始化对话框失败:{error}",modelSwitched:"已切换模型:{model}",selectModelFailed:"选择模型失败:{error}",submittingCallbackUrl:"正在提交回调链接…",callbackUrlNoPending:"没有进行中的 OAuth 会话(请重新打开对话框)",callbackUrlMissingFields:"回调链接缺少 code 或 state 参数"}},debugTryDialog:{titleDebug:"调试",titleDebugging:"正在调试",copy:"复制",proceed:"继续",fixed:"已修复",body:"我已添加调试日志(并可能修复了问题)。请现在尝试复现,然后选择结果。"},exitSessionDialog:{title:"退出会话",confirm:"退出当前会话并返回首页?",note:"下一条消息将开启新会话。"},messageActionsDialog:{title:"消息操作",revert:"撤回消息",revertWithFiles:"撤回消息及文件改动",revertKeepFiles:"撤回消息(保留文件更改)",revertFilesOnly:"只回滚文件改动",copy:"复制消息文本到剪贴板",fork:"分叉创建新会话",pin:"置顶消息",unpin:"取消置顶"},pathPickerDialog:{hint:"↑/↓ 选择 • Tab 补全 • Enter 确认 • Esc 关闭"},providerConnectDialog:{title:"连接 {provider}",providerFallback:"提供方",hint:"Tab 切换 • Ctrl+C 清空 • Enter 应用",hintOpenAI:"Tab 切换 • Ctrl+C 清空 • Enter 应用",hintGemini:"Tab 切换 • Ctrl+C 清空 • Enter 应用",hintAnthropic:"Tab 切换 • Ctrl+C 清空 • Enter 应用",hintGeneric:"Tab 切换 • Ctrl+C 清空 • Enter 应用",applyingHint:"正在测试连接,请稍候...",applyingButton:"应用中...",testConnection:"测试连接",baseUrlStatusAutoFix:"自动修正:{value}",baseUrlStatusInvalid:"Base URL 必须是 http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API 密钥",apiKeyPlaceholder:"粘贴新 Key 以更新(留空保持不变)",apiKeyCurrent:"当前:{value}",apiKeyNotSet:"当前:(未设置)",apiKeyInvalidCjk:"API Key 不能包含中文字符。",apiKeyInvalidSpaces:"API Key 不能包含空格。",clearKey:"清除 Key",useDetectedKey:"使用 {name}",disconnectButton:"断开连接",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"关",toggleOn:"开",toggleHint:"Tab 切换 • ←/→ 调整 • Space 切换"},redoConfirmDialog:{title:"确认重做",body:"确定要恢复已撤回的消息吗?"},renameSessionDialog:{title:"重命名会话",label:"会话名称",placeholder:"例如:规划笔记"},sessionsDialog:{timeNow:"刚刚",timeMinutes:"{count} 分钟",timeHours:"{count} 小时",timeDays:"{count} 天",newSession:"新会话",title:"会话({count})",titleScoped:"会话({count}/{total})",scope:"范围:{cwd}",loading:"加载中…",confirmDelete:"确认删除:再次按 Delete",header:"{count} 个会话 • 方向键导航 • Enter 选择{range}{activity}",headerRange:" • 显示 {start}-{end}",runningCount:"运行中 {count} 个",pausedCount:"等待确认 {count} 个",hint:"输入以跳转 • ←/→ 按钮 • Enter 确认 • Esc 关闭",focusPrefix:"焦点:{focus}",focusList:"列表",focusButtons:"按钮",noSessionsCwd:"当前目录没有会话",noSessions:"暂无已保存会话",nodeOnly:"会话仅在 Node/CLI 模式可用。",newSessionTitle:"新会话",newSessionTarget:"一个新会话",busy:{agentResponding:"助手仍在响应",awaitingAskUser:"等待 AskUser 回复",awaitingToolApproval:"等待工具审批",pendingApproval:"等待审批"},buttons:{open:"打开",delete:"删除",deleteConfirm:"删除(确认)",scope:"范围:{scope}",scopeCwd:"当前目录",scopeAll:"全部",refresh:"刷新"}},sessionsOverlay:{title:"会话",hint:"Enter 选择 • Esc 关闭 • Ctrl+R 刷新",loading:"正在加载会话...",empty:"还没有保存的会话。"},switchSessionDialog:{title:"切换会话",confirm:"切换并中断",target:"切换到 {target}?",fallback:"现在切换会话?",warning:"这将中断当前会话的响应/流程。",reason:"原因:{reason}"},themeDialog:{title:"主题",hint:"Enter 应用 • Esc 取消",mode:"模式",light:"浅色",dark:"深色",unavailable:"当前终端不支持可切换主题。",fallback:"这里会固定使用保底的亮色/暗色 ANSI 主题。",tip:"提示:默认跟随系统主题。"},commandPalette:{searchPlaceholder:"搜索…",noMatches:"无匹配项",hint:"输入筛选 • Enter: 打开 • Esc: 关闭",title:"命令"},skills:{title:"技能"},help:{title:"帮助",modeLabel:"模式:{mode}",modeDetail:"当前助理模式。",shortcutsLabel:"快捷键",onboarding:`欢迎使用!快速上手:
1165
+ Dica: {commandsKey} abre a paleta de comandos.`,items:{help:"Ajuda e atalhos (F1)",commands:"Paleta de comandos (Ctrl+P)",back:"Voltar ao salto anterior",status:"Alternar detalhes do status"}},commands:{help:{label:"Ajuda",detail:"Atalhos + comandos comuns (F1)"},sessions:{label:"Sessões",detail:"Escolher ou criar sessão (/sessions)"},timeline:{label:"Linha do tempo",detail:"Ir para mensagem do usuário (/timeline)"},newSession:{label:"Nova Sessão",detail:"Iniciar nova sessão (/new)"},connectProvider:{label:"Ligar Provedor",detail:"Ligar um provedor (/connect)"},models:{label:"Modelos",detail:"Selecionar modelo (/models)"},toolApprovals:{label:"Aprovações",detail:"Configurar aprovações (/approvals)"},toolSettings:{label:"Config. Ferramentas",detail:"Configurar ferramentas (/tool-settings)"},mcpHub:{label:"MCP",detail:"Gerenciar conectores MCP (/mcp)"},plugins:{label:"Plugins",detail:"Gerenciar plugins (/plugins)"},debug:{label:"Debug",detail:"Logs de observabilidade SDK (/debug)"},mcpSettings:{label:"MCP (JSON Avançado)",detail:"Configurar JSON bruto do MCP (/mcp-settings)"},language:{label:"Idioma",detail:"Trocar idioma da UI (/language)"},settings:{label:"Configurações",detail:"Config. de provedor personalizado (/settings, Ctrl+K)"}},homePage:{multilineTitle:"Texto Multilinha",multilineTitleWithCount:"Texto Multilinha ({count} linhas)",providerCustom:"Personalizado",reviewPrompt:"ajude-me a revisar as mudanças no código",footerCwd:"cwd {cwd}",hints:{switchMode:"trocar modo",commands:"comandos"},tips:{greeting:"Bem-vindo de volta! Tente {commandsKey} ou {init} para começar.",commandsAlias:"Dica: {key} abre a paleta de comandos."},prompts:{help:"Ajuda e atalhos (F1)",sessions:"Listar/escolher sessões",connect:"Ligar um provedor",models:"Selecionar modelo",newSession:"Iniciar nova sessão",approvals:"Configurar aprovações (auto/normal/strict)",commands:"Abrir paleta de comandos",toolSettings:"Configurar ferramentas",mcpSettings:"Abrir MCP",plugins:"Gerenciar plugins",language:"Trocar idioma da UI",theme:"Selecionar tema",status:"Alternar detalhes do status",review:"Revisar mudanças no código",init:"Inicializar/melhorar AGENTS.md",skills:"Listar habilidades carregados",exit:"Sair do aplicativo",debug:"Diálogo de depuração (chat)",settings:"Config. de provedor personalizado"},commandPalette:{connect:"Conectar um provedor",models:"Selecionar modelo"},commands:{debugLabel:"Debug",debugDetail:"Logs de observabilidade SDK (/debug)"},toast:{approvalsUsage:"Use /approvals (sem on/off).",customProviderOnly:"Configurações apenas para provedores personalizados.",redoChatOnly:"Refazer está disponível apenas na visualização de chat.",retryChatOnly:"Tentar novamente está disponível apenas na visualização de chat.",pinsChatOnly:"Fixações estão disponíveis apenas na visualização de chat.",renameChatOnly:"Renomear está disponível apenas no chat (/rename <title>).",commandRemoved:"Este comando não está mais disponível: {command}",helpAliasRemoved:"Pressione F1 para ajuda.",deleteConfirm:"Pressione Delete novamente para confirmar.",themeToggled:"Tema: {mode}",pasteImagePending:"Imagem ainda está sendo processada. Aguarde."}},chatPage:{placeholder:"Pergunte qualquer coisa... (nova linha: Shift+Enter ou Ctrl+J)",placeholderAwaitingApproval:"Bloqueado por aprovação: selecione Aprovar / Negar para continuar.",reviewPrompt:"ajude-me a revisar as mudanças no código",notification:{approvalTitle:"[Aprovação Necessária] Permissão de Ferramenta",approvalMessage:"DimCode está aguardando aprovação de ferramenta: {tool}.",doneTitle:"[Tarefa Concluída]",doneMessage:"DimCode concluiu esta tarefa.",doneMessageWithDuration:"DimCode concluiu esta tarefa em {duration}.",doneMessageWithTools:"DimCode concluiu esta tarefa após {tools} chamada(s) de ferramenta.",doneMessageWithToolsAndDuration:"DimCode concluiu esta tarefa em {duration} com {tools} chamada(s) de ferramenta."},headerStats:"{messages} msgs · total {tokens}",contextChip:"≈{pct}% / {tokens} tok",contextChipCompact:"{pct}%",thinkingWords:"Consolidando,Pensando,Raciocinando,Planejando,Analisando,Sintetizando,Refinando,Compondo",modelFallback:"modelo",mode:{plan:"plano",agent:"agente",debug:"debug"},status:{approvalsAuto:"AUTO",approvalsAll:"TODOS",blockedByApproval:"Bloqueado por aprovação",awaitingApprovalAction:"Aguardando sua aprovação: escolha Aprovar / Negar para continuar."},footer:{dragSelect:"arrastar para selecionar",openLink:"Ctrl+Clique para abrir arquivos ou links",esc:"esc",interrupt:"interromper",approvalPaused:"⏸ Pausado",approvalPausedHint:"Aguardando aprovação (Enter para escolher).",shortcuts:"Ctrl+K: config Ctrl+O: expandir/recolher ferramentas e thinking Cmd+Delete/Ctrl+W: limpar entrada Tab: trocar modo {commandsKey}: comandos",shortcutsCompact:"Ctrl+K: config Ctrl+O: ferramentas/thinking Cmd+Delete/Ctrl+W: limpar Tab: trocar modo {commandsKey}: comandos",shortcutsMicro:"Ctrl+O: ferramentas {commandsKey}: comandos",shortcutsMini:"{commandsKey}: comandos"},session:{new:"novo"},timeline:{title:"Linha do tempo",empty:"(vazio)",filterAll:"Todas as mensagens",filterUser:"Mensagens do usuário",filterTool:"Chamadas de ferramenta"},pins:{title:"Fixados",empty:"(vazio)"},jumpToBottom:{button:"↓"},prompts:{help:"Ajuda e atalhos (F1)",newSession:"Iniciar nova sessão",resume:"Retomar fila pausada",sessions:"Listar/escolher sessões",timeline:"Ir para mensagem do usuário",pins:"Abrir mensagens fixadas",pin:"Fixar última mensagem",back:"Voltar ao salto anterior",connect:"Ligar um provedor",models:"Selecionar modelo",theme:"Trocar tema da UI",approvals:"Configurar aprovações (auto/normal/strict)",commands:"Abrir paleta de comandos",toolSettings:"Configurar ferramentas",mcpSettings:"Abrir MCP",plugins:"Gerenciar plugins",language:"Trocar idioma da UI",status:"Alternar detalhes do status",review:"Revisar mudanças no código",retry:"Tentar novamente a última mensagem",compact:"Compactar contexto da sessão",init:"Inicializar/melhorar AGENTS.md",rename:"Renomear sessão atual",skills:"Listar habilidades carregados",exit:"Sair do aplicativo",debug:"Diálogo de depuração",settings:"Config. de provedor personalizado"},commands:{pinsLabel:"Fixados",pinsDetail:"Abrir mensagens fixadas",backLabel:"Voltar",backDetail:"Retornar ao salto anterior",debugLabel:"Debug",debugDetail:"Logs de observabilidade SDK (/debug)",statusLabel:"Status",statusDetail:"Alternar detalhes do status",themeLabel:"Tema",themeDetail:"Trocar tema de cores"},tips:{contextWarn:"Dica: O contexto está ficando cheio. Considere /compact ou /new para manter respostas precisas.",contextCritical:"Dica: Você está perto do limite de contexto. Comece uma nova sessão com /new (ou /compact primeiro).",timeline:"Dica: Chat longo? Use /tl para voltar a uma mensagem específica.",timelineAlias:"Dica: /tl é um atalho para /timeline.",commandsAlias:"Dica: {key} abre a paleta de comandos.",errorRecovery:"Dica: Se algo falhou, tente /compact ou /new.",greeting:"Bem-vindo de volta! Tente {commandsKey} ou {init} para começar.",compactDelight:"Legal! Manter o contexto enxuto ajuda.",addTests:'Tudo pronto! Quer que eu adicione testes? Responda "sim" ou "ok".'},confirm:{addTests:"Adicione testes para as mudanças que acabamos de fazer."},toast:{customProviderOnly:"Configurações apenas para provedores personalizados.",renameNodeOnly:"Renomear está disponível apenas no modo Node/CLI.",noActiveSession:"Nenhuma sessão ativa para renomear.",sessionNameEmpty:"O nome da sessão não pode ficar vazio.",sessionRenamed:"Sessão renomeada para: {title}",renameFailed:"Falha ao renomear sessão.",linkOpenHint:"Dica: Ctrl+Clique para abrir arquivos ou links.",copySuccess:"Copiado",copyFailed:"Falha ao copiar",forkFailed:"Falha ao bifurcar sessão.",backEmpty:"Nenhum salto anterior para retornar.",pinsEmpty:"Nenhuma mensagem fixada ainda.",pinEmpty:"Nenhuma mensagem para fixar ainda.",pinned:"Mensagem fixada.",unpinned:"Mensagem desafixada.",debugUnavailable:"Servidor de debug indisponível.",approvalsUsage:"Use /approvals (sem on/off).",debugDialogOpened:"Diálogo de depuração aberto.",debugDialogClosed:"Diálogo de depuração fechado.",renameUsage:"Uso: /rename <title>",themeToggled:"Tema: {mode}",statusCompactOn:"Status: compacto",statusCompactOff:"Status: detalhado",compactingSession:"Compactando sessão...",compactSuccess:"Sessão compactada: {message}",compactWarning:"Sessão compactada com ganho limitado: {message}",compactSuccessDetailWithTokens:"{count} mensagens históricas foram compactadas em um resumo. Input estimado {before} -> {after} tokens, economizando cerca de {saved} tokens.",compactSuccessDetailNotReduced:"{count} mensagens históricas foram compactadas em um resumo, mas o input estimado mudou de {before} para {after} tokens, sem redução no tamanho da requisição.",compactSuccessDetailCountOnly:"{count} mensagens históricas foram compactadas em um resumo.",compactSuccessDetailSummaryOnly:"Novo resumo da conversa gerado.",compactFailed:"Falha ao compactar sessão: {error}",compactFailedTokenLimit:"Compactação falhou por orçamento de contexto insuficiente. Defina DIMCODE_CONTEXT_WINDOW corretamente, mude para um modelo de contexto maior, ou use /new. Detalhe: {error}",retryEmpty:"Nenhuma mensagem anterior para tentar novamente.",commandRemoved:"Este comando não está mais disponível: {command}",helpAliasRemoved:"Pressione F1 para ajuda.",waitForResponse:"Aguarde a resposta atual terminar, ou pressione Esc para interromper.",pasteImagePending:"Imagem ainda está sendo processada. Aguarde.",pendingApproval:"Trate tool_approve primeiro.",awaitingApprovalAction:"Pausado: ação necessária. Escolha Aprovar / Sempre aprovar / Negar no cartão de permissão.",awaitingApprovalStillWaiting:"Ainda aguardando aprovação ({seconds}s). O modelo não continuará até você aprovar ou negar.",pendingAskUser:"Trate ask_user primeiro.",notificationSessionBusy:"Esta notificação pertence a outra sessão ocupada. Finalize aquele trabalho ou troque de sessão manualmente.",notificationSessionUnavailable:"Não é possível abrir a sessão desta notificação aqui.",notificationSessionSwitchFailed:"Falha ao abrir a sessão desta notificação.",approvalNotActive:"Esta aprovação está na fila. Resolva a ativa primeiro.",askUserNotActive:"Esta requisição ask_user não está mais ativa."}},chatQueue:{label:"Fila ({count})",labelCompact:"Fila {count}",more:"+{count} mais…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"continuar fila",state:{idle:"Pendente",running:"Executando",paused:"Pausado",error:"Erro"},item:{steerAction:"Direcionar",steerReady:"Primeiro",steerPending:"Próximo",steerPaused:"Pausado"},toast:{enqueued:"Adicionado à fila (#{count}).",full:"Fila cheia (máx 5). Exclua um ou comece /new.",cleared:"{count} item(ns) da fila removido(s).",deleted:"{count} item(ns) da fila excluído(s). Ctrl+Z para desfazer.",steerPromoted:"Elevado para steer. Será executado primeiro quando a fila retomar.",steerQueued:"Steer não pôde ser injetado imediatamente. Foi promovido e executará primeiro na próxima rodada.",steerSent:"Steer aceito. Será injetado antes da próxima chamada do modelo nesta rodada.",undo:"Exclusão da fila desfeita.",pausedTip:"Fila pausada. Use {resume} ou {resumeText} para continuar, ou envie uma nova mensagem para escolher o que fazer.",stale:"Fila pausada: requisição parece travada."},confirm:{title:"Continuar mensagens na fila?",description:"Requisição anterior não finalizou. {count} mensagem(ns) aguardando na fila.",hint:"Continue enviando o próximo item, ou pause a fila.",continue:"Continuar",pause:"Pausar",reason:"Motivo: {reason}"},reason:{network_error:"Erro de rede.",timeout:"Requisição expirou.",canceled_by_user:"Cancelado pelo usuário.",rate_limited:"Limite de taxa atingido.",config_unavailable:"Configuração salva indisponível.",unknown:"Requisição falhou."},draftDecision:{title:"Fila pausada",description:"{count} mensagem(ns) na fila ainda aguardando. Decida o que fazer com sua nova entrada.",previewLabel:"Nova entrada:",continue:"Continuar fila",append:"Adicionar à fila",replace:"Descartar fila e enviar"}},chatStatus:{done:"Concluído.",error:"Erro.",interrupted:"Interrompido.",permissionDenied:"Permissão negada.",planning:"Planejando…",drafting:"Rascunhando…",retrying:"Tentando novamente ({retry}/{maxAttempts})…",runningTool:"Executando {tool}…",runningTools:"Executando {count} ferramentas…",approvalPendingOther:"Outra aprovação pendente ({permission})…",awaitingApproval:"Aguardando aprovação…",awaitingApprovalWithPerm:"Aguardando aprovação ({permission})…",awaitingApprovalWithRisk:"Aguardando aprovação ({risk})…",awaitingAnswers:"Aguardando respostas…",resumingApproved:"Aprovado. Retomando…",resumingDenied:"Negado. Retomando…",resuming:"Retomando…",autoApprovingWithRisk:"Aprovação automática ({risk})…",riskFallback:"risco",toolFallback:"ferramenta",thinking:"Pensando…",autoCompactionRequired:"Contexto próximo do limite. Compactação necessária primeiro.",autoCompactionRequiredDetailed:"Contexto próximo do limite · próxima requisição estimada em {estimated} tokens, compactação automática inicia em {threshold} tokens, compactação necessária primeiro.",compressed:"Contexto compactado · {removed} mensagens antigas foram compactadas em um resumo, economizando cerca de {saved} tokens de input ({elapsed}ms)",autoCompactedDetailed:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo, input estimado {before} -> {after} tokens, economizando cerca de {saved} tokens",autoCompactedNotReduced:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo, mas o input estimado mudou de {before} para {after} tokens, sem redução no tamanho da requisição",autoCompactedSaved:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo, economizando cerca de {saved} tokens",autoCompactedCountOnly:"Compactação automática concluída · {removed} mensagens antigas foram compactadas em um resumo",interruptedMarkdown:"> **Interrompido** · Resposta cancelada pelo usuário (`Esc`).",awaitingApprovalPrefix:"Aguardando aprovação",awaitingAnswersPrefix:"Aguardando respostas",approvalPendingPrefix:"Outra aprovação pendente",autoApprovingPrefix:"Aprovação automática"},chatParts:{thinking:"Pensando",plan:"Plano",todo:"Todo"},chatRender:{userLabel:"usuário",outputLabel:"↳ saída",outputLabelShort:"saída:",canceled:"cancelado",inputLabel:"entrada:",collapse:"... (recolher)",moreLines:"... ({count} mais linhas)",moreLinesOmitted:"... ({count} linhas omitidas; defina {envVar} para aumentar)",streamingTail:"… (streaming: mostrando últimos {shown} chars; {omitted} omitidos)",copy:"Copiar",userResponses:"Respostas do usuário:",approvalQueued:"Aguardando aprovação anterior...",proposedPlan:{title:"Plano Proposto"},llmMeta:{changedFiles:"{count} ficheiro(s) alterado(s): {files}",changedFilesMore:"+{count} mais",revertHint:"Dica: Clique nesta mensagem -> Reverter mensagens para desfazer esta rodada.",changedFilesCardTitle:"{count} ficheiros alterados:",revertButton:"Reverter"},toolName:{explore:"Explorar",subagent:"Subagente"},toolSuffix:{offset:"offset {value}",limit:"limite {value}",matches:"{count} correspondências",todos:"{count} todos",results:"{count} resultados",results_one:"{count} resultado"},toolGroup:{readFiles:"Ler {count} ficheiros",writeFiles:"Escrever {count} ficheiros",editFiles:"Editar {count} ficheiros",globPatterns:"Glob {count} padrões",globSingle:"Glob {pattern}",grepPatterns:"Grep {count} padrões",bashCommands:"Executar {count} comandos",searchQueries:"Buscar {count} consultas",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"Busca pode acessar a rede.",bash:"Bash pode executar comandos.",edit:"Alterações de ficheiro podem modificar ficheiros locais.",grep:"Grep pode ler arquivos locais."},inlineHint:"Teclas: ↑↓←→ para mover, Enter para selecionar.",awaitingUserAction:"Aguardando sua ação: escolha Aprovar / Sempre aprovar / Negar.",decision:{userDenied:"Usuário negou a aprovação"},denied:{title:"# Permissão de ferramenta negada",toolLine:"- ferramenta: `{tool}`",permissionLine:"- permissão: `{permission}`",hint:"Você pode selecionar novamente o tool_call e tentar novamente."},summary:{title:"# Ferramenta aprovada e executada",permissionLine:"Permissão `{permission}` aprovada para `{tool}`."},required:"Aprovação necessária ({risk}).",args:{commandWithDescription:"Comando: {command} - {description}",command:"Comando: {command}",description:"Descrição: {description}",raw:"Args: {args}"}},pathPicker:{titleWorkspace:"Selecionar Workspace",titleFile:"Selecionar Ficheiro",placeholderWorkspace:"Digite um caminho (../ etc). Tab para autocompletar. Enter seleciona directório.",placeholderFile:"Digite um caminho (../ etc). Tab para autocompletar. Enter seleciona ficheiro."},providerDialogs:{customLabel:"Personalizado",customDetail:"personalizado",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"Entrar com DimCode OAuth",addCustomLabel:"Adicionar provedor personalizado",addCustomDetail:"adicionar provedor personalizado",providerFallback:"Provedor",adapter:{openai:"OpenAI",openaiOpenRouter:"Compatível com OpenAI (OpenRouter)",openaiLocal:"Compatível com OpenAI (Local)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"Configurado",notConfigured:"Não configurado"},manage:{title:"Provedor personalizado: {provider}",connect:"Conectar",connectDetail:"Editar API Key / Base URL",rename:"Renomear",renameDetail:"Editar nome do provedor",models:"Editar modelos",modelsDetail:"Atualizar IDs de modelos disponíveis",delete:"Excluir",deleteDetail:"Remover este provedor"},deleteConfirm:{title:"Excluir {provider}?",confirm:"Excluir (confirmar)",confirmDetail:"Isso não pode ser desfeito",cancelDetail:"Manter provedor"},nameDialog:{title:"Nomear provedor personalizado",label:"Nome do provedor",placeholder:"ex: DeepSeek (Proxy)"},modelsDialog:{title:"Modelos do provedor personalizado",modelsTitle:"Modelos",modelsPlaceholder:"IDs dos modelos (, ou nova linha)",hint:", / nova linha • Shift+Enter nova linha • Enter Aplicar",fetch:"Buscar modelos",fetching:"Buscando modelos…"},modelsFetchDialog:{title:"Selecionar modelos",searchPlaceholder:"Filtrar modelos",hint:"Space alternar • Enter confirmar • Esc cancelar"},toast:{modelSet:"Modelo definido para {provider} / {model}.",noModels:"Nenhum modelo disponível ainda. Conecte um provedor primeiro (/connect).",connectFirst:"Ligue um provedor primeiro (/connect) antes de enviar a sua primeira mensagem.",apiKeyRequired:"API Key é obrigatória.",baseUrlRequired:"Base URL é obrigatória.",baseUrlInvalid:"Base URL deve começar com http:// ou https://",connected:"Conectado a {provider}.",connectedSelectModel:"Conectado a {provider}. Escolha um modelo.",connectedCheckFailed:"Conectado a {provider}, mas verificação falhou: {reason}",connectionTestPassed:"Teste de conexão aprovado: {provider}.",connectionTestFailed:"Teste de conexão falhou: {provider} - {reason}",connectionActionUpdateKey:"Ação: reabra Conectar e atualize a API key, depois teste novamente.",connectionActionFixBaseUrl:"Ação: verifique o caminho do Base URL (geralmente termina com /v1), depois teste novamente.",connectionActionSwitchKey:"Ação: aguarde um momento ou mude para outra chave/provedor.",connectionActionRetryTest:"Ação: verifique rede/proxy e execute Testar conexão novamente.",noModelsFetching:"Sem modelos ainda. Buscando lista de modelos…",firstUseGuide:'Início rápido: 1) /connect 2) /models 3) envie "hello"',firstUseSendHello:'Próximo passo: envie sua primeira mensagem (ex: "hello").',connectionCheckUnauthorized:"401 Não autorizado: verifique a API key e o tipo de provedor.",connectionCheckForbidden:"403 Proibido: sua chave pode não ter acesso a este provedor/modelo.",connectionCheckNotFound:"404 Não encontrado: verifique o caminho do Base URL (compatível com OpenAI geralmente termina com /v1).",connectionCheckRateLimited:"429 Limite de taxa: aguarde e tente novamente, ou mude para outra chave/provedor.",connectionCheckTimeout:"Conexão expirou: verifique rede/proxy e tente novamente.",connectionCheckNetwork:"Conexão de rede falhou: verifique DNS/proxy/Base URL.",connectionCheckFailed:"Verificação de conexão falhou: {error}",apiKeyCleared:"API key limpa para {provider}.",customAdded:"Provedor personalizado adicionado: {provider}.",customRenamed:"Provedor personalizado renomeado: {provider}.",customModelsUpdated:"Modelos do provedor personalizado atualizados: {provider}.",customDeleted:"Provedor personalizado excluído: {provider}.",modelsRequired:"Adicione pelo menos um modelo.",modelsEmpty:"Nenhum modelo encontrado.",modelsFetchFailed:"Falha ao buscar modelos: {error}",modelsFetchChatCompletions:"Lista de modelos não suportada para base URL /chat/completions ou /responses.",manualModelsRequired:"Este endpoint não suporta descoberta automática de modelos. Insira os nomes manualmente na configuração.",nameRequired:"Nome do provedor é obrigatório.",nameConflict:"Nome do provedor já existe."}},copyToast:{copiedToClipboard:"Copiado para a área de transferência"}};var zh_CN_default2={common:{apply:"应用",cancel:"取消",close:"关闭",confirm:"确认",yes:"是",no:"否",exit:"退出",back:"返回",next:"下一步",save:"保存",empty:"—",unknownError:"未知错误",inputClearTip:"Ctrl+C 清空",total:"总计"},configDialog:{title:"设置",hint:"Tab/Shift+Tab 切换字段 • Enter 应用 • Esc 取消",modelsTitle:"模型(自定义)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"上下文窗口",contextWindowLocked:"上下文窗口(模型定义)",contextWindowPlaceholder:"128000",temperatureTitle:"温度",temperaturePlaceholder:"0.7",temperatureValidationError:"温度:只能输入数字和”.”",maxTokensTitle:"最大输出 Token 数",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL(OpenAI 兼容)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"当前:",apiKeyNotSet:"(未设置)",apiKeyTitle:"API 密钥",apiKeyPlaceholder:"粘贴新 Key 以更新(留空保持不变)",interleavedThinkingTitle:"交错思考(空格切换)",interleavedThinkingLocked:"交错思考(模型定义)",interleavedThinkingOpen:"开启",interleavedThinkingClose:"关闭",tipIntensityTitle:"提示强度",tipIntensityOff:"关闭",tipIntensityLow:"低",tipIntensityStandard:"标准",shortcutsTitle:"快捷键",shortcutCommandsLabel:"命令面板",shortcutTimelineLabel:"时间线",shortcutNewSessionLabel:"新会话",shortcutsPlaceholder:"如 mod+p",shortcutsHint:"使用 mod/ctrl/alt/shift + 键(a-z, 0-9, F1-F12)。"},languageDialog:{title:"语言",hint:"Enter 应用 • Esc 取消",languageTitle:"语言",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"思考强度",hint:"Enter 确认 • Esc 取消",effortTitle:"推理强度",applied:"推理强度已设置为 {effort}",option:{low:"低",medium:"中",high:"高",xhigh:"超高",max:"最大",minimal:"极简",none:"无",off:"关闭",auto:"自动"}},toolSettingsDialog:{title:"工具设置",hint:"Enter 应用 • Esc 取消",websearchTitle:"WebSearch API 密钥",apiKeyCurrentPrefix:"当前:",apiKeyNotSet:"(未设置)",apiKeyInvalidCjk:"API Key 不能包含中文字符。",apiKeyInvalidSpaces:"API Key 不能包含空格。",apiKeyPlaceholder:"粘贴 Serper API Key"},pluginsDialog:{title:"插件",hint:"选择一个插件进行配置 • Esc 关闭",serperSearch:"Serper Search",serperSearchDetail:"通过 Serper API 进行网络搜索",configured:"已配置",notConfigured:"未配置",serperConfigTitle:"Serper Search 设置",serperConfigHint:"Tab 切换 • Enter 应用 • Esc 取消"},skillsDialog:{title:"技能",hint:"Enter 应用 • Esc 取消",empty:"暂无可用技能",emptyFiltered:"无匹配技能"},timelineDialog:{title:"时间线",hint:"Tab 筛选 • Enter 打开 • Esc 关闭",empty:"暂无消息",emptyFiltered:"无匹配条目",filterAll:"全部消息",filterUser:"用户消息",filterTool:"工具调用"},mcpSettingsDialog:{title:"MCP",hint:"编辑 mcp.json 文件以配置 MCP 服务器 • Esc 关闭",configFileLabel:"配置文件:",noServersHint:"尚未配置 MCP 服务器。",serverCount:"已配置 {count} 个服务器",guideText:"编辑上方文件以添加或修改 MCP 服务器。",openFile:"打开文件",reload:"重新加载",close:"关闭",reloaded:"MCP 配置已重新加载。",reloadFailed:"重新加载失败:{error}",status:"状态",toolCount:"工具数",disabled:"禁用",testConnection:"测试",testing:"正在测试连接...",testComplete:"测试完成。",testPartial:"测试完成(有错误)。",testFailed:"连接失败:{error}",invalidJson:"JSON 无效:{error}",invalidShape:'MCP JSON 无效:需要 "mcpServers"。',invalidServer:"MCP 服务器配置无效:{name}",noServers:"没有找到 MCP 服务器。",lintOk:"JSON 语法正确",lintAt:"{error}(第 {line} 行,第 {column} 列)",lintUnclosed:"未闭合的 {char}(第 {line} 行,第 {column} 列)",lintInvalid:"{error}",exampleFormat:"示例格式:"},toolApprovalsDialog:{title:"工具审批",useAuto:"自动",useNormal:"普通",useStrict:"严格",close:"关闭",focusedTitleAuto:"自动",focusedTitleNormal:"普通",focusedTitleStrict:"严格",focusedTitleClose:"关闭",focusedDescAuto:"所有工具自动执行,不再提示(最快,最不安全)。",focusedDescNormal:"读取类自动通过,写入类需确认。",focusedDescStrict:"所有工具均须确认(最安全,最慢)。",focusedDescClose:"关闭此对话框,不更改当前设置。",currentPrefix:"当前:{mode}",tip:"提示:Tab 或 ↑/↓ 在按钮间移动,Enter 确认,Esc 关闭。"},settingsDialog:{pendingApproval:"请先处理待审批请求再更改设置。",invalidShortcut:"快捷键无效:{label}({value})",shortcutCommands:"命令面板快捷键",shortcutTimeline:"时间线快捷键",shortcutNewSession:"新会话快捷键",toolApprovalsApplied:"工具审批:{mode}",applied:"设置已应用。"},exitAppDialog:{title:"退出 DimCode",confirm:"现在退出?",warning:"仍有响应在进行中,退出将中断它。",reasonPrefix:"原因:{reason}"},approvalDialog:{title:"工具权限审批",toolLabel:"工具:{tool}{suffix}",toolLabelSuffix:"({description})",permissionLabel:"权限:{permission}({risk})",descriptionLabel:"说明:{description}",commandLabel:"命令:",inlineActionHint:"↑/← 上一个 ↓/→ 下一个 Enter 确认 1/2/3 选择",inlineActionHintCompact:"←/→ 移动 Enter 确认 1/2/3 选择",buttons:{approve:"允许",alwaysApprove:"总是允许",deny:"拒绝",always:"总是",ok:"确定",no:"否",y:"Y",all:"全",n:"N"}},askUserDialog:{noQuestionsTitle:"没有问题",noQuestionsBody:"没有需要回答的问题。",title:"问题 {index}/{total}:{header}",defaultHeader:"问题",prev:"上一题",next:"下一题",submit:"提交",otherOption:"其他",otherDetail:"填写自定义答案",inlineHintOptions:"按 ↑↓ 移动,按 ←→ 切题,按 Enter 选择。",inlineHintMulti:"多选:按 Space 勾选或取消勾选。",inlineHintButtons:"按 Tab 切到按钮,按 ←→ 切换,按 Enter 触发,按 ↑ 回到选项。",inlineHintNav:"Ctrl+Left / Ctrl+Right(或 Ctrl+A / Ctrl+E)切换问题。",inlineHintSubmit:"Ctrl+Enter 提交,Esc 取消。",inlineButtonPrev:"[上一题]",inlineButtonNext:"[下一题]",inlineButtonSubmit:"[提交]",inlineButtonCancel:"[取消]",inlineActionHint:"Space 选择 ← 上一题 → 下一题 Enter 下一题/提交 Esc 取消",inlineActionHintCompact:"Space 选择 ←/→ 切题 Enter 下一题/提交 Esc 取消",optionsSummaryAll:"共 {count} 个选项",optionsSummaryVisibleMore:"共 {count} 个选项({start}-{end})↓ 更多",multiSelectHint:"[多选] 空格切换,Enter 确认",singleSelectHint:"[单选] 方向键移动,Enter 确认",customAnswerLabel:"自定义答案:",customAnswerPlaceholder:"请输入答案…",otherPlaceholder:"已选“其他”:输入自定义答案,回车填入。"},nextApiOAuthDialog:{title:"DimCode OAuth 登录",copyUrl:"复制链接",login:"登录",logout:"退出登录",statusTitle:"状态",statusAuthenticated:"✓ 已登录:{email}",statusLoading:"⏳ 正在认证…",statusNotLoggedIn:"✗ 未登录",instructionAuthenticated:"使用 ↑↓ 导航,Enter 选择,或按 1-9",instructionLoading:"若浏览器未打开,按 C 复制下方链接",instructionNeedsSetup:"请检查 DimCode OAuth client 的 redirect_uri、scope 和启用状态后重试",instructionWithUrl:"按 C 复制下方 OAuth 链接,或按 Enter 打开浏览器",instructionUnauthed:"按 Enter 使用 DimCode OAuth 登录,或按 Esc 关闭",instructionManualCallback:"复制下方 URL,在浏览器中登录,然后把跳转后的地址粘贴到输入框。",oauthUrlTitleLoading:"OAuth 链接(浏览器未打开时复制)",oauthUrlTitleReady:"OAuth 链接(可直接使用)",scrollIndicator:" [{start}-{end} / 共 {total}]",selectModelTitle:"选择模型(↑↓/1-9,Enter 选择){indicator}",aboutTitle:"关于 DimCode OAuth",setupTitle:"OAuth 登录异常",aboutBulletOne:"• 内置使用 DimCode OAuth client",aboutBulletTwo:"• 登录后会拉取 relay 模型并保存 provider 配置",aboutBulletThree:"• 使用 OAuth refresh token,而不是长期 API Key",viewAllPlans:"查看所有方案 →",useModel:"使用该模型",submitCallbackUrl:"提交回调链接",defaultAccount:"DimCode 账号",callbackUrlLabel:"远程机器?粘贴回调链接(Enter 提交,Esc 关闭)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"按 Enter 提交,Esc 关闭。",toast:{generatingUrl:"正在生成 OAuth 链接…",urlReady:"OAuth 链接已就绪!复制或按 Enter 打开浏览器。",generateUrlFailed:"生成 OAuth 链接失败:{error}",startingLogin:"正在开始 OAuth 登录…",browserOpened:"已打开浏览器,如未打开请从对话框复制链接。",copyUrlToLogin:"请从对话框复制 OAuth 链接登录。",urlCopied:"OAuth 链接已复制到剪贴板。",urlCopyFailed:"复制 OAuth 链接失败。",authSuccess:"已成功通过 DimCode OAuth 认证!",loginFailed:"OAuth 登录失败:{error}",loggedOut:"已退出 DimCode OAuth 登录",loggedOutWithRemoteWarning:"已退出 DimCode OAuth 登录,但服务端撤销失败:{error}",logoutFailed:"退出登录失败:{error}",initFailed:"初始化对话框失败:{error}",modelSwitched:"已切换模型:{model}",selectModelFailed:"选择模型失败:{error}",submittingCallbackUrl:"正在提交回调链接…",callbackUrlNoPending:"没有进行中的 OAuth 会话(请重新打开对话框)",callbackUrlMissingFields:"回调链接缺少 code 或 state 参数"}},debugTryDialog:{titleDebug:"调试",titleDebugging:"正在调试",copy:"复制",proceed:"继续",fixed:"已修复",body:"我已添加调试日志(并可能修复了问题)。请现在尝试复现,然后选择结果。"},exitSessionDialog:{title:"退出会话",confirm:"退出当前会话并返回首页?",note:"下一条消息将开启新会话。"},messageActionsDialog:{title:"消息操作",revert:"撤回消息",revertWithFiles:"撤回消息及文件改动",revertKeepFiles:"撤回消息(保留文件更改)",revertFilesOnly:"只回滚文件改动",copy:"复制消息文本到剪贴板",fork:"分叉创建新会话",pin:"置顶消息",unpin:"取消置顶"},pathPickerDialog:{hint:"↑/↓ 选择 • Tab 补全 • Enter 确认 • Esc 关闭"},providerConnectDialog:{title:"连接 {provider}",providerFallback:"提供方",hint:"Tab 切换 • Ctrl+C 清空 • Enter 应用",hintOpenAI:"Tab 切换 • Ctrl+C 清空 • Enter 应用",hintGemini:"Tab 切换 • Ctrl+C 清空 • Enter 应用",hintAnthropic:"Tab 切换 • Ctrl+C 清空 • Enter 应用",hintGeneric:"Tab 切换 • Ctrl+C 清空 • Enter 应用",applyingHint:"正在测试连接,请稍候...",applyingButton:"应用中...",testConnection:"测试连接",baseUrlStatusAutoFix:"自动修正:{value}",baseUrlStatusInvalid:"Base URL 必须是 http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API 密钥",apiKeyPlaceholder:"粘贴新 Key 以更新(留空保持不变)",apiKeyCurrent:"当前:{value}",apiKeyNotSet:"当前:(未设置)",apiKeyInvalidCjk:"API Key 不能包含中文字符。",apiKeyInvalidSpaces:"API Key 不能包含空格。",clearKey:"清除 Key",useDetectedKey:"使用 {name}",disconnectButton:"断开连接",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"关",toggleOn:"开",toggleHint:"Tab 切换 • ←/→ 调整 • Space 切换"},redoConfirmDialog:{title:"确认重做",body:"确定要恢复已撤回的消息吗?"},renameSessionDialog:{title:"重命名会话",label:"会话名称",placeholder:"例如:规划笔记"},sessionsDialog:{timeNow:"刚刚",timeMinutes:"{count} 分钟",timeHours:"{count} 小时",timeDays:"{count} 天",newSession:"新会话",title:"会话({count})",titleScoped:"会话({count}/{total})",scope:"范围:{cwd}",loading:"加载中…",confirmDelete:"确认删除:再次按 Delete",header:"{count} 个会话 • 方向键导航 • Enter 选择{range}{activity}",headerRange:" • 显示 {start}-{end}",runningCount:"运行中 {count} 个",pausedCount:"等待确认 {count} 个",hint:"输入以跳转 • ←/→ 按钮 • Enter 确认 • Esc 关闭",focusPrefix:"焦点:{focus}",focusList:"列表",focusButtons:"按钮",noSessionsCwd:"当前目录没有会话",noSessions:"暂无已保存会话",nodeOnly:"会话仅在 Node/CLI 模式可用。",newSessionTitle:"新会话",newSessionTarget:"一个新会话",busy:{agentResponding:"助手仍在响应",awaitingAskUser:"等待 AskUser 回复",awaitingToolApproval:"等待工具审批",pendingApproval:"等待审批"},buttons:{open:"打开",delete:"删除",deleteConfirm:"删除(确认)",scope:"范围:{scope}",scopeCwd:"当前目录",scopeAll:"全部",refresh:"刷新"}},sessionsOverlay:{title:"会话",hint:"Enter 选择 • Esc 关闭 • Ctrl+R 刷新 • Ctrl+W 范围",loading:"正在加载会话...",empty:"还没有保存的会话。",loadingMore:"加载更多…",hasMore:"↓ 更多",scope:{cwdOnly:"仅当前目录",allCwd:"所有目录"}},switchSessionDialog:{title:"切换会话",confirm:"切换并中断",target:"切换到 {target}?",fallback:"现在切换会话?",warning:"这将中断当前会话的响应/流程。",reason:"原因:{reason}"},themeDialog:{title:"主题",hint:"Enter 应用 • Esc 取消",mode:"模式",light:"浅色",dark:"深色",unavailable:"当前终端不支持可切换主题。",fallback:"这里会固定使用保底的亮色/暗色 ANSI 主题。",tip:"提示:默认跟随系统主题。"},commandPalette:{searchPlaceholder:"搜索…",noMatches:"无匹配项",hint:"输入筛选 • Enter: 打开 • Esc: 关闭",title:"命令"},skills:{title:"技能"},help:{title:"帮助",modeLabel:"模式:{mode}",modeDetail:"当前助理模式。",shortcutsLabel:"快捷键",onboarding:`欢迎使用!快速上手:
1166
1166
  1) /connect:连接提供方
1167
1167
  2) /models:选择模型
1168
1168
  3) 发送「hello」开始对话
1169
- 提示:{commandsKey} 可打开命令面板。`,items:{help:"帮助与快捷键(F1)",commands:"命令面板(Ctrl+P)",back:"返回上一跳",status:"切换状态详情"}},commands:{help:{label:"帮助",detail:"快捷键与常用命令(F1)"},sessions:{label:"会话",detail:"选择或创建会话"},timeline:{label:"时间线",detail:"跳转到用户消息"},newSession:{label:"新会话",detail:"开始新会话"},connectProvider:{label:"连接提供方",detail:"连接提供方"},models:{label:"模型",detail:"选择模型"},toolApprovals:{label:"工具审批",detail:"配置审批"},toolSettings:{label:"工具设置",detail:"配置工具设置"},mcpHub:{label:"MCP",detail:"管理 MCP 连接器与设置"},plugins:{label:"插件",detail:"管理插件"},debug:{label:"调试",detail:"SDK observability 日志(/debug)"},mcpSettings:{label:"MCP(高级 JSON)",detail:"配置原始 MCP 服务器 JSON"},language:{label:"语言",detail:"切换界面语言(/language)"},settings:{label:"设置",detail:"自定义提供方(Ctrl+K)"}},homePage:{multilineTitle:"多行文本",multilineTitleWithCount:"多行文本({count} 行)",providerCustom:"自定义",reviewPrompt:"帮我审查代码变更",footerCwd:"工作目录 {cwd}",hints:{switchMode:"切换模式",commands:"命令"},tips:{greeting:"欢迎回来!可以试试 {commandsKey} 或 {init}。",commandsAlias:"小贴士:{key} 可打开命令面板。"},prompts:{help:"帮助与快捷键(F1)",sessions:"列出/选择会话",connect:"连接提供方",models:"选择模型",newSession:"开始新会话",approvals:"配置工具审批(auto/normal/strict)",commands:"打开命令面板",toolSettings:"配置工具设置",mcpSettings:"打开 MCP",plugins:"管理插件",language:"切换界面语言",theme:"选择主题",status:"切换状态详情",review:"审查代码变更",init:"初始化/改进 AGENTS.md",skills:"查看已加载的 Skills",exit:"退出应用",debug:"SDK observability 日志",settings:"自定义提供方设置"},commandPalette:{connect:"连接提供方",models:"选择模型"},commands:{debugLabel:"调试",debugDetail:"SDK observability 日志(/debug)"},toast:{approvalsUsage:"使用 /approvals(无需 on/off)。",customProviderOnly:"设置仅适用于自定义提供方。",redoChatOnly:"重做仅在聊天视图可用。",retryChatOnly:"重试仅在聊天视图可用。",pinsChatOnly:"置顶仅在聊天视图可用。",renameChatOnly:"重命名仅在聊天视图可用(/rename <title>)。",commandRemoved:"该指令已移除:{command}",helpAliasRemoved:"查看帮助请按 F1。",deleteConfirm:"再次按 Delete 确认删除。",themeToggled:"主题:{mode}",pasteImagePending:"图片处理中,请稍候再发送。"}},chatPage:{placeholder:"随便问点什么…(换行:Shift+Enter 或 Ctrl+J)",placeholderAwaitingApproval:"审批阻塞中:请选择 允许 / 拒绝 后继续。",reviewPrompt:"帮我审查代码变更",notification:{approvalTitle:"[需要审批] 工具权限",approvalMessage:"DimCode 正在等待工具审批:{tool}。",doneTitle:"[任务完成]",doneMessage:"DimCode 已完成本次任务。",doneMessageWithDuration:"DimCode 已完成本次任务,耗时 {duration}。",doneMessageWithTools:"DimCode 已完成本次任务,共调用 {tools} 次工具。",doneMessageWithToolsAndDuration:"DimCode 已完成本次任务,耗时 {duration},共调用 {tools} 次工具。"},headerStats:"{messages} 条消息 · 总计 {tokens}",contextChip:"≈{pct}% / {tokens} 词元",contextChipCompact:"{pct}%",thinkingWords:"聚合,思考,推理,规划,分析,综合,优化,整理",modelFallback:"模型",mode:{plan:"计划",agent:"助手",debug:"调试"},status:{approvalsAuto:"自动",approvalsAll:"全部",blockedByApproval:"等待审批中",awaitingApprovalAction:"等待你的审批:请选择允许 / 拒绝后继续。"},footer:{dragSelect:"拖拽选择",openLink:"Ctrl+点击打开文件或链接",esc:"esc",interrupt:"中断",approvalPaused:"⏸ 已暂停",approvalPausedHint:"等待审批中(按 Enter 选择)。",shortcuts:"Cmd+Delete/Ctrl+W:清空输入 Tab:切换模式 {commandsKey}:命令",shortcutsCompact:"Cmd+Delete/Ctrl+W:清空 Tab:切换模式 {commandsKey}:命令",shortcutsMicro:"{commandsKey}:命令",shortcutsMini:"{commandsKey}:命令"},session:{new:"新建"},timeline:{title:"时间线",empty:"(空)",filterAll:"全部消息",filterUser:"用户消息",filterTool:"工具调用"},pins:{title:"置顶",empty:"(空)"},jumpToBottom:{button:"↓"},prompts:{help:"帮助与快捷键(F1)",newSession:"开始新会话",resume:"恢复已暂停的队列",sessions:"列出/选择会话",timeline:"跳转到用户消息",pins:"打开置顶消息",pin:"置顶上一条消息",back:"返回上一跳",connect:"连接提供方",models:"选择模型",theme:"切换界面主题",approvals:"配置工具审批(auto/normal/strict)",commands:"打开命令面板",toolSettings:"配置工具设置",mcpSettings:"打开 MCP",plugins:"管理插件",language:"切换界面语言",status:"切换状态详情",review:"审查代码变更",retry:"重试上一条用户消息",compact:"压缩会话上下文",init:"初始化/改进 AGENTS.md",rename:"重命名当前会话",skills:"查看已加载的 Skills",exit:"退出应用",debug:"SDK observability 日志",settings:"自定义提供方设置"},commands:{pinsLabel:"置顶",pinsDetail:"打开置顶消息",backLabel:"返回",backDetail:"回到上一跳",debugLabel:"调试",debugDetail:"SDK observability 日志(/debug)",statusLabel:"状态",statusDetail:"切换状态详情",themeLabel:"主题",themeDetail:"切换颜色主题"},tips:{contextWarn:"小贴士:上下文快满了,可以用 /compact 压缩或 /new 新开会话。",contextCritical:"小贴士:已接近上下文上限,建议 /new 新开会话(或先 /compact)。",timeline:"小贴士:对话变长时,用 /tl 打开时间线快速跳回某条消息。",timelineAlias:"小贴士:/tl 是 /timeline 的快捷别名。",commandsAlias:"小贴士:{key} 可打开命令面板。",errorRecovery:"小贴士:出错时可试试 /compact 或 /new。",greeting:"欢迎回来!可以试试 {commandsKey} 或 {init}。",compactDelight:"不错!保持上下文精简很有帮助。",addTests:"搞定了!要不要我顺手写测试?回复「是/要」。"},confirm:{addTests:"请为刚才的修改补充测试。"},toast:{customProviderOnly:"设置仅适用于自定义提供方。",renameNodeOnly:"重命名仅在 Node/CLI 模式可用。",noActiveSession:"没有可重命名的会话。",sessionNameEmpty:"会话名称不能为空。",sessionRenamed:"会话已重命名为:{title}",renameFailed:"重命名会话失败。",linkOpenHint:"提示:Ctrl+点击可打开文件或链接。",copySuccess:"已复制",copyFailed:"复制失败",forkFailed:"分叉会话失败。",backEmpty:"没有可返回的上一跳。",pinsEmpty:"还没有置顶消息。",pinEmpty:"暂无可置顶的消息。",pinned:"已置顶消息。",unpinned:"已取消置顶。",debugUnavailable:"调试服务器不可用。",approvalsUsage:"使用 /approvals(无需 on/off)。",debugDialogOpened:"调试对话框已打开。",debugDialogClosed:"调试对话框已关闭。",renameUsage:"用法:/rename <title>",themeToggled:"主题:{mode}",statusCompactOn:"状态:精简",statusCompactOff:"状态:详细",compactingSession:"正在压缩会话...",compactSuccess:"会话已压缩:{message}",compactWarning:"会话已压缩,但收益有限:{message}",compactSuccessDetailWithTokens:"前 {count} 条历史消息已折叠为摘要,预估输入 {before} -> {after} tokens,约省 {saved} tokens。",compactSuccessDetailNotReduced:"前 {count} 条历史消息已折叠为摘要,但预估输入变成了 {before} -> {after} tokens,这次没有变小。",compactSuccessDetailCountOnly:"前 {count} 条历史消息已折叠为摘要。",compactSuccessDetailSummaryOnly:"已生成新的历史摘要。",compactFailed:"会话压缩失败:{error}",compactFailedTokenLimit:"压缩失败:上下文预算不足。请正确设置 DIMCODE_CONTEXT_WINDOW,或切换更大上下文模型,或使用 /new。详情:{error}",retryEmpty:"没有可重试的上一条消息。",commandRemoved:"该指令已移除:{command}",helpAliasRemoved:"查看帮助请按 F1。",waitForResponse:"请等待当前响应完成,或按 Esc 中断。",pasteImagePending:"图片处理中,请稍候再发送。",pendingApproval:"请先处理 tool_approve。",awaitingApprovalAction:"已暂停:需要你的操作。请在权限卡中选择允许 / 始终允许 / 拒绝。",awaitingApprovalStillWaiting:"仍在等待审批({seconds} 秒)。在你允许或拒绝前,模型不会继续。",pendingAskUser:"请先处理 ask_user。",notificationSessionBusy:"这条通知属于另一个忙碌中的会话。请先完成当前工作,或手动切换过去。",notificationSessionUnavailable:"当前环境无法打开这条通知对应的会话。",notificationSessionSwitchFailed:"打开这条通知对应的会话失败。",approvalNotActive:"该审批在排队,请先处理当前审批。",askUserNotActive:"该 ask_user 已失效。"}},chatQueue:{label:"队列({count})",labelCompact:"队列 {count}",more:"还有 {count} 条…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"继续队列",state:{idle:"待发送",running:"运行中",paused:"等待继续",error:"错误"},item:{steerAction:"引导",steerReady:"优先",steerPending:"下一次",steerPaused:"暂停"},toast:{enqueued:"已加入队列(第 {count} 条)。",full:"队列已满(最多 5 条),请先删除或 /new 新建会话。",cleared:"已清空 {count} 条队列消息。",deleted:"已删除 {count} 条队列消息,按 Ctrl+Z 可撤销。",steerPromoted:"已升级为 steer;恢复队列后会优先生效。",steerQueued:"steer 当前不能立刻注入;已排到最前,会在下一轮优先生效。",steerSent:"steer 已提交;会在当前轮下一次模型调用前注入。",undo:"已撤销队列删除。",pausedTip:"队列已暂停,输入 {resume} 或 {resumeText} 可继续,或发送新消息后选择如何处理。",stale:"队列已暂停:请求疑似卡住。"},confirm:{title:"继续发送队列吗?",description:"上一条请求未完成,队列中还有 {count} 条等待发送。",hint:"继续发送下一条,或暂停队列。",continue:"继续发送",pause:"暂停队列",reason:"原因:{reason}"},reason:{network_error:"网络异常。",timeout:"请求超时。",canceled_by_user:"已由用户取消。",rate_limited:"触发限流。",config_unavailable:"保存的配置不可用。",unknown:"请求失败。"},draftDecision:{title:"队列已暂停",description:"还有 {count} 条队列消息等待发送。请选择如何处理这次新输入。",previewLabel:"新输入:",continue:"继续队列",append:"追加到队列",replace:"丢弃旧队列并发送"}},chatStatus:{done:"完成。",error:"错误。",interrupted:"已中断。",permissionDenied:"权限被拒绝。",planning:"规划中…",drafting:"起草中…",retrying:"重试({retry}/{maxAttempts})…",runningTool:"正在运行 {tool}…",runningTools:"正在运行 {count} 个工具…",approvalPendingOther:"已有其他审批在等待({permission})…",awaitingApproval:"等待批准…",awaitingApprovalWithPerm:"等待批准({permission})…",awaitingApprovalWithRisk:"等待批准({risk})…",awaitingAnswers:"等待回答…",resumingApproved:"已批准,继续…",resumingDenied:"已拒绝,继续…",resuming:"继续…",autoApprovingWithRisk:"自动批准中({risk})…",riskFallback:"风险",toolFallback:"工具",thinking:"思考中…",autoCompactionRequired:"上下文接近上限,需要先压缩。",autoCompactionRequiredDetailed:"上下文接近上限 · 下一次请求预计占用 {estimated} tokens,自动压缩阈值为 {threshold} tokens,因此需要先压缩。",compressed:"上下文已压缩 · 已将 {removed} 条旧消息折叠为摘要,本轮请求预估少占用 {saved} tokens(耗时 {elapsed}ms)",autoCompactedDetailed:"自动压缩完成 · 已将 {removed} 条旧消息折叠为摘要,预估输入 {before} -> {after} tokens,约省 {saved} tokens",autoCompactedNotReduced:"自动压缩完成 · 已将 {removed} 条旧消息折叠为摘要,但预估输入变成了 {before} -> {after} tokens,这次没有变小",autoCompactedSaved:"自动压缩完成 · 已将 {removed} 条旧消息折叠为摘要,约省 {saved} tokens",autoCompactedCountOnly:"自动压缩完成 · 已将 {removed} 条旧消息折叠为摘要",interruptedMarkdown:"> **已中断** · 用户已取消响应(`Esc`)。",awaitingApprovalPrefix:"等待批准",awaitingAnswersPrefix:"等待回答",approvalPendingPrefix:"已有其他审批在等待",autoApprovingPrefix:"自动批准中"},chatParts:{thinking:"思考",plan:"计划",todo:"待办"},chatRender:{userLabel:"用户",outputLabel:"↳ 输出",outputLabelShort:"输出:",canceled:"已取消",inputLabel:"输入:",collapse:"...(收起)",moreLines:"...(还有 {count} 行)",moreLinesOmitted:"...(已省略 {count} 行;设置 {envVar} 可增加)",streamingTail:"…(流式:仅显示最后 {shown} 个字符;已省略 {omitted} 个)",copy:"复制",userResponses:"用户回复:",approvalQueued:"等待前一个审批完成…",proposedPlan:{title:"实施计划"},llmMeta:{changedFiles:"本轮改动 {count} 个文件:{files}",changedFilesMore:"另 {count} 个",revertHint:"提示:点击这条消息并选择“撤回消息”可回退本轮改动与消息。",changedFilesCardTitle:"本轮改动 {count} 个文件:",revertButton:"撤回"},toolName:{explore:"探索",subagent:"子代理"},toolSuffix:{offset:"偏移 {value}",limit:"限制 {value}",matches:"{count} 个匹配",todos:"{count} 项待办",results:"{count} 条结果",results_one:"{count} 条结果"},toolGroup:{readFiles:"读取 {count} 个文件",writeFiles:"写入 {count} 个文件",editFiles:"编辑 {count} 个文件",globPatterns:"Glob {count} 个模式",globSingle:"文件匹配 {pattern}",grepPatterns:"Grep {count} 个模式",bashCommands:"执行 {count} 条命令",searchQueries:"搜索 {count} 个查询",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"搜索可能访问网络。",bash:"Bash 可执行命令。",edit:"文件变更可能修改本地文件。",grep:"Grep 可能读取本地文件。"},inlineHint:"按 ↑↓←→ 移动,按 Enter 选择。",awaitingUserAction:"等待你的操作:请选择允许 / 始终允许 / 拒绝。",decision:{userDenied:"用户拒绝了审批"},denied:{title:"# 工具权限被拒绝",toolLine:"- 工具:`{tool}`",permissionLine:"- 权限:`{permission}`",hint:"你可以重新选择该 tool_call 并重试。"},summary:{title:"# 已批准并执行工具",permissionLine:"已批准 `{permission}` 权限以执行 `{tool}`。"},required:"需要审批({risk})。",args:{commandWithDescription:"命令:{command} - {description}",command:"命令:{command}",description:"说明:{description}",raw:"参数:{args}"}},pathPicker:{titleWorkspace:"选择工作区",titleFile:"选择文件",placeholderWorkspace:"输入路径(../ 等)。Tab 补全,Enter 选择目录。",placeholderFile:"输入路径(../ 等)。Tab 补全,Enter 选择文件。"},providerDialogs:{customLabel:"自定义",customDetail:"自定义",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"通过 DimCode OAuth 登录",addCustomLabel:"添加自定义提供方",addCustomDetail:"添加自定义提供方",providerFallback:"提供方",adapter:{openai:"OpenAI",openaiOpenRouter:"OpenAI 兼容(OpenRouter)",openaiLocal:"OpenAI 兼容(本地端点)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"已配置",notConfigured:"未配置"},manage:{title:"自定义提供方:{provider}",connect:"连接",connectDetail:"编辑 API Key / Base URL",rename:"重命名",renameDetail:"编辑提供方名称",models:"编辑模型",modelsDetail:"更新可用模型 ID",delete:"删除",deleteDetail:"移除此提供方"},deleteConfirm:{title:"删除 {provider}?",confirm:"删除(确认)",confirmDetail:"此操作无法撤销",cancelDetail:"保留提供方"},nameDialog:{title:"命名自定义提供方",label:"提供方名称",placeholder:"例如:DeepSeek(代理)"},modelsDialog:{title:"自定义提供方模型",modelsTitle:"模型",modelsPlaceholder:"模型 ID(, 或换行分隔)",hint:", / 换行分隔 • Shift+Enter 换行 • Enter 应用",fetch:"拉取模型",fetching:"正在拉取模型…"},modelsFetchDialog:{title:"选择模型",searchPlaceholder:"筛选模型",hint:"Space 勾选 • Enter 确认 • Esc 取消"},toast:{modelSet:"模型已设置为 {provider} / {model}。",noModels:"你目前还没有可用模型,请先连接一个提供方(/connect)。",connectFirst:"首次发送前请先连接提供方(/connect)。",apiKeyRequired:"需要 API Key。",baseUrlRequired:"需要 Base URL。",baseUrlInvalid:"Base URL 必须以 http:// 或 https:// 开头。",connected:"已连接 {provider}。",connectedSelectModel:"已连接 {provider},请选择模型。",connectedCheckFailed:"已连接 {provider},但自检失败:{reason}",connectionTestPassed:"连接测试通过:{provider}。",connectionTestFailed:"连接测试失败:{provider} - {reason}",connectionActionUpdateKey:"操作建议:重新打开连接,更新 API Key 后再次测试。",connectionActionFixBaseUrl:"操作建议:检查 Base URL 路径(通常以 /v1 结尾)后再次测试。",connectionActionSwitchKey:"操作建议:稍后重试,或切换其他 Key/提供方。",connectionActionRetryTest:"操作建议:检查网络/代理后再次执行测试连接。",noModelsFetching:"暂无模型,正在拉取模型列表…",firstUseGuide:"快速上手:1) /connect 2) /models 3) 发送「hello」",firstUseSendHello:"下一步:发送第一条消息(例如:「hello」)。",connectionCheckUnauthorized:"401 未授权:请检查 API Key 与提供方是否匹配。",connectionCheckForbidden:"403 禁止访问:当前 Key 可能无此提供方/模型权限。",connectionCheckNotFound:"404 未找到:请检查 Base URL 路径(OpenAI 兼容通常以 /v1 结尾)。",connectionCheckRateLimited:"429 限流:请稍后重试,或切换其他 Key/提供方。",connectionCheckTimeout:"连接超时:请检查网络/代理后重试。",connectionCheckNetwork:"网络连接失败:请检查 DNS/代理/Base URL。",connectionCheckFailed:"连接自检失败:{error}",apiKeyCleared:"已清除 {provider} 的 API Key。",customAdded:"已添加自定义提供方:{provider}。",customRenamed:"已重命名自定义提供方:{provider}。",customModelsUpdated:"已更新自定义提供方模型:{provider}。",customDeleted:"已删除自定义提供方:{provider}。",modelsRequired:"至少需要一个模型。",modelsEmpty:"未获取到模型。",modelsFetchFailed:"模型拉取失败:{error}",modelsFetchChatCompletions:"当 Base URL 为 /chat/completions 或 /responses 时不支持拉取模型。",manualModelsRequired:"此端点不支持自动发现模型。请在模型配置中手动输入模型名称。",nameRequired:"提供方名称不能为空。",nameConflict:"提供方名称已存在。"}},copyToast:{copiedToClipboard:"已复制到剪贴板"}};var zh_Hant_default={common:{apply:"套用",cancel:"取消",close:"關閉",confirm:"確認",yes:"是",no:"否",exit:"結束",back:"返回",next:"下一步",save:"儲存",empty:"—",unknownError:"未知錯誤",inputClearTip:"Ctrl+C 清除",total:"總計"},configDialog:{title:"設定",hint:"Tab/Shift+Tab 切換欄位 • Enter 套用 • Esc 取消",modelsTitle:"模型(自訂)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"上下文視窗",contextWindowLocked:"上下文視窗(模型定義)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperature",temperaturePlaceholder:"0.7",temperatureValidationError:"Temperature:只能輸入數字和「.」",maxTokensTitle:"最大輸出 Token 數",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL(OpenAI 相容)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"目前:",apiKeyNotSet:"(未設定)",apiKeyTitle:"API 金鑰",apiKeyPlaceholder:"貼上新 Key 以更新(留空保持不變)",interleavedThinkingTitle:"交錯思考(空格切換)",interleavedThinkingLocked:"交錯思考(模型定義)",interleavedThinkingOpen:"開啟",interleavedThinkingClose:"關閉",tipIntensityTitle:"提示強度",tipIntensityOff:"關閉",tipIntensityLow:"低",tipIntensityStandard:"標準",shortcutsTitle:"快捷鍵",shortcutCommandsLabel:"命令面板",shortcutTimelineLabel:"時間線",shortcutNewSessionLabel:"新工作階段",shortcutsPlaceholder:"如 mod+p",shortcutsHint:"使用 mod/ctrl/alt/shift + 鍵(a-z, 0-9, F1-F12)。"},languageDialog:{title:"語言",hint:"Enter 套用 • Esc 取消",languageTitle:"語言",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"思考強度",hint:"Enter 套用 • Esc 取消",effortTitle:"推理強度",applied:"推理強度已設為 {effort}",option:{low:"低",medium:"中",high:"高",xhigh:"超高",max:"最大",minimal:"極簡",none:"無",off:"關閉",auto:"自動"}},toolSettingsDialog:{title:"工具設定",hint:"Enter 套用 • Esc 取消",websearchTitle:"WebSearch API 金鑰",apiKeyCurrentPrefix:"目前:",apiKeyNotSet:"(未設定)",apiKeyInvalidCjk:"API Key 不能包含中文字元。",apiKeyInvalidSpaces:"API Key 不能包含空格。",apiKeyPlaceholder:"貼上 Serper API Key"},pluginsDialog:{title:"外掛程式",hint:"選擇一個外掛程式進行設定 • Esc 關閉",serperSearch:"Serper Search",serperSearchDetail:"透過 Serper API 進行網路搜尋",configured:"已設定",notConfigured:"未設定",serperConfigTitle:"Serper Search 設定",serperConfigHint:"Tab 切換 • Enter 套用 • Esc 取消"},skillsDialog:{title:"技能",hint:"Enter 套用 • Esc 取消",empty:"尚無可用技能",emptyFiltered:"無符合技能"},timelineDialog:{title:"時間軸",hint:"Tab 篩選 • Enter 開啟 • Esc 關閉",empty:"尚無訊息",emptyFiltered:"無符合項目",filterAll:"所有訊息",filterUser:"使用者訊息",filterTool:"工具呼叫"},mcpSettingsDialog:{title:"MCP",hint:"編輯 mcp.json 檔案以設定 MCP 伺服器 • Esc 關閉",configFileLabel:"設定檔:",noServersHint:"尚未設定 MCP 伺服器。",serverCount:"已設定 {count} 個伺服器",guideText:"編輯上方檔案以新增或修改 MCP 伺服器。",openFile:"開啟檔案",reload:"重新載入",close:"關閉",reloaded:"MCP 設定已重新載入。",reloadFailed:"重新載入失敗:{error}",status:"狀態",toolCount:"工具數",disabled:"停用",testConnection:"測試",testing:"正在測試連線...",testComplete:"測試完成。",testPartial:"測試完成(有錯誤)。",testFailed:"連線失敗:{error}",invalidJson:"JSON 無效:{error}",invalidShape:"MCP JSON 無效:需要「mcpServers」。",invalidServer:"MCP 伺服器設定無效:{name}",noServers:"沒有找到 MCP 伺服器。",lintOk:"JSON 語法正確",lintAt:"{error}(第 {line} 行,第 {column} 列)",lintUnclosed:"未閉合的 {char}(第 {line} 行,第 {column} 列)",lintInvalid:"{error}",exampleFormat:"範例格式:"},toolApprovalsDialog:{title:"工具核准",useAuto:"自動",useNormal:"一般",useStrict:"嚴格",close:"關閉",focusedTitleAuto:"自動",focusedTitleNormal:"一般",focusedTitleStrict:"嚴格",focusedTitleClose:"關閉",focusedDescAuto:"所有工具自動執行,不再提示(最快,最不安全)。",focusedDescNormal:"讀取類自動通過,寫入類需確認。",focusedDescStrict:"所有工具均須確認(最安全,最慢)。",focusedDescClose:"關閉此對話方塊,不變更目前設定。",currentPrefix:"目前:{mode}",tip:"提示:Tab 或 ↑/↓ 在按鈕間移動,Enter 確認,Esc 關閉。"},settingsDialog:{pendingApproval:"請先處理待核准請求再變更設定。",invalidShortcut:"快捷鍵無效:{label}({value})",shortcutCommands:"命令面板快捷鍵",shortcutTimeline:"時間線快捷鍵",shortcutNewSession:"新工作階段快捷鍵",toolApprovalsApplied:"工具核准:{mode}",applied:"設定已套用。"},exitAppDialog:{title:"結束 DimCode",confirm:"現在結束?",warning:"仍有回應在進行中,結束將中斷它。",reasonPrefix:"原因:{reason}"},approvalDialog:{title:"工具權限核准",toolLabel:"工具:{tool}{suffix}",toolLabelSuffix:"({description})",permissionLabel:"權限:{permission}({risk})",descriptionLabel:"說明:{description}",commandLabel:"命令:",inlineActionHint:"↑/← 上一個 ↓/→ 下一個 Enter 確認 1/2/3 選擇",inlineActionHintCompact:"←/→ 移動 Enter 確認 1/2/3 選擇",buttons:{approve:"核准",alwaysApprove:"總是核准",deny:"拒絕",always:"總是",ok:"確定",no:"否",y:"Y",all:"全",n:"N"}},askUserDialog:{noQuestionsTitle:"沒有問題",noQuestionsBody:"沒有需要回答的問題。",title:"問題 {index}/{total}:{header}",defaultHeader:"問題",prev:"上一題",next:"下一題",submit:"提交",otherOption:"其他",otherDetail:"填寫自訂答案",inlineHintOptions:"按 ↑↓ 移動,按 ←→ 切題,按 Enter 選擇。",inlineHintMulti:"多選:按 Space 勾選或取消勾選。",inlineHintButtons:"按 Tab 切到按鈕,按 ←→ 切換,按 Enter 觸發,按 ↑ 回到選項。",inlineHintNav:"Ctrl+Left / Ctrl+Right(或 Ctrl+A / Ctrl+E)切換問題。",inlineHintSubmit:"Ctrl+Enter 提交,Esc 取消。",inlineButtonPrev:"[上一題]",inlineButtonNext:"[下一題]",inlineButtonSubmit:"[提交]",inlineButtonCancel:"[取消]",inlineActionHint:"Space 選擇 ← 上一題 → 下一題 Enter 下一題/提交 Esc 取消",inlineActionHintCompact:"Space 選擇 ←/→ 切題 Enter 下一題/提交 Esc 取消",optionsSummaryAll:"共 {count} 個選項",optionsSummaryVisibleMore:"共 {count} 個選項({start}-{end})↓ 更多",multiSelectHint:"[多選] 空格切換,Enter 確認",singleSelectHint:"[單選] 方向鍵移動,Enter 確認",customAnswerLabel:"自訂答案:",customAnswerPlaceholder:"請輸入答案…",otherPlaceholder:"已選「其他」:輸入自訂答案,Enter 填入。"},nextApiOAuthDialog:{title:"DimCode OAuth 登入",copyUrl:"複製連結",login:"登入",logout:"登出",statusTitle:"狀態",statusAuthenticated:"✓ 已登入:{email}",statusLoading:"⏳ 正在驗證…",statusNotLoggedIn:"✗ 未登入",instructionAuthenticated:"使用 ↑↓ 導覽,Enter 選擇,或按 1-9",instructionLoading:"若瀏覽器未開啟,按 C 複製下方連結",instructionNeedsSetup:"請檢查 DimCode OAuth client 的 redirect_uri、scope 和啟用狀態後重試",instructionWithUrl:"按 C 複製下方 OAuth 連結,或按 Enter 開啟瀏覽器",instructionUnauthed:"按 Enter 使用 DimCode OAuth 登入,或按 Esc 關閉",instructionManualCallback:"複製下方 URL,在瀏覽器中登入,然後把重新導向的網址貼到輸入框。",oauthUrlTitleLoading:"OAuth 連結(瀏覽器未開啟時複製)",oauthUrlTitleReady:"OAuth 連結(可直接使用)",scrollIndicator:" [{start}-{end} / 共 {total}]",selectModelTitle:"選擇模型(↑↓/1-9,Enter 選擇){indicator}",aboutTitle:"關於 DimCode OAuth",setupTitle:"OAuth 登入異常",aboutBulletOne:"• 內建使用 DimCode OAuth client",aboutBulletTwo:"• 登入後會擷取 relay 模型並儲存 provider 設定",aboutBulletThree:"• 使用 OAuth refresh token,而不是長期 API Key",viewAllPlans:"檢視所有方案 →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"DimCode 帳號",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"正在產生 OAuth 連結…",urlReady:"OAuth 連結已就緒!複製或按 Enter 開啟瀏覽器。",generateUrlFailed:"產生 OAuth 連結失敗:{error}",startingLogin:"正在開始 OAuth 登入…",browserOpened:"已開啟瀏覽器,如未開啟請從對話方塊複製連結。",copyUrlToLogin:"請從對話方塊複製 OAuth 連結登入。",urlCopied:"OAuth 連結已複製到剪貼簿。",urlCopyFailed:"複製 OAuth 連結失敗。",authSuccess:"已成功通過 DimCode OAuth 驗證!",loginFailed:"OAuth 登入失敗:{error}",loggedOut:"已登出 DimCode OAuth",loggedOutWithRemoteWarning:"已登出 DimCode OAuth,但伺服器端撤銷失敗:{error}",logoutFailed:"登出失敗:{error}",initFailed:"初始化對話方塊失敗:{error}",modelSwitched:"已切換模型:{model}",selectModelFailed:"選擇模型失敗:{error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"偵錯",titleDebugging:"偵錯中",copy:"複製",proceed:"繼續",fixed:"已修正",body:"我已新增偵錯日誌(並可能修正了問題)。請現在嘗試重現,然後選擇結果。"},exitSessionDialog:{title:"結束工作階段",confirm:"結束目前工作階段並返回首頁?",note:"下一則訊息將開啟新的工作階段。"},messageActionsDialog:{title:"訊息操作",revert:"撤回訊息",revertWithFiles:"撤回訊息及檔案變更",revertKeepFiles:"撤回訊息(保留檔案變更)",revertFilesOnly:"只回復檔案變更",copy:"複製訊息文字到剪貼簿",fork:"分叉建立新工作階段",pin:"置頂訊息",unpin:"取消置頂"},pathPickerDialog:{hint:"↑/↓ 選擇 • Tab 補全 • Enter 確認 • Esc 關閉"},providerConnectDialog:{title:"連線 {provider}",providerFallback:"提供者",hint:"Tab 切換 • Ctrl+C 清除 • Enter 套用",hintOpenAI:"Tab 切換 • Ctrl+C 清除 • Enter 套用",hintGemini:"Tab 切換 • Ctrl+C 清除 • Enter 套用",hintAnthropic:"Tab 切換 • Ctrl+C 清除 • Enter 套用",hintGeneric:"Tab 切換 • Ctrl+C 清除 • Enter 套用",applyingHint:"正在測試連線,請稍候...",applyingButton:"套用中...",testConnection:"測試連線",baseUrlStatusAutoFix:"自動修正:{value}",baseUrlStatusInvalid:"Base URL 必須是 http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API 金鑰",apiKeyPlaceholder:"貼上新 Key 以更新(留空保持不變)",apiKeyCurrent:"目前:{value}",apiKeyNotSet:"目前:(未設定)",apiKeyInvalidCjk:"API Key 不能包含中文字元。",apiKeyInvalidSpaces:"API Key 不能包含空格。",clearKey:"刪除金鑰",useDetectedKey:"使用 {name}",disconnectButton:"斷開連線",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"關",toggleOn:"開",toggleHint:"Tab 切換 • ←/→ 調整 • Space 切換"},redoConfirmDialog:{title:"確認重做",body:"確定要復原已撤回的訊息嗎?"},renameSessionDialog:{title:"重新命名工作階段",label:"工作階段名稱",placeholder:"例如:規劃筆記"},sessionsDialog:{timeNow:"剛剛",timeMinutes:"{count} 分鐘",timeHours:"{count} 小時",timeDays:"{count} 天",newSession:"新工作階段",title:"工作階段({count})",titleScoped:"工作階段({count}/{total})",scope:"範圍:{cwd}",loading:"載入中…",confirmDelete:"確認刪除:再次按 Delete",header:"{count} 個工作階段 • 方向鍵導覽 • Enter 選擇{range}{activity}",headerRange:" • 顯示 {start}-{end}",runningCount:"執行中 {count} 個",pausedCount:"等待確認 {count} 個",hint:"輸入以跳轉 • ←/→ 按鈕 • Enter 確認 • Esc 關閉",focusPrefix:"焦點:{focus}",focusList:"列表",focusButtons:"按鈕",noSessionsCwd:"目前目錄沒有工作階段",noSessions:"暫無已儲存的工作階段",nodeOnly:"工作階段僅在 Node/CLI 模式可用。",newSessionTitle:"新工作階段",newSessionTarget:"一個新的工作階段",busy:{agentResponding:"助理仍在回應",awaitingAskUser:"等待 AskUser 回覆",awaitingToolApproval:"等待工具核准",pendingApproval:"等待核准"},buttons:{open:"開啟",delete:"刪除",deleteConfirm:"刪除(確認)",scope:"範圍:{scope}",scopeCwd:"目前目錄",scopeAll:"全部",refresh:"重新整理"}},sessionsOverlay:{title:"會話",hint:"Enter 選擇 • Esc 關閉 • Ctrl+R 重新整理",loading:"正在載入會話...",empty:"尚無已儲存的會話。"},switchSessionDialog:{title:"切換工作階段",confirm:"切換並中斷",target:"切換到 {target}?",fallback:"現在切換工作階段?",warning:"這將中斷目前工作階段的回應/流程。",reason:"原因:{reason}"},themeDialog:{title:"主題",hint:"Enter 套用 • Esc 取消",mode:"模式",light:"淺色",dark:"深色",unavailable:"目前終端機不支援可切換主題。",fallback:"這裡會固定使用備用的淺色/深色 ANSI 主題。",tip:"提示:預設跟隨系統主題。"},commandPalette:{searchPlaceholder:"搜尋…",noMatches:"無相符項",hint:"輸入篩選 • Enter: 開啟 • Esc: 關閉",title:"命令"},skills:{title:"技能"},help:{title:"說明",modeLabel:"模式:{mode}",modeDetail:"目前助理模式。",shortcutsLabel:"快捷鍵",onboarding:`歡迎使用!快速上手:
1169
+ 提示:{commandsKey} 可打开命令面板。`,items:{help:"帮助与快捷键(F1)",commands:"命令面板(Ctrl+P)",back:"返回上一跳",status:"切换状态详情"}},commands:{help:{label:"帮助",detail:"快捷键与常用命令(F1)"},sessions:{label:"会话",detail:"选择或创建会话"},timeline:{label:"时间线",detail:"跳转到用户消息"},newSession:{label:"新会话",detail:"开始新会话"},connectProvider:{label:"连接提供方",detail:"连接提供方"},models:{label:"模型",detail:"选择模型"},toolApprovals:{label:"工具审批",detail:"配置审批"},toolSettings:{label:"工具设置",detail:"配置工具设置"},mcpHub:{label:"MCP",detail:"管理 MCP 连接器与设置"},plugins:{label:"插件",detail:"管理插件"},debug:{label:"调试",detail:"SDK observability 日志(/debug)"},mcpSettings:{label:"MCP(高级 JSON)",detail:"配置原始 MCP 服务器 JSON"},language:{label:"语言",detail:"切换界面语言(/language)"},settings:{label:"设置",detail:"自定义提供方(Ctrl+K)"}},homePage:{multilineTitle:"多行文本",multilineTitleWithCount:"多行文本({count} 行)",providerCustom:"自定义",reviewPrompt:"帮我审查代码变更",footerCwd:"工作目录 {cwd}",hints:{switchMode:"切换模式",commands:"命令"},tips:{greeting:"欢迎回来!可以试试 {commandsKey} 或 {init}。",commandsAlias:"小贴士:{key} 可打开命令面板。"},prompts:{help:"帮助与快捷键(F1)",sessions:"列出/选择会话",connect:"连接提供方",models:"选择模型",newSession:"开始新会话",approvals:"配置工具审批(auto/normal/strict)",commands:"打开命令面板",toolSettings:"配置工具设置",mcpSettings:"打开 MCP",plugins:"管理插件",language:"切换界面语言",theme:"选择主题",status:"切换状态详情",review:"审查代码变更",init:"初始化/改进 AGENTS.md",skills:"查看已加载的 Skills",exit:"退出应用",debug:"SDK observability 日志",settings:"自定义提供方设置"},commandPalette:{connect:"连接提供方",models:"选择模型"},commands:{debugLabel:"调试",debugDetail:"SDK observability 日志(/debug)"},toast:{approvalsUsage:"使用 /approvals(无需 on/off)。",customProviderOnly:"设置仅适用于自定义提供方。",redoChatOnly:"重做仅在聊天视图可用。",retryChatOnly:"重试仅在聊天视图可用。",pinsChatOnly:"置顶仅在聊天视图可用。",renameChatOnly:"重命名仅在聊天视图可用(/rename <title>)。",commandRemoved:"该指令已移除:{command}",helpAliasRemoved:"查看帮助请按 F1。",deleteConfirm:"再次按 Delete 确认删除。",themeToggled:"主题:{mode}",pasteImagePending:"图片处理中,请稍候再发送。"}},chatPage:{placeholder:"随便问点什么…(换行:Shift+Enter 或 Ctrl+J)",placeholderAwaitingApproval:"审批阻塞中:请选择 允许 / 拒绝 后继续。",reviewPrompt:"帮我审查代码变更",notification:{approvalTitle:"[需要审批] 工具权限",approvalMessage:"DimCode 正在等待工具审批:{tool}。",doneTitle:"[任务完成]",doneMessage:"DimCode 已完成本次任务。",doneMessageWithDuration:"DimCode 已完成本次任务,耗时 {duration}。",doneMessageWithTools:"DimCode 已完成本次任务,共调用 {tools} 次工具。",doneMessageWithToolsAndDuration:"DimCode 已完成本次任务,耗时 {duration},共调用 {tools} 次工具。"},headerStats:"{messages} 条消息 · 总计 {tokens}",contextChip:"≈{pct}% / {tokens} 词元",contextChipCompact:"{pct}%",thinkingWords:"聚合,思考,推理,规划,分析,综合,优化,整理",modelFallback:"模型",mode:{plan:"计划",agent:"助手",debug:"调试"},status:{approvalsAuto:"自动",approvalsAll:"全部",blockedByApproval:"等待审批中",awaitingApprovalAction:"等待你的审批:请选择允许 / 拒绝后继续。"},footer:{dragSelect:"拖拽选择",openLink:"Ctrl+点击打开文件或链接",esc:"esc",interrupt:"中断",approvalPaused:"⏸ 已暂停",approvalPausedHint:"等待审批中(按 Enter 选择)。",shortcuts:"Cmd+Delete/Ctrl+W:清空输入 Tab:切换模式 {commandsKey}:命令",shortcutsCompact:"Cmd+Delete/Ctrl+W:清空 Tab:切换模式 {commandsKey}:命令",shortcutsMicro:"{commandsKey}:命令",shortcutsMini:"{commandsKey}:命令"},session:{new:"新建"},timeline:{title:"时间线",empty:"(空)",filterAll:"全部消息",filterUser:"用户消息",filterTool:"工具调用"},pins:{title:"置顶",empty:"(空)"},jumpToBottom:{button:"↓"},prompts:{help:"帮助与快捷键(F1)",newSession:"开始新会话",resume:"恢复已暂停的队列",sessions:"列出/选择会话",timeline:"跳转到用户消息",pins:"打开置顶消息",pin:"置顶上一条消息",back:"返回上一跳",connect:"连接提供方",models:"选择模型",theme:"切换界面主题",approvals:"配置工具审批(auto/normal/strict)",commands:"打开命令面板",toolSettings:"配置工具设置",mcpSettings:"打开 MCP",plugins:"管理插件",language:"切换界面语言",status:"切换状态详情",review:"审查代码变更",retry:"重试上一条用户消息",compact:"压缩会话上下文",init:"初始化/改进 AGENTS.md",rename:"重命名当前会话",skills:"查看已加载的 Skills",exit:"退出应用",debug:"SDK observability 日志",settings:"自定义提供方设置"},commands:{pinsLabel:"置顶",pinsDetail:"打开置顶消息",backLabel:"返回",backDetail:"回到上一跳",debugLabel:"调试",debugDetail:"SDK observability 日志(/debug)",statusLabel:"状态",statusDetail:"切换状态详情",themeLabel:"主题",themeDetail:"切换颜色主题"},tips:{contextWarn:"小贴士:上下文快满了,可以用 /compact 压缩或 /new 新开会话。",contextCritical:"小贴士:已接近上下文上限,建议 /new 新开会话(或先 /compact)。",timeline:"小贴士:对话变长时,用 /tl 打开时间线快速跳回某条消息。",timelineAlias:"小贴士:/tl 是 /timeline 的快捷别名。",commandsAlias:"小贴士:{key} 可打开命令面板。",errorRecovery:"小贴士:出错时可试试 /compact 或 /new。",greeting:"欢迎回来!可以试试 {commandsKey} 或 {init}。",compactDelight:"不错!保持上下文精简很有帮助。",addTests:"搞定了!要不要我顺手写测试?回复「是/要」。"},confirm:{addTests:"请为刚才的修改补充测试。"},toast:{customProviderOnly:"设置仅适用于自定义提供方。",renameNodeOnly:"重命名仅在 Node/CLI 模式可用。",noActiveSession:"没有可重命名的会话。",sessionNameEmpty:"会话名称不能为空。",sessionRenamed:"会话已重命名为:{title}",renameFailed:"重命名会话失败。",linkOpenHint:"提示:Ctrl+点击可打开文件或链接。",copySuccess:"已复制",copyFailed:"复制失败",forkFailed:"分叉会话失败。",backEmpty:"没有可返回的上一跳。",pinsEmpty:"还没有置顶消息。",pinEmpty:"暂无可置顶的消息。",pinned:"已置顶消息。",unpinned:"已取消置顶。",debugUnavailable:"调试服务器不可用。",approvalsUsage:"使用 /approvals(无需 on/off)。",debugDialogOpened:"调试对话框已打开。",debugDialogClosed:"调试对话框已关闭。",renameUsage:"用法:/rename <title>",themeToggled:"主题:{mode}",statusCompactOn:"状态:精简",statusCompactOff:"状态:详细",compactingSession:"正在压缩会话...",compactSuccess:"会话已压缩:{message}",compactWarning:"会话已压缩,但收益有限:{message}",compactSuccessDetailWithTokens:"前 {count} 条历史消息已折叠为摘要,预估输入 {before} -> {after} tokens,约省 {saved} tokens。",compactSuccessDetailNotReduced:"前 {count} 条历史消息已折叠为摘要,但预估输入变成了 {before} -> {after} tokens,这次没有变小。",compactSuccessDetailCountOnly:"前 {count} 条历史消息已折叠为摘要。",compactSuccessDetailSummaryOnly:"已生成新的历史摘要。",compactFailed:"会话压缩失败:{error}",compactFailedTokenLimit:"压缩失败:上下文预算不足。请正确设置 DIMCODE_CONTEXT_WINDOW,或切换更大上下文模型,或使用 /new。详情:{error}",retryEmpty:"没有可重试的上一条消息。",commandRemoved:"该指令已移除:{command}",helpAliasRemoved:"查看帮助请按 F1。",waitForResponse:"请等待当前响应完成,或按 Esc 中断。",pasteImagePending:"图片处理中,请稍候再发送。",pendingApproval:"请先处理 tool_approve。",awaitingApprovalAction:"已暂停:需要你的操作。请在权限卡中选择允许 / 始终允许 / 拒绝。",awaitingApprovalStillWaiting:"仍在等待审批({seconds} 秒)。在你允许或拒绝前,模型不会继续。",pendingAskUser:"请先处理 ask_user。",notificationSessionBusy:"这条通知属于另一个忙碌中的会话。请先完成当前工作,或手动切换过去。",notificationSessionUnavailable:"当前环境无法打开这条通知对应的会话。",notificationSessionSwitchFailed:"打开这条通知对应的会话失败。",approvalNotActive:"该审批在排队,请先处理当前审批。",askUserNotActive:"该 ask_user 已失效。"}},chatQueue:{label:"队列({count})",labelCompact:"队列 {count}",more:"还有 {count} 条…",resumeToken:"/resume",resumePlainToken:"resume",resumeLegacyToken:"继续队列",state:{idle:"待发送",running:"运行中",paused:"等待继续",error:"错误"},item:{steerAction:"引导",steerReady:"优先",steerPending:"下一次",steerPaused:"暂停"},toast:{enqueued:"已加入队列(第 {count} 条)。",full:"队列已满(最多 5 条),请先删除或 /new 新建会话。",cleared:"已清空 {count} 条队列消息。",deleted:"已删除 {count} 条队列消息,按 Ctrl+Z 可撤销。",steerPromoted:"已升级为 steer;恢复队列后会优先生效。",steerQueued:"steer 当前不能立刻注入;已排到最前,会在下一轮优先生效。",steerSent:"steer 已提交;会在当前轮下一次模型调用前注入。",undo:"已撤销队列删除。",pausedTip:"队列已暂停,输入 {resume} 或 {resumeText} 可继续,或发送新消息后选择如何处理。",stale:"队列已暂停:请求疑似卡住。"},confirm:{title:"继续发送队列吗?",description:"上一条请求未完成,队列中还有 {count} 条等待发送。",hint:"继续发送下一条,或暂停队列。",continue:"继续发送",pause:"暂停队列",reason:"原因:{reason}"},reason:{network_error:"网络异常。",timeout:"请求超时。",canceled_by_user:"已由用户取消。",rate_limited:"触发限流。",config_unavailable:"保存的配置不可用。",unknown:"请求失败。"},draftDecision:{title:"队列已暂停",description:"还有 {count} 条队列消息等待发送。请选择如何处理这次新输入。",previewLabel:"新输入:",continue:"继续队列",append:"追加到队列",replace:"丢弃旧队列并发送"}},chatStatus:{done:"完成。",error:"错误。",interrupted:"已中断。",permissionDenied:"权限被拒绝。",planning:"规划中…",drafting:"起草中…",retrying:"重试({retry}/{maxAttempts})…",runningTool:"正在运行 {tool}…",runningTools:"正在运行 {count} 个工具…",approvalPendingOther:"已有其他审批在等待({permission})…",awaitingApproval:"等待批准…",awaitingApprovalWithPerm:"等待批准({permission})…",awaitingApprovalWithRisk:"等待批准({risk})…",awaitingAnswers:"等待回答…",resumingApproved:"已批准,继续…",resumingDenied:"已拒绝,继续…",resuming:"继续…",autoApprovingWithRisk:"自动批准中({risk})…",riskFallback:"风险",toolFallback:"工具",thinking:"思考中…",autoCompactionRequired:"上下文接近上限,需要先压缩。",autoCompactionRequiredDetailed:"上下文接近上限 · 下一次请求预计占用 {estimated} tokens,自动压缩阈值为 {threshold} tokens,因此需要先压缩。",compressed:"上下文已压缩 · 已将 {removed} 条旧消息折叠为摘要,本轮请求预估少占用 {saved} tokens(耗时 {elapsed}ms)",autoCompactedDetailed:"自动压缩完成 · 已将 {removed} 条旧消息折叠为摘要,预估输入 {before} -> {after} tokens,约省 {saved} tokens",autoCompactedNotReduced:"自动压缩完成 · 已将 {removed} 条旧消息折叠为摘要,但预估输入变成了 {before} -> {after} tokens,这次没有变小",autoCompactedSaved:"自动压缩完成 · 已将 {removed} 条旧消息折叠为摘要,约省 {saved} tokens",autoCompactedCountOnly:"自动压缩完成 · 已将 {removed} 条旧消息折叠为摘要",interruptedMarkdown:"> **已中断** · 用户已取消响应(`Esc`)。",awaitingApprovalPrefix:"等待批准",awaitingAnswersPrefix:"等待回答",approvalPendingPrefix:"已有其他审批在等待",autoApprovingPrefix:"自动批准中"},chatParts:{thinking:"思考",plan:"计划",todo:"待办"},chatRender:{userLabel:"用户",outputLabel:"↳ 输出",outputLabelShort:"输出:",canceled:"已取消",inputLabel:"输入:",collapse:"...(收起)",moreLines:"...(还有 {count} 行)",moreLinesOmitted:"...(已省略 {count} 行;设置 {envVar} 可增加)",streamingTail:"…(流式:仅显示最后 {shown} 个字符;已省略 {omitted} 个)",copy:"复制",userResponses:"用户回复:",approvalQueued:"等待前一个审批完成…",proposedPlan:{title:"实施计划"},llmMeta:{changedFiles:"本轮改动 {count} 个文件:{files}",changedFilesMore:"另 {count} 个",revertHint:"提示:点击这条消息并选择“撤回消息”可回退本轮改动与消息。",changedFilesCardTitle:"本轮改动 {count} 个文件:",revertButton:"撤回"},toolName:{explore:"探索",subagent:"子代理"},toolSuffix:{offset:"偏移 {value}",limit:"限制 {value}",matches:"{count} 个匹配",todos:"{count} 项待办",results:"{count} 条结果",results_one:"{count} 条结果"},toolGroup:{readFiles:"读取 {count} 个文件",writeFiles:"写入 {count} 个文件",editFiles:"编辑 {count} 个文件",globPatterns:"Glob {count} 个模式",globSingle:"文件匹配 {pattern}",grepPatterns:"Grep {count} 个模式",bashCommands:"执行 {count} 条命令",searchQueries:"搜索 {count} 个查询",taskCount:"{name} x{count}",generic:"{name} x{count}"}},toolApproval:{reason:{search:"搜索可能访问网络。",bash:"Bash 可执行命令。",edit:"文件变更可能修改本地文件。",grep:"Grep 可能读取本地文件。"},inlineHint:"按 ↑↓←→ 移动,按 Enter 选择。",awaitingUserAction:"等待你的操作:请选择允许 / 始终允许 / 拒绝。",decision:{userDenied:"用户拒绝了审批"},denied:{title:"# 工具权限被拒绝",toolLine:"- 工具:`{tool}`",permissionLine:"- 权限:`{permission}`",hint:"你可以重新选择该 tool_call 并重试。"},summary:{title:"# 已批准并执行工具",permissionLine:"已批准 `{permission}` 权限以执行 `{tool}`。"},required:"需要审批({risk})。",args:{commandWithDescription:"命令:{command} - {description}",command:"命令:{command}",description:"说明:{description}",raw:"参数:{args}"}},pathPicker:{titleWorkspace:"选择工作区",titleFile:"选择文件",placeholderWorkspace:"输入路径(../ 等)。Tab 补全,Enter 选择目录。",placeholderFile:"输入路径(../ 等)。Tab 补全,Enter 选择文件。"},providerDialogs:{customLabel:"自定义",customDetail:"自定义",nextApiOAuthLabel:"DimCode OAuth",nextApiOAuthDetail:"通过 DimCode OAuth 登录",addCustomLabel:"添加自定义提供方",addCustomDetail:"添加自定义提供方",providerFallback:"提供方",adapter:{openai:"OpenAI",openaiOpenRouter:"OpenAI 兼容(OpenRouter)",openaiLocal:"OpenAI 兼容(本地端点)",openaiResponses:"OpenAI Responses",gemini:"Gemini",anthropic:"Anthropic"},status:{configured:"已配置",notConfigured:"未配置"},manage:{title:"自定义提供方:{provider}",connect:"连接",connectDetail:"编辑 API Key / Base URL",rename:"重命名",renameDetail:"编辑提供方名称",models:"编辑模型",modelsDetail:"更新可用模型 ID",delete:"删除",deleteDetail:"移除此提供方"},deleteConfirm:{title:"删除 {provider}?",confirm:"删除(确认)",confirmDetail:"此操作无法撤销",cancelDetail:"保留提供方"},nameDialog:{title:"命名自定义提供方",label:"提供方名称",placeholder:"例如:DeepSeek(代理)"},modelsDialog:{title:"自定义提供方模型",modelsTitle:"模型",modelsPlaceholder:"模型 ID(, 或换行分隔)",hint:", / 换行分隔 • Shift+Enter 换行 • Enter 应用",fetch:"拉取模型",fetching:"正在拉取模型…"},modelsFetchDialog:{title:"选择模型",searchPlaceholder:"筛选模型",hint:"Space 勾选 • Enter 确认 • Esc 取消"},toast:{modelSet:"模型已设置为 {provider} / {model}。",noModels:"你目前还没有可用模型,请先连接一个提供方(/connect)。",connectFirst:"首次发送前请先连接提供方(/connect)。",apiKeyRequired:"需要 API Key。",baseUrlRequired:"需要 Base URL。",baseUrlInvalid:"Base URL 必须以 http:// 或 https:// 开头。",connected:"已连接 {provider}。",connectedSelectModel:"已连接 {provider},请选择模型。",connectedCheckFailed:"已连接 {provider},但自检失败:{reason}",connectionTestPassed:"连接测试通过:{provider}。",connectionTestFailed:"连接测试失败:{provider} - {reason}",connectionActionUpdateKey:"操作建议:重新打开连接,更新 API Key 后再次测试。",connectionActionFixBaseUrl:"操作建议:检查 Base URL 路径(通常以 /v1 结尾)后再次测试。",connectionActionSwitchKey:"操作建议:稍后重试,或切换其他 Key/提供方。",connectionActionRetryTest:"操作建议:检查网络/代理后再次执行测试连接。",noModelsFetching:"暂无模型,正在拉取模型列表…",firstUseGuide:"快速上手:1) /connect 2) /models 3) 发送「hello」",firstUseSendHello:"下一步:发送第一条消息(例如:「hello」)。",connectionCheckUnauthorized:"401 未授权:请检查 API Key 与提供方是否匹配。",connectionCheckForbidden:"403 禁止访问:当前 Key 可能无此提供方/模型权限。",connectionCheckNotFound:"404 未找到:请检查 Base URL 路径(OpenAI 兼容通常以 /v1 结尾)。",connectionCheckRateLimited:"429 限流:请稍后重试,或切换其他 Key/提供方。",connectionCheckTimeout:"连接超时:请检查网络/代理后重试。",connectionCheckNetwork:"网络连接失败:请检查 DNS/代理/Base URL。",connectionCheckFailed:"连接自检失败:{error}",apiKeyCleared:"已清除 {provider} 的 API Key。",customAdded:"已添加自定义提供方:{provider}。",customRenamed:"已重命名自定义提供方:{provider}。",customModelsUpdated:"已更新自定义提供方模型:{provider}。",customDeleted:"已删除自定义提供方:{provider}。",modelsRequired:"至少需要一个模型。",modelsEmpty:"未获取到模型。",modelsFetchFailed:"模型拉取失败:{error}",modelsFetchChatCompletions:"当 Base URL 为 /chat/completions 或 /responses 时不支持拉取模型。",manualModelsRequired:"此端点不支持自动发现模型。请在模型配置中手动输入模型名称。",nameRequired:"提供方名称不能为空。",nameConflict:"提供方名称已存在。"}},copyToast:{copiedToClipboard:"已复制到剪贴板"}};var zh_Hant_default={common:{apply:"套用",cancel:"取消",close:"關閉",confirm:"確認",yes:"是",no:"否",exit:"結束",back:"返回",next:"下一步",save:"儲存",empty:"—",unknownError:"未知錯誤",inputClearTip:"Ctrl+C 清除",total:"總計"},configDialog:{title:"設定",hint:"Tab/Shift+Tab 切換欄位 • Enter 套用 • Esc 取消",modelsTitle:"模型(自訂)",modelsPlaceholder:"model-a, model-b",contextWindowTitle:"上下文視窗",contextWindowLocked:"上下文視窗(模型定義)",contextWindowPlaceholder:"128000",temperatureTitle:"Temperature",temperaturePlaceholder:"0.7",temperatureValidationError:"Temperature:只能輸入數字和「.」",maxTokensTitle:"最大輸出 Token 數",maxTokensPlaceholder:"32000",baseUrlTitle:"Base URL(OpenAI 相容)",baseUrlPlaceholder:"https://api.openai.com/v1",apiKeyCurrentPrefix:"目前:",apiKeyNotSet:"(未設定)",apiKeyTitle:"API 金鑰",apiKeyPlaceholder:"貼上新 Key 以更新(留空保持不變)",interleavedThinkingTitle:"交錯思考(空格切換)",interleavedThinkingLocked:"交錯思考(模型定義)",interleavedThinkingOpen:"開啟",interleavedThinkingClose:"關閉",tipIntensityTitle:"提示強度",tipIntensityOff:"關閉",tipIntensityLow:"低",tipIntensityStandard:"標準",shortcutsTitle:"快捷鍵",shortcutCommandsLabel:"命令面板",shortcutTimelineLabel:"時間線",shortcutNewSessionLabel:"新工作階段",shortcutsPlaceholder:"如 mod+p",shortcutsHint:"使用 mod/ctrl/alt/shift + 鍵(a-z, 0-9, F1-F12)。"},languageDialog:{title:"語言",hint:"Enter 套用 • Esc 取消",languageTitle:"語言",languageEnglish:"English",languageChinese:"简体中文",languageJapanese:"日本語",languageKorean:"한국어",languageTraditionalChinese:"繁體中文",languageIndonesian:"Bahasa Indonesia",languageGerman:"Deutsch",languageFrench:"Français",languageSpanish:"Español",languagePortugueseBrazil:"Português (Brasil)",languagePortuguesePortugal:"Português (Portugal)"},reasoningEffortDialog:{title:"思考強度",hint:"Enter 套用 • Esc 取消",effortTitle:"推理強度",applied:"推理強度已設為 {effort}",option:{low:"低",medium:"中",high:"高",xhigh:"超高",max:"最大",minimal:"極簡",none:"無",off:"關閉",auto:"自動"}},toolSettingsDialog:{title:"工具設定",hint:"Enter 套用 • Esc 取消",websearchTitle:"WebSearch API 金鑰",apiKeyCurrentPrefix:"目前:",apiKeyNotSet:"(未設定)",apiKeyInvalidCjk:"API Key 不能包含中文字元。",apiKeyInvalidSpaces:"API Key 不能包含空格。",apiKeyPlaceholder:"貼上 Serper API Key"},pluginsDialog:{title:"外掛程式",hint:"選擇一個外掛程式進行設定 • Esc 關閉",serperSearch:"Serper Search",serperSearchDetail:"透過 Serper API 進行網路搜尋",configured:"已設定",notConfigured:"未設定",serperConfigTitle:"Serper Search 設定",serperConfigHint:"Tab 切換 • Enter 套用 • Esc 取消"},skillsDialog:{title:"技能",hint:"Enter 套用 • Esc 取消",empty:"尚無可用技能",emptyFiltered:"無符合技能"},timelineDialog:{title:"時間軸",hint:"Tab 篩選 • Enter 開啟 • Esc 關閉",empty:"尚無訊息",emptyFiltered:"無符合項目",filterAll:"所有訊息",filterUser:"使用者訊息",filterTool:"工具呼叫"},mcpSettingsDialog:{title:"MCP",hint:"編輯 mcp.json 檔案以設定 MCP 伺服器 • Esc 關閉",configFileLabel:"設定檔:",noServersHint:"尚未設定 MCP 伺服器。",serverCount:"已設定 {count} 個伺服器",guideText:"編輯上方檔案以新增或修改 MCP 伺服器。",openFile:"開啟檔案",reload:"重新載入",close:"關閉",reloaded:"MCP 設定已重新載入。",reloadFailed:"重新載入失敗:{error}",status:"狀態",toolCount:"工具數",disabled:"停用",testConnection:"測試",testing:"正在測試連線...",testComplete:"測試完成。",testPartial:"測試完成(有錯誤)。",testFailed:"連線失敗:{error}",invalidJson:"JSON 無效:{error}",invalidShape:"MCP JSON 無效:需要「mcpServers」。",invalidServer:"MCP 伺服器設定無效:{name}",noServers:"沒有找到 MCP 伺服器。",lintOk:"JSON 語法正確",lintAt:"{error}(第 {line} 行,第 {column} 列)",lintUnclosed:"未閉合的 {char}(第 {line} 行,第 {column} 列)",lintInvalid:"{error}",exampleFormat:"範例格式:"},toolApprovalsDialog:{title:"工具核准",useAuto:"自動",useNormal:"一般",useStrict:"嚴格",close:"關閉",focusedTitleAuto:"自動",focusedTitleNormal:"一般",focusedTitleStrict:"嚴格",focusedTitleClose:"關閉",focusedDescAuto:"所有工具自動執行,不再提示(最快,最不安全)。",focusedDescNormal:"讀取類自動通過,寫入類需確認。",focusedDescStrict:"所有工具均須確認(最安全,最慢)。",focusedDescClose:"關閉此對話方塊,不變更目前設定。",currentPrefix:"目前:{mode}",tip:"提示:Tab 或 ↑/↓ 在按鈕間移動,Enter 確認,Esc 關閉。"},settingsDialog:{pendingApproval:"請先處理待核准請求再變更設定。",invalidShortcut:"快捷鍵無效:{label}({value})",shortcutCommands:"命令面板快捷鍵",shortcutTimeline:"時間線快捷鍵",shortcutNewSession:"新工作階段快捷鍵",toolApprovalsApplied:"工具核准:{mode}",applied:"設定已套用。"},exitAppDialog:{title:"結束 DimCode",confirm:"現在結束?",warning:"仍有回應在進行中,結束將中斷它。",reasonPrefix:"原因:{reason}"},approvalDialog:{title:"工具權限核准",toolLabel:"工具:{tool}{suffix}",toolLabelSuffix:"({description})",permissionLabel:"權限:{permission}({risk})",descriptionLabel:"說明:{description}",commandLabel:"命令:",inlineActionHint:"↑/← 上一個 ↓/→ 下一個 Enter 確認 1/2/3 選擇",inlineActionHintCompact:"←/→ 移動 Enter 確認 1/2/3 選擇",buttons:{approve:"核准",alwaysApprove:"總是核准",deny:"拒絕",always:"總是",ok:"確定",no:"否",y:"Y",all:"全",n:"N"}},askUserDialog:{noQuestionsTitle:"沒有問題",noQuestionsBody:"沒有需要回答的問題。",title:"問題 {index}/{total}:{header}",defaultHeader:"問題",prev:"上一題",next:"下一題",submit:"提交",otherOption:"其他",otherDetail:"填寫自訂答案",inlineHintOptions:"按 ↑↓ 移動,按 ←→ 切題,按 Enter 選擇。",inlineHintMulti:"多選:按 Space 勾選或取消勾選。",inlineHintButtons:"按 Tab 切到按鈕,按 ←→ 切換,按 Enter 觸發,按 ↑ 回到選項。",inlineHintNav:"Ctrl+Left / Ctrl+Right(或 Ctrl+A / Ctrl+E)切換問題。",inlineHintSubmit:"Ctrl+Enter 提交,Esc 取消。",inlineButtonPrev:"[上一題]",inlineButtonNext:"[下一題]",inlineButtonSubmit:"[提交]",inlineButtonCancel:"[取消]",inlineActionHint:"Space 選擇 ← 上一題 → 下一題 Enter 下一題/提交 Esc 取消",inlineActionHintCompact:"Space 選擇 ←/→ 切題 Enter 下一題/提交 Esc 取消",optionsSummaryAll:"共 {count} 個選項",optionsSummaryVisibleMore:"共 {count} 個選項({start}-{end})↓ 更多",multiSelectHint:"[多選] 空格切換,Enter 確認",singleSelectHint:"[單選] 方向鍵移動,Enter 確認",customAnswerLabel:"自訂答案:",customAnswerPlaceholder:"請輸入答案…",otherPlaceholder:"已選「其他」:輸入自訂答案,Enter 填入。"},nextApiOAuthDialog:{title:"DimCode OAuth 登入",copyUrl:"複製連結",login:"登入",logout:"登出",statusTitle:"狀態",statusAuthenticated:"✓ 已登入:{email}",statusLoading:"⏳ 正在驗證…",statusNotLoggedIn:"✗ 未登入",instructionAuthenticated:"使用 ↑↓ 導覽,Enter 選擇,或按 1-9",instructionLoading:"若瀏覽器未開啟,按 C 複製下方連結",instructionNeedsSetup:"請檢查 DimCode OAuth client 的 redirect_uri、scope 和啟用狀態後重試",instructionWithUrl:"按 C 複製下方 OAuth 連結,或按 Enter 開啟瀏覽器",instructionUnauthed:"按 Enter 使用 DimCode OAuth 登入,或按 Esc 關閉",instructionManualCallback:"複製下方 URL,在瀏覽器中登入,然後把重新導向的網址貼到輸入框。",oauthUrlTitleLoading:"OAuth 連結(瀏覽器未開啟時複製)",oauthUrlTitleReady:"OAuth 連結(可直接使用)",scrollIndicator:" [{start}-{end} / 共 {total}]",selectModelTitle:"選擇模型(↑↓/1-9,Enter 選擇){indicator}",aboutTitle:"關於 DimCode OAuth",setupTitle:"OAuth 登入異常",aboutBulletOne:"• 內建使用 DimCode OAuth client",aboutBulletTwo:"• 登入後會擷取 relay 模型並儲存 provider 設定",aboutBulletThree:"• 使用 OAuth refresh token,而不是長期 API Key",viewAllPlans:"檢視所有方案 →",useModel:"Use Model",submitCallbackUrl:"Submit URL",defaultAccount:"DimCode 帳號",callbackUrlLabel:"Remote? Paste callback URL here (Enter to submit, Esc to close)",callbackUrlPlaceholder:"http://localhost:PORT/auth/callback?code=…&state=…",callbackUrlHint:"Press Enter to submit. Esc to close.",toast:{generatingUrl:"正在產生 OAuth 連結…",urlReady:"OAuth 連結已就緒!複製或按 Enter 開啟瀏覽器。",generateUrlFailed:"產生 OAuth 連結失敗:{error}",startingLogin:"正在開始 OAuth 登入…",browserOpened:"已開啟瀏覽器,如未開啟請從對話方塊複製連結。",copyUrlToLogin:"請從對話方塊複製 OAuth 連結登入。",urlCopied:"OAuth 連結已複製到剪貼簿。",urlCopyFailed:"複製 OAuth 連結失敗。",authSuccess:"已成功通過 DimCode OAuth 驗證!",loginFailed:"OAuth 登入失敗:{error}",loggedOut:"已登出 DimCode OAuth",loggedOutWithRemoteWarning:"已登出 DimCode OAuth,但伺服器端撤銷失敗:{error}",logoutFailed:"登出失敗:{error}",initFailed:"初始化對話方塊失敗:{error}",modelSwitched:"已切換模型:{model}",selectModelFailed:"選擇模型失敗:{error}",submittingCallbackUrl:"Submitting callback URL…",callbackUrlNoPending:"no pending OAuth session (reopen the dialog)",callbackUrlMissingFields:"callback URL is missing the code or state parameter"}},debugTryDialog:{titleDebug:"偵錯",titleDebugging:"偵錯中",copy:"複製",proceed:"繼續",fixed:"已修正",body:"我已新增偵錯日誌(並可能修正了問題)。請現在嘗試重現,然後選擇結果。"},exitSessionDialog:{title:"結束工作階段",confirm:"結束目前工作階段並返回首頁?",note:"下一則訊息將開啟新的工作階段。"},messageActionsDialog:{title:"訊息操作",revert:"撤回訊息",revertWithFiles:"撤回訊息及檔案變更",revertKeepFiles:"撤回訊息(保留檔案變更)",revertFilesOnly:"只回復檔案變更",copy:"複製訊息文字到剪貼簿",fork:"分叉建立新工作階段",pin:"置頂訊息",unpin:"取消置頂"},pathPickerDialog:{hint:"↑/↓ 選擇 • Tab 補全 • Enter 確認 • Esc 關閉"},providerConnectDialog:{title:"連線 {provider}",providerFallback:"提供者",hint:"Tab 切換 • Ctrl+C 清除 • Enter 套用",hintOpenAI:"Tab 切換 • Ctrl+C 清除 • Enter 套用",hintGemini:"Tab 切換 • Ctrl+C 清除 • Enter 套用",hintAnthropic:"Tab 切換 • Ctrl+C 清除 • Enter 套用",hintGeneric:"Tab 切換 • Ctrl+C 清除 • Enter 套用",applyingHint:"正在測試連線,請稍候...",applyingButton:"套用中...",testConnection:"測試連線",baseUrlStatusAutoFix:"自動修正:{value}",baseUrlStatusInvalid:"Base URL 必須是 http(s)",baseUrlTitle:"Base URL",baseUrlPlaceholder:"https://api.example.com/v1",apiKeyTitle:"API 金鑰",apiKeyPlaceholder:"貼上新 Key 以更新(留空保持不變)",apiKeyCurrent:"目前:{value}",apiKeyNotSet:"目前:(未設定)",apiKeyInvalidCjk:"API Key 不能包含中文字元。",apiKeyInvalidSpaces:"API Key 不能包含空格。",clearKey:"刪除金鑰",useDetectedKey:"使用 {name}",disconnectButton:"斷開連線",autoPromptCacheKeyTitle:"auto prompt_cache_key",sessionIdTitle:"session_id",toggleOff:"關",toggleOn:"開",toggleHint:"Tab 切換 • ←/→ 調整 • Space 切換"},redoConfirmDialog:{title:"確認重做",body:"確定要復原已撤回的訊息嗎?"},renameSessionDialog:{title:"重新命名工作階段",label:"工作階段名稱",placeholder:"例如:規劃筆記"},sessionsDialog:{timeNow:"剛剛",timeMinutes:"{count} 分鐘",timeHours:"{count} 小時",timeDays:"{count} 天",newSession:"新工作階段",title:"工作階段({count})",titleScoped:"工作階段({count}/{total})",scope:"範圍:{cwd}",loading:"載入中…",confirmDelete:"確認刪除:再次按 Delete",header:"{count} 個工作階段 • 方向鍵導覽 • Enter 選擇{range}{activity}",headerRange:" • 顯示 {start}-{end}",runningCount:"執行中 {count} 個",pausedCount:"等待確認 {count} 個",hint:"輸入以跳轉 • ←/→ 按鈕 • Enter 確認 • Esc 關閉",focusPrefix:"焦點:{focus}",focusList:"列表",focusButtons:"按鈕",noSessionsCwd:"目前目錄沒有工作階段",noSessions:"暫無已儲存的工作階段",nodeOnly:"工作階段僅在 Node/CLI 模式可用。",newSessionTitle:"新工作階段",newSessionTarget:"一個新的工作階段",busy:{agentResponding:"助理仍在回應",awaitingAskUser:"等待 AskUser 回覆",awaitingToolApproval:"等待工具核准",pendingApproval:"等待核准"},buttons:{open:"開啟",delete:"刪除",deleteConfirm:"刪除(確認)",scope:"範圍:{scope}",scopeCwd:"目前目錄",scopeAll:"全部",refresh:"重新整理"}},sessionsOverlay:{title:"會話",hint:"Enter 選擇 • Esc 關閉 • Ctrl+R 重新整理 • Ctrl+W 範圍",loading:"正在載入會話...",empty:"尚無已儲存的會話。",loadingMore:"載入更多…",hasMore:"↓ 更多",scope:{cwdOnly:"僅當前目錄",allCwd:"所有目錄"}},switchSessionDialog:{title:"切換工作階段",confirm:"切換並中斷",target:"切換到 {target}?",fallback:"現在切換工作階段?",warning:"這將中斷目前工作階段的回應/流程。",reason:"原因:{reason}"},themeDialog:{title:"主題",hint:"Enter 套用 • Esc 取消",mode:"模式",light:"淺色",dark:"深色",unavailable:"目前終端機不支援可切換主題。",fallback:"這裡會固定使用備用的淺色/深色 ANSI 主題。",tip:"提示:預設跟隨系統主題。"},commandPalette:{searchPlaceholder:"搜尋…",noMatches:"無相符項",hint:"輸入篩選 • Enter: 開啟 • Esc: 關閉",title:"命令"},skills:{title:"技能"},help:{title:"說明",modeLabel:"模式:{mode}",modeDetail:"目前助理模式。",shortcutsLabel:"快捷鍵",onboarding:`歡迎使用!快速上手:
1170
1170
  1) /connect:連線提供者
1171
1171
  2) /models:選擇模型
1172
1172
  3) 傳送「hello」開始對話
@@ -1212,7 +1212,7 @@ tc:${toolCalls}`}function userTranscriptSignature(msg){let content=String(msg.co
1212
1212
  `).trim()}function messagePersistenceSignature(message){if(message.role==="assistant"){let sig=assistantPersistenceSignature(message);return sig?`assistant:${sig}`:""}if(message.role==="user"){let sig=userPersistenceSignature(message);return sig?`user:${sig}`:""}return""}function snapshotId2(snapshot){let obj=snapshot&&typeof snapshot==="object"?snapshot:null;return String(obj?.sessionId??obj?.id??"").trim()}function collectAnchoredAssistantRoundsForPersistence(messages,opts){let rounds=new Map,lastUser=null;for(let i2=0;i2<messages.length;i2++){let current=messages[i2];if(current?.role==="user"){lastUser=current;continue}if(!current||current.role!=="assistant")continue;if(!opts.include(current))continue;let round=[];if(lastUser)round.push(lastUser);round.push(current);let assistantSig=messagePersistenceSignature(current);if(!assistantSig)continue;let key=`${lastUser?messagePersistenceSignature(lastUser):""}
1213
1213
  ---
1214
1214
  ${assistantSig}`;rounds.delete(key),rounds.set(key,round)}return[...rounds.values()].slice(-opts.limit).flat().map(clonePersistableValue)}function collectInterruptedRoundMessagesForPersistence(messages){return collectAnchoredAssistantRoundsForPersistence(messages,{limit:INTERRUPTED_PERSISTED_MESSAGE_LIMIT2,include:isInterruptedAssistantMessage})}function collectCompactMessagesForPersistence(messages){let unique=new Map;for(let m2 of messages){if(!m2||m2.role!=="assistant")continue;let id2=String(m2?.id??"").trim();if(!isCompactTranscriptMessageId(id2))continue;if(id2.startsWith("compact-restored-")||id2.startsWith("restored-compact-"))continue;if(!m2.parts.some((p2)=>{if(p2.type==="markdown")return String(p2?.markdown??"").trim().length>0;if(p2.type==="info")return String(p2?.text??"").trim().length>0;return!1}))continue;let sig=messagePersistenceSignature(m2);if(!sig)continue;unique.delete(sig),unique.set(sig,m2)}let out=[...unique.values()];if(out.length<=COMPACT_PERSISTED_MESSAGE_LIMIT2)return out;return out.slice(-COMPACT_PERSISTED_MESSAGE_LIMIT2)}function collectCompressionMessagesForPersistence(messages){let unique=new Map;for(let m2 of messages){if(!m2||m2.role!=="assistant")continue;let id2=String(m2?.id??"").trim();if(!isCompressionTranscriptMessageId(id2))continue;if(id2.startsWith("compression-restored-")||id2.startsWith("restored-compression-"))continue;if(!m2.parts.some((p2)=>{if(p2.type==="markdown")return String(p2?.markdown??"").trim().length>0;if(p2.type==="info")return String(p2?.text??"").trim().length>0;return!1}))continue;let sig=messagePersistenceSignature(m2);if(!sig)continue;unique.delete(sig),unique.set(sig,m2)}let out=[...unique.values()];if(out.length<=COMPRESSION_PERSISTED_MESSAGE_LIMIT2)return out;return out.slice(-COMPRESSION_PERSISTED_MESSAGE_LIMIT2)}function clonePersistableValue(value){return JSON.parse(JSON.stringify(value))}function assistantMessageHasDurableTranscriptParts(message){if(!message||message.role!=="assistant")return!1;return message.parts.some((part)=>{if(part.type==="markdown")return String(part.markdown??"").trim().length>0;if(part.type==="thinking")return String(part.content??"").trim().length>0;if(part.type==="tool_call")return!0;if(part.type==="tool_result")return!0;return!1})}function hasPendingTranscriptTail(messages){for(let index=messages.length-1;index>=0;index-=1){let message=messages[index];if(!message)continue;if(message.role==="tool")continue;if(message.role==="user")return!0;if(message.role==="assistant")return!assistantMessageHasDurableTranscriptParts(message);return!1}return!1}function collectErrorMessagesForPersistence(messages){return collectAnchoredAssistantRoundsForPersistence(messages,{limit:ERROR_PERSISTED_MESSAGE_LIMIT2,include:isErrorAssistantMessage})}function buildSupplementalUiPayload(messages){let interruptedMessages=collectInterruptedRoundMessagesForPersistence(messages).map(clonePersistableValue),compact=collectCompactMessagesForPersistence(messages),compactMessages=uiMessagesToSnapshotMessages(compact),compression=collectCompressionMessagesForPersistence(messages),compressionMessages=uiMessagesToSnapshotMessages(compression),errorMessages2=collectErrorMessagesForPersistence(messages);return{interruptedMessages,compactMessages,compressionMessages,errorMessages:errorMessages2}}function serializeSupplementalSignature(payload){try{return JSON.stringify(payload)}catch{return""}}function createDimSdkPersistence(opts){let storeRef=null,persistEnabled=!opts.deferPersist,schedulePersist=null,lastSupplementalSig=null,seedSupplementalSignature=(sessionId)=>{let id2=String(sessionId??"").trim();if(!id2||!storeRef){lastSupplementalSig=null;return}let payload=buildSupplementalUiPayload(storeRef.state.messages);lastSupplementalSig={sessionId:id2,sig:serializeSupplementalSignature(payload)}},hydratedMcpServers=Array.isArray(opts.mcpServers)?JSON.parse(JSON.stringify(opts.mcpServers)):[],hydratedMcpPhase=normalizeMcpPhase(opts.mcpPhase),hydratedMcpConnectedCount=Math.max(0,Number(opts.mcpConnectedCount)||0),hydratedMcpConfiguredCount=Math.max(0,Number(opts.mcpConfiguredCount)||hydratedMcpServers.length),backend=opts.sessionsBackend??null,sessions=backend?{async list(options){let page=normalizeBackendSessionListResult(await backend.list(options));return{sessions:page.sessions.map(snapshotToListItem).filter((item)=>Boolean(item)),...page.nextCursor?{nextCursor:page.nextCursor}:{}}},async get(id2){let sessionId=String(id2??"").trim();if(!sessionId)return;return backend.get(sessionId)},async reload(id2){let sessionId=String(id2??"").trim();if(!sessionId||!storeRef)return!1;if(String(storeRef.state.sessionId??"")!==sessionId)return!1;if(storeRef.state.runningAgentRound)return!1;if(storeRef.state.paused)return!1;if(storeRef.state.approval?.active?.status==="pending")return!1;let snapshot=await backend.get(sessionId);if(!snapshot)return!1;hydrateStoreFromSnapshot(storeRef,snapshot,{preserveLocalSyntheticErrors:!0,preserveLocalInterruptedMessages:!0,preserveLocalCompactMessages:!0,preserveLocalCompressionMessages:!0}),seedSupplementalSignature(sessionId);let invalidator=opts.agent;if(invalidator?.invalidateSession)invalidator.invalidateSession(sessionId);return!0},async use(id2){let sessionId=String(id2??"").trim();if(!sessionId||!storeRef)return;if(String(storeRef.state.sessionId??"")===sessionId)return;let snapshot=await backend.get(sessionId);if(!snapshot)return;hydrateStoreFromSnapshot(storeRef,snapshot),seedSupplementalSignature(sessionId);let invalidator=opts.agent;if(invalidator?.invalidateSession)invalidator.invalidateSession(sessionId)},async createNew(){if(!storeRef)return;let snapshot=await backend.create();if(!snapshot)return;let newSessionId=snapshotId2(snapshot);if(hydrateStoreFromSnapshot(storeRef,snapshot),newSessionId)seedSupplementalSignature(newSessionId);if(newSessionId){let invalidator=opts.agent;if(invalidator?.invalidateSession)invalidator.invalidateSession(newSessionId)}},async delete(id2){let sessionId=String(id2??"").trim();if(!sessionId)return;if(await backend.destroy(sessionId),storeRef&&String(storeRef.state.sessionId??"")===sessionId)storeRef.state.sessionId=""},async rename(id2,title){if(!storeRef)return;if(typeof backend.rename!=="function")return;let sessionId=String(id2??"").trim(),nextTitle=String(title??"").trim();if(!sessionId||!nextTitle)return;let snapshot=await backend.rename(sessionId,nextTitle);if(snapshot&&String(storeRef.state.sessionId??"")===sessionId)hydrateStoreFromSnapshot(storeRef,snapshot,{preserveLocalSyntheticErrors:!0,preserveLocalInterruptedMessages:!0,preserveLocalCompactMessages:!0,preserveLocalCompressionMessages:!0}),seedSupplementalSignature(sessionId)},async updateMetadata(id2,metadata){if(typeof backend.updateMetadata!=="function")return;let sessionId=String(id2??"").trim();if(!sessionId)return;await backend.updateMetadata(sessionId,metadata)},async fork(opts2){if(!storeRef)return;let seed=Array.isArray(opts2?.messages)?opts2.messages:[];if(typeof backend.createWithMessages!=="function"){let snapshot2=await backend.create();if(snapshot2)storeRef.state.sessionId=snapshotId2(snapshot2);storeRef.replaceMessages(seed),storeRef.clearRevertedMessages(),storeRef.state.selectedToolCallId=null,storeRef.resetSessionUsageState(),storeRef.state.lastRequestBudget=null;return}let snapshot=await backend.createWithMessages(uiMessagesToSnapshotMessages(stripSupplementalTranscriptMessages(seed)));if(!snapshot)return;hydrateStoreFromSnapshot(storeRef,snapshot),seedSupplementalSignature(snapshotId2(snapshot))}}:void 0,replaceObjectContents=(target,source)=>{for(let key of Object.keys(target))delete target[key];Object.assign(target,source)},ensureStoreMcpState=(store3)=>{let current=store3.state.mcp;if(current&&Array.isArray(current.servers)){if(typeof current.phase!=="string")current.phase="ready";if(typeof current.connectedCount!=="number")current.connectedCount=0;if(typeof current.configuredCount!=="number")current.configuredCount=Array.isArray(current.servers)?current.servers.length:0;return current}return store3.state.mcp={servers:[],phase:"ready",connectedCount:0,configuredCount:0},store3.state.mcp},applyHydratedMcpState=(store3)=>{let mcpState=ensureStoreMcpState(store3),nextServers=JSON.parse(JSON.stringify(hydratedMcpServers));mcpState.servers.splice(0,mcpState.servers.length,...nextServers),mcpState.phase=hydratedMcpPhase,mcpState.connectedCount=hydratedMcpConnectedCount,mcpState.configuredCount=hydratedMcpConfiguredCount},applyHydration=(store3,cache,config3,tools)=>{let changed=!1,saved=config3.settings??{},providerId=normalizeProviderId(saved.providerId),provider=store3?.state.provider;if(!provider)return!1;if(providerId)provider.activeId=providerId;let connections=saved.providerConnections??{},normalizedConnections=Object.fromEntries(Object.entries(connections).map(([id2,conn])=>{let apiKey=readOptionalString3(conn?.apiKey),baseUrl=readOptionalString3(conn?.baseUrl),models=(Array.isArray(conn?.models)?conn.models:[]).map((m2)=>{let model=m2&&typeof m2==="object"?m2:{},id3=readOptionalString3(model.id);if(!id3)return null;let name15=readOptionalString3(model.name),limit=normalizeLimit2(model.limit),vision=typeof model.vision==="boolean"?model.vision:void 0,reasoning=model.reasoning?.supported?{supported:!0,default:model.reasoning.default}:void 0;return{id:id3,...name15?{name:name15}:{},...limit?{limit}:{},...model.userDefined===!0||model.outputIsUserDefined===!0?{userDefined:!0}:{},...typeof vision==="boolean"?{vision}:{},...reasoning?{reasoning}:{}}}).filter((m2)=>Boolean(m2));return[id2,{...apiKey?{apiKey}:{},...baseUrl?{baseUrl}:{},...models.length?{models}:{}}]}));provider.connections=normalizedConnections;let activeByProvider=saved.activeModelByProvider??{};provider.activeModelByProvider={...activeByProvider??{}};let toProviderAdapter=(value)=>{if(value==="openai"||value==="openai-responses"||value==="gemini"||value==="anthropic")return value;return},toCustomProviderId=(value)=>{if(typeof value==="string"&&value.startsWith("cp_"))return value;return},customProviders=Array.isArray(saved.customProviders)?saved.customProviders.map((p2)=>{let entry=p2&&typeof p2==="object"?p2:{},models=(Array.isArray(entry.models)?entry.models:[]).map((m2)=>{let model=m2&&typeof m2==="object"?m2:{},id3=readOptionalString3(model.id);if(!id3)return null;let name16=readOptionalString3(model.name),limit=normalizeLimit2(model.limit),vision=typeof model.vision==="boolean"?model.vision:void 0,reasoning=model.reasoning?.supported?{supported:!0,default:model.reasoning.default}:void 0;return{id:id3,...name16?{name:name16}:{},...limit?{limit}:{},...model.userDefined===!0||model.outputIsUserDefined===!0?{userDefined:!0}:{},...typeof vision==="boolean"?{vision}:{},...reasoning?{reasoning}:{}}}).filter((m2)=>Boolean(m2)),id2=toCustomProviderId(readOptionalString3(entry.id)),name15=readOptionalString3(entry.name),adapter=toProviderAdapter(readOptionalString3(entry.adapter));if(!id2||!name15||!adapter)return null;let baseUrl=readOptionalString3(entry.baseUrl),apiKey=readOptionalString3(entry.apiKey);return{id:id2,name:name15,adapter,...baseUrl?{baseUrl}:{},...apiKey?{apiKey}:{},...typeof entry.responsesAutoPromptCacheKey==="boolean"?{responsesAutoPromptCacheKey:entry.responsesAutoPromptCacheKey}:{},...typeof entry.responsesUseSessionId==="boolean"?{responsesUseSessionId:entry.responsesUseSessionId}:{},models:backfillCustomProviderModels(models,{adapter})}}).filter((p2)=>Boolean(p2)):[];provider.customProviders=customProviders,hydrateToolsStateFromConfig(tools,store3.state,hydratedMcpServers),applyHydratedMcpState(store3);let savedUi=cache.settings??{},uiState=store3.state.ui,env=store3?.state?.context?.env??{};if(!readOptionalString3(env.DIMCODE_TOOL_APPROVALS)&&savedUi.toolApprovals){let raw=String(savedUi.toolApprovals),mapped=raw==="auto"||raw==="all"?"auto":raw==="strict"||raw==="manual"?"strict":"normal";store3.state.approval.mode=mapped}if(uiState){if(typeof savedUi.themeMode==="string"&&savedUi.themeMode)store3.setThemeMode(savedUi.themeMode);if(typeof savedUi.statusCompact==="boolean")uiState.statusCompact=savedUi.statusCompact;if(typeof savedUi.onboardingSeenVersion==="string"&&savedUi.onboardingSeenVersion)uiState.onboarding={...uiState.onboarding??{},lastSeenVersion:savedUi.onboardingSeenVersion};if(savedUi.shortcuts)uiState.shortcuts=normalizeShortcutBindings(savedUi.shortcuts);if(typeof savedUi.greetingLastSeenDate==="string")uiState.greeting={...uiState.greeting??{},lastSeenDate:savedUi.greetingLastSeenDate};if(savedUi.providerFunnelCounts&&typeof savedUi.providerFunnelCounts==="object"){let counts=Object.fromEntries(Object.entries(savedUi.providerFunnelCounts).map(([step,count])=>[String(step),Number(count)]).filter(([step,count])=>step&&Number.isFinite(count)&&count>0));uiState.providerFunnel={...uiState.providerFunnel??{},counts,events:Array.isArray(uiState.providerFunnel?.events)?uiState.providerFunnel.events:[]}}if(savedUi.workspaceSelectionByCwd&&typeof savedUi.workspaceSelectionByCwd==="object"){let byCwd=Object.fromEntries(Object.entries(savedUi.workspaceSelectionByCwd).map(([cwd,value])=>{let key=readOptionalString3(cwd),providerId2=readOptionalString3(value?.providerId),modelId=readOptionalString3(value?.modelId);if(!key||!providerId2)return null;return[key,{providerId:providerId2,...modelId?{modelId}:{}}]}).filter((entry)=>Boolean(entry)));uiState.workspaceSelectionByCwd=byCwd}let savedDebugMode=readPersistedDebugLogMode(savedUi.debugLogMode);uiState.debugLogging={...uiState.debugLogging??{},enabled:savedDebugMode==="auto",auto:savedDebugMode==="auto",mode:savedDebugMode,directory:readOptionalString3(savedUi.debugLogDirectory)||readOptionalString3(uiState.debugLogging?.directory)||"~/.dimcode/debug"};let savedReasoningMap=savedUi.reasoningEffortByModel;if(savedReasoningMap){let entries=Object.entries(savedReasoningMap).map(([modelId,value])=>{let key=readOptionalString3(modelId),v2=readOptionalString3(value);return key&&v2?[key,v2]:null}).filter((e2)=>Boolean(e2));uiState.reasoningEffortByModel=Object.fromEntries(entries)}}let{candidates,existingProviderIds}=buildProviderSelectionCandidates({connections:provider.connections,customProviders,legacyCustom:provider.custom,rememberedModels:{...provider.activeModelByProvider??{}}}),rememberedModels=stripUnknownActiveModelSelections({...provider.activeModelByProvider??{}},existingProviderIds);if(JSON.stringify(provider.activeModelByProvider??{})!==JSON.stringify(rememberedModels))provider.activeModelByProvider=rememberedModels,changed=!0;if(uiState){let sanitizedWorkspaceSelections=sanitizeWorkspaceProviderSelections({workspaceSelections:uiState.workspaceSelectionByCwd,candidates,rememberedModels});if(JSON.stringify(uiState.workspaceSelectionByCwd??{})!==JSON.stringify(sanitizedWorkspaceSelections))uiState.workspaceSelectionByCwd=sanitizedWorkspaceSelections,changed=!0}let selection=resolveProviderSelection({candidates,preferredProviderId:String(provider.activeId??"").trim(),preferredModelId:String(store3.state.config.model??"").trim(),rememberedModels}),nextProviderId=String(selection.providerId??"").trim(),nextModelId=String(selection.modelId??"").trim();if(String(provider.activeId??"").trim()!==nextProviderId)provider.activeId=nextProviderId,changed=!0;if(String(store3.state.config.model??"").trim()!==nextModelId)store3.state.config.model=nextModelId,changed=!0;if(backend){let currentId=String(store3.state.sessionId??"").trim();if(currentId)backend.get(currentId).then((snapshot)=>{if(snapshot&&storeRef)hydrateStoreFromSnapshot(storeRef,snapshot,{preserveLocalSyntheticErrors:!0,preserveLocalInterruptedMessages:!0,preserveLocalCompactMessages:!0,preserveLocalCompressionMessages:!0}),seedSupplementalSignature(currentId)}).catch(()=>{})}return changed};return{sessions,onStoreCreated:(store3)=>{storeRef=store3,applyHydration(store3,opts.cache,opts.config,opts.tools),registerOAuthRuntimeSyncTarget({getStore:()=>storeRef,updatePersistenceSnapshots:(next)=>{if(next.cache)replaceObjectContents(opts.cache,next.cache);if(next.config)replaceObjectContents(opts.config,next.config)},invalidateSession:(sessionId)=>{let invalidator=opts.agent;if(invalidator?.invalidateSession)invalidator.invalidateSession(sessionId)}});let persist=createDebouncedAsyncTask(async()=>{try{let nextCache=buildUserCacheFromStore({prev:opts.cache,store:store3}),nextConfig=buildUserConfigFromStore({prev:opts.config,store:store3}),nextTools=buildUserToolsFromStore({prev:opts.tools,store:store3}),mcpServers=Array.isArray(store3.state?.mcp?.servers)?store3.state.mcp.servers:[],mcpPhase=normalizeMcpPhase(store3.state?.mcp?.phase),saves=[saveDimcodeUserCache(opts.cacheFile,nextCache),saveDimcodeUserConfig(opts.configFile,nextConfig),saveDimcodeUserTools(opts.toolsFile,nextTools)];if(opts.mcpJsonFile&&(mcpPhase==="ready"||mcpPhase==="error"))saves.push(saveMcpJson(opts.mcpJsonFile,mcpServers));await Promise.all(saves)}catch(e2){console.warn("[dimcode] Failed to persist cache:",e2)}},300);schedulePersist=()=>{if(!persistEnabled)return;persist.schedule()};let persistSupplementalTranscript=createDebouncedAsyncTask(async()=>{if(!backend||typeof backend.updateMetadata!=="function")return;let sessionId=String(store3.state.sessionId??"").trim();if(!sessionId)return;if(store3.state.runningAgentRound)return;if(hasPendingTranscriptTail(store3.state.messages))return;let payload=buildSupplementalUiPayload(store3.state.messages),sig=serializeSupplementalSignature(payload);if(lastSupplementalSig&&lastSupplementalSig.sessionId===sessionId&&lastSupplementalSig.sig===sig)return;try{await backend.updateMetadata(sessionId,{ui:payload}),lastSupplementalSig={sessionId,sig}}catch{}},0),scheduleSupplementalPersist=()=>{persistSupplementalTranscript.schedule()};if(watch(()=>store3.state.sessionId,schedulePersist),watch(()=>store3.state.config,schedulePersist,{deep:!0}),watch(()=>store3.state.context,schedulePersist,{deep:!0}),watch(()=>store3.state.approval.mode,schedulePersist),watch(()=>store3.state.ui?.locale,schedulePersist),watch(()=>store3.state.ui?.theme,schedulePersist,{deep:!0}),watch(()=>store3.state.ui?.statusCompact,schedulePersist),watch(()=>store3.state.ui?.onboarding,schedulePersist,{deep:!0}),watch(()=>store3.state.ui?.shortcuts,schedulePersist,{deep:!0}),watch(()=>store3.state.ui?.greeting,schedulePersist,{deep:!0}),watch(()=>store3.state.ui?.debugLogging,schedulePersist,{deep:!0}),watch(()=>store3.state.provider,schedulePersist,{deep:!0}),watch(()=>store3.state.tools,schedulePersist,{deep:!0}),watch(()=>store3.state.mcp?.servers,schedulePersist,{deep:!0}),watch(()=>store3.state.sessionId,scheduleSupplementalPersist),watch(()=>store3.state.messages.length,scheduleSupplementalPersist),watch(()=>store3.state.runningAgentRound,(running,prev)=>{if(prev&&!running)scheduleSupplementalPersist()}),opts.toolsRef)watch(()=>store3.state.tools,(newTools)=>{if(newTools)opts.toolsRef.current={...opts.toolsRef.current,websearch:{...opts.toolsRef.current?.websearch,apiKey:newTools.websearch?.apiKey??"",apiEndpoint:newTools.websearch?.apiEndpoint,numResults:newTools.websearch?.numResults},mcpServers:Array.isArray(store3.state.mcp?.servers)?JSON.parse(JSON.stringify(store3.state.mcp.servers)):opts.toolsRef.current?.mcpServers}},{deep:!0,immediate:!0}),watch(()=>store3.state.mcp?.servers,(servers)=>{opts.toolsRef.current={...opts.toolsRef.current,mcpServers:Array.isArray(servers)?JSON.parse(JSON.stringify(servers)):opts.toolsRef.current?.mcpServers}},{deep:!0,immediate:!0});schedulePersist()},rehydrate:(next)=>{if(next.cache)replaceObjectContents(opts.cache,next.cache);if(next.config)replaceObjectContents(opts.config,next.config);if(next.tools)replaceObjectContents(opts.tools,next.tools);if(Array.isArray(next.mcpServers))hydratedMcpServers=JSON.parse(JSON.stringify(next.mcpServers));if("mcpPhase"in next)hydratedMcpPhase=normalizeMcpPhase(next.mcpPhase);if("mcpConnectedCount"in next)hydratedMcpConnectedCount=Math.max(0,Number(next.mcpConnectedCount)||0);if("mcpConfiguredCount"in next)hydratedMcpConfiguredCount=Math.max(0,Number(next.mcpConfiguredCount)||hydratedMcpServers.length);else if(Array.isArray(next.mcpServers))hydratedMcpConfiguredCount=hydratedMcpServers.length;if(storeRef)applyHydration(storeRef,opts.cache,opts.config,opts.tools);if(!persistEnabled)persistEnabled=!0;schedulePersist?.()}}}async function resolveStartupSessionId(opts){return readOptionalString3(opts.envSessionId)}function createNoopToolRunner(){return async(call)=>{let name15=String(call?.name??"tool");return{id:String(call?.id??"tool"),status:"error",output:["Tool execution is handled by the DimCode agent.",`This UI cannot run tool "${name15}" locally.`].join(`
1215
- `)}}}async function createDimSdkShellProps(opts){let{context,cacheDir,cacheFile,cache,configFile,config:config3,toolsFile,tools,mcpJsonFile,mcpServers,mcpPhase,mcpConnectedCount,mcpConfiguredCount}=await createDimcodeContext({cwd:opts.cwd,env:opts.env}),fastStartRaw=String(opts.env.DIMCODE_FAST_START??"").trim().toLowerCase(),fastStart=fastStartRaw==="1"||fastStartRaw==="true"||fastStartRaw==="yes"||fastStartRaw==="on",stateDir=resolveStateDir(cacheDir,opts.env);applyStateDirEnv({env:opts.env,contextEnv:context.env,stateDir});let toolsRef={current:{...tools.settings??{},mcpServers:JSON.parse(JSON.stringify(mcpServers))}},toolsConfig={websearch:{apiKey:()=>toolsRef.current?.websearch?.apiKey??"",apiEndpoint:toolsRef.current?.websearch?.apiEndpoint,numResults:toolsRef.current?.websearch?.numResults}},uiForcedSkills=new Set,agent=createCliAgent({context,processEnv:opts.env,stateDir,tools:toolsConfig,mcpServers:()=>toMcpServerConfigs(toolsRef.current?.mcpServers),mcpInitialState:"deferred"}),cliDebugDirectory=readOptionalString3(opts.debugDirectory),startupDebugCache=opts.enablePersistentDebugAuto&&fastStart&&!cliDebugDirectory?await loadDimcodeUserCache(opts.env).then((result)=>result.cache).catch(()=>cache):cache,persistedDebugMode=readPersistedDebugLogMode(startupDebugCache.settings?.debugLogMode),startupDebugSource=cliDebugDirectory?"cli":opts.enablePersistentDebugAuto&&persistedDebugMode==="auto"?"auto":"none",startupDebugDirectory=resolveDebugLogDirectory(cliDebugDirectory||readOptionalString3(startupDebugCache.settings?.debugLogDirectory)||void 0);if(startupDebugSource==="auto")await cleanupOldDebugJsonlLogs(startupDebugDirectory);if(startupDebugSource!=="none")await agent.setDebugLogState?.({enabled:!0,directory:startupDebugDirectory,reason:startupDebugSource==="auto"?"debug auto startup":"debug cli flag"});let sessionsBackend=agent.sessions??null,initialSessionId=await resolveStartupSessionId({sessionsBackend,envSessionId:opts.sessionId});opts.env.DIMCODE_SESSION_ID=initialSessionId??"",context.env.DIMCODE_SESSION_ID=initialSessionId??"";let{sessions,onStoreCreated,rehydrate}=createDimSdkPersistence({cacheFile,cache,configFile,config:config3,toolsFile,tools,mcpJsonFile,mcpServers,mcpPhase,mcpConnectedCount,mcpConfiguredCount,sessionsBackend,agent,toolsRef,deferPersist:fastStart}),storeRef=null,hydrateStarted=!1,mcpSyncQueue=Promise.resolve(),queuedMcpSignature="",activeMcpSyncSignature=null,cloneMcpServers=(servers)=>JSON.parse(JSON.stringify(Array.isArray(servers)?servers:[])),sleep=async(ms)=>{await new Promise((resolve2)=>setTimeout(resolve2,ms))},ensureStoreMcpState=(store3)=>{let current=store3.state.mcp;if(current&&Array.isArray(current.servers))return current;return store3.state.mcp={servers:[],phase:"deferred",connectedCount:0,configuredCount:0},store3.state.mcp},applyMcpRuntimeState=(phase,connectedCount,configuredCount)=>{if(!storeRef)return;let mcpState=ensureStoreMcpState(storeRef);mcpState.phase=phase,mcpState.connectedCount=Math.max(0,connectedCount),mcpState.configuredCount=Math.max(0,configuredCount)},queueMcpSync=(servers,options)=>{let nextServers=cloneMcpServers(servers),signature=JSON.stringify(nextServers);if(!options?.force&&signature===queuedMcpSignature)return;queuedMcpSignature=signature,mcpSyncQueue=mcpSyncQueue.then(async()=>{if(!storeRef)return;activeMcpSyncSignature=signature,applyMcpRuntimeState("syncing",0,nextServers.length);try{let state=await agent.syncMcpServers?.(toMcpServerConfigs(nextServers));if(!state)state=await agent.getMcpState?.();if(!state){applyMcpRuntimeState("ready",0,nextServers.length);return}applyMcpRuntimeState(state.phase,state.connectedServers.length,state.configuredServers);for(let i2=0;i2<240&&state.phase==="syncing";i2+=1)await sleep(250),state=await agent.getMcpState?.()??state,applyMcpRuntimeState(state.phase,state.connectedServers.length,state.configuredServers)}catch{applyMcpRuntimeState("error",0,nextServers.length)}finally{activeMcpSyncSignature=null}},async()=>{if(storeRef)applyMcpRuntimeState("error",0,nextServers.length);activeMcpSyncSignature=null})};function applyStartupDebugToStore(store3){if(startupDebugSource==="none")return;let uiState=store3.state.ui??{};store3.state.ui=uiState,uiState.debugLogging={...uiState.debugLogging??{},enabled:!0,auto:startupDebugSource==="auto",mode:startupDebugSource==="auto"?"auto":"on",directory:startupDebugDirectory}}let hydrateFromDisk=async()=>{if(hydrateStarted)return;hydrateStarted=!0;try{let reloadEnv={...opts.env,DIMCODE_FAST_START:"0"},full=await createDimcodeContext({cwd:opts.cwd,env:reloadEnv});if(rehydrate({cache:full.cache,config:full.config,tools:full.tools,mcpServers:full.mcpServers,mcpPhase:"syncing",mcpConnectedCount:0,mcpConfiguredCount:full.mcpServers.length}),!storeRef)return;if(full.context.cwd)storeRef.setCwd(full.context.cwd);if(full.context.focusFiles)storeRef.setFocusFiles(full.context.focusFiles);let nextEnv=full.context.env??{};for(let[key,value]of Object.entries(nextEnv))storeRef.setEnvVar(key,value);let envReader=createEnvReader(full.context.env??{}),nextRun=resolveInitialRunConfig(envReader),modelFromProvider=String(storeRef.state.config.model??"").trim();if(storeRef.state.config={...storeRef.state.config,...nextRun},modelFromProvider)storeRef.state.config.model=modelFromProvider;applyStartupDebugToStore(storeRef),queueMcpSync(full.mcpServers,{force:!0})}catch{}},onStoreCreatedWithHydrate=(store3)=>{storeRef=store3,onStoreCreated(store3),applyStartupDebugToStore(store3),watch(()=>JSON.stringify(store3.state.mcp?.servers??[]),()=>{queueMcpSync(cloneMcpServers(store3.state.mcp?.servers??[]))}),watch(()=>String(store3.state.mcp?.phase??""),(phase)=>{if(phase!=="syncing"||activeMcpSyncSignature)return;queueMcpSync(cloneMcpServers(store3.state.mcp?.servers??[]),{force:!0})}),queueMicrotask(()=>{if(!fastStart){queueMcpSync(cloneMcpServers(store3.state.mcp?.servers??[]),{force:!0});return}hydrateFromDisk()})};return{toolRunner:createNoopToolRunner(),context,agent,onStoreCreated:onStoreCreatedWithHydrate,sessions,uiForcedSkills}}import{spawn as spawn4}from"node:child_process";import path37 from"node:path";var import_semver2=__toESM(require_semver2(),1);var import_semver=__toESM(require_semver2(),1);function isPrereleaseVersion(version3){let parsed=import_semver.default.valid(version3);return Boolean(parsed&&import_semver.default.prerelease(parsed)?.length)}function resolveUpdateTrack(current){return isPrereleaseVersion(current)?"prerelease":"stable"}function selectUpdateVersion(versions3,track="stable"){return versions3.map((version3)=>import_semver.default.valid(String(version3??"").trim())).filter((version3)=>Boolean(version3)).filter((version3)=>track==="prerelease"?isPrereleaseVersion(version3):!isPrereleaseVersion(version3)).sort(import_semver.default.rcompare)[0]??null}function shouldInstallSelectedVersion(current,selected){let currentVersion=import_semver.default.valid(String(current??"").trim()),selectedVersion=import_semver.default.valid(String(selected??"").trim());if(!currentVersion||!selectedVersion)return String(current??"").trim()!==String(selected??"").trim();if(import_semver.default.eq(currentVersion,selectedVersion))return!1;if(import_semver.default.gt(selectedVersion,currentVersion))return!0;return isPrereleaseVersion(currentVersion)&&!isPrereleaseVersion(selectedVersion)}var UPGRADE_TOAST_FILE="upgrade-toast.json";function notifyUpgradeToast(message){let text=String(message??"").trim();if(!text)return;let handler=globalThis?.__DIMCODE_UPGRADE_TOAST__;if(typeof handler==="function")try{handler(text);return}catch{}writeUpgradeToastFile(text)}async function writeUpgradeToastFile(message){try{let[{mkdir:mkdir12,writeFile:writeFile11},path36]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env);await mkdir12(dir,{recursive:!0});let filePath=path36.join(dir,UPGRADE_TOAST_FILE),payload=JSON.stringify({message,createdAt:Date.now()});await writeFile11(filePath,payload,"utf8")}catch{}}async function consumeUpgradeToastFile(){try{let[{readFile:readFile12,unlink:unlink2},path36]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env),filePath=path36.join(dir,UPGRADE_TOAST_FILE),raw=await readFile12(filePath,"utf8");unlink2(filePath).catch(()=>{});let data=JSON.parse(raw);return String(data?.message??"").trim()||null}catch{return null}}import{existsSync as existsSync3,readFileSync as readFileSync2}from"node:fs";import path36 from"node:path";import{fileURLToPath as fileURLToPath4}from"node:url";function resolveCliVersion(){let injected="0.0.66-beta.0".trim();if(injected)return{version:injected,source:"injected"};let pkgVersion=readNearestPackageVersion();if(pkgVersion)return{version:pkgVersion,source:"package"};return null}function readNearestPackageVersion(){try{let dir=path36.dirname(fileURLToPath4(import.meta.url));for(let i2=0;i2<6;i2++){let candidate=path36.join(dir,"package.json");if(existsSync3(candidate)){let raw=readFileSync2(candidate,"utf8"),pkg=JSON.parse(raw),version3=typeof pkg?.version==="string"?pkg.version.trim():"";if(version3)return version3}let parent=path36.dirname(dir);if(parent===dir)break;dir=parent}}catch{}return null}var DEFAULT_GITLAB_HOST="gitlab.bfbops.com",DEFAULT_GITLAB_PROJECT="nextim/goatagent",DEFAULT_GITHUB_REPO="nextim/goatagent",DEFAULT_GITHUB_API_BASE_URL="https://api.github.com",RELEASE_CHECK_TIMEOUT_MS=5000;var RELEASE_LIST_PER_PAGE=100,RELEASE_LIST_MAX_PAGES=3,autoBinaryUpgradeStartedVersions=new Set;function getReleaseTimeoutMs(){let raw=String(process.env.DIMCODE_BINARY_UPDATE_CHECK_TIMEOUT_MS??"").trim(),n2=Number(raw);return Number.isFinite(n2)&&n2>100?Math.floor(n2):RELEASE_CHECK_TIMEOUT_MS}function isSelfContainedBinary(proc=process){try{let execPath=String(proc.execPath??"").trim();if(!execPath)return!1;let base=path37.basename(execPath.replace(/\\/g,"/")).toLowerCase();if(base==="node"||base.startsWith("node."))return!1;if(base==="bun"||base.startsWith("bun."))return!1;return!0}catch{return!1}}function resolveBunTarget(platform=process.platform,arch=process.arch){if(platform==="darwin"&&arch==="arm64")return"bun-darwin-arm64";if(platform==="darwin"&&arch==="x64")return"bun-darwin-x64";if(platform==="linux"&&arch==="x64")return"bun-linux-x64";if(platform==="linux"&&arch==="arm64")return"bun-linux-arm64";if(platform==="win32"&&arch==="x64")return"bun-windows-x64";return null}function resolveAssetName(target,platform=process.platform){return platform==="win32"?`dim-${target}.exe`:`dim-${target}`}function normalizeTagToSemver(tag){let raw=String(tag??"").trim();if(!raw)return null;let withoutV=raw.startsWith("v")?raw.slice(1):raw;return import_semver2.default.valid(withoutV)?withoutV:null}function selectGitHubAsset(releaseJson,assetName){let assets=Array.isArray(releaseJson?.assets)?releaseJson.assets:[];for(let asset of assets){let name15=typeof asset?.name==="string"?asset.name:"",url3=typeof asset?.browser_download_url==="string"?asset.browser_download_url:"";if(name15===assetName&&url3)return{name:name15,url:url3}}return null}function selectGitLabAsset(releaseJson,assetName){let links=Array.isArray(releaseJson?.assets?.links)?releaseJson.assets.links:[];for(let link of links){let name15=typeof link?.name==="string"?link.name:"",direct=typeof link?.direct_asset_url==="string"?link.direct_asset_url:"",url3=typeof link?.url==="string"?link.url:"",resolved=direct||url3;if(name15===assetName&&resolved)return{name:name15,url:resolved}}return null}async function checkBinaryUpgrade(){if(process.env.DIMCODE_DISABLE_AUTOUPDATE==="1")return null;if(!isSelfContainedBinary())return null;let current=resolveCliVersion()?.version;if(!current||!import_semver2.default.valid(current))return null;let release2=await fetchLatestReleaseInfo(process.env,current);if(!release2)return null;if(!import_semver2.default.valid(release2.version)||!shouldInstallSelectedVersion(current,release2.version))return null;if(process.env.DIMCODE_AUTOUPDATE!=="0"){if(autoBinaryUpgradeStartedVersions.has(release2.version))return null;return autoBinaryUpgradeStartedVersions.add(release2.version),startAutoBinaryUpgrade(release2.version),`Update available: dim ${release2.version} (current: ${current}). Installing in background; restart to use it.`}return`Update available: dim ${release2.version} (current: ${current}). Run: dim upgrade`}function resolveProvider(env){if(String(env.DIMCODE_BINARY_UPDATE_PROVIDER??"").trim().toLowerCase()==="github")return"github";if((typeof __CLI_BINARY_UPDATE_PROVIDER__==="string"?__CLI_BINARY_UPDATE_PROVIDER__.trim().toLowerCase():"")==="github")return"github";return"gitlab"}function resolveBinaryUpdateConfig(env){let provider=resolveProvider(env),githubApiBaseUrl=resolveGitHubApiBaseUrl(env),projectInfo=resolveProject(env,provider);return{provider,host:projectInfo.host,project:projectInfo.project,githubApiBaseUrl}}function resolveGitHubApiBaseUrl(env){let raw=String(env.DIMCODE_BINARY_UPDATE_GITHUB_API_BASE_URL??"").trim();if(raw)return raw.replace(/\/+$/,"");let injected=typeof __CLI_BINARY_UPDATE_GITHUB_API_BASE_URL__==="string"?__CLI_BINARY_UPDATE_GITHUB_API_BASE_URL__.trim():"";if(injected)return injected.replace(/\/+$/,"");return DEFAULT_GITHUB_API_BASE_URL}function resolveProject(env,provider){if(provider==="github"){let injectedRepo=typeof __CLI_BINARY_UPDATE_REPO__==="string"?__CLI_BINARY_UPDATE_REPO__.trim():"";return{project:String(env.DIMCODE_BINARY_UPDATE_REPO??injectedRepo??DEFAULT_GITHUB_REPO).trim()||DEFAULT_GITHUB_REPO}}let injectedHost=typeof __CLI_BINARY_UPDATE_GITLAB_HOST__==="string"?__CLI_BINARY_UPDATE_GITLAB_HOST__.trim():"",injectedProject=typeof __CLI_BINARY_UPDATE_PROJECT__==="string"?__CLI_BINARY_UPDATE_PROJECT__.trim():"",host=String(env.DIMCODE_BINARY_UPDATE_GITLAB_HOST??injectedHost??DEFAULT_GITLAB_HOST).trim()||DEFAULT_GITLAB_HOST,project=String(env.DIMCODE_BINARY_UPDATE_PROJECT??injectedProject??DEFAULT_GITLAB_PROJECT).trim()||DEFAULT_GITLAB_PROJECT;return{host,project}}function resolveAuthHeaders(env,provider){if(provider==="github"){let token2=String(env.DIMCODE_GITHUB_TOKEN??env.GITHUB_TOKEN??"").trim();return token2?{Authorization:`Bearer ${token2}`}:{}}let token=String(env.DIMCODE_GITLAB_TOKEN??env.GITLAB_TOKEN??"").trim();if(!token)return{};if(token.startsWith("glpat-"))return{"PRIVATE-TOKEN":token};return{Authorization:`Bearer ${token}`}}async function fetchLatestReleaseInfo(env,currentVersion){return await fetchReleaseInfo("latest",env,currentVersion)}async function fetchReleaseInfo(desired,env,currentVersion){let config3=resolveBinaryUpdateConfig(env),provider=config3.provider,projectInfo={host:config3.host,project:config3.project},headers=resolveAuthHeaders(env,provider),target=resolveBunTarget();if(!target)return null;let assetName=resolveAssetName(target);if(desired==="latest")return await fetchLatestSelectableReleaseInfo({provider,host:projectInfo.host,project:projectInfo.project,headers,githubApiBaseUrl:config3.githubApiBaseUrl,target,assetName,currentVersion});let tagCandidates=buildTagCandidates(desired);for(let tagCandidate of tagCandidates){let releaseJson=await fetchReleaseJson({provider,host:projectInfo.host,project:projectInfo.project,tag:tagCandidate,headers,githubApiBaseUrl:config3.githubApiBaseUrl});if(!releaseJson)continue;let info=releaseInfoFromJson({releaseJson,provider,host:projectInfo.host,project:projectInfo.project,target,assetName,fallbackTag:tagCandidate});if(info)return info}return null}async function fetchLatestSelectableReleaseInfo(opts){let releases=[];for(let page=1;page<=RELEASE_LIST_MAX_PAGES;page+=1){let releaseJsonList=await fetchReleaseListJson({...opts,page});if(!Array.isArray(releaseJsonList)||releaseJsonList.length===0)break;for(let releaseJson of releaseJsonList){let info=releaseInfoFromJson({releaseJson,provider:opts.provider,host:opts.host,project:opts.project,target:opts.target,assetName:opts.assetName});if(info)releases.push(info)}if(releaseJsonList.length<RELEASE_LIST_PER_PAGE)break}let selected=selectUpdateVersion(releases.map((release2)=>release2.version),resolveUpdateTrack(opts.currentVersion??""));if(!selected)return null;return releases.find((release2)=>release2.version===selected)??null}function releaseInfoFromJson(opts){let tag=String(opts.releaseJson?.tag_name??opts.releaseJson?.tagName??"").trim()||String(opts.fallbackTag??"").trim(),version3=normalizeTagToSemver(tag);if(!version3)return null;let asset=opts.provider==="github"?selectGitHubAsset(opts.releaseJson,opts.assetName):selectGitLabAsset(opts.releaseJson,opts.assetName);if(!asset)return null;return{provider:opts.provider,host:opts.host,project:opts.project,tag,version:version3,asset,target:opts.target,assetName:opts.assetName}}function buildTagCandidates(versionOrTag){let raw=String(versionOrTag??"").trim();if(!raw)return[];if(raw==="latest")return["latest"];if(raw.startsWith("v"))return[raw,raw.slice(1)];return[`v${raw}`,raw]}async function fetchReleaseJson(opts){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),getReleaseTimeoutMs());try{let url3=buildReleaseApiUrl(opts),response=await fetch(url3,{headers:{Accept:"application/json",...opts.headers},signal:controller.signal});if(!response.ok)return null;return await response.json()}catch{return null}finally{clearTimeout(timeoutId)}}async function fetchReleaseListJson(opts){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),getReleaseTimeoutMs());try{let url3=buildReleaseListApiUrl(opts),response=await fetch(url3,{headers:{Accept:"application/json",...opts.headers},signal:controller.signal});if(!response.ok)return null;let json2=await response.json();return Array.isArray(json2)?json2:null}catch{return null}finally{clearTimeout(timeoutId)}}function buildReleaseApiUrl(opts){if(opts.provider==="github"){let apiBase=String(opts.githubApiBaseUrl||DEFAULT_GITHUB_API_BASE_URL).replace(/\/+$/,"");if(opts.tag==="latest")return`${apiBase}/repos/${opts.project}/releases/latest`;return`${apiBase}/repos/${opts.project}/releases/tags/${encodeURIComponent(opts.tag)}`}let host=opts.host||DEFAULT_GITLAB_HOST,projectId=encodeURIComponent(opts.project);if(opts.tag==="latest")return`https://${host}/api/v4/projects/${projectId}/releases/permalink/latest`;return`https://${host}/api/v4/projects/${projectId}/releases/${encodeURIComponent(opts.tag)}`}function buildReleaseListApiUrl(opts){let page=Math.max(1,Math.floor(opts.page));if(opts.provider==="github")return`${String(opts.githubApiBaseUrl||DEFAULT_GITHUB_API_BASE_URL).replace(/\/+$/,"")}/repos/${opts.project}/releases?per_page=${RELEASE_LIST_PER_PAGE}&page=${page}`;let host=opts.host||DEFAULT_GITLAB_HOST,projectId=encodeURIComponent(opts.project);return`https://${host}/api/v4/projects/${projectId}/releases?per_page=${RELEASE_LIST_PER_PAGE}&page=${page}`}function startAutoBinaryUpgrade(version3){try{spawn4(process.execPath,["upgrade",version3,"--background"],{stdio:"ignore",detached:!0,env:{...process.env,DIMCODE_BINARY_UPGRADE_CHILD:"1"}}).unref()}catch{}}var import_cross_spawn2=__toESM(require_cross_spawn(),1);import{existsSync as existsSync5,promises as fsPromises}from"node:fs";import path39 from"node:path";import{existsSync as existsSync4,readFileSync as readFileSync3,realpathSync,statSync as statSync2}from"node:fs";import path38 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";function resolveCurrentInstallTarget(opts){let execPath=normalizeExistingPath(opts.execPath);if(opts.isSelfContainedBinary)return{kind:"binary",manager:"binary",binPath:execPath??normalizePath2(opts.execPath)};let wrapperName=String(opts.env?.DIMCODE_NPM_PACKAGE??"").trim()||"dimcode",wrapperRoot=normalizeExistingPath(opts.env?.DIMCODE_NPM_PACKAGE_ROOT),importPath=pathFromFileUrl(opts.importMetaUrl),argvPath=normalizeExistingPath(opts.argvPath),binPath=argvPath??normalizePath2(opts.argvPath);if(wrapperRoot){let bun=resolveBunGlobalTarget(wrapperRoot,wrapperName,binPath);if(bun)return bun;let npm=resolveNpmGlobalTarget(wrapperRoot,wrapperName,binPath);if(npm)return npm;return{kind:"unknown",manager:"unknown",packageRoot:wrapperRoot,binPath,reason:`${wrapperName} wrapper root is not a recognized global install`}}let candidates=uniqueStrings([importPath,argvPath,normalizeExistingPath(importPath),execPath]);for(let candidate of candidates){let packageRoot=findPackageRoot(candidate,wrapperName);if(!packageRoot)continue;let sourceEntry=path38.join(packageRoot,"src","cli.ts");if(existsSync4(sourceEntry))return{kind:"source",manager:"source",packageRoot,binPath};let bun=resolveBunGlobalTarget(packageRoot,wrapperName,binPath);if(bun)return bun;let npm=resolveNpmGlobalTarget(packageRoot,wrapperName,binPath);if(npm)return npm;return{kind:"unknown",manager:"unknown",packageRoot,binPath,reason:`${wrapperName} package root is not a recognized global install`}}return{kind:"unknown",manager:"unknown",binPath,reason:`unable to locate ${wrapperName} package root`}}function resolveBunGlobalTarget(packageRoot,wrapperName,binPath){let normalized=toPosix(packageRoot),marker16=`/.bun/install/global/node_modules/${wrapperName}`;if(!normalized.includes(marker16))return null;let index=normalized.lastIndexOf(marker16),prefix=index>=0?packageRoot.slice(0,index+5):void 0;return{kind:"bun",manager:"bun",packageRoot,binPath,prefix}}function resolveNpmGlobalTarget(packageRoot,wrapperName,binPath){let parts=toPosix(packageRoot).split("/");if(parts.at(-1)!==wrapperName)return null;let nodeModulesIndex=parts.length-2;if(parts[nodeModulesIndex]!=="node_modules")return null;let hasLibSegment=parts[nodeModulesIndex-1]==="lib",prefixParts=hasLibSegment?parts.slice(0,nodeModulesIndex-1):parts.slice(0,nodeModulesIndex),prefix=fromPosix(prefixParts.join("/"))||path38.parse(packageRoot).root;if(!prefix)return null;if(!hasLibSegment&&existsSync4(path38.join(prefix,"package.json")))return{kind:"unknown",manager:"unknown",packageRoot,binPath,reason:`${wrapperName} appears to be installed in a local node_modules`};return{kind:"npm",manager:"npm",packageRoot,binPath,prefix}}function findPackageRoot(startPath,wrapperName){let normalized=normalizeExistingPath(startPath);if(!normalized)return null;let dir=isLikelyFilePath(normalized)?path38.dirname(normalized):normalized;for(;;){let packagePath=path38.join(dir,"package.json");if(existsSync4(packagePath)&&readPackageName(packagePath)===wrapperName)return dir;let parent=path38.dirname(dir);if(!parent||parent===dir)return null;dir=parent}}function readPackageName(packagePath){try{let parsed=JSON.parse(readFileSync3(packagePath,"utf8"));return typeof parsed?.name==="string"?parsed.name:""}catch{return""}}function pathFromFileUrl(value){try{return value.startsWith("file:")?fileURLToPath5(value):void 0}catch{return}}function normalizeExistingPath(value){let normalized=normalizePath2(value);if(!normalized)return;try{return realpathSync(normalized)}catch{return normalized}}function normalizePath2(value){let raw=String(value??"").trim();if(!raw)return;if(!path38.isAbsolute(raw))return;return path38.resolve(raw)}function uniqueStrings(values){return[...new Set(values.filter((v2)=>Boolean(v2)))]}function isLikelyFilePath(value){if(existsSync4(value))try{return statSync2(value).isFile()}catch{}return Boolean(path38.extname(value))}function toPosix(value){return value.replace(/\\/g,"/")}function fromPosix(value){if(path38.sep==="/")return value;return value.replace(/\//g,path38.sep)}var DEFAULT_PACKAGE_NAME="dimcode";function resolveWrapperPackageVersion(){return(process.env.DIMCODE_NPM_PACKAGE_VERSION||"").trim()||null}var DEBUG_LOG_PATH=process.env.DIMCODE_DEBUG_LOG||"./dimcode-debug.log",CHECK_TIMEOUT_MS=5000,autoInstallStartedVersions=new Set;async function fetchPackageVersions(packageName=DEFAULT_PACKAGE_NAME){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),CHECK_TIMEOUT_MS);try{let response=await fetch(`https://registry.npmjs.org/${packageName}`,{signal:controller.signal,headers:{Accept:"application/json"}});if(!response.ok)throw Error(`npm registry returned ${response.status}`);let versions3=(await response.json())?.versions;if(!versions3||typeof versions3!=="object")throw Error("No versions found in registry response");return Object.keys(versions3)}catch(error41){if(error41 instanceof Error&&error41.name==="AbortError")throw Error("npm registry request timed out");throw error41}finally{clearTimeout(timeoutId)}}async function resolveLatestNpmVersion(packageName,currentVersion){return selectUpdateVersion(await fetchPackageVersions(packageName),resolveUpdateTrack(currentVersion))}async function checkNpmUpgrade(packageName=DEFAULT_PACKAGE_NAME){if(await logUpgradeCheck("start",{disableAutoUpdate:process.env.DIMCODE_DISABLE_AUTOUPDATE==="1",autoUpdate:process.env.DIMCODE_AUTOUPDATE!=="0",cwd:safeCwd(),argv:safeArgv(),debugLogPath:DEBUG_LOG_PATH}),process.env.DIMCODE_DISABLE_AUTOUPDATE==="1")return await logUpgradeCheck("skip-disabled"),null;let resolvedVersion=resolveCliVersion();if(!resolvedVersion?.version)return await logUpgradeCheck("skip-missing-version"),null;let wrapperVersion=packageName!==DEFAULT_PACKAGE_NAME?resolveWrapperPackageVersion():null,current=wrapperVersion||resolvedVersion.version,hasInjectedVersion=resolvedVersion.source==="injected";try{let latest=await resolveLatestNpmVersion(packageName,current);if(await logUpgradeCheck("check-result",{current,latest,hasInjectedVersion,wrapperVersion,updateTrack:resolveUpdateTrack(current)}),!latest)return await logUpgradeCheck("error",{message:"Failed to fetch latest version"}),null;if(!shouldInstallSelectedVersion(current,latest))return await logUpgradeCheck("no-update",{current,latest}),null;if(process.env.DIMCODE_AUTOUPDATE!=="0"&&hasInjectedVersion){let installer=resolvePackageInstaller(latest,packageName);if(!installer)return await logUpgradeCheck("autoupdate-skip-unknown-install-target",{current,latest,target:resolveNpmInstallTarget()}),`Update available: ${packageName}@${latest} (current: ${current}). Auto-update skipped because the current install source could not be identified. Run: dim version`;let installKey=`${packageName}@${latest}:${installer.manager}:${installer.prefix??""}`;if(autoInstallStartedVersions.has(installKey))return await logUpgradeCheck("autoupdate-skip-duplicate",{version:latest}),null;return autoInstallStartedVersions.add(installKey),await logUpgradeCheck("update-available",{current,latest,autoUpdate:!0,installer:installer.manager,prefix:installer.prefix}),startAutoInstall(latest,packageName,installer),`Update available: ${packageName}@${latest} (current: ${current}). Installing ${installer.manager} global package in background. Restart terminal after it finishes.`}return await logUpgradeCheck("update-available",{current,latest,autoUpdate:!1}),`Update available: ${packageName}@${latest} (current: ${current})`}catch(error41){return await logUpgradeCheck("error",{message:error41 instanceof Error?error41.message:String(error41)}),null}}function startAutoInstall(version3,packageName=DEFAULT_PACKAGE_NAME,installer){try{logUpgradeCheck("autoupdate-start",{version:version3,installer:installer.manager,prefix:installer.prefix});let proc=import_cross_spawn2.default(installer.command,[...installer.argsPrefix,...installer.installArgs],{stdio:"ignore",detached:!0,windowsHide:process.platform==="win32"});proc.unref();let finished=!1,finalize2=(message)=>{if(finished)return;finished=!0,logUpgradeCheck("autoupdate-finish",{version:version3,message}),notifyUpgradeToast(message)};proc.on("close",(code)=>{if(code===0)finalize2(`Update installed: ${packageName}@${version3}. Restart terminal to use the new version.`);else finalize2(`Auto-update failed. Run: ${installer.manualCommand}`)}),proc.on("error",()=>{logUpgradeCheck("autoupdate-error",{version:version3,reason:"process-error"}),finalize2(`Auto-update failed. Run: ${installer.manualCommand}`)})}catch{logUpgradeCheck("autoupdate-error",{version:version3,reason:"spawn-throw"}),notifyUpgradeToast(`Auto-update failed. Run: ${installer.manualCommand}`)}}async function logUpgradeCheck(_event,_data){}function safeCwd(){try{return process.cwd()}catch{return}}function safeArgv(){try{return process.argv}catch{return}}function resolveNpmInstallTarget(){return resolveCurrentInstallTarget({importMetaUrl:import.meta.url,argvPath:process.argv[1],execPath:process.execPath,env:process.env,isSelfContainedBinary:!1})}function resolvePackageInstaller(version3,packageName=DEFAULT_PACKAGE_NAME){let target=resolveNpmInstallTarget(),manager=target.manager==="npm"||target.manager==="bun"?target.manager:null;if(!manager)return null;let{command,argsPrefix}=resolvePackageManagerCommand(manager),packageSpec=`${packageName}@${version3}`,prefix=manager==="npm"?target.prefix:void 0,installArgs=manager==="npm"?["install","-g","--prefer-online",...prefix?["--prefix",prefix]:[],packageSpec]:["install","-g",packageSpec];return{manager,command,argsPrefix,installArgs,manualCommand:manager==="npm"?formatManualCommand(["npm","install","-g","--prefer-online",...prefix?["--prefix",prefix]:[],packageSpec]):`bun install -g ${packageSpec}`,prefix}}function formatManualCommand(args){return args.map(quoteShellArg).join(" ")}function quoteShellArg(value){if(/^[\w./:@%+=,-]+$/.test(value))return value;return JSON.stringify(value)}function resolvePackageManagerCommand(pm){if(process.platform!=="win32")return{command:pm,argsPrefix:[]};if(pm==="bun")return resolveBunCommand();return resolveNpmCommand()}function resolveBunCommand(){let execPath=String(process.execPath??"").trim();if(execPath){if(path39.basename(execPath).toLowerCase().startsWith("bun")&&existsSync5(execPath))return{command:execPath,argsPrefix:[]}}let bunHome=String(process.env.BUN_INSTALL??"").trim();if(bunHome){let bunExe=path39.join(bunHome,"bin","bun.exe");if(existsSync5(bunExe))return{command:bunExe,argsPrefix:[]}}return{command:"bun",argsPrefix:[]}}function resolveNpmCommand(){let execPath=String(process.execPath??"").trim(),execDir=execPath?path39.dirname(execPath):"";if(execDir){let npmCmd=path39.join(execDir,"npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]};let npmCliCandidates=[path39.join(execDir,"node_modules","npm","bin","npm-cli.js"),path39.resolve(execDir,"..","lib","node_modules","npm","bin","npm-cli.js")];if(execPath){for(let npmCli of npmCliCandidates)if(existsSync5(npmCli))return{command:execPath,argsPrefix:[npmCli]}}}let appData=String(process.env.APPDATA??"").trim();if(appData){let npmCmd=path39.join(appData,"npm","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFiles=String(process.env.ProgramFiles??"").trim();if(programFiles){let npmCmd=path39.join(programFiles,"nodejs","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFilesX86=String(process.env["ProgramFiles(x86)"]??"").trim();if(programFilesX86){let npmCmd=path39.join(programFilesX86,"nodejs","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}return{command:"npm",argsPrefix:[]}}function getNpmPackageOverride(){return(process.env.DIMCODE_NPM_PACKAGE||"").trim()||void 0}async function checkUpgrade(){let npmPackage=getNpmPackageOverride();if(npmPackage)return await checkNpmUpgrade(npmPackage);if(isSelfContainedBinary())return await checkBinaryUpgrade();return await checkNpmUpgrade()}import process25 from"node:process";var logger=debugLog2;async function cleanupExpiredSessionCaches3(opts){return cleanupExpiredSessionCaches2({...opts,logger})}var DEFAULT_LINE_THRESHOLD=400,DEFAULT_TOKEN_THRESHOLD=12000,DEFAULT_PREVIEW_LINES=20,DEFAULT_FIRST_RANGE_LINES=300,DEFAULT_PREVIEW_MAX_LINE_CHARS=240,DEFAULT_PREVIEW_MAX_CHARS=4000;function isNodeLike3(){let p2=globalThis.process;return Boolean(p2&&typeof p2?.versions?.node==="string")}function estimateTokens(text){let raw=String(text??""),chars=raw.length,bytes=Buffer.byteLength(raw,"utf-8"),nonAsciiChars=0;for(let i2=0;i2<raw.length;i2++)if(raw.charCodeAt(i2)>127)nonAsciiChars++;let asciiChars=Math.max(0,chars-nonAsciiChars),byChars=Math.ceil(chars/4),byBytes=Math.ceil(bytes/3),byMixed=Math.ceil(asciiChars/4+nonAsciiChars*0.9);return Math.max(byChars,byBytes,byMixed)}function countLines3(text){if(!text)return 0;return text.split(`
1215
+ `)}}}async function createDimSdkShellProps(opts){let{context,cacheDir,cacheFile,cache,configFile,config:config3,toolsFile,tools,mcpJsonFile,mcpServers,mcpPhase,mcpConnectedCount,mcpConfiguredCount}=await createDimcodeContext({cwd:opts.cwd,env:opts.env}),fastStartRaw=String(opts.env.DIMCODE_FAST_START??"").trim().toLowerCase(),fastStart=fastStartRaw==="1"||fastStartRaw==="true"||fastStartRaw==="yes"||fastStartRaw==="on",stateDir=resolveStateDir(cacheDir,opts.env);applyStateDirEnv({env:opts.env,contextEnv:context.env,stateDir});let toolsRef={current:{...tools.settings??{},mcpServers:JSON.parse(JSON.stringify(mcpServers))}},toolsConfig={websearch:{apiKey:()=>toolsRef.current?.websearch?.apiKey??"",apiEndpoint:toolsRef.current?.websearch?.apiEndpoint,numResults:toolsRef.current?.websearch?.numResults}},uiForcedSkills=new Set,agent=createCliAgent({context,processEnv:opts.env,stateDir,tools:toolsConfig,mcpServers:()=>toMcpServerConfigs(toolsRef.current?.mcpServers),mcpInitialState:"deferred"}),cliDebugDirectory=readOptionalString3(opts.debugDirectory),startupDebugCache=opts.enablePersistentDebugAuto&&fastStart&&!cliDebugDirectory?await loadDimcodeUserCache(opts.env).then((result)=>result.cache).catch(()=>cache):cache,persistedDebugMode=readPersistedDebugLogMode(startupDebugCache.settings?.debugLogMode),startupDebugSource=cliDebugDirectory?"cli":opts.enablePersistentDebugAuto&&persistedDebugMode==="auto"?"auto":"none",startupDebugDirectory=resolveDebugLogDirectory(cliDebugDirectory||readOptionalString3(startupDebugCache.settings?.debugLogDirectory)||void 0);if(startupDebugSource==="auto")await cleanupOldDebugJsonlLogs(startupDebugDirectory);if(startupDebugSource!=="none")await agent.setDebugLogState?.({enabled:!0,directory:startupDebugDirectory,reason:startupDebugSource==="auto"?"debug auto startup":"debug cli flag"});let sessionsBackend=agent.sessions??null,initialSessionId=await resolveStartupSessionId({sessionsBackend,envSessionId:opts.sessionId});opts.env.DIMCODE_SESSION_ID=initialSessionId??"",context.env.DIMCODE_SESSION_ID=initialSessionId??"";let{sessions,onStoreCreated,rehydrate}=createDimSdkPersistence({cacheFile,cache,configFile,config:config3,toolsFile,tools,mcpJsonFile,mcpServers,mcpPhase,mcpConnectedCount,mcpConfiguredCount,sessionsBackend,agent,toolsRef,deferPersist:fastStart}),storeRef=null,hydrateStarted=!1,mcpSyncQueue=Promise.resolve(),queuedMcpSignature="",activeMcpSyncSignature=null,cloneMcpServers=(servers)=>JSON.parse(JSON.stringify(Array.isArray(servers)?servers:[])),sleep=async(ms)=>{await new Promise((resolve2)=>setTimeout(resolve2,ms))},ensureStoreMcpState=(store3)=>{let current=store3.state.mcp;if(current&&Array.isArray(current.servers))return current;return store3.state.mcp={servers:[],phase:"deferred",connectedCount:0,configuredCount:0},store3.state.mcp},applyMcpRuntimeState=(phase,connectedCount,configuredCount)=>{if(!storeRef)return;let mcpState=ensureStoreMcpState(storeRef);mcpState.phase=phase,mcpState.connectedCount=Math.max(0,connectedCount),mcpState.configuredCount=Math.max(0,configuredCount)},queueMcpSync=(servers,options)=>{let nextServers=cloneMcpServers(servers),signature=JSON.stringify(nextServers);if(!options?.force&&signature===queuedMcpSignature)return;queuedMcpSignature=signature,mcpSyncQueue=mcpSyncQueue.then(async()=>{if(!storeRef)return;activeMcpSyncSignature=signature,applyMcpRuntimeState("syncing",0,nextServers.length);try{let state=await agent.syncMcpServers?.(toMcpServerConfigs(nextServers));if(!state)state=await agent.getMcpState?.();if(!state){applyMcpRuntimeState("ready",0,nextServers.length);return}applyMcpRuntimeState(state.phase,state.connectedServers.length,state.configuredServers);for(let i2=0;i2<240&&state.phase==="syncing";i2+=1)await sleep(250),state=await agent.getMcpState?.()??state,applyMcpRuntimeState(state.phase,state.connectedServers.length,state.configuredServers)}catch{applyMcpRuntimeState("error",0,nextServers.length)}finally{activeMcpSyncSignature=null}},async()=>{if(storeRef)applyMcpRuntimeState("error",0,nextServers.length);activeMcpSyncSignature=null})};function applyStartupDebugToStore(store3){if(startupDebugSource==="none")return;let uiState=store3.state.ui??{};store3.state.ui=uiState,uiState.debugLogging={...uiState.debugLogging??{},enabled:!0,auto:startupDebugSource==="auto",mode:startupDebugSource==="auto"?"auto":"on",directory:startupDebugDirectory}}let hydrateFromDisk=async()=>{if(hydrateStarted)return;hydrateStarted=!0;try{let reloadEnv={...opts.env,DIMCODE_FAST_START:"0"},full=await createDimcodeContext({cwd:opts.cwd,env:reloadEnv});if(rehydrate({cache:full.cache,config:full.config,tools:full.tools,mcpServers:full.mcpServers,mcpPhase:"syncing",mcpConnectedCount:0,mcpConfiguredCount:full.mcpServers.length}),!storeRef)return;if(full.context.cwd)storeRef.setCwd(full.context.cwd);if(full.context.focusFiles)storeRef.setFocusFiles(full.context.focusFiles);let nextEnv=full.context.env??{};for(let[key,value]of Object.entries(nextEnv))storeRef.setEnvVar(key,value);let envReader=createEnvReader(full.context.env??{}),nextRun=resolveInitialRunConfig(envReader),modelFromProvider=String(storeRef.state.config.model??"").trim();if(storeRef.state.config={...storeRef.state.config,...nextRun},modelFromProvider)storeRef.state.config.model=modelFromProvider;applyStartupDebugToStore(storeRef),queueMcpSync(full.mcpServers,{force:!0})}catch{}},onStoreCreatedWithHydrate=(store3)=>{storeRef=store3,onStoreCreated(store3),applyStartupDebugToStore(store3),watch(()=>JSON.stringify(store3.state.mcp?.servers??[]),()=>{queueMcpSync(cloneMcpServers(store3.state.mcp?.servers??[]))}),watch(()=>String(store3.state.mcp?.phase??""),(phase)=>{if(phase!=="syncing"||activeMcpSyncSignature)return;queueMcpSync(cloneMcpServers(store3.state.mcp?.servers??[]),{force:!0})}),queueMicrotask(()=>{if(!fastStart){queueMcpSync(cloneMcpServers(store3.state.mcp?.servers??[]),{force:!0});return}hydrateFromDisk()})};return{toolRunner:createNoopToolRunner(),context,agent,onStoreCreated:onStoreCreatedWithHydrate,sessions,uiForcedSkills}}import{spawn as spawn4}from"node:child_process";import path37 from"node:path";var import_semver2=__toESM(require_semver2(),1);var import_semver=__toESM(require_semver2(),1);function isPrereleaseVersion(version3){let parsed=import_semver.default.valid(version3);return Boolean(parsed&&import_semver.default.prerelease(parsed)?.length)}function resolveUpdateTrack(current){return isPrereleaseVersion(current)?"prerelease":"stable"}function selectUpdateVersion(versions3,track="stable"){return versions3.map((version3)=>import_semver.default.valid(String(version3??"").trim())).filter((version3)=>Boolean(version3)).filter((version3)=>track==="prerelease"?isPrereleaseVersion(version3):!isPrereleaseVersion(version3)).sort(import_semver.default.rcompare)[0]??null}function shouldInstallSelectedVersion(current,selected){let currentVersion=import_semver.default.valid(String(current??"").trim()),selectedVersion=import_semver.default.valid(String(selected??"").trim());if(!currentVersion||!selectedVersion)return String(current??"").trim()!==String(selected??"").trim();if(import_semver.default.eq(currentVersion,selectedVersion))return!1;if(import_semver.default.gt(selectedVersion,currentVersion))return!0;return isPrereleaseVersion(currentVersion)&&!isPrereleaseVersion(selectedVersion)}var UPGRADE_TOAST_FILE="upgrade-toast.json";function notifyUpgradeToast(message){let text=String(message??"").trim();if(!text)return;let handler=globalThis?.__DIMCODE_UPGRADE_TOAST__;if(typeof handler==="function")try{handler(text);return}catch{}writeUpgradeToastFile(text)}async function writeUpgradeToastFile(message){try{let[{mkdir:mkdir12,writeFile:writeFile11},path36]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env);await mkdir12(dir,{recursive:!0});let filePath=path36.join(dir,UPGRADE_TOAST_FILE),payload=JSON.stringify({message,createdAt:Date.now()});await writeFile11(filePath,payload,"utf8")}catch{}}async function consumeUpgradeToastFile(){try{let[{readFile:readFile12,unlink:unlink2},path36]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env),filePath=path36.join(dir,UPGRADE_TOAST_FILE),raw=await readFile12(filePath,"utf8");unlink2(filePath).catch(()=>{});let data=JSON.parse(raw);return String(data?.message??"").trim()||null}catch{return null}}import{existsSync as existsSync3,readFileSync as readFileSync2}from"node:fs";import path36 from"node:path";import{fileURLToPath as fileURLToPath4}from"node:url";function resolveCliVersion(){let injected="0.0.66-beta.2".trim();if(injected)return{version:injected,source:"injected"};let pkgVersion=readNearestPackageVersion();if(pkgVersion)return{version:pkgVersion,source:"package"};return null}function readNearestPackageVersion(){try{let dir=path36.dirname(fileURLToPath4(import.meta.url));for(let i2=0;i2<6;i2++){let candidate=path36.join(dir,"package.json");if(existsSync3(candidate)){let raw=readFileSync2(candidate,"utf8"),pkg=JSON.parse(raw),version3=typeof pkg?.version==="string"?pkg.version.trim():"";if(version3)return version3}let parent=path36.dirname(dir);if(parent===dir)break;dir=parent}}catch{}return null}var DEFAULT_GITLAB_HOST="gitlab.bfbops.com",DEFAULT_GITLAB_PROJECT="nextim/goatagent",DEFAULT_GITHUB_REPO="nextim/goatagent",DEFAULT_GITHUB_API_BASE_URL="https://api.github.com",RELEASE_CHECK_TIMEOUT_MS=5000;var RELEASE_LIST_PER_PAGE=100,RELEASE_LIST_MAX_PAGES=3,autoBinaryUpgradeStartedVersions=new Set;function getReleaseTimeoutMs(){let raw=String(process.env.DIMCODE_BINARY_UPDATE_CHECK_TIMEOUT_MS??"").trim(),n2=Number(raw);return Number.isFinite(n2)&&n2>100?Math.floor(n2):RELEASE_CHECK_TIMEOUT_MS}function isSelfContainedBinary(proc=process){try{let execPath=String(proc.execPath??"").trim();if(!execPath)return!1;let base=path37.basename(execPath.replace(/\\/g,"/")).toLowerCase();if(base==="node"||base.startsWith("node."))return!1;if(base==="bun"||base.startsWith("bun."))return!1;return!0}catch{return!1}}function resolveBunTarget(platform=process.platform,arch=process.arch){if(platform==="darwin"&&arch==="arm64")return"bun-darwin-arm64";if(platform==="darwin"&&arch==="x64")return"bun-darwin-x64";if(platform==="linux"&&arch==="x64")return"bun-linux-x64";if(platform==="linux"&&arch==="arm64")return"bun-linux-arm64";if(platform==="win32"&&arch==="x64")return"bun-windows-x64";return null}function resolveAssetName(target,platform=process.platform){return platform==="win32"?`dim-${target}.exe`:`dim-${target}`}function normalizeTagToSemver(tag){let raw=String(tag??"").trim();if(!raw)return null;let withoutV=raw.startsWith("v")?raw.slice(1):raw;return import_semver2.default.valid(withoutV)?withoutV:null}function selectGitHubAsset(releaseJson,assetName){let assets=Array.isArray(releaseJson?.assets)?releaseJson.assets:[];for(let asset of assets){let name15=typeof asset?.name==="string"?asset.name:"",url3=typeof asset?.browser_download_url==="string"?asset.browser_download_url:"";if(name15===assetName&&url3)return{name:name15,url:url3}}return null}function selectGitLabAsset(releaseJson,assetName){let links=Array.isArray(releaseJson?.assets?.links)?releaseJson.assets.links:[];for(let link of links){let name15=typeof link?.name==="string"?link.name:"",direct=typeof link?.direct_asset_url==="string"?link.direct_asset_url:"",url3=typeof link?.url==="string"?link.url:"",resolved=direct||url3;if(name15===assetName&&resolved)return{name:name15,url:resolved}}return null}async function checkBinaryUpgrade(){if(process.env.DIMCODE_DISABLE_AUTOUPDATE==="1")return null;if(!isSelfContainedBinary())return null;let current=resolveCliVersion()?.version;if(!current||!import_semver2.default.valid(current))return null;let release2=await fetchLatestReleaseInfo(process.env,current);if(!release2)return null;if(!import_semver2.default.valid(release2.version)||!shouldInstallSelectedVersion(current,release2.version))return null;if(process.env.DIMCODE_AUTOUPDATE!=="0"){if(autoBinaryUpgradeStartedVersions.has(release2.version))return null;return autoBinaryUpgradeStartedVersions.add(release2.version),startAutoBinaryUpgrade(release2.version),`Update available: dim ${release2.version} (current: ${current}). Installing in background; restart to use it.`}return`Update available: dim ${release2.version} (current: ${current}). Run: dim upgrade`}function resolveProvider(env){if(String(env.DIMCODE_BINARY_UPDATE_PROVIDER??"").trim().toLowerCase()==="github")return"github";if((typeof __CLI_BINARY_UPDATE_PROVIDER__==="string"?__CLI_BINARY_UPDATE_PROVIDER__.trim().toLowerCase():"")==="github")return"github";return"gitlab"}function resolveBinaryUpdateConfig(env){let provider=resolveProvider(env),githubApiBaseUrl=resolveGitHubApiBaseUrl(env),projectInfo=resolveProject(env,provider);return{provider,host:projectInfo.host,project:projectInfo.project,githubApiBaseUrl}}function resolveGitHubApiBaseUrl(env){let raw=String(env.DIMCODE_BINARY_UPDATE_GITHUB_API_BASE_URL??"").trim();if(raw)return raw.replace(/\/+$/,"");let injected=typeof __CLI_BINARY_UPDATE_GITHUB_API_BASE_URL__==="string"?__CLI_BINARY_UPDATE_GITHUB_API_BASE_URL__.trim():"";if(injected)return injected.replace(/\/+$/,"");return DEFAULT_GITHUB_API_BASE_URL}function resolveProject(env,provider){if(provider==="github"){let injectedRepo=typeof __CLI_BINARY_UPDATE_REPO__==="string"?__CLI_BINARY_UPDATE_REPO__.trim():"";return{project:String(env.DIMCODE_BINARY_UPDATE_REPO??injectedRepo??DEFAULT_GITHUB_REPO).trim()||DEFAULT_GITHUB_REPO}}let injectedHost=typeof __CLI_BINARY_UPDATE_GITLAB_HOST__==="string"?__CLI_BINARY_UPDATE_GITLAB_HOST__.trim():"",injectedProject=typeof __CLI_BINARY_UPDATE_PROJECT__==="string"?__CLI_BINARY_UPDATE_PROJECT__.trim():"",host=String(env.DIMCODE_BINARY_UPDATE_GITLAB_HOST??injectedHost??DEFAULT_GITLAB_HOST).trim()||DEFAULT_GITLAB_HOST,project=String(env.DIMCODE_BINARY_UPDATE_PROJECT??injectedProject??DEFAULT_GITLAB_PROJECT).trim()||DEFAULT_GITLAB_PROJECT;return{host,project}}function resolveAuthHeaders(env,provider){if(provider==="github"){let token2=String(env.DIMCODE_GITHUB_TOKEN??env.GITHUB_TOKEN??"").trim();return token2?{Authorization:`Bearer ${token2}`}:{}}let token=String(env.DIMCODE_GITLAB_TOKEN??env.GITLAB_TOKEN??"").trim();if(!token)return{};if(token.startsWith("glpat-"))return{"PRIVATE-TOKEN":token};return{Authorization:`Bearer ${token}`}}async function fetchLatestReleaseInfo(env,currentVersion){return await fetchReleaseInfo("latest",env,currentVersion)}async function fetchReleaseInfo(desired,env,currentVersion){let config3=resolveBinaryUpdateConfig(env),provider=config3.provider,projectInfo={host:config3.host,project:config3.project},headers=resolveAuthHeaders(env,provider),target=resolveBunTarget();if(!target)return null;let assetName=resolveAssetName(target);if(desired==="latest")return await fetchLatestSelectableReleaseInfo({provider,host:projectInfo.host,project:projectInfo.project,headers,githubApiBaseUrl:config3.githubApiBaseUrl,target,assetName,currentVersion});let tagCandidates=buildTagCandidates(desired);for(let tagCandidate of tagCandidates){let releaseJson=await fetchReleaseJson({provider,host:projectInfo.host,project:projectInfo.project,tag:tagCandidate,headers,githubApiBaseUrl:config3.githubApiBaseUrl});if(!releaseJson)continue;let info=releaseInfoFromJson({releaseJson,provider,host:projectInfo.host,project:projectInfo.project,target,assetName,fallbackTag:tagCandidate});if(info)return info}return null}async function fetchLatestSelectableReleaseInfo(opts){let releases=[];for(let page=1;page<=RELEASE_LIST_MAX_PAGES;page+=1){let releaseJsonList=await fetchReleaseListJson({...opts,page});if(!Array.isArray(releaseJsonList)||releaseJsonList.length===0)break;for(let releaseJson of releaseJsonList){let info=releaseInfoFromJson({releaseJson,provider:opts.provider,host:opts.host,project:opts.project,target:opts.target,assetName:opts.assetName});if(info)releases.push(info)}if(releaseJsonList.length<RELEASE_LIST_PER_PAGE)break}let selected=selectUpdateVersion(releases.map((release2)=>release2.version),resolveUpdateTrack(opts.currentVersion??""));if(!selected)return null;return releases.find((release2)=>release2.version===selected)??null}function releaseInfoFromJson(opts){let tag=String(opts.releaseJson?.tag_name??opts.releaseJson?.tagName??"").trim()||String(opts.fallbackTag??"").trim(),version3=normalizeTagToSemver(tag);if(!version3)return null;let asset=opts.provider==="github"?selectGitHubAsset(opts.releaseJson,opts.assetName):selectGitLabAsset(opts.releaseJson,opts.assetName);if(!asset)return null;return{provider:opts.provider,host:opts.host,project:opts.project,tag,version:version3,asset,target:opts.target,assetName:opts.assetName}}function buildTagCandidates(versionOrTag){let raw=String(versionOrTag??"").trim();if(!raw)return[];if(raw==="latest")return["latest"];if(raw.startsWith("v"))return[raw,raw.slice(1)];return[`v${raw}`,raw]}async function fetchReleaseJson(opts){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),getReleaseTimeoutMs());try{let url3=buildReleaseApiUrl(opts),response=await fetch(url3,{headers:{Accept:"application/json",...opts.headers},signal:controller.signal});if(!response.ok)return null;return await response.json()}catch{return null}finally{clearTimeout(timeoutId)}}async function fetchReleaseListJson(opts){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),getReleaseTimeoutMs());try{let url3=buildReleaseListApiUrl(opts),response=await fetch(url3,{headers:{Accept:"application/json",...opts.headers},signal:controller.signal});if(!response.ok)return null;let json2=await response.json();return Array.isArray(json2)?json2:null}catch{return null}finally{clearTimeout(timeoutId)}}function buildReleaseApiUrl(opts){if(opts.provider==="github"){let apiBase=String(opts.githubApiBaseUrl||DEFAULT_GITHUB_API_BASE_URL).replace(/\/+$/,"");if(opts.tag==="latest")return`${apiBase}/repos/${opts.project}/releases/latest`;return`${apiBase}/repos/${opts.project}/releases/tags/${encodeURIComponent(opts.tag)}`}let host=opts.host||DEFAULT_GITLAB_HOST,projectId=encodeURIComponent(opts.project);if(opts.tag==="latest")return`https://${host}/api/v4/projects/${projectId}/releases/permalink/latest`;return`https://${host}/api/v4/projects/${projectId}/releases/${encodeURIComponent(opts.tag)}`}function buildReleaseListApiUrl(opts){let page=Math.max(1,Math.floor(opts.page));if(opts.provider==="github")return`${String(opts.githubApiBaseUrl||DEFAULT_GITHUB_API_BASE_URL).replace(/\/+$/,"")}/repos/${opts.project}/releases?per_page=${RELEASE_LIST_PER_PAGE}&page=${page}`;let host=opts.host||DEFAULT_GITLAB_HOST,projectId=encodeURIComponent(opts.project);return`https://${host}/api/v4/projects/${projectId}/releases?per_page=${RELEASE_LIST_PER_PAGE}&page=${page}`}function startAutoBinaryUpgrade(version3){try{spawn4(process.execPath,["upgrade",version3,"--background"],{stdio:"ignore",detached:!0,env:{...process.env,DIMCODE_BINARY_UPGRADE_CHILD:"1"}}).unref()}catch{}}var import_cross_spawn2=__toESM(require_cross_spawn(),1);import{existsSync as existsSync5,promises as fsPromises}from"node:fs";import path39 from"node:path";import{existsSync as existsSync4,readFileSync as readFileSync3,realpathSync,statSync as statSync2}from"node:fs";import path38 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";function resolveCurrentInstallTarget(opts){let execPath=normalizeExistingPath(opts.execPath);if(opts.isSelfContainedBinary)return{kind:"binary",manager:"binary",binPath:execPath??normalizePath2(opts.execPath)};let wrapperName=String(opts.env?.DIMCODE_NPM_PACKAGE??"").trim()||"dimcode",wrapperRoot=normalizeExistingPath(opts.env?.DIMCODE_NPM_PACKAGE_ROOT),importPath=pathFromFileUrl(opts.importMetaUrl),argvPath=normalizeExistingPath(opts.argvPath),binPath=argvPath??normalizePath2(opts.argvPath);if(wrapperRoot){let bun=resolveBunGlobalTarget(wrapperRoot,wrapperName,binPath);if(bun)return bun;let npm=resolveNpmGlobalTarget(wrapperRoot,wrapperName,binPath);if(npm)return npm;return{kind:"unknown",manager:"unknown",packageRoot:wrapperRoot,binPath,reason:`${wrapperName} wrapper root is not a recognized global install`}}let candidates=uniqueStrings([importPath,argvPath,normalizeExistingPath(importPath),execPath]);for(let candidate of candidates){let packageRoot=findPackageRoot(candidate,wrapperName);if(!packageRoot)continue;let sourceEntry=path38.join(packageRoot,"src","cli.ts");if(existsSync4(sourceEntry))return{kind:"source",manager:"source",packageRoot,binPath};let bun=resolveBunGlobalTarget(packageRoot,wrapperName,binPath);if(bun)return bun;let npm=resolveNpmGlobalTarget(packageRoot,wrapperName,binPath);if(npm)return npm;return{kind:"unknown",manager:"unknown",packageRoot,binPath,reason:`${wrapperName} package root is not a recognized global install`}}return{kind:"unknown",manager:"unknown",binPath,reason:`unable to locate ${wrapperName} package root`}}function resolveBunGlobalTarget(packageRoot,wrapperName,binPath){let normalized=toPosix(packageRoot),marker16=`/.bun/install/global/node_modules/${wrapperName}`;if(!normalized.includes(marker16))return null;let index=normalized.lastIndexOf(marker16),prefix=index>=0?packageRoot.slice(0,index+5):void 0;return{kind:"bun",manager:"bun",packageRoot,binPath,prefix}}function resolveNpmGlobalTarget(packageRoot,wrapperName,binPath){let parts=toPosix(packageRoot).split("/");if(parts.at(-1)!==wrapperName)return null;let nodeModulesIndex=parts.length-2;if(parts[nodeModulesIndex]!=="node_modules")return null;let hasLibSegment=parts[nodeModulesIndex-1]==="lib",prefixParts=hasLibSegment?parts.slice(0,nodeModulesIndex-1):parts.slice(0,nodeModulesIndex),prefix=fromPosix(prefixParts.join("/"))||path38.parse(packageRoot).root;if(!prefix)return null;if(!hasLibSegment&&existsSync4(path38.join(prefix,"package.json")))return{kind:"unknown",manager:"unknown",packageRoot,binPath,reason:`${wrapperName} appears to be installed in a local node_modules`};return{kind:"npm",manager:"npm",packageRoot,binPath,prefix}}function findPackageRoot(startPath,wrapperName){let normalized=normalizeExistingPath(startPath);if(!normalized)return null;let dir=isLikelyFilePath(normalized)?path38.dirname(normalized):normalized;for(;;){let packagePath=path38.join(dir,"package.json");if(existsSync4(packagePath)&&readPackageName(packagePath)===wrapperName)return dir;let parent=path38.dirname(dir);if(!parent||parent===dir)return null;dir=parent}}function readPackageName(packagePath){try{let parsed=JSON.parse(readFileSync3(packagePath,"utf8"));return typeof parsed?.name==="string"?parsed.name:""}catch{return""}}function pathFromFileUrl(value){try{return value.startsWith("file:")?fileURLToPath5(value):void 0}catch{return}}function normalizeExistingPath(value){let normalized=normalizePath2(value);if(!normalized)return;try{return realpathSync(normalized)}catch{return normalized}}function normalizePath2(value){let raw=String(value??"").trim();if(!raw)return;if(!path38.isAbsolute(raw))return;return path38.resolve(raw)}function uniqueStrings(values){return[...new Set(values.filter((v2)=>Boolean(v2)))]}function isLikelyFilePath(value){if(existsSync4(value))try{return statSync2(value).isFile()}catch{}return Boolean(path38.extname(value))}function toPosix(value){return value.replace(/\\/g,"/")}function fromPosix(value){if(path38.sep==="/")return value;return value.replace(/\//g,path38.sep)}var DEFAULT_PACKAGE_NAME="dimcode";function resolveWrapperPackageVersion(){return(process.env.DIMCODE_NPM_PACKAGE_VERSION||"").trim()||null}var DEBUG_LOG_PATH=process.env.DIMCODE_DEBUG_LOG||"./dimcode-debug.log",CHECK_TIMEOUT_MS=5000,autoInstallStartedVersions=new Set;async function fetchPackageVersions(packageName=DEFAULT_PACKAGE_NAME){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),CHECK_TIMEOUT_MS);try{let response=await fetch(`https://registry.npmjs.org/${packageName}`,{signal:controller.signal,headers:{Accept:"application/json"}});if(!response.ok)throw Error(`npm registry returned ${response.status}`);let versions3=(await response.json())?.versions;if(!versions3||typeof versions3!=="object")throw Error("No versions found in registry response");return Object.keys(versions3)}catch(error41){if(error41 instanceof Error&&error41.name==="AbortError")throw Error("npm registry request timed out");throw error41}finally{clearTimeout(timeoutId)}}async function resolveLatestNpmVersion(packageName,currentVersion){return selectUpdateVersion(await fetchPackageVersions(packageName),resolveUpdateTrack(currentVersion))}async function checkNpmUpgrade(packageName=DEFAULT_PACKAGE_NAME){if(await logUpgradeCheck("start",{disableAutoUpdate:process.env.DIMCODE_DISABLE_AUTOUPDATE==="1",autoUpdate:process.env.DIMCODE_AUTOUPDATE!=="0",cwd:safeCwd(),argv:safeArgv(),debugLogPath:DEBUG_LOG_PATH}),process.env.DIMCODE_DISABLE_AUTOUPDATE==="1")return await logUpgradeCheck("skip-disabled"),null;let resolvedVersion=resolveCliVersion();if(!resolvedVersion?.version)return await logUpgradeCheck("skip-missing-version"),null;let wrapperVersion=packageName!==DEFAULT_PACKAGE_NAME?resolveWrapperPackageVersion():null,current=wrapperVersion||resolvedVersion.version,hasInjectedVersion=resolvedVersion.source==="injected";try{let latest=await resolveLatestNpmVersion(packageName,current);if(await logUpgradeCheck("check-result",{current,latest,hasInjectedVersion,wrapperVersion,updateTrack:resolveUpdateTrack(current)}),!latest)return await logUpgradeCheck("error",{message:"Failed to fetch latest version"}),null;if(!shouldInstallSelectedVersion(current,latest))return await logUpgradeCheck("no-update",{current,latest}),null;if(process.env.DIMCODE_AUTOUPDATE!=="0"&&hasInjectedVersion){let installer=resolvePackageInstaller(latest,packageName);if(!installer)return await logUpgradeCheck("autoupdate-skip-unknown-install-target",{current,latest,target:resolveNpmInstallTarget()}),`Update available: ${packageName}@${latest} (current: ${current}). Auto-update skipped because the current install source could not be identified. Run: dim version`;let installKey=`${packageName}@${latest}:${installer.manager}:${installer.prefix??""}`;if(autoInstallStartedVersions.has(installKey))return await logUpgradeCheck("autoupdate-skip-duplicate",{version:latest}),null;return autoInstallStartedVersions.add(installKey),await logUpgradeCheck("update-available",{current,latest,autoUpdate:!0,installer:installer.manager,prefix:installer.prefix}),startAutoInstall(latest,packageName,installer),`Update available: ${packageName}@${latest} (current: ${current}). Installing ${installer.manager} global package in background. Restart terminal after it finishes.`}return await logUpgradeCheck("update-available",{current,latest,autoUpdate:!1}),`Update available: ${packageName}@${latest} (current: ${current})`}catch(error41){return await logUpgradeCheck("error",{message:error41 instanceof Error?error41.message:String(error41)}),null}}function startAutoInstall(version3,packageName=DEFAULT_PACKAGE_NAME,installer){try{logUpgradeCheck("autoupdate-start",{version:version3,installer:installer.manager,prefix:installer.prefix});let proc=import_cross_spawn2.default(installer.command,[...installer.argsPrefix,...installer.installArgs],{stdio:"ignore",detached:!0,windowsHide:process.platform==="win32"});proc.unref();let finished=!1,finalize2=(message)=>{if(finished)return;finished=!0,logUpgradeCheck("autoupdate-finish",{version:version3,message}),notifyUpgradeToast(message)};proc.on("close",(code)=>{if(code===0)finalize2(`Update installed: ${packageName}@${version3}. Restart terminal to use the new version.`);else finalize2(`Auto-update failed. Run: ${installer.manualCommand}`)}),proc.on("error",()=>{logUpgradeCheck("autoupdate-error",{version:version3,reason:"process-error"}),finalize2(`Auto-update failed. Run: ${installer.manualCommand}`)})}catch{logUpgradeCheck("autoupdate-error",{version:version3,reason:"spawn-throw"}),notifyUpgradeToast(`Auto-update failed. Run: ${installer.manualCommand}`)}}async function logUpgradeCheck(_event,_data){}function safeCwd(){try{return process.cwd()}catch{return}}function safeArgv(){try{return process.argv}catch{return}}function resolveNpmInstallTarget(){return resolveCurrentInstallTarget({importMetaUrl:import.meta.url,argvPath:process.argv[1],execPath:process.execPath,env:process.env,isSelfContainedBinary:!1})}function resolvePackageInstaller(version3,packageName=DEFAULT_PACKAGE_NAME){let target=resolveNpmInstallTarget(),manager=target.manager==="npm"||target.manager==="bun"?target.manager:null;if(!manager)return null;let{command,argsPrefix}=resolvePackageManagerCommand(manager),packageSpec=`${packageName}@${version3}`,prefix=manager==="npm"?target.prefix:void 0,installArgs=manager==="npm"?["install","-g","--prefer-online",...prefix?["--prefix",prefix]:[],packageSpec]:["install","-g",packageSpec];return{manager,command,argsPrefix,installArgs,manualCommand:manager==="npm"?formatManualCommand(["npm","install","-g","--prefer-online",...prefix?["--prefix",prefix]:[],packageSpec]):`bun install -g ${packageSpec}`,prefix}}function formatManualCommand(args){return args.map(quoteShellArg).join(" ")}function quoteShellArg(value){if(/^[\w./:@%+=,-]+$/.test(value))return value;return JSON.stringify(value)}function resolvePackageManagerCommand(pm){if(process.platform!=="win32")return{command:pm,argsPrefix:[]};if(pm==="bun")return resolveBunCommand();return resolveNpmCommand()}function resolveBunCommand(){let execPath=String(process.execPath??"").trim();if(execPath){if(path39.basename(execPath).toLowerCase().startsWith("bun")&&existsSync5(execPath))return{command:execPath,argsPrefix:[]}}let bunHome=String(process.env.BUN_INSTALL??"").trim();if(bunHome){let bunExe=path39.join(bunHome,"bin","bun.exe");if(existsSync5(bunExe))return{command:bunExe,argsPrefix:[]}}return{command:"bun",argsPrefix:[]}}function resolveNpmCommand(){let execPath=String(process.execPath??"").trim(),execDir=execPath?path39.dirname(execPath):"";if(execDir){let npmCmd=path39.join(execDir,"npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]};let npmCliCandidates=[path39.join(execDir,"node_modules","npm","bin","npm-cli.js"),path39.resolve(execDir,"..","lib","node_modules","npm","bin","npm-cli.js")];if(execPath){for(let npmCli of npmCliCandidates)if(existsSync5(npmCli))return{command:execPath,argsPrefix:[npmCli]}}}let appData=String(process.env.APPDATA??"").trim();if(appData){let npmCmd=path39.join(appData,"npm","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFiles=String(process.env.ProgramFiles??"").trim();if(programFiles){let npmCmd=path39.join(programFiles,"nodejs","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFilesX86=String(process.env["ProgramFiles(x86)"]??"").trim();if(programFilesX86){let npmCmd=path39.join(programFilesX86,"nodejs","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}return{command:"npm",argsPrefix:[]}}function getNpmPackageOverride(){return(process.env.DIMCODE_NPM_PACKAGE||"").trim()||void 0}async function checkUpgrade(){let npmPackage=getNpmPackageOverride();if(npmPackage)return await checkNpmUpgrade(npmPackage);if(isSelfContainedBinary())return await checkBinaryUpgrade();return await checkNpmUpgrade()}import process25 from"node:process";var logger=debugLog2;async function cleanupExpiredSessionCaches3(opts){return cleanupExpiredSessionCaches2({...opts,logger})}var DEFAULT_LINE_THRESHOLD=400,DEFAULT_TOKEN_THRESHOLD=12000,DEFAULT_PREVIEW_LINES=20,DEFAULT_FIRST_RANGE_LINES=300,DEFAULT_PREVIEW_MAX_LINE_CHARS=240,DEFAULT_PREVIEW_MAX_CHARS=4000;function isNodeLike3(){let p2=globalThis.process;return Boolean(p2&&typeof p2?.versions?.node==="string")}function estimateTokens(text){let raw=String(text??""),chars=raw.length,bytes=Buffer.byteLength(raw,"utf-8"),nonAsciiChars=0;for(let i2=0;i2<raw.length;i2++)if(raw.charCodeAt(i2)>127)nonAsciiChars++;let asciiChars=Math.max(0,chars-nonAsciiChars),byChars=Math.ceil(chars/4),byBytes=Math.ceil(bytes/3),byMixed=Math.ceil(asciiChars/4+nonAsciiChars*0.9);return Math.max(byChars,byBytes,byMixed)}function countLines3(text){if(!text)return 0;return text.split(`
1216
1216
  `).length}function buildPreview(text,maxLines){let lines=text.split(`
1217
1217
  `).slice(0,Math.max(1,maxLines)),out=[],used=0,maxLineChars=DEFAULT_PREVIEW_MAX_LINE_CHARS,maxChars=DEFAULT_PREVIEW_MAX_CHARS;for(let line of lines){let next=line;if(next.length>maxLineChars)next=`${next.slice(0,maxLineChars)}...`;let size=next.length+(out.length>0?1:0);if(used+size>maxChars)break;out.push(next),used+=size}return out.join(`
1218
1218
  `)}function buildReferenceMessage(opts){let endLine=Math.max(1,Math.min(opts.lineCount,opts.firstRangeLines));return["[long_input_reference]","Large pasted content is stored in a session-scoped blob.","Read it via `Read` tool using `file_id` and line ranges.","",`file_id: ${opts.fileId}`,`line_count: ${opts.lineCount}`,`sha256: ${opts.sha256}`,`recommended_first_range: 1-${endLine}`,"","tool_call_example:",`{"file_id":"${opts.fileId}","start_line":1,"end_line":${endLine}}`,"","preview:","```text",opts.preview,"```","","Continue reading in chunks of at most 300 lines and cite line numbers in conclusions."].join(`