goatchain-cli 0.0.9-beta.24 → 0.0.9-beta.25

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 +4 -4
  2. package/package.json +6 -6
package/dist/ink.mjs CHANGED
@@ -1074,7 +1074,7 @@ ${epoch}`).digest("hex");return record3.cachedPromptCacheKey={signature,value},v
1074
1074
  ${DURABLE_COMPLETION_PROMPT}`}readSnapshotSystemPrompt(snapshot){let messages=Array.isArray(snapshot.messages)?snapshot.messages:[];return canonicalizeSystemMessages({messages}).systemPrompt}canonicalizeSnapshotSystemMessages(snapshot,systemPrompt){let messages=Array.isArray(snapshot.messages)?[...snapshot.messages]:[],canonical=canonicalizeSystemMessages({...typeof systemPrompt==="string"?{systemPrompt}:{},messages}),firstSystemMessage=canonical.systemMessages.find((message)=>Boolean(message)&&typeof message==="object");if(canonical.systemMessages.length===0&&typeof systemPrompt!=="string")return{...snapshot,messages:canonical.messages};let nextSystemMessage={...firstSystemMessage??{},id:typeof firstSystemMessage?.id==="string"?firstSystemMessage.id:`msg:${randomUUID3()}`,role:"system",content:canonical.systemPrompt,createdAt:Number(firstSystemMessage?.createdAt??Date.now())||Date.now()};return{...snapshot,messages:[nextSystemMessage,...canonical.messages]}}withUpdatedSystemPrompt(snapshot,systemPrompt){return this.canonicalizeSnapshotSystemMessages(snapshot,systemPrompt)}}async function createAgentRuntime(options){if(!options.stateDir?.trim())throw Error("createAgentRuntime requires a persistent stateDir");return new NativeAgentRuntime(options)}function normalizeText7(value){return value.replace(/\r/g,"").trimEnd()}var SESSION_QUEUE_LIMIT=5,VALID_QUEUE_STATUS=new Set(["idle","running","paused_confirm","error"]),VALID_ERROR_CODES=new Set(["network_error","timeout","canceled_by_user","rate_limited","config_unavailable","unknown"]);function sanitizeQueueText(text){let raw=normalizeText7(String(text??""));if(!raw)return"";let out="";for(let i=0;i<raw.length;i++){let code=raw.charCodeAt(i);if(code===9||code===10){out+=raw[i];continue}if(code<32||code===127)continue;out+=raw[i]}return out}function sortQueueItems(items){return[...items].sort((a,b)=>{if(a.kind!==b.kind)return a.kind==="steer"?-1:1;if(a.kind==="steer"&&b.kind==="steer"){let aSteeredAt=Number(a.steeredAt??a.createdAt??0),bSteeredAt=Number(b.steeredAt??b.createdAt??0);if(aSteeredAt!==bSteeredAt)return aSteeredAt-bSteeredAt}let aCreatedAt=Number(a.createdAt??0),bCreatedAt=Number(b.createdAt??0);if(aCreatedAt!==bCreatedAt)return aCreatedAt-bCreatedAt;return String(a.id).localeCompare(String(b.id))})}function normalizeQueueItem(raw){if(!raw||typeof raw!=="object")return null;let id=String(raw.id??"").trim(),text=sanitizeQueueText(raw.text);if(!id||!text)return null;let createdAt=Number(raw.createdAt??0),kind=String(raw.kind??"").trim()==="steer"?"steer":"user",steeredAt=Number(raw.steeredAt??0),cfg=raw.config,config2;if(cfg&&typeof cfg==="object"){let approvalsMode=cfg.approvalsMode==="auto"?"auto":cfg.approvalsMode==="normal"?"normal":cfg.approvalsMode==="strict"?"strict":void 0;config2={model:String(cfg.model??"").trim()||void 0,temperature:Number.isFinite(Number(cfg.temperature))?Number(cfg.temperature):void 0,interleavedThinking:typeof cfg.interleavedThinking==="boolean"?cfg.interleavedThinking:void 0,approvalsMode,providerId:String(cfg.providerId??"").trim()||void 0}}return{id,text,createdAt:Number.isFinite(createdAt)?createdAt:0,kind,steeredAt:kind==="steer"&&Number.isFinite(steeredAt)&&steeredAt>0?steeredAt:void 0,...config2?{config:config2}:{}}}function defaultSessionUiMetadata(){return{queue:[],queueLength:0,status:"idle",lastUpdatedAt:0,lastErrorCode:void 0,pinnedMessageIds:[],titleSuggestedAt:void 0}}function normalizeSessionUiMetadata(raw){let base=defaultSessionUiMetadata();if(!raw||typeof raw!=="object")return base;let obj=raw,queueRaw=Array.isArray(obj.queue)?obj.queue:[],queue=sortQueueItems(queueRaw.map(normalizeQueueItem).filter(Boolean).slice(0,SESSION_QUEUE_LIMIT)),status=VALID_QUEUE_STATUS.has(obj.status)?obj.status:base.status,lastUpdatedAt=Number(obj.lastUpdatedAt??0),lastErrorCode=VALID_ERROR_CODES.has(obj.lastErrorCode)?obj.lastErrorCode:void 0,pinnedMessageIds=Array.isArray(obj.pinnedMessageIds)?obj.pinnedMessageIds.map((id)=>String(id??"").trim()).filter(Boolean):[],titleSuggestedAt=Number(obj.titleSuggestedAt??0);return{queue,queueLength:queue.length,status,lastUpdatedAt:Number.isFinite(lastUpdatedAt)?lastUpdatedAt:0,lastErrorCode,pinnedMessageIds,titleSuggestedAt:Number.isFinite(titleSuggestedAt)&&titleSuggestedAt>0?titleSuggestedAt:void 0}}function readSessionUiMetadataFromSnapshot(snapshot){let meta3=snapshot?.metadata?.ui??snapshot?.metadata?.dimAgentRuntime?.metadata?.ui??null;return normalizeSessionUiMetadata(meta3)}function normalizeText8(value){return String(value??"").trim()}function parseBool3(value){let normalized=normalizeText8(value).toLowerCase();if(!normalized)return;if(normalized==="1"||normalized==="true"||normalized==="yes"||normalized==="on")return!0;if(normalized==="0"||normalized==="false"||normalized==="no"||normalized==="off")return!1;return}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,runtimeDebug=parseBool3(opts.processEnv?.DIMCODE_DEBUG??opts.context.env?.DIMCODE_DEBUG)===!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,debug:runtimeDebug,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";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 null}function asRecord14(value){if(!value||typeof value!=="object"||Array.isArray(value))return{};return value}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 readTruthyFlag2(value){let normalized=normalizeText9(value).toLowerCase();return normalized==="1"||normalized==="true"||normalized==="yes"||normalized==="on"}function readNoInteractionFlag(config2){return readTruthyFlag2(config2?.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 record3=asRecord14(raw),persisted={modelId:normalizeText9(record3.modelId)||fallback.modelId,...normalizeText9(record3.adapter)?{adapter:normalizeText9(record3.adapter)}:{},...normalizeText9(record3.provider)?{provider:normalizeText9(record3.provider)}:{},...normalizeText9(record3.baseUrl)?{baseUrl:normalizeText9(record3.baseUrl)}:{},...record3.nextApiOAuth===!0?{nextApiOAuth:!0}:{},...record3.responsesAutoPromptCacheKey===!0?{responsesAutoPromptCacheKey:!0}:{},...record3.responsesUseSessionId===!0?{responsesUseSessionId:!0}:{},...cloneModelCapabilities(record3.modelCapabilities)?{modelCapabilities:cloneModelCapabilities(record3.modelCapabilities)}:{},...Number(record3.maxInputTokens)>0?{maxInputTokens:Number(record3.maxInputTokens)}:{},...Number(record3.maxOutputTokens)>0?{maxOutputTokens:Number(record3.maxOutputTokens)}:{}};return mergeRuntimeConfig(fallback,{...persisted,maxInputTokens:void 0,maxOutputTokens:void 0},{preferSourceMaxInputTokens:!1})}function readRuntimeEnvelopeFromSnapshot(snapshot,fallback){let metadata=asRecord14(snapshot?.metadata),runtimeMeta=asRecord14(metadata[RUNTIME_SESSION_METADATA_KEY2]);return{runtimeConfig:snapshot?parseRuntimeConfig(runtimeMeta.runtimeConfig,{...fallback,modelId:normalizeText9(asRecord14(runtimeMeta.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=path24.resolve(opts.stateDir),pendingMode="agent",runtimePromise=null,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;debugLog("cli.session.persistence",{sessionId:normalizedSessionId,stateDir,snapshotPath:runtimeSnapshotPath(stateDir,normalizedSessionId)})},ensureRuntime=async()=>{if(runtimePromise)return await runtimePromise;runtimePromise=(async()=>{return await createCliRuntime({context:opts.context,stateDir,processEnv:opts.processEnv,tools:opts.tools,mcpServers:opts.mcpServers,mcpInitialState:opts.mcpInitialState})})();try{return await runtimePromise}catch(error48){throw runtimePromise=null,error48}},runtimeSessions={list:async()=>(await ensureRuntime()).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()=>await(await ensureRuntime()).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)};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 null;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){let normalizedSessionId=normalizeText9(sessionId);if(!normalizedSessionId)return{success:!1,error:"Manual compaction requires an active session id"};return await(await ensureSession({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)}}}function shouldInferAihubmixMetadata2(adapter){if(!adapter)return!0;return adapter==="openai"||adapter==="openai-responses"||adapter==="gemini"||adapter==="anthropic"}function inferCustomModelLimit(modelId,adapter){if(!shouldInferAihubmixMetadata2(adapter))return;return getAihubmixLimitForModelId(modelId)}function backfillCustomProviderModels(models,opts={}){if(!shouldInferAihubmixMetadata2(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;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,inferredLimit=hasContext&&hasOutput?void 0:inferCustomModelLimit(id,opts.adapter),inferredCapabilities=hasVision&&hasReasoning?void 0:getAihubmixCapabilitiesForModelId(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}:{}}})}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(`
1075
1075
 
1076
1076
  `)}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 readOptionalString2(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(`
