goatchain-cli 0.0.11-beta.4 → 0.0.13-beta.0

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 +2 -2
  2. package/package.json +6 -6
package/dist/ink.mjs CHANGED
@@ -1062,7 +1062,7 @@ ${firstUserQuery}
1062
1062
  ${epoch}`).digest("hex");return record3.cachedPromptCacheKey={signature,value},value}function updateResponsesCompactionMetadata(record3,trigger){let current=readResponsesCompactionMetadata(record3.metadata);record3.metadata=toMetadataMap({...record3.metadata??{},[RESPONSES_COMPACTION_METADATA_KEY]:{epoch:current.epoch+1,lastTrigger:trigger,updatedAt:Date.now()}}),record3.cachedPromptCacheKey=void 0,record3.updatedAt=Date.now()}function injectOpenAIResponsesProviderOptions(record3,request){let runtimeConfig=runtimeConfigForActiveRun(record3);if(runtimeConfig.adapter!=="openai-responses")return request;let providerOptions={};if(request.providerOptions&&typeof request.providerOptions==="object")providerOptions={...request.providerOptions};let openaiProviderOptions={};if(providerOptions.openai&&typeof providerOptions.openai==="object"&&!Array.isArray(providerOptions.openai))openaiProviderOptions={...providerOptions.openai};let changed=!1,promptCacheKey=buildResponsesPromptCacheKey(record3,request);if(promptCacheKey)openaiProviderOptions.promptCacheKey=promptCacheKey,changed=!0;if(runtimeConfig.responsesUseSessionId===!0){let nextHeaders={},requestHeaders=openaiProviderOptions.requestHeaders;if(requestHeaders&&typeof requestHeaders==="object"&&!Array.isArray(requestHeaders)){for(let[key,value]of Object.entries(requestHeaders))if(typeof value==="string")nextHeaders[key]=value}nextHeaders.session_id=record3.sessionId,openaiProviderOptions.requestHeaders=nextHeaders,changed=!0}if(!changed)return request;return{...request,providerOptions:{...providerOptions,openai:openaiProviderOptions}}}function hasCompletedTodos2(todoSnapshot){return Array.isArray(todoSnapshot)&&todoSnapshot.length>0&&todoSnapshot.every((item)=>item.status==="completed")}function pushProviderRetryingEvent(record3,notice){let activeRun=record3.activeRun;if(!activeRun)return;activeRun.currentChannel?.push({type:"run.retrying",sessionId:record3.sessionId,runId:activeRun.runId,requestId:notice.requestId,...notice.provider?{provider:notice.provider}:{},...notice.modelId?{modelId:notice.modelId}:{},retry:notice.retry,maxRetries:notice.maxRetries,attempt:notice.attempt,maxAttempts:notice.maxAttempts,delayMs:notice.delayMs,error:structuredClone(enrichSessionErrorPayload(notice.error))})}function createProviderRetryNotificationPlugin(record3){return{manifest:{id:"dim-agent-provider-retry-notifications",version:"0.0.1",apiVersion:1,permissions:{},priority:-1e4},setup(){return{hooks:[{descriptor:{name:"model.request"},middleware:[({payload})=>({request:attachRetryNoticeSinkToModelRequest(payload.request,(notice)=>pushProviderRetryingEvent(record3,notice))})]}]}}}}function buildCompressionEventDiagnostics2(input){if(!input.notification&&!input.run)return;return{...input.run?{run:input.run}:{},...input.notification?{notification:input.notification}:{}}}function readCompressionNotificationTokensBefore2(notification){if(!notification)return;switch(notification.type){case"context.compaction.required":case"context.compacted":case"context.compaction.failed":return notification.metadata.estimatedInputTokensBefore;default:return}}function readCompressionNotificationThreshold2(notification){if(!notification)return;switch(notification.type){case"context.compaction.required":case"context.compacted":case"context.compaction.failed":return notification.metadata.thresholdTokens;default:return}}function readCompressionNotificationTokensAfter2(notification){if(!notification||notification.type!=="context.compacted")return;return notification.metadata.estimatedInputTokensAfter}function readCompressionNotificationRemovedMessages2(notification){if(!notification)return;switch(notification.type){case"context.compacted":case"context.compaction.failed":return notification.metadata.compactedMessageCount;default:return}}function readCompressionNotificationClearedToolOutputs2(notification){if(!notification)return;switch(notification.type){case"context.compacted":case"context.compaction.failed":return notification.metadata.prunedToolOutputCount;default:return}}function readCompressionNotificationReasonCode2(notification){if(!notification||notification.type!=="context.compaction.failed")return;return notification.metadata.reasonCode}function toCompressionEvent2(input){let metadata=input.metadata?toMetadataMap(input.metadata):void 0,notification=input.diagnostics?.notification,run=input.diagnostics?.run,tokensBefore=typeof metadata?.estimatedInputTokensBefore==="number"?metadata.estimatedInputTokensBefore:typeof metadata?.estimatedInputTokens==="number"?metadata.estimatedInputTokens:readCompressionNotificationTokensBefore2(notification)??run?.estimatedInputTokensBefore,threshold=typeof metadata?.thresholdTokens==="number"?metadata.thresholdTokens:readCompressionNotificationThreshold2(notification)??run?.thresholdTokens,tokensAfter=typeof metadata?.tokensAfter==="number"?metadata.tokensAfter:typeof metadata?.estimatedInputTokensAfter==="number"?metadata.estimatedInputTokensAfter:readCompressionNotificationTokensAfter2(notification)??run?.estimatedInputTokensAfter,removedMessages=typeof metadata?.removedMessages==="number"?metadata.removedMessages:typeof metadata?.compactedMessageCount==="number"?metadata.compactedMessageCount:readCompressionNotificationRemovedMessages2(notification)??run?.compactedMessageCount,clearedToolOutputs=typeof metadata?.clearedToolOutputs==="number"?metadata.clearedToolOutputs:typeof metadata?.prunedToolOutputCount==="number"?metadata.prunedToolOutputCount:readCompressionNotificationClearedToolOutputs2(notification)??run?.diagnostics.prunedToolOutputCount,reasonCode=typeof metadata?.reasonCode==="string"?metadata.reasonCode:readCompressionNotificationReasonCode2(notification)??run?.reasonCode,summaryGenerated=typeof metadata?.summaryGenerated==="boolean"?metadata.summaryGenerated:notification?.type==="context.compacted"||typeof run?.summary==="string";return{type:"context.compression",sessionId:input.sessionId,...input.runId?{runId:input.runId}:{},state:input.state,trigger:input.trigger,...input.label?{label:input.label}:{},...typeof tokensBefore==="number"?{tokensBefore}:{},...typeof threshold==="number"?{threshold}:{},...typeof tokensAfter==="number"?{tokensAfter}:{},...typeof removedMessages==="number"?{removedMessages}:{},...typeof clearedToolOutputs==="number"?{clearedToolOutputs}:{},...summaryGenerated?{summaryGenerated}:{},...typeof metadata?.elapsedMs==="number"?{elapsedMs:metadata.elapsedMs}:{},...reasonCode?{reasonCode}:{},...input.diagnostics?{diagnostics:input.diagnostics}:{},...metadata?{metadata}:{}}}class NativeAgentRuntime{options;snapshotStore;sessionStoreDir;hostDataDir;records=new Map;sharedMcpHub;backgroundExecTool=new StreamingExecTool;debugLogState=buildDebugLogState(!1,void 0);mcpInitialSyncAttempted=!1;sessions={list:async()=>await this.listSessionSnapshots(),get:async(sessionId)=>await this.getSessionSnapshot(sessionId),create:async(input)=>{let session=await this.createSession(input);return await this.getSessionSnapshot(session.id)},createWithMessages:async(messages,input)=>await this.createSessionWithMessages(messages,input),destroy:async(sessionId)=>await this.destroySession(sessionId),rename:async(sessionId,title)=>await this.renameSession(sessionId,title),updateMetadata:async(sessionId,metadata)=>await this.updateSessionMetadata(sessionId,metadata),interrupt:async(sessionId)=>{let session=await this.openSession(sessionId);if(!session)return!1;return await session.cancel()},getUsageSummary:async(sessionId)=>await this.getSessionUsageSummary(sessionId),getUsageLedger:async(sessionId)=>await this.getSessionUsageLedger(sessionId),getTurnUsage:async(sessionId,turnId)=>await this.getSessionTurnUsage(sessionId,turnId),listTurnUsages:async(sessionId)=>await this.listSessionTurnUsages(sessionId),listRequestUsages:async(sessionId,filter2)=>await this.listSessionRequestUsages(sessionId,filter2)};[AGENT_RUNTIME_INTERNALS]={getSessionState:async(sessionId)=>await this.getSessionStateInternal(sessionId),getSessionHandle:async(sessionId)=>await this.getSessionHandleInternal(sessionId),getMcpState:async()=>await this.getMcpState(),syncMcpServers:async(configs)=>await this.syncMcpServers(configs)};async getSessionState(sessionId){let state=await this.getSessionStateInternal(sessionId);if(!state)return;return projectPublicSessionState(state)}async getSessionHandle(sessionId){return await this.getSessionHandleInternal(sessionId)}async getMcpState(){return this.projectMcpState(this.sharedMcpHub.getState())}async syncMcpServers(configs){return await this.syncGlobalMcpServers(configs)}getDebugLogState(){return{...this.debugLogState}}async setDebugLogState(update){let next=buildDebugLogState(update.enabled,update.directory??this.debugLogState.directory);this.debugLogState=next;for(let record3 of this.records.values())record3.sdkAgent?.setObservabilityEnabled(next.enabled,{logFilePath:buildDebugLogFilePath(next.directory,record3.sessionId),...update.reason?{reason:update.reason}:{}});return{...next}}runtimeHub;sessionInteraction;sessionLoad;sessionLifecycle;sessionDelegation;sessionRunLoop;sessionControl;constructor(options){this.options=options,this.sessionStoreDir=path29.join(path29.resolve(options.stateDir),RUNTIME_SNAPSHOT_DIR),this.hostDataDir=options.hostDataDir?path29.resolve(options.hostDataDir):path29.resolve(options.stateDir),this.snapshotStore=new RuntimeSnapshotFileStore({directory:this.sessionStoreDir}),this.runtimeHub=getOrCreateDimRuntimeHub({stateDirPath:path29.resolve(options.stateDir)}),this.sharedMcpHub=new SharedAcpMcpHub({initialPhase:options.mcpInitialState??"ready"}),this.sessionInteraction=createRuntimeSessionInteractionController({options:this.options,updateResponsesCompactionMetadata}),this.sessionLoad=createRuntimeSessionLoadController({options:this.options,snapshotStore:this.snapshotStore,sessionStoreDir:this.sessionStoreDir,hostDataDir:this.hostDataDir,sharedMcpHub:this.sharedMcpHub,sanitizeRuntimeSnapshotMessages,normalizePositiveInteger:normalizePositiveInteger3,normalizeLastRequestBudget:(value)=>normalizeLastRequestBudget(value)??null,isDuplicateRequestBudget,handleAskUser:async(record3,request)=>await this.sessionInteraction.handleAskUser(record3,request),handleToolApproval:async(record3,request)=>await this.sessionInteraction.handleToolApproval(record3,request),resolveSubagentApprovalDecision:async(sessionId,request)=>await this.resolveSubagentApprovalDecision(sessionId,request),handleNotification:async(record3,notification,context)=>await this.handleNotification(record3,notification,context),syncPlanMode:async(record3)=>await this.syncPlanMode(record3),syncSessionMcpServers:async(record3)=>await this.syncSessionMcpServers(record3),createProviderRetryNotificationPlugin:(record3)=>createProviderRetryNotificationPlugin(record3),injectResponsesProviderOptions:(record3,request)=>injectOpenAIResponsesProviderOptions(record3,request),getDebugLogState:()=>this.getDebugLogState()}),this.sessionLifecycle=createRuntimeSessionLifecycleController({records:this.records,snapshotStore:this.snapshotStore,sessionStoreDir:this.sessionStoreDir,ensureLoadedSession:async(record3,snapshot)=>await this.ensureLoadedSession(record3,snapshot),createRecordFromSnapshot:async(sessionId,snapshot)=>await this.createRecordFromSnapshot(sessionId,snapshot),normalizeRuntimeSnapshot:async(snapshot,sessionId)=>await this.normalizeRuntimeSnapshot(snapshot,sessionId),persistRecord:async(record3)=>await this.persistRecord(record3),cancelRecord:async(record3)=>await this.cancelRecord(record3),createSessionFacade:(record3)=>this.createSessionFacade(record3),resolveRuntimeConfig:async(input)=>await this.resolveRuntimeConfig(input),ensureInitialMcpSync:async()=>await this.ensureInitialMcpSync(),applyGlobalMcpServersToRecords:(configs)=>this.applyGlobalMcpServersToRecords(configs),deferGlobalMcpServersSync:(configs)=>this.sharedMcpHub.markDeferred(configs),readGlobalMcpServers:(record3)=>this.readGlobalMcpServers(record3),wrapSdkSnapshotForSave:(record3,snapshot)=>this.wrapSdkSnapshotForSave(record3,snapshot),canonicalizeSnapshotSystemMessages:(snapshot,systemPrompt)=>this.canonicalizeSnapshotSystemMessages(snapshot,systemPrompt),readSnapshotSystemPrompt:(snapshot)=>this.readSnapshotSystemPrompt(snapshot),shouldPersistRepairedRuntimeConfig:(snapshot,record3)=>this.sessionLoad.shouldPersistRepairedRuntimeConfig(snapshot,record3),readLatestRequestBudgetSnapshot:(record3)=>readLatestRequestBudgetSnapshot(record3),clearLastRequestBudget:(record3)=>clearLastRequestBudget(record3),cloneSessionUsageSummary:(summary)=>cloneSessionUsageSummary(summary),cloneSessionUsageLedger:(ledger)=>cloneSessionUsageLedger(ledger),cloneTurnUsageSummary:(summary)=>cloneTurnUsageSummary(summary)}),this.sessionDelegation=createRuntimeSessionDelegationController({options:this.options,processSessionItem:async(record3,runState,itemId,options2)=>await this.processSessionItem(record3,runState,itemId,options2),persistRecord:async(record3)=>await this.persistRecord(record3),buildSystemPrompt:async(cwd)=>await this.buildSystemPrompt(cwd),listSessionMcpServers:async(record3)=>await this.listSessionMcpServers(record3),createRuntimeOwnedSubagentSession:async(runtimeConfig,input)=>await this.createRuntimeOwnedSubagentSession(runtimeConfig,input)}),this.sessionRunLoop=createRuntimeSessionRunLoopController({readBackgroundExecTool:()=>this.backgroundExecTool,persistRecord:async(record3)=>await this.persistRecord(record3),flushPendingMcpSyncIfIdle:async()=>await this.flushPendingMcpSyncIfIdle(),orchestrateDelegation:async(record3,runState,intent)=>await this.orchestrateDelegation(record3,runState,intent),captureTodoSnapshotOnFinish:(record3,runState)=>this.captureTodoSnapshotOnFinish(record3,runState),clearRunState:(record3,runState)=>this.clearRunState(record3,runState)}),this.sessionControl=createRuntimeSessionControlController({sessionRunLoop:this.sessionRunLoop,ensureLoadedSession:async(record3,snapshot)=>await this.ensureLoadedSession(record3,snapshot),persistRecord:async(record3)=>await this.persistRecord(record3),readDefaultMcpServers:async()=>{if(!this.options.mcpServers)return[];return[...await maybeCall(this.options.mcpServers)]}})}readGlobalMcpServers(recordOverride){let desired=this.sharedMcpHub.getDesiredConfig();if(desired.length>0)return desired;if(recordOverride?.mcpServers.length)return recordOverride.mcpServers.map((server)=>({...server}));for(let record3 of this.records.values())if(record3.mcpServers.length>0)return record3.mcpServers.map((server)=>({...server}));return[]}applyGlobalMcpServersToRecords(configs){let next=configs.map((server)=>({...server}));for(let record3 of this.records.values())record3.mcpServers=next.map((server)=>({...server}))}async ensureInitialMcpSync(){if(this.mcpInitialSyncAttempted)return;this.mcpInitialSyncAttempted=!0;let seed=this.options.mcpServers?[...await maybeCall(this.options.mcpServers)]:[];if(!seed.length&&this.sharedMcpHub.getDesiredConfig().length===0)return;await this.sharedMcpHub.syncServers(seed),this.applyGlobalMcpServersToRecords(seed)}async syncGlobalMcpServers(configs){let next=await this.sharedMcpHub.syncServers(configs);return this.applyGlobalMcpServersToRecords(next.configs),this.projectMcpState(next)}async flushPendingMcpSyncIfIdle(){if(!this.sharedMcpHub.hasPendingSync())return;for(let record3 of this.records.values())if(record3.activeRun||record3.pendingAction)return;let next=await this.sharedMcpHub.flushPending();this.applyGlobalMcpServersToRecords(next.configs)}projectMcpState(state){return{phase:state.phase,configuredServers:state.configuredServers,connectedServers:state.connectedServers.map((entry)=>({id:entry.id,name:entry.name,transport:entry.transport,toolNames:[...entry.toolNames]})),failedServers:state.failedServers.map((entry)=>({id:entry.id,name:entry.name,transport:entry.transport,...entry.error!==void 0?{error:entry.error}:{}})),toolCount:state.toolCount,configs:state.configs.map((config2)=>({...config2}))}}runSubagent(spec){let subagentId=`subagent-${randomUUID6()}`,abortController=new AbortController,upstreamSignal=spec.signal;if(upstreamSignal)if(upstreamSignal.aborted)abortController.abort(upstreamSignal.reason);else upstreamSignal.addEventListener("abort",()=>{abortController.abort(upstreamSignal.reason)},{once:!0});let state={value:"pending"},{runtimeHub}=this,ownerSessionId=spec.ownerSessionId?.trim()||void 0,registry2=runtimeHub.subagentRegistry,handle={subagentId,ownerSessionId,get status(){return state.value},cancel:(_reason)=>{if(!abortController.signal.aborted)abortController.abort();let entry2=registry2.get(subagentId);if(entry2?.session&&entry2.itemId)try{entry2.session.cancelQueuedItem(entry2.itemId)}catch{}},result:void 0},entry={subagentId,ownerSessionId,abortController,handle,session:null,itemId:null,state};registry2.register(entry);let runPromise=(async()=>{let startedAt=Date.now();try{let runtimeConfig=await this.resolveRuntimeConfig({cwd:spec.cwd}),{pair}=await this.createRuntimeOwnedSubagentSession(runtimeConfig,{cwd:spec.cwd,description:spec.description,ownerSessionId,delegateTasksEnabled:!1,askUserEnabled:!1,approvalMode:"auto"});return await executeSubagentRun({entry,spec,pair,getSnapshotUsage:(snapshot)=>{if(!snapshot||typeof snapshot!=="object")return;return snapshot.usage??void 0},onFinish:()=>{registry2.unregister(subagentId)}})}catch(error48){registry2.unregister(subagentId);let cancelled=abortController.signal.aborted;state.value=cancelled?"cancelled":"failed";let message=error48 instanceof Error?error48.message:String(error48);return{summary:"",state:state.value,durationMs:Date.now()-startedAt,toolsUsed:0,...cancelled?{}:{error:{code:"subagent_execution_failed",message}}}}})();return Object.defineProperty(handle,"result",{value:runPromise,writable:!1,configurable:!1,enumerable:!0}),handle}async listSessionSnapshots(){return await this.sessionLifecycle.listSessionSnapshots()}async getSessionSnapshot(sessionId){return await this.sessionLifecycle.getSessionSnapshot(sessionId)}async getLiveSessionUsageSummary(record3){return await this.sessionLifecycle.getLiveSessionUsageSummary(record3)}async getLiveSessionUsageLedger(record3){return await this.sessionLifecycle.getLiveSessionUsageLedger(record3)}async getLiveSessionTurnUsage(record3,turnId){return await this.sessionLifecycle.getLiveSessionTurnUsage(record3,turnId)}async listLiveSessionTurnUsages(record3){return await this.sessionLifecycle.listLiveSessionTurnUsages(record3)}async listLiveSessionRequestUsages(record3,filter2){return await this.sessionLifecycle.listLiveSessionRequestUsages(record3,filter2)}async handleNotification(record3,notification,context){return await this.sessionInteraction.handleNotification(record3,notification,context)}async getSessionUsageSummary(sessionId){return await this.sessionLifecycle.getSessionUsageSummary(sessionId)}async getSessionUsageLedger(sessionId){return await this.sessionLifecycle.getSessionUsageLedger(sessionId)}async getSessionTurnUsage(sessionId,turnId){return await this.sessionLifecycle.getSessionTurnUsage(sessionId,turnId)}async listSessionTurnUsages(sessionId){return await this.sessionLifecycle.listSessionTurnUsages(sessionId)}async listSessionRequestUsages(sessionId,filter2){return await this.sessionLifecycle.listSessionRequestUsages(sessionId,filter2)}async listSessions(){return await this.sessionLifecycle.listSessions()}async openSession(sessionId){return await this.sessionLifecycle.openSession(sessionId)}async createSession(input){return await this.sessionLifecycle.createSession(input)}async destroySession(sessionId){await this.sessionLifecycle.destroySession(sessionId)}async unloadSession(sessionId,options){await this.sessionLifecycle.unloadSession(sessionId,options)}async createSessionWithMessages(messages,input){return await this.sessionLifecycle.createSessionWithMessages(messages,input)}async renameSession(sessionId,title){return await this.sessionLifecycle.renameSession(sessionId,title)}async updateSessionMetadata(sessionId,metadata){return await this.sessionLifecycle.updateSessionMetadata(sessionId,metadata)}async getSessionStateInternal(sessionId){return await this.sessionLifecycle.getSessionStateInternal(sessionId)}async getSessionHandleInternal(sessionId){return await this.sessionLifecycle.getSessionHandleInternal(sessionId)}async replaceSessionSnapshot(sessionId,snapshot,update){await this.sessionLifecycle.replaceSessionSnapshot(sessionId,snapshot,update)}async persistSession(sessionId){await this.sessionLifecycle.persistSession(sessionId)}createSessionFacade(record3){return{id:record3.sessionId,run:(input,options)=>this.startRun(record3,input,options),resume:(input,options)=>this.resumeRun(record3,input,options),steer:async(input)=>{await this.ensureLoadedSession(record3);let normalizedInput=input.trim();if(!normalizedInput||!record3.activeRun||!record3.sdkSession)return!1;let queueItemId=readSessionQueueItemId(record3.sdkSession.steer(normalizedInput,{metadata:{originalEventType:"steer_injected",steer:!0}}));return record3.activeRun.pendingSteers.push({content:normalizedInput,...queueItemId?{queueItemId}:{}}),!0},setMode:async(modeId)=>{await this.ensureLoadedSession(record3),this.assertSessionIdle(record3,"setMode"),record3.modeId=modeId,clearLastRequestBudget(record3),await this.syncPlanMode(record3),await this.persistRecord(record3)},updateConfig:async(update)=>{await this.ensureLoadedSession(record3);let resolvedUpdate=await this.prepareSessionConfigUpdate(record3,update),previousRuntimeConfig=record3.runtimeConfig,previousCwd=record3.cwd,previousGlobalMcpServers=this.sharedMcpHub.getDesiredConfig(),pendingMcpServersUpdate=Array.isArray(resolvedUpdate.mcpServers)?[...resolvedUpdate.mcpServers]:null,recordUpdate=pendingMcpServersUpdate?{...resolvedUpdate,mcpServers:void 0}:resolvedUpdate;applySessionConfigUpdate(record3,recordUpdate);let runtimeConfigChanged=JSON.stringify(previousRuntimeConfig)!==JSON.stringify(record3.runtimeConfig),cwdChanged=previousCwd!==record3.cwd,mcpServersChanged=pendingMcpServersUpdate!==null&&JSON.stringify(previousGlobalMcpServers)!==JSON.stringify(pendingMcpServersUpdate);if(runtimeConfigChanged||cwdChanged||mcpServersChanged)clearLastRequestBudget(record3);if(pendingMcpServersUpdate)this.applyGlobalMcpServersToRecords(pendingMcpServersUpdate);if(runtimeConfigChanged||cwdChanged)await this.reloadSession(record3);else if(mcpServersChanged&&!record3.activeRun&&!record3.pendingAction)await this.syncGlobalMcpServers(pendingMcpServersUpdate);else if(mcpServersChanged)this.sharedMcpHub.markDeferred(pendingMcpServersUpdate);await this.persistRecord(record3)},getUsageSummary:async()=>await this.getLiveSessionUsageSummary(record3),getUsageLedger:async()=>await this.getLiveSessionUsageLedger(record3),getTurnUsage:async(turnId)=>await this.getLiveSessionTurnUsage(record3,turnId),listTurnUsages:async()=>await this.listLiveSessionTurnUsages(record3),listRequestUsages:async(filter2)=>await this.listLiveSessionRequestUsages(record3,filter2),triggerManualCompaction:async()=>{if(await this.ensureLoadedSession(record3),this.assertSessionIdle(record3,"triggerManualCompaction"),!record3.sdkSession)return{success:!1,error:"Session is unavailable",errorCode:"session_unavailable",event:toCompressionEvent2({sessionId:record3.sessionId,state:"failed",trigger:"manual",label:"manual_compaction_failed_session_unavailable",metadata:{errorCode:"session_unavailable",error:"Session is unavailable"}})};let previousManualRequests=record3.sdkSession.listRequestUsages({kind:"manual_compaction"}).map((entry)=>structuredClone(entry)),previousManualRequestIds=new Set(previousManualRequests.map((entry)=>entry.id)),readManualCompactionUsage=()=>{let usageRequests=record3.sdkSession.listRequestUsages({kind:"manual_compaction"}).filter((entry)=>!previousManualRequestIds.has(entry.id)).map((entry)=>structuredClone(entry)),usageSummary=usageRequests[0]?cloneTurnUsageSummary(record3.sdkSession.getTurnUsage(usageRequests[0].turnId)):void 0;return{usageRequests,usageSummary}};try{let result=await triggerSdkManualCompaction(record3.sdkSession),manualUsage=readManualCompactionUsage();updateResponsesCompactionMetadata(record3,"manual_compaction_completed");let diagnostics=buildCompressionEventDiagnostics2({run:result});return await this.persistRecord(record3),{success:!0,summary:result.summary,messageCount:result.cursorAfter,run:result,...manualUsage.usageRequests.length>0?{usageRequests:manualUsage.usageRequests}:{},...manualUsage.usageSummary?{usageSummary:manualUsage.usageSummary}:{},event:toCompressionEvent2({sessionId:record3.sessionId,state:"completed",trigger:"manual",label:"manual_compaction_completed",diagnostics,metadata:{summaryGenerated:!0,messageCount:result.cursorAfter,summary:result.summary}})}}catch(error48){let manualUsage=readManualCompactionUsage(),message=error48 instanceof Error?error48.message:String(error48),errorCode=typeof error48?.code==="string"?String(error48.code):"manual_compaction_failed",compactionRun=error48?.result,diagnostics=buildCompressionEventDiagnostics2({...compactionRun?{run:compactionRun}:{}});return{success:!1,error:message,errorCode,...compactionRun?{run:compactionRun}:{},...manualUsage.usageRequests.length>0?{usageRequests:manualUsage.usageRequests}:{},...manualUsage.usageSummary?{usageSummary:manualUsage.usageSummary}:{},event:toCompressionEvent2({sessionId:record3.sessionId,state:"failed",trigger:"manual",label:"manual_compaction_failed",diagnostics,metadata:{errorCode,error:message}})}}},cancel:async()=>await this.cancelRecord(record3)}}startRun(record3,input,options){return this.sessionControl.startRun(record3,input,options)}resumeRun(record3,input,options){return this.sessionControl.resumeRun(record3,input,options)}async ensureLoadedSession(record3,snapshot){await this.sessionLoad.ensureLoadedSession(record3,snapshot)}async reloadSession(record3){await this.sessionLoad.reloadSession(record3)}async createRuntimeOwnedSubagentSession(runtimeConfig,input){return await this.sessionLoad.createRuntimeOwnedSubagentSession(runtimeConfig,input)}async resolveSubagentApprovalDecision(sessionId,request){let normalizedSessionId=sessionId?.trim();if(!normalizedSessionId||!this.options.onToolApproval)return{type:"approved"};return await this.options.onToolApproval({sessionId:normalizedSessionId,runId:`subagent:${normalizedSessionId}`,request})}assertSessionIdle(record3,operation){this.sessionControl.assertSessionIdle(record3,operation)}async processSessionItem(record3,runState,itemId,options){return await this.sessionRunLoop.processSessionItem(record3,runState,itemId,options)}async orchestrateDelegation(record3,runState,intent){return await this.sessionDelegation.orchestrateDelegation(record3,runState,intent)}clearRunState(record3,runState){if(record3.activeRun!==runState)return;runState.attachSignalCleanup?.(),runState.currentItemOutcome=void 0,runState.todoSnapshot=void 0,runState.forcedSummaryMode=void 0,runState.pendingSteers.length=0,runState.backgroundExecsByProcessId.clear(),runState.backgroundWaitStartedAtMs=void 0,runState.backgroundHeartbeatAtMs=void 0,runState.backgroundPollRoundRobinIndex=0,runState.initialUserInputText="",runState.completionEvidence=createRuntimeCompletionEvidence(),record3.activeRun=void 0,record3.pendingAction=void 0,this.flushPendingMcpSyncIfIdle().catch(()=>{})}captureTodoSnapshotOnFinish(record3,runState){let snapshot=runState.todoSnapshot;if(hasOpenTodos(snapshot)){record3.todoSnapshot=snapshot?snapshot.map((item)=>({...item})):void 0;return}if(hasCompletedTodos2(snapshot))record3.todoSnapshot=void 0}async cancelRecord(record3){return await this.sessionControl.cancelRecord(record3)}async syncPlanMode(record3){await this.sessionControl.syncPlanMode(record3)}async listSessionMcpServers(record3){return await this.sessionControl.listSessionMcpServers(record3)}async syncSessionMcpServers(record3){await this.sessionControl.syncSessionMcpServers(record3)}wrapSdkSnapshotForSave(record3,snapshot){return this.sessionLoad.wrapSdkSnapshotForSave(record3,snapshot)}async persistRecord(record3){await this.sessionLoad.persistRecord(record3)}async createRecordFromSnapshot(sessionId,snapshot){return await this.sessionLoad.createRecordFromSnapshot(sessionId,snapshot)}async normalizeRuntimeSnapshot(snapshot,sessionId=snapshot.sessionId){return await this.sessionLoad.normalizeRuntimeSnapshot(snapshot,sessionId)}async resolveRuntimeConfig(input){return await this.sessionLoad.resolveRuntimeConfig(input)}async prepareSessionConfigUpdate(record3,update){return await this.sessionLoad.prepareSessionConfigUpdate(record3,update)}async buildSystemPrompt(cwd){return await this.sessionLoad.buildSystemPrompt(cwd)}readSnapshotSystemPrompt(snapshot){return this.sessionLoad.readSnapshotSystemPrompt(snapshot)}canonicalizeSnapshotSystemMessages(snapshot,systemPrompt){return this.sessionLoad.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 i2=0;i2<raw.length;i2++){let code=raw.charCodeAt(i2);if(code===9||code===10){out+=raw[i2];continue}if(code<32||code===127)continue;out+=raw[i2]}return out}function sortQueueItems(items){return[...items].sort((a2,b2)=>{if(a2.kind!==b2.kind)return a2.kind==="steer"?-1:1;if(a2.kind==="steer"&&b2.kind==="steer"){let aSteeredAt=Number(a2.steeredAt??a2.createdAt??0),bSteeredAt=Number(b2.steeredAt??b2.createdAt??0);if(aSteeredAt!==bSteeredAt)return aSteeredAt-bSteeredAt}let aCreatedAt=Number(a2.createdAt??0),bCreatedAt=Number(b2.createdAt??0);if(aCreatedAt!==bCreatedAt)return aCreatedAt-bCreatedAt;return String(a2.id).localeCompare(String(b2.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 readCliRuntimeConfig(env,configOpts){return resolveRuntimeConfigFromEnv(env,configOpts)}function buildRuntimeConfigFromContext(context,configOpts){let rc=context.runtimeConfig;if(!rc)return resolveRuntimeConfigFromEnv(context.env,configOpts);return{modelId:rc.modelId,...rc.adapter?{adapter:rc.adapter}:{},...rc.provider?{provider:rc.provider}:{},...rc.baseUrl?{baseUrl:rc.baseUrl}:{},...configOpts?.baseUrl&&!rc.baseUrl?{baseUrl:configOpts.baseUrl}:{},...rc.apiKey?{apiKey:rc.apiKey}:{},...rc.nextApiOAuth?{nextApiOAuth:!0}:{},...rc.responsesAutoPromptCacheKey?{responsesAutoPromptCacheKey:!0}:{},...rc.responsesUseSessionId?{responsesUseSessionId:!0}:{},...rc.modelCapabilities?{modelCapabilities:rc.modelCapabilities}:{},...rc.maxInputTokens?{maxInputTokens:rc.maxInputTokens}:{},...rc.maxOutputTokens?{maxOutputTokens:rc.maxOutputTokens}:{}}}function buildCliCreateAgentRuntimeOptions(opts){let configOpts=opts.baseUrl?{baseUrl:opts.baseUrl}:void 0,runtimeConfig=buildRuntimeConfigFromContext(opts.context,configOpts);return{systemPrompt:opts.context.system,modelId:runtimeConfig.modelId,adapter:runtimeConfig.adapter,provider:runtimeConfig.provider,baseUrl:runtimeConfig.baseUrl,apiKey:runtimeConfig.apiKey,nextApiOAuth:runtimeConfig.nextApiOAuth,responsesAutoPromptCacheKey:runtimeConfig.responsesAutoPromptCacheKey,responsesUseSessionId:runtimeConfig.responsesUseSessionId,modelCapabilities:runtimeConfig.modelCapabilities,maxInputTokens:runtimeConfig.maxInputTokens,maxOutputTokens:runtimeConfig.maxOutputTokens,stateDir:opts.stateDir,cliTools:!0,delegateTasks:!0,...opts.tools?{tools:opts.tools}:{},...opts.mcpServers?{mcpServers:opts.mcpServers}:{},...opts.mcpInitialState?{mcpInitialState:opts.mcpInitialState}:{},resolveRuntimeConfig:(input)=>{let current=buildRuntimeConfigFromContext(opts.context,configOpts),persistedWithoutTokenLimits=input.persisted?{...input.persisted,maxInputTokens:void 0,maxOutputTokens:void 0}:void 0;return input.requested?mergeRuntimeConfig(input.current??current,input.requested,{preferSourceMaxInputTokens:!0}):mergeRuntimeConfig(current,persistedWithoutTokenLimits,{preferSourceMaxInputTokens:!1})}}}async function createCliRuntime(opts){return await createAgentRuntime(buildCliCreateAgentRuntimeOptions(opts))}var RUNTIME_SESSION_METADATA_KEY2="dimAgentRuntime",DEBUG_LOG_FILE_NAME="<session-id>.jsonl";function createDefaultDebugLogState(){let directory=path30.join(os6.homedir(),".dimcode","debug");return{enabled:!1,directory,logFilePath:path30.join(directory,DEBUG_LOG_FILE_NAME)}}function normalizeText8(value){return String(value??"").trim()}function normalizeModeId(value){return value==="plan"?"plan":"agent"}function normalizeToolApprovalMode(value){if(value==="auto"||value==="normal"||value==="strict")return value;if(value==="all")return"auto";return}function cloneJson(value){return JSON.parse(JSON.stringify(value??null))}function cloneMetadata2(value){return value?cloneJson(value):void 0}function cloneEnvRecord3(source){return Object.entries(source??{}).reduce((next,[key,value])=>{return next[key]=value,next},{})}function readTruthyFlag(value){let normalized=normalizeText8(value).toLowerCase();return normalized==="1"||normalized==="true"||normalized==="yes"||normalized==="on"}function readNoInteractionFlag(config2){return readTruthyFlag(config2?.env?.DIMCODE_NO_INTERACTION)}function runtimeConfigsMatch(left,right){return normalizeText8(left?.modelId)===normalizeText8(right?.modelId)&&normalizeText8(left?.adapter)===normalizeText8(right?.adapter)&&normalizeText8(left?.provider)===normalizeText8(right?.provider)&&normalizeText8(left?.baseUrl)===normalizeText8(right?.baseUrl)&&normalizeText8(left?.apiKey)===normalizeText8(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=raw??{},persisted={modelId:normalizeText8(record3.modelId)||fallback.modelId,...normalizeText8(record3.adapter)?{adapter:normalizeText8(record3.adapter)}:{},...normalizeText8(record3.provider)?{provider:normalizeText8(record3.provider)}:{},...normalizeText8(record3.baseUrl)?{baseUrl:normalizeText8(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 runtimeMeta=(snapshot?.metadata??{})[RUNTIME_SESSION_METADATA_KEY2]??{},runtimeConfig=runtimeMeta.runtimeConfig??{};return{runtimeConfig:snapshot?parseRuntimeConfig(runtimeMeta.runtimeConfig,{...fallback,modelId:normalizeText8(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=path30.resolve(opts.stateDir),pendingMode="agent",runtimePromise=null,resolvedRuntime=null,facadeDebugLogState=createDefaultDebugLogState(),pendingRuntimeConfigReloads=new Set,getStateEnv=()=>({...cloneEnvRecord3(opts.context.env??{}),...cloneEnvRecord3(opts.processEnv)}),getRuntimeConfig=()=>{let rc=opts.context.runtimeConfig;if(rc)return{modelId:rc.modelId,...rc.adapter?{adapter:rc.adapter}:{},...rc.provider?{provider:rc.provider}:{},...rc.baseUrl?{baseUrl:rc.baseUrl}:{},...!rc.baseUrl&&opts.baseUrl?{baseUrl:opts.baseUrl}:{},...rc.apiKey?{apiKey:rc.apiKey}:{},...rc.nextApiOAuth?{nextApiOAuth:!0}:{},...rc.responsesAutoPromptCacheKey?{responsesAutoPromptCacheKey:!0}:{},...rc.responsesUseSessionId?{responsesUseSessionId:!0}:{},...rc.modelCapabilities?{modelCapabilities:rc.modelCapabilities}:{},...rc.maxInputTokens?{maxInputTokens:rc.maxInputTokens}:{},...rc.maxOutputTokens?{maxOutputTokens:rc.maxOutputTokens}:{}};return readCliRuntimeConfig({...getStateEnv(),...cloneEnvRecord3(typeof process<"u"?process.env:void 0)},{baseUrl:opts.baseUrl})},logSessionPersistence=(sessionId)=>{let normalizedSessionId=normalizeText8(sessionId);if(!normalizedSessionId)return;debugLog("cli.session.persistence",{sessionId:normalizedSessionId,stateDir,snapshotPath:runtimeSnapshotPath(stateDir,normalizedSessionId)})},ensureRuntime=async()=>{if(runtimePromise)return await runtimePromise;runtimePromise=(async()=>{let runtime=await createCliRuntime({context:opts.context,stateDir,processEnv:opts.processEnv,tools:opts.tools,mcpServers:opts.mcpServers,mcpInitialState:opts.mcpInitialState});return resolvedRuntime=runtime,facadeDebugLogState=runtime.getDebugLogState(),runtime})();try{return await runtimePromise}catch(error48){throw runtimePromise=null,resolvedRuntime=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),getDebugLogState:()=>resolvedRuntime?.getDebugLogState()??{...facadeDebugLogState},setDebugLogState:async(update)=>{let next=await(await ensureRuntime()).setDebugLogState(update);return facadeDebugLogState=next,next}};function runSubagentViaFacade(spec){let placeholderId=`subagent-pending-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`,resolvedHandle=null,cancelQueued=!1,resultPromise=(async()=>{let handle=(await ensureRuntime()).runSubagent(spec);if(resolvedHandle=handle,cancelQueued)handle.cancel();return await handle.result})();return{get subagentId(){return resolvedHandle?.subagentId??placeholderId},...spec.ownerSessionId?{ownerSessionId:spec.ownerSessionId}:{},get status(){return resolvedHandle?.status??"pending"},cancel:(reason)=>{if(resolvedHandle)resolvedHandle.cancel(reason);else cancelQueued=!0},result:resultPromise}}let openSession=async(sessionId)=>{let normalizedSessionId=normalizeText8(sessionId);if(!normalizedSessionId)return;return await(await ensureRuntime()).openSession(normalizedSessionId)},ensureSession=async(input)=>{let requestedSessionId=normalizeText8(input?.sessionId),runtime=requestedSessionId?await ensureRuntime():await ensureRuntime(),nextMode=normalizeModeId(input?.modeId??pendingMode),nextCwd=normalizeText8(input?.cwd)||normalizeText8(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(normalizeText8(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=normalizeText8(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=normalizeText8(sessionId);if(id)pendingRuntimeConfigReloads.add(id)},async getMcpState(){return await(await ensureRuntime()).getMcpState()},async syncMcpServers(configs){return await(await ensureRuntime()).syncMcpServers(configs)},async getDebugLogState(){return runtimeFacade.getDebugLogState()},async setDebugLogState(update){return await runtimeFacade.setDebugLogState(update)}}}function shouldInferCustomProviderFallbackMetadata2(adapter){if(!adapter)return!0;return adapter==="openai"||adapter==="openai-responses"||adapter==="gemini"||adapter==="anthropic"}function hasConfiguredModelMetadata(model){let limit=model.limit??{},hasContext=typeof limit.context==="number"&&Number.isFinite(limit.context),hasOutput=typeof limit.output==="number"&&Number.isFinite(limit.output);return hasContext||hasOutput||model.userDefined===!0||model.outputIsUserDefined===!0||typeof model.vision==="boolean"||model.reasoning?.supported===!0||model.extra_capabilities?.reasoning?.supported===!0}function inferCustomModelLimit(modelId,adapter){if(!shouldInferCustomProviderFallbackMetadata2(adapter))return;return getCustomProviderModelFallbackLimitForModelId(modelId)}function backfillCustomProviderModels(models,opts={}){if(!shouldInferCustomProviderFallbackMetadata2(opts.adapter))return[...models];let onlyIds=opts.onlyIds;return models.map((model)=>{let id=String(model?.id??"").trim();if(!id)return model;if(onlyIds&&!onlyIds.has(id))return model;if(hasConfiguredModelMetadata(model))return model;let currentLimit=model.limit??{},hasContext=typeof currentLimit.context==="number"&&Number.isFinite(currentLimit.context),hasOutput=typeof currentLimit.output==="number"&&Number.isFinite(currentLimit.output),hasVision=typeof model.vision==="boolean",hasReasoning=model.reasoning?.supported===!0,hasExtraReasoning=model.extra_capabilities?.reasoning?.supported===!0,inferredLimit=hasContext&&hasOutput?void 0:inferCustomModelLimit(id,opts.adapter),inferredCapabilities=hasVision&&hasReasoning?void 0:getCustomProviderModelFallbackCapabilitiesForModelId(id),inferredExtraReasoning=hasExtraReasoning?void 0:getCustomProviderModelFallbackReasoningEffortCapability(id),nextLimit={...currentLimit,...!hasContext&&typeof inferredLimit?.context==="number"?{context:inferredLimit.context}:{},...!hasOutput&&typeof inferredLimit?.output==="number"?{output:inferredLimit.output}:{}};return{...model,...Object.keys(nextLimit).length>0?{limit:nextLimit}:{},...!hasVision&&typeof inferredCapabilities?.vision==="boolean"?{vision:inferredCapabilities.vision}:{},...!hasReasoning&&inferredCapabilities?.reasoning?.supported?{reasoning:inferredCapabilities.reasoning}:{},...!hasExtraReasoning&&inferredExtraReasoning?{extra_capabilities:{...model.extra_capabilities??{},reasoning:inferredExtraReasoning}}:{}}})}var SYSTEM_SECTION_IDS=["system.sections.security","system.sections.code-safety","system.sections.url-policy","system.sections.tone-and-style","system.sections.professional-objectivity","system.sections.engineering-approach","system.sections.git-and-execution-guardrails","system.sections.doing-tasks","system.sections.capability-aware-guidance","system.sections.code-references"];function joinPromptSections(sections){return sections.filter((section)=>typeof section==="string"&&section.trim().length>0).map((section)=>section.trim()).join(`