1077
- `)]})}async function createDimcodeContext(opts){let fastStartRaw=String(opts.env.DIMCODE_FAST_START??"").trim().toLowerCase(),fastStart=fastStartRaw==="1"||fastStartRaw==="true"||fastStartRaw==="yes"||fastStartRaw==="on",version2=readOptionalString2("0.0.9-beta.24")??(fastStart?null:await readRepoPackageVersion(opts.cwd)),resolveToolsPath=async()=>{let[{homedir:homedir3},path25]=await Promise.all([import("node:os"),import("node:path")]),dimcodeHome=readOptionalString2(opts.env.DIMCODE_HOME);if(dimcodeHome){let dir2=path25.resolve(dimcodeHome);return{dir:dir2,filePath:path25.join(dir2,"tools.json")}}let dir=path25.resolve(homedir3(),".dimcode");return{dir,filePath:path25.join(dir,"tools.json")}},[loadedCache,loadedConfig,loadedTools,loadedMcp]=fastStart?await(async()=>{let[cacheDir,configDir,toolsPath,path25]=await Promise.all([getDimcodeUserDir(opts.env),getDimcodeConfigDir(opts.env),resolveToolsPath(),import("node:path")]),cacheFile=path25.join(cacheDir,"cache.json"),configFile=path25.join(configDir,"config.json"),mcpJsonFile=path25.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,config2=loadedConfig.config,saved=cache.settings??{},savedConfig=config2.settings??{},savedCwd=readOptionalString2(saved.cwd),savedFocusFiles=Array.isArray(saved.focusFiles)?saved.focusFiles.map((file2)=>String(file2??"")).filter(Boolean):void 0,cwd=opts.cwd||savedCwd||".",v=(key)=>readOptionalString2(opts.env[key]),explicitRuntimeEnv=Object.fromEntries(Object.entries(opts.env).flatMap(([key,value])=>{let canonical=String(key??"").trim(),normalized=readOptionalString2(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:version2??"dev",...v("DIMCODE_STARTUP_TOAST")?{DIMCODE_STARTUP_TOAST:v("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=readOptionalString2(legacyCustom?.baseUrl),legacyApiKey=readOptionalString2(legacyCustom?.apiKey),rawProviderId=(()=>{if(isLegacyCustomProviderId(savedProviderId)&&normalizedSavedCustomProviders.length){let fallbackId=readOptionalString2(normalizedSavedCustomProviders[0]?.id);if(fallbackId){if(config2.settings)config2.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=readOptionalString2(selection.providerId),providerModel=readOptionalString2(selection.modelId);if(config2.settings)if(providerId)config2.settings.providerId=providerId;else delete config2.settings.providerId;let customProvider=isCustomProviderId(providerId)?normalizedSavedCustomProviders.find((p)=>String(p?.id??"").trim()===providerId):void 0,builtin=providerId&&!isCustomProviderId(providerId)&&!isLegacyCustomProviderId(providerId)?getBuiltinProvider(providerId):void 0,savedConnection=savedConnections[providerId??""],savedConnectionBaseUrl=readOptionalString2(savedConnection?.baseUrl),builtinBaseUrl=readOptionalString2(getProviderBaseUrl(builtin)),adapter=isCustomProviderId(providerId)?String(customProvider?.adapter??"").trim():isLegacyCustomProviderId(providerId)?"openai":providerId==="openai"&&savedConnectionBaseUrl&&savedConnectionBaseUrl!==builtinBaseUrl?"openai":getProviderAdapter(builtin),providerBaseUrl=isCustomProviderId(providerId)?readOptionalString2(customProvider?.baseUrl):isLegacyCustomProviderId(providerId)?legacyBaseUrl:readOptionalString2(resolveBuiltinProviderBaseUrl(builtin,savedConnection?.baseUrl)),providerApiKey=isCustomProviderId(providerId)?readOptionalString2(customProvider?.apiKey):isLegacyCustomProviderId(providerId)?legacyApiKey:readOptionalString2(savedConnection?.apiKey),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}),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:(()=>{let perModel=saved.reasoningEffortByModel;if(perModel&&providerModel){let value=readOptionalString2(perModel[providerModel]);if(value)return value}return readOptionalString2(saved.reasoningEffort)??void 0})()};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&&readOptionalString2(saved.locale))mergedEnv.DIMCODE_LANG=readOptionalString2(saved.locale);if(!mergedEnv.DIMCODE_THEME&&readOptionalString2(saved.themeMode))mergedEnv.DIMCODE_THEME=readOptionalString2(saved.themeMode);if(!mergedEnv.DIMCODE_REASONING_EFFORT){let perModelMap=saved.reasoningEffortByModel,resolved=(perModelMap&&providerModel?readOptionalString2(perModelMap[providerModel]):void 0)??readOptionalString2(saved.reasoningEffort);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:config2,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:readFile10},path25]=await Promise.all([import("node:fs/promises"),import("node:path")]),raw=await readFile10(path25.join(cwd,"package.json"),"utf8"),parsed=JSON.parse(raw),v=typeof parsed?.version==="string"?parsed.version:null;return v&&v.trim()?v.trim():null}catch{return null}}import{createHash as createHash4,randomUUID as randomUUID4}from"node:crypto";import{copyFile as copyFile2,mkdir as mkdir10,readdir as readdir6,readFile as readFile10,rename as rename2,rm as rm7,stat as stat5,writeFile as writeFile9}from"node:fs/promises";import{homedir as homedir3}from"node:os";import path25 from"node:path";import process10 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(process10.env.DIMCODE_HOME??"").trim();if(dimcodeHome)return path25.resolve(dimcodeHome,"state");return path25.resolve(homedir3(),".dimcode","state")}function resolveSessionCacheDir2(sessionId){return path25.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=path25.extname(filePath||"").toLowerCase();if(!ext)return"";return ext.startsWith(".")?ext.slice(1):ext}function basenameFromPath(filePath){return path25.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=path25.extname(filePath).toLowerCase();return EXT_MIME[ext]||"application/octet-stream"}function countLines2(text){if(!text)return 0;return text.split(`
1077
+ `)]})}async function createDimcodeContext(opts){let fastStartRaw=String(opts.env.DIMCODE_FAST_START??"").trim().toLowerCase(),fastStart=fastStartRaw==="1"||fastStartRaw==="true"||fastStartRaw==="yes"||fastStartRaw==="on",version2=readOptionalString2("0.0.9-beta.25")??(fastStart?null:await readRepoPackageVersion(opts.cwd)),resolveToolsPath=async()=>{let[{homedir:homedir3},path25]=await Promise.all([import("node:os"),import("node:path")]),dimcodeHome=readOptionalString2(opts.env.DIMCODE_HOME);if(dimcodeHome){let dir2=path25.resolve(dimcodeHome);return{dir:dir2,filePath:path25.join(dir2,"tools.json")}}let dir=path25.resolve(homedir3(),".dimcode");return{dir,filePath:path25.join(dir,"tools.json")}},[loadedCache,loadedConfig,loadedTools,loadedMcp]=fastStart?await(async()=>{let[cacheDir,configDir,toolsPath,path25]=await Promise.all([getDimcodeUserDir(opts.env),getDimcodeConfigDir(opts.env),resolveToolsPath(),import("node:path")]),cacheFile=path25.join(cacheDir,"cache.json"),configFile=path25.join(configDir,"config.json"),mcpJsonFile=path25.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,config2=loadedConfig.config,saved=cache.settings??{},savedConfig=config2.settings??{},savedCwd=readOptionalString2(saved.cwd),savedFocusFiles=Array.isArray(saved.focusFiles)?saved.focusFiles.map((file2)=>String(file2??"")).filter(Boolean):void 0,cwd=opts.cwd||savedCwd||".",v=(key)=>readOptionalString2(opts.env[key]),explicitRuntimeEnv=Object.fromEntries(Object.entries(opts.env).flatMap(([key,value])=>{let canonical=String(key??"").trim(),normalized=readOptionalString2(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:version2??"dev",...v("DIMCODE_STARTUP_TOAST")?{DIMCODE_STARTUP_TOAST:v("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=readOptionalString2(legacyCustom?.baseUrl),legacyApiKey=readOptionalString2(legacyCustom?.apiKey),rawProviderId=(()=>{if(isLegacyCustomProviderId(savedProviderId)&&normalizedSavedCustomProviders.length){let fallbackId=readOptionalString2(normalizedSavedCustomProviders[0]?.id);if(fallbackId){if(config2.settings)config2.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=readOptionalString2(selection.providerId),providerModel=readOptionalString2(selection.modelId);if(config2.settings)if(providerId)config2.settings.providerId=providerId;else delete config2.settings.providerId;let customProvider=isCustomProviderId(providerId)?normalizedSavedCustomProviders.find((p)=>String(p?.id??"").trim()===providerId):void 0,builtin=providerId&&!isCustomProviderId(providerId)&&!isLegacyCustomProviderId(providerId)?getBuiltinProvider(providerId):void 0,savedConnection=savedConnections[providerId??""],savedConnectionBaseUrl=readOptionalString2(savedConnection?.baseUrl),builtinBaseUrl=readOptionalString2(getProviderBaseUrl(builtin)),adapter=isCustomProviderId(providerId)?String(customProvider?.adapter??"").trim():isLegacyCustomProviderId(providerId)?"openai":providerId==="openai"&&savedConnectionBaseUrl&&savedConnectionBaseUrl!==builtinBaseUrl?"openai":getProviderAdapter(builtin),providerBaseUrl=isCustomProviderId(providerId)?readOptionalString2(customProvider?.baseUrl):isLegacyCustomProviderId(providerId)?legacyBaseUrl:readOptionalString2(resolveBuiltinProviderBaseUrl(builtin,savedConnection?.baseUrl)),providerApiKey=isCustomProviderId(providerId)?readOptionalString2(customProvider?.apiKey):isLegacyCustomProviderId(providerId)?legacyApiKey:readOptionalString2(savedConnection?.apiKey),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}),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:(()=>{let perModel=saved.reasoningEffortByModel;if(perModel&&providerModel){let value=readOptionalString2(perModel[providerModel]);if(value)return value}return readOptionalString2(saved.reasoningEffort)??void 0})()};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&&readOptionalString2(saved.locale))mergedEnv.DIMCODE_LANG=readOptionalString2(saved.locale);if(!mergedEnv.DIMCODE_THEME&&readOptionalString2(saved.themeMode))mergedEnv.DIMCODE_THEME=readOptionalString2(saved.themeMode);if(!mergedEnv.DIMCODE_REASONING_EFFORT){let perModelMap=saved.reasoningEffortByModel,resolved=(perModelMap&&providerModel?readOptionalString2(perModelMap[providerModel]):void 0)??readOptionalString2(saved.reasoningEffort);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:config2,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:readFile10},path25]=await Promise.all([import("node:fs/promises"),import("node:path")]),raw=await readFile10(path25.join(cwd,"package.json"),"utf8"),parsed=JSON.parse(raw),v=typeof parsed?.version==="string"?parsed.version:null;return v&&v.trim()?v.trim():null}catch{return null}}import{createHash as createHash4,randomUUID as randomUUID4}from"node:crypto";import{copyFile as copyFile2,mkdir as mkdir10,readdir as readdir6,readFile as readFile10,rename as rename2,rm as rm7,stat as stat5,writeFile as writeFile9}from"node:fs/promises";import{homedir as homedir3}from"node:os";import path25 from"node:path";import process10 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(process10.env.DIMCODE_HOME??"").trim();if(dimcodeHome)return path25.resolve(dimcodeHome,"state");return path25.resolve(homedir3(),".dimcode","state")}function resolveSessionCacheDir2(sessionId){return path25.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=path25.extname(filePath||"").toLowerCase();if(!ext)return"";return ext.startsWith(".")?ext.slice(1):ext}function basenameFromPath(filePath){return path25.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=path25.extname(filePath).toLowerCase();return EXT_MIME[ext]||"application/octet-stream"}function countLines2(text){if(!text)return 0;return text.split(`
1078
1078
  `).length}function normalizeMaybePath(raw){return String(raw??"").replace(/\\/g,"/")}async function ensureBlobDirs2(sessionDir){let blobsDir=path25.join(sessionDir,BLOB_DIR2),metaDir=path25.join(sessionDir,META_DIR2);try{return await mkdir10(blobsDir,{recursive:!0}),await mkdir10(metaDir,{recursive:!0}),{blobsDir,metaDir}}catch{return null}}async function ensureAttachmentDirs(sessionDir){let attachmentsDir=path25.join(sessionDir,ATTACHMENTS_DIR2),metaDir=path25.join(sessionDir,META_DIR2);try{return await mkdir10(attachmentsDir,{recursive:!0}),await mkdir10(metaDir,{recursive:!0}),{attachmentsDir,metaDir}}catch{return null}}async function copyFileUnique(src,destDir,baseName){let safeBaseName=basenameFromPath(baseName)||basenameFromPath(src)||"attachment",ext=path25.extname(safeBaseName),stem=ext?safeBaseName.slice(0,-ext.length):safeBaseName,candidate=path25.join(destDir,safeBaseName);for(let i=0;i<40;i++){try{await copyFile2(src,candidate);let info=await stat5(candidate);if(info.isFile()&&info.size>0)return candidate}catch{}let suffix=`-${i+1}`;candidate=path25.join(destDir,`${stem}${suffix}${ext}`)}return null}async function readAttachmentMetaByPath(absPath){let info=parseAttachmentPathInfo(absPath);if(!info)return null;let metaDir=path25.join(resolveSessionCacheDir2(info.sessionId),META_DIR2),entries=[];try{entries=await readdir6(metaDir)}catch{return null}for(let entry of entries){if(!entry.endsWith(".json"))continue;let metaPath=path25.join(metaDir,entry);try{let raw=await readFile10(metaPath,"utf8"),meta3=JSON.parse(raw);if(!meta3||typeof meta3!=="object")continue;if(String(meta3.kind??"")!=="attachment")continue;if(String(meta3.stored_name??"")!==info.fileName)continue;let fileId=String(meta3.file_id??"").trim();if(!FILE_ID_PATTERN.test(fileId))continue;return{fileId,metaPath,meta:meta3}}catch{}}return null}async function writeSessionBlob2(opts){let sessionDir=resolveSessionCacheDir2(opts.sessionId),dirs=await ensureBlobDirs2(sessionDir);if(!dirs)return null;let fileId=`blob-${randomUUID4().replace(/-/g,"")}`,blobPath=path25.join(dirs.blobsDir,`${fileId}.txt`),metaPath=path25.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 writeFile9(blobPath,opts.content,"utf8"),await writeFile9(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 stat5(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-${randomUUID4().replace(/-/g,"")}`,preferredBaseName=basenameFromPath(String(opts.preferredBaseName??"").trim()||basenameFromPath(cleanedPath)),storedPath=await copyFileUnique(cleanedPath,dirs.attachmentsDir,preferredBaseName);if(!storedPath)return null;let metaPath=path25.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 writeFile9(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(path25.join(resolveSessionCacheDir2(info.sessionId),ATTACHMENTS_DIR2)),removeDirIfEmpty(path25.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",cached2=await cacheFileToSessionAttachment({sourcePath:absPath,sessionId:targetSid,source,preferredBaseName,mediaType,logger});if(!cached2)return null;return await deleteSessionAttachmentByPath(absPath,logger).catch(()=>!1),cached2.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(path25.join(resolveStateDir3(),BLOB_CACHE_DIR2),cutoff,opts?.logger)}async function cleanupDedicatedCacheRoot2(cacheRoot,cutoff,logger){let entries=[];try{entries=await readdir6(cacheRoot)}catch{return}await Promise.all(entries.map(async(entry)=>{let sid=normalizeSessionId2(entry);if(!sid)return;let sessionDir=path25.join(cacheRoot,sid),candidates=[sessionDir,path25.join(sessionDir,BLOB_DIR2),path25.join(sessionDir,ATTACHMENTS_DIR2),path25.join(sessionDir,META_DIR2)],mtimes=[];for(let candidate of candidates)try{let info=await stat5(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 readdir6(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 path26=formatCommitObjectPath(safe);return`[${safe}](${path26})`}function stripLeadingFocusFilesBlock(text){let normalized=String(text??"").replace(/\r/g,"");if(!normalized)return"";let lines=normalized.split(`
1079
1079
  `),header=String(lines[0]??"").trim();if(header!=="[focus_files]"&&header!=="[user_focus_files]"){let inlineStripped=((raw)=>{let s=String(raw??"");if(!s)return null;let idx=0,matched2=0;while(idx<s.length){while(idx<s.length&&(s[idx]===" "||s[idx]==="\t"||s[idx]===`
1080
1080
  `))idx++;let m=s.slice(idx).match(/^\[([^\]]*)\]\(((?:\\\)|[^)])+)\)/);if(!m)break;let path26=String(m[2]??"").trim();if(path26.startsWith("<")&&path26.endsWith(">"))path26=path26.slice(1,-1);if(path26=path26.replace(/\\\)/g,")").trim(),!(path26.startsWith("/")||/^[A-Z]:[\\/]/i.test(path26)))break;matched2++,idx+=m[0].length}if(!matched2)return null;let rest=s.slice(idx);if(rest=rest.replace(/^[ \t]+/g,""),rest.startsWith(`
@@ -1175,7 +1175,7 @@ tc:${toolCalls}`}function userTranscriptSignature(msg){let content=String(msg.co
1175
1175
  `).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):""}
1176
1176
  ---