1063
1063
 
1064
1064
  `)}var DIMCODE_SHARED_SYSTEM_PROMPT=joinPromptSections(SYSTEM_SECTION_IDS.map((promptId)=>renderPrompt(promptId)));function buildDimCodeSystemPrompt(options){return joinPromptSections([options?.intro??renderPrompt("system.intro.default"),DIMCODE_SHARED_SYSTEM_PROMPT,...options?.extraSections??[]])}var DIMCODE_SYSTEM_PROMPT=buildDimCodeSystemPrompt();function readOptionalString3(value){if(typeof value==="string")return value.trim()||void 0;if(typeof value==="number"||typeof value==="boolean")return String(value).trim()||void 0;return}function readOptionalNumber2(value){if(typeof value==="number"&&Number.isFinite(value))return value;if(typeof value==="string"){let trimmed=value.trim();if(!trimmed)return;let parsed=Number(trimmed);return Number.isFinite(parsed)?parsed:void 0}return}var RUNTIME_ENV_KEYS=new Set(["DIMCODE_NO_INTERACTION"]);function isTruthyFlag2(value){let normalized=String(value??"").trim().toLowerCase();return normalized==="1"||normalized==="true"||normalized==="yes"||normalized==="on"}function resolveSystemPrompt(env){if(!isTruthyFlag2(env.DIMCODE_NO_INTERACTION))return DIMCODE_SYSTEM_PROMPT;return buildDimCodeSystemPrompt({intro:"You are DimCode, a non-interactive CLI coding agent running a one-shot software engineering task.",extraSections:[["# Non-interactive execution","This run is operating in non-interactive agent mode.","Tool approvals are already handled automatically.","Do not ask the user follow-up questions and do not rely on AskUserQuestion being available.","Make reasonable assumptions from the repository, the prompt, and available tool output so you can complete the task in one pass when practical.","Only stop early for a real external blocker or a genuinely unsafe ambiguity that cannot be resolved from local context.","When you make an important assumption, state it briefly in the final response."].join(`
1065
- `)]})}async function createDimcodeContext(opts){let fastStartRaw=String(opts.env.DIMCODE_FAST_START??"").trim().toLowerCase(),fastStart=fastStartRaw==="1"||fastStartRaw==="true"||fastStartRaw==="yes"||fastStartRaw==="on",version2=readOptionalString3("0.0.11-beta.4")??(fastStart?null:await readRepoPackageVersion(opts.cwd)),resolveToolsPath=async()=>{let[{homedir:homedir3},path31]=await Promise.all([import("node:os"),import("node:path")]),dimcodeHome=readOptionalString3(opts.env.DIMCODE_HOME);if(dimcodeHome){let dir2=path31.resolve(dimcodeHome);return{dir:dir2,filePath:path31.join(dir2,"tools.json")}}let dir=path31.resolve(homedir3(),".dimcode");return{dir,filePath:path31.join(dir,"tools.json")}},[loadedCache,loadedConfig,loadedTools,loadedMcp]=fastStart?await(async()=>{let[cacheDir,configDir,toolsPath,path31]=await Promise.all([getDimcodeUserDir(opts.env),getDimcodeConfigDir(opts.env),resolveToolsPath(),import("node:path")]),cacheFile=path31.join(cacheDir,"cache.json"),configFile=path31.join(configDir,"config.json"),mcpJsonFile=path31.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=readOptionalString3(saved.cwd),savedFocusFiles=Array.isArray(saved.focusFiles)?saved.focusFiles.map((file2)=>String(file2??"")).filter(Boolean):void 0,cwd=opts.cwd||savedCwd||".",v2=(key)=>readOptionalString3(opts.env[key]),explicitRuntimeEnv=Object.fromEntries(Object.entries(opts.env).flatMap(([key,value])=>{let canonical=String(key??"").trim(),normalized=readOptionalString3(value);if(!canonical||!RUNTIME_ENV_KEYS.has(canonical)||!normalized)return[];return[[canonical,normalized]]})),applyRuntimeEnvIfMissing=(target,key,source)=>{let value=source[key];if(!value||target[key])return;target[key]=value},mergedEnv={DIMCODE_VERSION:version2??"dev",DIMCODE_BETA_UPDATES:savedConfig.beta===!0?"1":"0",...v2("DIMCODE_STARTUP_TOAST")?{DIMCODE_STARTUP_TOAST:v2("DIMCODE_STARTUP_TOAST")}:{}},savedProviderId=normalizeProviderId(savedConfig.providerId),savedConnections=savedConfig.providerConnections??{},savedActiveModelByProvider=savedConfig.activeModelByProvider??{},normalizedSavedCustomProviders=(Array.isArray(savedConfig.customProviders)?savedConfig.customProviders:[]).map((provider)=>{let adapter2=String(provider?.adapter??"").trim(),models=Array.isArray(provider?.models)?backfillCustomProviderModels(provider.models,{adapter:adapter2}):provider?.models;return{...provider,...Array.isArray(models)?{models}:{}}}),legacyCustom=savedConfig.customProvider??{},legacyBaseUrl=readOptionalString3(legacyCustom?.baseUrl),legacyApiKey=readOptionalString3(legacyCustom?.apiKey),rawProviderId=(()=>{if(isLegacyCustomProviderId(savedProviderId)&&normalizedSavedCustomProviders.length){let fallbackId=readOptionalString3(normalizedSavedCustomProviders[0]?.id);if(fallbackId){if(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=readOptionalString3(selection.providerId),providerModel=readOptionalString3(selection.modelId);if(config2.settings)if(providerId)config2.settings.providerId=providerId;else delete config2.settings.providerId;let customProvider=isCustomProviderId(providerId)?normalizedSavedCustomProviders.find((p2)=>String(p2?.id??"").trim()===providerId):void 0,builtin=providerId&&!isCustomProviderId(providerId)&&!isLegacyCustomProviderId(providerId)?getBuiltinProvider(providerId):void 0,savedConnection=savedConnections[providerId??""],savedConnectionBaseUrl=readOptionalString3(savedConnection?.baseUrl),builtinBaseUrl=readOptionalString3(getProviderBaseUrl(builtin)),adapter=isCustomProviderId(providerId)?String(customProvider?.adapter??"").trim():isLegacyCustomProviderId(providerId)?"openai":providerId==="openai"&&savedConnectionBaseUrl&&savedConnectionBaseUrl!==builtinBaseUrl?"openai":getProviderAdapter(builtin),providerBaseUrl=isCustomProviderId(providerId)?readOptionalString3(customProvider?.baseUrl):isLegacyCustomProviderId(providerId)?legacyBaseUrl:readOptionalString3(resolveBuiltinProviderBaseUrl(builtin,savedConnection?.baseUrl)),providerApiKey=isCustomProviderId(providerId)?readOptionalString3(customProvider?.apiKey):isLegacyCustomProviderId(providerId)?legacyApiKey:readOptionalString3(savedConnection?.apiKey),modelCapabilityFallbackModels=isCustomProviderId(providerId)||isLegacyCustomProviderId(providerId)||builtin?.customModels?listCustomProviderModelFallbackModels():void 0,resolvedModelContextWindow=resolveProviderSelectionContextWindow({providerId,modelId:providerModel,connections:savedConnections,customProviders:normalizedSavedCustomProviders}),resolvedModelMaxOutputTokens=resolveProviderSelectionMaxOutputTokens({providerId,modelId:providerModel,connections:savedConnections,customProviders:normalizedSavedCustomProviders});if(isLegacyCustomProviderId(providerId)&&!providerBaseUrl&&!providerApiKey&&!providerModel)throw Error("Legacy custom provider config is missing. Please run /connect to add a custom provider and select a model.");let modelCapabilities=resolveProviderModelCapabilities({providerId,modelId:providerModel,connectionModels:savedConnection?.models,builtinModels:builtin?.models,customProviderModels:customProvider?.models,legacyCustomModels:Array.isArray(legacyCustom?.models)?legacyCustom.models:void 0,fallbackModels:modelCapabilityFallbackModels}),runtimeConfig={modelId:providerModel??"deepseek-v3.1",adapter:adapter||"openai",provider:providerId??adapter,baseUrl:providerBaseUrl,apiKey:providerApiKey,nextApiOAuth:providerId==="dimcode-api-oauth"||void 0,...customProvider?.responsesAutoPromptCacheKey===!0?{responsesAutoPromptCacheKey:!0}:{},...customProvider?.responsesUseSessionId===!0?{responsesUseSessionId:!0}:{},...modelCapabilities?{modelCapabilities}:{},...typeof resolvedModelContextWindow==="number"&&resolvedModelContextWindow>0?{maxInputTokens:resolvedModelContextWindow}:{},...typeof resolvedModelMaxOutputTokens==="number"&&resolvedModelMaxOutputTokens>0?{maxOutputTokens:resolvedModelMaxOutputTokens}:{},temperature:readOptionalNumber2(saved.temperature)??void 0,interleavedThinking:typeof saved.interleavedThinking==="boolean"?saved.interleavedThinking:void 0,reasoningEffort:resolveSelectedReasoningEffort({modelId:providerModel,reasoningEffort:saved.reasoningEffort,reasoningEffortByModel:saved.reasoningEffortByModel})};if(!mergedEnv.DIMCODE_TOOL_APPROVALS&&saved.toolApprovals){let raw=String(saved.toolApprovals),mapped=raw==="auto"||raw==="all"?"auto":raw==="strict"||raw==="manual"?"strict":raw==="normal"?"normal":void 0;if(mapped)mergedEnv.DIMCODE_TOOL_APPROVALS=mapped}if(!mergedEnv.DIMCODE_LANG&&readOptionalString3(saved.locale))mergedEnv.DIMCODE_LANG=readOptionalString3(saved.locale);if(!mergedEnv.DIMCODE_THEME&&readOptionalString3(saved.themeMode))mergedEnv.DIMCODE_THEME=readOptionalString3(saved.themeMode);if(!mergedEnv.DIMCODE_REASONING_EFFORT){let resolved=resolveSelectedReasoningEffort({modelId:providerModel,reasoningEffort:saved.reasoningEffort,reasoningEffortByModel:saved.reasoningEffortByModel});if(resolved)mergedEnv.DIMCODE_REASONING_EFFORT=resolved}if(usesCcMock(builtin))mergedEnv.DIMCODE_CCMOCK="1";else delete mergedEnv.DIMCODE_CCMOCK;return applyRuntimeEnvIfMissing(mergedEnv,"DIMCODE_NO_INTERACTION",explicitRuntimeEnv),{context:{system:resolveSystemPrompt(mergedEnv),cwd,env:mergedEnv,runtimeConfig,...savedFocusFiles?.length?{focusFiles:savedFocusFiles}:{}},cacheDir:loadedCache.dir,cacheFile:loadedCache.filePath,cache,configDir:loadedConfig.dir,configFile:loadedConfig.filePath,config: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:readFile11},path31]=await Promise.all([import("node:fs/promises"),import("node:path")]),raw=await readFile11(path31.join(cwd,"package.json"),"utf8"),parsed=JSON.parse(raw),v2=typeof parsed?.version==="string"?parsed.version:null;return v2&&v2.trim()?v2.trim():null}catch{return null}}import{createHash as createHash4,randomUUID as randomUUID7}from"node:crypto";import{copyFile as copyFile2,mkdir as mkdir11,readdir as readdir7,readFile as readFile11,rename as rename2,rm as rm7,stat as stat7,writeFile as writeFile10}from"node:fs/promises";import{homedir as homedir3}from"node:os";import path31 from"node:path";import process12 from"node:process";var BLOB_CACHE_DIR2="blob-cache",BLOB_DIR2="blobs",ATTACHMENTS_DIR2="attachments",META_DIR2="meta",BLOB_TTL_MS2=86400000,CLEANUP_MIN_INTERVAL_MS2=3600000,FILE_ID_PATTERN=/^[\w.-]{1,128}$/,HOME_SESSION_CACHE_ID="_home",IMAGE_EXTENSIONS=new Set(["png","jpg","jpeg","gif","svg","webp","bmp","ico"]),TEXT_LIKE_EXTENSIONS=new Set(["txt","text","md","markdown","mdx","rst","log","json","jsonl","json5","yaml","yml","toml","ini","cfg","conf","properties","env","xml","csv","tsv","html","htm","css","scss","less","sass","js","jsx","ts","tsx","mjs","cjs","mts","cts","vue","svelte","astro","py","rb","php","go","rs","java","kt","swift","c","cc","cpp","cxx","h","hh","hpp","hxx","m","mm","cs","sh","bash","zsh","fish","ps1","sql","graphql","gql","proto","diff","patch","gitignore","gitattributes","editorconfig","dockerfile","makefile","mk","lock"]),EXT_MIME={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".ico":"image/x-icon",".svg":"image/svg+xml",".mp4":"video/mp4",".mov":"video/quicktime",".m4v":"video/x-m4v",".webm":"video/webm",".avi":"video/x-msvideo",".mkv":"video/x-matroska",".mpeg":"video/mpeg",".mpg":"video/mpeg",".wmv":"video/x-ms-wmv",".3gp":"video/3gpp",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".pdf":"application/pdf",".txt":"text/plain",".md":"text/markdown",".json":"application/json",".yaml":"text/yaml",".yml":"text/yaml",".toml":"text/plain",".ini":"text/plain",".xml":"application/xml",".csv":"text/csv"},lastCleanupAt2=0;function resolveStateDir3(){let dimcodeHome=String(process12.env.DIMCODE_HOME??"").trim();if(dimcodeHome)return path31.resolve(dimcodeHome,"state");return path31.resolve(homedir3(),".dimcode","state")}function resolveSessionCacheDir2(sessionId){return path31.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=path31.extname(filePath||"").toLowerCase();if(!ext)return"";return ext.startsWith(".")?ext.slice(1):ext}function basenameFromPath(filePath){return path31.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=path31.extname(filePath).toLowerCase();return EXT_MIME[ext]||"application/octet-stream"}function countLines2(text){if(!text)return 0;return text.split(`
1065
+ `)]})}async function createDimcodeContext(opts){let fastStartRaw=String(opts.env.DIMCODE_FAST_START??"").trim().toLowerCase(),fastStart=fastStartRaw==="1"||fastStartRaw==="true"||fastStartRaw==="yes"||fastStartRaw==="on",version2=readOptionalString3("0.0.13-beta.0")??(fastStart?null:await readRepoPackageVersion(opts.cwd)),resolveToolsPath=async()=>{let[{homedir:homedir3},path31]=await Promise.all([import("node:os"),import("node:path")]),dimcodeHome=readOptionalString3(opts.env.DIMCODE_HOME);if(dimcodeHome){let dir2=path31.resolve(dimcodeHome);return{dir:dir2,filePath:path31.join(dir2,"tools.json")}}let dir=path31.resolve(homedir3(),".dimcode");return{dir,filePath:path31.join(dir,"tools.json")}},[loadedCache,loadedConfig,loadedTools,loadedMcp]=fastStart?await(async()=>{let[cacheDir,configDir,toolsPath,path31]=await Promise.all([getDimcodeUserDir(opts.env),getDimcodeConfigDir(opts.env),resolveToolsPath(),import("node:path")]),cacheFile=path31.join(cacheDir,"cache.json"),configFile=path31.join(configDir,"config.json"),mcpJsonFile=path31.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=readOptionalString3(saved.cwd),savedFocusFiles=Array.isArray(saved.focusFiles)?saved.focusFiles.map((file2)=>String(file2??"")).filter(Boolean):void 0,cwd=opts.cwd||savedCwd||".",v2=(key)=>readOptionalString3(opts.env[key]),explicitRuntimeEnv=Object.fromEntries(Object.entries(opts.env).flatMap(([key,value])=>{let canonical=String(key??"").trim(),normalized=readOptionalString3(value);if(!canonical||!RUNTIME_ENV_KEYS.has(canonical)||!normalized)return[];return[[canonical,normalized]]})),applyRuntimeEnvIfMissing=(target,key,source)=>{let value=source[key];if(!value||target[key])return;target[key]=value},mergedEnv={DIMCODE_VERSION:version2??"dev",DIMCODE_BETA_UPDATES:savedConfig.beta===!0?"1":"0",...v2("DIMCODE_STARTUP_TOAST")?{DIMCODE_STARTUP_TOAST:v2("DIMCODE_STARTUP_TOAST")}:{}},savedProviderId=normalizeProviderId(savedConfig.providerId),savedConnections=savedConfig.providerConnections??{},savedActiveModelByProvider=savedConfig.activeModelByProvider??{},normalizedSavedCustomProviders=(Array.isArray(savedConfig.customProviders)?savedConfig.customProviders:[]).map((provider)=>{let adapter2=String(provider?.adapter??"").trim(),models=Array.isArray(provider?.models)?backfillCustomProviderModels(provider.models,{adapter:adapter2}):provider?.models;return{...provider,...Array.isArray(models)?{models}:{}}}),legacyCustom=savedConfig.customProvider??{},legacyBaseUrl=readOptionalString3(legacyCustom?.baseUrl),legacyApiKey=readOptionalString3(legacyCustom?.apiKey),rawProviderId=(()=>{if(isLegacyCustomProviderId(savedProviderId)&&normalizedSavedCustomProviders.length){let fallbackId=readOptionalString3(normalizedSavedCustomProviders[0]?.id);if(fallbackId){if(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=readOptionalString3(selection.providerId),providerModel=readOptionalString3(selection.modelId);if(config2.settings)if(providerId)config2.settings.providerId=providerId;else delete config2.settings.providerId;let customProvider=isCustomProviderId(providerId)?normalizedSavedCustomProviders.find((p2)=>String(p2?.id??"").trim()===providerId):void 0,builtin=providerId&&!isCustomProviderId(providerId)&&!isLegacyCustomProviderId(providerId)?getBuiltinProvider(providerId):void 0,savedConnection=savedConnections[providerId??""],savedConnectionBaseUrl=readOptionalString3(savedConnection?.baseUrl),builtinBaseUrl=readOptionalString3(getProviderBaseUrl(builtin)),adapter=isCustomProviderId(providerId)?String(customProvider?.adapter??"").trim():isLegacyCustomProviderId(providerId)?"openai":providerId==="openai"&&savedConnectionBaseUrl&&savedConnectionBaseUrl!==builtinBaseUrl?"openai":getProviderAdapter(builtin),providerBaseUrl=isCustomProviderId(providerId)?readOptionalString3(customProvider?.baseUrl):isLegacyCustomProviderId(providerId)?legacyBaseUrl:readOptionalString3(resolveBuiltinProviderBaseUrl(builtin,savedConnection?.baseUrl)),providerApiKey=isCustomProviderId(providerId)?readOptionalString3(customProvider?.apiKey):isLegacyCustomProviderId(providerId)?legacyApiKey:readOptionalString3(savedConnection?.apiKey),modelCapabilityFallbackModels=isCustomProviderId(providerId)||isLegacyCustomProviderId(providerId)||builtin?.customModels?listCustomProviderModelFallbackModels():void 0,resolvedModelContextWindow=resolveProviderSelectionContextWindow({providerId,modelId:providerModel,connections:savedConnections,customProviders:normalizedSavedCustomProviders}),resolvedModelMaxOutputTokens=resolveProviderSelectionMaxOutputTokens({providerId,modelId:providerModel,connections:savedConnections,customProviders:normalizedSavedCustomProviders});if(isLegacyCustomProviderId(providerId)&&!providerBaseUrl&&!providerApiKey&&!providerModel)throw Error("Legacy custom provider config is missing. Please run /connect to add a custom provider and select a model.");let modelCapabilities=resolveProviderModelCapabilities({providerId,modelId:providerModel,connectionModels:savedConnection?.models,builtinModels:builtin?.models,customProviderModels:customProvider?.models,legacyCustomModels:Array.isArray(legacyCustom?.models)?legacyCustom.models:void 0,fallbackModels:modelCapabilityFallbackModels}),runtimeConfig={modelId:providerModel??"deepseek-v3.1",adapter:adapter||"openai",provider:providerId??adapter,baseUrl:providerBaseUrl,apiKey:providerApiKey,nextApiOAuth:providerId==="dimcode-api-oauth"||void 0,...customProvider?.responsesAutoPromptCacheKey===!0?{responsesAutoPromptCacheKey:!0}:{},...customProvider?.responsesUseSessionId===!0?{responsesUseSessionId:!0}:{},...modelCapabilities?{modelCapabilities}:{},...typeof resolvedModelContextWindow==="number"&&resolvedModelContextWindow>0?{maxInputTokens:resolvedModelContextWindow}:{},...typeof resolvedModelMaxOutputTokens==="number"&&resolvedModelMaxOutputTokens>0?{maxOutputTokens:resolvedModelMaxOutputTokens}:{},temperature:readOptionalNumber2(saved.temperature)??void 0,interleavedThinking:typeof saved.interleavedThinking==="boolean"?saved.interleavedThinking:void 0,reasoningEffort:resolveSelectedReasoningEffort({modelId:providerModel,reasoningEffort:saved.reasoningEffort,reasoningEffortByModel:saved.reasoningEffortByModel})};if(!mergedEnv.DIMCODE_TOOL_APPROVALS&&saved.toolApprovals){let raw=String(saved.toolApprovals),mapped=raw==="auto"||raw==="all"?"auto":raw==="strict"||raw==="manual"?"strict":raw==="normal"?"normal":void 0;if(mapped)mergedEnv.DIMCODE_TOOL_APPROVALS=mapped}if(!mergedEnv.DIMCODE_LANG&&readOptionalString3(saved.locale))mergedEnv.DIMCODE_LANG=readOptionalString3(saved.locale);if(!mergedEnv.DIMCODE_THEME&&readOptionalString3(saved.themeMode))mergedEnv.DIMCODE_THEME=readOptionalString3(saved.themeMode);if(!mergedEnv.DIMCODE_REASONING_EFFORT){let resolved=resolveSelectedReasoningEffort({modelId:providerModel,reasoningEffort:saved.reasoningEffort,reasoningEffortByModel:saved.reasoningEffortByModel});if(resolved)mergedEnv.DIMCODE_REASONING_EFFORT=resolved}if(usesCcMock(builtin))mergedEnv.DIMCODE_CCMOCK="1";else delete mergedEnv.DIMCODE_CCMOCK;return applyRuntimeEnvIfMissing(mergedEnv,"DIMCODE_NO_INTERACTION",explicitRuntimeEnv),{context:{system:resolveSystemPrompt(mergedEnv),cwd,env:mergedEnv,runtimeConfig,...savedFocusFiles?.length?{focusFiles:savedFocusFiles}:{}},cacheDir:loadedCache.dir,cacheFile:loadedCache.filePath,cache,configDir:loadedConfig.dir,configFile:loadedConfig.filePath,config: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:readFile11},path31]=await Promise.all([import("node:fs/promises"),import("node:path")]),raw=await readFile11(path31.join(cwd,"package.json"),"utf8"),parsed=JSON.parse(raw),v2=typeof parsed?.version==="string"?parsed.version:null;return v2&&v2.trim()?v2.trim():null}catch{return null}}import{createHash as createHash4,randomUUID as randomUUID7}from"node:crypto";import{copyFile as copyFile2,mkdir as mkdir11,readdir as readdir7,readFile as readFile11,rename as rename2,rm as rm7,stat as stat7,writeFile as writeFile10}from"node:fs/promises";import{homedir as homedir3}from"node:os";import path31 from"node:path";import process12 from"node:process";var BLOB_CACHE_DIR2="blob-cache",BLOB_DIR2="blobs",ATTACHMENTS_DIR2="attachments",META_DIR2="meta",BLOB_TTL_MS2=86400000,CLEANUP_MIN_INTERVAL_MS2=3600000,FILE_ID_PATTERN=/^[\w.-]{1,128}$/,HOME_SESSION_CACHE_ID="_home",IMAGE_EXTENSIONS=new Set(["png","jpg","jpeg","gif","svg","webp","bmp","ico"]),TEXT_LIKE_EXTENSIONS=new Set(["txt","text","md","markdown","mdx","rst","log","json","jsonl","json5","yaml","yml","toml","ini","cfg","conf","properties","env","xml","csv","tsv","html","htm","css","scss","less","sass","js","jsx","ts","tsx","mjs","cjs","mts","cts","vue","svelte","astro","py","rb","php","go","rs","java","kt","swift","c","cc","cpp","cxx","h","hh","hpp","hxx","m","mm","cs","sh","bash","zsh","fish","ps1","sql","graphql","gql","proto","diff","patch","gitignore","gitattributes","editorconfig","dockerfile","makefile","mk","lock"]),EXT_MIME={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".ico":"image/x-icon",".svg":"image/svg+xml",".mp4":"video/mp4",".mov":"video/quicktime",".m4v":"video/x-m4v",".webm":"video/webm",".avi":"video/x-msvideo",".mkv":"video/x-matroska",".mpeg":"video/mpeg",".mpg":"video/mpeg",".wmv":"video/x-ms-wmv",".3gp":"video/3gpp",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".pdf":"application/pdf",".txt":"text/plain",".md":"text/markdown",".json":"application/json",".yaml":"text/yaml",".yml":"text/yaml",".toml":"text/plain",".ini":"text/plain",".xml":"application/xml",".csv":"text/csv"},lastCleanupAt2=0;function resolveStateDir3(){let dimcodeHome=String(process12.env.DIMCODE_HOME??"").trim();if(dimcodeHome)return path31.resolve(dimcodeHome,"state");return path31.resolve(homedir3(),".dimcode","state")}function resolveSessionCacheDir2(sessionId){return path31.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=path31.extname(filePath||"").toLowerCase();if(!ext)return"";return ext.startsWith(".")?ext.slice(1):ext}function basenameFromPath(filePath){return path31.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=path31.extname(filePath).toLowerCase();return EXT_MIME[ext]||"application/octet-stream"}function countLines2(text){if(!text)return 0;return text.split(`
1066
1066
  `).length}function normalizeMaybePath(raw){return String(raw??"").replace(/\\/g,"/")}async function ensureBlobDirs2(sessionDir){let blobsDir=path31.join(sessionDir,BLOB_DIR2),metaDir=path31.join(sessionDir,META_DIR2);try{return await mkdir11(blobsDir,{recursive:!0}),await mkdir11(metaDir,{recursive:!0}),{blobsDir,metaDir}}catch{return null}}async function ensureAttachmentDirs(sessionDir){let attachmentsDir=path31.join(sessionDir,ATTACHMENTS_DIR2),metaDir=path31.join(sessionDir,META_DIR2);try{return await mkdir11(attachmentsDir,{recursive:!0}),await mkdir11(metaDir,{recursive:!0}),{attachmentsDir,metaDir}}catch{return null}}async function copyFileUnique(src,destDir,baseName){let safeBaseName=basenameFromPath(baseName)||basenameFromPath(src)||"attachment",ext=path31.extname(safeBaseName),stem=ext?safeBaseName.slice(0,-ext.length):safeBaseName,candidate=path31.join(destDir,safeBaseName);for(let i2=0;i2<40;i2++){try{await copyFile2(src,candidate);let info=await stat7(candidate);if(info.isFile()&&info.size>0)return candidate}catch{}let suffix=`-${i2+1}`;candidate=path31.join(destDir,`${stem}${suffix}${ext}`)}return null}async function readAttachmentMetaByPath(absPath){let info=parseAttachmentPathInfo(absPath);if(!info)return null;let metaDir=path31.join(resolveSessionCacheDir2(info.sessionId),META_DIR2),entries=[];try{entries=await readdir7(metaDir)}catch{return null}for(let entry of entries){if(!entry.endsWith(".json"))continue;let metaPath=path31.join(metaDir,entry);try{let raw=await readFile11(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-${randomUUID7().replace(/-/g,"")}`,blobPath=path31.join(dirs.blobsDir,`${fileId}.txt`),metaPath=path31.join(dirs.metaDir,`${fileId}.json`),lineCount=countLines2(opts.content),sha256=createHash4("sha256").update(opts.content).digest("hex"),byteSize=Buffer.byteLength(opts.content,"utf-8"),nowIso=new Date().toISOString();try{return await writeFile10(blobPath,opts.content,"utf8"),await writeFile10(metaPath,JSON.stringify({file_id:fileId,kind:"text",sha256,line_count:lineCount,byte_size:byteSize,created_at:nowIso,source:String(opts.source??"unknown")},null,2),"utf8"),{fileId,filePath:blobPath,lineCount,sha256,byteSize}}catch{return null}}async function cacheFileToSessionAttachment(opts){let cleanedPath=String(opts.sourcePath??"").trim();if(!cleanedPath)return null;let sessionId=normalizeSessionId2(opts.sessionId);if(!sessionId)return null;let sourceInfo;try{sourceInfo=await stat7(cleanedPath)}catch{return null}if(!sourceInfo.isFile()||sourceInfo.size<=0)return null;await cleanupExpiredSessionCaches2({ttlMs:BLOB_TTL_MS2,logger:opts.logger}).catch(()=>{});let sessionDir=resolveSessionCacheDir2(sessionId),dirs=await ensureAttachmentDirs(sessionDir);if(!dirs)return null;let fileId=`att-${randomUUID7().replace(/-/g,"")}`,preferredBaseName=basenameFromPath(String(opts.preferredBaseName??"").trim()||basenameFromPath(cleanedPath)),storedPath=await copyFileUnique(cleanedPath,dirs.attachmentsDir,preferredBaseName);if(!storedPath)return null;let metaPath=path31.join(dirs.metaDir,`${fileId}.json`),mediaType=String(opts.mediaType??"").trim()||guessMimeTypeFromPath(storedPath),originalName=basenameFromPath(cleanedPath),storedName=basenameFromPath(storedPath),nowIso=new Date().toISOString();try{return await writeFile10(metaPath,JSON.stringify({file_id:fileId,kind:"attachment",byte_size:sourceInfo.size,created_at:nowIso,source:String(opts.source??"unknown"),media_type:mediaType,original_name:originalName,stored_name:storedName},null,2),"utf8"),opts.logger?.("session_attachment_cached",{sessionId,fileId,byteSize:sourceInfo.size,mediaType,originalName,storedName}),{fileId,filePath:storedPath,byteSize:sourceInfo.size,mediaType,originalName}}catch{return await rm7(storedPath,{force:!0}).catch(()=>{}),null}}async function deleteSessionAttachmentByPath(absPath,logger){let info=parseAttachmentPathInfo(absPath);if(!info)return!1;try{await rm7(absPath,{force:!0});let metaMatch=await readAttachmentMetaByPath(absPath);if(metaMatch)await rm7(metaMatch.metaPath,{force:!0});return await Promise.all([removeDirIfEmpty(path31.join(resolveSessionCacheDir2(info.sessionId),ATTACHMENTS_DIR2)),removeDirIfEmpty(path31.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(path31.join(resolveStateDir3(),BLOB_CACHE_DIR2),cutoff,opts?.logger)}async function cleanupDedicatedCacheRoot2(cacheRoot,cutoff,logger){let entries=[];try{entries=await readdir7(cacheRoot)}catch{return}await Promise.all(entries.map(async(entry)=>{let sid=normalizeSessionId2(entry);if(!sid)return;let sessionDir=path31.join(cacheRoot,sid),candidates=[sessionDir,path31.join(sessionDir,BLOB_DIR2),path31.join(sessionDir,ATTACHMENTS_DIR2),path31.join(sessionDir,META_DIR2)],mtimes=[];for(let candidate of candidates)try{let info=await stat7(candidate);if(info.isDirectory()||info.isFile())mtimes.push(info.mtimeMs)}catch{}if(!mtimes.length)return;if(Math.max(...mtimes)>=cutoff)return;try{await rm7(sessionDir,{recursive:!0,force:!0}),logger?.("session_cache_ttl_deleted",{sessionId:sid,mtimeMs:Math.max(...mtimes),cutoff})}catch{}}))}async function removeDirIfEmpty(dir){try{if((await readdir7(dir)).length===0)await rm7(dir,{recursive:!0,force:!0})}catch{}}var COMMIT_ID_RE=/^[0-9a-f]{7,40}$/i;function getCommitIdFromMention(value){let raw=String(value||"");if(!raw.startsWith("git:commit:"))return null;let sha=raw.slice(11).trim();if(!COMMIT_ID_RE.test(sha))return null;return sha}function formatCommitObjectPath(sha){let safe=String(sha||"").trim();if(!safe)return"";return`.git/objects/${safe.slice(0,2)}/${safe}`}function renderCommitMarkdownLink(sha){let safe=String(sha||"").trim();if(!safe)return"";let path32=formatCommitObjectPath(safe);return`[${safe}](${path32})`}function stripLeadingFocusFilesBlock(text){let normalized=String(text??"").replace(/\r/g,"");if(!normalized)return"";let lines=normalized.split(`
1067
1067
  `),header=String(lines[0]??"").trim();if(header!=="[focus_files]"&&header!=="[user_focus_files]"){let inlineStripped=((raw)=>{let s2=String(raw??"");if(!s2)return null;let idx=0,matched2=0;while(idx<s2.length){while(idx<s2.length&&(s2[idx]===" "||s2[idx]==="\t"||s2[idx]===`
1068
1068
  `))idx++;let m2=s2.slice(idx).match(/^\[([^\]]*)\]\(((?:\\\)|[^)])+)\)/);if(!m2)break;let path32=String(m2[2]??"").trim();if(path32.startsWith("<")&&path32.endsWith(">"))path32=path32.slice(1,-1);if(path32=path32.replace(/\\\)/g,")").trim(),!(path32.startsWith("/")||/^[A-Z]:[\\/]/i.test(path32)))break;matched2++,idx+=m2[0].length}if(!matched2)return null;let rest=s2.slice(idx);if(rest=rest.replace(/^[ \t]+/g,""),rest.startsWith(`
@@ -1163,7 +1163,7 @@ tc:${toolCalls}`}function userTranscriptSignature(msg){let content=String(msg.co
1163
1163
  `).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):""}
1164
1164
  ---
1165
1165
  ${assistantSig}`;rounds.delete(key),rounds.set(key,round)}return[...rounds.values()].slice(-opts.limit).flat().map(clonePersistableValue)}function collectInterruptedRoundMessagesForPersistence(messages){return collectAnchoredAssistantRoundsForPersistence(messages,{limit:INTERRUPTED_PERSISTED_MESSAGE_LIMIT2,include:isInterruptedAssistantMessage})}function collectCompactMessagesForPersistence(messages){let unique=new Map;for(let m2 of messages){if(!m2||m2.role!=="assistant")continue;let id2=String(m2?.id??"").trim();if(!isCompactTranscriptMessageId(id2))continue;if(id2.startsWith("compact-restored-")||id2.startsWith("restored-compact-"))continue;if(!m2.parts.some((p2)=>{if(p2.type==="markdown")return String(p2?.markdown??"").trim().length>0;if(p2.type==="info")return String(p2?.text??"").trim().length>0;return!1}))continue;let sig=messagePersistenceSignature(m2);if(!sig)continue;unique.delete(sig),unique.set(sig,m2)}let out=[...unique.values()];if(out.length<=COMPACT_PERSISTED_MESSAGE_LIMIT2)return out;return out.slice(-COMPACT_PERSISTED_MESSAGE_LIMIT2)}function collectCompressionMessagesForPersistence(messages){let unique=new Map;for(let m2 of messages){if(!m2||m2.role!=="assistant")continue;let id2=String(m2?.id??"").trim();if(!isCompressionTranscriptMessageId(id2))continue;if(id2.startsWith("compression-restored-")||id2.startsWith("restored-compression-"))continue;if(!m2.parts.some((p2)=>{if(p2.type==="markdown")return String(p2?.markdown??"").trim().length>0;if(p2.type==="info")return String(p2?.text??"").trim().length>0;return!1}))continue;let sig=messagePersistenceSignature(m2);if(!sig)continue;unique.delete(sig),unique.set(sig,m2)}let out=[...unique.values()];if(out.length<=COMPRESSION_PERSISTED_MESSAGE_LIMIT2)return out;return out.slice(-COMPRESSION_PERSISTED_MESSAGE_LIMIT2)}function clonePersistableValue(value){return JSON.parse(JSON.stringify(value))}function assistantMessageHasDurableTranscriptParts(message){if(!message||message.role!=="assistant")return!1;return message.parts.some((part)=>{if(part.type==="markdown")return String(part.markdown??"").trim().length>0;if(part.type==="thinking")return String(part.content??"").trim().length>0;if(part.type==="tool_call")return!0;if(part.type==="tool_result")return!0;return!1})}function hasPendingTranscriptTail(messages){for(let index=messages.length-1;index>=0;index-=1){let message=messages[index];if(!message)continue;if(message.role==="tool")continue;if(message.role==="user")return!0;if(message.role==="assistant")return!assistantMessageHasDurableTranscriptParts(message);return!1}return!1}function collectErrorMessagesForPersistence(messages){return collectAnchoredAssistantRoundsForPersistence(messages,{limit:ERROR_PERSISTED_MESSAGE_LIMIT2,include:isErrorAssistantMessage})}function buildSupplementalUiPayload(messages){let interruptedMessages=collectInterruptedRoundMessagesForPersistence(messages).map(clonePersistableValue),compact=collectCompactMessagesForPersistence(messages),compactMessages=uiMessagesToSnapshotMessages(compact),compression=collectCompressionMessagesForPersistence(messages),compressionMessages=uiMessagesToSnapshotMessages(compression),errorMessages2=collectErrorMessagesForPersistence(messages);return{interruptedMessages,compactMessages,compressionMessages,errorMessages:errorMessages2}}function serializeSupplementalSignature(payload){try{return JSON.stringify(payload)}catch{return""}}function createDimSdkPersistence(opts){let storeRef=null,persistEnabled=!opts.deferPersist,schedulePersist=null,lastSupplementalSig=null,seedSupplementalSignature=(sessionId)=>{let id2=String(sessionId??"").trim();if(!id2||!storeRef){lastSupplementalSig=null;return}let payload=buildSupplementalUiPayload(storeRef.state.messages);lastSupplementalSig={sessionId:id2,sig:serializeSupplementalSignature(payload)}},hydratedMcpServers=Array.isArray(opts.mcpServers)?JSON.parse(JSON.stringify(opts.mcpServers)):[],hydratedMcpPhase=normalizeMcpPhase(opts.mcpPhase),hydratedMcpConnectedCount=Math.max(0,Number(opts.mcpConnectedCount)||0),hydratedMcpConfiguredCount=Math.max(0,Number(opts.mcpConfiguredCount)||hydratedMcpServers.length),backend=opts.sessionsBackend??null,sessions=backend?{async list(){return(await backend.list()).map(snapshotToListItem).filter((item)=>Boolean(item))},async get(id2){let sessionId=String(id2??"").trim();if(!sessionId)return;return backend.get(sessionId)},async reload(id2){let sessionId=String(id2??"").trim();if(!sessionId||!storeRef)return!1;if(String(storeRef.state.sessionId??"")!==sessionId)return!1;if(storeRef.state.runningAgentRound)return!1;if(storeRef.state.paused)return!1;if(storeRef.state.approval?.active?.status==="pending")return!1;let snapshot=await backend.get(sessionId);if(!snapshot)return!1;hydrateStoreFromSnapshot(storeRef,snapshot,{preserveLocalSyntheticErrors:!0,preserveLocalInterruptedMessages:!0,preserveLocalCompactMessages:!0,preserveLocalCompressionMessages:!0}),seedSupplementalSignature(sessionId);let invalidator=opts.agent;if(invalidator?.invalidateSession)invalidator.invalidateSession(sessionId);return!0},async use(id2){let sessionId=String(id2??"").trim();if(!sessionId||!storeRef)return;if(String(storeRef.state.sessionId??"")===sessionId)return;let snapshot=await backend.get(sessionId);if(!snapshot)return;hydrateStoreFromSnapshot(storeRef,snapshot),seedSupplementalSignature(sessionId);let invalidator=opts.agent;if(invalidator?.invalidateSession)invalidator.invalidateSession(sessionId)},async createNew(){if(!storeRef)return;let snapshot=await backend.create();if(!snapshot)return;let newSessionId=snapshotId2(snapshot);if(hydrateStoreFromSnapshot(storeRef,snapshot),newSessionId)seedSupplementalSignature(newSessionId);if(newSessionId){let invalidator=opts.agent;if(invalidator?.invalidateSession)invalidator.invalidateSession(newSessionId)}},async delete(id2){let sessionId=String(id2??"").trim();if(!sessionId)return;if(await backend.destroy(sessionId),storeRef&&String(storeRef.state.sessionId??"")===sessionId)storeRef.state.sessionId=""},async rename(id2,title){if(!storeRef)return;if(typeof backend.rename!=="function")return;let sessionId=String(id2??"").trim(),nextTitle=String(title??"").trim();if(!sessionId||!nextTitle)return;let snapshot=await backend.rename(sessionId,nextTitle);if(snapshot&&String(storeRef.state.sessionId??"")===sessionId)hydrateStoreFromSnapshot(storeRef,snapshot,{preserveLocalSyntheticErrors:!0,preserveLocalInterruptedMessages:!0,preserveLocalCompactMessages:!0,preserveLocalCompressionMessages:!0}),seedSupplementalSignature(sessionId)},async updateMetadata(id2,metadata){if(typeof backend.updateMetadata!=="function")return;let sessionId=String(id2??"").trim();if(!sessionId)return;await backend.updateMetadata(sessionId,metadata)},async fork(opts2){if(!storeRef)return;let seed=Array.isArray(opts2?.messages)?opts2.messages:[];if(typeof backend.createWithMessages!=="function"){let snapshot2=await backend.create();if(snapshot2)storeRef.state.sessionId=snapshotId2(snapshot2);storeRef.replaceMessages(seed),storeRef.clearRevertedMessages(),storeRef.state.selectedToolCallId=null,storeRef.resetSessionUsageState(),storeRef.state.lastRequestBudget=null;return}let snapshot=await backend.createWithMessages(uiMessagesToSnapshotMessages(stripSupplementalTranscriptMessages(seed)));if(!snapshot)return;hydrateStoreFromSnapshot(storeRef,snapshot),seedSupplementalSignature(snapshotId2(snapshot))}}:void 0,replaceObjectContents=(target,source)=>{for(let key of Object.keys(target))delete target[key];Object.assign(target,source)},ensureStoreMcpState=(store3)=>{let current=store3.state.mcp;if(current&&Array.isArray(current.servers)){if(typeof current.phase!=="string")current.phase="ready";if(typeof current.connectedCount!=="number")current.connectedCount=0;if(typeof current.configuredCount!=="number")current.configuredCount=Array.isArray(current.servers)?current.servers.length:0;return current}return store3.state.mcp={servers:[],phase:"ready",connectedCount:0,configuredCount:0},store3.state.mcp},applyHydratedMcpState=(store3)=>{let mcpState=ensureStoreMcpState(store3),nextServers=JSON.parse(JSON.stringify(hydratedMcpServers));mcpState.servers.splice(0,mcpState.servers.length,...nextServers),mcpState.phase=hydratedMcpPhase,mcpState.connectedCount=hydratedMcpConnectedCount,mcpState.configuredCount=hydratedMcpConfiguredCount},applyHydration=(store3,cache,config2,tools)=>{let changed=!1,saved=config2.settings??{},providerId=normalizeProviderId(saved.providerId),uiState=store3.state.ui;if(typeof saved.beta==="boolean"){let nextBeta=saved.beta===!0;if(uiState.betaUpdates!==nextBeta)uiState.betaUpdates=nextBeta,changed=!0}let provider=store3?.state.provider;if(!provider)return!1;if(providerId)provider.activeId=providerId;let connections=saved.providerConnections??{},normalizedConnections=Object.fromEntries(Object.entries(connections).map(([id2,conn])=>{let apiKey=readOptionalString3(conn?.apiKey),baseUrl=readOptionalString3(conn?.baseUrl),models=(Array.isArray(conn?.models)?conn.models:[]).map((m2)=>{let model=m2&&typeof m2==="object"?m2:{},id3=readOptionalString3(model.id);if(!id3)return null;let name15=readOptionalString3(model.name),limit=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.userDefined===!0||model.outputIsUserDefined===!0?{userDefined:!0}:{},...typeof vision==="boolean"?{vision}:{},...reasoning?{reasoning}:{}}}).filter((m2)=>Boolean(m2));return[id2,{...apiKey?{apiKey}:{},...baseUrl?{baseUrl}:{},...models.length?{models}:{}}]}));provider.connections=normalizedConnections;let activeByProvider=saved.activeModelByProvider??{};provider.activeModelByProvider={...activeByProvider??{}};let toProviderAdapter=(value)=>{if(value==="openai"||value==="openai-responses"||value==="gemini"||value==="anthropic")return value;return},toCustomProviderId=(value)=>{if(typeof value==="string"&&value.startsWith("cp_"))return value;return},customProviders=Array.isArray(saved.customProviders)?saved.customProviders.map((p2)=>{let entry=p2&&typeof p2==="object"?p2:{},models=(Array.isArray(entry.models)?entry.models:[]).map((m2)=>{let model=m2&&typeof m2==="object"?m2:{},id3=readOptionalString3(model.id);if(!id3)return null;let name16=readOptionalString3(model.name),limit=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.userDefined===!0||model.outputIsUserDefined===!0?{userDefined:!0}:{},...typeof vision==="boolean"?{vision}:{},...reasoning?{reasoning}:{}}}).filter((m2)=>Boolean(m2)),id2=toCustomProviderId(readOptionalString3(entry.id)),name15=readOptionalString3(entry.name),adapter=toProviderAdapter(readOptionalString3(entry.adapter));if(!id2||!name15||!adapter)return null;let baseUrl=readOptionalString3(entry.baseUrl),apiKey=readOptionalString3(entry.apiKey);return{id:id2,name:name15,adapter,...baseUrl?{baseUrl}:{},...apiKey?{apiKey}:{},...typeof entry.responsesAutoPromptCacheKey==="boolean"?{responsesAutoPromptCacheKey:entry.responsesAutoPromptCacheKey}:{},...typeof entry.responsesUseSessionId==="boolean"?{responsesUseSessionId:entry.responsesUseSessionId}:{},models:backfillCustomProviderModels(models,{adapter})}}).filter((p2)=>Boolean(p2)):[];provider.customProviders=customProviders,hydrateToolsStateFromConfig(tools,store3.state,hydratedMcpServers),applyHydratedMcpState(store3);let savedUi=cache.settings??{},env=store3?.state?.context?.env??{};if(!readOptionalString3(env.DIMCODE_TOOL_APPROVALS)&&savedUi.toolApprovals){let raw=String(savedUi.toolApprovals),mapped=raw==="auto"||raw==="all"?"auto":raw==="strict"||raw==="manual"?"strict":"normal";store3.state.approval.mode=mapped}if(uiState){if(typeof savedUi.themeMode==="string"&&savedUi.themeMode)store3.setThemeMode(savedUi.themeMode);if(typeof savedUi.statusCompact==="boolean")uiState.statusCompact=savedUi.statusCompact;if(typeof savedUi.onboardingSeenVersion==="string"&&savedUi.onboardingSeenVersion)uiState.onboarding={...uiState.onboarding??{},lastSeenVersion:savedUi.onboardingSeenVersion};if(savedUi.shortcuts)uiState.shortcuts=normalizeShortcutBindings(savedUi.shortcuts);if(typeof savedUi.greetingLastSeenDate==="string")uiState.greeting={...uiState.greeting??{},lastSeenDate:savedUi.greetingLastSeenDate};if(savedUi.providerFunnelCounts&&typeof savedUi.providerFunnelCounts==="object"){let counts=Object.fromEntries(Object.entries(savedUi.providerFunnelCounts).map(([step,count])=>[String(step),Number(count)]).filter(([step,count])=>step&&Number.isFinite(count)&&count>0));uiState.providerFunnel={...uiState.providerFunnel??{},counts,events:Array.isArray(uiState.providerFunnel?.events)?uiState.providerFunnel.events:[]}}if(savedUi.workspaceSelectionByCwd&&typeof savedUi.workspaceSelectionByCwd==="object"){let byCwd=Object.fromEntries(Object.entries(savedUi.workspaceSelectionByCwd).map(([cwd,value])=>{let key=readOptionalString3(cwd),providerId2=readOptionalString3(value?.providerId),modelId=readOptionalString3(value?.modelId);if(!key||!providerId2)return null;return[key,{providerId:providerId2,...modelId?{modelId}:{}}]}).filter((entry)=>Boolean(entry)));uiState.workspaceSelectionByCwd=byCwd}let savedDebugMode=normalizePersistedDebugLogMode(savedUi.debugLogMode);uiState.debugLogging={...uiState.debugLogging??{},enabled:savedDebugMode==="auto",auto:savedDebugMode==="auto",mode:savedDebugMode,directory:readOptionalString3(savedUi.debugLogDirectory)||readOptionalString3(uiState.debugLogging?.directory)||"~/.dimcode/debug"};let savedReasoningMap=savedUi.reasoningEffortByModel;if(savedReasoningMap){let entries=Object.entries(savedReasoningMap).map(([modelId,value])=>{let key=readOptionalString3(modelId),v2=readOptionalString3(value);return key&&v2?[key,v2]:null}).filter((e2)=>Boolean(e2));uiState.reasoningEffortByModel=Object.fromEntries(entries)}}let{candidates,existingProviderIds}=buildProviderSelectionCandidates({connections:provider.connections,customProviders,legacyCustom:provider.custom,rememberedModels:{...provider.activeModelByProvider??{}}}),rememberedModels=stripUnknownActiveModelSelections({...provider.activeModelByProvider??{}},existingProviderIds);if(JSON.stringify(provider.activeModelByProvider??{})!==JSON.stringify(rememberedModels))provider.activeModelByProvider=rememberedModels,changed=!0;if(uiState){let sanitizedWorkspaceSelections=sanitizeWorkspaceProviderSelections({workspaceSelections:uiState.workspaceSelectionByCwd,candidates,rememberedModels});if(JSON.stringify(uiState.workspaceSelectionByCwd??{})!==JSON.stringify(sanitizedWorkspaceSelections))uiState.workspaceSelectionByCwd=sanitizedWorkspaceSelections,changed=!0}let selection=resolveProviderSelection({candidates,preferredProviderId:String(provider.activeId??"").trim(),preferredModelId:String(store3.state.config.model??"").trim(),rememberedModels}),nextProviderId=String(selection.providerId??"").trim(),nextModelId=String(selection.modelId??"").trim();if(String(provider.activeId??"").trim()!==nextProviderId)provider.activeId=nextProviderId,changed=!0;if(String(store3.state.config.model??"").trim()!==nextModelId)store3.state.config.model=nextModelId,changed=!0;if(backend){let currentId=String(store3.state.sessionId??"").trim();if(currentId)backend.get(currentId).then((snapshot)=>{if(snapshot&&storeRef)hydrateStoreFromSnapshot(storeRef,snapshot,{preserveLocalSyntheticErrors:!0,preserveLocalInterruptedMessages:!0,preserveLocalCompactMessages:!0,preserveLocalCompressionMessages:!0}),seedSupplementalSignature(currentId)}).catch(()=>{})}return changed};return{sessions,onStoreCreated:(store3)=>{storeRef=store3,applyHydration(store3,opts.cache,opts.config,opts.tools),registerOAuthRuntimeSyncTarget({getStore:()=>storeRef,updatePersistenceSnapshots:(next)=>{if(next.cache)replaceObjectContents(opts.cache,next.cache);if(next.config)replaceObjectContents(opts.config,next.config)},invalidateSession:(sessionId)=>{let invalidator=opts.agent;if(invalidator?.invalidateSession)invalidator.invalidateSession(sessionId)}});let persist=createDebouncedAsyncTask(async()=>{try{let nextCache=buildUserCacheFromStore({prev:opts.cache,store:store3}),nextConfig=buildUserConfigFromStore({prev:opts.config,store:store3}),nextTools=buildUserToolsFromStore({prev:opts.tools,store:store3}),mcpServers=Array.isArray(store3.state?.mcp?.servers)?store3.state.mcp.servers:[],mcpPhase=normalizeMcpPhase(store3.state?.mcp?.phase),saves=[saveDimcodeUserCache(opts.cacheFile,nextCache),saveDimcodeUserConfig(opts.configFile,nextConfig),saveDimcodeUserTools(opts.toolsFile,nextTools)];if(opts.mcpJsonFile&&(mcpPhase==="ready"||mcpPhase==="error"))saves.push(saveMcpJson(opts.mcpJsonFile,mcpServers));await Promise.all(saves)}catch(e2){console.warn("[dimcode] Failed to persist cache:",e2)}},300);schedulePersist=()=>{if(!persistEnabled)return;persist.schedule()};let persistSupplementalTranscript=createDebouncedAsyncTask(async()=>{if(!backend||typeof backend.updateMetadata!=="function")return;let sessionId=String(store3.state.sessionId??"").trim();if(!sessionId)return;if(store3.state.runningAgentRound)return;if(hasPendingTranscriptTail(store3.state.messages))return;let payload=buildSupplementalUiPayload(store3.state.messages),sig=serializeSupplementalSignature(payload);if(lastSupplementalSig&&lastSupplementalSig.sessionId===sessionId&&lastSupplementalSig.sig===sig)return;try{await backend.updateMetadata(sessionId,{ui:payload}),lastSupplementalSig={sessionId,sig}}catch{}},0),scheduleSupplementalPersist=()=>{persistSupplementalTranscript.schedule()};if(watch(()=>store3.state.sessionId,schedulePersist),watch(()=>store3.state.config,schedulePersist,{deep:!0}),watch(()=>store3.state.context,schedulePersist,{deep:!0}),watch(()=>store3.state.approval.mode,schedulePersist),watch(()=>store3.state.ui?.locale,schedulePersist),watch(()=>store3.state.ui?.theme,schedulePersist,{deep:!0}),watch(()=>store3.state.ui?.betaUpdates,schedulePersist),watch(()=>store3.state.ui?.statusCompact,schedulePersist),watch(()=>store3.state.ui?.onboarding,schedulePersist,{deep:!0}),watch(()=>store3.state.ui?.shortcuts,schedulePersist,{deep:!0}),watch(()=>store3.state.ui?.greeting,schedulePersist,{deep:!0}),watch(()=>store3.state.ui?.debugLogging,schedulePersist,{deep:!0}),watch(()=>store3.state.provider,schedulePersist,{deep:!0}),watch(()=>store3.state.tools,schedulePersist,{deep:!0}),watch(()=>store3.state.mcp?.servers,schedulePersist,{deep:!0}),watch(()=>store3.state.sessionId,scheduleSupplementalPersist),watch(()=>store3.state.messages.length,scheduleSupplementalPersist),watch(()=>store3.state.runningAgentRound,(running,prev)=>{if(prev&&!running)scheduleSupplementalPersist()}),opts.toolsRef)watch(()=>store3.state.tools,(newTools)=>{if(newTools)opts.toolsRef.current={...opts.toolsRef.current,websearch:{...opts.toolsRef.current?.websearch,apiKey:newTools.websearch?.apiKey??"",apiEndpoint:newTools.websearch?.apiEndpoint,numResults:newTools.websearch?.numResults},mcpServers:Array.isArray(store3.state.mcp?.servers)?JSON.parse(JSON.stringify(store3.state.mcp.servers)):opts.toolsRef.current?.mcpServers}},{deep:!0,immediate:!0}),watch(()=>store3.state.mcp?.servers,(servers)=>{opts.toolsRef.current={...opts.toolsRef.current,mcpServers:Array.isArray(servers)?JSON.parse(JSON.stringify(servers)):opts.toolsRef.current?.mcpServers}},{deep:!0,immediate:!0});schedulePersist()},rehydrate:(next)=>{if(next.cache)replaceObjectContents(opts.cache,next.cache);if(next.config)replaceObjectContents(opts.config,next.config);if(next.tools)replaceObjectContents(opts.tools,next.tools);if(Array.isArray(next.mcpServers))hydratedMcpServers=JSON.parse(JSON.stringify(next.mcpServers));if("mcpPhase"in next)hydratedMcpPhase=normalizeMcpPhase(next.mcpPhase);if("mcpConnectedCount"in next)hydratedMcpConnectedCount=Math.max(0,Number(next.mcpConnectedCount)||0);if("mcpConfiguredCount"in next)hydratedMcpConfiguredCount=Math.max(0,Number(next.mcpConfiguredCount)||hydratedMcpServers.length);else if(Array.isArray(next.mcpServers))hydratedMcpConfiguredCount=hydratedMcpServers.length;if(storeRef)applyHydration(storeRef,opts.cache,opts.config,opts.tools);if(!persistEnabled)persistEnabled=!0;schedulePersist?.()}}}async function resolveStartupSessionId(opts){return readOptionalString3(opts.envSessionId)}function createNoopToolRunner(){return async(call)=>{let name15=String(call?.name??"tool");return{id:String(call?.id??"tool"),status:"error",output:["Tool execution is handled by the DimCode agent.",`This UI cannot run tool "${name15}" locally.`].join(`
1166
- `)}}}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"}),cliDebugDirectory=readOptionalString3(opts.debugDirectory),startupDebugCache=opts.enablePersistentDebugAuto&&fastStart&&!cliDebugDirectory?await loadDimcodeUserCache(opts.env).then((result)=>result.cache).catch(()=>cache):cache,persistedDebugMode=normalizePersistedDebugLogMode(startupDebugCache.settings?.debugLogMode),startupDebugSource=cliDebugDirectory?"cli":opts.enablePersistentDebugAuto&&persistedDebugMode==="auto"?"auto":"none",startupDebugDirectory=normalizeDebugLogDirectory(cliDebugDirectory||readOptionalString3(startupDebugCache.settings?.debugLogDirectory)||void 0);if(startupDebugSource==="auto")await cleanupOldDebugJsonlLogs(startupDebugDirectory);if(startupDebugSource!=="none")await agent.setDebugLogState?.({enabled:!0,directory:startupDebugDirectory,reason:startupDebugSource==="auto"?"debug auto startup":"debug cli flag"});let sessionsBackend=agent.sessions??null,initialSessionId=await resolveStartupSessionId({sessionsBackend,envSessionId:opts.sessionId});opts.env.DIMCODE_SESSION_ID=initialSessionId??"",context.env.DIMCODE_SESSION_ID=initialSessionId??"";let{sessions,onStoreCreated,rehydrate}=createDimSdkPersistence({cacheFile,cache,configFile,config:config2,toolsFile,tools,mcpJsonFile,mcpServers,mcpPhase,mcpConnectedCount,mcpConfiguredCount,sessionsBackend,agent,toolsRef,deferPersist:fastStart}),storeRef=null,hydrateStarted=!1,mcpSyncQueue=Promise.resolve(),queuedMcpSignature="",activeMcpSyncSignature=null,cloneMcpServers=(servers)=>JSON.parse(JSON.stringify(Array.isArray(servers)?servers:[])),sleep=async(ms)=>{await new Promise((resolve2)=>setTimeout(resolve2,ms))},ensureStoreMcpState=(store3)=>{let current=store3.state.mcp;if(current&&Array.isArray(current.servers))return current;return store3.state.mcp={servers:[],phase:"deferred",connectedCount:0,configuredCount:0},store3.state.mcp},applyMcpRuntimeState=(phase,connectedCount,configuredCount)=>{if(!storeRef)return;let mcpState=ensureStoreMcpState(storeRef);mcpState.phase=phase,mcpState.connectedCount=Math.max(0,connectedCount),mcpState.configuredCount=Math.max(0,configuredCount)},queueMcpSync=(servers,options)=>{let nextServers=cloneMcpServers(servers),signature=JSON.stringify(nextServers);if(!options?.force&&signature===queuedMcpSignature)return;queuedMcpSignature=signature,mcpSyncQueue=mcpSyncQueue.then(async()=>{if(!storeRef)return;activeMcpSyncSignature=signature,applyMcpRuntimeState("syncing",0,nextServers.length);try{let state=await agent.syncMcpServers?.(toMcpServerConfigs(nextServers));if(!state)state=await agent.getMcpState?.();if(!state){applyMcpRuntimeState("ready",0,nextServers.length);return}applyMcpRuntimeState(state.phase,state.connectedServers.length,state.configuredServers);for(let i2=0;i2<240&&state.phase==="syncing";i2+=1)await sleep(250),state=await agent.getMcpState?.()??state,applyMcpRuntimeState(state.phase,state.connectedServers.length,state.configuredServers)}catch{applyMcpRuntimeState("error",0,nextServers.length)}finally{activeMcpSyncSignature=null}},async()=>{if(storeRef)applyMcpRuntimeState("error",0,nextServers.length);activeMcpSyncSignature=null})};function applyStartupDebugToStore(store3){if(startupDebugSource==="none")return;let uiState=store3.state.ui??{};store3.state.ui=uiState,uiState.debugLogging={...uiState.debugLogging??{},enabled:!0,auto:startupDebugSource==="auto",mode:startupDebugSource==="auto"?"auto":"on",directory:startupDebugDirectory}}let hydrateFromDisk=async()=>{if(hydrateStarted)return;hydrateStarted=!0;try{let reloadEnv={...opts.env,DIMCODE_FAST_START:"0"},full=await createDimcodeContext({cwd:opts.cwd,env:reloadEnv});if(rehydrate({cache:full.cache,config:full.config,tools:full.tools,mcpServers:full.mcpServers,mcpPhase:"syncing",mcpConnectedCount:0,mcpConfiguredCount:full.mcpServers.length}),!storeRef)return;if(full.context.cwd)storeRef.setCwd(full.context.cwd);if(full.context.focusFiles)storeRef.setFocusFiles(full.context.focusFiles);let nextEnv=full.context.env??{};for(let[key,value]of Object.entries(nextEnv))storeRef.setEnvVar(key,value);let envReader=createEnvReader(full.context.env??{}),nextRun=resolveInitialRunConfig(envReader),modelFromProvider=String(storeRef.state.config.model??"").trim();if(storeRef.state.config={...storeRef.state.config,...nextRun},modelFromProvider)storeRef.state.config.model=modelFromProvider;applyStartupDebugToStore(storeRef),queueMcpSync(full.mcpServers,{force:!0})}catch{}},onStoreCreatedWithHydrate=(store3)=>{storeRef=store3,onStoreCreated(store3),applyStartupDebugToStore(store3),watch(()=>JSON.stringify(store3.state.mcp?.servers??[]),()=>{queueMcpSync(cloneMcpServers(store3.state.mcp?.servers??[]))}),watch(()=>String(store3.state.mcp?.phase??""),(phase)=>{if(phase!=="syncing"||activeMcpSyncSignature)return;queueMcpSync(cloneMcpServers(store3.state.mcp?.servers??[]),{force:!0})}),queueMicrotask(()=>{if(!fastStart){queueMcpSync(cloneMcpServers(store3.state.mcp?.servers??[]),{force:!0});return}hydrateFromDisk()})};return{toolRunner:createNoopToolRunner(),context,agent,onStoreCreated:onStoreCreatedWithHydrate,sessions,uiForcedSkills}}import{spawn as spawn3}from"node:child_process";import path34 from"node:path";var import_semver2=__toESM(require_semver2(),1);function isBetaUpdatesEnabled(config2){return config2.settings?.beta===!0}async function readBetaUpdatesEnabled(env=process.env){let{config:config2}=await loadDimcodeUserConfig(env);return isBetaUpdatesEnabled(config2)}var import_semver=__toESM(require_semver2(),1);function isPrereleaseVersion(version2){let parsed=import_semver.default.valid(version2);return Boolean(parsed&&import_semver.default.prerelease(parsed)?.length)}function selectUpdateVersion(versions2,opts){return versions2.map((version2)=>import_semver.default.valid(String(version2??"").trim())).filter((version2)=>Boolean(version2)).filter((version2)=>opts.includePrerelease?!0:!isPrereleaseVersion(version2)).sort(import_semver.default.rcompare)[0]??null}function shouldInstallSelectedVersion(current,selected,opts){let currentVersion=import_semver.default.valid(String(current??"").trim()),selectedVersion=import_semver.default.valid(String(selected??"").trim());if(!currentVersion||!selectedVersion)return String(current??"").trim()!==String(selected??"").trim();if(import_semver.default.eq(currentVersion,selectedVersion))return!1;if(import_semver.default.gt(selectedVersion,currentVersion))return!0;return!opts.includePrerelease&&isPrereleaseVersion(currentVersion)&&!isPrereleaseVersion(selectedVersion)}var UPGRADE_TOAST_FILE="upgrade-toast.json";function notifyUpgradeToast(message){let text=String(message??"").trim();if(!text)return;let handler=globalThis?.__DIMCODE_UPGRADE_TOAST__;if(typeof handler==="function")try{handler(text);return}catch{}writeUpgradeToastFile(text)}async function writeUpgradeToastFile(message){try{let[{mkdir:mkdir12,writeFile:writeFile11},path33]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env);await mkdir12(dir,{recursive:!0});let filePath=path33.join(dir,UPGRADE_TOAST_FILE),payload=JSON.stringify({message,createdAt:Date.now()});await writeFile11(filePath,payload,"utf8")}catch{}}async function consumeUpgradeToastFile(){try{let[{readFile:readFile12,unlink:unlink2},path33]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env),filePath=path33.join(dir,UPGRADE_TOAST_FILE),raw=await readFile12(filePath,"utf8");unlink2(filePath).catch(()=>{});let data=JSON.parse(raw);return String(data?.message??"").trim()||null}catch{return null}}import{existsSync as existsSync3,readFileSync as readFileSync2}from"node:fs";import path33 from"node:path";import{fileURLToPath as fileURLToPath4}from"node:url";function resolveCliVersion(){let injected="0.0.11-beta.4".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=path33.dirname(fileURLToPath4(import.meta.url));for(let i2=0;i2<6;i2++){let candidate=path33.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=path33.dirname(dir);if(parent===dir)break;dir=parent}}catch{}return null}var DEFAULT_GITLAB_HOST="gitlab.bfbops.com",DEFAULT_GITLAB_PROJECT="nextim/goatagent",DEFAULT_GITHUB_REPO="nextim/goatagent",DEFAULT_GITHUB_API_BASE_URL="https://api.github.com",RELEASE_CHECK_TIMEOUT_MS=5000;var RELEASE_LIST_PER_PAGE=100,RELEASE_LIST_MAX_PAGES=3,autoBinaryUpgradeStartedVersions=new Set;function getReleaseTimeoutMs(){let raw=String(process.env.DIMCODE_BINARY_UPDATE_CHECK_TIMEOUT_MS??"").trim(),n2=Number(raw);return Number.isFinite(n2)&&n2>100?Math.floor(n2):RELEASE_CHECK_TIMEOUT_MS}function isSelfContainedBinary(proc=process){try{let execPath=String(proc.execPath??"").trim();if(!execPath)return!1;let base=path34.basename(execPath.replace(/\\/g,"/")).toLowerCase();if(base==="node"||base.startsWith("node."))return!1;if(base==="bun"||base.startsWith("bun."))return!1;return!0}catch{return!1}}function resolveBunTarget(platform=process.platform,arch=process.arch){if(platform==="darwin"&&arch==="arm64")return"bun-darwin-arm64";if(platform==="darwin"&&arch==="x64")return"bun-darwin-x64";if(platform==="linux"&&arch==="x64")return"bun-linux-x64";if(platform==="linux"&&arch==="arm64")return"bun-linux-arm64";if(platform==="win32"&&arch==="x64")return"bun-windows-x64";return null}function resolveAssetName(target,platform=process.platform){return platform==="win32"?`dim-${target}.exe`:`dim-${target}`}function normalizeTagToSemver(tag){let raw=String(tag??"").trim();if(!raw)return null;let withoutV=raw.startsWith("v")?raw.slice(1):raw;return import_semver2.default.valid(withoutV)?withoutV:null}function selectGitHubAsset(releaseJson,assetName){let assets=Array.isArray(releaseJson?.assets)?releaseJson.assets:[];for(let asset of assets){let name15=typeof asset?.name==="string"?asset.name:"",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_semver2.default.valid(current))return null;let includePrerelease=await readBetaUpdatesEnabled(process.env),release2=await fetchLatestReleaseInfo(process.env,includePrerelease);if(!release2)return null;if(!import_semver2.default.valid(release2.version)||!shouldInstallSelectedVersion(current,release2.version,{includePrerelease}))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,includePrerelease){return await fetchReleaseInfo("latest",env,{includePrerelease})}async function fetchReleaseInfo(desired,env,opts){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);if(desired==="latest")return await fetchLatestSelectableReleaseInfo({provider,host:projectInfo.host,project:projectInfo.project,headers,githubApiBaseUrl:config2.githubApiBaseUrl,target,assetName,includePrerelease:opts?.includePrerelease===!0});let tagCandidates=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 info=releaseInfoFromJson({releaseJson,provider,host:projectInfo.host,project:projectInfo.project,target,assetName,fallbackTag:tagCandidate});if(info)return info}return null}async function fetchLatestSelectableReleaseInfo(opts){let releases=[];for(let page=1;page<=RELEASE_LIST_MAX_PAGES;page+=1){let releaseJsonList=await fetchReleaseListJson({...opts,page});if(!Array.isArray(releaseJsonList)||releaseJsonList.length===0)break;for(let releaseJson of releaseJsonList){let info=releaseInfoFromJson({releaseJson,provider:opts.provider,host:opts.host,project:opts.project,target:opts.target,assetName:opts.assetName});if(info)releases.push(info)}if(releaseJsonList.length<RELEASE_LIST_PER_PAGE)break}let selected=selectUpdateVersion(releases.map((release2)=>release2.version),{includePrerelease:opts.includePrerelease});if(!selected)return null;return releases.find((release2)=>release2.version===selected)??null}function releaseInfoFromJson(opts){let tag=String(opts.releaseJson?.tag_name??opts.releaseJson?.tagName??"").trim()||String(opts.fallbackTag??"").trim(),version2=normalizeTagToSemver(tag);if(!version2)return null;let asset=opts.provider==="github"?selectGitHubAsset(opts.releaseJson,opts.assetName):selectGitLabAsset(opts.releaseJson,opts.assetName);if(!asset)return null;return{provider:opts.provider,host:opts.host,project:opts.project,tag,version:version2,asset,target:opts.target,assetName:opts.assetName}}function buildTagCandidates(versionOrTag){let raw=String(versionOrTag??"").trim();if(!raw)return[];if(raw==="latest")return["latest"];if(raw.startsWith("v"))return[raw,raw.slice(1)];return[`v${raw}`,raw]}async function fetchReleaseJson(opts){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),getReleaseTimeoutMs());try{let 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)}}async function fetchReleaseListJson(opts){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),getReleaseTimeoutMs());try{let url2=buildReleaseListApiUrl(opts),response=await fetch(url2,{headers:{Accept:"application/json",...opts.headers},signal:controller.signal});if(!response.ok)return null;let json2=await response.json();return Array.isArray(json2)?json2:null}catch{return null}finally{clearTimeout(timeoutId)}}function buildReleaseApiUrl(opts){if(opts.provider==="github"){let apiBase=String(opts.githubApiBaseUrl||DEFAULT_GITHUB_API_BASE_URL).replace(/\/+$/,"");if(opts.tag==="latest")return`${apiBase}/repos/${opts.project}/releases/latest`;return`${apiBase}/repos/${opts.project}/releases/tags/${encodeURIComponent(opts.tag)}`}let host=opts.host||DEFAULT_GITLAB_HOST,projectId=encodeURIComponent(opts.project);if(opts.tag==="latest")return`https://${host}/api/v4/projects/${projectId}/releases/permalink/latest`;return`https://${host}/api/v4/projects/${projectId}/releases/${encodeURIComponent(opts.tag)}`}function buildReleaseListApiUrl(opts){let page=Math.max(1,Math.floor(opts.page));if(opts.provider==="github")return`${String(opts.githubApiBaseUrl||DEFAULT_GITHUB_API_BASE_URL).replace(/\/+$/,"")}/repos/${opts.project}/releases?per_page=${RELEASE_LIST_PER_PAGE}&page=${page}`;let host=opts.host||DEFAULT_GITLAB_HOST,projectId=encodeURIComponent(opts.project);return`https://${host}/api/v4/projects/${projectId}/releases?per_page=${RELEASE_LIST_PER_PAGE}&page=${page}`}function startAutoBinaryUpgrade(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{existsSync as existsSync5}from"node:fs";import path36 from"node:path";import{existsSync as existsSync4,readFileSync as readFileSync3,realpathSync,statSync as statSync2}from"node:fs";import path35 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";function resolveCurrentInstallTarget(opts){let execPath=normalizeExistingPath(opts.execPath);if(opts.isSelfContainedBinary)return{kind:"binary",manager:"binary",binPath:execPath??normalizePath2(opts.execPath)};let wrapperName=String(opts.env?.DIMCODE_NPM_PACKAGE??"").trim()||"dimcode",wrapperRoot=normalizeExistingPath(opts.env?.DIMCODE_NPM_PACKAGE_ROOT),importPath=pathFromFileUrl(opts.importMetaUrl),argvPath=normalizeExistingPath(opts.argvPath),binPath=argvPath??normalizePath2(opts.argvPath);if(wrapperRoot){let bun=resolveBunGlobalTarget(wrapperRoot,wrapperName,binPath);if(bun)return bun;let npm=resolveNpmGlobalTarget(wrapperRoot,wrapperName,binPath);if(npm)return npm;return{kind:"unknown",manager:"unknown",packageRoot:wrapperRoot,binPath,reason:`${wrapperName} wrapper root is not a recognized global install`}}let candidates=uniqueStrings([importPath,argvPath,normalizeExistingPath(importPath),execPath]);for(let candidate of candidates){let packageRoot=findPackageRoot(candidate,wrapperName);if(!packageRoot)continue;let sourceEntry=path35.join(packageRoot,"src","cli.ts");if(existsSync4(sourceEntry))return{kind:"source",manager:"source",packageRoot,binPath};let bun=resolveBunGlobalTarget(packageRoot,wrapperName,binPath);if(bun)return bun;let npm=resolveNpmGlobalTarget(packageRoot,wrapperName,binPath);if(npm)return npm;return{kind:"unknown",manager:"unknown",packageRoot,binPath,reason:`${wrapperName} package root is not a recognized global install`}}return{kind:"unknown",manager:"unknown",binPath,reason:`unable to locate ${wrapperName} package root`}}function resolveBunGlobalTarget(packageRoot,wrapperName,binPath){let normalized=toPosix(packageRoot),marker16=`/.bun/install/global/node_modules/${wrapperName}`;if(!normalized.includes(marker16))return null;let index=normalized.lastIndexOf(marker16),prefix=index>=0?packageRoot.slice(0,index+5):void 0;return{kind:"bun",manager:"bun",packageRoot,binPath,prefix}}function resolveNpmGlobalTarget(packageRoot,wrapperName,binPath){let parts=toPosix(packageRoot).split("/");if(parts.at(-1)!==wrapperName)return null;let nodeModulesIndex=parts.length-2;if(parts[nodeModulesIndex]!=="node_modules")return null;let hasLibSegment=parts[nodeModulesIndex-1]==="lib",prefixParts=hasLibSegment?parts.slice(0,nodeModulesIndex-1):parts.slice(0,nodeModulesIndex),prefix=fromPosix(prefixParts.join("/"))||path35.parse(packageRoot).root;if(!prefix)return null;if(!hasLibSegment&&existsSync4(path35.join(prefix,"package.json")))return{kind:"unknown",manager:"unknown",packageRoot,binPath,reason:`${wrapperName} appears to be installed in a local node_modules`};return{kind:"npm",manager:"npm",packageRoot,binPath,prefix}}function findPackageRoot(startPath,wrapperName){let normalized=normalizeExistingPath(startPath);if(!normalized)return null;let dir=isLikelyFilePath(normalized)?path35.dirname(normalized):normalized;for(;;){let packagePath=path35.join(dir,"package.json");if(existsSync4(packagePath)&&readPackageName(packagePath)===wrapperName)return dir;let parent=path35.dirname(dir);if(!parent||parent===dir)return null;dir=parent}}function readPackageName(packagePath){try{let parsed=JSON.parse(readFileSync3(packagePath,"utf8"));return typeof parsed?.name==="string"?parsed.name:""}catch{return""}}function pathFromFileUrl(value){try{return value.startsWith("file:")?fileURLToPath5(value):void 0}catch{return}}function normalizeExistingPath(value){let normalized=normalizePath2(value);if(!normalized)return;try{return realpathSync(normalized)}catch{return normalized}}function normalizePath2(value){let raw=String(value??"").trim();if(!raw)return;if(!path35.isAbsolute(raw))return;return path35.resolve(raw)}function uniqueStrings(values){return[...new Set(values.filter((v2)=>Boolean(v2)))]}function isLikelyFilePath(value){if(existsSync4(value))try{return statSync2(value).isFile()}catch{}return Boolean(path35.extname(value))}function toPosix(value){return value.replace(/\\/g,"/")}function fromPosix(value){if(path35.sep==="/")return value;return value.replace(/\//g,path35.sep)}var DEFAULT_PACKAGE_NAME="dimcode";function resolveWrapperPackageVersion(){return(process.env.DIMCODE_NPM_PACKAGE_VERSION||"").trim()||null}function isBetaOnlyWrapper(packageName){if(packageName===DEFAULT_PACKAGE_NAME)return!1;return process.env.DIMCODE_NPM_PACKAGE_BETA_ONLY==="1"}var DEBUG_LOG_PATH=process.env.DIMCODE_DEBUG_LOG||"./dimcode-debug.log",CHECK_TIMEOUT_MS=5000,autoInstallStartedVersions=new Set;async function fetchPackageVersions(packageName=DEFAULT_PACKAGE_NAME){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 versions2=(await response.json())?.versions;if(!versions2||typeof versions2!=="object")throw Error("No versions found in registry response");return Object.keys(versions2)}catch(error48){if(error48 instanceof Error&&error48.name==="AbortError")throw Error("npm registry request timed out");throw error48}}async function resolveLatestNpmVersion(packageName,includePrerelease,betaOnly=!1){let raw=await fetchPackageVersions(packageName),versions2=betaOnly?raw.filter((v2)=>isPrereleaseVersion(v2)):raw;return selectUpdateVersion(versions2,{includePrerelease:betaOnly?!0:includePrerelease})}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 betaOnly=isBetaOnlyWrapper(packageName),includePrerelease=betaOnly||await readBetaUpdatesEnabled(),latest=await resolveLatestNpmVersion(packageName,includePrerelease,betaOnly);if(await logUpgradeCheck("check-result",{current,latest,hasInjectedVersion,wrapperVersion,includePrerelease,betaOnly}),!latest)return await logUpgradeCheck("error",{message:"Failed to fetch latest version"}),null;if(!shouldInstallSelectedVersion(current,latest,{includePrerelease}))return await logUpgradeCheck("no-update",{current,latest}),null;if(process.env.DIMCODE_AUTOUPDATE!=="0"&&hasInjectedVersion){let installer=resolvePackageInstaller(latest,packageName);if(!installer)return await logUpgradeCheck("autoupdate-skip-unknown-install-target",{current,latest,target:resolveNpmInstallTarget()}),`Update available: ${packageName}@${latest} (current: ${current}). Auto-update skipped because the current install source could not be identified. Run: dim version`;let installKey=`${packageName}@${latest}:${installer.manager}:${installer.prefix??""}`;if(autoInstallStartedVersions.has(installKey))return await logUpgradeCheck("autoupdate-skip-duplicate",{version:latest}),null;return autoInstallStartedVersions.add(installKey),await logUpgradeCheck("update-available",{current,latest,autoUpdate:!0,installer:installer.manager,prefix:installer.prefix}),startAutoInstall(latest,packageName,installer),`Update available: ${packageName}@${latest} (current: ${current}). Installing ${installer.manager} global package in background. Restart terminal after it finishes.`}return await logUpgradeCheck("update-available",{current,latest,autoUpdate:!1}),`Update available: ${packageName}@${latest} (current: ${current})`}catch(error48){return await logUpgradeCheck("error",{message:error48 instanceof Error?error48.message:String(error48)}),null}}function startAutoInstall(version2,packageName=DEFAULT_PACKAGE_NAME,installer){try{logUpgradeCheck("autoupdate-start",{version:version2,installer:installer.manager,prefix:installer.prefix});let proc=import_cross_spawn2.default(installer.command,[...installer.argsPrefix,...installer.installArgs],{stdio:"ignore",detached:!0,windowsHide:process.platform==="win32"});proc.unref();let finished=!1,finalize2=(message)=>{if(finished)return;finished=!0,logUpgradeCheck("autoupdate-finish",{version: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: ${installer.manualCommand}`)}),proc.on("error",()=>{logUpgradeCheck("autoupdate-error",{version:version2,reason:"process-error"}),finalize2(`Auto-update failed. Run: ${installer.manualCommand}`)})}catch{logUpgradeCheck("autoupdate-error",{version:version2,reason:"spawn-throw"}),notifyUpgradeToast(`Auto-update failed. Run: ${installer.manualCommand}`)}}async function logUpgradeCheck(_event,_data){}function safeCwd(){try{return process.cwd()}catch{return}}function safeArgv(){try{return process.argv}catch{return}}function resolveNpmInstallTarget(){return resolveCurrentInstallTarget({importMetaUrl:import.meta.url,argvPath:process.argv[1],execPath:process.execPath,env:process.env,isSelfContainedBinary:!1})}function resolvePackageInstaller(version2,packageName=DEFAULT_PACKAGE_NAME){let target=resolveNpmInstallTarget(),manager=target.manager==="npm"||target.manager==="bun"?target.manager:null;if(!manager)return null;let{command,argsPrefix}=resolvePackageManagerCommand(manager),packageSpec=`${packageName}@${version2}`,prefix=manager==="npm"?target.prefix:void 0,installArgs=manager==="npm"?["install","-g","--prefer-online",...prefix?["--prefix",prefix]:[],packageSpec]:["install","-g",packageSpec];return{manager,command,argsPrefix,installArgs,manualCommand:manager==="npm"?formatManualCommand(["npm","install","-g","--prefer-online",...prefix?["--prefix",prefix]:[],packageSpec]):`bun install -g ${packageSpec}`,prefix}}function formatManualCommand(args){return args.map(quoteShellArg).join(" ")}function quoteShellArg(value){if(/^[\w./:@%+=,-]+$/.test(value))return value;return JSON.stringify(value)}function resolvePackageManagerCommand(pm){if(process.platform!=="win32")return{command:pm,argsPrefix:[]};if(pm==="bun")return resolveBunCommand();return resolveNpmCommand()}function resolveBunCommand(){let execPath=String(process.execPath??"").trim();if(execPath){if(path36.basename(execPath).toLowerCase().startsWith("bun")&&existsSync5(execPath))return{command:execPath,argsPrefix:[]}}let bunHome=String(process.env.BUN_INSTALL??"").trim();if(bunHome){let bunExe=path36.join(bunHome,"bin","bun.exe");if(existsSync5(bunExe))return{command:bunExe,argsPrefix:[]}}return{command:"bun",argsPrefix:[]}}function resolveNpmCommand(){let execPath=String(process.execPath??"").trim(),execDir=execPath?path36.dirname(execPath):"";if(execDir){let npmCmd=path36.join(execDir,"npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]};let npmCliCandidates=[path36.join(execDir,"node_modules","npm","bin","npm-cli.js"),path36.resolve(execDir,"..","lib","node_modules","npm","bin","npm-cli.js")];if(execPath){for(let npmCli of npmCliCandidates)if(existsSync5(npmCli))return{command:execPath,argsPrefix:[npmCli]}}}let appData=String(process.env.APPDATA??"").trim();if(appData){let npmCmd=path36.join(appData,"npm","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFiles=String(process.env.ProgramFiles??"").trim();if(programFiles){let npmCmd=path36.join(programFiles,"nodejs","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFilesX86=String(process.env["ProgramFiles(x86)"]??"").trim();if(programFilesX86){let npmCmd=path36.join(programFilesX86,"nodejs","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}return{command:"npm",argsPrefix:[]}}function getNpmPackageOverride(){return(process.env.DIMCODE_NPM_PACKAGE||"").trim()||void 0}async function checkUpgrade(){let npmPackage=getNpmPackageOverride();if(npmPackage)return await checkNpmUpgrade(npmPackage);if(isSelfContainedBinary())return await checkBinaryUpgrade();return await checkNpmUpgrade()}import process25 from"node:process";var logger=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(`
1166
+ `)}}}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"}),cliDebugDirectory=readOptionalString3(opts.debugDirectory),startupDebugCache=opts.enablePersistentDebugAuto&&fastStart&&!cliDebugDirectory?await loadDimcodeUserCache(opts.env).then((result)=>result.cache).catch(()=>cache):cache,persistedDebugMode=normalizePersistedDebugLogMode(startupDebugCache.settings?.debugLogMode),startupDebugSource=cliDebugDirectory?"cli":opts.enablePersistentDebugAuto&&persistedDebugMode==="auto"?"auto":"none",startupDebugDirectory=normalizeDebugLogDirectory(cliDebugDirectory||readOptionalString3(startupDebugCache.settings?.debugLogDirectory)||void 0);if(startupDebugSource==="auto")await cleanupOldDebugJsonlLogs(startupDebugDirectory);if(startupDebugSource!=="none")await agent.setDebugLogState?.({enabled:!0,directory:startupDebugDirectory,reason:startupDebugSource==="auto"?"debug auto startup":"debug cli flag"});let sessionsBackend=agent.sessions??null,initialSessionId=await resolveStartupSessionId({sessionsBackend,envSessionId:opts.sessionId});opts.env.DIMCODE_SESSION_ID=initialSessionId??"",context.env.DIMCODE_SESSION_ID=initialSessionId??"";let{sessions,onStoreCreated,rehydrate}=createDimSdkPersistence({cacheFile,cache,configFile,config:config2,toolsFile,tools,mcpJsonFile,mcpServers,mcpPhase,mcpConnectedCount,mcpConfiguredCount,sessionsBackend,agent,toolsRef,deferPersist:fastStart}),storeRef=null,hydrateStarted=!1,mcpSyncQueue=Promise.resolve(),queuedMcpSignature="",activeMcpSyncSignature=null,cloneMcpServers=(servers)=>JSON.parse(JSON.stringify(Array.isArray(servers)?servers:[])),sleep=async(ms)=>{await new Promise((resolve2)=>setTimeout(resolve2,ms))},ensureStoreMcpState=(store3)=>{let current=store3.state.mcp;if(current&&Array.isArray(current.servers))return current;return store3.state.mcp={servers:[],phase:"deferred",connectedCount:0,configuredCount:0},store3.state.mcp},applyMcpRuntimeState=(phase,connectedCount,configuredCount)=>{if(!storeRef)return;let mcpState=ensureStoreMcpState(storeRef);mcpState.phase=phase,mcpState.connectedCount=Math.max(0,connectedCount),mcpState.configuredCount=Math.max(0,configuredCount)},queueMcpSync=(servers,options)=>{let nextServers=cloneMcpServers(servers),signature=JSON.stringify(nextServers);if(!options?.force&&signature===queuedMcpSignature)return;queuedMcpSignature=signature,mcpSyncQueue=mcpSyncQueue.then(async()=>{if(!storeRef)return;activeMcpSyncSignature=signature,applyMcpRuntimeState("syncing",0,nextServers.length);try{let state=await agent.syncMcpServers?.(toMcpServerConfigs(nextServers));if(!state)state=await agent.getMcpState?.();if(!state){applyMcpRuntimeState("ready",0,nextServers.length);return}applyMcpRuntimeState(state.phase,state.connectedServers.length,state.configuredServers);for(let i2=0;i2<240&&state.phase==="syncing";i2+=1)await sleep(250),state=await agent.getMcpState?.()??state,applyMcpRuntimeState(state.phase,state.connectedServers.length,state.configuredServers)}catch{applyMcpRuntimeState("error",0,nextServers.length)}finally{activeMcpSyncSignature=null}},async()=>{if(storeRef)applyMcpRuntimeState("error",0,nextServers.length);activeMcpSyncSignature=null})};function applyStartupDebugToStore(store3){if(startupDebugSource==="none")return;let uiState=store3.state.ui??{};store3.state.ui=uiState,uiState.debugLogging={...uiState.debugLogging??{},enabled:!0,auto:startupDebugSource==="auto",mode:startupDebugSource==="auto"?"auto":"on",directory:startupDebugDirectory}}let hydrateFromDisk=async()=>{if(hydrateStarted)return;hydrateStarted=!0;try{let reloadEnv={...opts.env,DIMCODE_FAST_START:"0"},full=await createDimcodeContext({cwd:opts.cwd,env:reloadEnv});if(rehydrate({cache:full.cache,config:full.config,tools:full.tools,mcpServers:full.mcpServers,mcpPhase:"syncing",mcpConnectedCount:0,mcpConfiguredCount:full.mcpServers.length}),!storeRef)return;if(full.context.cwd)storeRef.setCwd(full.context.cwd);if(full.context.focusFiles)storeRef.setFocusFiles(full.context.focusFiles);let nextEnv=full.context.env??{};for(let[key,value]of Object.entries(nextEnv))storeRef.setEnvVar(key,value);let envReader=createEnvReader(full.context.env??{}),nextRun=resolveInitialRunConfig(envReader),modelFromProvider=String(storeRef.state.config.model??"").trim();if(storeRef.state.config={...storeRef.state.config,...nextRun},modelFromProvider)storeRef.state.config.model=modelFromProvider;applyStartupDebugToStore(storeRef),queueMcpSync(full.mcpServers,{force:!0})}catch{}},onStoreCreatedWithHydrate=(store3)=>{storeRef=store3,onStoreCreated(store3),applyStartupDebugToStore(store3),watch(()=>JSON.stringify(store3.state.mcp?.servers??[]),()=>{queueMcpSync(cloneMcpServers(store3.state.mcp?.servers??[]))}),watch(()=>String(store3.state.mcp?.phase??""),(phase)=>{if(phase!=="syncing"||activeMcpSyncSignature)return;queueMcpSync(cloneMcpServers(store3.state.mcp?.servers??[]),{force:!0})}),queueMicrotask(()=>{if(!fastStart){queueMcpSync(cloneMcpServers(store3.state.mcp?.servers??[]),{force:!0});return}hydrateFromDisk()})};return{toolRunner:createNoopToolRunner(),context,agent,onStoreCreated:onStoreCreatedWithHydrate,sessions,uiForcedSkills}}import{spawn as spawn3}from"node:child_process";import path34 from"node:path";var import_semver2=__toESM(require_semver2(),1);function isBetaUpdatesEnabled(config2){return config2.settings?.beta===!0}async function readBetaUpdatesEnabled(env=process.env){let{config:config2}=await loadDimcodeUserConfig(env);return isBetaUpdatesEnabled(config2)}var import_semver=__toESM(require_semver2(),1);function isPrereleaseVersion(version2){let parsed=import_semver.default.valid(version2);return Boolean(parsed&&import_semver.default.prerelease(parsed)?.length)}function selectUpdateVersion(versions2,opts){return versions2.map((version2)=>import_semver.default.valid(String(version2??"").trim())).filter((version2)=>Boolean(version2)).filter((version2)=>opts.includePrerelease?!0:!isPrereleaseVersion(version2)).sort(import_semver.default.rcompare)[0]??null}function shouldInstallSelectedVersion(current,selected,opts){let currentVersion=import_semver.default.valid(String(current??"").trim()),selectedVersion=import_semver.default.valid(String(selected??"").trim());if(!currentVersion||!selectedVersion)return String(current??"").trim()!==String(selected??"").trim();if(import_semver.default.eq(currentVersion,selectedVersion))return!1;if(import_semver.default.gt(selectedVersion,currentVersion))return!0;return!opts.includePrerelease&&isPrereleaseVersion(currentVersion)&&!isPrereleaseVersion(selectedVersion)}var UPGRADE_TOAST_FILE="upgrade-toast.json";function notifyUpgradeToast(message){let text=String(message??"").trim();if(!text)return;let handler=globalThis?.__DIMCODE_UPGRADE_TOAST__;if(typeof handler==="function")try{handler(text);return}catch{}writeUpgradeToastFile(text)}async function writeUpgradeToastFile(message){try{let[{mkdir:mkdir12,writeFile:writeFile11},path33]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env);await mkdir12(dir,{recursive:!0});let filePath=path33.join(dir,UPGRADE_TOAST_FILE),payload=JSON.stringify({message,createdAt:Date.now()});await writeFile11(filePath,payload,"utf8")}catch{}}async function consumeUpgradeToastFile(){try{let[{readFile:readFile12,unlink:unlink2},path33]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env),filePath=path33.join(dir,UPGRADE_TOAST_FILE),raw=await readFile12(filePath,"utf8");unlink2(filePath).catch(()=>{});let data=JSON.parse(raw);return String(data?.message??"").trim()||null}catch{return null}}import{existsSync as existsSync3,readFileSync as readFileSync2}from"node:fs";import path33 from"node:path";import{fileURLToPath as fileURLToPath4}from"node:url";function resolveCliVersion(){let injected="0.0.13-beta.0".trim();if(injected)return{version:injected,source:"injected"};let pkgVersion=readNearestPackageVersion();if(pkgVersion)return{version:pkgVersion,source:"package"};return null}function readNearestPackageVersion(){try{let dir=path33.dirname(fileURLToPath4(import.meta.url));for(let i2=0;i2<6;i2++){let candidate=path33.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=path33.dirname(dir);if(parent===dir)break;dir=parent}}catch{}return null}var DEFAULT_GITLAB_HOST="gitlab.bfbops.com",DEFAULT_GITLAB_PROJECT="nextim/goatagent",DEFAULT_GITHUB_REPO="nextim/goatagent",DEFAULT_GITHUB_API_BASE_URL="https://api.github.com",RELEASE_CHECK_TIMEOUT_MS=5000;var RELEASE_LIST_PER_PAGE=100,RELEASE_LIST_MAX_PAGES=3,autoBinaryUpgradeStartedVersions=new Set;function getReleaseTimeoutMs(){let raw=String(process.env.DIMCODE_BINARY_UPDATE_CHECK_TIMEOUT_MS??"").trim(),n2=Number(raw);return Number.isFinite(n2)&&n2>100?Math.floor(n2):RELEASE_CHECK_TIMEOUT_MS}function isSelfContainedBinary(proc=process){try{let execPath=String(proc.execPath??"").trim();if(!execPath)return!1;let base=path34.basename(execPath.replace(/\\/g,"/")).toLowerCase();if(base==="node"||base.startsWith("node."))return!1;if(base==="bun"||base.startsWith("bun."))return!1;return!0}catch{return!1}}function resolveBunTarget(platform=process.platform,arch=process.arch){if(platform==="darwin"&&arch==="arm64")return"bun-darwin-arm64";if(platform==="darwin"&&arch==="x64")return"bun-darwin-x64";if(platform==="linux"&&arch==="x64")return"bun-linux-x64";if(platform==="linux"&&arch==="arm64")return"bun-linux-arm64";if(platform==="win32"&&arch==="x64")return"bun-windows-x64";return null}function resolveAssetName(target,platform=process.platform){return platform==="win32"?`dim-${target}.exe`:`dim-${target}`}function normalizeTagToSemver(tag){let raw=String(tag??"").trim();if(!raw)return null;let withoutV=raw.startsWith("v")?raw.slice(1):raw;return import_semver2.default.valid(withoutV)?withoutV:null}function selectGitHubAsset(releaseJson,assetName){let assets=Array.isArray(releaseJson?.assets)?releaseJson.assets:[];for(let asset of assets){let name15=typeof asset?.name==="string"?asset.name:"",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_semver2.default.valid(current))return null;let includePrerelease=await readBetaUpdatesEnabled(process.env),release2=await fetchLatestReleaseInfo(process.env,includePrerelease);if(!release2)return null;if(!import_semver2.default.valid(release2.version)||!shouldInstallSelectedVersion(current,release2.version,{includePrerelease}))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,includePrerelease){return await fetchReleaseInfo("latest",env,{includePrerelease})}async function fetchReleaseInfo(desired,env,opts){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);if(desired==="latest")return await fetchLatestSelectableReleaseInfo({provider,host:projectInfo.host,project:projectInfo.project,headers,githubApiBaseUrl:config2.githubApiBaseUrl,target,assetName,includePrerelease:opts?.includePrerelease===!0});let tagCandidates=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 info=releaseInfoFromJson({releaseJson,provider,host:projectInfo.host,project:projectInfo.project,target,assetName,fallbackTag:tagCandidate});if(info)return info}return null}async function fetchLatestSelectableReleaseInfo(opts){let releases=[];for(let page=1;page<=RELEASE_LIST_MAX_PAGES;page+=1){let releaseJsonList=await fetchReleaseListJson({...opts,page});if(!Array.isArray(releaseJsonList)||releaseJsonList.length===0)break;for(let releaseJson of releaseJsonList){let info=releaseInfoFromJson({releaseJson,provider:opts.provider,host:opts.host,project:opts.project,target:opts.target,assetName:opts.assetName});if(info)releases.push(info)}if(releaseJsonList.length<RELEASE_LIST_PER_PAGE)break}let selected=selectUpdateVersion(releases.map((release2)=>release2.version),{includePrerelease:opts.includePrerelease});if(!selected)return null;return releases.find((release2)=>release2.version===selected)??null}function releaseInfoFromJson(opts){let tag=String(opts.releaseJson?.tag_name??opts.releaseJson?.tagName??"").trim()||String(opts.fallbackTag??"").trim(),version2=normalizeTagToSemver(tag);if(!version2)return null;let asset=opts.provider==="github"?selectGitHubAsset(opts.releaseJson,opts.assetName):selectGitLabAsset(opts.releaseJson,opts.assetName);if(!asset)return null;return{provider:opts.provider,host:opts.host,project:opts.project,tag,version:version2,asset,target:opts.target,assetName:opts.assetName}}function buildTagCandidates(versionOrTag){let raw=String(versionOrTag??"").trim();if(!raw)return[];if(raw==="latest")return["latest"];if(raw.startsWith("v"))return[raw,raw.slice(1)];return[`v${raw}`,raw]}async function fetchReleaseJson(opts){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),getReleaseTimeoutMs());try{let 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)}}async function fetchReleaseListJson(opts){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),getReleaseTimeoutMs());try{let url2=buildReleaseListApiUrl(opts),response=await fetch(url2,{headers:{Accept:"application/json",...opts.headers},signal:controller.signal});if(!response.ok)return null;let json2=await response.json();return Array.isArray(json2)?json2:null}catch{return null}finally{clearTimeout(timeoutId)}}function buildReleaseApiUrl(opts){if(opts.provider==="github"){let apiBase=String(opts.githubApiBaseUrl||DEFAULT_GITHUB_API_BASE_URL).replace(/\/+$/,"");if(opts.tag==="latest")return`${apiBase}/repos/${opts.project}/releases/latest`;return`${apiBase}/repos/${opts.project}/releases/tags/${encodeURIComponent(opts.tag)}`}let host=opts.host||DEFAULT_GITLAB_HOST,projectId=encodeURIComponent(opts.project);if(opts.tag==="latest")return`https://${host}/api/v4/projects/${projectId}/releases/permalink/latest`;return`https://${host}/api/v4/projects/${projectId}/releases/${encodeURIComponent(opts.tag)}`}function buildReleaseListApiUrl(opts){let page=Math.max(1,Math.floor(opts.page));if(opts.provider==="github")return`${String(opts.githubApiBaseUrl||DEFAULT_GITHUB_API_BASE_URL).replace(/\/+$/,"")}/repos/${opts.project}/releases?per_page=${RELEASE_LIST_PER_PAGE}&page=${page}`;let host=opts.host||DEFAULT_GITLAB_HOST,projectId=encodeURIComponent(opts.project);return`https://${host}/api/v4/projects/${projectId}/releases?per_page=${RELEASE_LIST_PER_PAGE}&page=${page}`}function startAutoBinaryUpgrade(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{existsSync as existsSync5}from"node:fs";import path36 from"node:path";import{existsSync as existsSync4,readFileSync as readFileSync3,realpathSync,statSync as statSync2}from"node:fs";import path35 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";function resolveCurrentInstallTarget(opts){let execPath=normalizeExistingPath(opts.execPath);if(opts.isSelfContainedBinary)return{kind:"binary",manager:"binary",binPath:execPath??normalizePath2(opts.execPath)};let wrapperName=String(opts.env?.DIMCODE_NPM_PACKAGE??"").trim()||"dimcode",wrapperRoot=normalizeExistingPath(opts.env?.DIMCODE_NPM_PACKAGE_ROOT),importPath=pathFromFileUrl(opts.importMetaUrl),argvPath=normalizeExistingPath(opts.argvPath),binPath=argvPath??normalizePath2(opts.argvPath);if(wrapperRoot){let bun=resolveBunGlobalTarget(wrapperRoot,wrapperName,binPath);if(bun)return bun;let npm=resolveNpmGlobalTarget(wrapperRoot,wrapperName,binPath);if(npm)return npm;return{kind:"unknown",manager:"unknown",packageRoot:wrapperRoot,binPath,reason:`${wrapperName} wrapper root is not a recognized global install`}}let candidates=uniqueStrings([importPath,argvPath,normalizeExistingPath(importPath),execPath]);for(let candidate of candidates){let packageRoot=findPackageRoot(candidate,wrapperName);if(!packageRoot)continue;let sourceEntry=path35.join(packageRoot,"src","cli.ts");if(existsSync4(sourceEntry))return{kind:"source",manager:"source",packageRoot,binPath};let bun=resolveBunGlobalTarget(packageRoot,wrapperName,binPath);if(bun)return bun;let npm=resolveNpmGlobalTarget(packageRoot,wrapperName,binPath);if(npm)return npm;return{kind:"unknown",manager:"unknown",packageRoot,binPath,reason:`${wrapperName} package root is not a recognized global install`}}return{kind:"unknown",manager:"unknown",binPath,reason:`unable to locate ${wrapperName} package root`}}function resolveBunGlobalTarget(packageRoot,wrapperName,binPath){let normalized=toPosix(packageRoot),marker16=`/.bun/install/global/node_modules/${wrapperName}`;if(!normalized.includes(marker16))return null;let index=normalized.lastIndexOf(marker16),prefix=index>=0?packageRoot.slice(0,index+5):void 0;return{kind:"bun",manager:"bun",packageRoot,binPath,prefix}}function resolveNpmGlobalTarget(packageRoot,wrapperName,binPath){let parts=toPosix(packageRoot).split("/");if(parts.at(-1)!==wrapperName)return null;let nodeModulesIndex=parts.length-2;if(parts[nodeModulesIndex]!=="node_modules")return null;let hasLibSegment=parts[nodeModulesIndex-1]==="lib",prefixParts=hasLibSegment?parts.slice(0,nodeModulesIndex-1):parts.slice(0,nodeModulesIndex),prefix=fromPosix(prefixParts.join("/"))||path35.parse(packageRoot).root;if(!prefix)return null;if(!hasLibSegment&&existsSync4(path35.join(prefix,"package.json")))return{kind:"unknown",manager:"unknown",packageRoot,binPath,reason:`${wrapperName} appears to be installed in a local node_modules`};return{kind:"npm",manager:"npm",packageRoot,binPath,prefix}}function findPackageRoot(startPath,wrapperName){let normalized=normalizeExistingPath(startPath);if(!normalized)return null;let dir=isLikelyFilePath(normalized)?path35.dirname(normalized):normalized;for(;;){let packagePath=path35.join(dir,"package.json");if(existsSync4(packagePath)&&readPackageName(packagePath)===wrapperName)return dir;let parent=path35.dirname(dir);if(!parent||parent===dir)return null;dir=parent}}function readPackageName(packagePath){try{let parsed=JSON.parse(readFileSync3(packagePath,"utf8"));return typeof parsed?.name==="string"?parsed.name:""}catch{return""}}function pathFromFileUrl(value){try{return value.startsWith("file:")?fileURLToPath5(value):void 0}catch{return}}function normalizeExistingPath(value){let normalized=normalizePath2(value);if(!normalized)return;try{return realpathSync(normalized)}catch{return normalized}}function normalizePath2(value){let raw=String(value??"").trim();if(!raw)return;if(!path35.isAbsolute(raw))return;return path35.resolve(raw)}function uniqueStrings(values){return[...new Set(values.filter((v2)=>Boolean(v2)))]}function isLikelyFilePath(value){if(existsSync4(value))try{return statSync2(value).isFile()}catch{}return Boolean(path35.extname(value))}function toPosix(value){return value.replace(/\\/g,"/")}function fromPosix(value){if(path35.sep==="/")return value;return value.replace(/\//g,path35.sep)}var DEFAULT_PACKAGE_NAME="dimcode";function resolveWrapperPackageVersion(){return(process.env.DIMCODE_NPM_PACKAGE_VERSION||"").trim()||null}function isBetaOnlyWrapper(packageName){if(packageName===DEFAULT_PACKAGE_NAME)return!1;return process.env.DIMCODE_NPM_PACKAGE_BETA_ONLY==="1"}var DEBUG_LOG_PATH=process.env.DIMCODE_DEBUG_LOG||"./dimcode-debug.log",CHECK_TIMEOUT_MS=5000,autoInstallStartedVersions=new Set;async function fetchPackageVersions(packageName=DEFAULT_PACKAGE_NAME){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 versions2=(await response.json())?.versions;if(!versions2||typeof versions2!=="object")throw Error("No versions found in registry response");return Object.keys(versions2)}catch(error48){if(error48 instanceof Error&&error48.name==="AbortError")throw Error("npm registry request timed out");throw error48}}async function resolveLatestNpmVersion(packageName,includePrerelease,betaOnly=!1){let raw=await fetchPackageVersions(packageName),versions2=betaOnly?raw.filter((v2)=>isPrereleaseVersion(v2)):raw;return selectUpdateVersion(versions2,{includePrerelease:betaOnly?!0:includePrerelease})}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 betaOnly=isBetaOnlyWrapper(packageName),includePrerelease=betaOnly||await readBetaUpdatesEnabled(),latest=await resolveLatestNpmVersion(packageName,includePrerelease,betaOnly);if(await logUpgradeCheck("check-result",{current,latest,hasInjectedVersion,wrapperVersion,includePrerelease,betaOnly}),!latest)return await logUpgradeCheck("error",{message:"Failed to fetch latest version"}),null;if(!shouldInstallSelectedVersion(current,latest,{includePrerelease}))return await logUpgradeCheck("no-update",{current,latest}),null;if(process.env.DIMCODE_AUTOUPDATE!=="0"&&hasInjectedVersion){let installer=resolvePackageInstaller(latest,packageName);if(!installer)return await logUpgradeCheck("autoupdate-skip-unknown-install-target",{current,latest,target:resolveNpmInstallTarget()}),`Update available: ${packageName}@${latest} (current: ${current}). Auto-update skipped because the current install source could not be identified. Run: dim version`;let installKey=`${packageName}@${latest}:${installer.manager}:${installer.prefix??""}`;if(autoInstallStartedVersions.has(installKey))return await logUpgradeCheck("autoupdate-skip-duplicate",{version:latest}),null;return autoInstallStartedVersions.add(installKey),await logUpgradeCheck("update-available",{current,latest,autoUpdate:!0,installer:installer.manager,prefix:installer.prefix}),startAutoInstall(latest,packageName,installer),`Update available: ${packageName}@${latest} (current: ${current}). Installing ${installer.manager} global package in background. Restart terminal after it finishes.`}return await logUpgradeCheck("update-available",{current,latest,autoUpdate:!1}),`Update available: ${packageName}@${latest} (current: ${current})`}catch(error48){return await logUpgradeCheck("error",{message:error48 instanceof Error?error48.message:String(error48)}),null}}function startAutoInstall(version2,packageName=DEFAULT_PACKAGE_NAME,installer){try{logUpgradeCheck("autoupdate-start",{version:version2,installer:installer.manager,prefix:installer.prefix});let proc=import_cross_spawn2.default(installer.command,[...installer.argsPrefix,...installer.installArgs],{stdio:"ignore",detached:!0,windowsHide:process.platform==="win32"});proc.unref();let finished=!1,finalize2=(message)=>{if(finished)return;finished=!0,logUpgradeCheck("autoupdate-finish",{version: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: ${installer.manualCommand}`)}),proc.on("error",()=>{logUpgradeCheck("autoupdate-error",{version:version2,reason:"process-error"}),finalize2(`Auto-update failed. Run: ${installer.manualCommand}`)})}catch{logUpgradeCheck("autoupdate-error",{version:version2,reason:"spawn-throw"}),notifyUpgradeToast(`Auto-update failed. Run: ${installer.manualCommand}`)}}async function logUpgradeCheck(_event,_data){}function safeCwd(){try{return process.cwd()}catch{return}}function safeArgv(){try{return process.argv}catch{return}}function resolveNpmInstallTarget(){return resolveCurrentInstallTarget({importMetaUrl:import.meta.url,argvPath:process.argv[1],execPath:process.execPath,env:process.env,isSelfContainedBinary:!1})}function resolvePackageInstaller(version2,packageName=DEFAULT_PACKAGE_NAME){let target=resolveNpmInstallTarget(),manager=target.manager==="npm"||target.manager==="bun"?target.manager:null;if(!manager)return null;let{command,argsPrefix}=resolvePackageManagerCommand(manager),packageSpec=`${packageName}@${version2}`,prefix=manager==="npm"?target.prefix:void 0,installArgs=manager==="npm"?["install","-g","--prefer-online",...prefix?["--prefix",prefix]:[],packageSpec]:["install","-g",packageSpec];return{manager,command,argsPrefix,installArgs,manualCommand:manager==="npm"?formatManualCommand(["npm","install","-g","--prefer-online",...prefix?["--prefix",prefix]:[],packageSpec]):`bun install -g ${packageSpec}`,prefix}}function formatManualCommand(args){return args.map(quoteShellArg).join(" ")}function quoteShellArg(value){if(/^[\w./:@%+=,-]+$/.test(value))return value;return JSON.stringify(value)}function resolvePackageManagerCommand(pm){if(process.platform!=="win32")return{command:pm,argsPrefix:[]};if(pm==="bun")return resolveBunCommand();return resolveNpmCommand()}function resolveBunCommand(){let execPath=String(process.execPath??"").trim();if(execPath){if(path36.basename(execPath).toLowerCase().startsWith("bun")&&existsSync5(execPath))return{command:execPath,argsPrefix:[]}}let bunHome=String(process.env.BUN_INSTALL??"").trim();if(bunHome){let bunExe=path36.join(bunHome,"bin","bun.exe");if(existsSync5(bunExe))return{command:bunExe,argsPrefix:[]}}return{command:"bun",argsPrefix:[]}}function resolveNpmCommand(){let execPath=String(process.execPath??"").trim(),execDir=execPath?path36.dirname(execPath):"";if(execDir){let npmCmd=path36.join(execDir,"npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]};let npmCliCandidates=[path36.join(execDir,"node_modules","npm","bin","npm-cli.js"),path36.resolve(execDir,"..","lib","node_modules","npm","bin","npm-cli.js")];if(execPath){for(let npmCli of npmCliCandidates)if(existsSync5(npmCli))return{command:execPath,argsPrefix:[npmCli]}}}let appData=String(process.env.APPDATA??"").trim();if(appData){let npmCmd=path36.join(appData,"npm","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFiles=String(process.env.ProgramFiles??"").trim();if(programFiles){let npmCmd=path36.join(programFiles,"nodejs","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFilesX86=String(process.env["ProgramFiles(x86)"]??"").trim();if(programFilesX86){let npmCmd=path36.join(programFilesX86,"nodejs","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}return{command:"npm",argsPrefix:[]}}function getNpmPackageOverride(){return(process.env.DIMCODE_NPM_PACKAGE||"").trim()||void 0}async function checkUpgrade(){let npmPackage=getNpmPackageOverride();if(npmPackage)return await checkNpmUpgrade(npmPackage);if(isSelfContainedBinary())return await checkBinaryUpgrade();return await checkNpmUpgrade()}import process25 from"node:process";var logger=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(`
1167
1167
  `).length}function buildPreview(text,maxLines){let lines=text.split(`
1168
1168
  `).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(`
1169
1169
  `)}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(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "goatchain-cli",
3
- "version": "0.0.11-beta.4",
3
+ "version": "0.0.13-beta.0",
4
4
  "description": "dimcode - AI coding agent CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -11,10 +11,10 @@
11
11
  "dist"
12
12
  ],
13
13
  "optionalDependencies": {
14
- "dimcode-darwin-arm64": "0.0.11-beta.4",
15
- "dimcode-darwin-x64": "0.0.11-beta.4",
16
- "dimcode-linux-arm64": "0.0.11-beta.4",
17
- "dimcode-linux-x64": "0.0.11-beta.4",
18
- "dimcode-windows-x64": "0.0.11-beta.4"
14
+ "dimcode-darwin-arm64": "0.0.13-beta.0",
15
+ "dimcode-darwin-x64": "0.0.13-beta.0",
16
+ "dimcode-linux-arm64": "0.0.13-beta.0",
17
+ "dimcode-linux-x64": "0.0.13-beta.0",
18
+ "dimcode-windows-x64": "0.0.13-beta.0"
19
19
  }
20
20
  }