1177
1177
  ${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 createDimSdkPersistence(opts){let storeRef=null,persistEnabled=!opts.deferPersist,schedulePersist=null,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(){return(await backend.list()).map(snapshotToListItem).filter((item)=>Boolean(item))},async get(id2){let sessionId=String(id2??"").trim();if(!sessionId)return null;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});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);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){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})},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)}}: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,config2,tools)=>{let changed=!1,saved=config2.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=readOptionalString2(conn?.apiKey),baseUrl=readOptionalString2(conn?.baseUrl),models=(Array.isArray(conn?.models)?conn.models:[]).map((m2)=>{let model=m2&&typeof m2==="object"?m2:{},id3=readOptionalString2(model.id);if(!id3)return null;let name15=readOptionalString2(model.name),limit=normalizeLimit(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.outputIsUserDefined===!0?{outputIsUserDefined:!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=readOptionalString2(model.id);if(!id3)return null;let name16=readOptionalString2(model.name),limit=normalizeLimit(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.outputIsUserDefined===!0?{outputIsUserDefined:!0}:{},...typeof vision==="boolean"?{vision}:{},...reasoning?{reasoning}:{}}}).filter((m2)=>Boolean(m2)),id2=toCustomProviderId(readOptionalString2(entry.id)),name15=readOptionalString2(entry.name),adapter=toProviderAdapter(readOptionalString2(entry.adapter));if(!id2||!name15||!adapter)return null;let baseUrl=readOptionalString2(entry.baseUrl),apiKey=readOptionalString2(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(!readOptionalString2(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=readOptionalString2(cwd),providerId2=readOptionalString2(value?.providerId),modelId=readOptionalString2(value?.modelId);if(!key||!providerId2)return null;return[key,{providerId:providerId2,...modelId?{modelId}:{}}]}).filter((entry)=>Boolean(entry)));uiState.workspaceSelectionByCwd=byCwd}let savedReasoningMap=savedUi.reasoningEffortByModel;if(savedReasoningMap){let entries=Object.entries(savedReasoningMap).map(([modelId,value])=>{let key=readOptionalString2(modelId),v2=readOptionalString2(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})}).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 interruptedMessages=collectInterruptedRoundMessagesForPersistence(store3.state.messages).map(clonePersistableValue),compact=collectCompactMessagesForPersistence(store3.state.messages),compactMessages=uiMessagesToSnapshotMessages(compact),compression=collectCompressionMessagesForPersistence(store3.state.messages),compressionMessages=uiMessagesToSnapshotMessages(compression),errorMessages2=collectErrorMessagesForPersistence(store3.state.messages);try{let payload={interruptedMessages,compactMessages,compressionMessages,errorMessages:errorMessages2};await backend.updateMetadata(sessionId,{ui:payload})}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.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 readOptionalString2(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(`
1178
- `)}}}async function createDimSdkShellProps(opts){let{context,cacheDir,cacheFile,cache,configFile,config:config2,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"}),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:config2,toolsFile,tools,mcpJsonFile,mcpServers,mcpPhase,mcpConnectedCount,mcpConfiguredCount,sessionsBackend,agent,toolsRef,deferPersist:fastStart}),storeRef=null,hydrateStarted=!1,mcpSyncQueue=Promise.resolve(),queuedMcpSignature="",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;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)}},async()=>{if(storeRef)applyMcpRuntimeState("error",0,nextServers.length)})},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;queueMcpSync(full.mcpServers,{force:!0})}catch{}},onStoreCreatedWithHydrate=(store3)=>{storeRef=store3,onStoreCreated(store3),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 spawn3}from"node:child_process";import path28 from"node:path";var import_semver=__toESM(require_semver2(),1);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:mkdir11,writeFile:writeFile10},path27]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env);await mkdir11(dir,{recursive:!0});let filePath=path27.join(dir,UPGRADE_TOAST_FILE),payload=JSON.stringify({message,createdAt:Date.now()});await writeFile10(filePath,payload,"utf8")}catch{}}import{existsSync as existsSync3,readFileSync as readFileSync2}from"node:fs";import path27 from"node:path";import{fileURLToPath as fileURLToPath4}from"node:url";function resolveCliVersion(){let injected="0.0.9-beta.24".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=path27.dirname(fileURLToPath4(import.meta.url));for(let i2=0;i2<6;i2++){let candidate=path27.join(dir,"package.json");if(existsSync3(candidate)){let raw=readFileSync2(candidate,"utf8"),pkg=JSON.parse(raw),version2=typeof pkg?.version==="string"?pkg.version.trim():"";if(version2)return version2}let parent=path27.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 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 detectPackageManager(){try{let execPath=String(process.execPath??"").trim();if(!execPath)return"npm";let normalizedDir=path28.dirname(execPath).toLowerCase().replace(/\\/g,"/");if(normalizedDir.includes(".bun/bin")||normalizedDir.endsWith(".bun/bin"))return"bun";if(normalizedDir.includes("bun/install/global/bin"))return"bun";if(normalizedDir.includes(".npm-global")||normalizedDir.includes("npm-global"))return"npm";if(typeof globalThis.Bun<"u")return"bun";return"npm"}catch{return"npm"}}function isSelfContainedBinary(proc=process){try{let execPath=String(proc.execPath??"").trim();if(!execPath)return!1;let base=path28.basename(execPath).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_semver.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:"",url2=typeof asset?.browser_download_url==="string"?asset.browser_download_url:"";if(name15===assetName&&url2)return{name:name15,url:url2}}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:"",url2=typeof link?.url==="string"?link.url:"",resolved=direct||url2;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_semver.default.valid(current))return null;let release2=await fetchLatestReleaseInfo(process.env);if(!release2)return null;if(!import_semver.default.valid(release2.version)||import_semver.default.gte(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){return await fetchReleaseInfo("latest",env)}async function fetchReleaseInfo(desired,env){let config2=resolveBinaryUpdateConfig(env),provider=config2.provider,projectInfo={host:config2.host,project:config2.project},headers=resolveAuthHeaders(env,provider),target=resolveBunTarget();if(!target)return null;let assetName=resolveAssetName(target),tagCandidates=desired==="latest"?["latest"]:buildTagCandidates(desired);for(let tagCandidate of tagCandidates){let releaseJson=await fetchReleaseJson({provider,host:projectInfo.host,project:projectInfo.project,tag:tagCandidate,headers,githubApiBaseUrl:config2.githubApiBaseUrl});if(!releaseJson)continue;let tag=String(releaseJson?.tag_name??releaseJson?.tagName??"").trim()||(tagCandidate==="latest"?"latest":tagCandidate),version2=normalizeTagToSemver(tag);if(!version2)continue;let asset=provider==="github"?selectGitHubAsset(releaseJson,assetName):selectGitLabAsset(releaseJson,assetName);if(!asset)continue;return{provider,host:projectInfo.host,project:projectInfo.project,tag,version:version2,asset,target,assetName}}return null}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 url2=buildReleaseApiUrl(opts),response=await fetch(url2,{headers:{Accept:"application/json",...opts.headers},signal:controller.signal});if(!response.ok)return null;return await response.json()}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 startAutoBinaryUpgrade(version2){try{spawn3(process.execPath,["upgrade",version2,"--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_semver2=__toESM(require_semver2(),1);import{existsSync as existsSync4}from"node:fs";import path29 from"node:path";var DEFAULT_PACKAGE_NAME="dimcode";function resolveWrapperPackageVersion(){return(process.env.DIMCODE_NPM_PACKAGE_VERSION||"").trim()||null}function resolveUpgradePackageManager(){let v2=(process.env.DIMCODE_NPM_PACKAGE_MANAGER||"").trim().toLowerCase();if(v2==="npm"||v2==="bun")return v2;return detectPackageManager()}var DEBUG_LOG_PATH=process.env.DIMCODE_DEBUG_LOG||"./dimcode-debug.log",CHECK_TIMEOUT_MS=5000,autoInstallStartedVersions=new Set;async function fetchLatestVersion(packageName=DEFAULT_PACKAGE_NAME){try{let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),CHECK_TIMEOUT_MS),response=await fetch(`https://registry.npmjs.org/${packageName}`,{signal:controller.signal,headers:{Accept:"application/json"}});if(clearTimeout(timeoutId),!response.ok)throw Error(`npm registry returned ${response.status}`);let latestVersion=(await response.json())["dist-tags"]?.latest;if(!latestVersion||typeof latestVersion!=="string")throw Error("No latest version found in registry response");return latestVersion}catch(error48){if(error48 instanceof Error&&error48.name==="AbortError")throw Error("npm registry request timed out");throw error48}}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 fetchLatestVersion(packageName);if(await logUpgradeCheck("check-result",{current,latest,hasInjectedVersion,wrapperVersion}),!latest)return await logUpgradeCheck("error",{message:"Failed to fetch latest version"}),null;if(import_semver2.default.valid(current)&&import_semver2.default.valid(latest)){if(import_semver2.default.gte(current,latest))return await logUpgradeCheck("no-update",{current,latest}),null;if(process.env.DIMCODE_AUTOUPDATE!=="0"&&hasInjectedVersion){if(autoInstallStartedVersions.has(latest))return await logUpgradeCheck("autoupdate-skip-duplicate",{version:latest}),null;return autoInstallStartedVersions.add(latest),await logUpgradeCheck("update-available",{current,latest,autoUpdate:!0}),startAutoInstall(latest,packageName),`Update available: ${packageName}@${latest} (current: ${current}). Installing in background. Restart terminal after it finishes.`}return await logUpgradeCheck("update-available",{current,latest,autoUpdate:!1}),`Update available: ${packageName}@${latest} (current: ${current})`}if(current===latest)return await logUpgradeCheck("no-update",{current,latest}),null;return await logUpgradeCheck("update-available",{current,latest,autoUpdate:!1}),`Update available: ${packageName}@${latest} (current: ${current})`}catch(error48){return await logUpgradeCheck("error",{message:error48 instanceof Error?error48.message:String(error48)}),null}}function startAutoInstall(version2,packageName=DEFAULT_PACKAGE_NAME){try{logUpgradeCheck("autoupdate-start",{version:version2});let pm=resolveUpgradePackageManager(),{command,argsPrefix}=resolvePackageManagerCommand(pm),proc=import_cross_spawn2.default(command,[...argsPrefix,"install","-g",`${packageName}@${version2}`],{stdio:"ignore",detached:!0,windowsHide:process.platform==="win32"});proc.unref();let finished=!1,finalize2=(message)=>{if(finished)return;finished=!0,logUpgradeCheck("autoupdate-finish",{version:version2,message}),notifyUpgradeToast(message)};proc.on("close",(code)=>{if(code===0)finalize2(`Update installed: ${packageName}@${version2}. Restart terminal to use the new version.`);else finalize2(`Auto-update failed. Run: ${pm} install -g ${packageName}`)}),proc.on("error",()=>{logUpgradeCheck("autoupdate-error",{version:version2,reason:"process-error"}),finalize2(`Auto-update failed. Run: ${pm} install -g ${packageName}`)})}catch{let pm=resolveUpgradePackageManager();logUpgradeCheck("autoupdate-error",{version:version2,reason:"spawn-throw"}),notifyUpgradeToast(`Auto-update failed. Run: ${pm} install -g ${packageName}`)}}async function logUpgradeCheck(_event,_data){}function safeCwd(){try{return process.cwd()}catch{return}}function safeArgv(){try{return process.argv}catch{return}}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(path29.basename(execPath).toLowerCase().startsWith("bun")&&existsSync4(execPath))return{command:execPath,argsPrefix:[]}}let bunHome=String(process.env.BUN_INSTALL??"").trim();if(bunHome){let bunExe=path29.join(bunHome,"bin","bun.exe");if(existsSync4(bunExe))return{command:bunExe,argsPrefix:[]}}return{command:"bun",argsPrefix:[]}}function resolveNpmCommand(){let execPath=String(process.execPath??"").trim(),execDir=execPath?path29.dirname(execPath):"";if(execDir){let npmCmd=path29.join(execDir,"npm.cmd");if(existsSync4(npmCmd))return{command:npmCmd,argsPrefix:[]};let npmCliCandidates=[path29.join(execDir,"node_modules","npm","bin","npm-cli.js"),path29.resolve(execDir,"..","lib","node_modules","npm","bin","npm-cli.js")];if(execPath){for(let npmCli of npmCliCandidates)if(existsSync4(npmCli))return{command:execPath,argsPrefix:[npmCli]}}}let appData=String(process.env.APPDATA??"").trim();if(appData){let npmCmd=path29.join(appData,"npm","npm.cmd");if(existsSync4(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFiles=String(process.env.ProgramFiles??"").trim();if(programFiles){let npmCmd=path29.join(programFiles,"nodejs","npm.cmd");if(existsSync4(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFilesX86=String(process.env["ProgramFiles(x86)"]??"").trim();if(programFilesX86){let npmCmd=path29.join(programFilesX86,"nodejs","npm.cmd");if(existsSync4(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 process23 from"node:process";var logger=debugLog;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(`
1178
+ `)}}}async function createDimSdkShellProps(opts){let{context,cacheDir,cacheFile,cache,configFile,config:config2,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"}),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:config2,toolsFile,tools,mcpJsonFile,mcpServers,mcpPhase,mcpConnectedCount,mcpConfiguredCount,sessionsBackend,agent,toolsRef,deferPersist:fastStart}),storeRef=null,hydrateStarted=!1,mcpSyncQueue=Promise.resolve(),queuedMcpSignature="",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;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)}},async()=>{if(storeRef)applyMcpRuntimeState("error",0,nextServers.length)})},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;queueMcpSync(full.mcpServers,{force:!0})}catch{}},onStoreCreatedWithHydrate=(store3)=>{storeRef=store3,onStoreCreated(store3),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 spawn3}from"node:child_process";import path28 from"node:path";var import_semver=__toESM(require_semver2(),1);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:mkdir11,writeFile:writeFile10},path27]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env);await mkdir11(dir,{recursive:!0});let filePath=path27.join(dir,UPGRADE_TOAST_FILE),payload=JSON.stringify({message,createdAt:Date.now()});await writeFile10(filePath,payload,"utf8")}catch{}}async function consumeUpgradeToastFile(){try{let[{readFile:readFile11,unlink},path27]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env),filePath=path27.join(dir,UPGRADE_TOAST_FILE),raw=await readFile11(filePath,"utf8");unlink(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 path27 from"node:path";import{fileURLToPath as fileURLToPath4}from"node:url";function resolveCliVersion(){let injected="0.0.9-beta.25".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=path27.dirname(fileURLToPath4(import.meta.url));for(let i2=0;i2<6;i2++){let candidate=path27.join(dir,"package.json");if(existsSync3(candidate)){let raw=readFileSync2(candidate,"utf8"),pkg=JSON.parse(raw),version2=typeof pkg?.version==="string"?pkg.version.trim():"";if(version2)return version2}let parent=path27.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 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 detectPackageManager(){try{let execPath=String(process.execPath??"").trim();if(!execPath)return"npm";let normalizedDir=path28.dirname(execPath).toLowerCase().replace(/\\/g,"/");if(normalizedDir.includes(".bun/bin")||normalizedDir.endsWith(".bun/bin"))return"bun";if(normalizedDir.includes("bun/install/global/bin"))return"bun";if(normalizedDir.includes(".npm-global")||normalizedDir.includes("npm-global"))return"npm";if(typeof globalThis.Bun<"u")return"bun";return"npm"}catch{return"npm"}}function isSelfContainedBinary(proc=process){try{let execPath=String(proc.execPath??"").trim();if(!execPath)return!1;let base=path28.basename(execPath).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_semver.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:"",url2=typeof asset?.browser_download_url==="string"?asset.browser_download_url:"";if(name15===assetName&&url2)return{name:name15,url:url2}}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:"",url2=typeof link?.url==="string"?link.url:"",resolved=direct||url2;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_semver.default.valid(current))return null;let release2=await fetchLatestReleaseInfo(process.env);if(!release2)return null;if(!import_semver.default.valid(release2.version)||import_semver.default.gte(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){return await fetchReleaseInfo("latest",env)}async function fetchReleaseInfo(desired,env){let config2=resolveBinaryUpdateConfig(env),provider=config2.provider,projectInfo={host:config2.host,project:config2.project},headers=resolveAuthHeaders(env,provider),target=resolveBunTarget();if(!target)return null;let assetName=resolveAssetName(target),tagCandidates=desired==="latest"?["latest"]:buildTagCandidates(desired);for(let tagCandidate of tagCandidates){let releaseJson=await fetchReleaseJson({provider,host:projectInfo.host,project:projectInfo.project,tag:tagCandidate,headers,githubApiBaseUrl:config2.githubApiBaseUrl});if(!releaseJson)continue;let tag=String(releaseJson?.tag_name??releaseJson?.tagName??"").trim()||(tagCandidate==="latest"?"latest":tagCandidate),version2=normalizeTagToSemver(tag);if(!version2)continue;let asset=provider==="github"?selectGitHubAsset(releaseJson,assetName):selectGitLabAsset(releaseJson,assetName);if(!asset)continue;return{provider,host:projectInfo.host,project:projectInfo.project,tag,version:version2,asset,target,assetName}}return null}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 url2=buildReleaseApiUrl(opts),response=await fetch(url2,{headers:{Accept:"application/json",...opts.headers},signal:controller.signal});if(!response.ok)return null;return await response.json()}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 startAutoBinaryUpgrade(version2){try{spawn3(process.execPath,["upgrade",version2,"--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_semver2=__toESM(require_semver2(),1);import{existsSync as existsSync4}from"node:fs";import path29 from"node:path";var DEFAULT_PACKAGE_NAME="dimcode";function resolveWrapperPackageVersion(){return(process.env.DIMCODE_NPM_PACKAGE_VERSION||"").trim()||null}function resolveUpgradePackageManager(){let v2=(process.env.DIMCODE_NPM_PACKAGE_MANAGER||"").trim().toLowerCase();if(v2==="npm"||v2==="bun")return v2;return detectPackageManager()}var DEBUG_LOG_PATH=process.env.DIMCODE_DEBUG_LOG||"./dimcode-debug.log",CHECK_TIMEOUT_MS=5000,autoInstallStartedVersions=new Set;async function fetchLatestVersion(packageName=DEFAULT_PACKAGE_NAME){try{let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),CHECK_TIMEOUT_MS),response=await fetch(`https://registry.npmjs.org/${packageName}`,{signal:controller.signal,headers:{Accept:"application/json"}});if(clearTimeout(timeoutId),!response.ok)throw Error(`npm registry returned ${response.status}`);let latestVersion=(await response.json())["dist-tags"]?.latest;if(!latestVersion||typeof latestVersion!=="string")throw Error("No latest version found in registry response");return latestVersion}catch(error48){if(error48 instanceof Error&&error48.name==="AbortError")throw Error("npm registry request timed out");throw error48}}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 fetchLatestVersion(packageName);if(await logUpgradeCheck("check-result",{current,latest,hasInjectedVersion,wrapperVersion}),!latest)return await logUpgradeCheck("error",{message:"Failed to fetch latest version"}),null;if(import_semver2.default.valid(current)&&import_semver2.default.valid(latest)){if(import_semver2.default.gte(current,latest))return await logUpgradeCheck("no-update",{current,latest}),null;if(process.env.DIMCODE_AUTOUPDATE!=="0"&&hasInjectedVersion){if(autoInstallStartedVersions.has(latest))return await logUpgradeCheck("autoupdate-skip-duplicate",{version:latest}),null;return autoInstallStartedVersions.add(latest),await logUpgradeCheck("update-available",{current,latest,autoUpdate:!0}),startAutoInstall(latest,packageName),`Update available: ${packageName}@${latest} (current: ${current}). Installing in background. Restart terminal after it finishes.`}return await logUpgradeCheck("update-available",{current,latest,autoUpdate:!1}),`Update available: ${packageName}@${latest} (current: ${current})`}if(current===latest)return await logUpgradeCheck("no-update",{current,latest}),null;return await logUpgradeCheck("update-available",{current,latest,autoUpdate:!1}),`Update available: ${packageName}@${latest} (current: ${current})`}catch(error48){return await logUpgradeCheck("error",{message:error48 instanceof Error?error48.message:String(error48)}),null}}function startAutoInstall(version2,packageName=DEFAULT_PACKAGE_NAME){try{logUpgradeCheck("autoupdate-start",{version:version2});let pm=resolveUpgradePackageManager(),{command,argsPrefix}=resolvePackageManagerCommand(pm),proc=import_cross_spawn2.default(command,[...argsPrefix,"install","-g",`${packageName}@${version2}`],{stdio:"ignore",detached:!0,windowsHide:process.platform==="win32"});proc.unref();let finished=!1,finalize2=(message)=>{if(finished)return;finished=!0,logUpgradeCheck("autoupdate-finish",{version:version2,message}),notifyUpgradeToast(message)};proc.on("close",(code)=>{if(code===0)finalize2(`Update installed: ${packageName}@${version2}. Restart terminal to use the new version.`);else finalize2(`Auto-update failed. Run: ${pm} install -g ${packageName}`)}),proc.on("error",()=>{logUpgradeCheck("autoupdate-error",{version:version2,reason:"process-error"}),finalize2(`Auto-update failed. Run: ${pm} install -g ${packageName}`)})}catch{let pm=resolveUpgradePackageManager();logUpgradeCheck("autoupdate-error",{version:version2,reason:"spawn-throw"}),notifyUpgradeToast(`Auto-update failed. Run: ${pm} install -g ${packageName}`)}}async function logUpgradeCheck(_event,_data){}function safeCwd(){try{return process.cwd()}catch{return}}function safeArgv(){try{return process.argv}catch{return}}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(path29.basename(execPath).toLowerCase().startsWith("bun")&&existsSync4(execPath))return{command:execPath,argsPrefix:[]}}let bunHome=String(process.env.BUN_INSTALL??"").trim();if(bunHome){let bunExe=path29.join(bunHome,"bin","bun.exe");if(existsSync4(bunExe))return{command:bunExe,argsPrefix:[]}}return{command:"bun",argsPrefix:[]}}function resolveNpmCommand(){let execPath=String(process.execPath??"").trim(),execDir=execPath?path29.dirname(execPath):"";if(execDir){let npmCmd=path29.join(execDir,"npm.cmd");if(existsSync4(npmCmd))return{command:npmCmd,argsPrefix:[]};let npmCliCandidates=[path29.join(execDir,"node_modules","npm","bin","npm-cli.js"),path29.resolve(execDir,"..","lib","node_modules","npm","bin","npm-cli.js")];if(execPath){for(let npmCli of npmCliCandidates)if(existsSync4(npmCli))return{command:execPath,argsPrefix:[npmCli]}}}let appData=String(process.env.APPDATA??"").trim();if(appData){let npmCmd=path29.join(appData,"npm","npm.cmd");if(existsSync4(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFiles=String(process.env.ProgramFiles??"").trim();if(programFiles){let npmCmd=path29.join(programFiles,"nodejs","npm.cmd");if(existsSync4(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFilesX86=String(process.env["ProgramFiles(x86)"]??"").trim();if(programFilesX86){let npmCmd=path29.join(programFilesX86,"nodejs","npm.cmd");if(existsSync4(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 process23 from"node:process";var logger=debugLog;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(`
1179
1179
  `).length}function buildPreview(text,maxLines){let lines=text.split(`
1180
1180
  `).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(`
1181
1181
  `)}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(`
@@ -1300,5 +1300,5 @@ Read about how to prevent this error on https://github.com/vadimdemedes/ink/#isr
1300
1300
  `).replace(/\n+$/,"");if(!normalized)return{lines:[],hiddenLines:0};let raw=normalized.split(`
1301
1301
  `);return{lines:raw.slice(0,maxLines).map((line)=>line.length>lineLimit?`${line.slice(0,lineLimit)}…`:line),hiddenLines:Math.max(0,raw.length-maxLines)}}function summarizeToolArgs(args){if(!args||typeof args!=="object")return"";let obj=args;for(let key of["file_path","path","command","pattern","query","url"]){let v2=obj[key];if(typeof v2==="string"&&v2.trim())return`${key}=${trim2(v2,100)}`}try{return trim2(JSON.stringify(obj),120)}catch{return""}}function AssistantPartRow(props){let part=props.part;if(!part||typeof part!=="object")return null;switch(part.type){case"status":return null;case"thinking":{let title=String(part.title??"Thinking").trim(),body=String(part.content??"").trim();return jsx_dev_runtime10.jsxDEV(Box_default,{flexDirection:"column",marginY:0,children:[jsx_dev_runtime10.jsxDEV(Text,{color:"magenta",children:["\uD83D\uDCAD"," ",title||"Thinking"]},void 0,!0,void 0,this),body?jsx_dev_runtime10.jsxDEV(Box_default,{paddingLeft:2,children:jsx_dev_runtime10.jsxDEV(Text,{color:"#bbbbbb",children:trim2(body,800)},void 0,!1,void 0,this)},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)}case"markdown":{let md=String(part.markdown??"");if(!md.trim())return null;return jsx_dev_runtime10.jsxDEV(MarkdownBlock,{markdown:md,codeBlocks:part.codeBlocks},void 0,!1,void 0,this)}case"info":{let text=String(part.text??"").trim();if(!text)return null;return jsx_dev_runtime10.jsxDEV(Text,{color:"#bbbbbb",children:text},void 0,!1,void 0,this)}case"tool_call":{let call=part.call??{},name15=String(call?.name??"tool"),summary=summarizeToolArgs(call?.arguments);return jsx_dev_runtime10.jsxDEV(Text,{color:"yellow",children:["⚙"," ",name15,summary?jsx_dev_runtime10.jsxDEV(Text,{color:"#bbbbbb",children:[" ",summary]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this)}case"tool_output":return null;case"tool_result":{let result2=part.result??{},ok=result2?.status!=="error",plain=String(result2?.output??""),{lines,hiddenLines}=previewLines(plain);return jsx_dev_runtime10.jsxDEV(Box_default,{flexDirection:"column",paddingLeft:2,children:[jsx_dev_runtime10.jsxDEV(Text,{color:ok?"green":"red",children:[ok?"✓":"✗"," ",ok?"done":"failed",lines.length>0?` · ${lines.length} line${lines.length===1?"":"s"}`:"",hiddenLines>0?` (+${hiddenLines} more)`:""]},void 0,!0,void 0,this),lines.map((line,idx)=>jsx_dev_runtime10.jsxDEV(Text,{color:"#bbbbbb",children:line||" "},idx,!1,void 0,this))]},void 0,!0,void 0,this)}case"approve":{let req=part.request??{};if(req?.status&&req.status!=="pending")return null;return jsx_dev_runtime10.jsxDEV(Text,{color:"yellow",children:["⏸ Awaiting approval:"," ",String(req?.tool??"")," ","(",String(req?.permission??""),")"]},void 0,!0,void 0,this)}case"todo":case"plan":{let title=String(part.title??(part.type==="plan"?"Plan":"Todos")),items=Array.isArray(part.items)?part.items:[];return jsx_dev_runtime10.jsxDEV(Box_default,{flexDirection:"column",children:[jsx_dev_runtime10.jsxDEV(Text,{bold:!0,color:"green",children:title},void 0,!1,void 0,this),items.slice(0,12).map((it,idx)=>{let done=it?.done||it?.status==="completed",running=it?.status==="in_progress";return jsx_dev_runtime10.jsxDEV(Text,{color:done?"green":running?"yellow":void 0,children:[" ",done?"✔":running?"•":"◯"," ",String(it?.text??"")]},String(it?.id??idx),!0,void 0,this)})]},void 0,!0,void 0,this)}case"llm_meta":{let dur=Number(part.durationMs??0),tokens=Number(part.tokensUsed??0),calls=Number(part.toolCalls??0),seg=[];if(dur>0)seg.push(`${(dur/1000).toFixed(1)}s`);if(tokens>0)seg.push(`${tokens} tokens`);if(calls>0)seg.push(`${calls} tool calls`);if(seg.length===0)return null;return jsx_dev_runtime10.jsxDEV(Text,{color:"#bbbbbb",children:["·",seg.join(" · ")]},void 0,!0,void 0,this)}default:return null}}function resetStoreToFreshChat(store3){try{store3.interrupt()}catch{}let s2=store3.state;s2.sessionId="";try{store3.replaceMessages([])}catch{}try{store3.clearRevertedMessages?.()}catch{}if(s2.selectedToolCallId=null,s2.runningToolCallId=null,s2.paused=null,s2.approval)s2.approval.active=null,s2.approval.pendingAutoRun=null,s2.approval.queue=[],s2.approval.decisions={},s2.approval.approvedToolCalls={};if(s2.usage)s2.usage.prompt_tokens=0,s2.usage.completion_tokens=0,s2.usage.total_tokens=0;if(s2.lastRequestBudget=null,s2.sessionMeta)s2.sessionMeta.queue=[],s2.sessionMeta.queueLength=0,s2.sessionMeta.status="idle",s2.sessionMeta.lastUpdatedAt=0,s2.sessionMeta.lastErrorCode=void 0,s2.sessionMeta.pinnedMessageIds=[],s2.sessionMeta.titleSuggestedAt=void 0}var pending=null;function requestSwitch(kind){pending=kind}function consumeSwitch(){let v2=pending;return pending=null,v2}var jsx_dev_runtime11=__toESM(require_react_jsx_dev_runtime_development(),1),SLASH_COMMANDS=[{name:"home",desc:"go back to home"},{name:"new",desc:"start a new chat"},{name:"provider",desc:"pick / connect a provider"},{name:"model",desc:"change model"},{name:"settings",desc:"open settings"},{name:"compact",desc:"compact the session transcript"},{name:"opentui",desc:"switch to the opentui TUI"},{name:"help",desc:"show this list"}];function filterSlashCommands(input){if(!input.startsWith("/"))return[];let query=input.slice(1).toLowerCase();if(!query)return SLASH_COMMANDS;return SLASH_COMMANDS.filter((c)=>c.name.startsWith(query))}function looksLikeFilePaths(text){let lines=text.split(/\r?\n/).map((l2)=>l2.trim()).filter(Boolean);if(lines.length===0)return[];let isPathLine=(line)=>{if(line.startsWith("/")||line.startsWith("~/")||line.startsWith("file://"))return!0;if(/^[A-Z]:[\\/]/i.test(line))return!0;return!1};if(lines.every(isPathLine))return lines;if(lines.length===1&&isPathLine(lines[0]))return lines;return[]}function makePasteTokenLabel(text){let lineCount=(text.match(/\n/g)||[]).length+1;return`[paste-${Math.random().toString(36).slice(2,7)} · ${lineCount} lines]`}function stripFileUriPrefix(p2){if(p2.startsWith("file://"))return decodeURIComponent(p2.slice(7));return p2}function parseFocusFiles(text){let matches2=text.matchAll(/(?:^|\s)@(\S+)/g),seen=new Set,out=[];for(let m2 of matches2){let raw=m2[1]?.trim();if(!raw)continue;let cleaned=raw.replace(/[,.;:)\]}]+$/,"");if(!cleaned||seen.has(cleaned))continue;seen.add(cleaned),out.push(cleaned)}return out}var SLASH_HELP=["/home — go back to home","/new — start a new chat","/provider — pick / connect a provider","/model — change model","/settings — open settings","/compact — compact the session transcript","/opentui — switch to the opentui TUI","/help — show this list"].join(`
1302
1302
  `);function appendCompactInfoMessage(store3,text){let body=String(text??"").trim();if(!body)return;let msg={id:`compact-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,role:"assistant",createdAtMs:Date.now(),parts:[{type:"status",text:""},{type:"markdown",markdown:body}]};store3.state.messages.push(msg),store3.state.layoutDirtySeq=(store3.state.layoutDirtySeq??0)+1}var SPINNER_FRAMES=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],SPINNER_INTERVAL_MS=80,MARQUEE_WIDTH=10,MARQUEE_INTERVAL_MS=180,MARQUEE_GAP=" ";function useSpinnerFrame(active){let[idx,setIdx]=import_react33.useState(0);return import_react33.useEffect(()=>{if(!active){setIdx(0);return}let handle=setInterval(()=>setIdx((i2)=>(i2+1)%SPINNER_FRAMES.length),SPINNER_INTERVAL_MS);return()=>clearInterval(handle)},[active]),SPINNER_FRAMES[idx]??SPINNER_FRAMES[0]}function useMarquee(text,active,width=MARQUEE_WIDTH){let[offset,setOffset]=import_react33.useState(0);import_react33.useEffect(()=>{if(!active){setOffset(0);return}let handle=setInterval(()=>setOffset((o2)=>o2+1),MARQUEE_INTERVAL_MS);return()=>clearInterval(handle)},[active]);let normalized=text.replace(/\s+/g," ").trim();if(!normalized)return"";if(normalized.length<=width)return normalized.padEnd(width," ");let looped=normalized+MARQUEE_GAP,start=offset%looped.length;return(looped+looped).slice(start,start+width)}function useElapsedSeconds(active){let startRef=import_react33.useRef(null),[seconds,setSeconds]=import_react33.useState(0);return import_react33.useEffect(()=>{if(!active){startRef.current=null,setSeconds(0);return}startRef.current=Date.now(),setSeconds(0);let handle=setInterval(()=>{if(startRef.current==null)return;setSeconds(Math.floor((Date.now()-startRef.current)/1000))},250);return()=>clearInterval(handle)},[active]),seconds}function MessageRow(props){let m2=props.message;if(m2.role==="user"){let content=String(m2.content??"");return jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"row",children:[jsx_dev_runtime11.jsxDEV(Box_default,{marginRight:1,children:jsx_dev_runtime11.jsxDEV(Text,{color:"#888888",children:"›"},void 0,!1,void 0,this)},void 0,!1,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",flexGrow:1,children:content.split(`
1303
- `).map((line,idx)=>jsx_dev_runtime11.jsxDEV(Text,{children:line||" "},idx,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(m2.role==="assistant"){let parts=Array.isArray(m2.parts)?m2.parts:[];return jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"row",children:[jsx_dev_runtime11.jsxDEV(Box_default,{marginRight:1,children:jsx_dev_runtime11.jsxDEV(Text,{color:"green",children:"●"},void 0,!1,void 0,this)},void 0,!1,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",flexGrow:1,children:parts.length===0?jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:"…"},void 0,!1,void 0,this):parts.map((part,idx)=>jsx_dev_runtime11.jsxDEV(AssistantPartRow,{part},`${m2.id}:${idx}`,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(m2.role==="tool")return jsx_dev_runtime11.jsxDEV(Text,{},void 0,!1,void 0,this);return jsx_dev_runtime11.jsxDEV(Text,{},void 0,!1,void 0,this)}var PENDING_STEER_PREVIEW_LIMIT=240;function ChatPage(){let app=useInkApp(),{stdout}=use_stdout_default(),[columns,setColumns]=import_react33.useState(()=>stdout?.columns??80);import_react33.useEffect(()=>{if(!stdout)return;let onResize=()=>setColumns(stdout.columns??80);return stdout.on("resize",onResize),()=>{stdout.off("resize",onResize)}},[stdout]);let[input,setInput]=import_react33.useState(""),[sendErr,setSendErr]=import_react33.useState(""),[overlay,setOverlay]=import_react33.useState(null),[reasoningEffortRequest,setReasoningEffortRequest]=import_react33.useState(null),[notice,setNotice]=import_react33.useState(""),[menuCursor,setMenuCursor]=import_react33.useState(0),[inputCursor,setInputCursor]=import_react33.useState(0),[pendingSteers,setPendingSteers]=import_react33.useState([]),[compacting,setCompacting]=import_react33.useState(!1),addPendingSteer=import_react33.useCallback((text)=>{let id3=`steer_${Date.now()}_${Math.random().toString(36).slice(2,7)}`;return setPendingSteers((prev)=>[...prev,{id:id3,text,status:"sending"}]),id3},[]),resolvePendingSteer=import_react33.useCallback((id3,result2,error48)=>{setPendingSteers((prev)=>prev.map((p2)=>p2.id===id3?{...p2,status:result2,...error48?{error:error48}:{}}:p2))},[]),dismissPendingSteer=import_react33.useCallback((id3)=>{setPendingSteers((prev)=>prev.filter((p2)=>p2.id!==id3))},[]),setInputValue=import_react33.useCallback((next)=>{setInput(next),setInputCursor((c)=>Math.min(next.length,c))},[]),pasteTokensRef=import_react33.useRef(new Map),mentionCountRef=import_react33.useRef(0),inputCursorRef=import_react33.useRef(inputCursor);import_react33.useEffect(()=>{inputCursorRef.current=inputCursor},[inputCursor]);let insertAtInputCursor=import_react33.useCallback((insert)=>{setInput((prev)=>{let cur=Math.min(inputCursorRef.current,prev.length),next=prev.slice(0,cur)+insert+prev.slice(cur),nextCursor=cur+insert.length;return inputCursorRef.current=nextCursor,setInputCursor(nextCursor),next})},[]),appendToInput=import_react33.useCallback((text)=>{setInput((prev)=>{let sep=prev.length===0||/\s$/.test(prev)?"":" ",next=prev+sep+text,nextCursor=next.length;return inputCursorRef.current=nextCursor,setInputCursor(nextCursor),next})},[]),slashMatches=import_react33.useMemo(()=>filterSlashCommands(input),[input]),menuOpen=slashMatches.length>0;import_react33.useEffect(()=>{if(menuCursor>=slashMatches.length)setMenuCursor(0)},[slashMatches.length,menuCursor]);let handleSlash=import_react33.useCallback((raw)=>{let trimmed=raw.trim();if(!trimmed.startsWith("/"))return{kind:"pass"};let[cmd]=trimmed.slice(1).split(/\s+/);switch(cmd?.toLowerCase()){case"home":return app.navigate("home"),{kind:"consumed"};case"new":return resetStoreToFreshChat(app.store),setNotice("Started a new chat."),{kind:"consumed"};case"provider":case"connect":return setOverlay("provider"),{kind:"consumed"};case"model":return setOverlay("model"),{kind:"consumed"};case"settings":return setOverlay("settings"),{kind:"consumed"};case"compact":{let store3=app.store,fn=store3.compactSession;if(typeof fn!=="function")return{kind:"consumed",note:"Compaction is not available."};if(compacting)return{kind:"consumed",note:"Compaction already in progress."};return setCompacting(!0),(async()=>{try{let res=await fn.call(store3),text=res?.success?res?.message?`Session compacted — ${res.message}`:"Session compacted.":`Compaction failed${res?.message?`: ${res.message}`:"."}`;appendCompactInfoMessage(store3,text)}catch(err){let text=err instanceof Error?`Compaction failed: ${err.message}`:"Compaction failed.";appendCompactInfoMessage(store3,text)}finally{setCompacting(!1)}})(),{kind:"consumed"}}case"opentui":return requestSwitch("opentui"),app.exit(),{kind:"consumed",note:"Switching to opentui…"};case"help":case"?":return{kind:"consumed",note:SLASH_HELP};default:return{kind:"consumed",note:`Unknown command: /${cmd}`}}},[app,compacting]),sessionId=useReactive(()=>String(app.store.state.sessionId??"").trim()),running=useReactive(()=>Boolean(app.store.state.runningAgentRound)),approvalPending=useReactive(()=>{let s2=app.store.state;if(s2.approval?.active?.status==="pending")return!0;if(s2.paused?.kind==="tool_approval")return!0;return!1}),askUserActive=useReactive(()=>app.store.state.paused?.kind==="ask_user"),askUserAutoResolveKey=useReactive(()=>{let paused=app.store.state.paused;if(paused?.kind!=="ask_user"||!paused.autoResolve)return"";return String(paused.toolCallId??paused.actionId??"")}),lastAutoResolvedRef=import_react33.useRef("");import_react33.useEffect(()=>{if(!askUserAutoResolveKey||askUserAutoResolveKey===lastAutoResolvedRef.current)return;lastAutoResolvedRef.current=askUserAutoResolveKey;let fn=app.store.submitAskUserAnswers;if(typeof fn!=="function")return;fn({__hostError:"AskUserQuestion was invoked without valid questions/options. Retry the call with a non-empty `questions` array; each question needs `question`, `kind`, and at least one `options[].label`."})},[askUserAutoResolveKey,app.store]);let providerId=useReactive(()=>String(app.store.state?.provider?.activeId??"").trim()),providerDisplay=useReactive(()=>resolveProviderDisplay(app.store.state)),modelId=useReactive(()=>String(app.store.state.config?.model??"")),modelDisplay=useReactive(()=>resolveModelDisplay(app.store.state)),messageCount=useReactive(()=>app.store.state.messages.length),mcpPhase=useReactive(()=>String(app.store.state?.mcp?.phase??"")),mcpConnected=useReactive(()=>Number(app.store.state?.mcp?.connectedCount??0)),mcpConfigured=useReactive(()=>Number(app.store.state?.mcp?.configuredCount??0)),usageTotal=useReactive(()=>Number(app.store.state?.usage?.total_tokens??0)),contextWindow=useReactive(()=>Math.max(1,Number(app.store.state?.config?.context_window)||128000)),focusFilesJoined=useReactive(()=>{let ff=app.store.state?.context?.focusFiles;return Array.isArray(ff)?ff.join(", "):""}),allMessages=import_react33.useMemo(()=>app.store.state.messages.slice(),[messageCount,running,app.store]),lastAssistantIndex=import_react33.useMemo(()=>{for(let i2=allMessages.length-1;i2>=0;i2-=1)if(allMessages[i2]?.role==="assistant")return i2;return-1},[allMessages]),liveMessage=lastAssistantIndex>=0?allMessages[lastAssistantIndex]:void 0,committedMessages=import_react33.useMemo(()=>{let upto=lastAssistantIndex>=0?lastAssistantIndex:allMessages.length;return allMessages.slice(0,upto)},[allMessages,lastAssistantIndex]),committedSteerTexts=useReactive(()=>{let out=[],msgs=app.store.state.messages;for(let m2 of msgs)if(m2?.role==="user"&&m2?.metadata?.steer===!0){let text=String(m2.content??"").trim();if(text)out.push(text)}return out.join("\x00")});import_react33.useEffect(()=>{if(pendingSteers.length===0)return;let committed=new Set(committedSteerTexts.split("\x00").filter(Boolean));if(committed.size===0)return;setPendingSteers((prev)=>prev.filter((p2)=>!(p2.status==="delivered"&&committed.has(p2.text.trim()))))},[committedSteerTexts,pendingSteers.length]),import_react33.useEffect(()=>{if(running||pendingSteers.length===0)return;let orphans=pendingSteers.filter((p2)=>p2.status==="delivered");if(orphans.length===0)return;setPendingSteers((rest2)=>rest2.filter((p2)=>p2.status!=="delivered"));let store3=app.store,sendFn=store3.send??store3.sendUser;if(typeof sendFn!=="function")return;(async()=>{for(let o2 of orphans)try{await sendFn({content:o2.text})}catch{}})()},[running,pendingSteers,app.store]);let attachmentSessionId=import_react33.useCallback(()=>{return sessionId||HOME_SESSION_ATTACHMENT_SESSION_ID},[sessionId]),insertMentionToken=import_react33.useCallback((absPath)=>{let idx=mentionCountRef.current++,label=`[${focusFileDisplayLabel(absPath,idx)}]`;pasteTokensRef.current.set(label,{kind:"mention",path:absPath}),appendToInput(label)},[appendToInput]),handlePaste=import_react33.useCallback((text)=>{if(!text)return!1;let filePaths=looksLikeFilePaths(text);if(filePaths.length>0){let sid=attachmentSessionId();return Promise.all(filePaths.map((p2)=>cacheDroppedFileToSession(stripFileUriPrefix(p2),{sessionId:sid}).then((cached2)=>cached2??stripFileUriPrefix(p2)).catch(()=>stripFileUriPrefix(p2)))).then((results)=>{for(let result2 of results){let cleaned=String(result2??"").trim();if(cleaned)insertMentionToken(cleaned)}}),!0}if((text.match(/\n/g)||[]).length+1>3||text.length>200){let label=makePasteTokenLabel(text);return pasteTokensRef.current.set(label,{kind:"multiline",text}),insertAtInputCursor(label),!0}return!1},[attachmentSessionId,insertMentionToken,insertAtInputCursor]),pastingImageRef=import_react33.useRef(!1),tryPasteClipboardImage=import_react33.useCallback(()=>{if(pastingImageRef.current)return;pastingImageRef.current=!0,setNotice("Pasting image from clipboard…"),pasteClipboardImageToTempFile({sessionId:attachmentSessionId()}).then((imagePath)=>{let cleaned=String(imagePath??"").trim();if(cleaned)insertMentionToken(cleaned),setNotice("");else setNotice("No image found on the clipboard.")}).catch((err)=>{setNotice(err instanceof Error?`Image paste failed: ${err.message}`:"Image paste failed.")}).finally(()=>{pastingImageRef.current=!1})},[attachmentSessionId,insertMentionToken]),submit=import_react33.useCallback(async(content)=>{let expanded=content,tokenFocusFiles=[];if(pasteTokensRef.current.size>0){for(let[label,token]of pasteTokensRef.current.entries()){if(!expanded.includes(label))continue;if(token.kind==="multiline")expanded=expanded.split(label).join(token.text);else if(expanded=expanded.split(label).join(""),!tokenFocusFiles.includes(token.path))tokenFocusFiles.push(token.path)}pasteTokensRef.current.clear(),mentionCountRef.current=0}let text=expanded.trim();if(!text&&tokenFocusFiles.length===0)return;let store3=app.store;if(store3.state?.approval?.active?.status==="pending"||store3.state?.paused?.kind==="tool_approval"){setNotice("Approve or deny the pending tool call before sending more input.");return}if(store3.state?.paused?.kind==="ask_user"){setNotice("Answer the pending question before sending more input.");return}if(text.startsWith("/")&&slashMatches.length>0){let picked=slashMatches[Math.min(menuCursor,slashMatches.length-1)];if(picked){setInput(""),setInputCursor(0),setSendErr("");let outcome=handleSlash(`/${picked.name}`);setNotice(outcome.kind==="consumed"?outcome.note??"":"");return}}setInput(""),setInputCursor(0),setSendErr("");let slash=handleSlash(text);if(slash.kind==="consumed"){setNotice(slash.note??"");return}setNotice("");try{let focusFiles=[...parseFocusFiles(text)];for(let p2 of tokenFocusFiles)if(!focusFiles.includes(p2))focusFiles.push(p2);let sid=String(store3.state?.sessionId??"").trim();if(sid&&focusFiles.some(isHomeAttachmentPath))try{focusFiles=await relocateHomeAttachmentsToSession(focusFiles,sid)}catch{}if(focusFiles.length>0&&typeof store3.setFocusFiles==="function")try{store3.setFocusFiles(focusFiles)}catch{}if(store3.state?.runningAgentRound){if(typeof store3.steer!=="function"){setSendErr("Cannot steer — steer is not available on this store.");return}let steerId=addPendingSteer(text);try{let steered=await store3.steer(text);resolvePendingSteer(steerId,steered?"delivered":"failed",steered?void 0:"Steer rejected by the running round.")}catch(err){resolvePendingSteer(steerId,"failed",err instanceof Error?err.message:String(err))}return}let fn=store3.send??store3.sendUser;if(typeof fn!=="function"){setSendErr("store.send is not available");return}if(await fn({content:text,focusFiles:focusFiles.length>0?focusFiles:void 0}),typeof store3.setFocusFiles==="function")try{store3.setFocusFiles([])}catch{}}catch(err){setSendErr(err instanceof Error?err.message:String(err))}},[app.store,handleSlash,slashMatches,menuCursor,addPendingSteer,resolvePendingSteer]);use_input_default((keyInput,key)=>{if(overlay)return;if(key.ctrl&&keyInput==="v"){tryPasteClipboardImage();return}if(key.ctrl&&keyInput==="x"&&pendingSteers.some((p2)=>p2.status==="failed")){for(let p2 of pendingSteers)if(p2.status==="failed")dismissPendingSteer(p2.id);return}if(menuOpen){if(key.tab){let picked=slashMatches[menuCursor];if(picked){let next=`/${picked.name} `;setInput(next),setInputCursor(next.length)}return}if(key.downArrow){setMenuCursor((c)=>(c+1)%Math.max(1,slashMatches.length));return}if(key.upArrow){setMenuCursor((c)=>(c-1+slashMatches.length)%Math.max(1,slashMatches.length));return}}if(key.escape){let store3=app.store;if(store3.state?.runningAgentRound&&typeof store3.interrupt==="function"){store3.interrupt(),setNotice("Interrupting current round…");return}app.navigate("home")}});let spinnerFrame=useSpinnerFrame(running||compacting),elapsedSeconds=useElapsedSeconds(running),compactElapsed=useElapsedSeconds(compacting),latestThinking=useReactive(()=>{let msgs=app.store.state.messages;for(let i2=msgs.length-1;i2>=0;i2-=1){let m2=msgs[i2];if(m2?.role!=="assistant")continue;let parts=Array.isArray(m2.parts)?m2.parts:[];for(let j2=parts.length-1;j2>=0;j2-=1){let p2=parts[j2];if(p2?.type==="thinking"){let content=String(p2.content??"").trim();if(content)return content}}return""}return""}),marqueeText=useMarquee(latestThinking,running&&Boolean(latestThinking)),inputFocused=!approvalPending&&!askUserActive&&!overlay;if(overlay==="provider")return jsx_dev_runtime11.jsxDEV(ProviderConnectDialog,{onClose:()=>setOverlay(null)},void 0,!1,void 0,this);if(overlay==="model")return jsx_dev_runtime11.jsxDEV(ModelSelectDialog,{onClose:()=>setOverlay(null),onRequestReasoningEffort:(request)=>{setReasoningEffortRequest(request),setOverlay("reasoningEffort")}},void 0,!1,void 0,this);if(overlay==="reasoningEffort"&&reasoningEffortRequest)return jsx_dev_runtime11.jsxDEV(ReasoningEffortDialog,{modelId:reasoningEffortRequest.modelId,options:reasoningEffortRequest.options,initial:reasoningEffortRequest.initial,onClose:()=>{setReasoningEffortRequest(null),setOverlay(null)}},void 0,!1,void 0,this);if(overlay==="settings")return jsx_dev_runtime11.jsxDEV(SettingsDialog,{onClose:()=>setOverlay(null)},void 0,!1,void 0,this);return jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",children:[jsx_dev_runtime11.jsxDEV(Static,{items:committedMessages,children:(m2)=>jsx_dev_runtime11.jsxDEV(MessageRow,{message:m2},m2.id,!1,void 0,this)},sessionId||"no-session",!1,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",children:[allMessages.length===0?jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:"No messages yet — type below to start."},void 0,!1,void 0,this):null,liveMessage?jsx_dev_runtime11.jsxDEV(MessageRow,{message:liveMessage},void 0,!1,void 0,this):null,running?jsx_dev_runtime11.jsxDEV(Text,{color:"green",children:[spinnerFrame," ","thinking…",marqueeText?` · ${marqueeText}`:""," ","(",elapsedSeconds,"s · Esc to interrupt)"]},void 0,!0,void 0,this):null,compacting?jsx_dev_runtime11.jsxDEV(Text,{color:"yellow",children:[spinnerFrame," ","compacting session…"," ","(",compactElapsed,"s)"]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",children:[jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:[sessionId?sessionId.slice(0,8):"(no session)"," · ",providerDisplay||providerId||"no provider",modelId?` · ${modelDisplay||modelId}`:"",usageTotal>0?(()=>{let pct=Math.max(0,Math.min(100,Math.round(usageTotal/contextWindow*100)));return` · ${pct>=88?"●":pct>=63?"◕":pct>=38?"◑":pct>=13?"◔":"○"} ${pct}%`})():"",mcpConfigured>0||mcpPhase?` · mcp ${mcpConnected}/${mcpConfigured}${mcpPhase&&mcpPhase!=="ready"?` (${mcpPhase})`:""}`:"",running?` · ${elapsedSeconds}s`:""]},void 0,!0,void 0,this),focusFilesJoined?jsx_dev_runtime11.jsxDEV(Text,{color:"blue",children:`@${focusFilesJoined}`},void 0,!1,void 0,this):null]},void 0,!0,void 0,this),approvalPending?jsx_dev_runtime11.jsxDEV(ApprovalPopup,{},void 0,!1,void 0,this):null,askUserActive?jsx_dev_runtime11.jsxDEV(AskUserPopup,{},void 0,!1,void 0,this):null,pendingSteers.length>0?jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",marginTop:1,borderStyle:"single",borderColor:"cyan",paddingX:1,children:[jsx_dev_runtime11.jsxDEV(Text,{color:"cyan",bold:!0,children:"↪ Steering the running round"},void 0,!1,void 0,this),pendingSteers.map((p2)=>{let preview=p2.text.length>PENDING_STEER_PREVIEW_LIMIT?`${p2.text.slice(0,PENDING_STEER_PREVIEW_LIMIT)}…`:p2.text,icon=p2.status==="sending"?spinnerFrame:p2.status==="delivered"?"✓":"✗",statusColor=p2.status==="sending"?"cyan":p2.status==="delivered"?"green":"red",statusText=p2.status==="sending"?"sending…":p2.status==="delivered"?"delivered":`failed${p2.error?` · ${p2.error}`:""}`;return jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",children:[jsx_dev_runtime11.jsxDEV(Text,{children:[jsx_dev_runtime11.jsxDEV(Text,{color:statusColor,children:[icon," "]},void 0,!0,void 0,this),jsx_dev_runtime11.jsxDEV(Text,{color:statusColor,children:statusText},void 0,!1,void 0,this)]},void 0,!0,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{paddingLeft:2,children:jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:preview},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},p2.id,!0,void 0,this)}),pendingSteers.some((p2)=>p2.status==="failed")?jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:"Steer failed — press Ctrl+X to dismiss or retype to retry."},void 0,!1,void 0,this):null]},void 0,!0,void 0,this):null,sendErr?jsx_dev_runtime11.jsxDEV(Text,{color:"red",children:sendErr},void 0,!1,void 0,this):null,notice?jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",marginTop:1,children:notice.split(`
1304
- `).map((line,idx)=>jsx_dev_runtime11.jsxDEV(Text,{color:"green",children:line},idx,!1,void 0,this))},void 0,!1,void 0,this):null,menuOpen?jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",marginTop:1,borderStyle:"single",borderColor:"green",paddingX:1,children:[jsx_dev_runtime11.jsxDEV(Text,{color:"green",bold:!0,children:"Commands"},void 0,!1,void 0,this),slashMatches.map((cmd,idx)=>jsx_dev_runtime11.jsxDEV(Text,{color:idx===menuCursor?"green":void 0,children:[idx===menuCursor?"▶ ":" ","/",cmd.name,jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:[" ",cmd.desc]},void 0,!0,void 0,this)]},cmd.name,!0,void 0,this)),jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:"↑/↓ move · Tab autocomplete · Enter run"},void 0,!1,void 0,this)]},void 0,!0,void 0,this):null,(()=>{let hint=running?"Esc interrupt · Enter steer · scroll terminal for history · Ctrl+C quit":"Esc home · paste files/multiline · Ctrl+V image · Ctrl+J newline · Ctrl+C quit · /help",rule="─".repeat(Math.max(1,columns-2));return jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",marginTop:1,children:[jsx_dev_runtime11.jsxDEV(Text,{color:"#666666",children:rule},void 0,!1,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{children:[jsx_dev_runtime11.jsxDEV(Text,{color:"green",children:"❯ "},void 0,!1,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",flexGrow:1,children:jsx_dev_runtime11.jsxDEV(MultilineInput,{value:input,onChange:setInputValue,onSubmit:submit,onPaste:handlePaste,cursor:inputCursor,onCursorChange:setInputCursor,focus:inputFocused,verticalCursorEnabled:!menuOpen,placeholder:approvalPending?"Approve or deny the pending tool call above":askUserActive?"Answer the question above to continue":running?"Steer with a message · Esc to interrupt":"Type / for commands · Enter to send · Ctrl+J newline · Ctrl+V paste image"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),jsx_dev_runtime11.jsxDEV(Text,{color:"#666666",children:rule},void 0,!1,void 0,this),jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:hint},void 0,!1,void 0,this)]},void 0,!0,void 0,this)})()]},void 0,!0,void 0,this)}var import_react34=__toESM(require_react_development(),1);var jsx_dev_runtime12=__toESM(require_react_jsx_dev_runtime_development(),1),LIST_WINDOW=12,PAGE_STEP=8;function formatRelative(ts){if(!ts||!Number.isFinite(ts))return"";let diff2=Date.now()-ts;if(diff2<60000)return"just now";if(diff2<3600000)return`${Math.floor(diff2/60000)}m ago`;if(diff2<86400000)return`${Math.floor(diff2/3600000)}h ago`;return`${Math.floor(diff2/86400000)}d ago`}function HomePage(_props){let app=useInkApp(),[sessions,setSessions]=import_react34.useState([]),[loadErr,setLoadErr]=import_react34.useState(""),[loading,setLoading]=import_react34.useState(!1),[loaded,setLoaded]=import_react34.useState(!1),[overlay,setOverlay]=import_react34.useState(null),[reasoningEffortRequest,setReasoningEffortRequest]=import_react34.useState(null),[cursor,setCursor]=import_react34.useState(0),[busy,setBusy]=import_react34.useState(!1),[renaming,setRenaming]=import_react34.useState(null),onboardingOpenedRef=import_react34.useRef(!1),upgradeMessage=app.upgradeMessage,providerId=useReactive(()=>String(app.store.state?.provider?.activeId??"").trim()),modelId=useReactive(()=>String(app.store.state.config?.model??"").trim()),cwd2=useReactive(()=>String(app.store.state.context?.cwd??"")),providerDisplay=useReactive(()=>resolveProviderDisplay(app.store.state)),modelDisplay=useReactive(()=>resolveModelDisplay(app.store.state)),reloadSessions=import_react34.useCallback(async()=>{if(!app.sessions){setSessions([]),setLoaded(!0);return}setLoading(!0);try{let list=await app.sessions.list();setSessions(list),setLoadErr("")}catch(err){setLoadErr(err instanceof Error?err.message:String(err))}finally{setLoading(!1),setLoaded(!0)}},[app.sessions]);import_react34.useEffect(()=>{reloadSessions()},[reloadSessions]),import_react34.useEffect(()=>{if(onboardingOpenedRef.current)return;if(providerId)return;onboardingOpenedRef.current=!0,setOverlay("provider")},[providerId]);let items=import_react34.useMemo(()=>{let list=[{kind:"new-chat",label:"+ New chat"},{kind:"connect-provider",label:providerId?`Provider: ${providerDisplay||providerId} (reconfigure)`:"Connect a provider"}];if(providerId)list.push({kind:"select-model",label:modelId?`Model: ${modelDisplay||modelId} (change)`:"Select model"});list.push({kind:"opentui",label:"Switch to opentui"}),list.push({kind:"settings",label:"Settings"});for(let s2 of sessions)list.push({kind:"session",label:`${s2.title||s2.id.slice(0,8)} · ${s2.messageCount}msg · ${formatRelative(s2.updatedAt)}`,session:s2});return list},[providerId,providerDisplay,modelId,modelDisplay,sessions]);import_react34.useEffect(()=>{if(cursor>=items.length)setCursor(Math.max(0,items.length-1))},[items.length,cursor]);let[scrollStart,setScrollStart]=import_react34.useState(0);import_react34.useEffect(()=>{setScrollStart((start)=>{if(cursor<start)return cursor;if(cursor>=start+LIST_WINDOW)return cursor-LIST_WINDOW+1;let maxStart=Math.max(0,items.length-LIST_WINDOW);return Math.min(start,maxStart)})},[cursor,items.length]);let visibleEnd=Math.min(items.length,scrollStart+LIST_WINDOW),hiddenBefore=scrollStart,hiddenAfter=Math.max(0,items.length-visibleEnd),activate=import_react34.useCallback(async(item)=>{if(busy)return;switch(item.kind){case"new-chat":{if(!providerId){setOverlay("provider");return}resetStoreToFreshChat(app.store),app.navigate("chat");break}case"connect-provider":setOverlay("provider");break;case"select-model":setOverlay("model");break;case"opentui":requestSwitch("opentui"),app.exit();break;case"settings":setOverlay("settings");break;case"session":if(!item.session)return;setBusy(!0);try{await app.sessions?.use?.(item.session.id),app.navigate("chat")}finally{setBusy(!1)}break}},[app,busy,providerId]);if(use_input_default((input,key)=>{if(overlay||renaming)return;if(key.upArrow||input==="k"){setCursor((c)=>Math.max(0,c-1));return}if(key.downArrow||input==="j"){setCursor((c)=>Math.min(items.length-1,c+1));return}if(key.pageUp){setCursor((c)=>Math.max(0,c-PAGE_STEP));return}if(key.pageDown){setCursor((c)=>Math.min(items.length-1,c+PAGE_STEP));return}if(input==="g"&&!key.ctrl&&!key.meta){setCursor(0);return}if(input==="G"&&!key.ctrl&&!key.meta){setCursor(Math.max(0,items.length-1));return}if(key.return){let item=items[cursor];if(item)activate(item);return}if(input==="d"&&!key.ctrl&&!key.meta){let item=items[cursor];if(item?.kind==="session"&&item.session)(async()=>{try{await app.sessions?.delete?.(item.session.id)}finally{reloadSessions()}})();return}if(input==="r"&&!key.ctrl&&!key.meta){let item=items[cursor];if(item?.kind==="session"&&item.session&&app.sessions?.rename)setRenaming({id:item.session.id,title:item.session.title??""});return}if(input==="R"&&!key.ctrl&&!key.meta||key.ctrl&&input==="r")reloadSessions()}),overlay==="provider")return jsx_dev_runtime12.jsxDEV(ProviderConnectDialog,{onClose:()=>{setOverlay(null),reloadSessions()}},void 0,!1,void 0,this);if(overlay==="model")return jsx_dev_runtime12.jsxDEV(ModelSelectDialog,{onClose:()=>setOverlay(null),onRequestReasoningEffort:(request)=>{setReasoningEffortRequest(request),setOverlay("reasoningEffort")}},void 0,!1,void 0,this);if(overlay==="reasoningEffort"&&reasoningEffortRequest)return jsx_dev_runtime12.jsxDEV(ReasoningEffortDialog,{modelId:reasoningEffortRequest.modelId,options:reasoningEffortRequest.options,initial:reasoningEffortRequest.initial,onClose:()=>{setReasoningEffortRequest(null),setOverlay(null)}},void 0,!1,void 0,this);if(overlay==="settings")return jsx_dev_runtime12.jsxDEV(SettingsDialog,{onClose:()=>setOverlay(null)},void 0,!1,void 0,this);if(renaming){let r2=renaming;return jsx_dev_runtime12.jsxDEV(Box_default,{flexDirection:"column",children:[jsx_dev_runtime12.jsxDEV(Box_default,{borderStyle:"round",borderColor:"green",paddingX:1,children:jsx_dev_runtime12.jsxDEV(Text,{bold:!0,color:"green",children:"Rename session"},void 0,!1,void 0,this)},void 0,!1,void 0,this),jsx_dev_runtime12.jsxDEV(Box_default,{marginTop:1,children:[jsx_dev_runtime12.jsxDEV(Text,{children:"Title: "},void 0,!1,void 0,this),jsx_dev_runtime12.jsxDEV(build_default,{value:r2.title,onChange:(v2)=>setRenaming({...r2,title:v2}),onSubmit:async()=>{let title=r2.title.trim();if(!title){setRenaming(null);return}try{await app.sessions?.rename?.(r2.id,title)}finally{setRenaming(null),reloadSessions()}}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),jsx_dev_runtime12.jsxDEV(Box_default,{marginTop:1,children:jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:"Enter save · Esc cancel"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}return jsx_dev_runtime12.jsxDEV(Box_default,{flexDirection:"column",children:[jsx_dev_runtime12.jsxDEV(Box_default,{borderStyle:"round",borderColor:"green",paddingX:1,flexDirection:"column",children:[jsx_dev_runtime12.jsxDEV(Text,{bold:!0,color:"green",children:"DimCode · Ink TUI"},void 0,!1,void 0,this),jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:["cwd:"," ",cwd2||"(none)"]},void 0,!0,void 0,this),jsx_dev_runtime12.jsxDEV(Text,{color:providerId?"green":"yellow",children:providerId?`Connected: ${providerDisplay||providerId}${modelId?` · model ${modelDisplay||modelId}`:""}`:'No provider connected — press Enter on "Connect a provider"'},void 0,!1,void 0,this)]},void 0,!0,void 0,this),upgradeMessage?jsx_dev_runtime12.jsxDEV(Box_default,{borderStyle:"round",borderColor:"yellow",paddingX:1,marginTop:1,children:jsx_dev_runtime12.jsxDEV(Text,{color:"yellow",children:["⬆"," ",upgradeMessage]},void 0,!0,void 0,this)},void 0,!1,void 0,this):null,loadErr?jsx_dev_runtime12.jsxDEV(Text,{color:"red",children:`Failed to load sessions: ${loadErr} (press ↻ to retry)`},void 0,!1,void 0,this):null,loading?jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:"Loading sessions…"},void 0,!1,void 0,this):null,!loading&&!loadErr&&loaded&&sessions.length===0?jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:"No saved sessions — press Enter on “+ New chat” to start one."},void 0,!1,void 0,this):null,jsx_dev_runtime12.jsxDEV(Box_default,{marginTop:1,flexDirection:"column",children:[hiddenBefore>0?jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:["↑"," ",hiddenBefore," ","more above"]},void 0,!0,void 0,this):null,items.slice(scrollStart,visibleEnd).map((item,offset)=>{let idx=scrollStart+offset;return jsx_dev_runtime12.jsxDEV(Text,{color:idx===cursor?"green":void 0,children:[idx===cursor?"▶ ":" ",item.label]},`${item.kind}:${item.session?.id??idx}`,!0,void 0,this)}),hiddenAfter>0?jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:["↓"," ",hiddenAfter," ","more below"]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this),jsx_dev_runtime12.jsxDEV(Box_default,{marginTop:1,children:jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:["↑/↓ move · PgUp/PgDn page · g/G top/bottom · Enter select · r rename · d delete · R reload · Ctrl+C quit",busy?" · working…":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}var jsx_dev_runtime13=__toESM(require_react_jsx_dev_runtime_development(),1);function computeInitialRoute(store3){let sessionId=String(store3.state.sessionId??"").trim(),hasMessages=store3.state.messages.length>0;return sessionId&&hasMessages?"chat":"home"}function InkApp(props){let{exit}=use_app_default(),[route,setRoute]=import_react35.useState(()=>computeInitialRoute(props.store)),[upgradeMessage,setUpgradeMessage]=import_react35.useState(null);import_react35.useEffect(()=>{let p2=props.upgradePromise;if(!p2)return;let cancelled=!1;return p2.then((msg)=>{if(!cancelled&&msg)setUpgradeMessage(msg)}).catch(()=>{}),()=>{cancelled=!0}},[props.upgradePromise]);let sessionId=useReactive(()=>String(props.store.state.sessionId??"").trim()),messageCount=useReactive(()=>props.store.state.messages.length),activeProviderId=useReactive(()=>String(props.store.state?.provider?.activeId??"").trim());import_react35.useEffect(()=>{if(!sessionId&&route==="chat"&&messageCount>0)setRoute("home")},[sessionId,messageCount,route]),use_input_default((input,key)=>{if(key.ctrl&&input==="c")exit()});let contextValue=import_react35.useMemo(()=>({store:props.store,agent:props.agent,sessions:props.sessions,route,navigate:setRoute,upgradeMessage,exit}),[props.store,props.agent,props.sessions,route,upgradeMessage,exit]);return jsx_dev_runtime13.jsxDEV(InkAppContext.Provider,{value:contextValue,children:jsx_dev_runtime13.jsxDEV(Box_default,{flexDirection:"column",paddingX:1,paddingY:0,children:route==="home"?jsx_dev_runtime13.jsxDEV(HomePage,{providerActive:Boolean(activeProviderId)},void 0,!1,void 0,this):jsx_dev_runtime13.jsxDEV(ChatPage,{},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this)}var jsx_dev_runtime14=__toESM(require_react_jsx_dev_runtime_development(),1);async function runInkUi(opts){let{props}=opts,proc=opts.proc??process23,store3=createDimSdkStore({toolRunner:props.toolRunner,context:props.context,agent:props.agent});props.onStoreCreated(store3),await render_default(jsx_dev_runtime14.jsxDEV(InkApp,{store:store3,agent:props.agent,sessions:props.sessions,upgradePromise:opts.upgradePromise},void 0,!1,void 0,this),{stdout:proc.stdout,stdin:proc.stdin,exitOnCtrlC:!1}).waitUntilExit()}async function main(){let cwd2=String(process24.cwd?.()??"."),env8=process24.env,upgradePromise=checkUpgrade().catch(()=>null),props=await createDimSdkShellProps({cwd:cwd2,env:env8});if(await runInkUi({props,proc:process24,upgradePromise}),consumeSwitch()==="opentui")spawnOpentui()}function spawnOpentui(){let entry=process24.argv[1];if(!entry)console.error("[goatchain] Cannot locate wrapper entry to launch opentui."),process24.exit(1);let result2=childProcess.spawnSync(process24.execPath,[entry,"opentui"],{stdio:"inherit",cwd:process24.cwd(),env:process24.env});if(result2.error)console.error("[goatchain] Failed to launch opentui:",result2.error.message),process24.exit(1);process24.exit(typeof result2.status==="number"?result2.status:0)}main().catch((err)=>{console.error("Fatal error during ink CLI setup:",err),process24.exit(1)});
1303
+ `).map((line,idx)=>jsx_dev_runtime11.jsxDEV(Text,{children:line||" "},idx,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(m2.role==="assistant"){let parts=Array.isArray(m2.parts)?m2.parts:[];return jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"row",children:[jsx_dev_runtime11.jsxDEV(Box_default,{marginRight:1,children:jsx_dev_runtime11.jsxDEV(Text,{color:"green",children:"●"},void 0,!1,void 0,this)},void 0,!1,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",flexGrow:1,children:parts.length===0?jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:"…"},void 0,!1,void 0,this):parts.map((part,idx)=>jsx_dev_runtime11.jsxDEV(AssistantPartRow,{part},`${m2.id}:${idx}`,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(m2.role==="tool")return jsx_dev_runtime11.jsxDEV(Text,{},void 0,!1,void 0,this);return jsx_dev_runtime11.jsxDEV(Text,{},void 0,!1,void 0,this)}var PENDING_STEER_PREVIEW_LIMIT=240;function ChatPage(){let app=useInkApp(),{stdout}=use_stdout_default(),[columns,setColumns]=import_react33.useState(()=>stdout?.columns??80);import_react33.useEffect(()=>{if(!stdout)return;let onResize=()=>setColumns(stdout.columns??80);return stdout.on("resize",onResize),()=>{stdout.off("resize",onResize)}},[stdout]);let[input,setInput]=import_react33.useState(""),[sendErr,setSendErr]=import_react33.useState(""),[overlay,setOverlay]=import_react33.useState(null),[reasoningEffortRequest,setReasoningEffortRequest]=import_react33.useState(null),[notice,setNotice]=import_react33.useState(""),[menuCursor,setMenuCursor]=import_react33.useState(0),[inputCursor,setInputCursor]=import_react33.useState(0),[pendingSteers,setPendingSteers]=import_react33.useState([]),[compacting,setCompacting]=import_react33.useState(!1),addPendingSteer=import_react33.useCallback((text)=>{let id3=`steer_${Date.now()}_${Math.random().toString(36).slice(2,7)}`;return setPendingSteers((prev)=>[...prev,{id:id3,text,status:"sending"}]),id3},[]),resolvePendingSteer=import_react33.useCallback((id3,result2,error48)=>{setPendingSteers((prev)=>prev.map((p2)=>p2.id===id3?{...p2,status:result2,...error48?{error:error48}:{}}:p2))},[]),dismissPendingSteer=import_react33.useCallback((id3)=>{setPendingSteers((prev)=>prev.filter((p2)=>p2.id!==id3))},[]),setInputValue=import_react33.useCallback((next)=>{setInput(next),setInputCursor((c)=>Math.min(next.length,c))},[]),pasteTokensRef=import_react33.useRef(new Map),mentionCountRef=import_react33.useRef(0),inputCursorRef=import_react33.useRef(inputCursor);import_react33.useEffect(()=>{inputCursorRef.current=inputCursor},[inputCursor]);let insertAtInputCursor=import_react33.useCallback((insert)=>{setInput((prev)=>{let cur=Math.min(inputCursorRef.current,prev.length),next=prev.slice(0,cur)+insert+prev.slice(cur),nextCursor=cur+insert.length;return inputCursorRef.current=nextCursor,setInputCursor(nextCursor),next})},[]),appendToInput=import_react33.useCallback((text)=>{setInput((prev)=>{let sep=prev.length===0||/\s$/.test(prev)?"":" ",next=prev+sep+text,nextCursor=next.length;return inputCursorRef.current=nextCursor,setInputCursor(nextCursor),next})},[]),slashMatches=import_react33.useMemo(()=>filterSlashCommands(input),[input]),menuOpen=slashMatches.length>0;import_react33.useEffect(()=>{if(menuCursor>=slashMatches.length)setMenuCursor(0)},[slashMatches.length,menuCursor]);let handleSlash=import_react33.useCallback((raw)=>{let trimmed=raw.trim();if(!trimmed.startsWith("/"))return{kind:"pass"};let[cmd]=trimmed.slice(1).split(/\s+/);switch(cmd?.toLowerCase()){case"home":return app.navigate("home"),{kind:"consumed"};case"new":return resetStoreToFreshChat(app.store),setNotice("Started a new chat."),{kind:"consumed"};case"provider":case"connect":return setOverlay("provider"),{kind:"consumed"};case"model":return setOverlay("model"),{kind:"consumed"};case"settings":return setOverlay("settings"),{kind:"consumed"};case"compact":{let store3=app.store,fn=store3.compactSession;if(typeof fn!=="function")return{kind:"consumed",note:"Compaction is not available."};if(compacting)return{kind:"consumed",note:"Compaction already in progress."};return setCompacting(!0),(async()=>{try{let res=await fn.call(store3),text=res?.success?res?.message?`Session compacted — ${res.message}`:"Session compacted.":`Compaction failed${res?.message?`: ${res.message}`:"."}`;appendCompactInfoMessage(store3,text)}catch(err){let text=err instanceof Error?`Compaction failed: ${err.message}`:"Compaction failed.";appendCompactInfoMessage(store3,text)}finally{setCompacting(!1)}})(),{kind:"consumed"}}case"opentui":return requestSwitch("opentui"),app.exit(),{kind:"consumed",note:"Switching to opentui…"};case"help":case"?":return{kind:"consumed",note:SLASH_HELP};default:return{kind:"consumed",note:`Unknown command: /${cmd}`}}},[app,compacting]),sessionId=useReactive(()=>String(app.store.state.sessionId??"").trim()),running=useReactive(()=>Boolean(app.store.state.runningAgentRound)),approvalPending=useReactive(()=>{let s2=app.store.state;if(s2.approval?.active?.status==="pending")return!0;if(s2.paused?.kind==="tool_approval")return!0;return!1}),askUserActive=useReactive(()=>app.store.state.paused?.kind==="ask_user"),askUserAutoResolveKey=useReactive(()=>{let paused=app.store.state.paused;if(paused?.kind!=="ask_user"||!paused.autoResolve)return"";return String(paused.toolCallId??paused.actionId??"")}),lastAutoResolvedRef=import_react33.useRef("");import_react33.useEffect(()=>{if(!askUserAutoResolveKey||askUserAutoResolveKey===lastAutoResolvedRef.current)return;lastAutoResolvedRef.current=askUserAutoResolveKey;let fn=app.store.submitAskUserAnswers;if(typeof fn!=="function")return;fn({__hostError:"AskUserQuestion was invoked without valid questions/options. Retry the call with a non-empty `questions` array; each question needs `question`, `kind`, and at least one `options[].label`."})},[askUserAutoResolveKey,app.store]);let providerId=useReactive(()=>String(app.store.state?.provider?.activeId??"").trim()),providerDisplay=useReactive(()=>resolveProviderDisplay(app.store.state)),modelId=useReactive(()=>String(app.store.state.config?.model??"")),modelDisplay=useReactive(()=>resolveModelDisplay(app.store.state)),messageCount=useReactive(()=>app.store.state.messages.length),mcpPhase=useReactive(()=>String(app.store.state?.mcp?.phase??"")),mcpConnected=useReactive(()=>Number(app.store.state?.mcp?.connectedCount??0)),mcpConfigured=useReactive(()=>Number(app.store.state?.mcp?.configuredCount??0)),usageTotal=useReactive(()=>Number(app.store.state?.usage?.total_tokens??0)),contextWindow=useReactive(()=>Math.max(1,Number(app.store.state?.config?.context_window)||128000)),focusFilesJoined=useReactive(()=>{let ff=app.store.state?.context?.focusFiles;return Array.isArray(ff)?ff.join(", "):""}),allMessages=import_react33.useMemo(()=>app.store.state.messages.slice(),[messageCount,running,app.store]),lastAssistantIndex=import_react33.useMemo(()=>{for(let i2=allMessages.length-1;i2>=0;i2-=1)if(allMessages[i2]?.role==="assistant")return i2;return-1},[allMessages]),keepLiveAssistant=running||compacting,liveMessage=keepLiveAssistant&&lastAssistantIndex>=0?allMessages[lastAssistantIndex]:void 0,committedMessages=import_react33.useMemo(()=>{if(!keepLiveAssistant||lastAssistantIndex<0)return allMessages;return allMessages.slice(0,lastAssistantIndex)},[allMessages,lastAssistantIndex,keepLiveAssistant]),committedSteerTexts=useReactive(()=>{let out=[],msgs=app.store.state.messages;for(let m2 of msgs)if(m2?.role==="user"&&m2?.metadata?.steer===!0){let text=String(m2.content??"").trim();if(text)out.push(text)}return out.join("\x00")});import_react33.useEffect(()=>{if(pendingSteers.length===0)return;let committed=new Set(committedSteerTexts.split("\x00").filter(Boolean));if(committed.size===0)return;setPendingSteers((prev)=>prev.filter((p2)=>!(p2.status==="delivered"&&committed.has(p2.text.trim()))))},[committedSteerTexts,pendingSteers.length]),import_react33.useEffect(()=>{if(running||pendingSteers.length===0)return;let orphans=pendingSteers.filter((p2)=>p2.status==="delivered");if(orphans.length===0)return;setPendingSteers((rest2)=>rest2.filter((p2)=>p2.status!=="delivered"));let store3=app.store,sendFn=store3.send??store3.sendUser;if(typeof sendFn!=="function")return;(async()=>{for(let o2 of orphans)try{await sendFn({content:o2.text})}catch{}})()},[running,pendingSteers,app.store]);let attachmentSessionId=import_react33.useCallback(()=>{return sessionId||HOME_SESSION_ATTACHMENT_SESSION_ID},[sessionId]),insertMentionToken=import_react33.useCallback((absPath)=>{let idx=mentionCountRef.current++,label=`[${focusFileDisplayLabel(absPath,idx)}]`;pasteTokensRef.current.set(label,{kind:"mention",path:absPath}),appendToInput(label)},[appendToInput]),handlePaste=import_react33.useCallback((text)=>{if(!text)return!1;let filePaths=looksLikeFilePaths(text);if(filePaths.length>0){let sid=attachmentSessionId();return Promise.all(filePaths.map((p2)=>cacheDroppedFileToSession(stripFileUriPrefix(p2),{sessionId:sid}).then((cached2)=>cached2??stripFileUriPrefix(p2)).catch(()=>stripFileUriPrefix(p2)))).then((results)=>{for(let result2 of results){let cleaned=String(result2??"").trim();if(cleaned)insertMentionToken(cleaned)}}),!0}if((text.match(/\n/g)||[]).length+1>3||text.length>200){let label=makePasteTokenLabel(text);return pasteTokensRef.current.set(label,{kind:"multiline",text}),insertAtInputCursor(label),!0}return!1},[attachmentSessionId,insertMentionToken,insertAtInputCursor]),pastingImageRef=import_react33.useRef(!1),tryPasteClipboardImage=import_react33.useCallback(()=>{if(pastingImageRef.current)return;pastingImageRef.current=!0,setNotice("Pasting image from clipboard…"),pasteClipboardImageToTempFile({sessionId:attachmentSessionId()}).then((imagePath)=>{let cleaned=String(imagePath??"").trim();if(cleaned)insertMentionToken(cleaned),setNotice("");else setNotice("No image found on the clipboard.")}).catch((err)=>{setNotice(err instanceof Error?`Image paste failed: ${err.message}`:"Image paste failed.")}).finally(()=>{pastingImageRef.current=!1})},[attachmentSessionId,insertMentionToken]),submit=import_react33.useCallback(async(content)=>{let expanded=content,tokenFocusFiles=[];if(pasteTokensRef.current.size>0){for(let[label,token]of pasteTokensRef.current.entries()){if(!expanded.includes(label))continue;if(token.kind==="multiline")expanded=expanded.split(label).join(token.text);else if(expanded=expanded.split(label).join(""),!tokenFocusFiles.includes(token.path))tokenFocusFiles.push(token.path)}pasteTokensRef.current.clear(),mentionCountRef.current=0}let text=expanded.trim();if(!text&&tokenFocusFiles.length===0)return;let store3=app.store;if(store3.state?.approval?.active?.status==="pending"||store3.state?.paused?.kind==="tool_approval"){setNotice("Approve or deny the pending tool call before sending more input.");return}if(store3.state?.paused?.kind==="ask_user"){setNotice("Answer the pending question before sending more input.");return}if(text.startsWith("/")&&slashMatches.length>0){let picked=slashMatches[Math.min(menuCursor,slashMatches.length-1)];if(picked){setInput(""),setInputCursor(0),setSendErr("");let outcome=handleSlash(`/${picked.name}`);setNotice(outcome.kind==="consumed"?outcome.note??"":"");return}}setInput(""),setInputCursor(0),setSendErr("");let slash=handleSlash(text);if(slash.kind==="consumed"){setNotice(slash.note??"");return}setNotice("");try{let focusFiles=[...parseFocusFiles(text)];for(let p2 of tokenFocusFiles)if(!focusFiles.includes(p2))focusFiles.push(p2);let sid=String(store3.state?.sessionId??"").trim();if(sid&&focusFiles.some(isHomeAttachmentPath))try{focusFiles=await relocateHomeAttachmentsToSession(focusFiles,sid)}catch{}if(focusFiles.length>0&&typeof store3.setFocusFiles==="function")try{store3.setFocusFiles(focusFiles)}catch{}if(store3.state?.runningAgentRound){if(typeof store3.steer!=="function"){setSendErr("Cannot steer — steer is not available on this store.");return}let steerId=addPendingSteer(text);try{let steered=await store3.steer(text);resolvePendingSteer(steerId,steered?"delivered":"failed",steered?void 0:"Steer rejected by the running round.")}catch(err){resolvePendingSteer(steerId,"failed",err instanceof Error?err.message:String(err))}return}let fn=store3.send??store3.sendUser;if(typeof fn!=="function"){setSendErr("store.send is not available");return}if(await fn({content:text,focusFiles:focusFiles.length>0?focusFiles:void 0}),typeof store3.setFocusFiles==="function")try{store3.setFocusFiles([])}catch{}}catch(err){setSendErr(err instanceof Error?err.message:String(err))}},[app.store,handleSlash,slashMatches,menuCursor,addPendingSteer,resolvePendingSteer]);use_input_default((keyInput,key)=>{if(overlay)return;if(key.ctrl&&keyInput==="v"){tryPasteClipboardImage();return}if(key.ctrl&&keyInput==="x"&&pendingSteers.some((p2)=>p2.status==="failed")){for(let p2 of pendingSteers)if(p2.status==="failed")dismissPendingSteer(p2.id);return}if(menuOpen){if(key.tab){let picked=slashMatches[menuCursor];if(picked){let next=`/${picked.name} `;setInput(next),setInputCursor(next.length)}return}if(key.downArrow){setMenuCursor((c)=>(c+1)%Math.max(1,slashMatches.length));return}if(key.upArrow){setMenuCursor((c)=>(c-1+slashMatches.length)%Math.max(1,slashMatches.length));return}}if(key.escape){let store3=app.store;if(store3.state?.runningAgentRound&&typeof store3.interrupt==="function"){store3.interrupt(),setNotice("Interrupting current round…");return}app.navigate("home")}});let spinnerFrame=useSpinnerFrame(running||compacting),elapsedSeconds=useElapsedSeconds(running),compactElapsed=useElapsedSeconds(compacting),latestThinking=useReactive(()=>{let msgs=app.store.state.messages;for(let i2=msgs.length-1;i2>=0;i2-=1){let m2=msgs[i2];if(m2?.role!=="assistant")continue;let parts=Array.isArray(m2.parts)?m2.parts:[];for(let j2=parts.length-1;j2>=0;j2-=1){let p2=parts[j2];if(p2?.type==="thinking"){let content=String(p2.content??"").trim();if(content)return content}}return""}return""}),marqueeText=useMarquee(latestThinking,running&&Boolean(latestThinking)),inputFocused=!approvalPending&&!askUserActive&&!overlay;if(overlay==="provider")return jsx_dev_runtime11.jsxDEV(ProviderConnectDialog,{onClose:()=>setOverlay(null)},void 0,!1,void 0,this);if(overlay==="model")return jsx_dev_runtime11.jsxDEV(ModelSelectDialog,{onClose:()=>setOverlay(null),onRequestReasoningEffort:(request)=>{setReasoningEffortRequest(request),setOverlay("reasoningEffort")}},void 0,!1,void 0,this);if(overlay==="reasoningEffort"&&reasoningEffortRequest)return jsx_dev_runtime11.jsxDEV(ReasoningEffortDialog,{modelId:reasoningEffortRequest.modelId,options:reasoningEffortRequest.options,initial:reasoningEffortRequest.initial,onClose:()=>{setReasoningEffortRequest(null),setOverlay(null)}},void 0,!1,void 0,this);if(overlay==="settings")return jsx_dev_runtime11.jsxDEV(SettingsDialog,{onClose:()=>setOverlay(null)},void 0,!1,void 0,this);return jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",children:[jsx_dev_runtime11.jsxDEV(Static,{items:committedMessages,children:(m2)=>jsx_dev_runtime11.jsxDEV(MessageRow,{message:m2},m2.id,!1,void 0,this)},sessionId||"no-session",!1,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",children:[allMessages.length===0?jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:"No messages yet — type below to start."},void 0,!1,void 0,this):null,liveMessage?jsx_dev_runtime11.jsxDEV(MessageRow,{message:liveMessage},void 0,!1,void 0,this):null,running?jsx_dev_runtime11.jsxDEV(Text,{color:"green",children:[spinnerFrame," ","thinking…",marqueeText?` · ${marqueeText}`:""," ","(",elapsedSeconds,"s · Esc to interrupt)"]},void 0,!0,void 0,this):null,compacting?jsx_dev_runtime11.jsxDEV(Text,{color:"yellow",children:[spinnerFrame," ","compacting session…"," ","(",compactElapsed,"s)"]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",children:[jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:[sessionId?sessionId.slice(0,8):"(no session)"," · ",providerDisplay||providerId||"no provider",modelId?` · ${modelDisplay||modelId}`:"",usageTotal>0?(()=>{let pct=Math.max(0,Math.min(100,Math.round(usageTotal/contextWindow*100)));return` · ${pct>=88?"●":pct>=63?"◕":pct>=38?"◑":pct>=13?"◔":"○"} ${pct}%`})():"",mcpConfigured>0||mcpPhase?` · mcp ${mcpConnected}/${mcpConfigured}${mcpPhase&&mcpPhase!=="ready"?` (${mcpPhase})`:""}`:"",running?` · ${elapsedSeconds}s`:""]},void 0,!0,void 0,this),focusFilesJoined?jsx_dev_runtime11.jsxDEV(Text,{color:"blue",children:`@${focusFilesJoined}`},void 0,!1,void 0,this):null]},void 0,!0,void 0,this),approvalPending?jsx_dev_runtime11.jsxDEV(ApprovalPopup,{},void 0,!1,void 0,this):null,askUserActive?jsx_dev_runtime11.jsxDEV(AskUserPopup,{},void 0,!1,void 0,this):null,pendingSteers.length>0?jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",marginTop:1,borderStyle:"single",borderColor:"cyan",paddingX:1,children:[jsx_dev_runtime11.jsxDEV(Text,{color:"cyan",bold:!0,children:"↪ Steering the running round"},void 0,!1,void 0,this),pendingSteers.map((p2)=>{let preview=p2.text.length>PENDING_STEER_PREVIEW_LIMIT?`${p2.text.slice(0,PENDING_STEER_PREVIEW_LIMIT)}…`:p2.text,icon=p2.status==="sending"?spinnerFrame:p2.status==="delivered"?"✓":"✗",statusColor=p2.status==="sending"?"cyan":p2.status==="delivered"?"green":"red",statusText=p2.status==="sending"?"sending…":p2.status==="delivered"?"delivered":`failed${p2.error?` · ${p2.error}`:""}`;return jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",children:[jsx_dev_runtime11.jsxDEV(Text,{children:[jsx_dev_runtime11.jsxDEV(Text,{color:statusColor,children:[icon," "]},void 0,!0,void 0,this),jsx_dev_runtime11.jsxDEV(Text,{color:statusColor,children:statusText},void 0,!1,void 0,this)]},void 0,!0,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{paddingLeft:2,children:jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:preview},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},p2.id,!0,void 0,this)}),pendingSteers.some((p2)=>p2.status==="failed")?jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:"Steer failed — press Ctrl+X to dismiss or retype to retry."},void 0,!1,void 0,this):null]},void 0,!0,void 0,this):null,sendErr?jsx_dev_runtime11.jsxDEV(Text,{color:"red",children:sendErr},void 0,!1,void 0,this):null,notice?jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",marginTop:1,children:notice.split(`
1304
+ `).map((line,idx)=>jsx_dev_runtime11.jsxDEV(Text,{color:"green",children:line},idx,!1,void 0,this))},void 0,!1,void 0,this):null,menuOpen?jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",marginTop:1,borderStyle:"single",borderColor:"green",paddingX:1,children:[jsx_dev_runtime11.jsxDEV(Text,{color:"green",bold:!0,children:"Commands"},void 0,!1,void 0,this),slashMatches.map((cmd,idx)=>jsx_dev_runtime11.jsxDEV(Text,{color:idx===menuCursor?"green":void 0,children:[idx===menuCursor?"▶ ":" ","/",cmd.name,jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:[" ",cmd.desc]},void 0,!0,void 0,this)]},cmd.name,!0,void 0,this)),jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:"↑/↓ move · Tab autocomplete · Enter run"},void 0,!1,void 0,this)]},void 0,!0,void 0,this):null,(()=>{let hint=running?"Esc interrupt · Enter steer · scroll terminal for history · Ctrl+C quit":"Esc home · paste files/multiline · Ctrl+V image · Ctrl+J newline · Ctrl+C quit · /help",rule="─".repeat(Math.max(1,columns-2));return jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",marginTop:1,children:[jsx_dev_runtime11.jsxDEV(Text,{color:"#666666",children:rule},void 0,!1,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{children:[jsx_dev_runtime11.jsxDEV(Text,{color:"green",children:"❯ "},void 0,!1,void 0,this),jsx_dev_runtime11.jsxDEV(Box_default,{flexDirection:"column",flexGrow:1,children:jsx_dev_runtime11.jsxDEV(MultilineInput,{value:input,onChange:setInputValue,onSubmit:submit,onPaste:handlePaste,cursor:inputCursor,onCursorChange:setInputCursor,focus:inputFocused,verticalCursorEnabled:!menuOpen,placeholder:approvalPending?"Approve or deny the pending tool call above":askUserActive?"Answer the question above to continue":running?"Steer with a message · Esc to interrupt":"Type / for commands · Enter to send · Ctrl+J newline · Ctrl+V paste image"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),jsx_dev_runtime11.jsxDEV(Text,{color:"#666666",children:rule},void 0,!1,void 0,this),jsx_dev_runtime11.jsxDEV(Text,{color:"#bbbbbb",children:hint},void 0,!1,void 0,this)]},void 0,!0,void 0,this)})()]},void 0,!0,void 0,this)}var import_react34=__toESM(require_react_development(),1);var jsx_dev_runtime12=__toESM(require_react_jsx_dev_runtime_development(),1),LIST_WINDOW=12,PAGE_STEP=8;function formatRelative(ts){if(!ts||!Number.isFinite(ts))return"";let diff2=Date.now()-ts;if(diff2<60000)return"just now";if(diff2<3600000)return`${Math.floor(diff2/60000)}m ago`;if(diff2<86400000)return`${Math.floor(diff2/3600000)}h ago`;return`${Math.floor(diff2/86400000)}d ago`}function HomePage(_props){let app=useInkApp(),[sessions,setSessions]=import_react34.useState([]),[loadErr,setLoadErr]=import_react34.useState(""),[loading,setLoading]=import_react34.useState(!1),[loaded,setLoaded]=import_react34.useState(!1),[overlay,setOverlay]=import_react34.useState(null),[reasoningEffortRequest,setReasoningEffortRequest]=import_react34.useState(null),[cursor,setCursor]=import_react34.useState(0),[busy,setBusy]=import_react34.useState(!1),[renaming,setRenaming]=import_react34.useState(null),onboardingOpenedRef=import_react34.useRef(!1),upgradeMessage=app.upgradeMessage,providerId=useReactive(()=>String(app.store.state?.provider?.activeId??"").trim()),modelId=useReactive(()=>String(app.store.state.config?.model??"").trim()),cwd2=useReactive(()=>String(app.store.state.context?.cwd??"")),providerDisplay=useReactive(()=>resolveProviderDisplay(app.store.state)),modelDisplay=useReactive(()=>resolveModelDisplay(app.store.state)),reloadSessions=import_react34.useCallback(async()=>{if(!app.sessions){setSessions([]),setLoaded(!0);return}setLoading(!0);try{let list=await app.sessions.list();setSessions(list),setLoadErr("")}catch(err){setLoadErr(err instanceof Error?err.message:String(err))}finally{setLoading(!1),setLoaded(!0)}},[app.sessions]);import_react34.useEffect(()=>{reloadSessions()},[reloadSessions]),import_react34.useEffect(()=>{if(onboardingOpenedRef.current)return;if(providerId)return;onboardingOpenedRef.current=!0,setOverlay("provider")},[providerId]);let items=import_react34.useMemo(()=>{let list=[{kind:"new-chat",label:"+ New chat"},{kind:"connect-provider",label:providerId?`Provider: ${providerDisplay||providerId} (reconfigure)`:"Connect a provider"}];if(providerId)list.push({kind:"select-model",label:modelId?`Model: ${modelDisplay||modelId} (change)`:"Select model"});list.push({kind:"opentui",label:"Switch to opentui"}),list.push({kind:"settings",label:"Settings"});for(let s2 of sessions)list.push({kind:"session",label:`${s2.title||s2.id.slice(0,8)} · ${s2.messageCount}msg · ${formatRelative(s2.updatedAt)}`,session:s2});return list},[providerId,providerDisplay,modelId,modelDisplay,sessions]);import_react34.useEffect(()=>{if(cursor>=items.length)setCursor(Math.max(0,items.length-1))},[items.length,cursor]);let[scrollStart,setScrollStart]=import_react34.useState(0);import_react34.useEffect(()=>{setScrollStart((start)=>{if(cursor<start)return cursor;if(cursor>=start+LIST_WINDOW)return cursor-LIST_WINDOW+1;let maxStart=Math.max(0,items.length-LIST_WINDOW);return Math.min(start,maxStart)})},[cursor,items.length]);let visibleEnd=Math.min(items.length,scrollStart+LIST_WINDOW),hiddenBefore=scrollStart,hiddenAfter=Math.max(0,items.length-visibleEnd),activate=import_react34.useCallback(async(item)=>{if(busy)return;switch(item.kind){case"new-chat":{if(!providerId){setOverlay("provider");return}resetStoreToFreshChat(app.store),app.navigate("chat");break}case"connect-provider":setOverlay("provider");break;case"select-model":setOverlay("model");break;case"opentui":requestSwitch("opentui"),app.exit();break;case"settings":setOverlay("settings");break;case"session":if(!item.session)return;setBusy(!0);try{await app.sessions?.use?.(item.session.id),app.navigate("chat")}finally{setBusy(!1)}break}},[app,busy,providerId]);if(use_input_default((input,key)=>{if(overlay||renaming)return;if(key.upArrow||input==="k"){setCursor((c)=>Math.max(0,c-1));return}if(key.downArrow||input==="j"){setCursor((c)=>Math.min(items.length-1,c+1));return}if(key.pageUp){setCursor((c)=>Math.max(0,c-PAGE_STEP));return}if(key.pageDown){setCursor((c)=>Math.min(items.length-1,c+PAGE_STEP));return}if(input==="g"&&!key.ctrl&&!key.meta){setCursor(0);return}if(input==="G"&&!key.ctrl&&!key.meta){setCursor(Math.max(0,items.length-1));return}if(key.return){let item=items[cursor];if(item)activate(item);return}if(input==="d"&&!key.ctrl&&!key.meta){let item=items[cursor];if(item?.kind==="session"&&item.session)(async()=>{try{await app.sessions?.delete?.(item.session.id)}finally{reloadSessions()}})();return}if(input==="r"&&!key.ctrl&&!key.meta){let item=items[cursor];if(item?.kind==="session"&&item.session&&app.sessions?.rename)setRenaming({id:item.session.id,title:item.session.title??""});return}if(input==="R"&&!key.ctrl&&!key.meta||key.ctrl&&input==="r")reloadSessions()}),overlay==="provider")return jsx_dev_runtime12.jsxDEV(ProviderConnectDialog,{onClose:()=>{setOverlay(null),reloadSessions()}},void 0,!1,void 0,this);if(overlay==="model")return jsx_dev_runtime12.jsxDEV(ModelSelectDialog,{onClose:()=>setOverlay(null),onRequestReasoningEffort:(request)=>{setReasoningEffortRequest(request),setOverlay("reasoningEffort")}},void 0,!1,void 0,this);if(overlay==="reasoningEffort"&&reasoningEffortRequest)return jsx_dev_runtime12.jsxDEV(ReasoningEffortDialog,{modelId:reasoningEffortRequest.modelId,options:reasoningEffortRequest.options,initial:reasoningEffortRequest.initial,onClose:()=>{setReasoningEffortRequest(null),setOverlay(null)}},void 0,!1,void 0,this);if(overlay==="settings")return jsx_dev_runtime12.jsxDEV(SettingsDialog,{onClose:()=>setOverlay(null)},void 0,!1,void 0,this);if(renaming){let r2=renaming;return jsx_dev_runtime12.jsxDEV(Box_default,{flexDirection:"column",children:[jsx_dev_runtime12.jsxDEV(Box_default,{borderStyle:"round",borderColor:"green",paddingX:1,children:jsx_dev_runtime12.jsxDEV(Text,{bold:!0,color:"green",children:"Rename session"},void 0,!1,void 0,this)},void 0,!1,void 0,this),jsx_dev_runtime12.jsxDEV(Box_default,{marginTop:1,children:[jsx_dev_runtime12.jsxDEV(Text,{children:"Title: "},void 0,!1,void 0,this),jsx_dev_runtime12.jsxDEV(build_default,{value:r2.title,onChange:(v2)=>setRenaming({...r2,title:v2}),onSubmit:async()=>{let title=r2.title.trim();if(!title){setRenaming(null);return}try{await app.sessions?.rename?.(r2.id,title)}finally{setRenaming(null),reloadSessions()}}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),jsx_dev_runtime12.jsxDEV(Box_default,{marginTop:1,children:jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:"Enter save · Esc cancel"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}return jsx_dev_runtime12.jsxDEV(Box_default,{flexDirection:"column",children:[jsx_dev_runtime12.jsxDEV(Box_default,{borderStyle:"round",borderColor:"green",paddingX:1,flexDirection:"column",children:[jsx_dev_runtime12.jsxDEV(Text,{bold:!0,color:"green",children:"DimCode · Ink TUI"},void 0,!1,void 0,this),jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:["cwd:"," ",cwd2||"(none)"]},void 0,!0,void 0,this),jsx_dev_runtime12.jsxDEV(Text,{color:providerId?"green":"yellow",children:providerId?`Connected: ${providerDisplay||providerId}${modelId?` · model ${modelDisplay||modelId}`:""}`:'No provider connected — press Enter on "Connect a provider"'},void 0,!1,void 0,this)]},void 0,!0,void 0,this),upgradeMessage?jsx_dev_runtime12.jsxDEV(Box_default,{borderStyle:"round",borderColor:"yellow",paddingX:1,marginTop:1,children:jsx_dev_runtime12.jsxDEV(Text,{color:"yellow",children:["⬆"," ",upgradeMessage]},void 0,!0,void 0,this)},void 0,!1,void 0,this):null,loadErr?jsx_dev_runtime12.jsxDEV(Text,{color:"red",children:`Failed to load sessions: ${loadErr} (press ↻ to retry)`},void 0,!1,void 0,this):null,loading?jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:"Loading sessions…"},void 0,!1,void 0,this):null,!loading&&!loadErr&&loaded&&sessions.length===0?jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:"No saved sessions — press Enter on “+ New chat” to start one."},void 0,!1,void 0,this):null,jsx_dev_runtime12.jsxDEV(Box_default,{marginTop:1,flexDirection:"column",children:[hiddenBefore>0?jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:["↑"," ",hiddenBefore," ","more above"]},void 0,!0,void 0,this):null,items.slice(scrollStart,visibleEnd).map((item,offset)=>{let idx=scrollStart+offset;return jsx_dev_runtime12.jsxDEV(Text,{color:idx===cursor?"green":void 0,children:[idx===cursor?"▶ ":" ",item.label]},`${item.kind}:${item.session?.id??idx}`,!0,void 0,this)}),hiddenAfter>0?jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:["↓"," ",hiddenAfter," ","more below"]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this),jsx_dev_runtime12.jsxDEV(Box_default,{marginTop:1,children:jsx_dev_runtime12.jsxDEV(Text,{color:"#bbbbbb",children:["↑/↓ move · PgUp/PgDn page · g/G top/bottom · Enter select · r rename · d delete · R reload · Ctrl+C quit",busy?" · working…":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}var jsx_dev_runtime13=__toESM(require_react_jsx_dev_runtime_development(),1);function computeInitialRoute(store3){let sessionId=String(store3.state.sessionId??"").trim(),hasMessages=store3.state.messages.length>0;return sessionId&&hasMessages?"chat":"home"}function InkApp(props){let{exit}=use_app_default(),[route,setRoute]=import_react35.useState(()=>computeInitialRoute(props.store)),[upgradeMessage,setUpgradeMessage]=import_react35.useState(null);import_react35.useEffect(()=>{let p2=props.upgradePromise;if(!p2)return;let cancelled=!1;return p2.then((msg)=>{if(!cancelled&&msg)setUpgradeMessage(msg)}).catch(()=>{}),()=>{cancelled=!0}},[props.upgradePromise]),import_react35.useEffect(()=>{let handler=(msg)=>{let text=String(msg??"").trim();if(text)setUpgradeMessage(text)};globalThis.__DIMCODE_UPGRADE_TOAST__=handler;let envMsg=String(process.env.DIMCODE_STARTUP_UPGRADE_TOAST??"").trim();if(envMsg)delete process.env.DIMCODE_STARTUP_UPGRADE_TOAST,setUpgradeMessage(envMsg);let cancelled=!1;return consumeUpgradeToastFile().then((fileMsg)=>{if(!cancelled&&fileMsg)setUpgradeMessage(fileMsg)}),()=>{if(cancelled=!0,globalThis.__DIMCODE_UPGRADE_TOAST__===handler)delete globalThis.__DIMCODE_UPGRADE_TOAST__}},[]);let sessionId=useReactive(()=>String(props.store.state.sessionId??"").trim()),messageCount=useReactive(()=>props.store.state.messages.length),activeProviderId=useReactive(()=>String(props.store.state?.provider?.activeId??"").trim());import_react35.useEffect(()=>{if(!sessionId&&route==="chat"&&messageCount>0)setRoute("home")},[sessionId,messageCount,route]),use_input_default((input,key)=>{if(key.ctrl&&input==="c")exit()});let contextValue=import_react35.useMemo(()=>({store:props.store,agent:props.agent,sessions:props.sessions,route,navigate:setRoute,upgradeMessage,exit}),[props.store,props.agent,props.sessions,route,upgradeMessage,exit]);return jsx_dev_runtime13.jsxDEV(InkAppContext.Provider,{value:contextValue,children:jsx_dev_runtime13.jsxDEV(Box_default,{flexDirection:"column",paddingX:1,paddingY:0,children:route==="home"?jsx_dev_runtime13.jsxDEV(HomePage,{providerActive:Boolean(activeProviderId)},void 0,!1,void 0,this):jsx_dev_runtime13.jsxDEV(ChatPage,{},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this)}var jsx_dev_runtime14=__toESM(require_react_jsx_dev_runtime_development(),1);async function runInkUi(opts){let{props}=opts,proc=opts.proc??process23,store3=createDimSdkStore({toolRunner:props.toolRunner,context:props.context,agent:props.agent});props.onStoreCreated(store3),await render_default(jsx_dev_runtime14.jsxDEV(InkApp,{store:store3,agent:props.agent,sessions:props.sessions,upgradePromise:opts.upgradePromise},void 0,!1,void 0,this),{stdout:proc.stdout,stdin:proc.stdin,exitOnCtrlC:!1}).waitUntilExit()}async function main(){let cwd2=String(process24.cwd?.()??"."),env8=process24.env,upgradePromise=checkUpgrade().catch(()=>null),props=await createDimSdkShellProps({cwd:cwd2,env:env8});if(await runInkUi({props,proc:process24,upgradePromise}),consumeSwitch()==="opentui")spawnOpentui()}function spawnOpentui(){let entry=process24.argv[1];if(!entry)console.error("[goatchain] Cannot locate wrapper entry to launch opentui."),process24.exit(1);let result2=childProcess.spawnSync(process24.execPath,[entry,"opentui"],{stdio:"inherit",cwd:process24.cwd(),env:process24.env});if(result2.error)console.error("[goatchain] Failed to launch opentui:",result2.error.message),process24.exit(1);process24.exit(typeof result2.status==="number"?result2.status:0)}main().catch((err)=>{console.error("Fatal error during ink CLI setup:",err),process24.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "goatchain-cli",
3
- "version": "0.0.9-beta.24",
3
+ "version": "0.0.9-beta.25",
4
4
  "description": "AI coding agent CLI - Ink TUI (default) with optional opentui binary",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -12,10 +12,10 @@
12
12
  "dist"
13
13
  ],
14
14
  "optionalDependencies": {
15
- "goatchain-cli-darwin-arm64": "0.0.9-beta.24",
16
- "goatchain-cli-darwin-x64": "0.0.9-beta.24",
17
- "goatchain-cli-linux-arm64": "0.0.9-beta.24",
18
- "goatchain-cli-linux-x64": "0.0.9-beta.24",
19
- "goatchain-cli-windows-x64": "0.0.9-beta.24"
15
+ "goatchain-cli-darwin-arm64": "0.0.9-beta.25",
16
+ "goatchain-cli-darwin-x64": "0.0.9-beta.25",
17
+ "goatchain-cli-linux-arm64": "0.0.9-beta.25",
18
+ "goatchain-cli-linux-x64": "0.0.9-beta.25",
19
+ "goatchain-cli-windows-x64": "0.0.9-beta.25"
20
20
  }
21
21
  }