goatchain-cli 0.0.66-beta.1 → 0.0.67-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.
- package/dist/ink.mjs +16 -16
- package/package.json +6 -6
package/dist/ink.mjs
CHANGED
|
@@ -6,12 +6,12 @@ import{createRequire}from"node:module";var __create=Object.create;var{getPrototy
|
|
|
6
6
|
`);return{oldText:crlfOldText,newText:normalizeLineEndings(newText,`\r
|
|
7
7
|
`),matches:countStringMatches(source,crlfOldText)}}function countStringMatches(source,search){if(search.length===0)return source.split(search).length-1;let matches=0,index=0;while(!0){let matchIndex=source.indexOf(search,index);if(matchIndex===-1)return matches;matches+=1,index=matchIndex+search.length}}function usesMostlyCrlfLineEndings(text){let crlfCount=0,loneLfCount=0;for(let index=0;index<text.length;index+=1){if(text[index]!==`
|
|
8
8
|
`)continue;if(index>0&&text[index-1]==="\r")crlfCount+=1;else loneLfCount+=1}return crlfCount>loneLfCount}function normalizeLineEndings(text,lineEnding){return text.replace(/\r?\n/g,lineEnding)}function compileGlob(pattern){let normalized=pattern.replace(/\\/g,"/").replace(/^\.\//,""),expression="^";for(let index=0;index<normalized.length;index+=1){let character=normalized[index],next=normalized[index+1],nextNext=normalized[index+2];if(character==="*"&&next==="*"&&nextNext==="/"){expression+="(?:.*/)?",index+=2;continue}if(character==="*"&&next==="*"){expression+=".*",index+=1;continue}if(character==="*"){expression+="[^/]*";continue}expression+=/[.+^${}()|[\]\\]/.test(character)?`\\${character}`:character}return expression+="$",new RegExp(expression)}async function withPathMutationLock(filePath,action){let waitForPrevious=pathMutationLocks.get(filePath)?.catch(()=>{return})??Promise.resolve(),releaseCurrent,currentGate=new Promise((resolve)=>{releaseCurrent=resolve}),currentTail=waitForPrevious.then(()=>currentGate);pathMutationLocks.set(filePath,currentTail),await waitForPrevious;try{return await action()}finally{if(releaseCurrent(),pathMutationLocks.get(filePath)===currentTail)pathMutationLocks.delete(filePath)}}async function createTextRevisionFromFileIfExists(filePath){return new Promise((resolve,reject)=>{let hash=createHash("sha256"),stream=createReadStream(filePath,{encoding:"utf8",highWaterMark:FILE_REVISION_STREAM_HIGH_WATER_MARK});stream.on("data",(chunk)=>{if(typeof chunk==="string")hash.update(chunk,"utf8");else hash.update(chunk)}),stream.once("error",(error)=>{if(isNodeErrorCode$1(error,"ENOENT"))resolve(void 0);else reject(error)}),stream.once("end",()=>{resolve(hash.digest("hex"))})})}async function writeTextFile(filePath,content){if(content.length<FILE_WRITE_STREAM_MIN_CHARS){await writeFile3(filePath,content,"utf8");return}await writeTextFileInChunks(filePath,content)}async function writeTextFileInChunks(filePath,content){return new Promise((resolve,reject)=>{let stream=createWriteStream(filePath,{encoding:"utf8",highWaterMark:FILE_WRITE_STREAM_HIGH_WATER_MARK}),index=0,settled=!1,rejectOnce=(error)=>{if(settled)return;settled=!0,stream.destroy(),reject(error)},resolveOnce=()=>{if(settled)return;settled=!0,resolve()},writeNext=()=>{if(settled)return;while(index<content.length){let nextIndex=findSafeChunkEnd(content,index),chunk=content.slice(index,nextIndex);if(index=nextIndex,!stream.write(chunk,"utf8")){stream.once("drain",writeNext);return}}stream.end()};stream.once("error",rejectOnce),stream.once("finish",resolveOnce),writeNext()})}function findSafeChunkEnd(content,startIndex){let endIndex=Math.min(startIndex+FILE_WRITE_STREAM_CHARS_PER_CHUNK,content.length);if(endIndex<content.length&&endIndex>startIndex&&isHighSurrogate(content.charCodeAt(endIndex-1))&&isLowSurrogate(content.charCodeAt(endIndex)))endIndex-=1;return endIndex>startIndex?endIndex:Math.min(startIndex+1,content.length)}function isHighSurrogate(value){return value>=55296&&value<=56319}function isLowSurrogate(value){return value>=56320&&value<=57343}function isNodeErrorCode$1(error,code){return typeof error==="object"&&error!==null&&"code"in error&&error.code===code}async function walk(root,current,visit){let entries=await readdir(current,{withFileTypes:!0});for(let entry of entries){if(entry.isDirectory()&&isExcludedDirectoryName(entry.name))continue;let absolutePath=path4.join(current,entry.name),relativePath=path4.relative(root,absolutePath).replace(/\\/g,"/");if(entry.isDirectory()){if(await visit(absolutePath,relativePath)!==!1)await walk(root,absolutePath,visit);continue}await visit(absolutePath,relativePath)}}function baseGlobArgs(){return Array.from(EXCLUDED_DIRECTORY_NAMES).flatMap((directory)=>["-g",`!${directory}`,"-g",`!${directory}/**`])}async function runRipgrep(binary,args,cwd){if(binary===!1)return;return new Promise((resolve)=>{let child=spawn(binary,args,{cwd,stdio:["ignore","pipe","ignore"]}),stdout="";child.stdout.on("data",(chunk)=>{stdout+=String(chunk)}),child.on("error",()=>resolve(void 0)),child.on("close",(exitCode)=>{resolve({stdout,exitCode:exitCode??0})})})}function isExcludedDirectoryName(name){return EXCLUDED_DIRECTORY_NAMES.has(name)}function normalizeSearchLimit(limit){if(limit===void 0||limit===0)return;return normalizeNonNegativeInteger$1(limit,"limit")}function normalizeContextCount(value,key){if(value===void 0)return 0;return normalizeNonNegativeInteger$1(value,key)}function normalizeMaxLineLength(value){if(value===void 0)return DEFAULT_GREP_MAX_LINE_LENGTH;let normalized=normalizeNonNegativeInteger$1(value,"maxLineLength");return normalized===0?Number.MAX_SAFE_INTEGER:normalized}function createSearchDeadline(timeoutMs){return Date.now()+normalizeTimeoutMs$1(timeoutMs)}function normalizeTimeoutMs$1(value){if(value===void 0)return DEFAULT_GREP_TIMEOUT_MS;if(!Number.isFinite(value)||value<=0||!Number.isInteger(value))throw Error("timeoutMs must be a positive integer");return value}function assertSearchDeadline(deadline){if(deadline!==void 0&&Date.now()>=deadline)throw Error("grep search timed out")}function normalizeNonNegativeInteger$1(value,key){if(!Number.isFinite(value)||value<0||!Number.isInteger(value))throw Error(`${key} must be a non-negative integer`);return value}async function sortCandidateFiles(files,sortBy){if(sortBy==="path")return[...files].sort((left,right)=>left.localeCompare(right));return(await Promise.all(files.map(async(filePath)=>{try{return{filePath,mtimeMs:(await stat(filePath)).mtimeMs}}catch{return{filePath,mtimeMs:0}}}))).sort((left,right)=>{if(right.mtimeMs!==left.mtimeMs)return right.mtimeMs-left.mtimeMs;return left.filePath.localeCompare(right.filePath)}).map((entry)=>entry.filePath)}function assertSafeRegexPattern(pattern){if(pattern.length>MAX_GREP_REGEX_PATTERN_LENGTH)throw Error(`Regex patterns longer than ${MAX_GREP_REGEX_PATTERN_LENGTH} characters are not supported`);if(pattern.includes("(?<=")||pattern.includes("(?<!"))throw Error("Regex lookbehind is not supported in grep regex mode");if(/\\(?:[1-9]\d*|k<[^>]+>)/.test(pattern))throw Error("Regex backreferences are not supported in grep regex mode");let groupStack=[],escaped=!1,inCharacterClass=!1;for(let index=0;index<pattern.length;index+=1){let character=pattern[index];if(escaped){escaped=!1;continue}if(character==="\\"){escaped=!0;continue}if(inCharacterClass){if(character==="]")inCharacterClass=!1;continue}if(character==="["){inCharacterClass=!0;continue}if(character==="("){if(groupStack.push({containsAlternation:!1,containsNestedQuantifier:!1,containsWildcard:!1}),groupStack.length>MAX_GREP_REGEX_GROUP_NESTING)throw Error(`Regex group nesting deeper than ${MAX_GREP_REGEX_GROUP_NESTING} is not supported`);if(pattern[index+1]==="?"){let modifier=pattern[index+2];if(modifier==="<"){let lookbehindModifier=pattern[index+3];if(lookbehindModifier==="="||lookbehindModifier==="!")throw Error("Regex lookbehind is not supported in grep regex mode");let nameEnd=pattern.indexOf(">",index+3);if(nameEnd!==-1)index=nameEnd}else if(modifier===":"||modifier==="="||modifier==="!")index+=2}continue}if(character===")"){let group=groupStack.pop();if(!group)continue;let quantifier=readRegexQuantifier(pattern,index+1);if(quantifier!==void 0&&(quantifier.isUnbounded||quantifier.max>MAX_GREP_REGEX_REPEAT_UPPER_BOUND)&&(group.containsAlternation||group.containsNestedQuantifier||group.containsWildcard))throw Error("Regex patterns with repeated groups that contain alternation, wildcards, or nested quantifiers are not supported");let parentGroup=groupStack[groupStack.length-1];if(parentGroup&&(group.containsAlternation||group.containsNestedQuantifier||group.containsWildcard))parentGroup.containsNestedQuantifier=!0;continue}let currentGroup=groupStack[groupStack.length-1];if(!currentGroup)continue;if(character==="|"){currentGroup.containsAlternation=!0;continue}if(character==="."){currentGroup.containsWildcard=!0;continue}if(character==="*"||character==="+"||character==="?"){currentGroup.containsNestedQuantifier=!0;continue}if(character==="{"&&readRegexQuantifier(pattern,index))currentGroup.containsNestedQuantifier=!0}}function readRegexQuantifier(pattern,startIndex){let character=pattern[startIndex];if(character==="*"||character==="+")return{isUnbounded:!0,max:Number.MAX_SAFE_INTEGER};if(character==="?")return{isUnbounded:!1,max:1};if(character!=="{")return;let index=startIndex+1,minimumText="";while(index<pattern.length&&/\d/.test(pattern[index]??""))minimumText+=pattern[index],index+=1;if(minimumText.length===0)return;if(pattern[index]==="}")return{isUnbounded:!1,max:Number.parseInt(minimumText,10)};if(pattern[index]!==",")return;index+=1;let maximumText="";while(index<pattern.length&&/\d/.test(pattern[index]??""))maximumText+=pattern[index],index+=1;if(pattern[index]!=="}")return;if(maximumText.length===0)return{isUnbounded:!0,max:Number.MAX_SAFE_INTEGER};return{isUnbounded:!1,max:Number.parseInt(maximumText,10)}}function findLineMatches(text,filePath,pattern,options){let lines=splitLines(text),matches=[],matcher=createLineMatcher(pattern,options.fixedStrings,options.ignoreCase);for(let index=0;index<lines.length;index+=1){if(index%64===0)assertSearchDeadline(options.deadline);if(options.limit!==void 0&&matches.length>=options.limit)break;let line=lines[index];if(!options.fixedStrings&&line.length>MAX_GREP_REGEX_LINE_INPUT_LENGTH)continue;if(!matcher(line))continue;let preview=createPreviewText(line,options.maxLineLength);matches.push({path:filePath,lineNumber:index+1,line:preview.text,truncated:preview.truncated,beforeContext:buildContextLines(lines,index-options.beforeContext,index,options.maxLineLength),afterContext:buildContextLines(lines,index+1,index+1+options.afterContext,options.maxLineLength)})}return matches}function findMultilineMatches(text,filePath,pattern,options){if(assertSearchDeadline(options.deadline),!options.fixedStrings&&text.length>MAX_GREP_REGEX_MULTILINE_INPUT_LENGTH)return[];let regex=createMultilineMatcher(pattern,options.fixedStrings,options.ignoreCase),lines=splitLines(text),lineStarts=createLineStartOffsets(text),matches=[];while(!0){if(assertSearchDeadline(options.deadline),options.limit!==void 0&&matches.length>=options.limit)break;let match=regex.exec(text);if(!match)break;let startIndex=match.index,endIndex=startIndex+match[0].length,lineNumber=findLineNumber(lineStarts,startIndex),endLineNumber=findLineNumber(lineStarts,Math.max(startIndex,endIndex-1)),preview=createPreviewText(match[0],options.maxLineLength);if(matches.push({path:filePath,lineNumber,endLineNumber,line:preview.text,truncated:preview.truncated,beforeContext:buildContextLines(lines,lineNumber-1-options.beforeContext,lineNumber-1,options.maxLineLength),afterContext:buildContextLines(lines,endLineNumber,endLineNumber+options.afterContext,options.maxLineLength)}),match[0].length===0)regex.lastIndex=startIndex+1}return matches}function splitLines(text){return text.split(/\r?\n/g)}function createLineMatcher(pattern,fixedStrings,ignoreCase){if(fixedStrings){let needle=ignoreCase?pattern.toLocaleLowerCase():pattern;return(line)=>{return(ignoreCase?line.toLocaleLowerCase():line).includes(needle)}}let regex=new RegExp(pattern,ignoreCase?"i":"");return(line)=>{return regex.lastIndex=0,regex.test(line)}}function createMultilineMatcher(pattern,fixedStrings,ignoreCase){let source=fixedStrings?escapeRegex(pattern):pattern;return new RegExp(source,`${ignoreCase?"i":""}gms`)}function buildContextLines(lines,startIndex,endIndexExclusive,maxLineLength){let result=[],start=Math.max(0,startIndex),end=Math.min(lines.length,endIndexExclusive);for(let index=start;index<end;index+=1){let preview=createPreviewText(lines[index]??"",maxLineLength);result.push({lineNumber:index+1,line:preview.text})}return result.length>0?result:void 0}function createPreviewText(value,maxLineLength){let normalized=value.replace(/\r/g,"").replace(/\n/g,"\\n");if(normalized.length<=maxLineLength)return{text:normalized,truncated:!1};return{text:`${normalized.slice(0,maxLineLength)}...`,truncated:!0}}function createLineStartOffsets(text){let offsets=[0];for(let index=0;index<text.length;index+=1)if(text[index]===`
|
|
9
|
-
`)offsets.push(index+1);return offsets}function findLineNumber(offsets,index){let low=0,high=offsets.length-1;while(low<=high){let mid=Math.floor((low+high)/2);if(offsets[mid]<=index)low=mid+1;else high=mid-1}return high+1}function escapeRegex(value){return value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function isProbablyBinaryText(text){return text.includes("\x00")}function normalizeStateStoreListOptions(options={}){return{cursor:options.cursor,limit:normalizeLimit(options.limit)}}function applyStateStoreListPagination(items,options){let start=resolveCursorStart(items,options.cursor),page=items.slice(start,start+options.limit),hasNext=start+options.limit<items.length,last=page.at(-1);return{page,nextCursor:hasNext&&last?last.sessionId:void 0}}function resolveCursorStart(items,cursor){if(cursor===void 0)return 0;let index=items.findIndex((item)=>item.sessionId===cursor);if(index===-1)throw Error(`Invalid state store list cursor: ${cursor}`);return index+1}function normalizeLimit(limit){if(limit===void 0||!Number.isFinite(limit))return DEFAULT_STATE_STORE_LIST_LIMIT;return Math.max(1,Math.min(MAX_STATE_STORE_LIST_LIMIT,Math.floor(limit)))}function isSnapshotFileName(fileName){return fileName.endsWith(".json")&&!fileName.endsWith(".usage.json")}function decodeSessionIdFromFileName(fileName){let encoded=fileName.slice(0,-5);try{return decodeURIComponent(encoded)}catch{return encoded}}function compareSnapshotFileEntries(left,right){return right.modifiedAt-left.modifiedAt||left.sessionId.localeCompare(right.sessionId)}function hydrateSnapshot$1(snapshot,usageLedger){if(!usageLedger)return sessionSnapshotCodec.decode(snapshot);return sessionSnapshotCodec.decode({...snapshot,usage:{...usageLedger.summary.totalUsage},usageLedger})}function validateSaveUsageLedger$1(snapshot,usageLedger){if(usageLedger.summary.sessionId!==snapshot.sessionId)throw TypeError("State store usage ledger sessionId must match snapshot sessionId");return structuredClone(usageLedger)}function compareSnapshotEntries(left,right){return right.modifiedAt-left.modifiedAt||left.sessionId.localeCompare(right.sessionId)}function hydrateSnapshot(snapshot,usageLedger){if(!usageLedger)return sessionSnapshotCodec.decode(snapshot);return sessionSnapshotCodec.decode({...snapshot,usage:{...usageLedger.summary.totalUsage},usageLedger})}function validateSaveUsageLedger(snapshot,usageLedger){if(usageLedger.summary.sessionId!==snapshot.sessionId)throw TypeError("State store usage ledger sessionId must match snapshot sessionId");return structuredClone(usageLedger)}function describeStateStore(stateStore){if(!stateStore)return{kind:"none"};if(stateStore instanceof FileStateStore)return{kind:"file",path:stateStore.directory};if(stateStore instanceof InMemoryStateStore)return{kind:"memory"};return{kind:"custom"}}function createLoggerGateway(handler,context){return new DefaultLoggerGateway({handler,context})}function bindLoggerContext(logger,context){if(logger instanceof DefaultLoggerGateway)return logger.withContext(context);return logger}function cloneLogEntry(entry){return{...entry,metadata:entry.metadata?{...entry.metadata}:void 0}}function cloneLogContext(context){if(!context)return{};return{...context,metadata:context.metadata?{...context.metadata}:void 0}}function mergeLogContext(base,next){let metadata=base.metadata||next.metadata?{...base.metadata??{},...next.metadata??{}}:void 0;return{...base,...next,metadata}}function isPromiseLike(value){return typeof value==="object"&&value!==null&&"then"in value&&typeof value.then==="function"}function normalizePermissions(input){return{...fullPermissions,...input}}function canReadFs(permissions){return permissions.fs===!0||permissions.fs==="read"||permissions.fs==="full"}function canWriteFs(permissions){return permissions.fs===!0||permissions.fs==="write"||permissions.fs==="full"}function intersectPermissions(agent,requested){let normalized=requested??{};return{fs:intersectFs(agent.fs,normalized.fs??!1),git:agent.git===!0&&normalized.git===!0,network:agent.network===!0&&normalized.network===!0,process:agent.process===!0&&normalized.process===!0,model:agent.model===!0&&normalized.model===!0}}function intersectFs(left,right){let rank=new Map([[!1,0],["read",1],["write",1],[!0,2],["full",2]]),leftValue=left??!1,rightValue=right??!1;if(leftValue==="full"||leftValue===!0)return rightValue;if(rightValue==="full"||rightValue===!0)return leftValue;if(leftValue===rightValue)return leftValue;if(rank.get(leftValue)===0||rank.get(rightValue)===0)return!1;if(leftValue==="read"&&rightValue==="write"||leftValue==="write"&&rightValue==="read")return!1;return leftValue}function isStringArray(value){return Array.isArray(value)&&value.every((item)=>typeof item==="string")}function createToolSchema(schema2){if(!isSchemaObjectCandidate(schema2)||schema2.type!=="object")throw TypeError('Tool input schema must have type "object"');let properties=schema2.properties;if(properties!==void 0&&!isSchemaObjectCandidate(properties))throw TypeError("Tool input schema properties must be an object");let required=schema2.required;if(required!==void 0&&!isStringArray(required))throw TypeError("Tool input schema required must be a string array");return{...schema2,type:"object",properties:properties?cloneSchemaRecord(properties):{}}}function createToolDefinition(definition){if(definition.providerOptions!==void 0&&!isProviderOptionsBag(definition.providerOptions))throw TypeError("Tool providerOptions must be a provider options bag");if(definition.maxResultSizeChars!==void 0&&definition.maxResultSizeChars!==1/0&&(!Number.isFinite(definition.maxResultSizeChars)||definition.maxResultSizeChars<0))throw TypeError("Tool maxResultSizeChars must be a non-negative number or Infinity");let normalized={...definition,name:definition.name.trim(),description:definition.description.trim(),inputSchema:createToolSchema(definition.inputSchema),providerOptions:cloneProviderOptions(definition.providerOptions)};if(definition.maxResultSizeChars!==void 0)normalized.maxResultSizeChars=definition.maxResultSizeChars;return normalized}function cloneSchemaRecord(record){if(!record)return{};return Object.fromEntries(Object.entries(record).map(([key,value])=>{if(!isSchemaObjectCandidate(value))throw TypeError(`Tool schema property ${key} must be an object`);return[key,{...value}]}))}function createToolResult(result){let normalized={content:normalizeContent(result.content),isError:result.isError===!0};if(result.structuredContent!==void 0)assertJsonSafeObject(result.structuredContent,"Tool structuredContent"),normalized.structuredContent=structuredClone(result.structuredContent);if(result.contextMessages!==void 0)normalized.contextMessages=result.contextMessages.map((message,index)=>{if(message.role!=="user")throw TypeError(`Tool contextMessages[${index}] must be a synthetic user message`);if(message.metadata!==void 0&&!isSchemaObjectCandidate(message.metadata))throw TypeError(`Tool contextMessages[${index}] metadata must be an object`);if(message.providerOptions!==void 0&&!isProviderOptionsBag(message.providerOptions))throw TypeError(`Tool contextMessages[${index}] providerOptions must be a provider options bag`);return{role:"user",content:normalizeContent(message.content),metadata:message.metadata?structuredClone(message.metadata):void 0,providerOptions:cloneProviderOptions(message.providerOptions)}});return normalized}function isSchemaObjectCandidate(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function textToolResult(text){return{content:normalizeContent(text)}}function rememberSessionFileText(sessionId,resolvedPath,text){let revision=createTextRevision(text);return rememberSessionFileRevision(sessionId,resolvedPath,revision),revision}function rememberSessionFileRevision(sessionId,resolvedPath,revision){let tracked=sessionFileRevisions.get(sessionId);if(tracked)tracked.set(resolvedPath,revision);else sessionFileRevisions.set(sessionId,new Map([[resolvedPath,revision]]));return revision}function getSessionFileRevision(sessionId,resolvedPath){return sessionFileRevisions.get(sessionId)?.get(resolvedPath)}function forgetSessionFileRevision(sessionId,resolvedPath){let tracked=sessionFileRevisions.get(sessionId);if(!tracked)return;if(tracked.delete(resolvedPath),tracked.size===0)sessionFileRevisions.delete(sessionId)}function clearSessionFileRevisions(sessionId){sessionFileRevisions.delete(sessionId)}function resolveTrackedPath(fileSystem,cwd,targetPath){return resolveFileSystemPath(fileSystem&&"cwd"in fileSystem&&typeof fileSystem.cwd==="string"?fileSystem.cwd:void 0,targetPath,cwd)}function readAliasedStringArg(args,keys,options={}){let primaryKey=keys[0]??"value";for(let key of keys){let value=readArgumentValue(args,key);if(value===void 0)continue;if(typeof value!=="string")throw Error(`${primaryKey} must be a string`);if(!options.allowEmpty&&value.length===0)throw Error(`${primaryKey} must be a non-empty string`);return value}throw Error(`${primaryKey} must be ${options.allowEmpty?"a string":"a non-empty string"}`)}function readOptionalBooleanArg(args,key){let value=readArgumentValue(args,key);if(value===void 0)return;if(typeof value!=="boolean")throw Error(`${key} must be a boolean`);return value}function readAliasedOptionalBooleanArg(args,keys){let primaryKey=keys[0]??"value";for(let key of keys){let value=readArgumentValue(args,key);if(value===void 0)continue;if(typeof value!=="boolean")throw Error(`${primaryKey} must be a boolean`);return value}}function createMissingFileToolResult(targetPath,fileSystem,cwd,action){return createToolResult({content:[{type:"text",text:`File not found: ${targetPath}. Use glob or grep to discover the correct path before ${action==="read"?"reading":"editing"}.`}],structuredContent:{code:"ENOENT",path:resolveTrackedPath(fileSystem,cwd,targetPath)},isError:!0})}function readArgumentValue(args,key){return args[key]}function isNodeErrorCode(error,code){return typeof error==="object"&&error!==null&&"code"in error&&error.code===code}function isFileModifiedSinceReadError$1(error){return typeof error==="object"&&error!==null&&"code"in error&&error.code==="file_modified_since_read"&&"message"in error&&typeof error.message==="string"}function isEditTargetFileTooLargeError(error){return typeof error==="object"&&error!==null&&"code"in error&&error.code==="edit_target_file_too_large"&&"bytes"in error&&typeof error.bytes==="number"&&"limit"in error&&typeof error.limit==="number"&&"message"in error&&typeof error.message==="string"}function createExecOutputStoreRecord(input){let rootDir=input.rootDir??path4.join(os2.tmpdir(),"dim-agent-sdk"),sessionDirectoryName=encodeURIComponent(input.sessionId),outputDirectory=path4.join(rootDir,"sessions",sessionDirectoryName,"tool-results");fs.mkdirSync(outputDirectory,{recursive:!0});let outputPath=path4.join(outputDirectory,`${input.processId}-${randomUUID()}.txt`);return fs.writeFileSync(outputPath,""),{outputPath,outputBytes:0,outputTruncated:!1}}function appendExecOutput(record,chunk){if(chunk.length===0||record.outputTruncated)return;let bytes=Buffer.from(chunk,"utf8"),remainingBytes=MAX_EXEC_OUTPUT_FILE_BYTES-record.outputBytes;if(remainingBytes<=0){record.outputTruncated=!0;return}let chunkToWrite=bytes.byteLength<=remainingBytes?bytes:bytes.subarray(0,remainingBytes);if(chunkToWrite.byteLength>0)fs.appendFileSync(record.outputPath,chunkToWrite),record.outputBytes+=chunkToWrite.byteLength;if(bytes.byteLength>remainingBytes)record.outputTruncated=!0}function readExecOutputSince(record,offset){let fd=fs.openSync(record.outputPath,"r");try{let stats=fs.fstatSync(fd),boundedOffset=Math.min(Math.max(0,offset),stats.size),chunks=[],position=boundedOffset,remainingBytes=stats.size-boundedOffset;while(remainingBytes>0){let buffer=Buffer.allocUnsafe(Math.min(65536,remainingBytes)),bytesRead=fs.readSync(fd,buffer,0,buffer.byteLength,position);if(bytesRead<=0)break;chunks.push(bytesRead===buffer.byteLength?buffer:buffer.subarray(0,bytesRead)),position+=bytesRead,remainingBytes-=bytesRead}return{text:Buffer.concat(chunks).toString("utf8"),nextOffset:position}}finally{fs.closeSync(fd)}}function attachChildListeners(entry){entry.child.stdout.setEncoding("utf8"),entry.child.stderr.setEncoding("utf8"),entry.child.stdout.on("data",(chunk)=>{appendExecOutput(entry,String(chunk)),notifyWaiters(entry)}),entry.child.stderr.on("data",(chunk)=>{appendExecOutput(entry,String(chunk)),notifyWaiters(entry)}),entry.child.on("error",(error)=>{if(appendExecOutput(entry,`${entry.outputBytes>0?`
|
|
10
|
-
`:""}${error.message}`),!entry.terminal)entry.terminal=createTerminalState({status:entry.timedOut?"terminated":"exited"});builtinExecProcessManager.completeTerminalEntry(entry),notifyWaiters(entry)}),entry.child.on("close",(code,signal)=>{if(!entry.terminal)entry.terminal=createTerminalState({exitCode:readChildExitCode(code??void 0),signal:readChildSignal(signal??void 0),status:signal?"terminated":"exited"});else if(entry.terminal.signal===void 0&&signal)entry.terminal={...entry.terminal,signal,status:"terminated"};clearTimeout(entry.timeoutHandle),clearTimeout(entry.terminateHandle),builtinExecProcessManager.completeTerminalEntry(entry),notifyWaiters(entry)})}function createTaskNotification(entry){let status=createTaskNotificationStatus(entry),exitCode=entry.terminal?.exitCode,signal=entry.terminal?.signal,summary=createTaskNotificationSummary(entry,status),notification={taskId:entry.
|
|
9
|
+
`)offsets.push(index+1);return offsets}function findLineNumber(offsets,index){let low=0,high=offsets.length-1;while(low<=high){let mid=Math.floor((low+high)/2);if(offsets[mid]<=index)low=mid+1;else high=mid-1}return high+1}function escapeRegex(value){return value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function isProbablyBinaryText(text){return text.includes("\x00")}function normalizeStateStoreListOptions(options={}){return{cursor:options.cursor,limit:normalizeLimit(options.limit)}}function applyStateStoreListPagination(items,options){let start=resolveCursorStart(items,options.cursor),page=items.slice(start,start+options.limit),hasNext=start+options.limit<items.length,last=page.at(-1);return{page,nextCursor:hasNext&&last?last.sessionId:void 0}}function resolveCursorStart(items,cursor){if(cursor===void 0)return 0;let index=items.findIndex((item)=>item.sessionId===cursor);if(index===-1)throw Error(`Invalid state store list cursor: ${cursor}`);return index+1}function normalizeLimit(limit){if(limit===void 0||!Number.isFinite(limit))return DEFAULT_STATE_STORE_LIST_LIMIT;return Math.max(1,Math.min(MAX_STATE_STORE_LIST_LIMIT,Math.floor(limit)))}function isSnapshotFileName(fileName){return fileName.endsWith(".json")&&!fileName.endsWith(".usage.json")}function decodeSessionIdFromFileName(fileName){let encoded=fileName.slice(0,-5);try{return decodeURIComponent(encoded)}catch{return encoded}}function compareSnapshotFileEntries(left,right){return right.modifiedAt-left.modifiedAt||left.sessionId.localeCompare(right.sessionId)}function hydrateSnapshot$1(snapshot,usageLedger){if(!usageLedger)return sessionSnapshotCodec.decode(snapshot);return sessionSnapshotCodec.decode({...snapshot,usage:{...usageLedger.summary.totalUsage},usageLedger})}function validateSaveUsageLedger$1(snapshot,usageLedger){if(usageLedger.summary.sessionId!==snapshot.sessionId)throw TypeError("State store usage ledger sessionId must match snapshot sessionId");return structuredClone(usageLedger)}function compareSnapshotEntries(left,right){return right.modifiedAt-left.modifiedAt||left.sessionId.localeCompare(right.sessionId)}function hydrateSnapshot(snapshot,usageLedger){if(!usageLedger)return sessionSnapshotCodec.decode(snapshot);return sessionSnapshotCodec.decode({...snapshot,usage:{...usageLedger.summary.totalUsage},usageLedger})}function validateSaveUsageLedger(snapshot,usageLedger){if(usageLedger.summary.sessionId!==snapshot.sessionId)throw TypeError("State store usage ledger sessionId must match snapshot sessionId");return structuredClone(usageLedger)}function describeStateStore(stateStore){if(!stateStore)return{kind:"none"};if(stateStore instanceof FileStateStore)return{kind:"file",path:stateStore.directory};if(stateStore instanceof InMemoryStateStore)return{kind:"memory"};return{kind:"custom"}}function createLoggerGateway(handler,context){return new DefaultLoggerGateway({handler,context})}function bindLoggerContext(logger,context){if(logger instanceof DefaultLoggerGateway)return logger.withContext(context);return logger}function cloneLogEntry(entry){return{...entry,metadata:entry.metadata?{...entry.metadata}:void 0}}function cloneLogContext(context){if(!context)return{};return{...context,metadata:context.metadata?{...context.metadata}:void 0}}function mergeLogContext(base,next){let metadata=base.metadata||next.metadata?{...base.metadata??{},...next.metadata??{}}:void 0;return{...base,...next,metadata}}function isPromiseLike(value){return typeof value==="object"&&value!==null&&"then"in value&&typeof value.then==="function"}function normalizePermissions(input){return{...fullPermissions,...input}}function canReadFs(permissions){return permissions.fs===!0||permissions.fs==="read"||permissions.fs==="full"}function canWriteFs(permissions){return permissions.fs===!0||permissions.fs==="write"||permissions.fs==="full"}function intersectPermissions(agent,requested){let normalized=requested??{};return{fs:intersectFs(agent.fs,normalized.fs??!1),git:agent.git===!0&&normalized.git===!0,network:agent.network===!0&&normalized.network===!0,process:agent.process===!0&&normalized.process===!0,model:agent.model===!0&&normalized.model===!0}}function intersectFs(left,right){let rank=new Map([[!1,0],["read",1],["write",1],[!0,2],["full",2]]),leftValue=left??!1,rightValue=right??!1;if(leftValue==="full"||leftValue===!0)return rightValue;if(rightValue==="full"||rightValue===!0)return leftValue;if(leftValue===rightValue)return leftValue;if(rank.get(leftValue)===0||rank.get(rightValue)===0)return!1;if(leftValue==="read"&&rightValue==="write"||leftValue==="write"&&rightValue==="read")return!1;return leftValue}function isStringArray(value){return Array.isArray(value)&&value.every((item)=>typeof item==="string")}function createToolSchema(schema2){if(!isSchemaObjectCandidate(schema2)||schema2.type!=="object")throw TypeError('Tool input schema must have type "object"');let properties=schema2.properties;if(properties!==void 0&&!isSchemaObjectCandidate(properties))throw TypeError("Tool input schema properties must be an object");let required=schema2.required;if(required!==void 0&&!isStringArray(required))throw TypeError("Tool input schema required must be a string array");return{...schema2,type:"object",properties:properties?cloneSchemaRecord(properties):{}}}function createToolDefinition(definition){if(definition.providerOptions!==void 0&&!isProviderOptionsBag(definition.providerOptions))throw TypeError("Tool providerOptions must be a provider options bag");if(definition.maxResultSizeChars!==void 0&&definition.maxResultSizeChars!==1/0&&(!Number.isFinite(definition.maxResultSizeChars)||definition.maxResultSizeChars<0))throw TypeError("Tool maxResultSizeChars must be a non-negative number or Infinity");let normalized={...definition,name:definition.name.trim(),description:definition.description.trim(),inputSchema:createToolSchema(definition.inputSchema),providerOptions:cloneProviderOptions(definition.providerOptions)};if(definition.maxResultSizeChars!==void 0)normalized.maxResultSizeChars=definition.maxResultSizeChars;return normalized}function cloneSchemaRecord(record){if(!record)return{};return Object.fromEntries(Object.entries(record).map(([key,value])=>{if(!isSchemaObjectCandidate(value))throw TypeError(`Tool schema property ${key} must be an object`);return[key,{...value}]}))}function createToolResult(result){let normalized={content:normalizeContent(result.content),isError:result.isError===!0};if(result.structuredContent!==void 0)assertJsonSafeObject(result.structuredContent,"Tool structuredContent"),normalized.structuredContent=structuredClone(result.structuredContent);if(result.contextMessages!==void 0)normalized.contextMessages=result.contextMessages.map((message,index)=>{if(message.role!=="user")throw TypeError(`Tool contextMessages[${index}] must be a synthetic user message`);if(message.metadata!==void 0&&!isSchemaObjectCandidate(message.metadata))throw TypeError(`Tool contextMessages[${index}] metadata must be an object`);if(message.providerOptions!==void 0&&!isProviderOptionsBag(message.providerOptions))throw TypeError(`Tool contextMessages[${index}] providerOptions must be a provider options bag`);return{role:"user",content:normalizeContent(message.content),metadata:message.metadata?structuredClone(message.metadata):void 0,providerOptions:cloneProviderOptions(message.providerOptions)}});return normalized}function isSchemaObjectCandidate(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function textToolResult(text){return{content:normalizeContent(text)}}function rememberSessionFileText(sessionId,resolvedPath,text){let revision=createTextRevision(text);return rememberSessionFileRevision(sessionId,resolvedPath,revision),revision}function rememberSessionFileRevision(sessionId,resolvedPath,revision){let tracked=sessionFileRevisions.get(sessionId);if(tracked)tracked.set(resolvedPath,revision);else sessionFileRevisions.set(sessionId,new Map([[resolvedPath,revision]]));return revision}function getSessionFileRevision(sessionId,resolvedPath){return sessionFileRevisions.get(sessionId)?.get(resolvedPath)}function forgetSessionFileRevision(sessionId,resolvedPath){let tracked=sessionFileRevisions.get(sessionId);if(!tracked)return;if(tracked.delete(resolvedPath),tracked.size===0)sessionFileRevisions.delete(sessionId)}function clearSessionFileRevisions(sessionId){sessionFileRevisions.delete(sessionId)}function resolveTrackedPath(fileSystem,cwd,targetPath){return resolveFileSystemPath(fileSystem&&"cwd"in fileSystem&&typeof fileSystem.cwd==="string"?fileSystem.cwd:void 0,targetPath,cwd)}function readAliasedStringArg(args,keys,options={}){let primaryKey=keys[0]??"value";for(let key of keys){let value=readArgumentValue(args,key);if(value===void 0)continue;if(typeof value!=="string")throw Error(`${primaryKey} must be a string`);if(!options.allowEmpty&&value.length===0)throw Error(`${primaryKey} must be a non-empty string`);return value}throw Error(`${primaryKey} must be ${options.allowEmpty?"a string":"a non-empty string"}`)}function readOptionalBooleanArg(args,key){let value=readArgumentValue(args,key);if(value===void 0)return;if(typeof value!=="boolean")throw Error(`${key} must be a boolean`);return value}function readAliasedOptionalBooleanArg(args,keys){let primaryKey=keys[0]??"value";for(let key of keys){let value=readArgumentValue(args,key);if(value===void 0)continue;if(typeof value!=="boolean")throw Error(`${primaryKey} must be a boolean`);return value}}function createMissingFileToolResult(targetPath,fileSystem,cwd,action){return createToolResult({content:[{type:"text",text:`File not found: ${targetPath}. Use glob or grep to discover the correct path before ${action==="read"?"reading":"editing"}.`}],structuredContent:{code:"ENOENT",path:resolveTrackedPath(fileSystem,cwd,targetPath)},isError:!0})}function readArgumentValue(args,key){return args[key]}function isNodeErrorCode(error,code){return typeof error==="object"&&error!==null&&"code"in error&&error.code===code}function isFileModifiedSinceReadError$1(error){return typeof error==="object"&&error!==null&&"code"in error&&error.code==="file_modified_since_read"&&"message"in error&&typeof error.message==="string"}function isEditTargetFileTooLargeError(error){return typeof error==="object"&&error!==null&&"code"in error&&error.code==="edit_target_file_too_large"&&"bytes"in error&&typeof error.bytes==="number"&&"limit"in error&&typeof error.limit==="number"&&"message"in error&&typeof error.message==="string"}function createExecOutputStoreRecord(input){let rootDir=input.rootDir??path4.join(os2.tmpdir(),"dim-agent-sdk"),sessionDirectoryName=encodeURIComponent(input.sessionId),outputDirectory=path4.join(rootDir,"sessions",sessionDirectoryName,"tool-results");fs.mkdirSync(outputDirectory,{recursive:!0});let outputPath=path4.join(outputDirectory,`${input.taskId}-${randomUUID()}.txt`);return fs.writeFileSync(outputPath,""),{outputPath,outputBytes:0,outputTruncated:!1}}function appendExecOutput(record,chunk){if(chunk.length===0||record.outputTruncated)return;let bytes=Buffer.from(chunk,"utf8"),remainingBytes=MAX_EXEC_OUTPUT_FILE_BYTES-record.outputBytes;if(remainingBytes<=0){record.outputTruncated=!0;return}let chunkToWrite=bytes.byteLength<=remainingBytes?bytes:bytes.subarray(0,remainingBytes);if(chunkToWrite.byteLength>0)fs.appendFileSync(record.outputPath,chunkToWrite),record.outputBytes+=chunkToWrite.byteLength;if(bytes.byteLength>remainingBytes)record.outputTruncated=!0}function readExecOutputSince(record,offset){let fd=fs.openSync(record.outputPath,"r");try{let stats=fs.fstatSync(fd),boundedOffset=Math.min(Math.max(0,offset),stats.size),chunks=[],position=boundedOffset,remainingBytes=stats.size-boundedOffset;while(remainingBytes>0){let buffer=Buffer.allocUnsafe(Math.min(65536,remainingBytes)),bytesRead=fs.readSync(fd,buffer,0,buffer.byteLength,position);if(bytesRead<=0)break;chunks.push(bytesRead===buffer.byteLength?buffer:buffer.subarray(0,bytesRead)),position+=bytesRead,remainingBytes-=bytesRead}return{text:Buffer.concat(chunks).toString("utf8"),nextOffset:position}}finally{fs.closeSync(fd)}}function attachChildListeners(entry){entry.child.stdout.setEncoding("utf8"),entry.child.stderr.setEncoding("utf8"),entry.child.stdout.on("data",(chunk)=>{appendExecOutput(entry,String(chunk)),notifyWaiters(entry)}),entry.child.stderr.on("data",(chunk)=>{appendExecOutput(entry,String(chunk)),notifyWaiters(entry)}),entry.child.on("error",(error)=>{if(appendExecOutput(entry,`${entry.outputBytes>0?`
|
|
10
|
+
`:""}${error.message}`),!entry.terminal)entry.terminal=createTerminalState({status:entry.timedOut?"terminated":"exited"});builtinExecProcessManager.completeTerminalEntry(entry),notifyWaiters(entry)}),entry.child.on("close",(code,signal)=>{if(!entry.terminal)entry.terminal=createTerminalState({exitCode:readChildExitCode(code??void 0),signal:readChildSignal(signal??void 0),status:signal?"terminated":"exited"});else if(entry.terminal.signal===void 0&&signal)entry.terminal={...entry.terminal,signal,status:"terminated"};clearTimeout(entry.timeoutHandle),clearTimeout(entry.terminateHandle),builtinExecProcessManager.completeTerminalEntry(entry),notifyWaiters(entry)})}function createTaskNotification(entry){let status=createTaskNotificationStatus(entry),exitCode=entry.terminal?.exitCode,signal=entry.terminal?.signal,summary=createTaskNotificationSummary(entry,status),notification={taskId:entry.taskId,status,outputPath:entry.outputPath,summary};if(exitCode!==void 0)notification.exitCode=exitCode;if(signal!==void 0)notification.signal=signal;return notification}function createTaskNotificationStatus(entry){if(entry.timedOut)return"timed_out";if(entry.terminationReason==="user"||entry.terminationReason==="dispose")return"killed";if(entry.terminal?.status==="terminated")return"killed";return(entry.terminal?.exitCode??0)===0?"completed":"failed"}function createTaskNotificationSummary(entry,status){let command=entry.command.join(" ");if(status==="completed")return`Exec task ${entry.taskId} completed: ${command}`;if(status==="failed")return`Exec task ${entry.taskId} failed with exit code ${entry.terminal?.exitCode??-1}: ${command}`;if(status==="timed_out")return`Exec task ${entry.taskId} timed out${entry.timeoutMs?` after ${entry.timeoutMs} ms`:""}: ${command}`;return`Exec task ${entry.taskId} was killed${entry.terminal?.signal?` by ${entry.terminal.signal}`:""}: ${command}`}function createProcessResult(entry,output,wallTimeMs){return{chunkId:createId("chunk"),command:[...entry.command],cwd:entry.cwd,output,outputPath:entry.outputPath,outputBytes:entry.outputBytes,outputTruncated:entry.outputTruncated,taskId:entry.taskId,exitCode:entry.terminal?.exitCode,signal:entry.terminal?.signal,timedOut:entry.timedOut||void 0,timeoutMs:entry.timeoutMs,wallTimeMs,status:entry.terminal?.status??"running"}}function requestTerminate(entry){if(readChildExitCode(entry.child.exitCode??void 0)!==void 0)return;entry.child.kill("SIGTERM"),clearTimeout(entry.terminateHandle),entry.terminateHandle=setTimeout(()=>{if(readChildExitCode(entry.child.exitCode??void 0)===void 0)entry.child.kill("SIGKILL")},TERMINATE_GRACE_TIMEOUT_MS)}function createTerminalState(input){let state={status:input.status};if(input.exitCode!==void 0)state.exitCode=input.exitCode;if(input.signal)state.signal=input.signal;return state}function readChildExitCode(code){return code}function readChildSignal(signal){return signal}function waitForChange(entry,deadline,signal){return new Promise((resolve,reject)=>{if(signal?.aborted){reject(createAbortError());return}let timeoutHandle,finalize=(error)=>{if(timeoutHandle)clearTimeout(timeoutHandle);if(entry.waiters.delete(onChange),signal?.removeEventListener("abort",onAbort),error)reject(error);else resolve()},onChange=()=>finalize(),onAbort=()=>finalize(createAbortError());entry.waiters.add(onChange),signal?.addEventListener("abort",onAbort,{once:!0});let remaining=Math.max(0,deadline-Date.now());timeoutHandle=setTimeout(()=>finalize(),remaining)})}function waitForExit(entry,deadline){if(entry.terminal)return Promise.resolve();return waitForChange(entry,deadline,void 0).then(async()=>{if(entry.terminal)return;if(Date.now()>=deadline)return;await waitForExit(entry,deadline)})}function notifyWaiters(entry){let waiters=[...entry.waiters];entry.waiters.clear();for(let waiter of waiters)waiter()}function assertCommand(command){if(!Array.isArray(command))throw new ExecProcessManagerError("exec_invalid_request","exec start requires command to be a non-empty string array.");if(command.length===0)throw new ExecProcessManagerError("exec_invalid_request","exec start requires command to be a non-empty string array.");if(command.some((part)=>typeof part!=="string"))throw new ExecProcessManagerError("exec_invalid_request","exec command entries must all be strings.");if(command[0]?.trim().length===0)throw new ExecProcessManagerError("exec_invalid_request","exec command[0] must be a non-empty string.");return[...command]}function assertTaskId(taskId){if(typeof taskId!=="number"||!Number.isInteger(taskId)||taskId<=0)throw new ExecProcessManagerError("exec_invalid_request","exec taskId must be a positive integer.");return taskId}function normalizeWaitTimeMs(value){if(value===void 0)return DEFAULT_WAIT_TIME_MS;if(!Number.isInteger(value)||value<1||value>MAX_WAIT_TIME_MS)throw new ExecProcessManagerError("exec_invalid_request",`exec waitTimeMs must be an integer between 1 and ${MAX_WAIT_TIME_MS}.`);return value}function normalizeTimeoutMs(value){if(value===void 0)return;if(!Number.isInteger(value)||value<=0)throw new ExecProcessManagerError("exec_invalid_request","exec timeoutMs must be a positive integer.");return value}function allocateTaskId(entries){for(let attempts=0;attempts<100;attempts+=1){let candidate=randomInt(1000,100001);if(!entries.has(candidate))return candidate}throw new ExecProcessManagerError("exec_process_limit_exceeded","Could not allocate a unique exec process id for this session.")}function countActiveEntries(entries){let count=0;for(let entry of entries.values())if(!entry.terminal)count+=1;return count}function createAbortError(){let error=Error("The exec tool call was aborted.");return error.name="AbortError",error}async function executeBuiltinExecProcess(request){return await builtinExecProcessManager.execute(request)}async function disposeBuiltinExecSession(sessionId){await builtinExecProcessManager.disposeSession(sessionId)}function drainBuiltinExecTaskNotifications(sessionId){return builtinExecProcessManager.drainNotifications(sessionId)}function renderExecOutput(input){let output=formatCollectedProcessOutput(input.output),statusInfo=input.includeStatusInfo===!1?void 0:input.statusInfo,renderedText=[output,statusInfo,output||statusInfo?void 0:input.emptyOutputInfo,input.outputTruncated===!0?"Output file reached the 64.0 MB save limit; additional process output was not saved.":void 0].filter(Boolean).join(`
|
|
11
11
|
`);if(renderedText.length<=30000)return renderedText;let preview=generatePreview$1(renderedText,EXEC_PREVIEW_SIZE_CHARS),suffix=preview.hasMore?`
|
|
12
12
|
...`:"";return["<persisted-output>",`Output too large (${formatByteSize$1(Buffer.byteLength(renderedText,"utf8"))}). Full output saved to: ${input.outputPath}`,"",`Preview (first ${formatByteSize$1(EXEC_PREVIEW_SIZE_CHARS)}):`,`${preview.preview}${suffix}`,"</persisted-output>"].join(`
|
|
13
13
|
`)}function generatePreview$1(content,maxChars=EXEC_PREVIEW_SIZE_CHARS){if(content.length<=maxChars)return{preview:content,hasMore:!1};let lastNewline=content.slice(0,maxChars).lastIndexOf(`
|
|
14
|
-
`),cutPoint=lastNewline>maxChars*0.5?lastNewline:maxChars;return{preview:content.slice(0,cutPoint),hasMore:!0}}function formatByteSize$1(bytes){if(bytes<1024)return`${bytes} B`;let kib=bytes/1024;if(kib<1024)return`${kib.toFixed(1)} KB`;return`${(kib/1024).toFixed(1)} MB`}function formatCollectedProcessOutput(output){if(!output)return"";return output.replace(/^(\s*\n)+/,"").trimEnd()}function normalizeExecInput(args,context){assertNoPresentKeys(args,["action","processId","timeoutMs","yieldTimeMs"],`exec accepts command, cwd, and runInBackground; remove ${collectPresentKeys(args,["action","processId","timeoutMs","yieldTimeMs"]).join(", ")}.`);let command=readOptionalCommandArg(args);if(command===void 0)throw Error("exec requires command.");let runInBackground=readOptionalBooleanArg(args,"runInBackground");return{command,cwd:args.cwd&&args.cwd.length>0?args.cwd:context.cwd,runInBackground}}function readOptionalCommandArg(args){let value=args.command;if(value===void 0)return;if(!Array.isArray(value))throw Error("command must be a string array");if(value.some((entry)=>typeof entry!=="string"))throw Error("command entries must all be strings");return[...value]}function validateExecArgs(input){if(input.command===void 0)throw Error("exec requires command.");if(input.command.length===0)throw Error("exec requires a non-empty command.");validateCommandUsage(input.command)}function validateCommandUsage(command){if(hasShellBackgroundMarker(command))throw Error("exec manages background tasks; remove shell background markers such as & and set runInBackground to true when the result can be handled later.");if(hasSleepThenCheck(command))throw Error("exec waits for managed tasks through completion notifications; remove sleep-and-check commands and wait for the task notification before reading outputPath.")}function hasShellBackgroundMarker(command){if(command.some((part)=>part.trim()==="&"))return!0;let shellScript=readShellScript(command);if(!shellScript)return!1;return/(?<![<>&])&(?![&\d])/.test(stripQuotedShellText(shellScript))}function hasSleepThenCheck(command){let shellScript=readShellScript(command);if(!shellScript)return!1;return/(?:^|[;&|()\s])sleep\s+\d+(?:\.\d+)?[smhd]?\s*(?:&&|;)/.test(shellScript)}function readShellScript(command){let executable=path4.basename(command[0]??"").toLowerCase();if(!["sh","bash","zsh","fish","dash","ksh"].includes(executable))return;let commandFlagIndex=command.findIndex((part,index)=>index>0&&part.startsWith("-")&&part.includes("c"));if(commandFlagIndex<0)return;let script=command[commandFlagIndex+1];return typeof script==="string"?script:void 0}function stripQuotedShellText(script){let output="",quote,escaping=!1;for(let char of script){if(escaping){output+=" ",escaping=!1;continue}if(char==="\\"){output+=" ",escaping=quote!=="'";continue}if(quote){if(char===quote)quote=void 0;output+=" ";continue}if(char==="'"||char==='"'){quote=char,output+=" ";continue}output+=char}return output}function collectPresentKeys(args,keys){return keys.filter((key)=>Object.prototype.hasOwnProperty.call(args,key)).map(String)}function assertNoPresentKeys(args,keys,message){if(collectPresentKeys(args,keys).length===0)return;throw Error(message)}function formatExecStatusInfo(result
|
|
14
|
+
`),cutPoint=lastNewline>maxChars*0.5?lastNewline:maxChars;return{preview:content.slice(0,cutPoint),hasMore:!0}}function formatByteSize$1(bytes){if(bytes<1024)return`${bytes} B`;let kib=bytes/1024;if(kib<1024)return`${kib.toFixed(1)} KB`;return`${(kib/1024).toFixed(1)} MB`}function formatCollectedProcessOutput(output){if(!output)return"";return output.replace(/^(\s*\n)+/,"").trimEnd()}function normalizeExecInput(args,context){assertNoPresentKeys(args,["action","processId","timeoutMs","yieldTimeMs"],`exec accepts command, cwd, and runInBackground; remove ${collectPresentKeys(args,["action","processId","timeoutMs","yieldTimeMs"]).join(", ")}.`);let command=readOptionalCommandArg(args);if(command===void 0)throw Error("exec requires command.");let runInBackground=readOptionalBooleanArg(args,"runInBackground");return{command,cwd:args.cwd&&args.cwd.length>0?args.cwd:context.cwd,runInBackground}}function readOptionalCommandArg(args){let value=args.command;if(value===void 0)return;if(!Array.isArray(value))throw Error("command must be a string array");if(value.some((entry)=>typeof entry!=="string"))throw Error("command entries must all be strings");return[...value]}function validateExecArgs(input){if(input.command===void 0)throw Error("exec requires command.");if(input.command.length===0)throw Error("exec requires a non-empty command.");validateCommandUsage(input.command)}function validateCommandUsage(command){if(hasShellBackgroundMarker(command))throw Error("exec manages background tasks; remove shell background markers such as & and set runInBackground to true when the result can be handled later.");if(hasSleepThenCheck(command))throw Error("exec waits for managed tasks through completion notifications; remove sleep-and-check commands and wait for the task notification before reading outputPath.")}function hasShellBackgroundMarker(command){if(command.some((part)=>part.trim()==="&"))return!0;let shellScript=readShellScript(command);if(!shellScript)return!1;return/(?<![<>&])&(?![&\d])/.test(stripQuotedShellText(shellScript))}function hasSleepThenCheck(command){let shellScript=readShellScript(command);if(!shellScript)return!1;return/(?:^|[;&|()\s])sleep\s+\d+(?:\.\d+)?[smhd]?\s*(?:&&|;)/.test(shellScript)}function readShellScript(command){let executable=path4.basename(command[0]??"").toLowerCase();if(!["sh","bash","zsh","fish","dash","ksh"].includes(executable))return;let commandFlagIndex=command.findIndex((part,index)=>index>0&&part.startsWith("-")&&part.includes("c"));if(commandFlagIndex<0)return;let script=command[commandFlagIndex+1];return typeof script==="string"?script:void 0}function stripQuotedShellText(script){let output="",quote,escaping=!1;for(let char of script){if(escaping){output+=" ",escaping=!1;continue}if(char==="\\"){output+=" ",escaping=quote!=="'";continue}if(quote){if(char===quote)quote=void 0;output+=" ";continue}if(char==="'"||char==='"'){quote=char,output+=" ";continue}output+=char}return output}function collectPresentKeys(args,keys){return keys.filter((key)=>Object.prototype.hasOwnProperty.call(args,key)).map(String)}function assertNoPresentKeys(args,keys,message){if(collectPresentKeys(args,keys).length===0)return;throw Error(message)}function formatExecStatusInfo(result){if(result.status==="running")return`Command running in background with task ID: ${result.taskId}. It is still running; you will be notified when it completes. Output is being written to: ${result.outputPath}`;if(result.status==="terminated"){if(result.timedOut===!0)return`Command timed out${result.timeoutMs?` after ${result.timeoutMs} ms`:""}. Output is available at: ${result.outputPath}`;return`Command terminated${result.signal?` by signal ${result.signal}`:""}. Output is available at: ${result.outputPath}`}return`Command exited with code ${result.exitCode??-1}. Output is available at: ${result.outputPath}`}function resolveExecOutputRoot(context){return context.hostDataDir??path4.join(os2.tmpdir(),"dim-agent-sdk")}function createExecResultPayload(result,runInBackground){let isRunning=result.status==="running",basePayload={type:isRunning?"running":"finished",status:createPayloadStatus(result),taskId:result.taskId,command:result.command,cwd:result.cwd,outputPath:result.outputPath,outputBytes:result.outputBytes,outputTruncated:result.outputTruncated,wallTimeMs:result.wallTimeMs,chunkId:result.chunkId};if(result.exitCode!==void 0)basePayload.exitCode=result.exitCode;if(result.signal!==void 0)basePayload.signal=result.signal;if(result.timedOut!==void 0)basePayload.timedOut=result.timedOut;if(result.timeoutMs!==void 0)basePayload.timeoutMs=result.timeoutMs;if(isRunning)return{...basePayload,type:"running",status:"running",runInBackground,notification:"completion-will-be-sent"};return{...basePayload,type:"finished",status:createPayloadStatus(result)}}function createPayloadStatus(result){if(result.status==="running")return"running";if(result.timedOut===!0)return"timed_out";if(result.status==="terminated")return"killed";return(result.exitCode??0)===0?"completed":"failed"}function isExecFailureResult(result){if(result.status==="running")return!1;if(result.timedOut===!0)return!0;if(result.status==="terminated")return!0;return(result.exitCode??0)!==0}function isSuccessfulExitedResult(result){return result.status==="exited"&&(result.exitCode??0)===0}async function budgetToolResult(input){if(isPersistedOutputResult(input.result))return input.result;let modelVisibleText=serializeToolResultForModel(input.result);if(modelVisibleText===void 0)return input.result;let budgetedText=await budgetModelVisibleText({text:modelVisibleText,sessionId:input.sessionId,toolCallId:input.toolCallId,hostDataDir:input.hostDataDir,maxResultSizeChars:input.maxResultSizeChars});if(budgetedText===modelVisibleText)return input.result;let replacement={content:[{type:"text",text:budgetedText}],isError:input.result.isError};if(input.result.contextMessages!==void 0)replacement.contextMessages=input.result.contextMessages;return replacement}async function budgetModelVisibleText(input){let threshold=resolveToolResultThreshold(input.maxResultSizeChars);if(threshold===1/0)return input.text;if(isPersistedOutputText(input.text))return input.text;if(input.text.length<=threshold)return input.text;return await persistModelVisibleToolResult(input)??input.text}async function persistModelVisibleToolResult(input){let outputPath=resolveToolResultOutputPath(input),persistedText=await persistToolResultText(outputPath,input.text);if(persistedText===void 0)return;return renderPersistedOutputMessage(persistedText,outputPath,input.previewSizeChars)}function resolveToolResultThreshold(value){if(value===void 0)return DEFAULT_TOOL_RESULT_MAX_CHARS;if(value===1/0)return 1/0;if(Number.isFinite(value)&&value>=0)return value;return DEFAULT_TOOL_RESULT_MAX_CHARS}function isPersistedOutputResult(result){if(result.content.some((block)=>block.type!=="text"))return!1;return isPersistedOutputText(contentToText(result.content))}function resolveToolResultOutputPath(input){let rootDir=input.hostDataDir?path4.resolve(input.hostDataDir):path4.join(os2.tmpdir(),"dim-agent-sdk");return path4.join(rootDir,"sessions",encodeURIComponent(input.sessionId),"tool-results",`${encodeURIComponent(input.toolCallId)}.txt`)}async function persistToolResultText(outputPath,content){try{return await mkdir3(path4.dirname(outputPath),{recursive:!0}),await writeFile3(outputPath,content,{flag:"wx"}),content}catch(error){if(!isFileExistsError(error))return}try{return await readFile3(outputPath,"utf8")}catch{return}}function renderPersistedOutputMessage(content,outputPath,previewSizeChars=TOOL_RESULT_PREVIEW_SIZE_CHARS){let header=[PERSISTED_OUTPUT_TAG,`Output too large (${formatByteSize(Buffer.byteLength(content,"utf8"))}). Full output saved to: ${outputPath}`];if(previewSizeChars<=0)return[...header,"</persisted-output>"].join(`
|
|
15
15
|
`);let preview=generatePreview(content,previewSizeChars),suffix=preview.hasMore?`
|
|
16
16
|
...`:"";return[...header,"",`Preview (first ${formatByteSize(previewSizeChars)}):`,`${preview.preview}${suffix}`,"</persisted-output>"].join(`
|
|
17
17
|
`)}function isPersistedOutputText(text){return text.startsWith(PERSISTED_OUTPUT_TAG)}function generatePreview(content,maxChars=TOOL_RESULT_PREVIEW_SIZE_CHARS){if(content.length<=maxChars)return{preview:content,hasMore:!1};let lastNewline=content.slice(0,maxChars).lastIndexOf(`
|
|
@@ -37,13 +37,13 @@ ${CONTINUATION_SUMMARY_CLOSE_TAG}`}function normalizeFallbackMessageText(message
|
|
|
37
37
|
`)].filter(Boolean).join(`
|
|
38
38
|
|
|
39
39
|
`);return text}async function controllerDispose(controller){if(!controller||typeof controller!=="object")return;if(!("dispose"in controller))return;let dispose=controller.dispose;if(typeof dispose!=="function")return;await dispose.call(controller)}function isSessionCompactorController(value){if(!value||typeof value!=="object")return!1;if(!("compact"in value))return!1;return typeof value.compact==="function"}function readCompactionPlanningOptions(controller){let raw=controller.readPlanningOptions?.();return resolveCompactionPlanningOptions(raw??{})}function cloneCompactionDiagnostics(diagnostics){return diagnostics?structuredClone(diagnostics):{}}function compactionDiagnosticsToMetadataFields(diagnostics){if(!diagnostics)return{};return{...diagnostics.summaryNormalization?{summaryNormalization:diagnostics.summaryNormalization}:{},...typeof diagnostics.summaryInputTokens==="number"?{summaryInputTokens:diagnostics.summaryInputTokens}:{},...typeof diagnostics.summaryOutputTokensEstimate==="number"?{summaryOutputTokensEstimate:diagnostics.summaryOutputTokensEstimate}:{},...typeof diagnostics.summaryChars==="number"?{summaryChars:diagnostics.summaryChars}:{},...typeof diagnostics.summaryCallCount==="number"?{summaryCallCount:diagnostics.summaryCallCount}:{},...typeof diagnostics.summaryChunkCount==="number"?{summaryChunkCount:diagnostics.summaryChunkCount}:{},...typeof diagnostics.prunedToolOutputCount==="number"?{prunedToolOutputCount:diagnostics.prunedToolOutputCount}:{},...typeof diagnostics.preservedToolOutputCount==="number"?{preservedToolOutputCount:diagnostics.preservedToolOutputCount}:{}}}function readErrorCode(error){if(!error||typeof error!=="object")return;if(!("code"in error))return;return typeof error.code==="string"?error.code:void 0}function readErrorMessage(error){return error instanceof Error?error.message:String(error)}function observeFileSystemGateway(gateway,observability){if(!observability)return gateway;return{readText(path5,options){return recordServiceCall(observability,"service.fileSystem.readText",{path:path5,options},()=>gateway.readText(path5,options))},readBytes(path5,options){return recordServiceCall(observability,"service.fileSystem.readBytes",{path:path5,options},()=>gateway.readBytes(path5,options))},writeText(path5,content,options){return recordServiceCall(observability,"service.fileSystem.writeText",{path:path5,content,options},()=>gateway.writeText(path5,content,options))},editText(path5,options){return recordServiceCall(observability,"service.fileSystem.editText",{path:path5,options},()=>gateway.editText(path5,options))},exists(path5,options){return recordServiceCall(observability,"service.fileSystem.exists",{path:path5,options},()=>gateway.exists(path5,options))},glob(pattern,options){return recordServiceCall(observability,"service.fileSystem.glob",{pattern,options},()=>gateway.glob(pattern,options))},grep(pattern,options){return recordServiceCall(observability,"service.fileSystem.grep",{pattern,options},()=>gateway.grep(pattern,options))}}}function observeExecGateway(gateway,observability){if(!observability)return gateway;return{execute(command,options){return recordServiceCall(observability,"service.exec.execute",{command,options},()=>gateway.execute(command,options))}}}function observeGitGateway(gateway,observability){if(!observability)return gateway;return{status(options){return recordServiceCall(observability,"service.git.status",{options},()=>gateway.status(options))},diff(options){return recordServiceCall(observability,"service.git.diff",{options},()=>gateway.diff(options))}}}function observeNetworkGateway(gateway,observability){if(!observability)return gateway;return{async fetch(input,init){let request=await summarizeRequest(input,init),operation=observability.startOperation("network","network.fetch",request);try{let response=await observability.withOperation(operation,()=>gateway.fetch(input,init));return operation?.success(await observability.summarizeResponse(response)),response}catch(error){throw operation?.error(error),error}}}}async function recordServiceCall(observability,event,input,fn){let operation=observability.startOperation("service",event,input);try{let output=await observability.withOperation(operation,fn);return operation?.success(output),output}catch(error){throw operation?.error(error),error}}function normalizeAllowedToolNames(allowedToolNames){if(allowedToolNames===void 0)return;return[...new Set(allowedToolNames.map((name)=>name.trim()).filter(Boolean))]}function createFilteredToolRegistry(tools,allowedToolNames){let normalized=normalizeAllowedToolNames(allowedToolNames);if(normalized===void 0)return tools;if(!tools)return;let allowed=new Set(normalized),filtered=new ToolRegistry;for(let tool of tools.list()){if(!allowed.has(tool.definition.name))continue;filtered.register(tool)}return filtered}function filterDynamicToolProviders(providers,allowedToolNames){let normalized=normalizeAllowedToolNames(allowedToolNames);if(normalized===void 0)return[...providers];let allowed=new Set(normalized);return providers.map((provider)=>({async listTools(input){return(await provider.listTools(input)).filter((tool)=>allowed.has(tool.name))},hasTool(name){if(!allowed.has(name))return!1;return provider.hasTool(name)},async executeTool(name,args,context){if(!allowed.has(name)||!provider.hasTool(name))throw Error(`Tool not found: ${name}`);return provider.executeTool(name,args,context)},dispose:provider.dispose?.bind(provider)}))}function normalizeSessionMessages(messages){return messages.map((message)=>{let cloned=cloneMessage(message);if(cloned.content=normalizeContent(cloned.content),cloned.role==="system"&&cloned.content.some((block)=>block.type!=="text"))throw TypeError("System messages must contain only text content");return cloned})}function cloneMessage(message){return{...message,content:normalizeContent(message.content),metadata:message.metadata?structuredClone(message.metadata):void 0,providerOptions:cloneProviderOptions(message.providerOptions),..."thinking"in message&&message.thinking!==void 0?{thinking:message.thinking}:{},..."toolCalls"in message&&message.toolCalls!==void 0?{toolCalls:structuredClone(message.toolCalls)}:{},..."stopReason"in message&&message.stopReason!==void 0?{stopReason:message.stopReason}:{},..."toolCallId"in message?{toolCallId:message.toolCallId}:{},..."toolName"in message?{toolName:message.toolName}:{},..."structuredContent"in message&&message.structuredContent!==void 0?{structuredContent:structuredClone(message.structuredContent)}:{},..."isError"in message&&message.isError!==void 0?{isError:message.isError}:{}}}function createAgent(options){return new Agent(options)}function createServices(options,agentId,tracker,compaction,pluginState,inspect,observability,getSessionById){let exec=new NodeExecGateway({cwd:options.cwd,tracker}),fileSystem=new NodeFileSystemGateway({cwd:options.cwd,tracker}),git=new DefaultGitGateway({exec,cwd:options.cwd});return{fileSystem:observeFileSystemGateway(fileSystem,observability),exec:observeExecGateway(exec,observability),git:observeGitGateway(git,observability),network:observeNetworkGateway(new DefaultNetworkGateway,observability),logger:createLoggerGateway(options.logHandler,{agentId,cwd:options.cwd}),model:new DefaultModelGateway(options.model,{beginUsage:(request,scope)=>{if(!scope.sessionId)return;let session=getSessionById(scope.sessionId);if(!session)return;let resolvedScope=resolveSessionUsageScope(session,scope);if(!resolvedScope)return;if(!request.requestId)return;return beginSessionUsageRequest(session,{turnId:resolvedScope.turnId,itemId:resolvedScope.itemId,requestId:request.requestId,parentRequestId:resolvedScope.parentRequestId,kind:resolvedScope.kind,model:request.model,contextWindow:resolvedScope.contextWindow,estimatedInputTokens:resolvedScope.estimatedInputTokens}),{complete:(input)=>completeSessionUsageRequest(session,input)}}}),compaction,pluginState,inspect,observability}}function validateCompactionOwner(options){let compactorPluginId=options.compaction?.compactorPluginId;if(!compactorPluginId)return;if(!new Set((options.plugins??[]).map((plugin)=>plugin.manifest.id)).has(compactorPluginId))throw Error(`Compaction plugin "${compactorPluginId}" is not loaded`)}function cloneInspectableCompactionOptions(compaction){if(!compaction)return;return{enabled:compaction.enabled,safetyRatio:compaction.safetyRatio,compactorPluginId:compaction.compactorPluginId}}async function removeSessionArtifacts(hostDataDir,sessionId){if(!hostDataDir)return;await rm(path4.join(hostDataDir,"plans",sessionId),{recursive:!0,force:!0})}function createToolRegistry(input){let registry=input.tools instanceof ToolRegistry?cloneRegistry(input.tools):new ToolRegistry;if(input.includeBuiltinTools)safeRegister(registry,new ReadTool),safeRegister(registry,new WriteTool),safeRegister(registry,new EditTool),safeRegister(registry,new ExecTool);for(let tool of Array.isArray(input.tools)?input.tools:[])safeRegister(registry,tool);for(let tool of input.pluginTools)safeRegister(registry,tool);return registry}function cloneRegistry(source){let registry=new ToolRegistry;for(let tool of source.list())registry.register(tool);return registry}function safeRegister(registry,tool){if(!registry.get(tool.definition.name))registry.register(tool)}function createModel(adapter){return{adapter,model:adapter.defaultModel,capabilities:adapter.capabilities,stream(request){return adapter.stream({...request,model:request.model??adapter.defaultModel})}}}var CURRENT_SESSION_SNAPSHOT_SCHEMA_VERSION=5,JsonSnapshotCodec=class{encode(input){return this.decodeSnapshot({schemaVersion:CURRENT_SESSION_SNAPSHOT_SCHEMA_VERSION,sessionId:input.sessionId,model:input.model,cwd:input.cwd,messages:input.messages,usage:input.usage,usageLedger:input.usageLedger,compaction:input.compaction,pluginState:input.pluginState,createdAt:input.createdAt,updatedAt:input.updatedAt,metadata:input.metadata,messageQueue:input.messageQueue,reasoning:input.reasoning,cache:input.cache,maxIterations:input.maxIterations,allowedToolNames:input.allowedToolNames},{transcript:{compensateMissingToolResults:!1}})}serialize(snapshot){let normalized=this.decodeSnapshot(snapshot,{transcript:{compensateMissingToolResults:!1}});return structuredClone({...normalized,schemaVersion:CURRENT_SESSION_SNAPSHOT_SCHEMA_VERSION,messages:normalized.messages.map(serializeMessage),messageQueue:normalized.messageQueue?{...normalized.messageQueue,items:normalized.messageQueue.items.map(serializePendingMessage)}:void 0})}decode(value){return this.decodeSnapshot(value,{transcript:{compensateMissingToolResults:!0}})}decodeSnapshot(value,options){let snapshot=readSerializedSessionSnapshotCandidate(value);if(!snapshot)throw TypeError("Session snapshot must be an object");if(snapshot.schemaVersion!==1&&snapshot.schemaVersion!==2&&snapshot.schemaVersion!==3&&snapshot.schemaVersion!==4&&snapshot.schemaVersion!==5)throw TypeError("Unsupported session snapshot schemaVersion");if(typeof snapshot.sessionId!=="string")throw TypeError("Session snapshot sessionId is required");if(!Array.isArray(snapshot.messages))throw TypeError("Session snapshot messages must be an array");if(typeof snapshot.createdAt!=="number"||typeof snapshot.updatedAt!=="number")throw TypeError("Session snapshot timestamps are required");let normalized=snapshot,migration=migrateSnapshotMessages(normalized.messages.map(decodeMessage),options.transcript),compaction=normalized.compaction?remapMigratedCompactionState(normalized.compaction,migration.cursorMap):normalized.compaction;return{...normalized,schemaVersion:CURRENT_SESSION_SNAPSHOT_SCHEMA_VERSION,messages:migration.messages,compaction,messageQueue:normalized.messageQueue?{...normalized.messageQueue,items:normalized.messageQueue.items.map(decodePendingMessage)}:void 0}}},sessionSnapshotCodec,HookPipeline=class{registrations=[];observability;nextOrder=0;constructor(options={}){this.observability=options.observability}register(pluginId,pluginPriority,hooks,services){if(!hooks)return;for(let entry of hooks){if(!entry.middleware?.length&&!entry.observers?.length)continue;if(entry.descriptor.name==="model.event"&&entry.middleware&&entry.middleware.length>0)throw Error(`Plugin ${pluginId} cannot register middleware for model.event`);if(entry.descriptor.mode==="async"&&entry.middleware&&entry.middleware.length>0)throw Error(`Plugin ${pluginId} cannot register async middleware for ${entry.descriptor.name}`);this.registrations.push({pluginId,order:this.nextOrder++,priority:entry.descriptor.priority??pluginPriority,descriptor:entry.descriptor,services,middleware:[...entry.middleware??[]],observers:[...entry.observers??[]]})}this.registrations.sort((left,right)=>{if(left.priority!==right.priority)return right.priority-left.priority;return left.order-right.order})}async runMiddleware(name,payload,context){let current=payload;for(let registration of this.matchingRegistrations(name,current))for(let middleware of registration.middleware){let result=await this.runMiddlewareHandler(registration,middleware,current,context);if(result===void 0)continue;if(isHookControlResult(result)){if(current=result.payload,result.type==="stop")return current;continue}if(isNotificationControlResult(result)||isRunStopControlResult(result)||isToolBeforeExecuteControlResult(result))throw Error(`Hook ${registration.descriptor.name} returned an unsupported control result`);current=result}return current}async runToolBeforeExecute(payload,context){let current=payload;for(let registration of this.matchingRegistrations("tool.beforeExecute",current))for(let middleware of registration.middleware){let result=await this.runMiddlewareHandler(registration,middleware,current,context);if(result===void 0)continue;if(isHookControlResult(result)){if(current=result.payload,result.type==="stop")return{payload:current};continue}if(isToolBeforeExecuteControlResult(result)){if(result.type==="replaceToolCall"){current={...current,toolCall:result.toolCall};continue}if(result.type==="ask"&&result.toolCall)current={...current,toolCall:result.toolCall};return{payload:current,control:result}}current=result}return{payload:current}}async runNotifyMessage(payload,context){let current=payload;for(let registration of this.matchingRegistrations("notify.message",current))for(let middleware of registration.middleware){let result=await this.runMiddlewareHandler(registration,middleware,current,context);if(result===void 0)continue;if(isHookControlResult(result)){if(current=result.payload,result.type==="stop")return{payload:current};continue}if(isNotificationControlResult(result)){if(result.type==="replace"){current={...current,notification:result.notification};continue}if(result.type==="suppress")return{payload:current,suppressed:!0};continue}current=result}return{payload:current}}async runRunStop(payload,context){let current=payload;for(let registration of this.matchingRegistrations("run.stop",current))for(let middleware of registration.middleware){let result=await this.runMiddlewareHandler(registration,middleware,current,context);if(result===void 0)continue;if(isHookControlResult(result)){if(current=result.payload,result.type==="stop")return{payload:current};continue}if(isRunStopControlResult(result))return{payload:current,control:result};current=result}return{payload:current}}async runObservers(name,payload,context){for(let registration of this.matchingRegistrations(name,payload))for(let observer of registration.observers){let task=this.runObserverHandler(registration,observer,payload,context);if(registration.descriptor.mode==="async"){task.catch(()=>{});continue}await task.catch(()=>{})}}matchingRegistrations(name,payload){return this.registrations.filter((registration)=>{return registration.descriptor.name===name&&matchesHookDescriptor(registration.descriptor,payload)})}async runMiddlewareHandler(registration,middleware,payload,context){let operation=this.observability?.startOperation("hook",`hook.${registration.descriptor.name}.middleware`,payload,{sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration},this.createHandlerMetadata(registration,"middleware"));try{let result=await withTimeout(Promise.resolve(this.observability?this.observability.withOperation(operation,()=>Promise.resolve(middleware({payload,context:this.withHandlerMetadata(context,registration)}))):middleware({payload,context:this.withHandlerMetadata(context,registration)})),registration.descriptor.timeoutMs,()=>{return Error(`Hook ${registration.descriptor.name} for plugin ${registration.pluginId} timed out after ${registration.descriptor.timeoutMs}ms`)});return operation?.success(result,this.createHandlerMetadata(registration,"middleware")),result}catch(error){throw operation?.error(error,this.createHandlerMetadata(registration,"middleware")),error}}async runObserverHandler(registration,observer,payload,context){let operation=this.observability?.startOperation("hook",`hook.${registration.descriptor.name}.observer`,payload,{sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration},this.createHandlerMetadata(registration,"observer"));try{await withTimeout(Promise.resolve(this.observability?this.observability.withOperation(operation,()=>Promise.resolve(observer({payload,context:this.withHandlerMetadata(context,registration)}))):observer({payload,context:this.withHandlerMetadata(context,registration)})),registration.descriptor.timeoutMs,()=>{return Error(`Hook ${registration.descriptor.name} for plugin ${registration.pluginId} timed out after ${registration.descriptor.timeoutMs}ms`)}),operation?.success(void 0,this.createHandlerMetadata(registration,"observer"))}catch(error){throw operation?.error(error,this.createHandlerMetadata(registration,"observer")),error}}createHandlerMetadata(registration,handlerKind){return{pluginId:registration.pluginId,hookName:registration.descriptor.name,handlerKind,mode:registration.descriptor.mode??"sync",priority:registration.priority}}withHandlerMetadata(context,registration){return{...context,services:registration.services??context.services,status:context.status?structuredClone(context.status):void 0,metadata:{...context.metadata,pluginId:registration.pluginId,hookName:registration.descriptor.name}}}},PluginHost=class{pipeline;promptContributors=[];tools=[];dynamicToolProvidersRegistry=[];sessionControllerFactories=[];pluginInspectors=[];services;cwd;hostDataDir;agentId;constructor(options){this.pipeline=new HookPipeline({observability:options.observability}),this.agentId=options.agentId,this.cwd=options.cwd,this.hostDataDir=options.hostDataDir,this.services=options.services;for(let plugin of options.plugins??[]){let priority=plugin.manifest.priority??0,scopedServices=options.permissionGateway.scopeServices(this.services,plugin.manifest.id,plugin.manifest.permissions),setup=plugin.setup?.({cwd:this.cwd,hostDataDir:this.hostDataDir,manifest:plugin.manifest,services:scopedServices});this.pluginInspectors.push({pluginId:plugin.manifest.id,manifest:structuredClone(plugin.manifest),inspector:setup?.inspector}),this.pipeline.register(plugin.manifest.id,priority,setup?.hooks,scopedServices);for(let tool of setup?.tools??[])this.tools.push({pluginId:plugin.manifest.id,tool:wrapTool(plugin.manifest.id,tool,scopedServices)});for(let provider of setup?.dynamicToolProviders??[])this.dynamicToolProvidersRegistry.push({pluginId:plugin.manifest.id,provider:wrapDynamicToolProvider(plugin.manifest.id,provider,scopedServices)});for(let contributor of setup?.promptContributors??[])this.promptContributors.push({pluginId:plugin.manifest.id,contributor});if(setup?.createSessionController)this.sessionControllerFactories.push({pluginId:plugin.manifest.id,factory:setup.createSessionController,services:scopedServices})}}pluginTools(){return this.tools.map((entry)=>entry.tool)}dynamicToolProviders(){return this.dynamicToolProvidersRegistry.map((entry)=>entry.provider)}createSessionControllers(input){let controllers=new Map;for(let entry of this.sessionControllerFactories)controllers.set(entry.pluginId,entry.factory({sessionId:input.sessionId,metadata:input.metadata?structuredClone(input.metadata):void 0,getStatus:input.getStatus,pluginState:entry.services.pluginState,save:input.save,isRunning:input.isRunning}));return controllers}async inspectPlugins(){return Promise.all(this.pluginInspectors.map(async(entry)=>{if(!entry.inspector)return{pluginId:entry.pluginId,manifest:structuredClone(entry.manifest),configStatus:"unavailable"};try{let config=await entry.inspector.getConfig(),snapshot={pluginId:entry.pluginId,manifest:structuredClone(entry.manifest),configStatus:config?"available":"unavailable"};if(config)snapshot.config=structuredClone(config);return snapshot}catch(error){return{pluginId:entry.pluginId,manifest:structuredClone(entry.manifest),configStatus:"error",errorMessage:error instanceof Error?error.message:String(error)}}}))}async inspectSessionPlugins(sessionId){return Promise.all(this.pluginInspectors.map(async(entry)=>{if(!entry.inspector?.getSessionState)return{pluginId:entry.pluginId,stateStatus:"unavailable"};try{let state=await entry.inspector.getSessionState(sessionId),snapshot={pluginId:entry.pluginId,stateStatus:state?"available":"unavailable"};if(state)snapshot.state=structuredClone(state);return snapshot}catch(error){return{pluginId:entry.pluginId,stateStatus:"error",errorMessage:error instanceof Error?error.message:String(error)}}}))}async runMiddleware(name,payload,context={}){return this.pipeline.runMiddleware(name,payload,this.createRuntimeContext(context))}async runToolBeforeExecute(payload,context={}){return this.pipeline.runToolBeforeExecute(payload,this.createRuntimeContext(context))}async runNotifyMessage(payload,context={}){return this.pipeline.runNotifyMessage(payload,this.createRuntimeContext(context))}async runRunStop(payload,context={}){return this.pipeline.runRunStop(payload,this.createRuntimeContext(context))}async runObservers(name,payload,context={}){await this.pipeline.runObservers(name,payload,this.createRuntimeContext(context))}async collectPromptSegments(input){let segments=[];for(let entry of this.promptContributors){let next=await entry.contributor(input);if(!next)continue;if(Array.isArray(next))segments.push(...next.filter(Boolean));else segments.push(next)}return segments}async dispose(){await Promise.allSettled(this.dynamicToolProvidersRegistry.map(async(entry)=>{await entry.provider.dispose?.()}))}createRuntimeContext(context){return{agentId:this.agentId,cwd:context.cwd??this.cwd,hostDataDir:context.hostDataDir??this.hostDataDir,sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration,status:context.status?structuredClone(context.status):void 0,metadata:context.metadata,services:context.services??this.services}}},ActivityTracker=class{records=[];record(record){if(this.records.push({...record,timestamp:record.timestamp}),this.records.length>200)this.records.splice(0,this.records.length-200)}recentFiles(limit=5){let seen=new Set,files=[];for(let index=this.records.length-1;index>=0;index-=1){let record=this.records[index];if(!record||record.type!=="file")continue;if(seen.has(record.label))continue;if(seen.add(record.label),files.push(record.label),files.length>=limit)break}return files}},NodeExecGateway=class{cwd;env;tracker;constructor(options={}){this.cwd=options.cwd,this.env=options.env??process.env,this.tracker=options.tracker}async execute(command,options={}){let cwd=options.cwd??this.cwd,env={...this.env,...options.env},result=await new Promise((resolve,reject)=>{let child=spawn(command,{cwd,env,shell:!0,signal:options.signal}),stdout="",stderr="",settled=!1,timedOut=!1,timeout,finish=(value,isError)=>{if(settled)return;if(settled=!0,timeout)clearTimeout(timeout);if(isError)reject(value);else resolve(value)};if(options.timeoutMs!==void 0)timeout=setTimeout(()=>{timedOut=!0,child.kill("SIGTERM")},options.timeoutMs);child.stdout.on("data",(chunk)=>{stdout+=String(chunk)}),child.stderr.on("data",(chunk)=>{stderr+=String(chunk)}),child.on("error",(error)=>finish(error,!0)),child.on("close",(code,signal)=>{finish({command,cwd,stdout,stderr,exitCode:code===null?void 0:code,signal:signal??void 0,timedOut},!1)})});return this.tracker?.record({type:"command",label:command,timestamp:Date.now()}),result}},FILE_MODIFIED_SINCE_READ_MESSAGE="File was modified after it was last read. Use the read tool again before editing.",DEFAULT_GREP_MAX_LINE_LENGTH=500,DEFAULT_GREP_TIMEOUT_MS=3000,MAX_GREP_REGEX_PATTERN_LENGTH=512,MAX_GREP_REGEX_GROUP_NESTING=32,MAX_GREP_REGEX_LINE_INPUT_LENGTH=8000,MAX_GREP_REGEX_MULTILINE_INPUT_LENGTH=200000,MAX_GREP_REGEX_REPEAT_UPPER_BOUND=32,FILE_REVISION_STREAM_HIGH_WATER_MARK=524288,FILE_WRITE_STREAM_MIN_CHARS=524288,FILE_WRITE_STREAM_CHARS_PER_CHUNK=524288,FILE_WRITE_STREAM_HIGH_WATER_MARK=524288,EXCLUDED_DIRECTORY_NAMES,pathMutationLocks,EDIT_TARGET_FILE_MAX_BYTES,FileModifiedSinceReadError,EditTargetFileTooLargeError,NodeFileSystemGateway=class{cwd;tracker;ripgrepBinary;constructor(options={}){this.cwd=options.cwd,this.tracker=options.tracker,this.ripgrepBinary=options.ripgrepBinary??"rg"}async readText(targetPath,options={}){let resolved=resolveFileSystemPath(this.cwd,targetPath,options.cwd),text=await readFile3(resolved,"utf8");return this.recordFile(resolved),text}async readBytes(targetPath,options={}){let resolved=resolveFileSystemPath(this.cwd,targetPath,options.cwd),bytes=await readFile3(resolved);return this.recordFile(resolved),new Uint8Array(bytes)}async writeText(targetPath,content,options={}){let resolved=resolveFileSystemPath(this.cwd,targetPath,options.cwd);return withPathMutationLock(resolved,async()=>{if(options.expectedRevision!==void 0){if(await createTextRevisionFromFileIfExists(resolved)!==options.expectedRevision)throw new FileModifiedSinceReadError}return await mkdir3(path4.dirname(resolved),{recursive:!0}),await writeTextFile(resolved,content),this.recordFile(resolved),{path:resolved,bytes:Buffer.byteLength(content,"utf8"),revision:createTextRevision(content)}})}async editText(targetPath,options){let resolved=resolveFileSystemPath(this.cwd,targetPath,options.cwd);return withPathMutationLock(resolved,async()=>{let sourceStat=await stat(resolved);if(sourceStat.size>EDIT_TARGET_FILE_MAX_BYTES)throw new EditTargetFileTooLargeError(sourceStat.size);let source=await readFile3(resolved,"utf8"),sourceRevision=createTextRevision(source);if(options.expectedRevision!==void 0&&sourceRevision!==options.expectedRevision)throw new FileModifiedSinceReadError;let replacement=resolveEditReplacement(source,options.oldText,options.newText);if(replacement.matches===0)throw Error("oldText was not found in the target file");if(!options.replaceAll&&replacement.matches>1)throw Error("oldText matched more than once; set replaceAll to true to replace all matches");let updated=options.replaceAll?source.replaceAll(replacement.oldText,replacement.newText):source.replace(replacement.oldText,replacement.newText);return await writeFile3(resolved,updated,"utf8"),this.recordFile(resolved),{path:resolved,replacements:options.replaceAll?replacement.matches:1,revision:createTextRevision(updated)}})}async exists(targetPath,options={}){try{return await stat(resolveFileSystemPath(this.cwd,targetPath,options.cwd)),!0}catch{return!1}}async glob(pattern,options={}){let startedAt=Date.now(),root=path4.resolve(options.cwd??this.cwd??process.cwd()),limit=normalizeSearchLimit(options.limit??100),sortBy=options.sortBy??"mtime",files=await sortCandidateFiles(await this.tryGlobWithRipgrep(pattern,root)??await this.collectGlobMatchesWithWalk(pattern,root),sortBy);return{files:limit===void 0?files:files.slice(0,limit),numFiles:files.length,truncated:limit!==void 0&&files.length>limit,durationMs:Date.now()-startedAt}}async grep(pattern,options={}){let root=path4.resolve(options.cwd??this.cwd??process.cwd()),include=options.include??options.pattern??"**/*",limit=normalizeSearchLimit(options.limit),beforeContext=normalizeContextCount(options.beforeContext,"beforeContext"),afterContext=normalizeContextCount(options.afterContext,"afterContext"),fixedStrings=options.fixedStrings!==!1,ignoreCase=options.ignoreCase===!0,multiline=options.multiline===!0,sortBy=options.sortBy??"path",maxLineLength=normalizeMaxLineLength(options.maxLineLength),deadline=fixedStrings?void 0:createSearchDeadline(options.timeoutMs);if(!fixedStrings)assertSafeRegexPattern(pattern);let sortedFiles=(await this.glob(include,{cwd:root,limit:0,sortBy})).files,matches=[];for(let filePath of sortedFiles){if(assertSearchDeadline(deadline),limit!==void 0&&matches.length>=limit)break;let text;try{text=await readFile3(filePath,"utf8")}catch{continue}if(isProbablyBinaryText(text))continue;let fileMatches=multiline?findMultilineMatches(text,filePath,pattern,{fixedStrings,ignoreCase,beforeContext,afterContext,maxLineLength,deadline,limit:limit===void 0?void 0:limit-matches.length}):findLineMatches(text,filePath,pattern,{fixedStrings,ignoreCase,beforeContext,afterContext,maxLineLength,deadline,limit:limit===void 0?void 0:limit-matches.length});matches.push(...fileMatches)}return matches}async tryGlobWithRipgrep(pattern,cwd){let result=await runRipgrep(this.ripgrepBinary,["--files","--hidden",...baseGlobArgs(),"-g",pattern],cwd);if(!result)return;if(result.exitCode!==0)return result.exitCode===1?[]:void 0;return result.stdout.split(/\r?\n/g).filter(Boolean).map((entry)=>path4.resolve(cwd,entry))}async collectGlobMatchesWithWalk(pattern,root){let matcher=compileGlob(pattern),matches=[];return await walk(root,root,async(absolutePath,relativePath)=>{if(matcher.test(relativePath))matches.push(absolutePath);return!0}),matches}recordFile(filePath){this.tracker?.record({type:"file",label:filePath,timestamp:Date.now()})}},DefaultGitGateway=class{exec;cwd;constructor(options){this.exec=options.exec,this.cwd=options.cwd}async status(options={}){return this.runGitCommand("git status --short",options.cwd)}async diff(options={}){return this.runGitCommand('git diff --stat && printf "\\n---\\n" && git diff -- .',options.cwd)}async runGitCommand(command,cwd){try{let result=await this.exec.execute(command,{cwd:cwd??this.cwd,timeoutMs:1e4});if(result.exitCode!==void 0&&result.exitCode!==0)return;return[result.stdout,result.stderr].filter(Boolean).join(result.stdout&&result.stderr?`
|
|
40
|
-
`:"").trim()||void 0}catch{return}}},DEFAULT_STATE_STORE_LIST_LIMIT=50,MAX_STATE_STORE_LIST_LIMIT=200,FileStateStore=class{directory;constructor(options){this.directory=path4.resolve(options.directory)}async save(input){let validatedSnapshot=sessionSnapshotCodec.decode(input.snapshot),usageLedger=validateSaveUsageLedger$1(validatedSnapshot,input.usageLedger),serialized=sessionSnapshotCodec.serialize({...validatedSnapshot,usageLedger:void 0});await mkdir3(this.directory,{recursive:!0}),await writeFile3(this.filePath(validatedSnapshot.sessionId),JSON.stringify(serialized,null,2),"utf8"),await writeFile3(this.usageLedgerFilePath(validatedSnapshot.sessionId),JSON.stringify(usageLedger,null,2),"utf8")}async load(sessionId){try{let raw=await readFile3(this.filePath(sessionId),"utf8"),snapshot=sessionSnapshotCodec.decode(JSON.parse(raw));return hydrateSnapshot$1(snapshot,await this.loadUsageLedger(sessionId,snapshot.usageLedger))}catch(error){if(error.code==="ENOENT")return;throw error}}async delete(sessionId){await rm(this.filePath(sessionId),{force:!0}),await rm(this.usageLedgerFilePath(sessionId),{force:!0})}async list(options){await mkdir3(this.directory,{recursive:!0});let listOptions=normalizeStateStoreListOptions(options),entries=await readdir(this.directory,{withFileTypes:!0}),files=[],snapshots=[];for(let entry of entries){if(!entry.isFile()||!isSnapshotFileName(entry.name))continue;let filePath=path4.join(this.directory,entry.name),modifiedAt;try{modifiedAt=(await stat(filePath)).mtimeMs}catch(error){if(error.code==="ENOENT")continue;throw error}files.push({filePath,sessionId:decodeSessionIdFromFileName(entry.name),modifiedAt})}let{page,nextCursor}=applyStateStoreListPagination(files.sort(compareSnapshotFileEntries),listOptions);for(let entry of page){let raw=await readFile3(entry.filePath,"utf8");snapshots.push(sessionSnapshotCodec.decode(JSON.parse(raw)))}return{snapshots,nextCursor}}filePath(sessionId){return path4.join(this.directory,`${encodeURIComponent(sessionId)}.json`)}usageLedgerFilePath(sessionId){return path4.join(this.directory,`${encodeURIComponent(sessionId)}.usage.json`)}async loadUsageLedger(sessionId,inlineUsageLedger){try{let raw=await readFile3(this.usageLedgerFilePath(sessionId),"utf8");return structuredClone(JSON.parse(raw))}catch(error){if(error.code==="ENOENT")return inlineUsageLedger?structuredClone(inlineUsageLedger):void 0;throw error}}},InMemoryStateStore=class{snapshots=new Map;usageLedgers=new Map;modifiedAtBySessionId=new Map;modifiedAtSequence=0;async save(input){let validated=sessionSnapshotCodec.decode(input.snapshot),usageLedger=validateSaveUsageLedger(validated,input.usageLedger);this.snapshots.set(validated.sessionId,sessionSnapshotCodec.decode(sessionSnapshotCodec.serialize({...validated,usageLedger:void 0}))),this.usageLedgers.set(validated.sessionId,usageLedger),this.modifiedAtBySessionId.set(validated.sessionId,this.nextModifiedAt())}async load(sessionId){let snapshot=this.snapshots.get(sessionId);if(!snapshot)return;return hydrateSnapshot(snapshot,this.usageLedgers.get(sessionId)??snapshot.usageLedger)}async delete(sessionId){this.snapshots.delete(sessionId),this.usageLedgers.delete(sessionId),this.modifiedAtBySessionId.delete(sessionId)}async list(options){let listOptions=normalizeStateStoreListOptions(options),{page,nextCursor}=applyStateStoreListPagination([...this.snapshots.entries()].map(([sessionId,snapshot])=>({sessionId,snapshot,modifiedAt:this.modifiedAtBySessionId.get(sessionId)??0})).sort(compareSnapshotEntries),listOptions);return{snapshots:page.map((entry)=>sessionSnapshotCodec.decode(entry.snapshot)),nextCursor}}nextModifiedAt(){return this.modifiedAtSequence+=1,this.modifiedAtSequence}},DefaultInspectGateway=class{options;constructor(options){this.options=options}async getAgentSnapshot(){return{agentId:this.options.agentId,cwd:this.options.cwd,model:structuredClone(this.options.model),capabilities:this.options.capabilities?structuredClone(this.options.capabilities):void 0,reasoning:this.options.reasoning?structuredClone(this.options.reasoning):void 0,cache:this.options.cache?structuredClone(this.options.cache):void 0,compaction:this.options.compaction?structuredClone(this.options.compaction):void 0,permissions:this.options.permissions?{...this.options.permissions}:void 0,includeBuiltinTools:this.options.includeBuiltinTools,persistence:{autosave:this.options.autosave,hostDataDir:this.options.hostDataDir,stateStore:describeStateStore(this.options.stateStore)},plugins:await this.options.getPluginSnapshots()}}async listLiveSessions(){return this.options.getLiveSessions()}async listPersistedSessions(options){if(!this.options.stateStore)return{sessions:[]};let page=await this.options.stateStore.list(options);return{sessions:page.snapshots.map((snapshot)=>({sessionId:snapshot.sessionId,model:snapshot.model?structuredClone(snapshot.model):void 0,cwd:snapshot.cwd,messageCount:snapshot.messages.length,pluginIds:Object.keys(snapshot.pluginState??{}).sort(),createdAt:snapshot.createdAt,updatedAt:snapshot.updatedAt,queuedItemCount:snapshot.messageQueue?.items.length??0})),nextCursor:page.nextCursor}}async loadPersistedSession(sessionId){if(!this.options.stateStore)return;let snapshot=await this.options.stateStore.load(sessionId);return snapshot?structuredClone(snapshot):void 0}},DefaultLoggerGateway=class DefaultLoggerGateway2{handler;context;constructor(options={}){this.handler=options.handler,this.context=cloneLogContext(options.context)}withContext(context){return new DefaultLoggerGateway2({handler:this.handler,context:mergeLogContext(this.context,context)})}emit(entry){if(!this.handler)return;try{let result=this.handler(cloneLogEntry(entry),cloneLogContext(this.context));if(isPromiseLike(result))Promise.resolve(result).catch(()=>{return})}catch{}}},DefaultModelGateway=class{model;beginUsage;constructor(model,options={}){this.model=model,this.beginUsage=options.beginUsage}async*stream(request,options={}){let effectiveRequest=request.requestId?request:{...request,requestId:crypto.randomUUID()},usageHandle=options.usage?this.beginUsage?.(effectiveRequest,options.usage):void 0,completed=!1;for await(let event of this.model.stream(effectiveRequest)){if(event.type==="response_end")usageHandle?.complete({requestId:event.requestId,status:event.stopReason==="cancelled"?"cancelled":event.stopReason==="error"?"error":"completed",usage:event.usage,rawUsage:event.rawUsage,cost:event.cost}),completed=!0;else if(event.type==="error")usageHandle?.complete({requestId:event.requestId,status:"error"}),completed=!0;yield event}if(!completed&&effectiveRequest.requestId)usageHandle?.complete({requestId:effectiveRequest.requestId,status:"completed"})}},DefaultNetworkGateway=class{fetchImpl;constructor(fetchImpl=globalThis.fetch){this.fetchImpl=fetchImpl}fetch(input,init){return this.fetchImpl(input,init)}},fullPermissions,PermissionDeniedError,PermissionGateway=class{permissions;constructor(options={}){this.permissions=normalizePermissions(options.permissions)}get agentPermissions(){return{...this.permissions}}scopeServices(services,pluginId,requested){let effective=intersectPermissions(this.permissions,requested),pluginState=services.pluginState;return{fileSystem:{readText:(path5,options)=>{if(!canReadFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to read files`);return services.fileSystem.readText(path5,options)},readBytes:(path5,options)=>{if(!canReadFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to read files`);return services.fileSystem.readBytes(path5,options)},writeText:(path5,content,options)=>{if(!canWriteFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to write files`);return services.fileSystem.writeText(path5,content,options)},editText:(path5,options)=>{if(!canWriteFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to edit files`);return services.fileSystem.editText(path5,options)},exists:(path5,options)=>{if(!canReadFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to inspect files`);return services.fileSystem.exists(path5,options)},glob:(pattern,options)=>{if(!canReadFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to glob files`);return services.fileSystem.glob(pattern,options)},grep:(query,options)=>{if(!canReadFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to grep files`);return services.fileSystem.grep(query,options)}},exec:{execute:(command,options)=>{if(effective.process!==!0)throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to execute commands`);return services.exec.execute(command,options)}},git:{status:(options)=>{if(effective.git!==!0)throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to inspect git state`);return services.git.status(options)},diff:(options)=>{if(effective.git!==!0)throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to inspect git diff`);return services.git.diff(options)}},network:{fetch:(input,init)=>{if(effective.network!==!0)throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to access the network`);return services.network.fetch(input,init)}},logger:bindLoggerContext(services.logger,{pluginId}),model:{stream:(request,options)=>{if(effective.model!==!0)throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to call the model gateway`);return services.model.stream(request,options)}},compaction:{getState:(sessionId)=>services.compaction.getState(sessionId)},pluginState:{get:(sessionId)=>pluginState.getForPlugin(sessionId,pluginId),replace:(sessionId,entry)=>pluginState.replaceForPlugin(sessionId,pluginId,entry),clear:(sessionId)=>pluginState.clearForPlugin(sessionId,pluginId)},inspect:services.inspect}}},BaseTool=class{definition;constructor(definition){this.definition={...definition,inputSchema:createToolSchema(definition.inputSchema)}}},ToolRegistry=class ToolRegistry2{tools;constructor(tools=new Map){this.tools=tools}register(tool){let name=tool.definition.name.trim();if(!name)throw Error("Tool name is required");if(this.tools.has(name))throw Error(`Tool already registered: ${name}`);let normalizedTool={definition:createToolDefinition({...tool.definition,name}),execute(args,context){return tool.execute(args,context)}};return this.tools.set(name,normalizedTool),new ToolRegistry2(this.tools)}unregister(name){return this.tools.delete(name)}get(name){return this.tools.get(name)}list(){return[...this.tools.values()]}definitions(){return this.list().map((tool)=>createToolDefinition(tool.definition))}},sessionFileRevisions,EDIT_INPUT_MAX_CHARS=1e4,EditTool,MAX_EXEC_OUTPUT_FILE_BYTES=67108864,DEFAULT_YIELD_TIME_MS=1000,MAX_YIELD_TIME_MS=1e4,MAX_ACTIVE_PROCESSES_PER_SESSION=10,TERMINATE_GRACE_TIMEOUT_MS=250,OUTPUT_SETTLE_TIME_MS=25,ExecProcessManagerError,BuiltinExecProcessManager=class{sessions=new Map;notifications=new Map;disposingSessions=new Set;disposePromises=new Map;async execute(request){switch(request.action){case"start":return await this.start(request);case"poll":return await this.poll(request);case"terminate":return await this.terminate(request)}}async disposeSession(sessionId){let existing=this.disposePromises.get(sessionId);if(existing){await existing;return}let disposePromise=(async()=>{this.disposingSessions.add(sessionId);try{let entries=this.sessions.get(sessionId);if(!entries||entries.size===0){this.sessions.delete(sessionId),this.notifications.delete(sessionId);return}await Promise.allSettled([...entries.values()].map(async(entry)=>{if(clearTimeout(entry.timeoutHandle),entry.suppressNotifications=!0,readChildExitCode(entry.child.exitCode??void 0)!==void 0||entry.child.killed)return;entry.terminationReason="dispose",requestTerminate(entry),await waitForExit(entry,Date.now()+1000)})),this.sessions.delete(sessionId)}finally{this.notifications.delete(sessionId),this.disposingSessions.delete(sessionId),this.disposePromises.delete(sessionId)}})();this.disposePromises.set(sessionId,disposePromise),await disposePromise}async start(request){this.assertSessionNotDisposing(request.sessionId);let command=assertCommand(request.command),cwd=request.cwd??process.cwd(),timeoutMs=normalizeTimeoutMs(request.timeoutMs),yieldTimeMs=normalizeYieldTimeMs(request.yieldTimeMs),entries=this.getSessionEntries(request.sessionId);if(countActiveEntries(entries)>=MAX_ACTIVE_PROCESSES_PER_SESSION)throw new ExecProcessManagerError("exec_process_limit_exceeded",`Session ${request.sessionId} already has ${MAX_ACTIVE_PROCESSES_PER_SESSION} active exec processes.`);let processId=allocateProcessId(entries),outputRecord=createExecOutputStoreRecord({sessionId:request.sessionId,processId,rootDir:request.outputRoot}),startedAt=Date.now(),child=spawn(command[0],command.slice(1),{cwd,env:process.env,shell:!1,stdio:["ignore","pipe","pipe"]}),entry={id:processId,sessionId:request.sessionId,command:[...command],cwd,child,startedAt,timeoutMs,timedOut:!1,readOffset:0,waiters:new Set,notifyOnTerminal:!1,suppressNotifications:!1,...outputRecord};if(entries.set(processId,entry),attachChildListeners(entry),timeoutMs!==void 0)entry.timeoutHandle=setTimeout(()=>{entry.timedOut=!0,entry.terminationReason="timeout",requestTerminate(entry)},timeoutMs);if(request.runInBackground===!0)return this.markForNotification(entry),createProcessResult(entry,"",Date.now()-startedAt);let startedResult=await this.collect(entry,yieldTimeMs,request.signal);if(startedResult.status!=="running")this.deleteEntry(entry);else this.markForNotification(entry);return startedResult}async poll(request){this.assertSessionNotDisposing(request.sessionId);let processId=assertProcessId(request.processId),yieldTimeMs=normalizeYieldTimeMs(request.yieldTimeMs),entry=this.requireEntry(request.sessionId,processId),result=await this.collect(entry,yieldTimeMs,request.signal);if(result.status!=="running")this.deleteEntry(entry);else this.markForNotification(entry);return result}async terminate(request){this.assertSessionNotDisposing(request.sessionId);let processId=assertProcessId(request.processId),yieldTimeMs=normalizeYieldTimeMs(request.yieldTimeMs),entry=this.requireEntry(request.sessionId,processId);if(!entry.terminal)entry.terminationReason="user",requestTerminate(entry);let result=await this.collect(entry,yieldTimeMs,request.signal);if(result.status!=="running")this.deleteEntry(entry);return result}requireEntry(sessionId,processId){let entry=this.sessions.get(sessionId)?.get(processId);if(entry)return entry;throw new ExecProcessManagerError("exec_process_not_found",`Exec process ${processId} was not found for session ${sessionId}.`)}getSessionEntries(sessionId){let existing=this.sessions.get(sessionId);if(existing)return existing;let created=new Map;return this.sessions.set(sessionId,created),created}async collect(entry,yieldTimeMs,signal){let startedAt=Date.now(),deadline=startedAt+yieldTimeMs,observedOutputBytes=entry.outputBytes,observedOutputTruncated=entry.outputTruncated,quietDeadline;while(!entry.terminal&&Date.now()<deadline){if(entry.outputBytes!==observedOutputBytes||entry.outputTruncated!==observedOutputTruncated)observedOutputBytes=entry.outputBytes,observedOutputTruncated=entry.outputTruncated,quietDeadline=Math.min(deadline,Date.now()+OUTPUT_SETTLE_TIME_MS);if(quietDeadline!==void 0&&Date.now()>=quietDeadline)break;await waitForChange(entry,quietDeadline??deadline,signal)}let output=readExecOutputSince(entry,entry.readOffset);return entry.readOffset=output.nextOffset,createProcessResult(entry,output.text,Date.now()-startedAt)}deleteEntry(entry){clearTimeout(entry.timeoutHandle),clearTimeout(entry.terminateHandle);let entries=this.sessions.get(entry.sessionId);if(!entries)return;if(entries.delete(entry.id),entries.size===0&&!this.disposingSessions.has(entry.sessionId))this.sessions.delete(entry.sessionId)}assertSessionNotDisposing(sessionId){if(!this.disposingSessions.has(sessionId))return;throw new ExecProcessManagerError("exec_session_disposing",`Session ${sessionId} is disposing exec processes and cannot start, poll, or terminate commands right now.`)}markForNotification(entry){entry.notifyOnTerminal=!0,this.enqueueTerminalNotification(entry)}enqueueTerminalNotification(entry){if(!entry.notifyOnTerminal)return;if(entry.suppressNotifications)return;if(!entry.terminal)return;if(entry.notifiedAt!==void 0)return;entry.notifiedAt=Date.now();let notification=createTaskNotification(entry),queue=this.notifications.get(entry.sessionId)??[];queue.push(notification),this.notifications.set(entry.sessionId,queue)}completeTerminalEntry(entry){this.enqueueTerminalNotification(entry),this.deleteEntry(entry)}drainNotifications(sessionId){let notifications=this.notifications.get(sessionId)??[];return this.notifications.delete(sessionId),notifications}peekNotifications(sessionId){return[...this.notifications.get(sessionId)??[]]}},builtinExecProcessManager,EXEC_PREVIEW_SIZE_CHARS=2000,ExecTool,DEFAULT_TOOL_RESULT_MAX_CHARS=30000,TOOL_RESULT_PREVIEW_SIZE_CHARS=2000,PERSISTED_OUTPUT_TAG="<persisted-output>",DEFAULT_READ_OFFSET=1,DEFAULT_READ_LIMIT=2000,READ_RESULT_MAX_CHARS,TRUNCATED_LINE_SUFFIX="...",ReadTool,WriteTool,DefaultApprovalManager=class{handler;notifications;constructor(options={}){this.handler=options.handler,this.notifications=options.notifications}async requestApproval(request,context){let normalizedRequest={...request,id:request.id??createId("approval")};if(await this.notifications?.emit({type:"approval.requested",source:"approval",level:"warning",message:normalizedRequest.message,metadata:{approvalId:normalizedRequest.id,toolName:normalizedRequest.toolCall.function.name}},context),!this.handler){let denied={type:"denied",reason:"No approval handler configured"};return await this.notifications?.emit({type:"approval.denied",source:"approval",level:"warning",message:denied.reason,metadata:{approvalId:normalizedRequest.id,toolName:normalizedRequest.toolCall.function.name}},context),denied}let decision=await this.handler(normalizedRequest);return await this.notifications?.emit({type:decision.type==="approved"?"approval.approved":"approval.denied",source:"approval",level:decision.type==="approved"?"info":"warning",message:decision.type==="approved"?`Approved tool call: ${normalizedRequest.toolCall.function.name}`:decision.reason??`Denied tool call: ${normalizedRequest.toolCall.function.name}`,metadata:{approvalId:normalizedRequest.id,toolName:normalizedRequest.toolCall.function.name}},context),decision}},COMPACTION_INJECTION_MODE_METADATA_KEY="_dimCompactionInjectionMode",COMPACTION_INJECTION_ENVIRONMENT_METADATA_KEY="_dimCompactionInjectionEnvironmentText",DEFAULT_COMPACTION_RETAIN_MESSAGES=4,DEFAULT_COMPACTION_RESERVED_TOKENS=1024,DEFAULT_COMPACTION_SUMMARY_TOKEN_RESERVE=1024,DEFAULT_COMPACTION_SAFETY_RATIO=0.2,DEFAULT_OUTPUT_CAP_TOKENS=65536,MAX_PLANNED_OUTPUT_CONTEXT_RATIO=0.6,DefaultCompactionService=class{sessions=new Map;registerSession(state){state.compaction=normalizeCompactionState(state.compaction,state.messages),this.sessions.set(state.id,state)}unregisterSession(sessionId){this.sessions.delete(sessionId)}async getState(sessionId){return cloneCompactionState(this.requireSession(sessionId).compaction)}async apply(update){return applyCompactionUpdate(this.requireSession(update.sessionId),update)}async clear(sessionId){return clearCompactionState(this.requireSession(sessionId))}requireSession(sessionId){let state=this.sessions.get(sessionId);if(!state)throw Error(`Unknown session for compaction: ${sessionId}`);return state}},APP_PLUGIN_NAMESPACE="__agent__",DefaultPluginStateService=class{sessions=new Map;registerSession(state){state.pluginState=normalizePluginStateMap(state.pluginState),this.sessions.set(state.id,state)}unregisterSession(sessionId){this.sessions.delete(sessionId)}async get(sessionId){return this.getForPlugin(sessionId,APP_PLUGIN_NAMESPACE)}async replace(sessionId,entry){return this.replaceForPlugin(sessionId,APP_PLUGIN_NAMESPACE,entry)}async clear(sessionId){await this.clearForPlugin(sessionId,APP_PLUGIN_NAMESPACE)}async getForPlugin(sessionId,pluginId){return clonePluginSessionStateEntry(this.requireSession(sessionId).pluginState[pluginId])}async replaceForPlugin(sessionId,pluginId,entry){let state=this.requireSession(sessionId),nextEntry=normalizePluginSessionStateEntry(entry,`Plugin session state for ${pluginId}`);return state.pluginState={...state.pluginState,[pluginId]:nextEntry},touchRuntimeSessionState(state),structuredClone(nextEntry)}async clearForPlugin(sessionId,pluginId){let state=this.requireSession(sessionId);if(!(pluginId in state.pluginState))return;let nextState={...state.pluginState};delete nextState[pluginId],state.pluginState=nextState,touchRuntimeSessionState(state)}async list(sessionId){return clonePluginStateMap(this.requireSession(sessionId).pluginState)}requireSession(sessionId){let state=this.sessions.get(sessionId);if(!state)throw Error(`Unknown session for plugin state: ${sessionId}`);return state}},DefaultMessageFactory=class{createSystemMessage(input){let content=normalizeTextOnlyContent(input);return{id:createId("msg"),role:"system",content,createdAt:Date.now()}}createUserMessage(input,options){return{id:createId("msg"),role:"user",content:normalizeContent(input),createdAt:Date.now(),metadata:options?.metadata,providerOptions:options?.providerOptions}}createAssistantMessage(input){return{id:createId("msg"),role:"assistant",content:input.text.length>0?normalizeContent(input.text):[],createdAt:Date.now(),thinking:input.thinking,toolCalls:input.toolCalls.length>0?input.toolCalls:void 0,stopReason:input.stopReason,metadata:input.metadata}}createToolMessage(toolCall,result){return{id:createId("msg"),role:"tool",content:result.content,createdAt:Date.now(),toolCallId:toolCall.id,toolName:toolCall.function.name,structuredContent:result.structuredContent,isError:result.isError}}},DefaultNotificationBus=class{pluginHost;services;handler;onNotification;constructor(options){this.pluginHost=options.pluginHost,this.services=options.services,this.handler=options.handler,this.onNotification=options.onNotification}async emit(notification,context={}){let normalized={id:notification.id??createId("note"),level:notification.level??"info",...notification},operation=this.services.observability?.startOperation("notification","notification.emit",normalized,{sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration});try{if(!this.pluginHost){let handled2=this.handler?await this.handler(normalized,context):normalized;return await this.onNotification?.(handled2??normalized,context),operation?.success(handled2),handled2}let result=await this.pluginHost.runNotifyMessage({notification:normalized},{sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration,cwd:context.cwd,status:context.status,metadata:context.metadata,services:this.services});if(result.suppressed){await this.onNotification?.(normalized,context),operation?.success(void 0,{suppressed:!0});return}let payload=result.payload.notification;await this.pluginHost.runObservers("notify.message",result.payload,{sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration,cwd:context.cwd,status:context.status,metadata:context.metadata,services:this.services});let handled=this.handler?await this.handler(payload,context):payload;return await this.onNotification?.(handled??payload,context),operation?.success(handled),handled}catch(error){throw operation?.error(error),error}}},DefaultModelTurnCollector=class{async*collect(options){let assistantTextParts=[],thinkingParts=[],toolCalls=[],recoverableToolFailures=[],drafts=new Map,stopReason="final",responseUsage,assistantMetadata;for await(let event of options.events){if(await options.onEvent?.(event),event.type==="response_start")continue;if(event.type==="text_delta"){assistantTextParts.push(event.delta),yield{type:"text_delta",sessionId:options.sessionId,delta:event.delta};continue}if(event.type==="thinking_delta"){thinkingParts.push(event.delta),yield{type:"thinking_delta",sessionId:options.sessionId,delta:event.delta};continue}if(event.type==="tool_call_start"){drafts.set(event.callId,startToolCall(event.callId,event.toolName)),yield{type:"tool_call_start",sessionId:options.sessionId,callId:event.callId,toolName:event.toolName};continue}if(event.type==="tool_call_args_delta"){let draft=drafts.get(event.callId);if(!draft){recoverableToolFailures.push({code:"tool_call_state_error",callId:event.callId,message:`Received tool_call_args_delta before tool_call_start for ${event.callId}`,rawArgumentsText:event.delta}),stopReason="tool_call";break}drafts.set(event.callId,appendToolCallArgsDelta(draft,event.delta)),yield{type:"tool_call_args_delta",sessionId:options.sessionId,callId:event.callId,delta:event.delta};continue}if(event.type==="tool_call_end"){let draft=drafts.get(event.callId);if(!draft){recoverableToolFailures.push({code:"tool_call_state_error",callId:event.callId,message:`Received tool_call_end before tool_call_start for ${event.callId}`}),stopReason="tool_call";break}yield{type:"tool_call_end",sessionId:options.sessionId,callId:event.callId};try{toolCalls.push(finalizeToolCall(draft))}catch(error){recoverableToolFailures.push({code:"tool_call_parse_error",callId:event.callId,toolName:draft.toolName,message:error instanceof Error?error.message:String(error),rawArgumentsText:draft.argsText.trim()}),stopReason="tool_call";break}continue}if(event.type==="response_end"){stopReason=event.stopReason,responseUsage=event.usage,assistantMetadata=event.assistantMetadata;let sessionEvents2=await options.onResponseEnd?.(event);for(let sessionEvent of sessionEvents2??[])yield sessionEvent;continue}let sessionEvents=await options.onError?.(event);for(let sessionEvent of sessionEvents??[])yield sessionEvent;let payload={...event.error,requestId:options.requestId};throw yield{type:"error",sessionId:options.sessionId,error:payload},new SessionExecutionError(payload)}return{requestId:options.requestId,text:assistantTextParts.join(""),thinking:thinkingParts.join("")||void 0,toolCalls,recoverableToolFailures,stopReason,usage:responseUsage,assistantMetadata}}},SessionPersistenceCoordinator=class{stateStore;autosave;writeSnapshot;saveChain=Promise.resolve();constructor(options){this.stateStore=options.stateStore,this.autosave=options.autosave??"manual",this.writeSnapshot=options.writeSnapshot}save(){if(!this.stateStore)return Promise.resolve();return this.saveChain=this.saveChain.catch(()=>{return}).then(()=>this.writeSnapshot()),this.saveChain}scheduleQueueMutationSave(){if(!this.shouldAutosave("queue_mutation"))return;this.saveQuietly()}async persistRunTerminalStateQuietly(){if(!this.shouldAutosave("run_terminal"))return;await this.saveQuietly()}async persistEventBoundaryQuietly(){if(!this.shouldAutosave("event_boundary"))return;await this.saveQuietly()}shouldAutosave(reason){if(!this.stateStore)return!1;switch(reason){case"queue_mutation":return this.autosave==="manual"||this.autosave==="evented";case"run_terminal":return!0;case"event_boundary":return this.autosave==="evented"}}async saveQuietly(){try{await this.save()}catch{}}},DEFAULT_MESSAGE_QUEUE_CONFIG,SessionQueueRuntime=class{agentId;sessionId;state;observability;createErrorEvent;runItem;persistRunTerminalStateQuietly;scheduleQueueMutationSave;bufferedEvents=[];stateChangeWaiters=[];processingPromise;receiveActive=!1;activeReceiveSignal;haltProcessingUntilReceive=!1;activeRunCount=0;pendingSteerIds=[];disposed=!1;constructor(options){this.agentId=options.agentId,this.sessionId=options.sessionId,this.state=options.state,this.observability=options.observability,this.createErrorEvent=options.createErrorEvent,this.runItem=options.runItem,this.persistRunTerminalStateQuietly=options.persistRunTerminalStateQuietly,this.scheduleQueueMutationSave=options.scheduleQueueMutationSave}isProcessing(){return this.processingPromise!==void 0}isRunning(){return this.activeRunCount>0}send(input,options={}){this.assertNotDisposed("send");let item=prepareQueueItem("user",input,{...options,traceId:options.traceId??this.observability?.createTraceId()}),operation=this.observability?.startOperation("api","api.session.send",{content:item.input,options:{priority:item.priority,metadata:item.metadata}},{agentId:this.agentId,sessionId:this.sessionId,traceId:item.traceId,turnId:item.turnId});item.parentOperationId=operation?.operationId;try{return this.enqueuePreparedItem(item),operation?.success({itemId:item.id}),item.id}catch(error){throw operation?.error(error),error}}sendBatch(items){this.assertNotDisposed("sendBatch");let operation=this.observability?.startOperation("api","api.session.sendBatch",{items:items.map((item)=>({input:item.input,options:item.options}))},{agentId:this.agentId,sessionId:this.sessionId});try{let maxQueueSize=this.state.messageQueue.config.maxQueueSize;if(maxQueueSize!==void 0&&this.state.messageQueue.items.length+items.length>maxQueueSize)throw new SessionExecutionError(createQueueError("DIM_QUEUE_FULL",`Session queue is full (max ${maxQueueSize})`));let prepared=items.map(({input,options})=>{let item=prepareQueueItem("user",input,{...options,traceId:options?.traceId??this.observability?.createTraceId()});return item.parentOperationId=operation?.operationId,item}),beforeLength=this.state.messageQueue.items.length;for(let item of prepared)this.state.messageQueue.items.push(item);for(let[index,item]of prepared.entries())this.observability?.record({category:"state",event:"state.queue.items",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId,traceId:item.traceId,turnId:item.turnId,parentOperationId:item.parentOperationId},before:{length:beforeLength+index},after:{length:beforeLength+index+1},diff:{added:[{id:item.id,kind:item.kind,priority:item.priority}],batchSize:prepared.length}});if(prepared.length>0)this.onQueueMutated();let itemIds=prepared.map((item)=>item.id);return operation?.success({itemIds}),itemIds}catch(error){throw operation?.error(error),error}}steer(input,options={}){this.assertNotDisposed("steer");let activeTraceId=this.observability?.currentContext().traceId,traceId=options.traceId??activeTraceId??this.observability?.createTraceId(),metadata=options.metadata,operation=this.observability?.startOperation("api","api.session.steer",{content:input,options:{priority:options.priority,metadata}},{agentId:this.agentId,sessionId:this.sessionId,traceId});try{let maxQueueSize=this.state.messageQueue.config.maxQueueSize;if(maxQueueSize!==void 0&&this.state.messageQueue.items.length>=maxQueueSize)throw new SessionExecutionError(createQueueError("DIM_QUEUE_FULL",`Session queue is full (max ${maxQueueSize})`));let item=prepareQueueItem("steer",input,{...options,metadata,traceId});if(item.parentOperationId=operation?.operationId,this.enqueuePreparedItem(item,{deferAutoProcess:!0}),this.isRunning())this.pendingSteerIds.push(item.id);return operation?.success({itemId:item.id}),item.id}catch(error){throw operation?.error(error),error}}drainPendingSteer(){if(this.pendingSteerIds.length===0)return[];let ids=new Set(this.pendingSteerIds);this.pendingSteerIds.length=0;let segments=[];if(this.state.messageQueue.items=this.state.messageQueue.items.filter((item)=>{if(!ids.has(item.id))return!0;let text=contentToText(normalizeContent(item.input)).trim();if(text.length>0)segments.push(text);return!1}),segments.length>0)this.observability?.record({category:"state",event:"state.queue.items",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId},before:{pendingSteerIds:[...ids]},after:{pendingSteerIds:[]},diff:{drainedSteerCount:segments.length}}),touchRuntimeSessionState(this.state),this.notifyStateChange();return segments}cancelQueuedItem(itemId){this.assertNotDisposed("cancelQueuedItem");let index=this.state.messageQueue.items.findIndex((item)=>item.id===itemId);if(index<0)return!1;let[cancelled]=this.state.messageQueue.items.splice(index,1);return this.observability?.record({category:"state",event:"state.queue.items",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId,traceId:cancelled?.traceId,turnId:cancelled?.turnId},before:{length:this.state.messageQueue.items.length+1},after:{length:this.state.messageQueue.items.length},diff:{cancelled:{id:itemId,kind:cancelled?.kind}}}),this.onQueueMutated(),!0}getQueueStatus(){let items=[...this.state.messageQueue.items].sort(compareQueueItems).map((item)=>({id:item.id,kind:item.kind,priority:item.priority,enqueuedAt:item.enqueuedAt,preview:createQueuePreview(item.input)}));return{length:items.length,items,isProcessing:this.processingPromise!==void 0,config:cloneMessageQueueConfig(this.state.messageQueue.config)}}clearQueue(filter={}){this.assertNotDisposed("clearQueue");let before=this.state.messageQueue.items.length;if(!filter.kind)this.state.messageQueue.items=[];else this.state.messageQueue.items=this.state.messageQueue.items.filter((item)=>item.kind!==filter.kind);let cleared=before-this.state.messageQueue.items.length;if(cleared>0)this.observability?.record({category:"state",event:"state.queue.items",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId},before:{length:before},after:{length:this.state.messageQueue.items.length},diff:{cleared,filter}}),this.onQueueMutated();return cleared}async*receive(options={}){if(this.assertNotDisposed("receive"),this.receiveActive)throw new SessionExecutionError(createQueueError("DIM_QUEUE_BUSY","Only one receive() call can be active for a session"));this.receiveActive=!0,this.activeReceiveSignal=options.signal,this.haltProcessingUntilReceive=!1;let deliveredEvent;try{while(!0){if(deliveredEvent)deliveredEvent.ack(),deliveredEvent=void 0;this.ensureQueueProcessing("receive");let nextBufferedEvent=this.bufferedEvents.shift();if(nextBufferedEvent){deliveredEvent=nextBufferedEvent,yield nextBufferedEvent.event;continue}if(this.disposed)return;if(!this.processingPromise&&!this.hasRunnableItems())return;await this.waitForStateChange(options.signal)}}finally{if(deliveredEvent)deliveredEvent.ack();if(this.receiveActive=!1,this.activeReceiveSignal===options.signal)this.activeReceiveSignal=void 0;this.notifyStateChange()}}dispose(){if(this.disposed)return;this.disposed=!0;while(this.bufferedEvents.length>0)this.bufferedEvents.shift()?.ack();this.receiveActive=!1,this.activeReceiveSignal=void 0,this.haltProcessingUntilReceive=!0,this.notifyStateChange()}enqueuePreparedItem(item,options={}){let maxQueueSize=this.state.messageQueue.config.maxQueueSize;if(maxQueueSize!==void 0&&this.state.messageQueue.items.length>=maxQueueSize)throw new SessionExecutionError(createQueueError("DIM_QUEUE_FULL",`Session queue is full (max ${maxQueueSize})`));let beforeLength=this.state.messageQueue.items.length;this.state.messageQueue.items.push(item),this.observability?.record({category:"state",event:"state.queue.items",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId,traceId:item.traceId,turnId:item.turnId,parentOperationId:item.parentOperationId},before:{length:beforeLength},after:{length:this.state.messageQueue.items.length},diff:{added:[{id:item.id,kind:item.kind,priority:item.priority}]}}),this.onQueueMutated(options)}onQueueMutated(options={}){if(touchRuntimeSessionState(this.state),this.notifyStateChange(),this.scheduleQueueMutationSave(),options.deferAutoProcess){queueMicrotask(()=>this.ensureQueueProcessing("auto"));return}this.ensureQueueProcessing("auto")}hasRunnableItems(){return this.state.messageQueue.items.some((item)=>item.kind==="user"||item.kind==="steer")}ensureQueueProcessing(source){if(this.disposed)return;if(this.processingPromise)return;if(!this.hasRunnableItems())return;if(source==="auto"&&!this.state.messageQueue.config.autoProcessQueue)return;if(this.haltProcessingUntilReceive&&source!=="receive")return;let signal=source==="receive"?this.activeReceiveSignal:void 0;this.processingPromise=this.processQueue(signal).finally(()=>{if(this.processingPromise=void 0,this.notifyStateChange(),!this.disposed&&!this.haltProcessingUntilReceive&&this.state.messageQueue.config.autoProcessQueue)this.ensureQueueProcessing("auto")}),this.notifyStateChange()}async processQueue(signal){while(!0){if(this.disposed)return;let nextItem=this.dequeueNextRunnableItem();if(!nextItem)return;let completed=await this.processQueuedItem(nextItem,signal);if(await this.persistRunTerminalStateQuietly(),!completed){this.haltProcessingUntilReceive=!0;return}}}dequeueNextRunnableItem(){let steerItems=this.collectSteerItemsInEnqueueOrder(),userItem=this.findNextUserItem();if(userItem)return this.consumeQueueItems([userItem,...steerItems],{kind:userItem.kind,id:userItem.id,mergedSteerCount:steerItems.length}),{item:userItem,steerSegments:createSteerSegments(steerItems)};if(steerItems.length===0)return;let syntheticItem=createSyntheticSteerItem(steerItems);return this.consumeQueueItems(steerItems,{kind:"steer",id:syntheticItem.id,mergedSteerCount:steerItems.length}),{item:syntheticItem,steerSegments:[]}}collectSteerItemsInEnqueueOrder(){return this.state.messageQueue.items.filter((item)=>item.kind==="steer").sort(compareQueueItemsByEnqueueTime)}findNextUserItem(){return this.state.messageQueue.items.filter((item)=>item.kind==="user").sort(compareQueueItems)[0]}consumeQueueItems(items,synthetic){let consumedIds=new Set(items.map((item)=>item.id)),beforeLength=this.state.messageQueue.items.length;this.state.messageQueue.items=this.state.messageQueue.items.filter((item)=>!consumedIds.has(item.id)),touchRuntimeSessionState(this.state),this.observability?.record({category:"state",event:"state.queue.items",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId},before:{length:beforeLength},after:{length:this.state.messageQueue.items.length},diff:{consumed:items.map((item)=>({id:item.id,kind:item.kind})),synthetic}}),this.notifyStateChange()}async processQueuedItem(input,signal){let emittedError=!1,beforeRunCount=this.activeRunCount;this.activeRunCount+=1,input.item.traceId=input.item.traceId??this.observability?.createTraceId(),input.item.turnId=input.item.turnId??input.item.id;let operation=this.observability?.startOperation("api","api.session.receive",{itemId:input.item.id,source:"queue"},{agentId:this.agentId,sessionId:this.sessionId,traceId:input.item.traceId,turnId:input.item.turnId??input.item.id,parentOperationId:input.item.parentOperationId});this.observability?.record({category:"state",event:"state.queue.processing",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId,traceId:input.item.traceId,turnId:input.item.turnId,parentOperationId:operation?.operationId},before:{isProcessing:beforeRunCount>0,activeRunCount:beforeRunCount},after:{isProcessing:!0,activeRunCount:this.activeRunCount},diff:{itemId:input.item.id,source:"queue"}});try{let run=()=>this.runItem(input,signal,async(event)=>{if(this.disposed)return;let queuedEvent=this.attachQueueContext(event,input.item);if(this.recordSessionEvent(queuedEvent,input.item),queuedEvent.type==="error")emittedError=!0;await this.pushBufferedEvent(queuedEvent)});if(this.observability)await this.observability.withOperation(operation,run);else await run();return operation?.success({itemId:input.item.id,status:"done"}),!0}catch(error){if(operation?.error(error),!this.disposed&&!emittedError)await this.pushBufferedEvent(this.createErrorEvent(input.item,error));return!1}finally{let beforeRunCount2=this.activeRunCount;this.activeRunCount=Math.max(0,this.activeRunCount-1),this.pendingSteerIds.length=0,this.observability?.record({category:"state",event:"state.queue.processing",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId,traceId:input.item.traceId,turnId:input.item.turnId,parentOperationId:operation?.operationId},before:{isProcessing:beforeRunCount2>0,activeRunCount:beforeRunCount2},after:{isProcessing:this.activeRunCount>0,activeRunCount:this.activeRunCount},diff:{itemId:input.item.id,source:"queue"}}),this.notifyStateChange()}}recordSessionEvent(event,item){this.observability?.record({level:event.type==="error"?"error":"info",category:event.type==="turn_usage"?"usage":"api",event:event.type==="turn_usage"?"usage.turn.finalize":"api.session.receive.event",phase:"event",context:{agentId:this.agentId,sessionId:this.sessionId,traceId:item.traceId,turnId:item.turnId??item.id},output:createSessionReceiveEventLogOutput(event,this.observability?.shouldRecordStreamEventDetails()===!0)})}attachQueueContext(event,item){return{...event,itemId:item.id,itemKind:item.kind,priority:item.priority}}async pushBufferedEvent(event){if(this.disposed)return;let resolved=!1,ack=()=>{if(resolved)return;resolved=!0,this.notifyStateChange()};this.bufferedEvents.push({event,ack}),this.notifyStateChange();while(!resolved&&!this.disposed)await this.waitForStateChange();if(this.disposed)ack()}waitForStateChange(signal){if(signal?.aborted)return Promise.reject(new SessionExecutionError(createQueueError("session_receive_aborted","Session receive aborted")));return new Promise((resolve,reject)=>{let onAbort=()=>{cleanup(),reject(new SessionExecutionError(createQueueError("session_receive_aborted","Session receive aborted")))},resume=()=>{cleanup(),resolve()},cleanup=()=>{let index=this.stateChangeWaiters.indexOf(resume);if(index>=0)this.stateChangeWaiters.splice(index,1);signal?.removeEventListener("abort",onAbort)};this.stateChangeWaiters.push(resume),signal?.addEventListener("abort",onAbort,{once:!0})})}notifyStateChange(){while(this.stateChangeWaiters.length>0)this.stateChangeWaiters.shift()?.()}assertNotDisposed(operation){if(this.disposed)throw new SessionExecutionError(createQueueError("DIM_SESSION_DISPOSED",`Cannot ${operation} on disposed session ${this.sessionId}`))}},DefaultTerminationPolicy=class{afterAssistantTurn(toolCalls){return toolCalls.length===0?{type:"done"}:{type:"continue"}}onMaxIterationsExceeded(maxIterations,requestId){return{code:"max_iterations_exceeded",message:`Session exceeded maxIterations (${maxIterations})`,requestId}}},DefaultToolExecutor=class{sessionId;tools;dynamicToolProviders;hostDataDir;metadata;services;pluginHost;approvalManager;notificationBus;constructor(options){this.sessionId=options.sessionId,this.tools=options.tools,this.dynamicToolProviders=[...options.dynamicToolProviders??[]],this.hostDataDir=options.hostDataDir,this.metadata=options.metadata,this.services=options.services,this.pluginHost=options.pluginHost,this.approvalManager=options.approvalManager,this.notificationBus=options.notificationBus}async execute(toolCall,options={}){let operation=this.services.observability?.startOperation("tool","tool.call",{toolCallId:toolCall.id,toolName:toolCall.function.name,arguments:toolCall.function.arguments},{sessionId:this.sessionId,requestId:options.requestId,iteration:options.iteration});try{let result=this.services.observability?await this.services.observability.withOperation(operation,()=>this.executeInner(toolCall,options)):await this.executeInner(toolCall,options);return operation?.success({toolCallId:toolCall.id,toolName:toolCall.function.name,isError:result.isError===!0,content:result.content}),result}catch(error){throw operation?.error(error),error}}async executeInner(toolCall,options={}){let hookContext={sessionId:this.sessionId,requestId:options.requestId,iteration:options.iteration,cwd:options.cwd,hostDataDir:options.hostDataDir??this.hostDataDir,status:options.status,services:this.services,metadata:this.metadata},before=await this.pluginHost?.runToolBeforeExecute({toolCall},hookContext),currentToolCall=before?.payload.toolCall??toolCall,result;if(before?.control){if(before.control.type==="provideResult")result=createToolResult(before.control.result);else if(before.control.type==="deny")result=createToolResult(before.control.result??{...textToolResult(before.control.reason??`Tool denied: ${currentToolCall.function.name}`),isError:!0}),await this.notificationBus.emit({type:"tool.denied",source:"permission",level:"warning",message:before.control.reason??`Tool denied: ${currentToolCall.function.name}`,metadata:{toolName:currentToolCall.function.name}},hookContext);else if(before.control.type==="ask"){currentToolCall=before.control.toolCall??currentToolCall;let approvalRequest={id:void 0,kind:"tool_execution",toolCall:currentToolCall,message:before.control.request?.message??`Approval required to execute tool: ${currentToolCall.function.name}`,metadata:before.control.request?.metadata},approvalOperation=this.services.observability?.startOperation("approval","approval.request",approvalRequest,{sessionId:this.sessionId,requestId:options.requestId,iteration:options.iteration}),decision;try{decision=this.services.observability?await this.services.observability.withOperation(approvalOperation,()=>this.approvalManager.requestApproval(approvalRequest,hookContext)):await this.approvalManager.requestApproval(approvalRequest,hookContext),approvalOperation?.success(decision)}catch(error){throw approvalOperation?.error(error),error}if(decision.type==="denied")result=createToolResult({...textToolResult(decision.reason??`Tool approval denied: ${currentToolCall.function.name}`),isError:!0})}}if(!result){let tool=this.tools?.get(currentToolCall.function.name);if(tool)try{validateToolArguments(currentToolCall.function.arguments,tool.definition.inputSchema,currentToolCall.function.name),result=createToolResult(await tool.execute(currentToolCall.function.arguments,{sessionId:this.sessionId,cwd:options.cwd,hostDataDir:options.hostDataDir??this.hostDataDir,signal:options.signal,status:options.status,metadata:this.metadata,services:this.services,emitEvent:async(event)=>{let pluginId=event.pluginId;if(!pluginId)throw Error(`Tool ${currentToolCall.function.name} emitted a plugin event without pluginId`);await options.onEvent?.({type:"plugin_event",sessionId:this.sessionId,pluginId,event:event.event,data:event.data?structuredClone(event.data):void 0})}}))}catch(error){result=createToolResult({...textToolResult(error instanceof Error?error.message:String(error)),isError:!0})}else if(result=await this.executeDynamicTool(currentToolCall,options),!result)result=createToolResult({...textToolResult(`Tool not found: ${currentToolCall.function.name}`),isError:!0})}let budgetedResult=await budgetToolResult({result:createToolResult((await this.pluginHost?.runMiddleware("tool.afterExecute",{toolCall:currentToolCall,result},hookContext))?.result??result),sessionId:this.sessionId,toolCallId:currentToolCall.id,hostDataDir:options.hostDataDir??this.hostDataDir,maxResultSizeChars:options.maxResultSizeChars??this.tools?.get(currentToolCall.function.name)?.definition.maxResultSizeChars});return await this.notificationBus.emit({type:budgetedResult.isError?"tool.failed":"tool.completed",source:"tool",level:budgetedResult.isError?"error":"info",message:budgetedResult.isError?`Tool failed: ${currentToolCall.function.name}`:`Tool completed: ${currentToolCall.function.name}`,metadata:{toolName:currentToolCall.function.name,isError:budgetedResult.isError===!0}},hookContext),budgetedResult}async executeDynamicTool(toolCall,options){for(let provider of this.dynamicToolProviders){if(!provider.hasTool(toolCall.function.name))continue;try{return createToolResult(await provider.executeTool(toolCall.function.name,toolCall.function.arguments,{sessionId:this.sessionId,cwd:options.cwd,hostDataDir:options.hostDataDir??this.hostDataDir,signal:options.signal,status:options.status,metadata:this.metadata,services:this.services,emitEvent:async(event)=>{let pluginId=event.pluginId;if(!pluginId)throw Error(`Dynamic tool ${toolCall.function.name} emitted a plugin event without pluginId`);await options.onEvent?.({type:"plugin_event",sessionId:this.sessionId,pluginId,event:event.event,data:event.data?structuredClone(event.data):void 0})}}))}catch(error){return createToolResult({...textToolResult(error instanceof Error?error.message:String(error)),isError:!0})}}}},CONTEXT_WINDOW_ERROR_CODES,CONTEXT_WINDOW_ERROR_PHRASES,UNKNOWN_RECOVERABLE_TOOL_NAME="_unknown",MAX_RAW_ARGUMENTS_PREVIEW=200,TOOL_CALL_JSON_CONTRACT_PROMPT,EXEC_MANAGED_TASK_PROMPT,DEFAULT_SESSION_MAX_OUTPUT_TOKENS=4000,LoopRunner=class{messageFactory;turnCollector;toolExecutor;terminationPolicy;dynamicToolProviders;hostDataDir;pluginHost;notificationBus;runCompaction;runLastMessageFallbackCompaction;usageLedgerManager;observability;constructor(dependencies){this.messageFactory=dependencies.messageFactory,this.turnCollector=dependencies.turnCollector,this.toolExecutor=dependencies.toolExecutor,this.terminationPolicy=dependencies.terminationPolicy,this.dynamicToolProviders=[...dependencies.dynamicToolProviders??[]],this.hostDataDir=dependencies.hostDataDir,this.pluginHost=dependencies.pluginHost,this.notificationBus=dependencies.notificationBus,this.runCompaction=dependencies.runCompaction,this.runLastMessageFallbackCompaction=dependencies.runLastMessageFallbackCompaction,this.usageLedgerManager=dependencies.usageLedgerManager,this.observability=dependencies.observability}async*run(state,input,options={}){let startedRun=await this.startRun(state,input,options.messageMetadata),lastRequestId,lastIteration=0,lastPrimaryRequestId,pendingContextSegments=[];try{let contextWindowRetried=!1;for(let iteration=0;iteration<state.maxIterations;iteration+=1){lastIteration=iteration;let prepared=await this.prepareTurn(state,startedRun.initialInput,iteration,lastPrimaryRequestId,pendingContextSegments,options,startedRun.userMessageIndex);lastRequestId=prepared.requestId,pendingContextSegments=[];let turn;try{turn=yield*this.executeModelTurn(state,prepared)}catch(error){if(!contextWindowRetried&&isContextWindowExceededError(error)){contextWindowRetried=!0,markContextSizeStale(state),state.forceCompactNextRequest=!0,iteration-=1;continue}throw error}lastPrimaryRequestId=prepared.requestId;let finalized=await this.finalizeAssistantTurn(state,prepared,turn);if(finalized.type==="done"){let completed=await this.completeRun(state,prepared,finalized.message,finalized.assistantIndex,options);return yield{type:"turn_usage",sessionId:state.id,turnId:completed.usageSummary.turnId,summary:completed.usageSummary},yield{type:"done",sessionId:state.id,message:completed.message,usage:completed.usage},completed.message}if(finalized.type==="done_after_tools"){yield*this.executeToolPhase(state,prepared,turn,options);let completed=await this.completeRun(state,prepared,finalized.message,finalized.assistantIndex,options);return yield{type:"turn_usage",sessionId:state.id,turnId:completed.usageSummary.turnId,summary:completed.usageSummary},yield{type:"done",sessionId:state.id,message:completed.message,usage:completed.usage},completed.message}if(finalized.additionalContext.length>0)pendingContextSegments=[...finalized.additionalContext];yield*this.executeToolPhase(state,prepared,turn,options);let steerSegments=options.drainPendingSteer?.()??[];if(steerSegments.length>0){let steerText=steerSegments.join(`
|
|
40
|
+
`:"").trim()||void 0}catch{return}}},DEFAULT_STATE_STORE_LIST_LIMIT=50,MAX_STATE_STORE_LIST_LIMIT=200,FileStateStore=class{directory;constructor(options){this.directory=path4.resolve(options.directory)}async save(input){let validatedSnapshot=sessionSnapshotCodec.decode(input.snapshot),usageLedger=validateSaveUsageLedger$1(validatedSnapshot,input.usageLedger),serialized=sessionSnapshotCodec.serialize({...validatedSnapshot,usageLedger:void 0});await mkdir3(this.directory,{recursive:!0}),await writeFile3(this.filePath(validatedSnapshot.sessionId),JSON.stringify(serialized,null,2),"utf8"),await writeFile3(this.usageLedgerFilePath(validatedSnapshot.sessionId),JSON.stringify(usageLedger,null,2),"utf8")}async load(sessionId){try{let raw=await readFile3(this.filePath(sessionId),"utf8"),snapshot=sessionSnapshotCodec.decode(JSON.parse(raw));return hydrateSnapshot$1(snapshot,await this.loadUsageLedger(sessionId,snapshot.usageLedger))}catch(error){if(error.code==="ENOENT")return;throw error}}async delete(sessionId){await rm(this.filePath(sessionId),{force:!0}),await rm(this.usageLedgerFilePath(sessionId),{force:!0})}async list(options){await mkdir3(this.directory,{recursive:!0});let listOptions=normalizeStateStoreListOptions(options),entries=await readdir(this.directory,{withFileTypes:!0}),files=[],snapshots=[];for(let entry of entries){if(!entry.isFile()||!isSnapshotFileName(entry.name))continue;let filePath=path4.join(this.directory,entry.name),modifiedAt;try{modifiedAt=(await stat(filePath)).mtimeMs}catch(error){if(error.code==="ENOENT")continue;throw error}files.push({filePath,sessionId:decodeSessionIdFromFileName(entry.name),modifiedAt})}let{page,nextCursor}=applyStateStoreListPagination(files.sort(compareSnapshotFileEntries),listOptions);for(let entry of page){let raw=await readFile3(entry.filePath,"utf8");snapshots.push(sessionSnapshotCodec.decode(JSON.parse(raw)))}return{snapshots,nextCursor}}filePath(sessionId){return path4.join(this.directory,`${encodeURIComponent(sessionId)}.json`)}usageLedgerFilePath(sessionId){return path4.join(this.directory,`${encodeURIComponent(sessionId)}.usage.json`)}async loadUsageLedger(sessionId,inlineUsageLedger){try{let raw=await readFile3(this.usageLedgerFilePath(sessionId),"utf8");return structuredClone(JSON.parse(raw))}catch(error){if(error.code==="ENOENT")return inlineUsageLedger?structuredClone(inlineUsageLedger):void 0;throw error}}},InMemoryStateStore=class{snapshots=new Map;usageLedgers=new Map;modifiedAtBySessionId=new Map;modifiedAtSequence=0;async save(input){let validated=sessionSnapshotCodec.decode(input.snapshot),usageLedger=validateSaveUsageLedger(validated,input.usageLedger);this.snapshots.set(validated.sessionId,sessionSnapshotCodec.decode(sessionSnapshotCodec.serialize({...validated,usageLedger:void 0}))),this.usageLedgers.set(validated.sessionId,usageLedger),this.modifiedAtBySessionId.set(validated.sessionId,this.nextModifiedAt())}async load(sessionId){let snapshot=this.snapshots.get(sessionId);if(!snapshot)return;return hydrateSnapshot(snapshot,this.usageLedgers.get(sessionId)??snapshot.usageLedger)}async delete(sessionId){this.snapshots.delete(sessionId),this.usageLedgers.delete(sessionId),this.modifiedAtBySessionId.delete(sessionId)}async list(options){let listOptions=normalizeStateStoreListOptions(options),{page,nextCursor}=applyStateStoreListPagination([...this.snapshots.entries()].map(([sessionId,snapshot])=>({sessionId,snapshot,modifiedAt:this.modifiedAtBySessionId.get(sessionId)??0})).sort(compareSnapshotEntries),listOptions);return{snapshots:page.map((entry)=>sessionSnapshotCodec.decode(entry.snapshot)),nextCursor}}nextModifiedAt(){return this.modifiedAtSequence+=1,this.modifiedAtSequence}},DefaultInspectGateway=class{options;constructor(options){this.options=options}async getAgentSnapshot(){return{agentId:this.options.agentId,cwd:this.options.cwd,model:structuredClone(this.options.model),capabilities:this.options.capabilities?structuredClone(this.options.capabilities):void 0,reasoning:this.options.reasoning?structuredClone(this.options.reasoning):void 0,cache:this.options.cache?structuredClone(this.options.cache):void 0,compaction:this.options.compaction?structuredClone(this.options.compaction):void 0,permissions:this.options.permissions?{...this.options.permissions}:void 0,includeBuiltinTools:this.options.includeBuiltinTools,persistence:{autosave:this.options.autosave,hostDataDir:this.options.hostDataDir,stateStore:describeStateStore(this.options.stateStore)},plugins:await this.options.getPluginSnapshots()}}async listLiveSessions(){return this.options.getLiveSessions()}async listPersistedSessions(options){if(!this.options.stateStore)return{sessions:[]};let page=await this.options.stateStore.list(options);return{sessions:page.snapshots.map((snapshot)=>({sessionId:snapshot.sessionId,model:snapshot.model?structuredClone(snapshot.model):void 0,cwd:snapshot.cwd,messageCount:snapshot.messages.length,pluginIds:Object.keys(snapshot.pluginState??{}).sort(),createdAt:snapshot.createdAt,updatedAt:snapshot.updatedAt,queuedItemCount:snapshot.messageQueue?.items.length??0})),nextCursor:page.nextCursor}}async loadPersistedSession(sessionId){if(!this.options.stateStore)return;let snapshot=await this.options.stateStore.load(sessionId);return snapshot?structuredClone(snapshot):void 0}},DefaultLoggerGateway=class DefaultLoggerGateway2{handler;context;constructor(options={}){this.handler=options.handler,this.context=cloneLogContext(options.context)}withContext(context){return new DefaultLoggerGateway2({handler:this.handler,context:mergeLogContext(this.context,context)})}emit(entry){if(!this.handler)return;try{let result=this.handler(cloneLogEntry(entry),cloneLogContext(this.context));if(isPromiseLike(result))Promise.resolve(result).catch(()=>{return})}catch{}}},DefaultModelGateway=class{model;beginUsage;constructor(model,options={}){this.model=model,this.beginUsage=options.beginUsage}async*stream(request,options={}){let effectiveRequest=request.requestId?request:{...request,requestId:crypto.randomUUID()},usageHandle=options.usage?this.beginUsage?.(effectiveRequest,options.usage):void 0,completed=!1;for await(let event of this.model.stream(effectiveRequest)){if(event.type==="response_end")usageHandle?.complete({requestId:event.requestId,status:event.stopReason==="cancelled"?"cancelled":event.stopReason==="error"?"error":"completed",usage:event.usage,rawUsage:event.rawUsage,cost:event.cost}),completed=!0;else if(event.type==="error")usageHandle?.complete({requestId:event.requestId,status:"error"}),completed=!0;yield event}if(!completed&&effectiveRequest.requestId)usageHandle?.complete({requestId:effectiveRequest.requestId,status:"completed"})}},DefaultNetworkGateway=class{fetchImpl;constructor(fetchImpl=globalThis.fetch){this.fetchImpl=fetchImpl}fetch(input,init){return this.fetchImpl(input,init)}},fullPermissions,PermissionDeniedError,PermissionGateway=class{permissions;constructor(options={}){this.permissions=normalizePermissions(options.permissions)}get agentPermissions(){return{...this.permissions}}scopeServices(services,pluginId,requested){let effective=intersectPermissions(this.permissions,requested),pluginState=services.pluginState;return{fileSystem:{readText:(path5,options)=>{if(!canReadFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to read files`);return services.fileSystem.readText(path5,options)},readBytes:(path5,options)=>{if(!canReadFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to read files`);return services.fileSystem.readBytes(path5,options)},writeText:(path5,content,options)=>{if(!canWriteFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to write files`);return services.fileSystem.writeText(path5,content,options)},editText:(path5,options)=>{if(!canWriteFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to edit files`);return services.fileSystem.editText(path5,options)},exists:(path5,options)=>{if(!canReadFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to inspect files`);return services.fileSystem.exists(path5,options)},glob:(pattern,options)=>{if(!canReadFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to glob files`);return services.fileSystem.glob(pattern,options)},grep:(query,options)=>{if(!canReadFs(effective))throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to grep files`);return services.fileSystem.grep(query,options)}},exec:{execute:(command,options)=>{if(effective.process!==!0)throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to execute commands`);return services.exec.execute(command,options)}},git:{status:(options)=>{if(effective.git!==!0)throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to inspect git state`);return services.git.status(options)},diff:(options)=>{if(effective.git!==!0)throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to inspect git diff`);return services.git.diff(options)}},network:{fetch:(input,init)=>{if(effective.network!==!0)throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to access the network`);return services.network.fetch(input,init)}},logger:bindLoggerContext(services.logger,{pluginId}),model:{stream:(request,options)=>{if(effective.model!==!0)throw new PermissionDeniedError(`Plugin ${pluginId} is not allowed to call the model gateway`);return services.model.stream(request,options)}},compaction:{getState:(sessionId)=>services.compaction.getState(sessionId)},pluginState:{get:(sessionId)=>pluginState.getForPlugin(sessionId,pluginId),replace:(sessionId,entry)=>pluginState.replaceForPlugin(sessionId,pluginId,entry),clear:(sessionId)=>pluginState.clearForPlugin(sessionId,pluginId)},inspect:services.inspect}}},BaseTool=class{definition;constructor(definition){this.definition={...definition,inputSchema:createToolSchema(definition.inputSchema)}}},ToolRegistry=class ToolRegistry2{tools;constructor(tools=new Map){this.tools=tools}register(tool){let name=tool.definition.name.trim();if(!name)throw Error("Tool name is required");if(this.tools.has(name))throw Error(`Tool already registered: ${name}`);let normalizedTool={definition:createToolDefinition({...tool.definition,name}),execute(args,context){return tool.execute(args,context)}};return this.tools.set(name,normalizedTool),new ToolRegistry2(this.tools)}unregister(name){return this.tools.delete(name)}get(name){return this.tools.get(name)}list(){return[...this.tools.values()]}definitions(){return this.list().map((tool)=>createToolDefinition(tool.definition))}},sessionFileRevisions,EDIT_INPUT_MAX_CHARS=1e4,EditTool,MAX_EXEC_OUTPUT_FILE_BYTES=67108864,DEFAULT_WAIT_TIME_MS=5000,MAX_WAIT_TIME_MS=1e4,MAX_ACTIVE_PROCESSES_PER_SESSION=10,TERMINATE_GRACE_TIMEOUT_MS=250,ExecProcessManagerError,BuiltinExecProcessManager=class{sessions=new Map;notifications=new Map;disposingSessions=new Set;disposePromises=new Map;async execute(request){switch(request.action){case"start":return await this.start(request);case"terminate":return await this.terminate(request);default:throw new ExecProcessManagerError("exec_invalid_request",`exec action ${String(request.action)} is not supported.`)}}async disposeSession(sessionId){let existing=this.disposePromises.get(sessionId);if(existing){await existing;return}let disposePromise=(async()=>{this.disposingSessions.add(sessionId);try{let entries=this.sessions.get(sessionId);if(!entries||entries.size===0){this.sessions.delete(sessionId),this.notifications.delete(sessionId);return}await Promise.allSettled([...entries.values()].map(async(entry)=>{if(clearTimeout(entry.timeoutHandle),entry.suppressNotifications=!0,readChildExitCode(entry.child.exitCode??void 0)!==void 0||entry.child.killed)return;entry.terminationReason="dispose",requestTerminate(entry),await waitForExit(entry,Date.now()+1000)})),this.sessions.delete(sessionId)}finally{this.notifications.delete(sessionId),this.disposingSessions.delete(sessionId),this.disposePromises.delete(sessionId)}})();this.disposePromises.set(sessionId,disposePromise),await disposePromise}async start(request){this.assertSessionNotDisposing(request.sessionId);let command=assertCommand(request.command),cwd=request.cwd??process.cwd(),timeoutMs=normalizeTimeoutMs(request.timeoutMs),waitTimeMs=normalizeWaitTimeMs(request.waitTimeMs),entries=this.getSessionEntries(request.sessionId);if(countActiveEntries(entries)>=MAX_ACTIVE_PROCESSES_PER_SESSION)throw new ExecProcessManagerError("exec_process_limit_exceeded",`Session ${request.sessionId} already has ${MAX_ACTIVE_PROCESSES_PER_SESSION} active exec processes.`);let taskId=allocateTaskId(entries),outputRecord=createExecOutputStoreRecord({sessionId:request.sessionId,taskId,rootDir:request.outputRoot}),startedAt=Date.now(),child=spawn(command[0],command.slice(1),{cwd,env:process.env,shell:!1,stdio:["ignore","pipe","pipe"]}),entry={taskId,sessionId:request.sessionId,command:[...command],cwd,child,startedAt,timeoutMs,timedOut:!1,readOffset:0,waiters:new Set,notifyOnTerminal:!1,suppressNotifications:!1,...outputRecord};if(entries.set(taskId,entry),attachChildListeners(entry),timeoutMs!==void 0)entry.timeoutHandle=setTimeout(()=>{entry.timedOut=!0,entry.terminationReason="timeout",requestTerminate(entry)},timeoutMs);if(request.runInBackground===!0)return this.markForNotification(entry),createProcessResult(entry,"",Date.now()-startedAt);let startedResult=await this.collect(entry,waitTimeMs,request.signal);if(startedResult.status!=="running")this.deleteEntry(entry);else this.markForNotification(entry);return startedResult}async terminate(request){this.assertSessionNotDisposing(request.sessionId);let taskId=assertTaskId(request.taskId),waitTimeMs=normalizeWaitTimeMs(request.waitTimeMs),entry=this.requireEntry(request.sessionId,taskId);if(!entry.terminal)entry.terminationReason="user",requestTerminate(entry);let result=await this.collect(entry,waitTimeMs,request.signal);if(result.status!=="running")this.deleteEntry(entry);return result}requireEntry(sessionId,taskId){let entry=this.sessions.get(sessionId)?.get(taskId);if(entry)return entry;throw new ExecProcessManagerError("exec_process_not_found",`Exec task ${taskId} was not found for session ${sessionId}.`)}getSessionEntries(sessionId){let existing=this.sessions.get(sessionId);if(existing)return existing;let created=new Map;return this.sessions.set(sessionId,created),created}async collect(entry,waitTimeMs,signal){let startedAt=Date.now(),deadline=startedAt+waitTimeMs;while(!entry.terminal&&Date.now()<deadline)await waitForChange(entry,deadline,signal);let output=readExecOutputSince(entry,entry.readOffset);return entry.readOffset=output.nextOffset,createProcessResult(entry,output.text,Date.now()-startedAt)}deleteEntry(entry){clearTimeout(entry.timeoutHandle),clearTimeout(entry.terminateHandle);let entries=this.sessions.get(entry.sessionId);if(!entries)return;if(entries.delete(entry.taskId),entries.size===0&&!this.disposingSessions.has(entry.sessionId))this.sessions.delete(entry.sessionId)}assertSessionNotDisposing(sessionId){if(!this.disposingSessions.has(sessionId))return;throw new ExecProcessManagerError("exec_session_disposing",`Session ${sessionId} is disposing exec processes and cannot start or terminate commands right now.`)}markForNotification(entry){entry.notifyOnTerminal=!0,this.enqueueTerminalNotification(entry)}enqueueTerminalNotification(entry){if(!entry.notifyOnTerminal)return;if(entry.suppressNotifications)return;if(!entry.terminal)return;if(entry.notifiedAt!==void 0)return;entry.notifiedAt=Date.now();let notification=createTaskNotification(entry),queue=this.notifications.get(entry.sessionId)??[];queue.push(notification),this.notifications.set(entry.sessionId,queue)}completeTerminalEntry(entry){this.enqueueTerminalNotification(entry),this.deleteEntry(entry)}drainNotifications(sessionId){let notifications=this.notifications.get(sessionId)??[];return this.notifications.delete(sessionId),notifications}peekNotifications(sessionId){return[...this.notifications.get(sessionId)??[]]}},builtinExecProcessManager,EXEC_PREVIEW_SIZE_CHARS=2000,ExecTool,DEFAULT_TOOL_RESULT_MAX_CHARS=30000,TOOL_RESULT_PREVIEW_SIZE_CHARS=2000,PERSISTED_OUTPUT_TAG="<persisted-output>",DEFAULT_READ_OFFSET=1,DEFAULT_READ_LIMIT=2000,READ_RESULT_MAX_CHARS,TRUNCATED_LINE_SUFFIX="...",ReadTool,WriteTool,DefaultApprovalManager=class{handler;notifications;constructor(options={}){this.handler=options.handler,this.notifications=options.notifications}async requestApproval(request,context){let normalizedRequest={...request,id:request.id??createId("approval")};if(await this.notifications?.emit({type:"approval.requested",source:"approval",level:"warning",message:normalizedRequest.message,metadata:{approvalId:normalizedRequest.id,toolName:normalizedRequest.toolCall.function.name}},context),!this.handler){let denied={type:"denied",reason:"No approval handler configured"};return await this.notifications?.emit({type:"approval.denied",source:"approval",level:"warning",message:denied.reason,metadata:{approvalId:normalizedRequest.id,toolName:normalizedRequest.toolCall.function.name}},context),denied}let decision=await this.handler(normalizedRequest);return await this.notifications?.emit({type:decision.type==="approved"?"approval.approved":"approval.denied",source:"approval",level:decision.type==="approved"?"info":"warning",message:decision.type==="approved"?`Approved tool call: ${normalizedRequest.toolCall.function.name}`:decision.reason??`Denied tool call: ${normalizedRequest.toolCall.function.name}`,metadata:{approvalId:normalizedRequest.id,toolName:normalizedRequest.toolCall.function.name}},context),decision}},COMPACTION_INJECTION_MODE_METADATA_KEY="_dimCompactionInjectionMode",COMPACTION_INJECTION_ENVIRONMENT_METADATA_KEY="_dimCompactionInjectionEnvironmentText",DEFAULT_COMPACTION_RETAIN_MESSAGES=4,DEFAULT_COMPACTION_RESERVED_TOKENS=1024,DEFAULT_COMPACTION_SUMMARY_TOKEN_RESERVE=1024,DEFAULT_COMPACTION_SAFETY_RATIO=0.2,DEFAULT_OUTPUT_CAP_TOKENS=65536,MAX_PLANNED_OUTPUT_CONTEXT_RATIO=0.6,DefaultCompactionService=class{sessions=new Map;registerSession(state){state.compaction=normalizeCompactionState(state.compaction,state.messages),this.sessions.set(state.id,state)}unregisterSession(sessionId){this.sessions.delete(sessionId)}async getState(sessionId){return cloneCompactionState(this.requireSession(sessionId).compaction)}async apply(update){return applyCompactionUpdate(this.requireSession(update.sessionId),update)}async clear(sessionId){return clearCompactionState(this.requireSession(sessionId))}requireSession(sessionId){let state=this.sessions.get(sessionId);if(!state)throw Error(`Unknown session for compaction: ${sessionId}`);return state}},APP_PLUGIN_NAMESPACE="__agent__",DefaultPluginStateService=class{sessions=new Map;registerSession(state){state.pluginState=normalizePluginStateMap(state.pluginState),this.sessions.set(state.id,state)}unregisterSession(sessionId){this.sessions.delete(sessionId)}async get(sessionId){return this.getForPlugin(sessionId,APP_PLUGIN_NAMESPACE)}async replace(sessionId,entry){return this.replaceForPlugin(sessionId,APP_PLUGIN_NAMESPACE,entry)}async clear(sessionId){await this.clearForPlugin(sessionId,APP_PLUGIN_NAMESPACE)}async getForPlugin(sessionId,pluginId){return clonePluginSessionStateEntry(this.requireSession(sessionId).pluginState[pluginId])}async replaceForPlugin(sessionId,pluginId,entry){let state=this.requireSession(sessionId),nextEntry=normalizePluginSessionStateEntry(entry,`Plugin session state for ${pluginId}`);return state.pluginState={...state.pluginState,[pluginId]:nextEntry},touchRuntimeSessionState(state),structuredClone(nextEntry)}async clearForPlugin(sessionId,pluginId){let state=this.requireSession(sessionId);if(!(pluginId in state.pluginState))return;let nextState={...state.pluginState};delete nextState[pluginId],state.pluginState=nextState,touchRuntimeSessionState(state)}async list(sessionId){return clonePluginStateMap(this.requireSession(sessionId).pluginState)}requireSession(sessionId){let state=this.sessions.get(sessionId);if(!state)throw Error(`Unknown session for plugin state: ${sessionId}`);return state}},DefaultMessageFactory=class{createSystemMessage(input){let content=normalizeTextOnlyContent(input);return{id:createId("msg"),role:"system",content,createdAt:Date.now()}}createUserMessage(input,options){return{id:createId("msg"),role:"user",content:normalizeContent(input),createdAt:Date.now(),metadata:options?.metadata,providerOptions:options?.providerOptions}}createAssistantMessage(input){return{id:createId("msg"),role:"assistant",content:input.text.length>0?normalizeContent(input.text):[],createdAt:Date.now(),thinking:input.thinking,toolCalls:input.toolCalls.length>0?input.toolCalls:void 0,stopReason:input.stopReason,metadata:input.metadata}}createToolMessage(toolCall,result){return{id:createId("msg"),role:"tool",content:result.content,createdAt:Date.now(),toolCallId:toolCall.id,toolName:toolCall.function.name,structuredContent:result.structuredContent,isError:result.isError}}},DefaultNotificationBus=class{pluginHost;services;handler;onNotification;constructor(options){this.pluginHost=options.pluginHost,this.services=options.services,this.handler=options.handler,this.onNotification=options.onNotification}async emit(notification,context={}){let normalized={id:notification.id??createId("note"),level:notification.level??"info",...notification},operation=this.services.observability?.startOperation("notification","notification.emit",normalized,{sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration});try{if(!this.pluginHost){let handled2=this.handler?await this.handler(normalized,context):normalized;return await this.onNotification?.(handled2??normalized,context),operation?.success(handled2),handled2}let result=await this.pluginHost.runNotifyMessage({notification:normalized},{sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration,cwd:context.cwd,status:context.status,metadata:context.metadata,services:this.services});if(result.suppressed){await this.onNotification?.(normalized,context),operation?.success(void 0,{suppressed:!0});return}let payload=result.payload.notification;await this.pluginHost.runObservers("notify.message",result.payload,{sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration,cwd:context.cwd,status:context.status,metadata:context.metadata,services:this.services});let handled=this.handler?await this.handler(payload,context):payload;return await this.onNotification?.(handled??payload,context),operation?.success(handled),handled}catch(error){throw operation?.error(error),error}}},DefaultModelTurnCollector=class{async*collect(options){let assistantTextParts=[],thinkingParts=[],toolCalls=[],recoverableToolFailures=[],drafts=new Map,stopReason="final",responseUsage,assistantMetadata;for await(let event of options.events){if(await options.onEvent?.(event),event.type==="response_start")continue;if(event.type==="text_delta"){assistantTextParts.push(event.delta),yield{type:"text_delta",sessionId:options.sessionId,delta:event.delta};continue}if(event.type==="thinking_delta"){thinkingParts.push(event.delta),yield{type:"thinking_delta",sessionId:options.sessionId,delta:event.delta};continue}if(event.type==="tool_call_start"){drafts.set(event.callId,startToolCall(event.callId,event.toolName)),yield{type:"tool_call_start",sessionId:options.sessionId,callId:event.callId,toolName:event.toolName};continue}if(event.type==="tool_call_args_delta"){let draft=drafts.get(event.callId);if(!draft){recoverableToolFailures.push({code:"tool_call_state_error",callId:event.callId,message:`Received tool_call_args_delta before tool_call_start for ${event.callId}`,rawArgumentsText:event.delta}),stopReason="tool_call";break}drafts.set(event.callId,appendToolCallArgsDelta(draft,event.delta)),yield{type:"tool_call_args_delta",sessionId:options.sessionId,callId:event.callId,delta:event.delta};continue}if(event.type==="tool_call_end"){let draft=drafts.get(event.callId);if(!draft){recoverableToolFailures.push({code:"tool_call_state_error",callId:event.callId,message:`Received tool_call_end before tool_call_start for ${event.callId}`}),stopReason="tool_call";break}yield{type:"tool_call_end",sessionId:options.sessionId,callId:event.callId};try{toolCalls.push(finalizeToolCall(draft))}catch(error){recoverableToolFailures.push({code:"tool_call_parse_error",callId:event.callId,toolName:draft.toolName,message:error instanceof Error?error.message:String(error),rawArgumentsText:draft.argsText.trim()}),stopReason="tool_call";break}continue}if(event.type==="response_end"){stopReason=event.stopReason,responseUsage=event.usage,assistantMetadata=event.assistantMetadata;let sessionEvents2=await options.onResponseEnd?.(event);for(let sessionEvent of sessionEvents2??[])yield sessionEvent;continue}let sessionEvents=await options.onError?.(event);for(let sessionEvent of sessionEvents??[])yield sessionEvent;let payload={...event.error,requestId:options.requestId};throw yield{type:"error",sessionId:options.sessionId,error:payload},new SessionExecutionError(payload)}return{requestId:options.requestId,text:assistantTextParts.join(""),thinking:thinkingParts.join("")||void 0,toolCalls,recoverableToolFailures,stopReason,usage:responseUsage,assistantMetadata}}},SessionPersistenceCoordinator=class{stateStore;autosave;writeSnapshot;saveChain=Promise.resolve();constructor(options){this.stateStore=options.stateStore,this.autosave=options.autosave??"manual",this.writeSnapshot=options.writeSnapshot}save(){if(!this.stateStore)return Promise.resolve();return this.saveChain=this.saveChain.catch(()=>{return}).then(()=>this.writeSnapshot()),this.saveChain}scheduleQueueMutationSave(){if(!this.shouldAutosave("queue_mutation"))return;this.saveQuietly()}async persistRunTerminalStateQuietly(){if(!this.shouldAutosave("run_terminal"))return;await this.saveQuietly()}async persistEventBoundaryQuietly(){if(!this.shouldAutosave("event_boundary"))return;await this.saveQuietly()}shouldAutosave(reason){if(!this.stateStore)return!1;switch(reason){case"queue_mutation":return this.autosave==="manual"||this.autosave==="evented";case"run_terminal":return!0;case"event_boundary":return this.autosave==="evented"}}async saveQuietly(){try{await this.save()}catch{}}},DEFAULT_MESSAGE_QUEUE_CONFIG,SessionQueueRuntime=class{agentId;sessionId;state;observability;createErrorEvent;runItem;persistRunTerminalStateQuietly;scheduleQueueMutationSave;bufferedEvents=[];stateChangeWaiters=[];processingPromise;receiveActive=!1;activeReceiveSignal;haltProcessingUntilReceive=!1;activeRunCount=0;pendingSteerIds=[];disposed=!1;constructor(options){this.agentId=options.agentId,this.sessionId=options.sessionId,this.state=options.state,this.observability=options.observability,this.createErrorEvent=options.createErrorEvent,this.runItem=options.runItem,this.persistRunTerminalStateQuietly=options.persistRunTerminalStateQuietly,this.scheduleQueueMutationSave=options.scheduleQueueMutationSave}isProcessing(){return this.processingPromise!==void 0}isRunning(){return this.activeRunCount>0}send(input,options={}){this.assertNotDisposed("send");let item=prepareQueueItem("user",input,{...options,traceId:options.traceId??this.observability?.createTraceId()}),operation=this.observability?.startOperation("api","api.session.send",{content:item.input,options:{priority:item.priority,metadata:item.metadata}},{agentId:this.agentId,sessionId:this.sessionId,traceId:item.traceId,turnId:item.turnId});item.parentOperationId=operation?.operationId;try{return this.enqueuePreparedItem(item),operation?.success({itemId:item.id}),item.id}catch(error){throw operation?.error(error),error}}sendBatch(items){this.assertNotDisposed("sendBatch");let operation=this.observability?.startOperation("api","api.session.sendBatch",{items:items.map((item)=>({input:item.input,options:item.options}))},{agentId:this.agentId,sessionId:this.sessionId});try{let maxQueueSize=this.state.messageQueue.config.maxQueueSize;if(maxQueueSize!==void 0&&this.state.messageQueue.items.length+items.length>maxQueueSize)throw new SessionExecutionError(createQueueError("DIM_QUEUE_FULL",`Session queue is full (max ${maxQueueSize})`));let prepared=items.map(({input,options})=>{let item=prepareQueueItem("user",input,{...options,traceId:options?.traceId??this.observability?.createTraceId()});return item.parentOperationId=operation?.operationId,item}),beforeLength=this.state.messageQueue.items.length;for(let item of prepared)this.state.messageQueue.items.push(item);for(let[index,item]of prepared.entries())this.observability?.record({category:"state",event:"state.queue.items",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId,traceId:item.traceId,turnId:item.turnId,parentOperationId:item.parentOperationId},before:{length:beforeLength+index},after:{length:beforeLength+index+1},diff:{added:[{id:item.id,kind:item.kind,priority:item.priority}],batchSize:prepared.length}});if(prepared.length>0)this.onQueueMutated();let itemIds=prepared.map((item)=>item.id);return operation?.success({itemIds}),itemIds}catch(error){throw operation?.error(error),error}}steer(input,options={}){this.assertNotDisposed("steer");let activeTraceId=this.observability?.currentContext().traceId,traceId=options.traceId??activeTraceId??this.observability?.createTraceId(),metadata=options.metadata,operation=this.observability?.startOperation("api","api.session.steer",{content:input,options:{priority:options.priority,metadata}},{agentId:this.agentId,sessionId:this.sessionId,traceId});try{let maxQueueSize=this.state.messageQueue.config.maxQueueSize;if(maxQueueSize!==void 0&&this.state.messageQueue.items.length>=maxQueueSize)throw new SessionExecutionError(createQueueError("DIM_QUEUE_FULL",`Session queue is full (max ${maxQueueSize})`));let item=prepareQueueItem("steer",input,{...options,metadata,traceId});if(item.parentOperationId=operation?.operationId,this.enqueuePreparedItem(item,{deferAutoProcess:!0}),this.isRunning())this.pendingSteerIds.push(item.id);return operation?.success({itemId:item.id}),item.id}catch(error){throw operation?.error(error),error}}drainPendingSteer(){if(this.pendingSteerIds.length===0)return[];let ids=new Set(this.pendingSteerIds);this.pendingSteerIds.length=0;let segments=[];if(this.state.messageQueue.items=this.state.messageQueue.items.filter((item)=>{if(!ids.has(item.id))return!0;let text=contentToText(normalizeContent(item.input)).trim();if(text.length>0)segments.push(text);return!1}),segments.length>0)this.observability?.record({category:"state",event:"state.queue.items",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId},before:{pendingSteerIds:[...ids]},after:{pendingSteerIds:[]},diff:{drainedSteerCount:segments.length}}),touchRuntimeSessionState(this.state),this.notifyStateChange();return segments}cancelQueuedItem(itemId){this.assertNotDisposed("cancelQueuedItem");let index=this.state.messageQueue.items.findIndex((item)=>item.id===itemId);if(index<0)return!1;let[cancelled]=this.state.messageQueue.items.splice(index,1);return this.observability?.record({category:"state",event:"state.queue.items",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId,traceId:cancelled?.traceId,turnId:cancelled?.turnId},before:{length:this.state.messageQueue.items.length+1},after:{length:this.state.messageQueue.items.length},diff:{cancelled:{id:itemId,kind:cancelled?.kind}}}),this.onQueueMutated(),!0}getQueueStatus(){let items=[...this.state.messageQueue.items].sort(compareQueueItems).map((item)=>({id:item.id,kind:item.kind,priority:item.priority,enqueuedAt:item.enqueuedAt,preview:createQueuePreview(item.input)}));return{length:items.length,items,isProcessing:this.processingPromise!==void 0,config:cloneMessageQueueConfig(this.state.messageQueue.config)}}clearQueue(filter={}){this.assertNotDisposed("clearQueue");let before=this.state.messageQueue.items.length;if(!filter.kind)this.state.messageQueue.items=[];else this.state.messageQueue.items=this.state.messageQueue.items.filter((item)=>item.kind!==filter.kind);let cleared=before-this.state.messageQueue.items.length;if(cleared>0)this.observability?.record({category:"state",event:"state.queue.items",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId},before:{length:before},after:{length:this.state.messageQueue.items.length},diff:{cleared,filter}}),this.onQueueMutated();return cleared}async*receive(options={}){if(this.assertNotDisposed("receive"),this.receiveActive)throw new SessionExecutionError(createQueueError("DIM_QUEUE_BUSY","Only one receive() call can be active for a session"));this.receiveActive=!0,this.activeReceiveSignal=options.signal,this.haltProcessingUntilReceive=!1;let deliveredEvent;try{while(!0){if(deliveredEvent)deliveredEvent.ack(),deliveredEvent=void 0;this.ensureQueueProcessing("receive");let nextBufferedEvent=this.bufferedEvents.shift();if(nextBufferedEvent){deliveredEvent=nextBufferedEvent,yield nextBufferedEvent.event;continue}if(this.disposed)return;if(!this.processingPromise&&!this.hasRunnableItems())return;await this.waitForStateChange(options.signal)}}finally{if(deliveredEvent)deliveredEvent.ack();if(this.receiveActive=!1,this.activeReceiveSignal===options.signal)this.activeReceiveSignal=void 0;this.notifyStateChange()}}dispose(){if(this.disposed)return;this.disposed=!0;while(this.bufferedEvents.length>0)this.bufferedEvents.shift()?.ack();this.receiveActive=!1,this.activeReceiveSignal=void 0,this.haltProcessingUntilReceive=!0,this.notifyStateChange()}enqueuePreparedItem(item,options={}){let maxQueueSize=this.state.messageQueue.config.maxQueueSize;if(maxQueueSize!==void 0&&this.state.messageQueue.items.length>=maxQueueSize)throw new SessionExecutionError(createQueueError("DIM_QUEUE_FULL",`Session queue is full (max ${maxQueueSize})`));let beforeLength=this.state.messageQueue.items.length;this.state.messageQueue.items.push(item),this.observability?.record({category:"state",event:"state.queue.items",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId,traceId:item.traceId,turnId:item.turnId,parentOperationId:item.parentOperationId},before:{length:beforeLength},after:{length:this.state.messageQueue.items.length},diff:{added:[{id:item.id,kind:item.kind,priority:item.priority}]}}),this.onQueueMutated(options)}onQueueMutated(options={}){if(touchRuntimeSessionState(this.state),this.notifyStateChange(),this.scheduleQueueMutationSave(),options.deferAutoProcess){queueMicrotask(()=>this.ensureQueueProcessing("auto"));return}this.ensureQueueProcessing("auto")}hasRunnableItems(){return this.state.messageQueue.items.some((item)=>item.kind==="user"||item.kind==="steer")}ensureQueueProcessing(source){if(this.disposed)return;if(this.processingPromise)return;if(!this.hasRunnableItems())return;if(source==="auto"&&!this.state.messageQueue.config.autoProcessQueue)return;if(this.haltProcessingUntilReceive&&source!=="receive")return;let signal=source==="receive"?this.activeReceiveSignal:void 0;this.processingPromise=this.processQueue(signal).finally(()=>{if(this.processingPromise=void 0,this.notifyStateChange(),!this.disposed&&!this.haltProcessingUntilReceive&&this.state.messageQueue.config.autoProcessQueue)this.ensureQueueProcessing("auto")}),this.notifyStateChange()}async processQueue(signal){while(!0){if(this.disposed)return;let nextItem=this.dequeueNextRunnableItem();if(!nextItem)return;let completed=await this.processQueuedItem(nextItem,signal);if(await this.persistRunTerminalStateQuietly(),!completed){this.haltProcessingUntilReceive=!0;return}}}dequeueNextRunnableItem(){let steerItems=this.collectSteerItemsInEnqueueOrder(),userItem=this.findNextUserItem();if(userItem)return this.consumeQueueItems([userItem,...steerItems],{kind:userItem.kind,id:userItem.id,mergedSteerCount:steerItems.length}),{item:userItem,steerSegments:createSteerSegments(steerItems)};if(steerItems.length===0)return;let syntheticItem=createSyntheticSteerItem(steerItems);return this.consumeQueueItems(steerItems,{kind:"steer",id:syntheticItem.id,mergedSteerCount:steerItems.length}),{item:syntheticItem,steerSegments:[]}}collectSteerItemsInEnqueueOrder(){return this.state.messageQueue.items.filter((item)=>item.kind==="steer").sort(compareQueueItemsByEnqueueTime)}findNextUserItem(){return this.state.messageQueue.items.filter((item)=>item.kind==="user").sort(compareQueueItems)[0]}consumeQueueItems(items,synthetic){let consumedIds=new Set(items.map((item)=>item.id)),beforeLength=this.state.messageQueue.items.length;this.state.messageQueue.items=this.state.messageQueue.items.filter((item)=>!consumedIds.has(item.id)),touchRuntimeSessionState(this.state),this.observability?.record({category:"state",event:"state.queue.items",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId},before:{length:beforeLength},after:{length:this.state.messageQueue.items.length},diff:{consumed:items.map((item)=>({id:item.id,kind:item.kind})),synthetic}}),this.notifyStateChange()}async processQueuedItem(input,signal){let emittedError=!1,beforeRunCount=this.activeRunCount;this.activeRunCount+=1,input.item.traceId=input.item.traceId??this.observability?.createTraceId(),input.item.turnId=input.item.turnId??input.item.id;let operation=this.observability?.startOperation("api","api.session.receive",{itemId:input.item.id,source:"queue"},{agentId:this.agentId,sessionId:this.sessionId,traceId:input.item.traceId,turnId:input.item.turnId??input.item.id,parentOperationId:input.item.parentOperationId});this.observability?.record({category:"state",event:"state.queue.processing",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId,traceId:input.item.traceId,turnId:input.item.turnId,parentOperationId:operation?.operationId},before:{isProcessing:beforeRunCount>0,activeRunCount:beforeRunCount},after:{isProcessing:!0,activeRunCount:this.activeRunCount},diff:{itemId:input.item.id,source:"queue"}});try{let run=()=>this.runItem(input,signal,async(event)=>{if(this.disposed)return;let queuedEvent=this.attachQueueContext(event,input.item);if(this.recordSessionEvent(queuedEvent,input.item),queuedEvent.type==="error")emittedError=!0;await this.pushBufferedEvent(queuedEvent)});if(this.observability)await this.observability.withOperation(operation,run);else await run();return operation?.success({itemId:input.item.id,status:"done"}),!0}catch(error){if(operation?.error(error),!this.disposed&&!emittedError)await this.pushBufferedEvent(this.createErrorEvent(input.item,error));return!1}finally{let beforeRunCount2=this.activeRunCount;this.activeRunCount=Math.max(0,this.activeRunCount-1),this.pendingSteerIds.length=0,this.observability?.record({category:"state",event:"state.queue.processing",phase:"transition",context:{agentId:this.agentId,sessionId:this.sessionId,traceId:input.item.traceId,turnId:input.item.turnId,parentOperationId:operation?.operationId},before:{isProcessing:beforeRunCount2>0,activeRunCount:beforeRunCount2},after:{isProcessing:this.activeRunCount>0,activeRunCount:this.activeRunCount},diff:{itemId:input.item.id,source:"queue"}}),this.notifyStateChange()}}recordSessionEvent(event,item){this.observability?.record({level:event.type==="error"?"error":"info",category:event.type==="turn_usage"?"usage":"api",event:event.type==="turn_usage"?"usage.turn.finalize":"api.session.receive.event",phase:"event",context:{agentId:this.agentId,sessionId:this.sessionId,traceId:item.traceId,turnId:item.turnId??item.id},output:createSessionReceiveEventLogOutput(event,this.observability?.shouldRecordStreamEventDetails()===!0)})}attachQueueContext(event,item){return{...event,itemId:item.id,itemKind:item.kind,priority:item.priority}}async pushBufferedEvent(event){if(this.disposed)return;let resolved=!1,ack=()=>{if(resolved)return;resolved=!0,this.notifyStateChange()};this.bufferedEvents.push({event,ack}),this.notifyStateChange();while(!resolved&&!this.disposed)await this.waitForStateChange();if(this.disposed)ack()}waitForStateChange(signal){if(signal?.aborted)return Promise.reject(new SessionExecutionError(createQueueError("session_receive_aborted","Session receive aborted")));return new Promise((resolve,reject)=>{let onAbort=()=>{cleanup(),reject(new SessionExecutionError(createQueueError("session_receive_aborted","Session receive aborted")))},resume=()=>{cleanup(),resolve()},cleanup=()=>{let index=this.stateChangeWaiters.indexOf(resume);if(index>=0)this.stateChangeWaiters.splice(index,1);signal?.removeEventListener("abort",onAbort)};this.stateChangeWaiters.push(resume),signal?.addEventListener("abort",onAbort,{once:!0})})}notifyStateChange(){while(this.stateChangeWaiters.length>0)this.stateChangeWaiters.shift()?.()}assertNotDisposed(operation){if(this.disposed)throw new SessionExecutionError(createQueueError("DIM_SESSION_DISPOSED",`Cannot ${operation} on disposed session ${this.sessionId}`))}},DefaultTerminationPolicy=class{afterAssistantTurn(toolCalls){return toolCalls.length===0?{type:"done"}:{type:"continue"}}onMaxIterationsExceeded(maxIterations,requestId){return{code:"max_iterations_exceeded",message:`Session exceeded maxIterations (${maxIterations})`,requestId}}},DefaultToolExecutor=class{sessionId;tools;dynamicToolProviders;hostDataDir;metadata;services;pluginHost;approvalManager;notificationBus;constructor(options){this.sessionId=options.sessionId,this.tools=options.tools,this.dynamicToolProviders=[...options.dynamicToolProviders??[]],this.hostDataDir=options.hostDataDir,this.metadata=options.metadata,this.services=options.services,this.pluginHost=options.pluginHost,this.approvalManager=options.approvalManager,this.notificationBus=options.notificationBus}async execute(toolCall,options={}){let operation=this.services.observability?.startOperation("tool","tool.call",{toolCallId:toolCall.id,toolName:toolCall.function.name,arguments:toolCall.function.arguments},{sessionId:this.sessionId,requestId:options.requestId,iteration:options.iteration});try{let result=this.services.observability?await this.services.observability.withOperation(operation,()=>this.executeInner(toolCall,options)):await this.executeInner(toolCall,options);return operation?.success({toolCallId:toolCall.id,toolName:toolCall.function.name,isError:result.isError===!0,content:result.content}),result}catch(error){throw operation?.error(error),error}}async executeInner(toolCall,options={}){let hookContext={sessionId:this.sessionId,requestId:options.requestId,iteration:options.iteration,cwd:options.cwd,hostDataDir:options.hostDataDir??this.hostDataDir,status:options.status,services:this.services,metadata:this.metadata},before=await this.pluginHost?.runToolBeforeExecute({toolCall},hookContext),currentToolCall=before?.payload.toolCall??toolCall,result;if(before?.control){if(before.control.type==="provideResult")result=createToolResult(before.control.result);else if(before.control.type==="deny")result=createToolResult(before.control.result??{...textToolResult(before.control.reason??`Tool denied: ${currentToolCall.function.name}`),isError:!0}),await this.notificationBus.emit({type:"tool.denied",source:"permission",level:"warning",message:before.control.reason??`Tool denied: ${currentToolCall.function.name}`,metadata:{toolName:currentToolCall.function.name}},hookContext);else if(before.control.type==="ask"){currentToolCall=before.control.toolCall??currentToolCall;let approvalRequest={id:void 0,kind:"tool_execution",toolCall:currentToolCall,message:before.control.request?.message??`Approval required to execute tool: ${currentToolCall.function.name}`,metadata:before.control.request?.metadata},approvalOperation=this.services.observability?.startOperation("approval","approval.request",approvalRequest,{sessionId:this.sessionId,requestId:options.requestId,iteration:options.iteration}),decision;try{decision=this.services.observability?await this.services.observability.withOperation(approvalOperation,()=>this.approvalManager.requestApproval(approvalRequest,hookContext)):await this.approvalManager.requestApproval(approvalRequest,hookContext),approvalOperation?.success(decision)}catch(error){throw approvalOperation?.error(error),error}if(decision.type==="denied")result=createToolResult({...textToolResult(decision.reason??`Tool approval denied: ${currentToolCall.function.name}`),isError:!0})}}if(!result){let tool=this.tools?.get(currentToolCall.function.name);if(tool)try{validateToolArguments(currentToolCall.function.arguments,tool.definition.inputSchema,currentToolCall.function.name),result=createToolResult(await tool.execute(currentToolCall.function.arguments,{sessionId:this.sessionId,cwd:options.cwd,hostDataDir:options.hostDataDir??this.hostDataDir,signal:options.signal,status:options.status,metadata:this.metadata,services:this.services,emitEvent:async(event)=>{let pluginId=event.pluginId;if(!pluginId)throw Error(`Tool ${currentToolCall.function.name} emitted a plugin event without pluginId`);await options.onEvent?.({type:"plugin_event",sessionId:this.sessionId,pluginId,event:event.event,data:event.data?structuredClone(event.data):void 0})}}))}catch(error){result=createToolResult({...textToolResult(error instanceof Error?error.message:String(error)),isError:!0})}else if(result=await this.executeDynamicTool(currentToolCall,options),!result)result=createToolResult({...textToolResult(`Tool not found: ${currentToolCall.function.name}`),isError:!0})}let budgetedResult=await budgetToolResult({result:createToolResult((await this.pluginHost?.runMiddleware("tool.afterExecute",{toolCall:currentToolCall,result},hookContext))?.result??result),sessionId:this.sessionId,toolCallId:currentToolCall.id,hostDataDir:options.hostDataDir??this.hostDataDir,maxResultSizeChars:options.maxResultSizeChars??this.tools?.get(currentToolCall.function.name)?.definition.maxResultSizeChars});return await this.notificationBus.emit({type:budgetedResult.isError?"tool.failed":"tool.completed",source:"tool",level:budgetedResult.isError?"error":"info",message:budgetedResult.isError?`Tool failed: ${currentToolCall.function.name}`:`Tool completed: ${currentToolCall.function.name}`,metadata:{toolName:currentToolCall.function.name,isError:budgetedResult.isError===!0}},hookContext),budgetedResult}async executeDynamicTool(toolCall,options){for(let provider of this.dynamicToolProviders){if(!provider.hasTool(toolCall.function.name))continue;try{return createToolResult(await provider.executeTool(toolCall.function.name,toolCall.function.arguments,{sessionId:this.sessionId,cwd:options.cwd,hostDataDir:options.hostDataDir??this.hostDataDir,signal:options.signal,status:options.status,metadata:this.metadata,services:this.services,emitEvent:async(event)=>{let pluginId=event.pluginId;if(!pluginId)throw Error(`Dynamic tool ${toolCall.function.name} emitted a plugin event without pluginId`);await options.onEvent?.({type:"plugin_event",sessionId:this.sessionId,pluginId,event:event.event,data:event.data?structuredClone(event.data):void 0})}}))}catch(error){return createToolResult({...textToolResult(error instanceof Error?error.message:String(error)),isError:!0})}}}},CONTEXT_WINDOW_ERROR_CODES,CONTEXT_WINDOW_ERROR_PHRASES,UNKNOWN_RECOVERABLE_TOOL_NAME="_unknown",MAX_RAW_ARGUMENTS_PREVIEW=200,TOOL_CALL_JSON_CONTRACT_PROMPT,EXEC_MANAGED_TASK_PROMPT,DEFAULT_SESSION_MAX_OUTPUT_TOKENS=4000,LoopRunner=class{messageFactory;turnCollector;toolExecutor;terminationPolicy;dynamicToolProviders;hostDataDir;pluginHost;notificationBus;runCompaction;runLastMessageFallbackCompaction;usageLedgerManager;observability;constructor(dependencies){this.messageFactory=dependencies.messageFactory,this.turnCollector=dependencies.turnCollector,this.toolExecutor=dependencies.toolExecutor,this.terminationPolicy=dependencies.terminationPolicy,this.dynamicToolProviders=[...dependencies.dynamicToolProviders??[]],this.hostDataDir=dependencies.hostDataDir,this.pluginHost=dependencies.pluginHost,this.notificationBus=dependencies.notificationBus,this.runCompaction=dependencies.runCompaction,this.runLastMessageFallbackCompaction=dependencies.runLastMessageFallbackCompaction,this.usageLedgerManager=dependencies.usageLedgerManager,this.observability=dependencies.observability}async*run(state,input,options={}){let startedRun=await this.startRun(state,input,options.messageMetadata),lastRequestId,lastIteration=0,lastPrimaryRequestId,pendingContextSegments=[];try{let contextWindowRetried=!1;for(let iteration=0;iteration<state.maxIterations;iteration+=1){lastIteration=iteration;let prepared=await this.prepareTurn(state,startedRun.initialInput,iteration,lastPrimaryRequestId,pendingContextSegments,options,startedRun.userMessageIndex);lastRequestId=prepared.requestId,pendingContextSegments=[];let turn;try{turn=yield*this.executeModelTurn(state,prepared)}catch(error){if(!contextWindowRetried&&isContextWindowExceededError(error)){contextWindowRetried=!0,markContextSizeStale(state),state.forceCompactNextRequest=!0,iteration-=1;continue}throw error}lastPrimaryRequestId=prepared.requestId;let finalized=await this.finalizeAssistantTurn(state,prepared,turn);if(finalized.type==="done"){let completed=await this.completeRun(state,prepared,finalized.message,finalized.assistantIndex,options);return yield{type:"turn_usage",sessionId:state.id,turnId:completed.usageSummary.turnId,summary:completed.usageSummary},yield{type:"done",sessionId:state.id,message:completed.message,usage:completed.usage},completed.message}if(finalized.type==="done_after_tools"){yield*this.executeToolPhase(state,prepared,turn,options);let completed=await this.completeRun(state,prepared,finalized.message,finalized.assistantIndex,options);return yield{type:"turn_usage",sessionId:state.id,turnId:completed.usageSummary.turnId,summary:completed.usageSummary},yield{type:"done",sessionId:state.id,message:completed.message,usage:completed.usage},completed.message}if(finalized.additionalContext.length>0)pendingContextSegments=[...finalized.additionalContext];yield*this.executeToolPhase(state,prepared,turn,options);let steerSegments=options.drainPendingSteer?.()??[];if(steerSegments.length>0){let steerText=steerSegments.join(`
|
|
41
41
|
|
|
42
42
|
`);state.messages.push(this.messageFactory.createUserMessage(steerText)),markContextSizeStale(state),touchRuntimeSessionState(state),yield{type:"steer_injected",sessionId:state.id,content:steerText}}}}catch(error){if(options.turnId){let summary=this.usageLedgerManager.finalizeTurn({turnId:options.turnId,itemId:options.itemId,status:toTurnStatus(error)});yield{type:"turn_usage",sessionId:state.id,turnId:summary.turnId,summary}}throw yield{type:"error",sessionId:state.id,error:toSessionErrorPayload(error)},await this.handleRunFailure(state,error,lastRequestId,lastIteration),error}let payload=this.terminationPolicy.onMaxIterationsExceeded(state.maxIterations,lastRequestId);if(options.turnId){let summary=this.usageLedgerManager.finalizeTurn({turnId:options.turnId,itemId:options.itemId,status:"error"});yield{type:"turn_usage",sessionId:state.id,turnId:summary.turnId,summary}}throw yield{type:"error",sessionId:state.id,error:payload},await this.notificationBus.emit({type:"runtime.error",source:"runtime",level:"error",message:payload.message,metadata:{requestId:lastRequestId,code:payload.code}},{...this.createHookContext(state,{requestId:lastRequestId,iteration:lastIteration})}),await this.pluginHost?.runObservers("session.error",{error:payload},{...this.createHookContext(state,{requestId:lastRequestId})}),new SessionExecutionError(payload)}async startRun(state,input,messageMetadata){let initialInput=(await this.pluginHost?.runMiddleware("run.start",{sessionId:state.id,input},this.createHookContext(state)))?.input??input;await this.pluginHost?.runObservers("run.start",{sessionId:state.id,input:initialInput},this.createHookContext(state)),this.injectTaskNotifications(state);let beforeMessageCount=state.messages.length,userMessageIndex=beforeMessageCount,userMessage=this.messageFactory.createUserMessage(initialInput,{metadata:messageMetadata});return state.messages.push(userMessage),markContextSizeStale(state),touchRuntimeSessionState(state),this.observability?.record({category:"state",event:"state.messages",phase:"transition",context:{sessionId:state.id},before:{messageCount:beforeMessageCount},after:{messageCount:state.messages.length},diff:{added:[{id:userMessage.id,role:userMessage.role}]}}),await this.notificationBus.emit({type:"run.start",source:"runtime",message:`Run started for session ${state.id}`,metadata:{sessionId:state.id}},{...this.createHookContext(state)}),{initialInput,userMessageIndex}}async prepareTurn(state,initialInput,iteration,parentRequestId,pendingContextSegments,options,currentRunUserMessageIndex){let requestId=createId("req"),turnContext=this.createHookContext(state,{requestId,iteration});this.injectTaskNotifications(state,iteration===0?currentRunUserMessageIndex:void 0);let prepareOperation=this.observability?.startOperation("model","model.request.prepare",{messageCount:state.messages.length,iteration,parentRequestId},{sessionId:state.id,requestId,iteration});try{let turnStart=await this.pluginHost?.runMiddleware("turn.start",{requestId,iteration,messages:[...state.messages]},turnContext),toolDefinitions=mergeToolDefinitions([...state.tools?.definitions()??[],...await this.collectDynamicToolDefinitions(state,initialInput)]),effectiveTools=(await this.pluginHost?.runMiddleware("toolset.resolve",{tools:toolDefinitions},turnContext))?.tools??toolDefinitions,pluginPromptSegments=await this.pluginHost?.collectPromptSegments({sessionId:state.id,input:initialInput,messages:state.messages,cwd:state.cwd})??[],promptSegments=[...options.persistentPromptSegments??[],...effectiveTools.length>0?[TOOL_CALL_JSON_CONTRACT_PROMPT]:[],...effectiveTools.some((tool)=>tool.name==="exec")?[EXEC_MANAGED_TASK_PROMPT]:[],...pendingContextSegments,...pluginPromptSegments],effectivePromptSegments=(await this.pluginHost?.runMiddleware("prompt.resolve",{promptSegments,messages:[...state.messages]},turnContext))?.promptSegments??promptSegments,finalRequest=await this.resolveFinalRequest(state,{requestId,iteration,turnId:options.turnId,baseMessages:[...turnStart?.messages??state.messages],runtimePromptSegments:effectivePromptSegments,tools:effectiveTools,reasoning:state.reasoning,cache:state.cache,signal:options.signal,turnContext});return prepareOperation?.success({messageCount:finalRequest.messages.length,toolNames:effectiveTools.map((tool)=>tool.name),maxOutputTokens:finalRequest.maxOutputTokens,compaction:{cursor:state.compaction.cursor,checkpointId:state.compaction.checkpoints.at(-1)?.id},estimatedInputTokens:state.currentContextSize?.tokens}),{requestId,parentRequestId,iteration,turnId:options.turnId,itemId:options.itemId,effectiveTools,usageKind:parentRequestId?"continuation":"main",effectiveRequest:finalRequest}}catch(error){throw prepareOperation?.error(error),error}}async resolveFinalRequest(state,input){let initial=await this.buildFinalRequestForCycle(state,input);if(!isCompactionRequired(state.compactionOptions,initial.budget))return initial.finalRequest;let latestBudget=initial.budget,latest=initial;if(!latestBudget)return initial.finalRequest;let readPostCompactionBudget=async()=>(await this.buildFinalRequestForCycle(state,input)).budget,defaultAttempt=await this.runCompaction({trigger:"threshold",requestId:input.requestId,iteration:input.iteration,budget:latestBudget,readPostCompactionBudget});if(latest=await this.buildFinalRequestForCycle(state,input),latestBudget=latest.budget??latestBudget,!isCompactionRequired(state.compactionOptions,latest.budget))return latest.finalRequest;if(await this.runLastMessageFallbackCompaction({trigger:"threshold",requestId:input.requestId,iteration:input.iteration,budget:latestBudget,readPostCompactionBudget,fallbackFromReasonCode:defaultAttempt.reasonCode}),latest=await this.buildFinalRequestForCycle(state,input),latestBudget=latest.budget??latestBudget,!isCompactionRequired(state.compactionOptions,latest.budget))return latest.finalRequest;throw new SessionExecutionError({code:"context_compaction_required",message:`Context compaction required before continuing the run (estimated ${latestBudget.estimatedInputTokens} tokens, threshold ${latestBudget.thresholdTokens})`,requestId:input.requestId})}async buildFinalRequestForCycle(state,input){let projectedMessages=buildRequestMessagesForModel({messages:input.baseMessages,compaction:state.compaction,runtimePromptSegments:input.runtimePromptSegments,createSystemMessage:(text)=>this.messageFactory.createSystemMessage(text),createUserMessage:(text)=>this.messageFactory.createUserMessage(text)}),baseRequest={requestId:input.requestId,model:state.modelRef,messages:projectedMessages,tools:input.tools,reasoning:input.reasoning,cache:input.cache?structuredClone(input.cache):{mode:"auto"},signal:input.signal},effectiveRequest=(await this.pluginHost?.runMiddleware("model.request",{request:baseRequest},input.turnContext))?.request??baseRequest,initialFinalRequest=effectiveRequest.maxOutputTokens===void 0?{...effectiveRequest,maxOutputTokens:DEFAULT_SESSION_MAX_OUTPUT_TOKENS}:effectiveRequest,finalMessages=repairToolMessageHistory(initialFinalRequest.messages),finalRequest=finalMessages===initialFinalRequest.messages?initialFinalRequest:{...initialFinalRequest,messages:finalMessages},plannedOutput=finalRequest.maxOutputTokens??4000;validateToolMessageHistory(finalRequest.messages,{sessionId:state.id,requestId:input.requestId,turnId:input.turnId});let beforeContextSize=state.currentContextSize?{...state.currentContextSize}:void 0,contextSize=await recountCurrentContextSize(state,finalRequest),budget=state.compactionOptions&&state.compactionOptions.enabled!==!1&&contextSize.contextWindow>0?buildCompactionBudget(state.compactionOptions,contextSize.tokens,{contextWindow:contextSize.contextWindow,plannedOutput}):void 0;if(budget&&state.forceCompactNextRequest)budget.estimatedInputTokens=Math.max(budget.estimatedInputTokens,budget.thresholdTokens),state.forceCompactNextRequest=!1;return this.observability?.record({category:"state",event:"state.contextSize",phase:"transition",context:{sessionId:state.id,requestId:input.requestId,iteration:input.iteration},before:beforeContextSize,after:contextSize,diff:{estimatedInputTokens:contextSize.tokens,thresholdTokens:budget?.thresholdTokens,plannedOutput,contextWindow:contextSize.contextWindow}}),{finalRequest,budget,plannedOutput}}async*executeModelTurn(state,prepared){let operation=this.observability?.startOperation("model","model.request",{model:prepared.effectiveRequest.model,messageCount:prepared.effectiveRequest.messages.length,toolNames:prepared.effectiveRequest.tools?.map((tool)=>tool.name)??[],maxOutputTokens:prepared.effectiveRequest.maxOutputTokens,stream:{streamMode:prepared.effectiveRequest.streamMode??"default",detailEvents:this.observability?.shouldRecordStreamEventDetails()===!0}},{sessionId:state.id,requestId:prepared.requestId,iteration:prepared.iteration});if(prepared.modelOperationId=operation?.operationId,prepared.turnId){let snapshot=state.currentContextSize;this.usageLedgerManager.beginRequest({turnId:prepared.turnId,itemId:prepared.itemId,requestId:prepared.requestId,parentRequestId:prepared.parentRequestId,kind:prepared.usageKind,model:prepared.effectiveRequest.model,estimatedInputTokens:snapshot?.tokens,contextWindow:snapshot?.contextWindow||void 0}),this.observability?.record({category:"usage",event:"usage.request.begin",phase:"event",context:{sessionId:state.id,requestId:prepared.requestId,iteration:prepared.iteration,parentOperationId:operation?.operationId},output:{turnId:prepared.turnId,itemId:prepared.itemId,parentRequestId:prepared.parentRequestId,kind:prepared.usageKind,model:prepared.effectiveRequest.model,estimatedInputTokens:snapshot?.tokens,contextWindow:snapshot?.contextWindow||void 0}})}let usageRecorded=!1,streamSummary=createModelStreamObservabilitySummary(),turn;try{turn=yield*this.turnCollector.collect({sessionId:state.id,requestId:prepared.requestId,events:this.createObservedModelEventStream(state,prepared,operation),onResponseEnd:async(event)=>{let request=this.usageLedgerManager.completeRequest({requestId:prepared.requestId,status:toRequestStatus(event.stopReason),usage:event.usage,rawUsage:event.rawUsage,cost:event.cost});if(!request)return;return usageRecorded=!0,this.recordUsageRequestComplete(state,prepared,request,operation),[{type:"usage_recorded",sessionId:state.id,turnId:request.turnId,request}]},onError:async()=>{let request=this.usageLedgerManager.completeRequest({requestId:prepared.requestId,status:"error"});if(!request)return;return usageRecorded=!0,this.recordUsageRequestComplete(state,prepared,request,operation),[{type:"usage_recorded",sessionId:state.id,turnId:request.turnId,request}]},onEvent:async(event)=>{if(updateModelStreamObservabilitySummary(streamSummary,event),this.recordModelEvent(state,prepared,event,operation),event.type==="error")await this.notificationBus.emit({type:"provider.error",source:"provider",level:"error",message:event.error.message,metadata:{requestId:prepared.requestId,code:event.error.code,status:event.error.status}},{...this.createHookContext(state,{requestId:prepared.requestId,iteration:prepared.iteration})});await this.pluginHost?.runObservers("model.event",{event},{...this.createHookContext(state,{requestId:prepared.requestId,iteration:prepared.iteration})})}}),operation?.success({model:prepared.effectiveRequest.model,requestId:prepared.requestId,stopReason:turn.stopReason,textLength:turn.text.length,toolCallCount:turn.toolCalls.length,recoverableToolFailureCount:turn.recoverableToolFailures.length,stream:streamSummary})}catch(error){throw operation?.error(error,{model:prepared.effectiveRequest.model,requestId:prepared.requestId,stream:streamSummary}),error}if(!usageRecorded){let request=this.usageLedgerManager.completeRequest({requestId:prepared.requestId,status:toRequestStatus(turn.stopReason)});if(request)this.recordUsageRequestComplete(state,prepared,request,operation),yield{type:"usage_recorded",sessionId:state.id,turnId:request.turnId,request}}return turn}async*createObservedModelEventStream(state,prepared,operation){let iterator=state.model.stream(prepared.effectiveRequest)[Symbol.asyncIterator]();while(!0){let next=this.observability?await this.observability.withOperation(operation,()=>iterator.next()):await iterator.next();if(next.done)return;yield next.value}}recordModelEvent(state,prepared,event,operation){if(!this.observability?.shouldRecordStreamEventDetails())return;let metadata={type:event.type};if("stopReason"in event)metadata.stopReason=event.stopReason;if("usage"in event)metadata.usage=event.usage;if("cost"in event)metadata.cost=event.cost;if("toolName"in event)metadata.toolName=event.toolName;if("callId"in event)metadata.callId=event.callId;if("error"in event)metadata.error=event.error;this.observability?.record({level:event.type==="error"?"error":"info",category:"model",event:"model.event",phase:"event",context:{sessionId:state.id,requestId:prepared.requestId,iteration:prepared.iteration,parentOperationId:operation?.operationId},output:event,metadata})}recordUsageRequestComplete(state,prepared,request,operation){this.observability?.record({category:"usage",event:"usage.request.complete",phase:"event",context:{sessionId:state.id,requestId:prepared.requestId,iteration:prepared.iteration,parentOperationId:operation?.operationId},output:request})}async finalizeAssistantTurn(state,prepared,turn){let failurePlaceholderToolCalls=turn.recoverableToolFailures.map(failureToPlaceholderToolCall),assistantDraft=this.messageFactory.createAssistantMessage({text:turn.text,thinking:turn.thinking,toolCalls:[...turn.toolCalls,...failurePlaceholderToolCalls],stopReason:turn.stopReason,metadata:turn.assistantMetadata}),assistantHookContext=this.createHookContext(state,{requestId:prepared.requestId,iteration:prepared.iteration}),assistantMessage=(await this.pluginHost?.runMiddleware("assistant.message",{message:assistantDraft},assistantHookContext))?.message??assistantDraft,assistantIndex=state.messages.length;state.messages.push(assistantMessage),markContextSizeStale(state),touchRuntimeSessionState(state);let runStopContext=this.createHookContext(state,{requestId:prepared.requestId,iteration:prepared.iteration}),baseDecision=this.terminationPolicy.afterAssistantTurn(turn.toolCalls),stopBasePayload={assistantMessage,toolCalls:turn.toolCalls,stopReason:turn.stopReason,decision:turn.recoverableToolFailures.length>0?{type:"continue"}:baseDecision},stopResult=await this.pluginHost?.runRunStop(stopBasePayload,runStopContext),stopPayload=stopResult?.payload??stopBasePayload,stopControl=stopResult?.control,observedRunStopPayload={...stopPayload,additionalContext:stopControl?.type==="finalize"?stopControl.additionalContext??stopPayload.additionalContext:stopPayload.additionalContext,finalMessage:stopControl?.type==="finalize"?stopControl.finalMessage??stopPayload.finalMessage:stopPayload.finalMessage};await this.pluginHost?.runObservers("run.stop",observedRunStopPayload,runStopContext);let stopDecision=stopControl?.type==="finalize"?{type:"done"}:stopPayload.decision,additionalContext=stopControl?.type==="finalize"?stopControl.additionalContext??[]:stopPayload.additionalContext??[],finalMessage=stopControl?.type==="finalize"?stopControl.finalMessage??stopPayload.finalMessage??stopPayload.assistantMessage:stopPayload.finalMessage??stopPayload.assistantMessage;if(stopDecision.type==="continue")return{type:"continue",additionalContext};if(assistantMessage=finalMessage,state.messages[assistantIndex]=assistantMessage,touchRuntimeSessionState(state),turn.toolCalls.length>0||turn.recoverableToolFailures.length>0)return{type:"done_after_tools",message:assistantMessage,assistantIndex};return{type:"done",message:assistantMessage,assistantIndex}}async*executeToolPhase(state,prepared,turn,options){let candidates=[];for(let toolCall of turn.toolCalls){yield{type:"tool_call",sessionId:state.id,toolCall};let pluginEvents=[],maxResultSizeChars=prepared.effectiveTools.find((tool)=>tool.name===toolCall.function.name)?.maxResultSizeChars,executeTool=()=>this.toolExecutor.execute(toolCall,{signal:options.signal,cwd:state.cwd,hostDataDir:this.hostDataDir,requestId:prepared.requestId,iteration:prepared.iteration,status:createSessionStatus(state),maxResultSizeChars,onEvent:async(event)=>{pluginEvents.push(event)}}),result=this.observability?await this.observability.withContext({sessionId:state.id,requestId:prepared.requestId,iteration:prepared.iteration,parentOperationId:prepared.modelOperationId},executeTool):await executeTool();for(let event of pluginEvents)yield event;candidates.push({toolCall,result,maxResultSizeChars})}let budgetedBatch=await budgetToolResultBatch({sessionId:state.id,hostDataDir:this.hostDataDir,candidates:candidates.map((candidate)=>({toolCallId:candidate.toolCall.id,maxResultSizeChars:candidate.maxResultSizeChars,result:candidate.result}))});for(let index=0;index<candidates.length;index+=1){let candidate=candidates[index],{toolCall}=candidate,result=budgetedBatch.results[index]??candidate.result,toolMessage=this.messageFactory.createToolMessage(toolCall,result),beforeMessageCount=state.messages.length;state.messages.push(toolMessage),markContextSizeStale(state),touchRuntimeSessionState(state);for(let contextMessage of result.contextMessages??[])state.messages.push(this.messageFactory.createUserMessage(contextMessage.content,{metadata:createToolContextMetadata(contextMessage.metadata,toolCall.function.name,toolCall.id),providerOptions:contextMessage.providerOptions})),markContextSizeStale(state),touchRuntimeSessionState(state);yield{type:"tool_result",sessionId:state.id,toolCallId:toolCall.id,result},this.observability?.record({category:"state",event:"state.messages",phase:"transition",context:{sessionId:state.id,requestId:prepared.requestId,iteration:prepared.iteration,parentOperationId:prepared.modelOperationId},before:{messageCount:beforeMessageCount},after:{messageCount:state.messages.length},diff:{added:[{id:toolMessage.id,role:toolMessage.role,toolCallId:toolCall.id}]}})}for(let failure of turn.recoverableToolFailures){let result=createRecoverableToolCallResult(failure);state.messages.push(this.messageFactory.createToolMessage(failureToPlaceholderToolCall(failure),result)),markContextSizeStale(state),touchRuntimeSessionState(state),yield{type:"tool_result",sessionId:state.id,toolCallId:failure.callId,result}}this.injectTaskNotifications(state)}injectTaskNotifications(state,insertBeforeIndex){let notifications=drainBuiltinExecTaskNotifications(state.id);if(notifications.length===0)return;let content=notifications.map(formatExecTaskNotification).join(`
|
|
43
43
|
|
|
44
|
-
`),message=this.messageFactory.createUserMessage(content,{metadata:{kind:"task_notification",source:"exec"}}),boundedIndex=insertBeforeIndex===void 0?state.messages.length:Math.max(0,Math.min(insertBeforeIndex,state.messages.length));state.messages.splice(boundedIndex,0,message),markContextSizeStale(state),touchRuntimeSessionState(state)}async handleRunFailure(state,error,lastRequestId,lastIteration){if(!(error instanceof SessionExecutionError))return;await this.notificationBus.emit({type:error.payload.code.startsWith("openai_")||error.payload.code.startsWith("anthropic_")||error.payload.code.startsWith("gemini_")?"provider.error":"runtime.error",source:error.payload.code.includes("_http_")||error.payload.code.includes("_request_")?"provider":"runtime",level:"error",message:error.payload.message,metadata:{requestId:lastRequestId,code:error.payload.code}},{...this.createHookContext(state,{requestId:lastRequestId,iteration:lastIteration})}),await this.pluginHost?.runObservers("session.error",{error:error.payload},{...this.createHookContext(state,{requestId:lastRequestId})})}createHookContext(state,input={}){return{sessionId:state.id,requestId:input.requestId,iteration:input.iteration,cwd:state.cwd,hostDataDir:this.hostDataDir,metadata:state.metadata,status:createSessionStatus(state)}}async collectDynamicToolDefinitions(state,input){let tools=[];for(let provider of this.dynamicToolProviders){let nextTools=await provider.listTools({sessionId:state.id,input,messages:[...state.messages],cwd:state.cwd,metadata:state.metadata?{...state.metadata}:void 0});tools.push(...nextTools.map(createToolDefinition))}return tools}async completeRun(state,prepared,assistantMessage,assistantIndex,options){let beforeUsageSummary=this.usageLedgerManager.getUsageSummary(),usageOperation=this.observability?.startOperation("usage","usage.turn.finalize",{turnId:options.turnId??prepared.requestId,itemId:options.itemId,status:"completed",resultRequestId:prepared.requestId},{sessionId:state.id,requestId:prepared.requestId,iteration:prepared.iteration}),usageSummary;try{usageSummary=this.usageLedgerManager.finalizeTurn({turnId:options.turnId??prepared.requestId,itemId:options.itemId,status:"completed",resultRequestId:prepared.requestId}),this.observability?.record({category:"state",event:"state.usageLedger",phase:"transition",context:{sessionId:state.id,requestId:prepared.requestId,iteration:prepared.iteration,parentOperationId:usageOperation?.operationId},before:beforeUsageSummary,after:this.usageLedgerManager.getUsageSummary(),diff:{turnId:usageSummary.turnId,requestCount:usageSummary.requestCount,status:usageSummary.status}}),usageOperation?.success(usageSummary)}catch(error){throw usageOperation?.error(error),error}let runEndContext=this.createHookContext(state,{requestId:prepared.requestId,iteration:prepared.iteration}),completedMessage=(await this.pluginHost?.runMiddleware("run.end",{message:assistantMessage,usageSummary},runEndContext))?.message??assistantMessage,completedUsage=cloneUsage(usageSummary.resultUsage);state.messages[assistantIndex]=completedMessage,touchRuntimeSessionState(state);let completedContext=this.createHookContext(state,{requestId:prepared.requestId,iteration:prepared.iteration});return await this.notificationBus.emit({type:"run.end",source:"runtime",message:`Run completed for session ${state.id}`,metadata:{sessionId:state.id,requestId:prepared.requestId}},{...completedContext}),await this.pluginHost?.runObservers("run.end",{message:completedMessage,usageSummary},completedContext),await options.onDone?.(completedMessage),{message:completedMessage,usage:completedUsage,usageSummary}}},SessionUsageLedgerManager=class{state;pendingRequests=new Map;activeTurn;constructor(state){this.state=state}getUsageSummary(){return structuredClone(this.state.usageLedger.summary)}getUsageLedger(){return structuredClone(this.state.usageLedger)}getTurnUsage(turnId){let summary=this.state.usageLedger.turns.find((entry)=>entry.turnId===turnId);return summary?structuredClone(summary):void 0}listTurnUsages(){return this.state.usageLedger.turns.map((entry)=>structuredClone(entry))}listRequestUsages(filter={}){return this.state.usageLedger.requests.filter((entry)=>{if(filter.turnId&&entry.turnId!==filter.turnId)return!1;if(filter.kind&&entry.kind!==filter.kind)return!1;return!0}).map((entry)=>structuredClone(entry))}beginTurn(turnId,itemId,startedAt=Date.now()){this.activeTurn={turnId,itemId,startedAt}}getActiveTurn(){if(!this.activeTurn)return;return{turnId:this.activeTurn.turnId,itemId:this.activeTurn.itemId}}clearActiveTurn(){this.activeTurn=void 0}beginRequest(input){this.pendingRequests.set(input.requestId,{sessionId:this.state.id,turnId:input.turnId,itemId:input.itemId,requestId:input.requestId,parentRequestId:input.parentRequestId,kind:input.kind,startedAt:input.startedAt??Date.now(),model:input.model?{...input.model}:void 0,baselineUsage:cloneUsage(this.state.usage),contextWindow:input.contextWindow,estimatedInputTokens:input.estimatedInputTokens})}completeRequest(input){let pending=this.pendingRequests.get(input.requestId);if(!pending)return;this.pendingRequests.delete(input.requestId);let record=finalizeUsageRequestRecord(this.state,pending,input);return this.state.usageLedger.requests.push(record),this.state.usageLedger.summary.requestCount=this.state.usageLedger.requests.length,this.state.usageLedger.summary.updatedAt=record.completedAt,this.state.usageLedger.summary.totalUsage=addUsage(this.state.usageLedger.summary.totalUsage,record.usage),mergeBreakdownUsage(this.state.usageLedger.summary.breakdown,record.kind,record.usage),this.state.usage=cloneUsage(this.state.usageLedger.summary.totalUsage),touchRuntimeSessionState(this.state),structuredClone(record)}finalizeTurn(input){let requests=this.state.usageLedger.requests.filter((entry)=>entry.turnId===input.turnId),existingIndex=this.state.usageLedger.turns.findIndex((entry)=>entry.turnId===input.turnId),startedAt=this.activeTurn?.turnId===input.turnId?this.activeTurn.startedAt:requests[0]?.startedAt??Date.now(),completedAt=input.completedAt??Date.now(),totalUsage=requests.reduce((usage,entry)=>addUsage(usage,entry.usage),createEmptyUsage()),breakdown=requests.reduce((current,entry)=>{return mergeBreakdownUsage(current,entry.kind,entry.usage),current},{}),resultUsage=cloneUsage(input.resultRequestId?requests.find((entry)=>entry.requestId===input.resultRequestId)?.usage:void 0),summary={turnId:input.turnId,sessionId:this.state.id,itemId:input.itemId??this.activeTurn?.itemId,status:input.status,startedAt,completedAt,requestCount:requests.length,resultUsage,totalUsage,breakdown,requestIds:requests.map((entry)=>entry.requestId)};if(existingIndex>=0)this.state.usageLedger.turns[existingIndex]=summary;else this.state.usageLedger.turns.push(summary);return this.state.usageLedger.summary.turnCount=this.state.usageLedger.turns.length,this.state.usageLedger.summary.updatedAt=completedAt,this.state.usage=cloneUsage(this.state.usageLedger.summary.totalUsage),touchRuntimeSessionState(this.state),structuredClone(summary)}},LAST_MESSAGE_FALLBACK_CHAR_LIMITS,CONTINUATION_SUMMARY_OPEN_TAG="<continuation_summary>",CONTINUATION_SUMMARY_CLOSE_TAG="</continuation_summary>",Session=class{id;createdAt;agentId;stateStore;transformSnapshot;state;dynamicToolProviders;hostDataDir;pluginHost;services;approvalManager;notificationBus;compactionService;pluginStateService;observability;pluginControllers;persistence;queueRuntime;usageLedgerManager;disposed=!1;disposePromise;constructor(options){let now=Date.now();if(this.id=options.id??createId("session"),this.agentId=options.agentId,this.createdAt=options.createdAt??now,this.stateStore=options.stateStore,this.transformSnapshot=options.transformSnapshot,this.dynamicToolProviders=[...options.dynamicToolProviders??[]],this.hostDataDir=options.hostDataDir,this.pluginHost=options.pluginHost,this.services=options.services,this.approvalManager=options.approvalManager,this.notificationBus=options.notificationBus,this.compactionService=options.compactionService,this.pluginStateService=options.pluginStateService,this.observability=options.observability,this.state={id:this.id,model:options.model,modelRef:options.modelRef??options.model.model,tools:options.tools,maxIterations:options.maxIterations??8,allowedToolNames:options.allowedToolNames?[...options.allowedToolNames]:void 0,cwd:options.cwd,metadata:options.metadata,reasoning:options.reasoning,cache:options.cache?structuredClone(options.cache):void 0,messages:cloneMessages(options.messages??[]),usage:options.usage?{...options.usage}:createEmptyUsage(),usageLedger:normalizeSessionUsageLedger(this.id,options.usageLedger,options.usage??createEmptyUsage()),compaction:cloneCompactionState(options.compaction??createEmptyCompactionState()),pluginState:clonePluginStateMap(options.pluginState),messageQueue:cloneMessageQueueSnapshot(options.messageQueue??{items:[],config:createMessageQueueConfig(options.messageQueueConfig)}),compactionOptions:options.compactionOptions,createdAt:this.createdAt,updatedAt:options.updatedAt??now},this.state.usage={...this.state.usageLedger.summary.totalUsage},options.messageQueueConfig)this.state.messageQueue.config=createMessageQueueConfig(options.messageQueueConfig,this.state.messageQueue.config);this.compactionService.registerSession(this.state),this.pluginStateService.registerSession(this.state),this.usageLedgerManager=new SessionUsageLedgerManager(this.state),this.persistence=new SessionPersistenceCoordinator({stateStore:this.stateStore,autosave:options.autosave,writeSnapshot:()=>this.writeSnapshot()}),this.queueRuntime=new SessionQueueRuntime({agentId:this.agentId,sessionId:this.id,state:this.state,observability:this.observability,createErrorEvent:(item,error)=>this.createErrorEvent(item,error),runItem:(input,signal,emit)=>this.runQueuedItem(input,signal,emit),persistRunTerminalStateQuietly:()=>this.persistence.persistRunTerminalStateQuietly(),scheduleQueueMutationSave:()=>this.persistence.scheduleQueueMutationSave()}),this.pluginControllers=this.pluginHost?.createSessionControllers({sessionId:this.id,metadata:this.state.metadata,getStatus:()=>this.getStatus(),save:()=>this.save(),isRunning:()=>this.queueRuntime.isRunning()})??new Map}get messages(){return cloneMessages(this.state.messages)}get usage(){return{...this.state.usage}}getUsageSummary(){return this.usageLedgerManager.getUsageSummary()}getUsageLedger(){return this.usageLedgerManager.getUsageLedger()}getTurnUsage(turnId){return this.usageLedgerManager.getTurnUsage(turnId)}listTurnUsages(){return this.usageLedgerManager.listTurnUsages()}listRequestUsages(filter={}){return this.usageLedgerManager.listRequestUsages(filter)}getStatus(){return createSessionStatus(this.state)}getCompactionState(){return cloneCompactionState(this.state.compaction)}getCurrentContextSize(){let snapshot=this.state.currentContextSize;return snapshot?{...snapshot}:void 0}async ensureCurrentContextSize(){let operation=this.observability?.startOperation("api","api.session.ensureCurrentContextSize",void 0,{sessionId:this.id});try{let snapshot=await this.observability?.withOperation(operation,async()=>{let messageFactory=new DefaultMessageFactory,requestMessages=buildRequestMessagesForModel({messages:this.state.messages,compaction:this.state.compaction,createSystemMessage:(text)=>messageFactory.createSystemMessage(text),createUserMessage:(text)=>messageFactory.createUserMessage(text)}),tools=this.state.tools?.definitions()??[],before=this.state.currentContextSize?{...this.state.currentContextSize}:void 0,snapshot2=await recountCurrentContextSize(this.state,{model:this.state.modelRef,messages:requestMessages,tools});return this.observability?.record({category:"state",event:"state.contextSize",phase:"transition",context:{sessionId:this.id},before,after:snapshot2,diff:{tokens:snapshot2.tokens,contextWindow:snapshot2.contextWindow,stale:snapshot2.stale}}),snapshot2})??await(async()=>{let messageFactory=new DefaultMessageFactory,requestMessages=buildRequestMessagesForModel({messages:this.state.messages,compaction:this.state.compaction,createSystemMessage:(text)=>messageFactory.createSystemMessage(text),createUserMessage:(text)=>messageFactory.createUserMessage(text)}),tools=this.state.tools?.definitions()??[];return recountCurrentContextSize(this.state,{model:this.state.modelRef,messages:requestMessages,tools})})();return operation?.success(snapshot),{...snapshot}}catch(error){throw operation?.error(error),error}}async countTokens(request){let operation=this.observability?.startOperation("api","api.session.countTokens",request,{sessionId:this.id});try{let tokens=await this.observability?.withOperation(operation,async()=>{let adapter=this.state.model.adapter,effectiveModel=request.model??this.state.modelRef,effectiveRequest={...request,model:effectiveModel};if(adapter.countTokens)return adapter.countTokens(effectiveRequest);return estimateRequestTokens(effectiveRequest)})??await(async()=>{let adapter=this.state.model.adapter,effectiveModel=request.model??this.state.modelRef,effectiveRequest={...request,model:effectiveModel};if(adapter.countTokens)return adapter.countTokens(effectiveRequest);return estimateRequestTokens(effectiveRequest)})();return operation?.success({tokens}),tokens}catch(error){throw operation?.error(error),error}}async getCompactionBudget(options){let operation=this.observability?.startOperation("api","api.session.getCompactionBudget",options,{sessionId:this.id});try{let budget=await this.observability?.withOperation(operation,async()=>{if(!this.state.compactionOptions||this.state.compactionOptions.enabled===!1)return;let contextWindow=this.state.model.capabilities?.contextWindow??0;if(contextWindow<=0)return;let plannedOutput=options?.plannedOutput??4000,snapshot=await this.ensureCurrentContextSize();return buildCompactionBudget(this.state.compactionOptions,snapshot.tokens,{contextWindow,plannedOutput})})??await(async()=>{if(!this.state.compactionOptions||this.state.compactionOptions.enabled===!1)return;let contextWindow=this.state.model.capabilities?.contextWindow??0;if(contextWindow<=0)return;let plannedOutput=options?.plannedOutput??4000,snapshot=await this.ensureCurrentContextSize();return buildCompactionBudget(this.state.compactionOptions,snapshot.tokens,{contextWindow,plannedOutput})})();return operation?.success(budget),budget}catch(error){throw operation?.error(error),error}}getPluginState(pluginId){return clonePluginSessionStateEntry(this.state.pluginState[pluginId])}listPluginStates(){return clonePluginStateMap(this.state.pluginState)}getPlugin(pluginId){return this.pluginControllers.get(pluginId)}get updatedAt(){return this.state.updatedAt}isDisposed(){return this.disposed}getCwd(){return this.state.cwd}setCwd(cwd){let operation=this.observability?.startOperation("api","api.session.setCwd",{cwd},{sessionId:this.id}),before={cwd:this.state.cwd};try{this.state.cwd=cwd,touchRuntimeSessionState(this.state),this.observability?.record({category:"state",event:"state.session.cwd",phase:"transition",context:{sessionId:this.id},before,after:{cwd:this.state.cwd},diff:{cwd}}),operation?.success({cwd})}catch(error){throw operation?.error(error),error}}send(input,options={}){return this.queueRuntime.send(input,options)}sendBatch(items){return this.queueRuntime.sendBatch(items)}steer(input,options={}){return this.queueRuntime.steer(input,options)}cancelQueuedItem(itemId){return this.queueRuntime.cancelQueuedItem(itemId)}getQueueStatus(){return this.queueRuntime.getQueueStatus()}clearQueue(filter={}){return this.queueRuntime.clearQueue(filter)}async*receive(options={}){let operation=this.observability?.startOperation("api","api.session.receiveStream",{hasSignal:Boolean(options.signal)},{sessionId:this.id}),eventCount=0;try{for await(let event of this.queueRuntime.receive(options))eventCount+=1,yield event;operation?.success({eventCount})}catch(error){throw operation?.error(error,{eventCount}),error}}async runCompaction(input){this.assertNotDisposed("run compaction");let operation=this.observability?.startOperation("api","api.session.runCompaction",input,{sessionId:this.id});try{let result=this.observability?await this.observability.withOperation(operation,()=>this.runCompactionInternal(input)):await this.runCompactionInternal(input);return operation?.success(result),result}catch(error){throw operation?.error(error),error}}async compact(update){this.assertNotDisposed("compact");let operation=this.observability?.startOperation("api","api.session.compact",update,{sessionId:this.id});try{await this.observability?.withOperation(operation,async()=>{let trigger=update.reason??"manual",beforeState=this.getCompactionState(),afterState=await this.compactionService.apply({sessionId:this.id,...update,reason:trigger}),latestCheckpoint=afterState.checkpoints.at(-1),latestMetadata=latestCheckpoint?.metadata;this.observability?.record({category:"state",event:"state.compaction",phase:"transition",context:{sessionId:this.id},before:{cursor:beforeState.cursor,checkpointCount:beforeState.checkpoints.length},after:{cursor:afterState.cursor,checkpointCount:afterState.checkpoints.length},diff:{reason:trigger,checkpointId:latestCheckpoint?.id,compactedMessageCount:readCompactedMessageCount(latestMetadata),retainedMessageCount:readRetainedMessageCount(latestMetadata)}}),await this.emitCompactedNotification({sourceKind:"host_low_level",trigger,resolution:readCompactionResolution(latestMetadata)??"summary",beforeState,afterState,checkpointId:latestCheckpoint?.id,compactedMessageCount:readCompactedMessageCount(latestMetadata),retainedMessageCount:readRetainedMessageCount(latestMetadata),diagnostics:readCompactionDiagnostics(latestMetadata)})})??await(async()=>{let trigger=update.reason??"manual",beforeState=this.getCompactionState(),afterState=await this.compactionService.apply({sessionId:this.id,...update,reason:trigger}),latestCheckpoint=afterState.checkpoints.at(-1),latestMetadata=latestCheckpoint?.metadata;await this.emitCompactedNotification({sourceKind:"host_low_level",trigger,resolution:readCompactionResolution(latestMetadata)??"summary",beforeState,afterState,checkpointId:latestCheckpoint?.id,compactedMessageCount:readCompactedMessageCount(latestMetadata),retainedMessageCount:readRetainedMessageCount(latestMetadata),diagnostics:readCompactionDiagnostics(latestMetadata)})})(),operation?.success()}catch(error){throw operation?.error(error),error}}async save(){this.assertNotDisposed("save");let operation=this.observability?.startOperation("api","api.session.save",void 0,{sessionId:this.id});try{if(this.observability)await this.observability.withOperation(operation,()=>this.persistence.save());else await this.persistence.save();operation?.success()}catch(error){throw operation?.error(error),error}}async dispose(){if(this.disposePromise)return this.disposePromise;return this.disposePromise=(async()=>{if(this.disposed)return;let operation=this.observability?.startOperation("api","api.session.dispose",void 0,{sessionId:this.id});this.disposed=!0;try{await this.observability?.withOperation(operation,async()=>{this.queueRuntime.dispose(),this.compactionService.unregisterSession(this.id),this.pluginStateService.unregisterSession(this.id),clearSessionFileRevisions(this.id),await disposeBuiltinExecSession(this.id),await Promise.allSettled([...this.pluginControllers.values()].map(async(controller)=>{await controllerDispose(controller)})),this.observability?.record({category:"state",event:"state.session.lifecycle",phase:"transition",context:{sessionId:this.id},before:{disposed:!1},after:{disposed:!0},diff:{action:"dispose"}})})??await(async()=>{this.queueRuntime.dispose(),this.compactionService.unregisterSession(this.id),this.pluginStateService.unregisterSession(this.id),clearSessionFileRevisions(this.id),await disposeBuiltinExecSession(this.id),await Promise.allSettled([...this.pluginControllers.values()].map(async(controller)=>{await controllerDispose(controller)}))})(),operation?.success()}catch(error){throw operation?.error(error),error}})(),this.disposePromise}toSnapshot(){return sessionSnapshotCodec.encode({sessionId:this.id,model:this.state.modelRef,cwd:this.state.cwd,messages:this.messages,usage:this.usage,usageLedger:this.getUsageLedger(),compaction:this.getCompactionState(),pluginState:this.listPluginStates(),createdAt:this.createdAt,updatedAt:this.updatedAt,metadata:this.state.metadata?{...this.state.metadata}:void 0,messageQueue:cloneMessageQueueSnapshot(this.state.messageQueue),reasoning:this.state.reasoning?structuredClone(this.state.reasoning):void 0,cache:this.state.cache?structuredClone(this.state.cache):void 0,maxIterations:this.state.maxIterations,allowedToolNames:this.state.allowedToolNames?[...this.state.allowedToolNames]:void 0})}async writeSnapshot(){if(!this.stateStore)return;let operation=this.observability?.startOperation("persistence","persistence.stateStore.save",{sessionId:this.id},{sessionId:this.id}),snapshot=this.toSnapshot();try{if(this.pluginHost)snapshot=await this.pluginHost.runMiddleware("snapshot.encode",{snapshot},{...this.createHookContext(),services:this.services}).then((payload)=>payload.snapshot);if(this.transformSnapshot)snapshot=await this.transformSnapshot(snapshot);await this.stateStore.save({snapshot,usageLedger:this.getUsageLedger()}),operation?.success({schemaVersion:snapshot.schemaVersion,messageCount:snapshot.messages.length,usageLedger:this.getUsageSummary()}),await this.pluginHost?.runObservers("snapshot.saved",{snapshot},{...this.createHookContext(),services:this.services}),await this.notificationBus.emit({type:"snapshot.saved",source:"persistence",level:"info",message:`Saved snapshot for session ${this.id}`,metadata:{sessionId:this.id,schemaVersion:snapshot.schemaVersion}},{...this.createHookContext()})}catch(error){throw operation?.error(error),error}}async runQueuedItem(input,signal,emit){this.usageLedgerManager.beginTurn(input.item.id,input.item.id);let runner=this.createLoopRunner(),run=async()=>{let iterator=runner.run(this.state,input.item.input,{signal,turnId:input.item.id,itemId:input.item.id,persistentPromptSegments:input.steerSegments,messageMetadata:input.item.metadata,drainPendingSteer:()=>this.queueRuntime.drainPendingSteer()});try{while(!0){let next=await iterator.next();if(next.done)return;if(await emit(next.value),next.value.type==="tool_result"||next.value.type==="done"||next.value.type==="turn_usage")await this.persistence.persistEventBoundaryQuietly()}}finally{this.usageLedgerManager.clearActiveTurn()}};if(!this.observability)return await run();return await this.observability.withContext({sessionId:this.id,traceId:input.item.traceId,turnId:input.item.turnId??input.item.id},run)}createErrorEvent(item,error){let payload=error instanceof SessionExecutionError?error.payload:{code:"runtime_error",message:error instanceof Error?error.message:String(error)};return{type:"error",sessionId:this.id,error:payload,itemId:item.id,itemKind:item.kind,priority:item.priority}}createLoopRunner(){return new LoopRunner({messageFactory:new DefaultMessageFactory,turnCollector:new DefaultModelTurnCollector,toolExecutor:new DefaultToolExecutor({sessionId:this.id,tools:this.state.tools,dynamicToolProviders:this.dynamicToolProviders,hostDataDir:this.hostDataDir,metadata:this.state.metadata,services:this.services,pluginHost:this.pluginHost,approvalManager:this.approvalManager,notificationBus:this.notificationBus}),terminationPolicy:new DefaultTerminationPolicy,dynamicToolProviders:this.dynamicToolProviders,hostDataDir:this.hostDataDir,pluginHost:this.pluginHost,notificationBus:this.notificationBus,runCompaction:(input)=>this.runObservedCompaction(input),runLastMessageFallbackCompaction:(input)=>this.runLastMessageFallbackCompaction(input),usageLedgerManager:this.usageLedgerManager,observability:this.observability})}async runCompactionInternal(input){let manualTurnId=this.usageLedgerManager.getActiveTurn()?void 0:createId("turn"),resolution="summary",attemptStage="default_summary",turnStatus="completed";if(manualTurnId)this.usageLedgerManager.beginTurn(manualTurnId);try{let budget=input.budget??await this.createCompactionRunBudget(),beforeState=this.getCompactionState();await this.emitCompactionRequiredNotification({trigger:input.trigger,cursorBefore:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,requestId:input.requestId,iteration:input.iteration});let controller=this.readCompactorController();if(!controller){let result2=await this.emitCompactionFailedResult({status:"failed",trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,reasonCode:"compactor_controller_unavailable",reasonMessage:"Configured compactor plugin is unavailable for this session",diagnostics:{},fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration});return turnStatus="error",result2}let planning=readCompactionPlanningOptions(controller);if(input.trigger==="threshold"&&!planning.auto)return this.emitCompactionFailedResult({status:"skipped",trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,reasonCode:"auto_compaction_disabled",reasonMessage:"Threshold-driven compaction is disabled for the active compactor",diagnostics:{},fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration});let plan=createCompactionPlan({messages:this.state.messages,compaction:beforeState,budget,trigger:input.trigger,planning,environmentText:buildCompactionEnvironmentNote(this.getStatus())});if(!plan)return this.emitCompactionFailedResult({status:"skipped",trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,reasonCode:"nothing_to_compact",reasonMessage:"No compaction candidate satisfies the canonical planner constraints",diagnostics:{},fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration});let executionResult;try{let compacted=await controller.compact({plan});executionResult={status:compacted.status,...compacted.summary?{summary:compacted.summary}:{},...compacted.reasonCode?{reasonCode:compacted.reasonCode}:{},...compacted.reasonMessage?{reasonMessage:compacted.reasonMessage}:{},diagnostics:cloneCompactionDiagnostics(compacted.diagnostics)}}catch(error){executionResult={status:"failed",reasonCode:readErrorCode(error)??"summary_generation_failed",reasonMessage:readErrorMessage(error),diagnostics:{}}}if(executionResult.status!=="compacted"){if(executionResult.status==="failed")turnStatus="error";return this.emitCompactionFailedResult({status:executionResult.status,trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,compactedMessageCount:plan.compactedMessages.length,retainedMessageCount:plan.retainedMessages.length,reasonCode:executionResult.reasonCode??(executionResult.status==="skipped"?"compaction_skipped":"summary_generation_failed"),...executionResult.reasonMessage?{reasonMessage:executionResult.reasonMessage}:{},diagnostics:executionResult.diagnostics,fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration})}let summary=executionResult.summary?.trim();if(!summary)return turnStatus="error",this.emitCompactionFailedResult({status:"failed",trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,compactedMessageCount:plan.compactedMessages.length,retainedMessageCount:plan.retainedMessages.length,reasonCode:"invalid_summary_contract",reasonMessage:'Compaction controller returned status="compacted" without a non-empty summary',diagnostics:executionResult.diagnostics,fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration});let afterState;try{afterState=await this.compactionService.apply({sessionId:this.id,cursor:plan.keepStart,systemSegments:[summary],summary,reason:input.trigger,metadata:createCompactionCheckpointMetadata({pluginId:this.state.compactionOptions?.compactorPluginId,resolution:"summary",compactedMessageCount:plan.compactedMessages.length,retainedMessageCount:plan.retainedMessages.length,diagnostics:executionResult.diagnostics,injection:plan.injection})})}catch(error){return turnStatus="error",this.emitCompactionFailedResult({status:"failed",trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,compactedMessageCount:plan.compactedMessages.length,retainedMessageCount:plan.retainedMessages.length,reasonCode:readErrorCode(error)??"compaction_apply_failed",reasonMessage:readErrorMessage(error),diagnostics:executionResult.diagnostics,fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration})}let latestCheckpoint=afterState.checkpoints.at(-1),latestMetadata=latestCheckpoint?.metadata;this.observability?.record({category:"state",event:"state.compaction",phase:"transition",context:{sessionId:this.id,requestId:input.requestId,iteration:input.iteration},before:{cursor:beforeState.cursor,checkpointCount:beforeState.checkpoints.length},after:{cursor:afterState.cursor,checkpointCount:afterState.checkpoints.length},diff:{reason:input.trigger,resolution:"summary",checkpointId:latestCheckpoint?.id,compactedMessageCount:readCompactedMessageCount(latestMetadata)??plan.compactedMessages.length,retainedMessageCount:readRetainedMessageCount(latestMetadata)??plan.retainedMessages.length,fallbackFromReasonCode:input.fallbackFromReasonCode}});let postCompaction=await this.readPostCompactionOutcome({budget,readPostCompactionBudget:input.readPostCompactionBudget});if(postCompaction.postSummaryFitsBudget===!1)return turnStatus="error",this.emitCompactionFailedResult({status:"failed",trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:afterState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,compactedMessageCount:plan.compactedMessages.length,retainedMessageCount:plan.retainedMessages.length,reasonCode:"post_summary_over_budget",reasonMessage:"Compaction summary was applied but the projected request is still over budget",diagnostics:executionResult.diagnostics,summary,checkpointId:latestCheckpoint?.id,estimatedInputTokensAfter:postCompaction.estimatedInputTokensAfter,estimatedSavedTokens:postCompaction.estimatedSavedTokens,postSummaryFitsBudget:postCompaction.postSummaryFitsBudget,fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration});let result={trigger:input.trigger,status:"compacted",resolution:"summary",checkpointId:latestCheckpoint?.id,cursorBefore:beforeState.cursor,cursorAfter:afterState.cursor,compactedMessageCount:readCompactedMessageCount(latestMetadata)??plan.compactedMessages.length,retainedMessageCount:readRetainedMessageCount(latestMetadata)??plan.retainedMessages.length,estimatedInputTokensBefore:budget.estimatedInputTokens,...typeof postCompaction.estimatedInputTokensAfter==="number"?{estimatedInputTokensAfter:postCompaction.estimatedInputTokensAfter}:{},...typeof postCompaction.estimatedSavedTokens==="number"?{estimatedSavedTokens:postCompaction.estimatedSavedTokens}:{},thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,...typeof postCompaction.postSummaryFitsBudget==="boolean"?{postSummaryFitsBudget:postCompaction.postSummaryFitsBudget}:{},summary,...input.fallbackFromReasonCode?{fallbackFromReasonCode:input.fallbackFromReasonCode}:{},diagnostics:executionResult.diagnostics};return await this.emitCompactedNotification({sourceKind:"compaction_run",trigger:input.trigger,resolution:"summary",beforeState,afterState,checkpointId:result.checkpointId,fallbackFromReasonCode:input.fallbackFromReasonCode,compactedMessageCount:result.compactedMessageCount,retainedMessageCount:result.retainedMessageCount,estimatedInputTokensBefore:result.estimatedInputTokensBefore,estimatedInputTokensAfter:result.estimatedInputTokensAfter,estimatedSavedTokens:result.estimatedSavedTokens,thresholdTokens:result.thresholdTokens,plannedOutput:result.plannedOutput,contextWindow:result.contextWindow,postSummaryFitsBudget:result.postSummaryFitsBudget,diagnostics:executionResult.diagnostics,requestId:input.requestId,iteration:input.iteration}),result}catch(error){throw turnStatus=error instanceof SessionExecutionError&&error.payload.code==="session_receive_aborted"?"cancelled":"error",error}finally{if(manualTurnId)this.usageLedgerManager.finalizeTurn({turnId:manualTurnId,status:turnStatus}),this.usageLedgerManager.clearActiveTurn()}}async runObservedCompaction(input){let operation=this.observability?.startOperation("api","api.session.runCompaction",input,{sessionId:this.id,requestId:input.requestId,iteration:input.iteration});try{let result=this.observability?await this.observability.withOperation(operation,()=>this.runCompactionInternal(input)):await this.runCompactionInternal(input);return operation?.success(result),result}catch(error){throw operation?.error(error),error}}async runLastMessageFallbackCompaction(input){let beforeState=this.getCompactionState(),visibleMessages=projectMessagesForRequest(this.state.messages,beforeState).filter((message)=>message.role!=="system");if(visibleMessages.length===0)return;let lastVisibleMessage=visibleMessages.at(-1),targetMessage=[...visibleMessages].reverse().find((message)=>message.role!=="tool")??lastVisibleMessage;if(!targetMessage)return;let compactedMessageCount=visibleMessages.length,retainedMessageCount=0;for(let maxChars of LAST_MESSAGE_FALLBACK_CHAR_LIMITS){let summary=renderLastMessageFallbackSummary(targetMessage,maxChars),afterState=await this.compactionService.apply({sessionId:this.id,cursor:this.state.messages.length,systemSegments:[summary],summary,reason:input.trigger,metadata:createCompactionCheckpointMetadata({resolution:"last_message_fallback",compactedMessageCount,retainedMessageCount,diagnostics:{}})}),latestCheckpoint=afterState.checkpoints.at(-1);this.observability?.record({level:"warn",category:"state",event:"state.compaction",phase:"transition",context:{sessionId:this.id,requestId:input.requestId,iteration:input.iteration},before:{cursor:beforeState.cursor,checkpointCount:beforeState.checkpoints.length},after:{cursor:afterState.cursor,checkpointCount:afterState.checkpoints.length},diff:{reason:input.trigger,resolution:"last_message_fallback",checkpointId:latestCheckpoint?.id,fallbackFromReasonCode:input.fallbackFromReasonCode,compactedMessageCount,retainedMessageCount,summary}});let postCompaction=await this.readPostCompactionOutcome({budget:input.budget,readPostCompactionBudget:input.readPostCompactionBudget});if(postCompaction.postSummaryFitsBudget===!1)continue;let result={trigger:input.trigger,status:"compacted",resolution:"last_message_fallback",checkpointId:latestCheckpoint?.id,cursorBefore:beforeState.cursor,cursorAfter:afterState.cursor,compactedMessageCount,retainedMessageCount,estimatedInputTokensBefore:input.budget.estimatedInputTokens,thresholdTokens:input.budget.thresholdTokens,plannedOutput:input.budget.plannedOutput,contextWindow:input.budget.contextWindow,summary,diagnostics:{}};if(typeof postCompaction.estimatedInputTokensAfter==="number")result.estimatedInputTokensAfter=postCompaction.estimatedInputTokensAfter;if(typeof postCompaction.estimatedSavedTokens==="number")result.estimatedSavedTokens=postCompaction.estimatedSavedTokens;if(typeof postCompaction.postSummaryFitsBudget==="boolean")result.postSummaryFitsBudget=postCompaction.postSummaryFitsBudget;if(input.fallbackFromReasonCode)result.fallbackFromReasonCode=input.fallbackFromReasonCode;return await this.emitCompactedNotification({sourceKind:"compaction_run",trigger:input.trigger,resolution:"last_message_fallback",beforeState,afterState,checkpointId:result.checkpointId,fallbackFromReasonCode:input.fallbackFromReasonCode,compactedMessageCount:result.compactedMessageCount,retainedMessageCount:result.retainedMessageCount,estimatedInputTokensBefore:result.estimatedInputTokensBefore,estimatedInputTokensAfter:result.estimatedInputTokensAfter,estimatedSavedTokens:result.estimatedSavedTokens,thresholdTokens:result.thresholdTokens,plannedOutput:result.plannedOutput,contextWindow:result.contextWindow,postSummaryFitsBudget:result.postSummaryFitsBudget,diagnostics:result.diagnostics,requestId:input.requestId,iteration:input.iteration}),result}}async readPostCompactionOutcome(input){let canEvaluatePostSummaryBudget=Boolean(input.readPostCompactionBudget)||input.budget.contextWindow>0&&this.state.compactionOptions!==void 0&&this.state.compactionOptions.enabled!==!1,postCompactionBudget=await input.readPostCompactionBudget?.()??(canEvaluatePostSummaryBudget?{estimatedInputTokens:await this.readEstimatedInputTokens(),thresholdTokens:input.budget.thresholdTokens,plannedOutput:input.budget.plannedOutput,contextWindow:input.budget.contextWindow}:void 0),estimatedInputTokensAfter=postCompactionBudget?.estimatedInputTokens,estimatedSavedTokens=typeof estimatedInputTokensAfter==="number"?Math.max(0,input.budget.estimatedInputTokens-estimatedInputTokensAfter):void 0,postSummaryFitsBudget=postCompactionBudget!==void 0?postCompactionBudget.estimatedInputTokens<postCompactionBudget.thresholdTokens:void 0;return{...typeof estimatedInputTokensAfter==="number"?{estimatedInputTokensAfter}:{},...typeof estimatedSavedTokens==="number"?{estimatedSavedTokens}:{},...typeof postSummaryFitsBudget==="boolean"?{postSummaryFitsBudget}:{}}}async readEstimatedInputTokens(){let messageFactory=new DefaultMessageFactory,requestMessages=buildRequestMessagesForModel({messages:this.state.messages,compaction:this.state.compaction,createSystemMessage:(text)=>messageFactory.createSystemMessage(text),createUserMessage:(text)=>messageFactory.createUserMessage(text)}),tools=this.state.tools?.definitions()??[];return(await recountCurrentContextSize(this.state,{model:this.state.modelRef,messages:requestMessages,tools})).tokens}async createCompactionRunBudget(){let contextWindow=this.state.model.capabilities?.contextWindow??0,plannedOutput=DEFAULT_SESSION_MAX_OUTPUT_TOKENS,estimatedInputTokens=await this.readEstimatedInputTokens();return{estimatedInputTokens,thresholdTokens:contextWindow>0&&this.state.compactionOptions?calculateThresholdTokens(this.state.compactionOptions,{contextWindow,plannedOutput}):Math.max(1,estimatedInputTokens),plannedOutput,contextWindow}}readCompactorController(){let pluginId=this.state.compactionOptions?.compactorPluginId;if(!pluginId)return;let controller=this.pluginControllers.get(pluginId);return isSessionCompactorController(controller)?controller:void 0}async emitCompactionRequiredNotification(input){await this.notificationBus.emit({type:"context.compaction.required",source:"runtime",level:"warning",message:`Context compaction required for session ${this.id}`,metadata:{trigger:input.trigger,cursorBefore:input.cursorBefore,estimatedInputTokensBefore:input.estimatedInputTokensBefore,thresholdTokens:input.thresholdTokens,plannedOutput:input.plannedOutput,contextWindow:input.contextWindow}},this.createHookContext({requestId:input.requestId,iteration:input.iteration}))}async emitCompactedNotification(input){await this.notificationBus.emit({type:"context.compacted",source:"runtime",level:"info",message:`Context compacted for session ${this.id}`,metadata:{sourceKind:input.sourceKind,trigger:input.trigger,resolution:input.resolution,cursorBefore:input.beforeState.cursor,cursorAfter:input.afterState.cursor,...input.checkpointId?{checkpointId:input.checkpointId}:{},...input.fallbackFromReasonCode?{fallbackFromReasonCode:input.fallbackFromReasonCode}:{},...typeof input.compactedMessageCount==="number"?{compactedMessageCount:input.compactedMessageCount}:{},...typeof input.retainedMessageCount==="number"?{retainedMessageCount:input.retainedMessageCount}:{},...typeof input.estimatedInputTokensBefore==="number"?{estimatedInputTokensBefore:input.estimatedInputTokensBefore}:{},...typeof input.estimatedInputTokensAfter==="number"?{estimatedInputTokensAfter:input.estimatedInputTokensAfter}:{},...typeof input.estimatedSavedTokens==="number"?{estimatedSavedTokens:input.estimatedSavedTokens}:{},...typeof input.thresholdTokens==="number"?{thresholdTokens:input.thresholdTokens}:{},...typeof input.plannedOutput==="number"?{plannedOutput:input.plannedOutput}:{},...typeof input.contextWindow==="number"?{contextWindow:input.contextWindow}:{},...typeof input.postSummaryFitsBudget==="boolean"?{postSummaryFitsBudget:input.postSummaryFitsBudget}:{},...compactionDiagnosticsToMetadataFields(input.diagnostics)}},this.createHookContext({requestId:input.requestId,iteration:input.iteration}))}async emitCompactionFailedResult(input){return await this.notificationBus.emit({type:"context.compaction.failed",source:"runtime",level:input.status==="skipped"?"warning":"error",message:input.reasonMessage??`Compaction failed for session ${this.id}`,metadata:{trigger:input.trigger,attemptStage:input.attemptStage,cursorBefore:input.cursorBefore,estimatedInputTokensBefore:input.estimatedInputTokensBefore,thresholdTokens:input.thresholdTokens,plannedOutput:input.plannedOutput,contextWindow:input.contextWindow,reasonCode:input.reasonCode,...input.reasonMessage?{reasonMessage:input.reasonMessage}:{},...typeof input.compactedMessageCount==="number"?{compactedMessageCount:input.compactedMessageCount}:{},...typeof input.retainedMessageCount==="number"?{retainedMessageCount:input.retainedMessageCount}:{},...compactionDiagnosticsToMetadataFields(input.diagnostics)}},this.createHookContext({requestId:input.requestId,iteration:input.iteration})),{trigger:input.trigger,status:input.status,resolution:input.resolution,...input.checkpointId?{checkpointId:input.checkpointId}:{},cursorBefore:input.cursorBefore,cursorAfter:input.cursorAfter,compactedMessageCount:input.compactedMessageCount??0,retainedMessageCount:input.retainedMessageCount??0,estimatedInputTokensBefore:input.estimatedInputTokensBefore,...typeof input.estimatedInputTokensAfter==="number"?{estimatedInputTokensAfter:input.estimatedInputTokensAfter}:{},...typeof input.estimatedSavedTokens==="number"?{estimatedSavedTokens:input.estimatedSavedTokens}:{},thresholdTokens:input.thresholdTokens,plannedOutput:input.plannedOutput,contextWindow:input.contextWindow,...typeof input.postSummaryFitsBudget==="boolean"?{postSummaryFitsBudget:input.postSummaryFitsBudget}:{},...input.summary?{summary:input.summary}:{},...input.fallbackFromReasonCode?{fallbackFromReasonCode:input.fallbackFromReasonCode}:{},reasonCode:input.reasonCode,...input.reasonMessage?{reasonMessage:input.reasonMessage}:{},diagnostics:cloneCompactionDiagnostics(input.diagnostics)}}createHookContext(input={}){return{sessionId:this.id,requestId:input.requestId,iteration:input.iteration,cwd:this.state.cwd,hostDataDir:this.hostDataDir,metadata:this.state.metadata,status:this.getStatus()}}assertNotDisposed(operation){if(!this.disposed)return;throw new SessionExecutionError({code:"DIM_SESSION_DISPOSED",message:`Cannot ${operation} on disposed session ${this.id}`})}},Agent=class{id;pluginHost;services;tools;permissions;hostDataDir;options;messageFactory=new DefaultMessageFactory;tracker;permissionGateway;approvalManager;notificationBus;compactionService;pluginStateService;inspectGateway;observability;dynamicToolProviders;sessions=new Set;disposed=!1;constructor(options){this.id=createId("agent"),this.options=options,this.permissions=options.permissions,this.hostDataDir=options.hostDataDir?path4.resolve(options.hostDataDir):void 0,validateCompactionOwner(options),this.tracker=new ActivityTracker,this.compactionService=new DefaultCompactionService,this.pluginStateService=new DefaultPluginStateService,this.observability=new ObservabilityRecorder({agentId:this.id,cwd:options.cwd,options:options.observability}),this.inspectGateway=new DefaultInspectGateway({agentId:this.id,cwd:options.cwd,model:structuredClone(options.model.model),capabilities:options.model.capabilities?structuredClone(options.model.capabilities):void 0,reasoning:options.reasoning?structuredClone(options.reasoning):void 0,cache:options.cache?structuredClone(options.cache):void 0,compaction:cloneInspectableCompactionOptions(options.compaction),permissions:options.permissions?{...options.permissions}:void 0,includeBuiltinTools:options.includeBuiltinTools!==!1,autosave:options.autosave??"manual",hostDataDir:this.hostDataDir,stateStore:options.stateStore,getPluginSnapshots:async()=>this.pluginHost.inspectPlugins(),getLiveSessions:async()=>{let liveSessions=[...this.sessions].filter((session)=>!session.isDisposed()).sort((left,right)=>right.updatedAt-left.updatedAt);return Promise.all(liveSessions.map(async(session)=>({sessionId:session.id,status:session.getStatus(),queue:session.getQueueStatus(),snapshot:session.toSnapshot(),pluginInspectors:await this.pluginHost.inspectSessionPlugins(session.id)})))}}),this.services=createServices(options,this.id,this.tracker,this.compactionService,this.pluginStateService,this.inspectGateway,this.observability,(sessionId)=>[...this.sessions].find((candidate)=>candidate.id===sessionId)),this.permissionGateway=new PermissionGateway({permissions:options.permissions}),this.pluginHost=new PluginHost({agentId:this.id,cwd:options.cwd,hostDataDir:this.hostDataDir,plugins:options.plugins,services:this.services,permissionGateway:this.permissionGateway,observability:this.observability}),this.notificationBus=new DefaultNotificationBus({pluginHost:this.pluginHost,services:this.services,handler:options.notificationHandler,onNotification:async(notification,context)=>{await this.persistNotificationBoundary(notification,context)}}),this.approvalManager=options.approvalManager??new DefaultApprovalManager({handler:options.approvalHandler,notifications:this.notificationBus}),this.tools=createToolRegistry({includeBuiltinTools:options.includeBuiltinTools!==!1,tools:options.tools,pluginTools:this.pluginHost.pluginTools()}),this.dynamicToolProviders=this.pluginHost.dynamicToolProviders()}async createSession(options={}){this.assertNotDisposed("create a session");let operation=this.observability.startOperation("api","api.agent.createSession",options);try{let session=await this.observability.withOperation(operation,async()=>{let messages=normalizeSessionMessages(options.messages??[]),allowedToolNames=normalizeAllowedToolNames(options.allowedToolNames),model=options.model??this.options.model;if(options.systemPrompt)messages.unshift(this.messageFactory.createSystemMessage(options.systemPrompt));let session2=new Session({agentId:this.id,id:options.sessionId??createId("session"),model,modelRef:options.modelRef??model.model,tools:createFilteredToolRegistry(this.tools,allowedToolNames),dynamicToolProviders:filterDynamicToolProviders(this.dynamicToolProviders,allowedToolNames),stateStore:this.options.stateStore,transformSnapshot:this.options.transformSnapshot,autosave:this.options.autosave,maxIterations:options.maxIterations??this.options.maxIterations,allowedToolNames,cwd:options.cwd??this.options.cwd,metadata:options.metadata??this.options.metadata,reasoning:options.reasoning??this.options.reasoning,cache:options.cache??this.options.cache,compactionOptions:this.options.compaction,messageQueueConfig:options.messageQueueConfig,messages,hostDataDir:this.hostDataDir,pluginHost:this.pluginHost,services:this.services,approvalManager:this.approvalManager,notificationBus:this.notificationBus,compactionService:this.compactionService,pluginStateService:this.pluginStateService,observability:this.observability});return this.sessions.add(session2),this.observability.record({category:"state",event:"state.session.lifecycle",phase:"transition",context:{sessionId:session2.id},before:{exists:!1},after:{exists:!0,status:"created"},diff:{action:"create"}}),session2});return operation?.success({sessionId:session.id}),session}catch(error){throw operation?.error(error),error}}async restoreSession(sessionId){this.assertNotDisposed("restore a session");let operation=this.observability.startOperation("api","api.agent.restoreSession",{sessionId});try{let session=await this.observability.withOperation(operation,async()=>{if(!this.options.stateStore)return;let persistence=this.observability.startOperation("persistence","persistence.stateStore.load",{sessionId}),snapshot;try{snapshot=await this.options.stateStore.load(sessionId),persistence?.success(snapshot?{sessionId,found:!0}:{sessionId,found:!1})}catch(error){throw persistence?.error(error),error}if(!snapshot)return;return this.sessionFromSnapshot(snapshot)});return operation?.success({sessionId,restored:Boolean(session)}),session}catch(error){throw operation?.error(error),error}}sessionFromSnapshot(snapshot){this.assertNotDisposed("restore a session from snapshot");let operation=this.observability.startOperation("api","api.agent.sessionFromSnapshot",{sessionId:snapshot.sessionId,schemaVersion:snapshot.schemaVersion});try{let normalizedSnapshot=sessionSnapshotCodec.decode(snapshot),allowedToolNames=normalizeAllowedToolNames(normalizedSnapshot.allowedToolNames),messages=normalizeSessionMessages(normalizedSnapshot.messages),session=new Session({agentId:this.id,id:normalizedSnapshot.sessionId,model:this.options.model,modelRef:normalizedSnapshot.model??this.options.model.model,tools:createFilteredToolRegistry(this.tools,allowedToolNames),dynamicToolProviders:filterDynamicToolProviders(this.dynamicToolProviders,allowedToolNames),stateStore:this.options.stateStore,transformSnapshot:this.options.transformSnapshot,autosave:this.options.autosave,maxIterations:normalizedSnapshot.maxIterations??this.options.maxIterations,allowedToolNames,cwd:normalizedSnapshot.cwd??this.options.cwd,metadata:normalizedSnapshot.metadata??this.options.metadata,messages,reasoning:normalizedSnapshot.reasoning??this.options.reasoning,cache:normalizedSnapshot.cache??this.options.cache,usage:normalizedSnapshot.usage,usageLedger:normalizedSnapshot.usageLedger,compaction:normalizedSnapshot.compaction,pluginState:normalizedSnapshot.pluginState,messageQueue:normalizedSnapshot.messageQueue,compactionOptions:this.options.compaction,createdAt:normalizedSnapshot.createdAt,updatedAt:normalizedSnapshot.updatedAt,hostDataDir:this.hostDataDir,pluginHost:this.pluginHost,services:this.services,approvalManager:this.approvalManager,notificationBus:this.notificationBus,compactionService:this.compactionService,pluginStateService:this.pluginStateService,observability:this.observability});return this.sessions.add(session),this.observability.record({category:"state",event:"state.session.lifecycle",phase:"transition",context:{sessionId:session.id},before:{exists:!1},after:{exists:!0,status:"restored"},diff:{action:"restore"}}),operation?.success({sessionId:session.id}),session}catch(error){throw operation?.error(error),error}}async dispose(){if(this.disposed)return;let operation=this.observability.startOperation("api","api.agent.dispose");this.disposed=!0;try{await this.observability.withOperation(operation,async()=>{await Promise.allSettled([...this.sessions].map(async(session)=>session.dispose())),this.sessions.clear(),await this.pluginHost.dispose()}),operation?.success()}catch(error){throw operation?.error(error),error}finally{await this.observability.flush()}}async deleteSession(sessionId){this.assertNotDisposed("delete a session");let operation=this.observability.startOperation("api","api.agent.deleteSession",{sessionId});try{await this.observability.withOperation(operation,async()=>{let loadedSession=[...this.sessions].find((session)=>session.id===sessionId);if(loadedSession?.getQueueStatus().isProcessing)throw Error(`Cannot delete session ${sessionId} while it is processing`);if(loadedSession)await loadedSession.dispose(),this.sessions.delete(loadedSession);if(this.options.stateStore){let persistence=this.observability.startOperation("persistence","persistence.stateStore.delete",{sessionId});try{await this.options.stateStore.delete(sessionId),persistence?.success({sessionId})}catch(error){throw persistence?.error(error),error}}await removeSessionArtifacts(this.hostDataDir,sessionId),this.observability.record({category:"state",event:"state.session.lifecycle",phase:"transition",context:{sessionId},before:{exists:!0},after:{exists:!1,status:"deleted"},diff:{action:"delete"}})}),operation?.success({sessionId})}catch(error){throw operation?.error(error),error}}async pruneSessionArtifacts(){this.assertNotDisposed("prune session artifacts");let operation=this.observability.startOperation("api","api.agent.pruneSessionArtifacts");try{let removed=await this.observability.withOperation(operation,async()=>{if(!this.hostDataDir||!this.options.stateStore)return 0;let plansRoot=path4.join(this.hostDataDir,"plans"),entries;try{entries=await readdir(plansRoot,{withFileTypes:!0,encoding:"utf8"})}catch{return 0}let retainedIds=await this.listPersistedSessionIds();for(let session of this.sessions)retainedIds.add(session.id);let removed2=0;for(let entry of entries){if(!entry.isDirectory())continue;if(retainedIds.has(entry.name))continue;await rm(path4.join(plansRoot,entry.name),{recursive:!0,force:!0}),removed2+=1}return removed2});return operation?.success({removed}),removed}catch(error){throw operation?.error(error),error}}async requestApproval(request,context={sessionId:this.id}){this.assertNotDisposed("request approval");let operation=this.observability.startOperation("api","api.agent.requestApproval",{request,context},{sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration});try{let decision=await this.observability.withOperation(operation,()=>this.approvalManager.requestApproval(request,context));return operation?.success(decision),decision}catch(error){throw operation?.error(error),error}}async listPersistedSessionIds(){let retainedIds=new Set;if(!this.options.stateStore)return retainedIds;let cursor;do{let page=await this.options.stateStore.list({cursor,limit:200});for(let snapshot of page.snapshots)retainedIds.add(snapshot.sessionId);cursor=page.nextCursor}while(cursor!==void 0);return retainedIds}async emitNotification(notification,context={}){this.assertNotDisposed("emit a notification");let operation=this.observability.startOperation("api","api.agent.emitNotification",{notification,context},{sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration});try{let result=await this.observability.withOperation(operation,()=>this.notificationBus.emit(notification,context));return operation?.success(result),result}catch(error){throw operation?.error(error),error}}setObservabilityEnabled(enabled,options){this.assertNotDisposed("toggle observability"),this.observability.setEnabled(enabled,options)}isObservabilityEnabled(){return this.observability.isEnabled()}assertNotDisposed(operation){if(!this.disposed)return;throw Error(`Cannot ${operation} on disposed agent ${this.id}`)}async persistNotificationBoundary(notification,context){if(this.options.autosave!=="evented")return;if(notification.type!=="approval.requested")return;if(!context.sessionId)return;let session=[...this.sessions].find((candidate)=>candidate.id===context.sessionId);if(!session)return;try{await session.save()}catch{}}},builtinSubagentProcessModelFactoryIds;var init_subagent_process_builtins=__esm(()=>{init_heuristic();init_observability();sessionSnapshotCodec=new JsonSnapshotCodec;EXCLUDED_DIRECTORY_NAMES=new Set([".git",".svn",".hg",".bzr",".jj",".sl","node_modules"]),pathMutationLocks=new Map,EDIT_TARGET_FILE_MAX_BYTES=Math.min(1073741824,constants.MAX_STRING_LENGTH),FileModifiedSinceReadError=class extends Error{code="file_modified_since_read";constructor(message=FILE_MODIFIED_SINCE_READ_MESSAGE){super(message);this.name="FileModifiedSinceReadError"}},EditTargetFileTooLargeError=class extends Error{code="edit_target_file_too_large";constructor(bytes,limit=EDIT_TARGET_FILE_MAX_BYTES){super(`edit target file too large: file is ${bytes} bytes, limit is ${limit} bytes.`);this.bytes=bytes,this.limit=limit,this.name="EditTargetFileTooLargeError"}};fullPermissions={fs:"full",git:!0,network:!0,process:!0,model:!0},PermissionDeniedError=class extends Error{code="permission_denied";constructor(message){super(message);this.name="PermissionDeniedError"}};sessionFileRevisions=new Map;EditTool=class extends BaseTool{constructor(){super({name:"edit",description:"Replace text in a UTF-8 file. When editing from read output, use only the file content after the line-number prefix for oldText and newText.",inputSchema:{type:"object",properties:{path:{type:"string",description:"File path to edit."},oldText:{type:"string",description:"Text to replace."},newText:{type:"string",description:"Replacement text."},replaceAll:{type:"boolean",description:"Replace all matches when true."}},required:["path","oldText","newText"]},maxResultSizeChars:1/0})}async execute(args,context){let fileSystem=context.services?.fileSystem;if(!fileSystem)throw Error("FileSystemGateway is not available in the tool execution context");let targetPath=readAliasedStringArg(args,["path","file_path"]),oldText=readAliasedStringArg(args,["oldText","old_string"]),newText=readAliasedStringArg(args,["newText","new_string"],{allowEmpty:!0}),inputChars=oldText.length+newText.length;if(inputChars>1e4)return createToolResult({content:[{type:"text",text:`edit input too large: oldText + newText is ${inputChars} chars, limit is ${EDIT_INPUT_MAX_CHARS} chars.`}],structuredContent:{code:"input_too_large",chars:inputChars,limit:EDIT_INPUT_MAX_CHARS},isError:!0});let replaceAll=readAliasedOptionalBooleanArg(args,["replaceAll","replace_all"])??!1,trackedPath=resolveTrackedPath(fileSystem,context.cwd,targetPath),expectedRevision=getSessionFileRevision(context.sessionId,trackedPath),result;try{result=await fileSystem.editText(targetPath,{oldText,newText,replaceAll,cwd:context.cwd,expectedRevision})}catch(error){if(isFileModifiedSinceReadError$1(error))return createToolResult({content:[{type:"text",text:error.message}],structuredContent:{code:error.code},isError:!0});if(isEditTargetFileTooLargeError(error))return createToolResult({content:[{type:"text",text:error.message}],structuredContent:{code:error.code,bytes:error.bytes,limit:error.limit},isError:!0});if(isNodeErrorCode(error,"ENOENT"))return createMissingFileToolResult(targetPath,fileSystem,context.cwd,"edit");throw error}if(result.revision)rememberSessionFileRevision(context.sessionId,trackedPath,result.revision);else forgetSessionFileRevision(context.sessionId,trackedPath);return createToolResult({content:[{type:"text",text:`Edited ${result.path}`}],structuredContent:result})}};ExecProcessManagerError=class extends Error{code;constructor(code,message){super(message);this.name="ExecProcessManagerError",this.code=code}};builtinExecProcessManager=new BuiltinExecProcessManager;ExecTool=class extends BaseTool{constructor(){super({name:"exec",description:"Execute an argv command as a managed task. Short commands may finish in this call and return output. Long-running commands return a taskId and outputPath; completion will be sent as a task notification. Set runInBackground to true when the result can be handled later. Wait for the completion notification before reading outputPath for full output. Omit shell background markers such as &; the runtime keeps the task running.",inputSchema:{type:"object",properties:{command:{type:"array",items:{type:"string"},description:'Command argv vector. Example: ["pnpm", "test"].'},cwd:{type:"string",description:"Optional working directory for the command."},runInBackground:{type:"boolean",description:"Run the task in the background when the result can be handled later. The task keeps running and sends a completion notification."}},required:["command"],additionalProperties:!1},maxResultSizeChars:1/0})}async execute(args,context){let sessionId=context.sessionId,normalized;try{normalized=normalizeExecInput(args,context),validateExecArgs(normalized);let result=await executeBuiltinExecProcess({sessionId,action:"start",command:normalized.command,cwd:normalized.cwd,outputRoot:resolveExecOutputRoot(context),runInBackground:normalized.runInBackground,signal:context.signal});return createToolResult({content:[{type:"text",text:renderExecOutput({output:result.output,statusInfo:formatExecStatusInfo(result,normalized.runInBackground===!0),includeStatusInfo:!isSuccessfulExitedResult(result),emptyOutputInfo:"(No output)",outputPath:result.outputPath,outputTruncated:result.outputTruncated})}],structuredContent:createExecResultPayload(result,normalized.runInBackground===!0),isError:isExecFailureResult(result)})}catch(error){let message=error instanceof Error?error.message:String(error),code=typeof error==="object"&&error!==null&&"code"in error&&typeof error.code==="string"?error.code:"exec_invalid_request";return createToolResult({content:[{type:"text",text:message}],structuredContent:{code},isError:!0})}}};READ_RESULT_MAX_CHARS=DEFAULT_TOOL_RESULT_MAX_CHARS,ReadTool=class extends BaseTool{constructor(){super({name:"read",description:"Read a UTF-8 text file or supported image from the local filesystem. Text results are returned with 1-indexed line numbers and support optional offset/limit line windows. For image files, pass only path; offset and limit are ignored.",inputSchema:{type:"object",properties:{path:{type:"string",description:"File path to read."},offset:{type:"number",description:"Optional 1-based start line for UTF-8 text files. Defaults to 1. Omit for image files."},limit:{type:"number",description:"Optional maximum number of lines to return for UTF-8 text files. Defaults to 2000. Omit for image files."}},required:["path"]},maxResultSizeChars:1/0})}async execute(args,context){let fileSystem=context.services?.fileSystem;if(!fileSystem)throw Error("FileSystemGateway is not available in the tool execution context");let targetPath=readAliasedStringArg(args,["path","file_path"]),textWindow=hasRasterImageExtension(targetPath)?void 0:parseReadTextWindow(args),bytes;try{bytes=await fileSystem.readBytes(targetPath,{cwd:context.cwd})}catch(error){if(isNodeErrorCode(error,"ENOENT"))return createMissingFileToolResult(targetPath,fileSystem,context.cwd,"read");throw error}let imageMediaType=detectImageMediaType(targetPath,bytes);if(imageMediaType)return this.createImageResult(targetPath,bytes,imageMediaType,context);textWindow??=parseReadTextWindow(args);let text=decodeUtf8Text(bytes);if(text===void 0)return createToolResult({content:[{type:"text",text:`Binary file is not supported by read: ${targetPath}. The read tool currently supports UTF-8 text files and common image files.`}],structuredContent:{code:"binary_unsupported",path:resolveTrackedPath(fileSystem,context.cwd,targetPath)},isError:!0});let trackedPath=resolveTrackedPath(fileSystem,context.cwd,targetPath),revision=rememberSessionFileText(context.sessionId,trackedPath,text),lines=splitTextLines(text);if(lines.length===0)return createTextReadResult("",{path:targetPath,size:Buffer.byteLength(text,"utf8"),revision});if(textWindow.offset>lines.length)return createToolResult({content:[{type:"text",text:`Read offset ${textWindow.offset} exceeds file length.`}],structuredContent:{code:"offset_out_of_range",path:targetPath},isError:!0});return buildReadTextResult({targetPath,lines,offset:textWindow.offset,limit:textWindow.limit,rawLimitProvided:textWindow.rawLimitProvided,structuredContent:{path:targetPath,size:Buffer.byteLength(text,"utf8"),revision}})}createImageResult(targetPath,bytes,mediaType,context){let filename=path4.basename(targetPath),base64=Buffer.from(bytes).toString("base64");if(!modelSupportsImageInputs(context))return createToolResult({content:[{type:"text",text:`Image metadata: ${filename} (${mediaType}, ${bytes.byteLength} bytes). Current model does not advertise image input support, so the image was not added to model context.`}],structuredContent:{path:targetPath,size:bytes.byteLength,mediaType,kind:"image",deliveredAs:"metadata"}});return createToolResult({content:[{type:"text",text:`Loaded image into model context: ${filename}.`}],structuredContent:{path:targetPath,size:bytes.byteLength,mediaType,kind:"image",deliveredAs:"context_message"},contextMessages:[{role:"user",content:[{type:"text",text:`Image loaded from read(${targetPath}). Use it as additional context.
|
|
44
|
+
`),message=this.messageFactory.createUserMessage(content,{metadata:{kind:"task_notification",source:"exec"}}),boundedIndex=insertBeforeIndex===void 0?state.messages.length:Math.max(0,Math.min(insertBeforeIndex,state.messages.length));state.messages.splice(boundedIndex,0,message),markContextSizeStale(state),touchRuntimeSessionState(state)}async handleRunFailure(state,error,lastRequestId,lastIteration){if(!(error instanceof SessionExecutionError))return;await this.notificationBus.emit({type:error.payload.code.startsWith("openai_")||error.payload.code.startsWith("anthropic_")||error.payload.code.startsWith("gemini_")?"provider.error":"runtime.error",source:error.payload.code.includes("_http_")||error.payload.code.includes("_request_")?"provider":"runtime",level:"error",message:error.payload.message,metadata:{requestId:lastRequestId,code:error.payload.code}},{...this.createHookContext(state,{requestId:lastRequestId,iteration:lastIteration})}),await this.pluginHost?.runObservers("session.error",{error:error.payload},{...this.createHookContext(state,{requestId:lastRequestId})})}createHookContext(state,input={}){return{sessionId:state.id,requestId:input.requestId,iteration:input.iteration,cwd:state.cwd,hostDataDir:this.hostDataDir,metadata:state.metadata,status:createSessionStatus(state)}}async collectDynamicToolDefinitions(state,input){let tools=[];for(let provider of this.dynamicToolProviders){let nextTools=await provider.listTools({sessionId:state.id,input,messages:[...state.messages],cwd:state.cwd,metadata:state.metadata?{...state.metadata}:void 0});tools.push(...nextTools.map(createToolDefinition))}return tools}async completeRun(state,prepared,assistantMessage,assistantIndex,options){let beforeUsageSummary=this.usageLedgerManager.getUsageSummary(),usageOperation=this.observability?.startOperation("usage","usage.turn.finalize",{turnId:options.turnId??prepared.requestId,itemId:options.itemId,status:"completed",resultRequestId:prepared.requestId},{sessionId:state.id,requestId:prepared.requestId,iteration:prepared.iteration}),usageSummary;try{usageSummary=this.usageLedgerManager.finalizeTurn({turnId:options.turnId??prepared.requestId,itemId:options.itemId,status:"completed",resultRequestId:prepared.requestId}),this.observability?.record({category:"state",event:"state.usageLedger",phase:"transition",context:{sessionId:state.id,requestId:prepared.requestId,iteration:prepared.iteration,parentOperationId:usageOperation?.operationId},before:beforeUsageSummary,after:this.usageLedgerManager.getUsageSummary(),diff:{turnId:usageSummary.turnId,requestCount:usageSummary.requestCount,status:usageSummary.status}}),usageOperation?.success(usageSummary)}catch(error){throw usageOperation?.error(error),error}let runEndContext=this.createHookContext(state,{requestId:prepared.requestId,iteration:prepared.iteration}),completedMessage=(await this.pluginHost?.runMiddleware("run.end",{message:assistantMessage,usageSummary},runEndContext))?.message??assistantMessage,completedUsage=cloneUsage(usageSummary.resultUsage);state.messages[assistantIndex]=completedMessage,touchRuntimeSessionState(state);let completedContext=this.createHookContext(state,{requestId:prepared.requestId,iteration:prepared.iteration});return await this.notificationBus.emit({type:"run.end",source:"runtime",message:`Run completed for session ${state.id}`,metadata:{sessionId:state.id,requestId:prepared.requestId}},{...completedContext}),await this.pluginHost?.runObservers("run.end",{message:completedMessage,usageSummary},completedContext),await options.onDone?.(completedMessage),{message:completedMessage,usage:completedUsage,usageSummary}}},SessionUsageLedgerManager=class{state;pendingRequests=new Map;activeTurn;constructor(state){this.state=state}getUsageSummary(){return structuredClone(this.state.usageLedger.summary)}getUsageLedger(){return structuredClone(this.state.usageLedger)}getTurnUsage(turnId){let summary=this.state.usageLedger.turns.find((entry)=>entry.turnId===turnId);return summary?structuredClone(summary):void 0}listTurnUsages(){return this.state.usageLedger.turns.map((entry)=>structuredClone(entry))}listRequestUsages(filter={}){return this.state.usageLedger.requests.filter((entry)=>{if(filter.turnId&&entry.turnId!==filter.turnId)return!1;if(filter.kind&&entry.kind!==filter.kind)return!1;return!0}).map((entry)=>structuredClone(entry))}beginTurn(turnId,itemId,startedAt=Date.now()){this.activeTurn={turnId,itemId,startedAt}}getActiveTurn(){if(!this.activeTurn)return;return{turnId:this.activeTurn.turnId,itemId:this.activeTurn.itemId}}clearActiveTurn(){this.activeTurn=void 0}beginRequest(input){this.pendingRequests.set(input.requestId,{sessionId:this.state.id,turnId:input.turnId,itemId:input.itemId,requestId:input.requestId,parentRequestId:input.parentRequestId,kind:input.kind,startedAt:input.startedAt??Date.now(),model:input.model?{...input.model}:void 0,baselineUsage:cloneUsage(this.state.usage),contextWindow:input.contextWindow,estimatedInputTokens:input.estimatedInputTokens})}completeRequest(input){let pending=this.pendingRequests.get(input.requestId);if(!pending)return;this.pendingRequests.delete(input.requestId);let record=finalizeUsageRequestRecord(this.state,pending,input);return this.state.usageLedger.requests.push(record),this.state.usageLedger.summary.requestCount=this.state.usageLedger.requests.length,this.state.usageLedger.summary.updatedAt=record.completedAt,this.state.usageLedger.summary.totalUsage=addUsage(this.state.usageLedger.summary.totalUsage,record.usage),mergeBreakdownUsage(this.state.usageLedger.summary.breakdown,record.kind,record.usage),this.state.usage=cloneUsage(this.state.usageLedger.summary.totalUsage),touchRuntimeSessionState(this.state),structuredClone(record)}finalizeTurn(input){let requests=this.state.usageLedger.requests.filter((entry)=>entry.turnId===input.turnId),existingIndex=this.state.usageLedger.turns.findIndex((entry)=>entry.turnId===input.turnId),startedAt=this.activeTurn?.turnId===input.turnId?this.activeTurn.startedAt:requests[0]?.startedAt??Date.now(),completedAt=input.completedAt??Date.now(),totalUsage=requests.reduce((usage,entry)=>addUsage(usage,entry.usage),createEmptyUsage()),breakdown=requests.reduce((current,entry)=>{return mergeBreakdownUsage(current,entry.kind,entry.usage),current},{}),resultUsage=cloneUsage(input.resultRequestId?requests.find((entry)=>entry.requestId===input.resultRequestId)?.usage:void 0),summary={turnId:input.turnId,sessionId:this.state.id,itemId:input.itemId??this.activeTurn?.itemId,status:input.status,startedAt,completedAt,requestCount:requests.length,resultUsage,totalUsage,breakdown,requestIds:requests.map((entry)=>entry.requestId)};if(existingIndex>=0)this.state.usageLedger.turns[existingIndex]=summary;else this.state.usageLedger.turns.push(summary);return this.state.usageLedger.summary.turnCount=this.state.usageLedger.turns.length,this.state.usageLedger.summary.updatedAt=completedAt,this.state.usage=cloneUsage(this.state.usageLedger.summary.totalUsage),touchRuntimeSessionState(this.state),structuredClone(summary)}},LAST_MESSAGE_FALLBACK_CHAR_LIMITS,CONTINUATION_SUMMARY_OPEN_TAG="<continuation_summary>",CONTINUATION_SUMMARY_CLOSE_TAG="</continuation_summary>",Session=class{id;createdAt;agentId;stateStore;transformSnapshot;state;dynamicToolProviders;hostDataDir;pluginHost;services;approvalManager;notificationBus;compactionService;pluginStateService;observability;pluginControllers;persistence;queueRuntime;usageLedgerManager;disposed=!1;disposePromise;constructor(options){let now=Date.now();if(this.id=options.id??createId("session"),this.agentId=options.agentId,this.createdAt=options.createdAt??now,this.stateStore=options.stateStore,this.transformSnapshot=options.transformSnapshot,this.dynamicToolProviders=[...options.dynamicToolProviders??[]],this.hostDataDir=options.hostDataDir,this.pluginHost=options.pluginHost,this.services=options.services,this.approvalManager=options.approvalManager,this.notificationBus=options.notificationBus,this.compactionService=options.compactionService,this.pluginStateService=options.pluginStateService,this.observability=options.observability,this.state={id:this.id,model:options.model,modelRef:options.modelRef??options.model.model,tools:options.tools,maxIterations:options.maxIterations??8,allowedToolNames:options.allowedToolNames?[...options.allowedToolNames]:void 0,cwd:options.cwd,metadata:options.metadata,reasoning:options.reasoning,cache:options.cache?structuredClone(options.cache):void 0,messages:cloneMessages(options.messages??[]),usage:options.usage?{...options.usage}:createEmptyUsage(),usageLedger:normalizeSessionUsageLedger(this.id,options.usageLedger,options.usage??createEmptyUsage()),compaction:cloneCompactionState(options.compaction??createEmptyCompactionState()),pluginState:clonePluginStateMap(options.pluginState),messageQueue:cloneMessageQueueSnapshot(options.messageQueue??{items:[],config:createMessageQueueConfig(options.messageQueueConfig)}),compactionOptions:options.compactionOptions,createdAt:this.createdAt,updatedAt:options.updatedAt??now},this.state.usage={...this.state.usageLedger.summary.totalUsage},options.messageQueueConfig)this.state.messageQueue.config=createMessageQueueConfig(options.messageQueueConfig,this.state.messageQueue.config);this.compactionService.registerSession(this.state),this.pluginStateService.registerSession(this.state),this.usageLedgerManager=new SessionUsageLedgerManager(this.state),this.persistence=new SessionPersistenceCoordinator({stateStore:this.stateStore,autosave:options.autosave,writeSnapshot:()=>this.writeSnapshot()}),this.queueRuntime=new SessionQueueRuntime({agentId:this.agentId,sessionId:this.id,state:this.state,observability:this.observability,createErrorEvent:(item,error)=>this.createErrorEvent(item,error),runItem:(input,signal,emit)=>this.runQueuedItem(input,signal,emit),persistRunTerminalStateQuietly:()=>this.persistence.persistRunTerminalStateQuietly(),scheduleQueueMutationSave:()=>this.persistence.scheduleQueueMutationSave()}),this.pluginControllers=this.pluginHost?.createSessionControllers({sessionId:this.id,metadata:this.state.metadata,getStatus:()=>this.getStatus(),save:()=>this.save(),isRunning:()=>this.queueRuntime.isRunning()})??new Map}get messages(){return cloneMessages(this.state.messages)}get usage(){return{...this.state.usage}}getUsageSummary(){return this.usageLedgerManager.getUsageSummary()}getUsageLedger(){return this.usageLedgerManager.getUsageLedger()}getTurnUsage(turnId){return this.usageLedgerManager.getTurnUsage(turnId)}listTurnUsages(){return this.usageLedgerManager.listTurnUsages()}listRequestUsages(filter={}){return this.usageLedgerManager.listRequestUsages(filter)}getStatus(){return createSessionStatus(this.state)}getCompactionState(){return cloneCompactionState(this.state.compaction)}getCurrentContextSize(){let snapshot=this.state.currentContextSize;return snapshot?{...snapshot}:void 0}async ensureCurrentContextSize(){let operation=this.observability?.startOperation("api","api.session.ensureCurrentContextSize",void 0,{sessionId:this.id});try{let snapshot=await this.observability?.withOperation(operation,async()=>{let messageFactory=new DefaultMessageFactory,requestMessages=buildRequestMessagesForModel({messages:this.state.messages,compaction:this.state.compaction,createSystemMessage:(text)=>messageFactory.createSystemMessage(text),createUserMessage:(text)=>messageFactory.createUserMessage(text)}),tools=this.state.tools?.definitions()??[],before=this.state.currentContextSize?{...this.state.currentContextSize}:void 0,snapshot2=await recountCurrentContextSize(this.state,{model:this.state.modelRef,messages:requestMessages,tools});return this.observability?.record({category:"state",event:"state.contextSize",phase:"transition",context:{sessionId:this.id},before,after:snapshot2,diff:{tokens:snapshot2.tokens,contextWindow:snapshot2.contextWindow,stale:snapshot2.stale}}),snapshot2})??await(async()=>{let messageFactory=new DefaultMessageFactory,requestMessages=buildRequestMessagesForModel({messages:this.state.messages,compaction:this.state.compaction,createSystemMessage:(text)=>messageFactory.createSystemMessage(text),createUserMessage:(text)=>messageFactory.createUserMessage(text)}),tools=this.state.tools?.definitions()??[];return recountCurrentContextSize(this.state,{model:this.state.modelRef,messages:requestMessages,tools})})();return operation?.success(snapshot),{...snapshot}}catch(error){throw operation?.error(error),error}}async countTokens(request){let operation=this.observability?.startOperation("api","api.session.countTokens",request,{sessionId:this.id});try{let tokens=await this.observability?.withOperation(operation,async()=>{let adapter=this.state.model.adapter,effectiveModel=request.model??this.state.modelRef,effectiveRequest={...request,model:effectiveModel};if(adapter.countTokens)return adapter.countTokens(effectiveRequest);return estimateRequestTokens(effectiveRequest)})??await(async()=>{let adapter=this.state.model.adapter,effectiveModel=request.model??this.state.modelRef,effectiveRequest={...request,model:effectiveModel};if(adapter.countTokens)return adapter.countTokens(effectiveRequest);return estimateRequestTokens(effectiveRequest)})();return operation?.success({tokens}),tokens}catch(error){throw operation?.error(error),error}}async getCompactionBudget(options){let operation=this.observability?.startOperation("api","api.session.getCompactionBudget",options,{sessionId:this.id});try{let budget=await this.observability?.withOperation(operation,async()=>{if(!this.state.compactionOptions||this.state.compactionOptions.enabled===!1)return;let contextWindow=this.state.model.capabilities?.contextWindow??0;if(contextWindow<=0)return;let plannedOutput=options?.plannedOutput??4000,snapshot=await this.ensureCurrentContextSize();return buildCompactionBudget(this.state.compactionOptions,snapshot.tokens,{contextWindow,plannedOutput})})??await(async()=>{if(!this.state.compactionOptions||this.state.compactionOptions.enabled===!1)return;let contextWindow=this.state.model.capabilities?.contextWindow??0;if(contextWindow<=0)return;let plannedOutput=options?.plannedOutput??4000,snapshot=await this.ensureCurrentContextSize();return buildCompactionBudget(this.state.compactionOptions,snapshot.tokens,{contextWindow,plannedOutput})})();return operation?.success(budget),budget}catch(error){throw operation?.error(error),error}}getPluginState(pluginId){return clonePluginSessionStateEntry(this.state.pluginState[pluginId])}listPluginStates(){return clonePluginStateMap(this.state.pluginState)}getPlugin(pluginId){return this.pluginControllers.get(pluginId)}get updatedAt(){return this.state.updatedAt}isDisposed(){return this.disposed}getCwd(){return this.state.cwd}setCwd(cwd){let operation=this.observability?.startOperation("api","api.session.setCwd",{cwd},{sessionId:this.id}),before={cwd:this.state.cwd};try{this.state.cwd=cwd,touchRuntimeSessionState(this.state),this.observability?.record({category:"state",event:"state.session.cwd",phase:"transition",context:{sessionId:this.id},before,after:{cwd:this.state.cwd},diff:{cwd}}),operation?.success({cwd})}catch(error){throw operation?.error(error),error}}send(input,options={}){return this.queueRuntime.send(input,options)}sendBatch(items){return this.queueRuntime.sendBatch(items)}steer(input,options={}){return this.queueRuntime.steer(input,options)}cancelQueuedItem(itemId){return this.queueRuntime.cancelQueuedItem(itemId)}getQueueStatus(){return this.queueRuntime.getQueueStatus()}clearQueue(filter={}){return this.queueRuntime.clearQueue(filter)}async*receive(options={}){let operation=this.observability?.startOperation("api","api.session.receiveStream",{hasSignal:Boolean(options.signal)},{sessionId:this.id}),eventCount=0;try{for await(let event of this.queueRuntime.receive(options))eventCount+=1,yield event;operation?.success({eventCount})}catch(error){throw operation?.error(error,{eventCount}),error}}async runCompaction(input){this.assertNotDisposed("run compaction");let operation=this.observability?.startOperation("api","api.session.runCompaction",input,{sessionId:this.id});try{let result=this.observability?await this.observability.withOperation(operation,()=>this.runCompactionInternal(input)):await this.runCompactionInternal(input);return operation?.success(result),result}catch(error){throw operation?.error(error),error}}async compact(update){this.assertNotDisposed("compact");let operation=this.observability?.startOperation("api","api.session.compact",update,{sessionId:this.id});try{await this.observability?.withOperation(operation,async()=>{let trigger=update.reason??"manual",beforeState=this.getCompactionState(),afterState=await this.compactionService.apply({sessionId:this.id,...update,reason:trigger}),latestCheckpoint=afterState.checkpoints.at(-1),latestMetadata=latestCheckpoint?.metadata;this.observability?.record({category:"state",event:"state.compaction",phase:"transition",context:{sessionId:this.id},before:{cursor:beforeState.cursor,checkpointCount:beforeState.checkpoints.length},after:{cursor:afterState.cursor,checkpointCount:afterState.checkpoints.length},diff:{reason:trigger,checkpointId:latestCheckpoint?.id,compactedMessageCount:readCompactedMessageCount(latestMetadata),retainedMessageCount:readRetainedMessageCount(latestMetadata)}}),await this.emitCompactedNotification({sourceKind:"host_low_level",trigger,resolution:readCompactionResolution(latestMetadata)??"summary",beforeState,afterState,checkpointId:latestCheckpoint?.id,compactedMessageCount:readCompactedMessageCount(latestMetadata),retainedMessageCount:readRetainedMessageCount(latestMetadata),diagnostics:readCompactionDiagnostics(latestMetadata)})})??await(async()=>{let trigger=update.reason??"manual",beforeState=this.getCompactionState(),afterState=await this.compactionService.apply({sessionId:this.id,...update,reason:trigger}),latestCheckpoint=afterState.checkpoints.at(-1),latestMetadata=latestCheckpoint?.metadata;await this.emitCompactedNotification({sourceKind:"host_low_level",trigger,resolution:readCompactionResolution(latestMetadata)??"summary",beforeState,afterState,checkpointId:latestCheckpoint?.id,compactedMessageCount:readCompactedMessageCount(latestMetadata),retainedMessageCount:readRetainedMessageCount(latestMetadata),diagnostics:readCompactionDiagnostics(latestMetadata)})})(),operation?.success()}catch(error){throw operation?.error(error),error}}async save(){this.assertNotDisposed("save");let operation=this.observability?.startOperation("api","api.session.save",void 0,{sessionId:this.id});try{if(this.observability)await this.observability.withOperation(operation,()=>this.persistence.save());else await this.persistence.save();operation?.success()}catch(error){throw operation?.error(error),error}}async dispose(){if(this.disposePromise)return this.disposePromise;return this.disposePromise=(async()=>{if(this.disposed)return;let operation=this.observability?.startOperation("api","api.session.dispose",void 0,{sessionId:this.id});this.disposed=!0;try{await this.observability?.withOperation(operation,async()=>{this.queueRuntime.dispose(),this.compactionService.unregisterSession(this.id),this.pluginStateService.unregisterSession(this.id),clearSessionFileRevisions(this.id),await disposeBuiltinExecSession(this.id),await Promise.allSettled([...this.pluginControllers.values()].map(async(controller)=>{await controllerDispose(controller)})),this.observability?.record({category:"state",event:"state.session.lifecycle",phase:"transition",context:{sessionId:this.id},before:{disposed:!1},after:{disposed:!0},diff:{action:"dispose"}})})??await(async()=>{this.queueRuntime.dispose(),this.compactionService.unregisterSession(this.id),this.pluginStateService.unregisterSession(this.id),clearSessionFileRevisions(this.id),await disposeBuiltinExecSession(this.id),await Promise.allSettled([...this.pluginControllers.values()].map(async(controller)=>{await controllerDispose(controller)}))})(),operation?.success()}catch(error){throw operation?.error(error),error}})(),this.disposePromise}toSnapshot(){return sessionSnapshotCodec.encode({sessionId:this.id,model:this.state.modelRef,cwd:this.state.cwd,messages:this.messages,usage:this.usage,usageLedger:this.getUsageLedger(),compaction:this.getCompactionState(),pluginState:this.listPluginStates(),createdAt:this.createdAt,updatedAt:this.updatedAt,metadata:this.state.metadata?{...this.state.metadata}:void 0,messageQueue:cloneMessageQueueSnapshot(this.state.messageQueue),reasoning:this.state.reasoning?structuredClone(this.state.reasoning):void 0,cache:this.state.cache?structuredClone(this.state.cache):void 0,maxIterations:this.state.maxIterations,allowedToolNames:this.state.allowedToolNames?[...this.state.allowedToolNames]:void 0})}async writeSnapshot(){if(!this.stateStore)return;let operation=this.observability?.startOperation("persistence","persistence.stateStore.save",{sessionId:this.id},{sessionId:this.id}),snapshot=this.toSnapshot();try{if(this.pluginHost)snapshot=await this.pluginHost.runMiddleware("snapshot.encode",{snapshot},{...this.createHookContext(),services:this.services}).then((payload)=>payload.snapshot);if(this.transformSnapshot)snapshot=await this.transformSnapshot(snapshot);await this.stateStore.save({snapshot,usageLedger:this.getUsageLedger()}),operation?.success({schemaVersion:snapshot.schemaVersion,messageCount:snapshot.messages.length,usageLedger:this.getUsageSummary()}),await this.pluginHost?.runObservers("snapshot.saved",{snapshot},{...this.createHookContext(),services:this.services}),await this.notificationBus.emit({type:"snapshot.saved",source:"persistence",level:"info",message:`Saved snapshot for session ${this.id}`,metadata:{sessionId:this.id,schemaVersion:snapshot.schemaVersion}},{...this.createHookContext()})}catch(error){throw operation?.error(error),error}}async runQueuedItem(input,signal,emit){this.usageLedgerManager.beginTurn(input.item.id,input.item.id);let runner=this.createLoopRunner(),run=async()=>{let iterator=runner.run(this.state,input.item.input,{signal,turnId:input.item.id,itemId:input.item.id,persistentPromptSegments:input.steerSegments,messageMetadata:input.item.metadata,drainPendingSteer:()=>this.queueRuntime.drainPendingSteer()});try{while(!0){let next=await iterator.next();if(next.done)return;if(await emit(next.value),next.value.type==="tool_result"||next.value.type==="done"||next.value.type==="turn_usage")await this.persistence.persistEventBoundaryQuietly()}}finally{this.usageLedgerManager.clearActiveTurn()}};if(!this.observability)return await run();return await this.observability.withContext({sessionId:this.id,traceId:input.item.traceId,turnId:input.item.turnId??input.item.id},run)}createErrorEvent(item,error){let payload=error instanceof SessionExecutionError?error.payload:{code:"runtime_error",message:error instanceof Error?error.message:String(error)};return{type:"error",sessionId:this.id,error:payload,itemId:item.id,itemKind:item.kind,priority:item.priority}}createLoopRunner(){return new LoopRunner({messageFactory:new DefaultMessageFactory,turnCollector:new DefaultModelTurnCollector,toolExecutor:new DefaultToolExecutor({sessionId:this.id,tools:this.state.tools,dynamicToolProviders:this.dynamicToolProviders,hostDataDir:this.hostDataDir,metadata:this.state.metadata,services:this.services,pluginHost:this.pluginHost,approvalManager:this.approvalManager,notificationBus:this.notificationBus}),terminationPolicy:new DefaultTerminationPolicy,dynamicToolProviders:this.dynamicToolProviders,hostDataDir:this.hostDataDir,pluginHost:this.pluginHost,notificationBus:this.notificationBus,runCompaction:(input)=>this.runObservedCompaction(input),runLastMessageFallbackCompaction:(input)=>this.runLastMessageFallbackCompaction(input),usageLedgerManager:this.usageLedgerManager,observability:this.observability})}async runCompactionInternal(input){let manualTurnId=this.usageLedgerManager.getActiveTurn()?void 0:createId("turn"),resolution="summary",attemptStage="default_summary",turnStatus="completed";if(manualTurnId)this.usageLedgerManager.beginTurn(manualTurnId);try{let budget=input.budget??await this.createCompactionRunBudget(),beforeState=this.getCompactionState();await this.emitCompactionRequiredNotification({trigger:input.trigger,cursorBefore:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,requestId:input.requestId,iteration:input.iteration});let controller=this.readCompactorController();if(!controller){let result2=await this.emitCompactionFailedResult({status:"failed",trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,reasonCode:"compactor_controller_unavailable",reasonMessage:"Configured compactor plugin is unavailable for this session",diagnostics:{},fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration});return turnStatus="error",result2}let planning=readCompactionPlanningOptions(controller);if(input.trigger==="threshold"&&!planning.auto)return this.emitCompactionFailedResult({status:"skipped",trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,reasonCode:"auto_compaction_disabled",reasonMessage:"Threshold-driven compaction is disabled for the active compactor",diagnostics:{},fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration});let plan=createCompactionPlan({messages:this.state.messages,compaction:beforeState,budget,trigger:input.trigger,planning,environmentText:buildCompactionEnvironmentNote(this.getStatus())});if(!plan)return this.emitCompactionFailedResult({status:"skipped",trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,reasonCode:"nothing_to_compact",reasonMessage:"No compaction candidate satisfies the canonical planner constraints",diagnostics:{},fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration});let executionResult;try{let compacted=await controller.compact({plan});executionResult={status:compacted.status,...compacted.summary?{summary:compacted.summary}:{},...compacted.reasonCode?{reasonCode:compacted.reasonCode}:{},...compacted.reasonMessage?{reasonMessage:compacted.reasonMessage}:{},diagnostics:cloneCompactionDiagnostics(compacted.diagnostics)}}catch(error){executionResult={status:"failed",reasonCode:readErrorCode(error)??"summary_generation_failed",reasonMessage:readErrorMessage(error),diagnostics:{}}}if(executionResult.status!=="compacted"){if(executionResult.status==="failed")turnStatus="error";return this.emitCompactionFailedResult({status:executionResult.status,trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,compactedMessageCount:plan.compactedMessages.length,retainedMessageCount:plan.retainedMessages.length,reasonCode:executionResult.reasonCode??(executionResult.status==="skipped"?"compaction_skipped":"summary_generation_failed"),...executionResult.reasonMessage?{reasonMessage:executionResult.reasonMessage}:{},diagnostics:executionResult.diagnostics,fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration})}let summary=executionResult.summary?.trim();if(!summary)return turnStatus="error",this.emitCompactionFailedResult({status:"failed",trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,compactedMessageCount:plan.compactedMessages.length,retainedMessageCount:plan.retainedMessages.length,reasonCode:"invalid_summary_contract",reasonMessage:'Compaction controller returned status="compacted" without a non-empty summary',diagnostics:executionResult.diagnostics,fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration});let afterState;try{afterState=await this.compactionService.apply({sessionId:this.id,cursor:plan.keepStart,systemSegments:[summary],summary,reason:input.trigger,metadata:createCompactionCheckpointMetadata({pluginId:this.state.compactionOptions?.compactorPluginId,resolution:"summary",compactedMessageCount:plan.compactedMessages.length,retainedMessageCount:plan.retainedMessages.length,diagnostics:executionResult.diagnostics,injection:plan.injection})})}catch(error){return turnStatus="error",this.emitCompactionFailedResult({status:"failed",trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:beforeState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,compactedMessageCount:plan.compactedMessages.length,retainedMessageCount:plan.retainedMessages.length,reasonCode:readErrorCode(error)??"compaction_apply_failed",reasonMessage:readErrorMessage(error),diagnostics:executionResult.diagnostics,fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration})}let latestCheckpoint=afterState.checkpoints.at(-1),latestMetadata=latestCheckpoint?.metadata;this.observability?.record({category:"state",event:"state.compaction",phase:"transition",context:{sessionId:this.id,requestId:input.requestId,iteration:input.iteration},before:{cursor:beforeState.cursor,checkpointCount:beforeState.checkpoints.length},after:{cursor:afterState.cursor,checkpointCount:afterState.checkpoints.length},diff:{reason:input.trigger,resolution:"summary",checkpointId:latestCheckpoint?.id,compactedMessageCount:readCompactedMessageCount(latestMetadata)??plan.compactedMessages.length,retainedMessageCount:readRetainedMessageCount(latestMetadata)??plan.retainedMessages.length,fallbackFromReasonCode:input.fallbackFromReasonCode}});let postCompaction=await this.readPostCompactionOutcome({budget,readPostCompactionBudget:input.readPostCompactionBudget});if(postCompaction.postSummaryFitsBudget===!1)return turnStatus="error",this.emitCompactionFailedResult({status:"failed",trigger:input.trigger,resolution:"summary",attemptStage:"default_summary",cursorBefore:beforeState.cursor,cursorAfter:afterState.cursor,estimatedInputTokensBefore:budget.estimatedInputTokens,thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,compactedMessageCount:plan.compactedMessages.length,retainedMessageCount:plan.retainedMessages.length,reasonCode:"post_summary_over_budget",reasonMessage:"Compaction summary was applied but the projected request is still over budget",diagnostics:executionResult.diagnostics,summary,checkpointId:latestCheckpoint?.id,estimatedInputTokensAfter:postCompaction.estimatedInputTokensAfter,estimatedSavedTokens:postCompaction.estimatedSavedTokens,postSummaryFitsBudget:postCompaction.postSummaryFitsBudget,fallbackFromReasonCode:input.fallbackFromReasonCode,requestId:input.requestId,iteration:input.iteration});let result={trigger:input.trigger,status:"compacted",resolution:"summary",checkpointId:latestCheckpoint?.id,cursorBefore:beforeState.cursor,cursorAfter:afterState.cursor,compactedMessageCount:readCompactedMessageCount(latestMetadata)??plan.compactedMessages.length,retainedMessageCount:readRetainedMessageCount(latestMetadata)??plan.retainedMessages.length,estimatedInputTokensBefore:budget.estimatedInputTokens,...typeof postCompaction.estimatedInputTokensAfter==="number"?{estimatedInputTokensAfter:postCompaction.estimatedInputTokensAfter}:{},...typeof postCompaction.estimatedSavedTokens==="number"?{estimatedSavedTokens:postCompaction.estimatedSavedTokens}:{},thresholdTokens:budget.thresholdTokens,plannedOutput:budget.plannedOutput,contextWindow:budget.contextWindow,...typeof postCompaction.postSummaryFitsBudget==="boolean"?{postSummaryFitsBudget:postCompaction.postSummaryFitsBudget}:{},summary,...input.fallbackFromReasonCode?{fallbackFromReasonCode:input.fallbackFromReasonCode}:{},diagnostics:executionResult.diagnostics};return await this.emitCompactedNotification({sourceKind:"compaction_run",trigger:input.trigger,resolution:"summary",beforeState,afterState,checkpointId:result.checkpointId,fallbackFromReasonCode:input.fallbackFromReasonCode,compactedMessageCount:result.compactedMessageCount,retainedMessageCount:result.retainedMessageCount,estimatedInputTokensBefore:result.estimatedInputTokensBefore,estimatedInputTokensAfter:result.estimatedInputTokensAfter,estimatedSavedTokens:result.estimatedSavedTokens,thresholdTokens:result.thresholdTokens,plannedOutput:result.plannedOutput,contextWindow:result.contextWindow,postSummaryFitsBudget:result.postSummaryFitsBudget,diagnostics:executionResult.diagnostics,requestId:input.requestId,iteration:input.iteration}),result}catch(error){throw turnStatus=error instanceof SessionExecutionError&&error.payload.code==="session_receive_aborted"?"cancelled":"error",error}finally{if(manualTurnId)this.usageLedgerManager.finalizeTurn({turnId:manualTurnId,status:turnStatus}),this.usageLedgerManager.clearActiveTurn()}}async runObservedCompaction(input){let operation=this.observability?.startOperation("api","api.session.runCompaction",input,{sessionId:this.id,requestId:input.requestId,iteration:input.iteration});try{let result=this.observability?await this.observability.withOperation(operation,()=>this.runCompactionInternal(input)):await this.runCompactionInternal(input);return operation?.success(result),result}catch(error){throw operation?.error(error),error}}async runLastMessageFallbackCompaction(input){let beforeState=this.getCompactionState(),visibleMessages=projectMessagesForRequest(this.state.messages,beforeState).filter((message)=>message.role!=="system");if(visibleMessages.length===0)return;let lastVisibleMessage=visibleMessages.at(-1),targetMessage=[...visibleMessages].reverse().find((message)=>message.role!=="tool")??lastVisibleMessage;if(!targetMessage)return;let compactedMessageCount=visibleMessages.length,retainedMessageCount=0;for(let maxChars of LAST_MESSAGE_FALLBACK_CHAR_LIMITS){let summary=renderLastMessageFallbackSummary(targetMessage,maxChars),afterState=await this.compactionService.apply({sessionId:this.id,cursor:this.state.messages.length,systemSegments:[summary],summary,reason:input.trigger,metadata:createCompactionCheckpointMetadata({resolution:"last_message_fallback",compactedMessageCount,retainedMessageCount,diagnostics:{}})}),latestCheckpoint=afterState.checkpoints.at(-1);this.observability?.record({level:"warn",category:"state",event:"state.compaction",phase:"transition",context:{sessionId:this.id,requestId:input.requestId,iteration:input.iteration},before:{cursor:beforeState.cursor,checkpointCount:beforeState.checkpoints.length},after:{cursor:afterState.cursor,checkpointCount:afterState.checkpoints.length},diff:{reason:input.trigger,resolution:"last_message_fallback",checkpointId:latestCheckpoint?.id,fallbackFromReasonCode:input.fallbackFromReasonCode,compactedMessageCount,retainedMessageCount,summary}});let postCompaction=await this.readPostCompactionOutcome({budget:input.budget,readPostCompactionBudget:input.readPostCompactionBudget});if(postCompaction.postSummaryFitsBudget===!1)continue;let result={trigger:input.trigger,status:"compacted",resolution:"last_message_fallback",checkpointId:latestCheckpoint?.id,cursorBefore:beforeState.cursor,cursorAfter:afterState.cursor,compactedMessageCount,retainedMessageCount,estimatedInputTokensBefore:input.budget.estimatedInputTokens,thresholdTokens:input.budget.thresholdTokens,plannedOutput:input.budget.plannedOutput,contextWindow:input.budget.contextWindow,summary,diagnostics:{}};if(typeof postCompaction.estimatedInputTokensAfter==="number")result.estimatedInputTokensAfter=postCompaction.estimatedInputTokensAfter;if(typeof postCompaction.estimatedSavedTokens==="number")result.estimatedSavedTokens=postCompaction.estimatedSavedTokens;if(typeof postCompaction.postSummaryFitsBudget==="boolean")result.postSummaryFitsBudget=postCompaction.postSummaryFitsBudget;if(input.fallbackFromReasonCode)result.fallbackFromReasonCode=input.fallbackFromReasonCode;return await this.emitCompactedNotification({sourceKind:"compaction_run",trigger:input.trigger,resolution:"last_message_fallback",beforeState,afterState,checkpointId:result.checkpointId,fallbackFromReasonCode:input.fallbackFromReasonCode,compactedMessageCount:result.compactedMessageCount,retainedMessageCount:result.retainedMessageCount,estimatedInputTokensBefore:result.estimatedInputTokensBefore,estimatedInputTokensAfter:result.estimatedInputTokensAfter,estimatedSavedTokens:result.estimatedSavedTokens,thresholdTokens:result.thresholdTokens,plannedOutput:result.plannedOutput,contextWindow:result.contextWindow,postSummaryFitsBudget:result.postSummaryFitsBudget,diagnostics:result.diagnostics,requestId:input.requestId,iteration:input.iteration}),result}}async readPostCompactionOutcome(input){let canEvaluatePostSummaryBudget=Boolean(input.readPostCompactionBudget)||input.budget.contextWindow>0&&this.state.compactionOptions!==void 0&&this.state.compactionOptions.enabled!==!1,postCompactionBudget=await input.readPostCompactionBudget?.()??(canEvaluatePostSummaryBudget?{estimatedInputTokens:await this.readEstimatedInputTokens(),thresholdTokens:input.budget.thresholdTokens,plannedOutput:input.budget.plannedOutput,contextWindow:input.budget.contextWindow}:void 0),estimatedInputTokensAfter=postCompactionBudget?.estimatedInputTokens,estimatedSavedTokens=typeof estimatedInputTokensAfter==="number"?Math.max(0,input.budget.estimatedInputTokens-estimatedInputTokensAfter):void 0,postSummaryFitsBudget=postCompactionBudget!==void 0?postCompactionBudget.estimatedInputTokens<postCompactionBudget.thresholdTokens:void 0;return{...typeof estimatedInputTokensAfter==="number"?{estimatedInputTokensAfter}:{},...typeof estimatedSavedTokens==="number"?{estimatedSavedTokens}:{},...typeof postSummaryFitsBudget==="boolean"?{postSummaryFitsBudget}:{}}}async readEstimatedInputTokens(){let messageFactory=new DefaultMessageFactory,requestMessages=buildRequestMessagesForModel({messages:this.state.messages,compaction:this.state.compaction,createSystemMessage:(text)=>messageFactory.createSystemMessage(text),createUserMessage:(text)=>messageFactory.createUserMessage(text)}),tools=this.state.tools?.definitions()??[];return(await recountCurrentContextSize(this.state,{model:this.state.modelRef,messages:requestMessages,tools})).tokens}async createCompactionRunBudget(){let contextWindow=this.state.model.capabilities?.contextWindow??0,plannedOutput=DEFAULT_SESSION_MAX_OUTPUT_TOKENS,estimatedInputTokens=await this.readEstimatedInputTokens();return{estimatedInputTokens,thresholdTokens:contextWindow>0&&this.state.compactionOptions?calculateThresholdTokens(this.state.compactionOptions,{contextWindow,plannedOutput}):Math.max(1,estimatedInputTokens),plannedOutput,contextWindow}}readCompactorController(){let pluginId=this.state.compactionOptions?.compactorPluginId;if(!pluginId)return;let controller=this.pluginControllers.get(pluginId);return isSessionCompactorController(controller)?controller:void 0}async emitCompactionRequiredNotification(input){await this.notificationBus.emit({type:"context.compaction.required",source:"runtime",level:"warning",message:`Context compaction required for session ${this.id}`,metadata:{trigger:input.trigger,cursorBefore:input.cursorBefore,estimatedInputTokensBefore:input.estimatedInputTokensBefore,thresholdTokens:input.thresholdTokens,plannedOutput:input.plannedOutput,contextWindow:input.contextWindow}},this.createHookContext({requestId:input.requestId,iteration:input.iteration}))}async emitCompactedNotification(input){await this.notificationBus.emit({type:"context.compacted",source:"runtime",level:"info",message:`Context compacted for session ${this.id}`,metadata:{sourceKind:input.sourceKind,trigger:input.trigger,resolution:input.resolution,cursorBefore:input.beforeState.cursor,cursorAfter:input.afterState.cursor,...input.checkpointId?{checkpointId:input.checkpointId}:{},...input.fallbackFromReasonCode?{fallbackFromReasonCode:input.fallbackFromReasonCode}:{},...typeof input.compactedMessageCount==="number"?{compactedMessageCount:input.compactedMessageCount}:{},...typeof input.retainedMessageCount==="number"?{retainedMessageCount:input.retainedMessageCount}:{},...typeof input.estimatedInputTokensBefore==="number"?{estimatedInputTokensBefore:input.estimatedInputTokensBefore}:{},...typeof input.estimatedInputTokensAfter==="number"?{estimatedInputTokensAfter:input.estimatedInputTokensAfter}:{},...typeof input.estimatedSavedTokens==="number"?{estimatedSavedTokens:input.estimatedSavedTokens}:{},...typeof input.thresholdTokens==="number"?{thresholdTokens:input.thresholdTokens}:{},...typeof input.plannedOutput==="number"?{plannedOutput:input.plannedOutput}:{},...typeof input.contextWindow==="number"?{contextWindow:input.contextWindow}:{},...typeof input.postSummaryFitsBudget==="boolean"?{postSummaryFitsBudget:input.postSummaryFitsBudget}:{},...compactionDiagnosticsToMetadataFields(input.diagnostics)}},this.createHookContext({requestId:input.requestId,iteration:input.iteration}))}async emitCompactionFailedResult(input){return await this.notificationBus.emit({type:"context.compaction.failed",source:"runtime",level:input.status==="skipped"?"warning":"error",message:input.reasonMessage??`Compaction failed for session ${this.id}`,metadata:{trigger:input.trigger,attemptStage:input.attemptStage,cursorBefore:input.cursorBefore,estimatedInputTokensBefore:input.estimatedInputTokensBefore,thresholdTokens:input.thresholdTokens,plannedOutput:input.plannedOutput,contextWindow:input.contextWindow,reasonCode:input.reasonCode,...input.reasonMessage?{reasonMessage:input.reasonMessage}:{},...typeof input.compactedMessageCount==="number"?{compactedMessageCount:input.compactedMessageCount}:{},...typeof input.retainedMessageCount==="number"?{retainedMessageCount:input.retainedMessageCount}:{},...compactionDiagnosticsToMetadataFields(input.diagnostics)}},this.createHookContext({requestId:input.requestId,iteration:input.iteration})),{trigger:input.trigger,status:input.status,resolution:input.resolution,...input.checkpointId?{checkpointId:input.checkpointId}:{},cursorBefore:input.cursorBefore,cursorAfter:input.cursorAfter,compactedMessageCount:input.compactedMessageCount??0,retainedMessageCount:input.retainedMessageCount??0,estimatedInputTokensBefore:input.estimatedInputTokensBefore,...typeof input.estimatedInputTokensAfter==="number"?{estimatedInputTokensAfter:input.estimatedInputTokensAfter}:{},...typeof input.estimatedSavedTokens==="number"?{estimatedSavedTokens:input.estimatedSavedTokens}:{},thresholdTokens:input.thresholdTokens,plannedOutput:input.plannedOutput,contextWindow:input.contextWindow,...typeof input.postSummaryFitsBudget==="boolean"?{postSummaryFitsBudget:input.postSummaryFitsBudget}:{},...input.summary?{summary:input.summary}:{},...input.fallbackFromReasonCode?{fallbackFromReasonCode:input.fallbackFromReasonCode}:{},reasonCode:input.reasonCode,...input.reasonMessage?{reasonMessage:input.reasonMessage}:{},diagnostics:cloneCompactionDiagnostics(input.diagnostics)}}createHookContext(input={}){return{sessionId:this.id,requestId:input.requestId,iteration:input.iteration,cwd:this.state.cwd,hostDataDir:this.hostDataDir,metadata:this.state.metadata,status:this.getStatus()}}assertNotDisposed(operation){if(!this.disposed)return;throw new SessionExecutionError({code:"DIM_SESSION_DISPOSED",message:`Cannot ${operation} on disposed session ${this.id}`})}},Agent=class{id;pluginHost;services;tools;permissions;hostDataDir;options;messageFactory=new DefaultMessageFactory;tracker;permissionGateway;approvalManager;notificationBus;compactionService;pluginStateService;inspectGateway;observability;dynamicToolProviders;sessions=new Set;disposed=!1;constructor(options){this.id=createId("agent"),this.options=options,this.permissions=options.permissions,this.hostDataDir=options.hostDataDir?path4.resolve(options.hostDataDir):void 0,validateCompactionOwner(options),this.tracker=new ActivityTracker,this.compactionService=new DefaultCompactionService,this.pluginStateService=new DefaultPluginStateService,this.observability=new ObservabilityRecorder({agentId:this.id,cwd:options.cwd,options:options.observability}),this.inspectGateway=new DefaultInspectGateway({agentId:this.id,cwd:options.cwd,model:structuredClone(options.model.model),capabilities:options.model.capabilities?structuredClone(options.model.capabilities):void 0,reasoning:options.reasoning?structuredClone(options.reasoning):void 0,cache:options.cache?structuredClone(options.cache):void 0,compaction:cloneInspectableCompactionOptions(options.compaction),permissions:options.permissions?{...options.permissions}:void 0,includeBuiltinTools:options.includeBuiltinTools!==!1,autosave:options.autosave??"manual",hostDataDir:this.hostDataDir,stateStore:options.stateStore,getPluginSnapshots:async()=>this.pluginHost.inspectPlugins(),getLiveSessions:async()=>{let liveSessions=[...this.sessions].filter((session)=>!session.isDisposed()).sort((left,right)=>right.updatedAt-left.updatedAt);return Promise.all(liveSessions.map(async(session)=>({sessionId:session.id,status:session.getStatus(),queue:session.getQueueStatus(),snapshot:session.toSnapshot(),pluginInspectors:await this.pluginHost.inspectSessionPlugins(session.id)})))}}),this.services=createServices(options,this.id,this.tracker,this.compactionService,this.pluginStateService,this.inspectGateway,this.observability,(sessionId)=>[...this.sessions].find((candidate)=>candidate.id===sessionId)),this.permissionGateway=new PermissionGateway({permissions:options.permissions}),this.pluginHost=new PluginHost({agentId:this.id,cwd:options.cwd,hostDataDir:this.hostDataDir,plugins:options.plugins,services:this.services,permissionGateway:this.permissionGateway,observability:this.observability}),this.notificationBus=new DefaultNotificationBus({pluginHost:this.pluginHost,services:this.services,handler:options.notificationHandler,onNotification:async(notification,context)=>{await this.persistNotificationBoundary(notification,context)}}),this.approvalManager=options.approvalManager??new DefaultApprovalManager({handler:options.approvalHandler,notifications:this.notificationBus}),this.tools=createToolRegistry({includeBuiltinTools:options.includeBuiltinTools!==!1,tools:options.tools,pluginTools:this.pluginHost.pluginTools()}),this.dynamicToolProviders=this.pluginHost.dynamicToolProviders()}async createSession(options={}){this.assertNotDisposed("create a session");let operation=this.observability.startOperation("api","api.agent.createSession",options);try{let session=await this.observability.withOperation(operation,async()=>{let messages=normalizeSessionMessages(options.messages??[]),allowedToolNames=normalizeAllowedToolNames(options.allowedToolNames),model=options.model??this.options.model;if(options.systemPrompt)messages.unshift(this.messageFactory.createSystemMessage(options.systemPrompt));let session2=new Session({agentId:this.id,id:options.sessionId??createId("session"),model,modelRef:options.modelRef??model.model,tools:createFilteredToolRegistry(this.tools,allowedToolNames),dynamicToolProviders:filterDynamicToolProviders(this.dynamicToolProviders,allowedToolNames),stateStore:this.options.stateStore,transformSnapshot:this.options.transformSnapshot,autosave:this.options.autosave,maxIterations:options.maxIterations??this.options.maxIterations,allowedToolNames,cwd:options.cwd??this.options.cwd,metadata:options.metadata??this.options.metadata,reasoning:options.reasoning??this.options.reasoning,cache:options.cache??this.options.cache,compactionOptions:this.options.compaction,messageQueueConfig:options.messageQueueConfig,messages,hostDataDir:this.hostDataDir,pluginHost:this.pluginHost,services:this.services,approvalManager:this.approvalManager,notificationBus:this.notificationBus,compactionService:this.compactionService,pluginStateService:this.pluginStateService,observability:this.observability});return this.sessions.add(session2),this.observability.record({category:"state",event:"state.session.lifecycle",phase:"transition",context:{sessionId:session2.id},before:{exists:!1},after:{exists:!0,status:"created"},diff:{action:"create"}}),session2});return operation?.success({sessionId:session.id}),session}catch(error){throw operation?.error(error),error}}async restoreSession(sessionId){this.assertNotDisposed("restore a session");let operation=this.observability.startOperation("api","api.agent.restoreSession",{sessionId});try{let session=await this.observability.withOperation(operation,async()=>{if(!this.options.stateStore)return;let persistence=this.observability.startOperation("persistence","persistence.stateStore.load",{sessionId}),snapshot;try{snapshot=await this.options.stateStore.load(sessionId),persistence?.success(snapshot?{sessionId,found:!0}:{sessionId,found:!1})}catch(error){throw persistence?.error(error),error}if(!snapshot)return;return this.sessionFromSnapshot(snapshot)});return operation?.success({sessionId,restored:Boolean(session)}),session}catch(error){throw operation?.error(error),error}}sessionFromSnapshot(snapshot){this.assertNotDisposed("restore a session from snapshot");let operation=this.observability.startOperation("api","api.agent.sessionFromSnapshot",{sessionId:snapshot.sessionId,schemaVersion:snapshot.schemaVersion});try{let normalizedSnapshot=sessionSnapshotCodec.decode(snapshot),allowedToolNames=normalizeAllowedToolNames(normalizedSnapshot.allowedToolNames),messages=normalizeSessionMessages(normalizedSnapshot.messages),session=new Session({agentId:this.id,id:normalizedSnapshot.sessionId,model:this.options.model,modelRef:normalizedSnapshot.model??this.options.model.model,tools:createFilteredToolRegistry(this.tools,allowedToolNames),dynamicToolProviders:filterDynamicToolProviders(this.dynamicToolProviders,allowedToolNames),stateStore:this.options.stateStore,transformSnapshot:this.options.transformSnapshot,autosave:this.options.autosave,maxIterations:normalizedSnapshot.maxIterations??this.options.maxIterations,allowedToolNames,cwd:normalizedSnapshot.cwd??this.options.cwd,metadata:normalizedSnapshot.metadata??this.options.metadata,messages,reasoning:normalizedSnapshot.reasoning??this.options.reasoning,cache:normalizedSnapshot.cache??this.options.cache,usage:normalizedSnapshot.usage,usageLedger:normalizedSnapshot.usageLedger,compaction:normalizedSnapshot.compaction,pluginState:normalizedSnapshot.pluginState,messageQueue:normalizedSnapshot.messageQueue,compactionOptions:this.options.compaction,createdAt:normalizedSnapshot.createdAt,updatedAt:normalizedSnapshot.updatedAt,hostDataDir:this.hostDataDir,pluginHost:this.pluginHost,services:this.services,approvalManager:this.approvalManager,notificationBus:this.notificationBus,compactionService:this.compactionService,pluginStateService:this.pluginStateService,observability:this.observability});return this.sessions.add(session),this.observability.record({category:"state",event:"state.session.lifecycle",phase:"transition",context:{sessionId:session.id},before:{exists:!1},after:{exists:!0,status:"restored"},diff:{action:"restore"}}),operation?.success({sessionId:session.id}),session}catch(error){throw operation?.error(error),error}}async dispose(){if(this.disposed)return;let operation=this.observability.startOperation("api","api.agent.dispose");this.disposed=!0;try{await this.observability.withOperation(operation,async()=>{await Promise.allSettled([...this.sessions].map(async(session)=>session.dispose())),this.sessions.clear(),await this.pluginHost.dispose()}),operation?.success()}catch(error){throw operation?.error(error),error}finally{await this.observability.flush()}}async deleteSession(sessionId){this.assertNotDisposed("delete a session");let operation=this.observability.startOperation("api","api.agent.deleteSession",{sessionId});try{await this.observability.withOperation(operation,async()=>{let loadedSession=[...this.sessions].find((session)=>session.id===sessionId);if(loadedSession?.getQueueStatus().isProcessing)throw Error(`Cannot delete session ${sessionId} while it is processing`);if(loadedSession)await loadedSession.dispose(),this.sessions.delete(loadedSession);if(this.options.stateStore){let persistence=this.observability.startOperation("persistence","persistence.stateStore.delete",{sessionId});try{await this.options.stateStore.delete(sessionId),persistence?.success({sessionId})}catch(error){throw persistence?.error(error),error}}await removeSessionArtifacts(this.hostDataDir,sessionId),this.observability.record({category:"state",event:"state.session.lifecycle",phase:"transition",context:{sessionId},before:{exists:!0},after:{exists:!1,status:"deleted"},diff:{action:"delete"}})}),operation?.success({sessionId})}catch(error){throw operation?.error(error),error}}async pruneSessionArtifacts(){this.assertNotDisposed("prune session artifacts");let operation=this.observability.startOperation("api","api.agent.pruneSessionArtifacts");try{let removed=await this.observability.withOperation(operation,async()=>{if(!this.hostDataDir||!this.options.stateStore)return 0;let plansRoot=path4.join(this.hostDataDir,"plans"),entries;try{entries=await readdir(plansRoot,{withFileTypes:!0,encoding:"utf8"})}catch{return 0}let retainedIds=await this.listPersistedSessionIds();for(let session of this.sessions)retainedIds.add(session.id);let removed2=0;for(let entry of entries){if(!entry.isDirectory())continue;if(retainedIds.has(entry.name))continue;await rm(path4.join(plansRoot,entry.name),{recursive:!0,force:!0}),removed2+=1}return removed2});return operation?.success({removed}),removed}catch(error){throw operation?.error(error),error}}async requestApproval(request,context={sessionId:this.id}){this.assertNotDisposed("request approval");let operation=this.observability.startOperation("api","api.agent.requestApproval",{request,context},{sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration});try{let decision=await this.observability.withOperation(operation,()=>this.approvalManager.requestApproval(request,context));return operation?.success(decision),decision}catch(error){throw operation?.error(error),error}}async listPersistedSessionIds(){let retainedIds=new Set;if(!this.options.stateStore)return retainedIds;let cursor;do{let page=await this.options.stateStore.list({cursor,limit:200});for(let snapshot of page.snapshots)retainedIds.add(snapshot.sessionId);cursor=page.nextCursor}while(cursor!==void 0);return retainedIds}async emitNotification(notification,context={}){this.assertNotDisposed("emit a notification");let operation=this.observability.startOperation("api","api.agent.emitNotification",{notification,context},{sessionId:context.sessionId,requestId:context.requestId,iteration:context.iteration});try{let result=await this.observability.withOperation(operation,()=>this.notificationBus.emit(notification,context));return operation?.success(result),result}catch(error){throw operation?.error(error),error}}setObservabilityEnabled(enabled,options){this.assertNotDisposed("toggle observability"),this.observability.setEnabled(enabled,options)}isObservabilityEnabled(){return this.observability.isEnabled()}assertNotDisposed(operation){if(!this.disposed)return;throw Error(`Cannot ${operation} on disposed agent ${this.id}`)}async persistNotificationBoundary(notification,context){if(this.options.autosave!=="evented")return;if(notification.type!=="approval.requested")return;if(!context.sessionId)return;let session=[...this.sessions].find((candidate)=>candidate.id===context.sessionId);if(!session)return;try{await session.save()}catch{}}},builtinSubagentProcessModelFactoryIds;var init_subagent_process_builtins=__esm(()=>{init_heuristic();init_observability();sessionSnapshotCodec=new JsonSnapshotCodec;EXCLUDED_DIRECTORY_NAMES=new Set([".git",".svn",".hg",".bzr",".jj",".sl","node_modules"]),pathMutationLocks=new Map,EDIT_TARGET_FILE_MAX_BYTES=Math.min(1073741824,constants.MAX_STRING_LENGTH),FileModifiedSinceReadError=class extends Error{code="file_modified_since_read";constructor(message=FILE_MODIFIED_SINCE_READ_MESSAGE){super(message);this.name="FileModifiedSinceReadError"}},EditTargetFileTooLargeError=class extends Error{code="edit_target_file_too_large";constructor(bytes,limit=EDIT_TARGET_FILE_MAX_BYTES){super(`edit target file too large: file is ${bytes} bytes, limit is ${limit} bytes.`);this.bytes=bytes,this.limit=limit,this.name="EditTargetFileTooLargeError"}};fullPermissions={fs:"full",git:!0,network:!0,process:!0,model:!0},PermissionDeniedError=class extends Error{code="permission_denied";constructor(message){super(message);this.name="PermissionDeniedError"}};sessionFileRevisions=new Map;EditTool=class extends BaseTool{constructor(){super({name:"edit",description:"Replace text in a UTF-8 file. When editing from read output, use only the file content after the line-number prefix for oldText and newText.",inputSchema:{type:"object",properties:{path:{type:"string",description:"File path to edit."},oldText:{type:"string",description:"Text to replace."},newText:{type:"string",description:"Replacement text."},replaceAll:{type:"boolean",description:"Replace all matches when true."}},required:["path","oldText","newText"]},maxResultSizeChars:1/0})}async execute(args,context){let fileSystem=context.services?.fileSystem;if(!fileSystem)throw Error("FileSystemGateway is not available in the tool execution context");let targetPath=readAliasedStringArg(args,["path","file_path"]),oldText=readAliasedStringArg(args,["oldText","old_string"]),newText=readAliasedStringArg(args,["newText","new_string"],{allowEmpty:!0}),inputChars=oldText.length+newText.length;if(inputChars>1e4)return createToolResult({content:[{type:"text",text:`edit input too large: oldText + newText is ${inputChars} chars, limit is ${EDIT_INPUT_MAX_CHARS} chars.`}],structuredContent:{code:"input_too_large",chars:inputChars,limit:EDIT_INPUT_MAX_CHARS},isError:!0});let replaceAll=readAliasedOptionalBooleanArg(args,["replaceAll","replace_all"])??!1,trackedPath=resolveTrackedPath(fileSystem,context.cwd,targetPath),expectedRevision=getSessionFileRevision(context.sessionId,trackedPath),result;try{result=await fileSystem.editText(targetPath,{oldText,newText,replaceAll,cwd:context.cwd,expectedRevision})}catch(error){if(isFileModifiedSinceReadError$1(error))return createToolResult({content:[{type:"text",text:error.message}],structuredContent:{code:error.code},isError:!0});if(isEditTargetFileTooLargeError(error))return createToolResult({content:[{type:"text",text:error.message}],structuredContent:{code:error.code,bytes:error.bytes,limit:error.limit},isError:!0});if(isNodeErrorCode(error,"ENOENT"))return createMissingFileToolResult(targetPath,fileSystem,context.cwd,"edit");throw error}if(result.revision)rememberSessionFileRevision(context.sessionId,trackedPath,result.revision);else forgetSessionFileRevision(context.sessionId,trackedPath);return createToolResult({content:[{type:"text",text:`Edited ${result.path}`}],structuredContent:result})}};ExecProcessManagerError=class extends Error{code;constructor(code,message){super(message);this.name="ExecProcessManagerError",this.code=code}};builtinExecProcessManager=new BuiltinExecProcessManager;ExecTool=class extends BaseTool{constructor(){super({name:"exec",description:"Execute an argv command as a managed task. Foreground commands wait up to 5 seconds for output and completion. Commands still running after that window move to a background managed task and return a taskId and outputPath; completion will be sent as a task notification. Set runInBackground to true when the result can be handled later and should start in the background immediately. Wait for the completion notification before reading outputPath for full output. Omit shell background markers such as &; the runtime keeps the task running.",inputSchema:{type:"object",properties:{command:{type:"array",items:{type:"string"},description:'Command argv vector. Example: ["pnpm", "test"].'},cwd:{type:"string",description:"Optional working directory for the command."},runInBackground:{type:"boolean",description:"Run the task in the background when the result can be handled later. The task keeps running and sends a completion notification."}},required:["command"],additionalProperties:!1},maxResultSizeChars:1/0})}async execute(args,context){let sessionId=context.sessionId,normalized;try{normalized=normalizeExecInput(args,context),validateExecArgs(normalized);let result=await executeBuiltinExecProcess({sessionId,action:"start",command:normalized.command,cwd:normalized.cwd,outputRoot:resolveExecOutputRoot(context),runInBackground:normalized.runInBackground,signal:context.signal});return createToolResult({content:[{type:"text",text:renderExecOutput({output:result.output,statusInfo:formatExecStatusInfo(result),includeStatusInfo:!isSuccessfulExitedResult(result),emptyOutputInfo:"(No output)",outputPath:result.outputPath,outputTruncated:result.outputTruncated})}],structuredContent:createExecResultPayload(result,result.status==="running"||normalized.runInBackground===!0),isError:isExecFailureResult(result)})}catch(error){let message=error instanceof Error?error.message:String(error),code=typeof error==="object"&&error!==null&&"code"in error&&typeof error.code==="string"?error.code:"exec_invalid_request";return createToolResult({content:[{type:"text",text:message}],structuredContent:{code},isError:!0})}}};READ_RESULT_MAX_CHARS=DEFAULT_TOOL_RESULT_MAX_CHARS,ReadTool=class extends BaseTool{constructor(){super({name:"read",description:"Read a UTF-8 text file or supported image from the local filesystem. Text results are returned with 1-indexed line numbers and support optional offset/limit line windows. For image files, pass only path; offset and limit are ignored.",inputSchema:{type:"object",properties:{path:{type:"string",description:"File path to read."},offset:{type:"number",description:"Optional 1-based start line for UTF-8 text files. Defaults to 1. Omit for image files."},limit:{type:"number",description:"Optional maximum number of lines to return for UTF-8 text files. Defaults to 2000. Omit for image files."}},required:["path"]},maxResultSizeChars:1/0})}async execute(args,context){let fileSystem=context.services?.fileSystem;if(!fileSystem)throw Error("FileSystemGateway is not available in the tool execution context");let targetPath=readAliasedStringArg(args,["path","file_path"]),textWindow=hasRasterImageExtension(targetPath)?void 0:parseReadTextWindow(args),bytes;try{bytes=await fileSystem.readBytes(targetPath,{cwd:context.cwd})}catch(error){if(isNodeErrorCode(error,"ENOENT"))return createMissingFileToolResult(targetPath,fileSystem,context.cwd,"read");throw error}let imageMediaType=detectImageMediaType(targetPath,bytes);if(imageMediaType)return this.createImageResult(targetPath,bytes,imageMediaType,context);textWindow??=parseReadTextWindow(args);let text=decodeUtf8Text(bytes);if(text===void 0)return createToolResult({content:[{type:"text",text:`Binary file is not supported by read: ${targetPath}. The read tool currently supports UTF-8 text files and common image files.`}],structuredContent:{code:"binary_unsupported",path:resolveTrackedPath(fileSystem,context.cwd,targetPath)},isError:!0});let trackedPath=resolveTrackedPath(fileSystem,context.cwd,targetPath),revision=rememberSessionFileText(context.sessionId,trackedPath,text),lines=splitTextLines(text);if(lines.length===0)return createTextReadResult("",{path:targetPath,size:Buffer.byteLength(text,"utf8"),revision});if(textWindow.offset>lines.length)return createToolResult({content:[{type:"text",text:`Read offset ${textWindow.offset} exceeds file length.`}],structuredContent:{code:"offset_out_of_range",path:targetPath},isError:!0});return buildReadTextResult({targetPath,lines,offset:textWindow.offset,limit:textWindow.limit,rawLimitProvided:textWindow.rawLimitProvided,structuredContent:{path:targetPath,size:Buffer.byteLength(text,"utf8"),revision}})}createImageResult(targetPath,bytes,mediaType,context){let filename=path4.basename(targetPath),base64=Buffer.from(bytes).toString("base64");if(!modelSupportsImageInputs(context))return createToolResult({content:[{type:"text",text:`Image metadata: ${filename} (${mediaType}, ${bytes.byteLength} bytes). Current model does not advertise image input support, so the image was not added to model context.`}],structuredContent:{path:targetPath,size:bytes.byteLength,mediaType,kind:"image",deliveredAs:"metadata"}});return createToolResult({content:[{type:"text",text:`Loaded image into model context: ${filename}.`}],structuredContent:{path:targetPath,size:bytes.byteLength,mediaType,kind:"image",deliveredAs:"context_message"},contextMessages:[{role:"user",content:[{type:"text",text:`Image loaded from read(${targetPath}). Use it as additional context.
|
|
45
45
|
`},{type:"file",data:base64,mediaType,filename}],metadata:{_dimToolContext:{kind:"read_image",path:targetPath,mediaType}}}]})}};WriteTool=class extends BaseTool{constructor(){super({name:"write",description:"Write a UTF-8 text file.",inputSchema:{type:"object",properties:{path:{type:"string",description:"File path to write."},content:{type:"string",description:"Text content to write."}},required:["path","content"]},maxResultSizeChars:1/0})}async execute(args,context){let fileSystem=context.services?.fileSystem;if(!fileSystem)throw Error("FileSystemGateway is not available in the tool execution context");let targetPath=readAliasedStringArg(args,["path","file_path"]),content=args.content;if(typeof content!=="string")throw Error("content must be a string");let trackedPath=resolveTrackedPath(fileSystem,context.cwd,targetPath),expectedRevision=getSessionFileRevision(context.sessionId,trackedPath),result;try{result=await fileSystem.writeText(targetPath,content,{cwd:context.cwd,expectedRevision})}catch(error){if(isFileModifiedSinceReadError(error))return createToolResult({content:[{type:"text",text:error.message}],structuredContent:{code:error.code},isError:!0});throw error}let revision=result.revision??createTextRevision(content);rememberSessionFileRevision(context.sessionId,trackedPath,revision);let payload={path:result.path,bytes:result.bytes,revision};return createToolResult({content:[{type:"text",text:`Wrote ${result.path}`}],structuredContent:payload})}};DEFAULT_MESSAGE_QUEUE_CONFIG={autoProcessQueue:!0};CONTEXT_WINDOW_ERROR_CODES=["context_length_exceeded","context_window_exceeded","max_tokens_exceeded","input_length_exceeded","prompt_too_long","request_too_large"],CONTEXT_WINDOW_ERROR_PHRASES=["context length","context window","context_length","context_window","maximum context","prompt is too long","prompt too long","input is too long","input too long","exceeds the maximum","exceeds maximum","tokens exceeds","exceed the model","too many tokens"];TOOL_CALL_JSON_CONTRACT_PROMPT=["# Tool Call JSON Contract","","When calling a tool, the arguments MUST be a single valid JSON object that exactly matches the tool schema.","","Rules:","- Use only valid JSON. No markdown fences, comments, trailing commas, or pseudo-JSON.","- Use double-quoted keys and double-quoted string values.","- Escape inner quotes, backslashes, and newlines inside strings.","- Do not start a tool call until the full argument object is decided.","- Do not emit partial, self-correcting, or unfinished JSON.","- If a field is optional and you are unsure, omit it.","- If a required field is unknown, ask the user instead of guessing.","- Never place free-form explanation inside arguments unless the schema explicitly requires it.","- Before emitting a tool call, mentally verify that JSON.parse(arguments) would succeed and produce an object.","",'Bad: {"command":"echo "hi""}','Good: {"command":"echo \\\\\\"hi\\\\\\""}',"",'Bad: {"path":"a.ts","oldText":"const x = "a""}','Good: {"path":"a.ts","oldText":"const x = \\\\\\"a\\\\\\""}'].join(`
|
|
46
|
-
`),EXEC_MANAGED_TASK_PROMPT=["# Exec Managed Tasks","","Use exec to run argv commands as managed tasks.","","
|
|
46
|
+
`),EXEC_MANAGED_TASK_PROMPT=["# Exec Managed Tasks","","Use exec to run argv commands as managed tasks.","","Foreground exec commands wait up to 5 seconds for output and completion.","","Commands still running after the foreground wait window move to a background managed task and return a taskId and outputPath. The runtime will keep the task running and send a task notification when it completes, fails, times out, or is killed. Read outputPath after the task notification for full output.","","Set runInBackground to true when the result can be handled later and should start in the background immediately. After starting a background task, continue with other useful work and wait for the task notification.","","Do not poll running tasks. Do not sleep before checking task output. Do not add shell background markers such as &; the runtime manages background execution."].join(`
|
|
47
47
|
`);LAST_MESSAGE_FALLBACK_CHAR_LIMITS=[2048,1024,512,256];builtinSubagentProcessModelFactoryIds=["aihubmix","aihubmix-responses","anthropic","deepseek","gemini","moonshotai","openai","openai-responses","xai","xai-responses","zenmux"]});import{STATUS_CODES}from"node:http";function normalizeLanguageModelUsage(raw){if(!raw)return;let promptTokens=raw.inputTokens.total??0,completionTokens=raw.outputTokens.total??0,totalTokens=promptTokens+completionTokens,inputTokensDetails=normalizeInputTokensDetails(raw),outputTokensDetails=normalizeOutputTokensDetails(raw);if(promptTokens===0&&completionTokens===0&&totalTokens===0&&inputTokensDetails===void 0&&outputTokensDetails===void 0)return;return{promptTokens,completionTokens,totalTokens,...inputTokensDetails?{inputTokensDetails}:{},...outputTokensDetails?{outputTokensDetails}:{}}}function normalizeInputTokensDetails(raw){let noCache=raw.inputTokens.noCache,cacheRead=raw.inputTokens.cacheRead,cacheWrite=raw.inputTokens.cacheWrite;if(noCache===void 0&&cacheRead===void 0&&cacheWrite===void 0)return;return{...noCache===void 0?{}:{noCache},...cacheRead===void 0?{}:{cacheRead},...cacheWrite===void 0?{}:{cacheWrite}}}function normalizeOutputTokensDetails(raw){let text=raw.outputTokens.text,reasoning=raw.outputTokens.reasoning;if(text===void 0&&reasoning===void 0)return;return{...text===void 0?{}:{text},...reasoning===void 0?{}:{reasoning}}}function mapLanguageModelFinishReason(reason){let raw=reason.raw?.toLowerCase();if(raw==="cancelled"||raw==="canceled")return"cancelled";switch(reason.unified){case"tool-calls":return"tool_call";case"length":return"length";case"content-filter":case"error":return"error";case"other":return raw==="cancelled"||raw==="canceled"?"cancelled":"final";default:return"final"}}async function generateWithAiSdk(input){return await input.debug?.logAiSdkCall({callOptions:input.callOptions}),toProviderDriverResult(collectGenerateResult(await input.model.doGenerate(input.callOptions)),input.createAssistantMetadata)}async function*streamWithAiSdk(input){await input.debug?.logAiSdkCall({callOptions:input.callOptions});let streamResult=await input.model.doStream(input.callOptions),content=[],warnings=[],textBlocks=new Map,reasoningBlocks=new Map,toolDrafts=new Map,finishReason={unified:"stop",raw:void 0},usage={inputTokens:{total:void 0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:void 0,text:void 0,reasoning:void 0}},providerMetadata,responseMetadata={headers:streamResult.response?.headers};for await(let part of readStream(streamResult.stream))switch(part.type){case"stream-start":warnings.push(...part.warnings);continue;case"text-start":textBlocks.set(part.id,{text:"",providerMetadata:mergeProviderMetadata(void 0,part.providerMetadata)});continue;case"text-delta":{let block=textBlocks.get(part.id)??{text:"",providerMetadata:void 0};if(block.text+=part.delta,block.providerMetadata=mergeProviderMetadata(block.providerMetadata,part.providerMetadata),textBlocks.set(part.id,block),part.delta.length>0)yield{type:"text_delta",delta:part.delta};continue}case"text-end":finalizeTextLikeBlock("text",part.id,textBlocks,content,part.providerMetadata);continue;case"reasoning-start":reasoningBlocks.set(part.id,{text:"",providerMetadata:mergeProviderMetadata(void 0,part.providerMetadata)});continue;case"reasoning-delta":{let block=reasoningBlocks.get(part.id)??{text:"",providerMetadata:void 0};if(block.text+=part.delta,block.providerMetadata=mergeProviderMetadata(block.providerMetadata,part.providerMetadata),reasoningBlocks.set(part.id,block),part.delta.length>0)yield{type:"thinking_delta",delta:part.delta};continue}case"reasoning-end":finalizeTextLikeBlock("reasoning",part.id,reasoningBlocks,content,part.providerMetadata);continue;case"tool-input-start":{let existing=toolDrafts.get(part.id);toolDrafts.set(part.id,{toolName:part.toolName,argsText:existing?.argsText??"",providerMetadata:mergeProviderMetadata(existing?.providerMetadata,part.providerMetadata),providerExecuted:part.providerExecuted,dynamic:part.dynamic,materialized:existing?.materialized??!1}),yield{type:"tool_call_start",callId:part.id,toolName:part.toolName};continue}case"tool-input-delta":{let draft=toolDrafts.get(part.id);if(!draft)throw Error(`Received tool-input-delta before tool-input-start for ${part.id}`);if(draft.argsText+=part.delta,draft.providerMetadata=mergeProviderMetadata(draft.providerMetadata,part.providerMetadata),toolDrafts.set(part.id,draft),part.delta.length>0)yield{type:"tool_call_args_delta",callId:part.id,delta:part.delta};continue}case"tool-input-end":{let draft=toolDrafts.get(part.id);if(!draft)throw Error(`Received tool-input-end before tool-input-start for ${part.id}`);draft.providerMetadata=mergeProviderMetadata(draft.providerMetadata,part.providerMetadata),toolDrafts.set(part.id,draft),yield{type:"tool_call_end",callId:part.id};continue}case"tool-call":{let draft=toolDrafts.get(part.toolCallId);if(content.push({type:"tool-call",toolCallId:part.toolCallId,toolName:part.toolName,input:part.input,providerExecuted:part.providerExecuted,dynamic:part.dynamic,providerMetadata:mergeProviderMetadata(draft?.providerMetadata,part.providerMetadata)}),draft)draft.materialized=!0,toolDrafts.set(part.toolCallId,draft);continue}case"response-metadata":Object.assign(responseMetadata,part);continue;case"finish":finishReason=part.finishReason,usage=part.usage,providerMetadata=mergeProviderMetadata(providerMetadata,part.providerMetadata);continue;case"error":throw part.error;default:continue}flushTextLikeBlocks("text",textBlocks,content),flushTextLikeBlocks("reasoning",reasoningBlocks,content);for(let[toolCallId,draft]of toolDrafts){if(draft.materialized)continue;content.push({type:"tool-call",toolCallId,toolName:draft.toolName,input:draft.argsText,providerExecuted:draft.providerExecuted,dynamic:draft.dynamic,providerMetadata:draft.providerMetadata})}let result={content,finishReason,usage,providerMetadata,request:readAiSdkRequestSnapshot(streamResult.request),response:readAiSdkResponseSnapshot(responseMetadata),warnings};yield{type:"response_end",stopReason:mapLanguageModelFinishReason(result.finishReason),usage:normalizeLanguageModelUsage(result.usage),rawUsage:serializeLanguageModelUsage(result.usage),assistantMetadata:input.createAssistantMetadata?.(result)}}function collectGenerateResult(result){return{content:result.content,finishReason:result.finishReason,usage:result.usage,providerMetadata:result.providerMetadata,request:readAiSdkRequestSnapshot(result.request),response:readAiSdkResponseSnapshot(result.response),warnings:result.warnings}}function toProviderDriverResult(result,createAssistantMetadata){let content=[];for(let part of result.content){if(part.type==="text"){if(part.text.length>0)content.push({type:"text",text:part.text});continue}if(part.type==="reasoning"){if(part.text.length>0)content.push({type:"thinking",text:part.text});continue}if(part.type==="tool-call")content.push({type:"tool_call",callId:part.toolCallId,toolName:part.toolName,argsText:part.input})}return{content,stopReason:mapLanguageModelFinishReason(result.finishReason),usage:normalizeLanguageModelUsage(result.usage),rawUsage:serializeLanguageModelUsage(result.usage),assistantMetadata:createAssistantMetadata?.(result)}}function serializeLanguageModelUsage(usage){if(!usage)return;let inputTokens={};if(usage.inputTokens.total!==void 0)inputTokens.total=usage.inputTokens.total;if(usage.inputTokens.noCache!==void 0)inputTokens.noCache=usage.inputTokens.noCache;if(usage.inputTokens.cacheRead!==void 0)inputTokens.cacheRead=usage.inputTokens.cacheRead;if(usage.inputTokens.cacheWrite!==void 0)inputTokens.cacheWrite=usage.inputTokens.cacheWrite;let outputTokens={};if(usage.outputTokens.total!==void 0)outputTokens.total=usage.outputTokens.total;if(usage.outputTokens.text!==void 0)outputTokens.text=usage.outputTokens.text;if(usage.outputTokens.reasoning!==void 0)outputTokens.reasoning=usage.outputTokens.reasoning;return{inputTokens,outputTokens}}async function*readStream(stream){let reader=stream.getReader();try{while(!0){let next=await reader.read();if(next.done)return;yield next.value}}finally{reader.releaseLock()}}function finalizeTextLikeBlock(type,id,blocks,content,providerMetadata){let block=blocks.get(id);if(!block)return;blocks.delete(id),content.push({type,text:block.text,providerMetadata:mergeProviderMetadata(block.providerMetadata,providerMetadata)})}function flushTextLikeBlocks(type,blocks,content){for(let[id]of blocks)finalizeTextLikeBlock(type,id,blocks,content,void 0)}function mergeProviderMetadata(base,incoming){if(!base)return incoming;if(!incoming)return base;let merged={...base};for(let[key,value]of Object.entries(incoming)){let previous=merged[key];if(isProviderMetadataObject(previous)&&isProviderMetadataObject(value)){merged[key]={...previous,...value};continue}merged[key]=value}return merged}function isProviderMetadataObject(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function readAiSdkRequestSnapshot(request){if(!request)return;let body=readAiSdkBody(request.body);if(body===void 0)return;return{body}}function readAiSdkResponseSnapshot(response){if(!response)return;let nextResponse={...response},body=readAiSdkBody(response.body);if(body!==void 0)nextResponse.body=body;return nextResponse}function readAiSdkBody(body){if(body==null)return;if(typeof body==="string"||typeof body==="number"||typeof body==="boolean")return body;if(Array.isArray(body)){let items=[];for(let entry of body){let nextEntry=readAiSdkBody(entry);if(nextEntry!==void 0)items.push(nextEntry)}return items}let record={};for(let[key,value]of Object.entries(body)){let nextValue=readAiSdkBody(value);if(nextValue!==void 0)record[key]=nextValue}return record}function warnIfPlaceholderApiKey(input){if(!input.shouldWarn)return;if(warnedProviders.has(input.provider))return;warnedProviders.add(input.provider);let suffix=input.hint?` ${input.hint}`:"";input.logger?.emit({level:"warn",source:"provider.auth",message:`${input.provider} is using a placeholder API key because no apiKey or provider-native auth configuration was provided. If you rely on external authentication, ensure your custom fetch or provider-native headers add real credentials before the request is sent upstream.${suffix}`,metadata:{provider:input.provider,kind:"placeholder_api_key"}})}function createApiCallErrorPayload(input){let responseBody=input.error.responseBody?parseErrorBody(input.error.responseBody):limitJsonValue(input.error.data);return{code:input.code,message:`${input.provider} request failed${input.error.statusCode?` with status ${input.error.statusCode}`:""}`,status:input.error.statusCode,retryable:input.error.isRetryable,details:{provider:input.provider,endpoint:input.error.url,...input.error.statusCode?{statusText:STATUS_CODES[input.error.statusCode]??void 0}:{},...responseBody===void 0?{}:{responseBody}}}}function createRequestErrorPayload(input){if(input.error instanceof Error)return{code:input.code,message:input.error.message};return{code:input.code,message:String(input.error)}}function parseErrorBody(value){let normalized=value.trim();if(!normalized)return;try{return limitJsonValue(JSON.parse(normalized))}catch{return truncateText(normalized)}}function limitJsonValue(value,depth=0){if(value===void 0)return;if(value===null)return null;if(typeof value==="boolean")return value;if(typeof value==="number")return Number.isFinite(value)?value:void 0;if(typeof value==="string")return truncateText(value);if(Array.isArray(value))return value.slice(0,MAX_JSON_ARRAY_ITEMS).flatMap((item)=>{let limited=limitJsonValue(item,depth+1);return limited===void 0?[]:[limited]});if(typeof value==="object"){if(depth>=MAX_JSON_DEPTH)return truncateText(JSON.stringify(value));let limited={};for(let[key,child]of Object.entries(value).slice(0,MAX_JSON_OBJECT_KEYS))if(limitJsonValue(child,depth+1)!==void 0)limited[key]=limitJsonValue(child,depth+1);return limited}return truncateText(String(value))}function truncateText(value){if(value.length<=MAX_TEXT_CHARS)return value;return`${value.slice(0,MAX_TEXT_CHARS)}${TRUNCATED_SUFFIX}`}function createProviderFetch(input){let fetchImpl=input.fetch??globalThis.fetch,headersToStrip=new Set((input.stripHeaders??[]).map((header)=>header.toLowerCase())),shouldStripHeaders=input.stripWhen===!0&&headersToStrip.size>0;return Object.assign(async(resource,init)=>{let recorder=getActiveObservabilityRecorder();if(typeof resource==="string"||resource instanceof URL){let headers=new Headers(init?.headers);if(shouldStripHeaders)for(let header of headersToStrip)headers.delete(header);let request2={url:resource.toString(),method:(init?.method??"GET").toUpperCase(),headers:headersToObject2(headers),body:await serializeBody(init?.body??void 0)};await input.debug?.logHttpRequest(request2);let operation2=recorder?.startOperation("network","network.provider.fetch",request2);try{let response=recorder?await recorder.withOperation(operation2,()=>fetchImpl(resource,{...init,headers})):await fetchImpl(resource,{...init,headers});return operation2?.success(recorder?await recorder.summarizeResponse(response):void 0),response}catch(error){throw operation2?.error(error),error}}let request=new Request(resource,init);if(shouldStripHeaders)for(let header of headersToStrip)request.headers.delete(header);let requestSummary={url:request.url,method:request.method.toUpperCase(),headers:headersToObject2(request.headers),body:await readRequestBody2(request)};await input.debug?.logHttpRequest(requestSummary);let operation=recorder?.startOperation("network","network.provider.fetch",requestSummary);try{let response=recorder?await recorder.withOperation(operation,()=>fetchImpl(request)):await fetchImpl(request);return operation?.success(recorder?await recorder.summarizeResponse(response):void 0),response}catch(error){throw operation?.error(error),error}},{preconnect:typeof fetchImpl.preconnect==="function"?fetchImpl.preconnect.bind(fetchImpl):(_url,_options)=>{}})}function hasHeader(headers,target){if(!headers)return!1;let normalized=target.toLowerCase();return Object.keys(headers).some((key)=>key.toLowerCase()===normalized)}async function readRequestBody2(request){if(!request.body)return;try{return summarizeTextBody(await request.clone().text())}catch{return{type:"unavailable"}}}async function serializeBody(body){if(body==null)return;if(typeof body==="string")return summarizeTextBody(body);if(body instanceof URLSearchParams)return{type:"url_search_params",text:body.toString()};if(typeof FormData<"u"&&body instanceof FormData)return{type:"form_data",entries:formDataEntries(body)};if(typeof Blob<"u"&&body instanceof Blob)return{type:"blob",size:body.size,mimeType:body.type};if(ArrayBuffer.isView(body))return{type:body.constructor.name,byteLength:body.byteLength};if(body instanceof ArrayBuffer)return{type:"ArrayBuffer",byteLength:body.byteLength};if(typeof ReadableStream<"u"&&body instanceof ReadableStream)return{type:"readable_stream"};return{type:typeof body}}function summarizeTextBody(value){let normalized=value.trim();if(!normalized)return"";try{return JSON.parse(normalized)}catch{if(normalized.length<=4000)return{type:"text",text:normalized};return{type:"text",text:normalized.slice(0,4000),truncated:!0,length:normalized.length}}}function headersToObject2(headers){let values={};return headers.forEach((value,key)=>{values[key]=value}),values}function formDataEntries(body){let entries=[];return body.forEach((value,key)=>{entries.push([key,typeof value==="string"?value:{type:"blob",size:value.size,mimeType:value.type,name:"name"in value?value.name:void 0}])}),entries}function normalizeReasoningConfig(reasoning){if(!reasoning)return;if(reasoning.enabled===!1)return;return reasoning}function resolveReasoningBudget(reasoning,fallback=1024){let normalized=normalizeReasoningConfig(reasoning);if(!normalized)return;let value=normalized.budgetTokens;if(typeof value==="number"&&Number.isFinite(value)&&value>0)return Math.floor(value);return fallback}function resolveReasoningEffort(reasoning,allowedValues){let normalized=normalizeReasoningConfig(reasoning);if(!normalized)return;let rawEffort=normalized.effort;if(typeof rawEffort!=="string"||rawEffort.length===0)return;if(!allowedValues||allowedValues.includes(rawEffort))return rawEffort}function resolveLowHighReasoningEffort(reasoning){let normalized=normalizeReasoningConfig(reasoning);if(!normalized)return;let rawEffort=normalized.effort;return typeof rawEffort==="string"?LOW_HIGH_REASONING_EFFORT_MAP[rawEffort]:void 0}function resolveLowMediumHighReasoningEffort(reasoning){let normalized=normalizeReasoningConfig(reasoning);if(!normalized)return;let rawEffort=normalized.effort;return typeof rawEffort==="string"?LOW_MEDIUM_HIGH_REASONING_EFFORT_MAP[rawEffort]:void 0}function buildOpenAIResponsesProviderOptions(reasoning){let normalized=normalizeReasoningConfig(reasoning);if(!normalized)return;let next={};if(normalized.effort)next.reasoningEffort=normalized.effort;if(normalized.summary)next.reasoningSummary=normalized.summary;if(next.reasoningSummary===void 0)next.reasoningSummary="auto";return next}function buildOpenAIResponsesRequestReasoning(reasoning){let options=buildOpenAIResponsesProviderOptions(reasoning);if(!options)return;let next={};if(typeof options.reasoningEffort==="string")next.effort=options.reasoningEffort;if(typeof options.reasoningSummary==="string")next.summary=options.reasoningSummary;return next.effort||next.summary?next:void 0}function buildOpenAICompatibleProviderOptions(reasoning){let reasoningEffort=resolveReasoningEffort(reasoning);return reasoningEffort?{reasoningEffort}:void 0}function buildReasoningEffortProviderOptions(reasoning,allowedValues){let reasoningEffort=resolveReasoningEffort(reasoning,allowedValues);return reasoningEffort?{reasoningEffort}:void 0}function buildAnthropicThinkingProviderOptions(reasoning){let budget=resolveReasoningBudget(reasoning);if(!budget)return{thinking:void 0,sendReasoning:void 0};return{thinking:{type:"enabled",budgetTokens:budget},sendReasoning:!0}}function buildGeminiThinkingProviderOptions(reasoning){let normalized=normalizeReasoningConfig(reasoning);if(!normalized)return;return{thinkingConfig:{thinkingBudget:resolveReasoningBudget(normalized)??1024,includeThoughts:normalized.includeThoughts!==!1}}}function buildMoonshotThinkingProviderOptions(reasoning){let budget=resolveReasoningBudget(reasoning);if(!budget)return;return{thinking:{type:"enabled",budgetTokens:budget},reasoningHistory:"interleaved"}}function buildDeepSeekThinkingProviderOptions(reasoning){return normalizeReasoningConfig(reasoning)?{thinking:{type:"enabled"}}:void 0}function mapToolDefinitionsToLanguageModelTools(tools,options={}){if(!tools||tools.length===0)return;let schemaProfile=options.schemaProfile??"default";return tools.map((tool)=>({type:"function",name:tool.name,description:tool.description,inputSchema:normalizeToolInputSchemaForLanguageModel(tool.inputSchema,schemaProfile),providerOptions:cloneProviderOptions(tool.providerOptions)}))}function normalizeToolInputSchemaForLanguageModel(inputSchema,schemaProfile){if(schemaProfile==="default")return inputSchema;let unsupportedKeywords=TOP_LEVEL_SCHEMA_KEYWORDS_BY_PROFILE[schemaProfile],profileLabel=SCHEMA_PROFILE_LABELS[schemaProfile],removedKeywords=unsupportedKeywords.filter((keyword)=>inputSchema[keyword]!==void 0);if(removedKeywords.length===0)return inputSchema;let sanitized={...inputSchema};for(let keyword of removedKeywords)delete sanitized[keyword];let compatibilityNote=`${profileLabel} schema projection. Runtime validation still enforces the full constraints after removing top-level transport-incompatible keywords: ${removedKeywords.join(", ")}.`;return sanitized.description=typeof inputSchema.description==="string"&&inputSchema.description.trim().length>0?`${inputSchema.description.trim()} ${compatibilityNote}`:compatibilityNote,sanitized}function messagesToLanguageModelPrompt(messages,options={}){let prompt=messages.filter((message)=>message.role==="system").flatMap(systemMessageToPromptMessages);for(let message of messages){if(message.role==="system")continue;if(message.role==="tool"){prompt.push(toolMessageToPrompt(message));continue}if(message.role==="assistant"){let content=[...options.assistantPrefixParts?.(message)??[],...contentBlocksToPromptParts(message.content),...toolCallsToPromptParts(message.toolCalls)];if(content.length>0)prompt.push({role:"assistant",content});if(content.length>0&&message.providerOptions)prompt[prompt.length-1]={...prompt[prompt.length-1],providerOptions:cloneProviderOptions(message.providerOptions)};continue}prompt.push({role:"user",content:contentBlocksToPromptParts(message.content),...message.providerOptions?{providerOptions:cloneProviderOptions(message.providerOptions)}:{}})}return prompt}function contentBlocksToPromptParts(content){return content.map((block)=>{if(block.type==="text")return{type:"text",text:block.text,...block.providerOptions?{providerOptions:cloneProviderOptions(block.providerOptions)}:{}};let filePart={type:"file",data:block.data,mediaType:block.mediaType};if(block.filename)filePart.filename=block.filename;if(block.providerOptions)filePart.providerOptions=cloneProviderOptions(block.providerOptions);return filePart})}function toolCallsToPromptParts(toolCalls){if(!toolCalls||toolCalls.length===0)return[];return toolCalls.map((toolCall)=>({type:"tool-call",toolCallId:toolCall.id,toolName:toolCall.function.name,input:toolCall.function.arguments}))}function toolMessageToPrompt(message){return{role:"tool",...message.providerOptions?{providerOptions:cloneProviderOptions(message.providerOptions)}:{},content:[{type:"tool-result",toolCallId:message.toolCallId,toolName:message.toolName,output:toolResultToLanguageModelOutput(message)}]}}function systemMessageToPromptMessages(message){if(!message.content.some((block)=>block.providerOptions!==void 0)){let content=contentToText(message.content);if(content.length===0)return[];return[{role:"system",content,...message.providerOptions?{providerOptions:cloneProviderOptions(message.providerOptions)}:{}}]}return message.content.flatMap((block)=>{if(block.type!=="text"||block.text.length===0)return[];return[{role:"system",content:block.text,...message.providerOptions||block.providerOptions?{providerOptions:mergeProviderOptions(message.providerOptions,block.providerOptions)}:{}}]})}var warnedProviders,MAX_TEXT_CHARS=4000,MAX_JSON_DEPTH=4,MAX_JSON_ARRAY_ITEMS=20,MAX_JSON_OBJECT_KEYS=40,TRUNCATED_SUFFIX="...[truncated]",LOW_HIGH_REASONING_EFFORT_MAP,LOW_MEDIUM_HIGH_REASONING_EFFORT_MAP,TOP_LEVEL_SCHEMA_KEYWORDS_BY_PROFILE,SCHEMA_PROFILE_LABELS;var init_prompt=__esm(()=>{init_observability();warnedProviders=new Set;LOW_HIGH_REASONING_EFFORT_MAP={none:"low",minimal:"low",low:"low",medium:"high",high:"high",xhigh:"high"},LOW_MEDIUM_HIGH_REASONING_EFFORT_MAP={none:"low",minimal:"low",low:"low",medium:"medium",high:"high",xhigh:"high"};TOP_LEVEL_SCHEMA_KEYWORDS_BY_PROFILE={anthropic:["oneOf","anyOf","allOf"],strictTopLevelObject:["oneOf","anyOf","allOf","enum","not"]},SCHEMA_PROFILE_LABELS={anthropic:"Anthropic-compatible",strictTopLevelObject:"Strict top-level object"}});function isReasoningActive(reasoning){return normalizeReasoningConfig(reasoning)!==void 0}function shouldPreserveEmptyChatCompletionsReasoningContent(input){return normalizeReasoningConfig(input.reasoning)?.interleave===!0&&input.modelId.toLowerCase().includes("deepseek")}function createChatCompletionsReasoningContentFetch(input){let providerFetch=createProviderFetch({fetch:input.fetch,stripHeaders:input.stripHeaders,stripWhen:input.stripWhen,debug:input.debug});if(!input.preserveReasoningContent)return providerFetch;return Object.assign(async(resource,init)=>{return providerFetch(resource,rewriteJsonInit(init,preserveChatCompletionsReasoningContent({body:parseJsonBody(init?.body??void 0),sourceMessages:input.messages,preserveEmptyReasoningContent:input.preserveEmptyReasoningContent})))},{preconnect:providerFetch.preconnect})}function parseJsonBody(body){if(typeof body!=="string")return;try{return JSON.parse(body)}catch{return}}function rewriteJsonInit(init,body){if(body===void 0)return init;return{...init,body:JSON.stringify(body)}}function preserveChatCompletionsReasoningContent(input){let body=input.body,candidate=readChatCompletionsBodyCandidate(body);if(!candidate||!Array.isArray(candidate.messages))return;let assistantSources=input.sourceMessages.filter((message)=>message.role==="assistant"),assistantIndex=0,changed=!1,messages=candidate.messages.map((message)=>{let record=readChatMessageCandidate(message);if(!record||record.role!=="assistant")return message;let source=assistantSources[assistantIndex];if(assistantIndex+=1,!hasToolCalls(source)&&!hasTransportToolCalls(record))return message;if(typeof record.reasoning_content==="string")return message;if(typeof source?.thinking!=="string"&&!input.preserveEmptyReasoningContent)return message;return changed=!0,{...record,reasoning_content:typeof source?.thinking==="string"?source.thinking:""}});if(!changed)return;return{...candidate,messages}}function hasToolCalls(message){return Array.isArray(message?.toolCalls)&&message.toolCalls.length>0}function hasTransportToolCalls(message){return Array.isArray(message.tool_calls)&&message.tool_calls.length>0}function readChatCompletionsBodyCandidate(value){if(!value||typeof value!=="object"||Array.isArray(value))return;return value}function readChatMessageCandidate(value){if(!value||typeof value!=="object"||Array.isArray(value))return;return value}var ANTHROPIC_INTERLEAVED_THINKING_BETA="interleaved-thinking-2025-05-14";var init_interleaved_thinking=__esm(()=>{init_prompt()});import{appendFile as appendFile2,mkdir as mkdir4}from"node:fs/promises";import path5 from"node:path";function createProviderRequestDebugContext(input){if(!input.config)return;let logFilePath=path5.resolve(input.config.logFilePath),redactSecrets=input.config.redactSecrets!==!1,log=async(event,data)=>{let entryFields={timestamp:new Date().toISOString(),event,requestId:input.requestId,provider:input.provider,model:input.model};for(let[key,value]of Object.entries(data))entryFields[key]=value;let entry=sanitizeRecord(entryFields,{redactSecrets},new WeakSet);await enqueueLog(logFilePath,`${JSON.stringify(entry)}
|
|
48
48
|
`)};return{requestId:input.requestId,provider:input.provider,model:input.model,logModelRequest({adapterOptions,request,streamMode}){return log("model_request",{adapterOptions,request,streamMode})},logAiSdkCall({callOptions}){return log("ai_sdk_call",{callOptions})},logHttpRequest({url,method,headers,body}){let entry={url,method,headers};if(body!==void 0)entry.body=body;return log("http_request",entry)},logModelError({error,payload}){let entry={error:serializeError(error)};if(payload!==void 0)entry.payload=payload;return log("model_error",entry)}}}function serializeError(error){if(error instanceof Error){let details={name:error.name,message:error.message,stack:error.stack};if(error.cause!==void 0)details.cause=sanitizeValue2(error.cause??void 0,{redactSecrets:!1});return details}return sanitizeValue2(error,{redactSecrets:!1})??"undefined"}async function enqueueLog(logFilePath,line){let next=(writeQueues.get(logFilePath)??Promise.resolve()).catch(()=>{return}).then(async()=>{await mkdir4(path5.dirname(logFilePath),{recursive:!0}),await appendFile2(logFilePath,line,"utf8")}).catch(()=>{return});if(writeQueues.set(logFilePath,next),await next,writeQueues.get(logFilePath)===next)writeQueues.delete(logFilePath)}function sanitizeValue2(value,options,parentKey,seen=new WeakSet){if(options.redactSecrets&&parentKey&&shouldRedact(parentKey))return REDACTED_VALUE;if(value==null)return;if(typeof value==="string"||typeof value==="number"||typeof value==="boolean")return value;if(typeof value==="bigint")return value.toString();if(typeof value==="function")return`[Function ${value.name||"anonymous"}]`;if(typeof value==="symbol")return value.toString();if(value instanceof Date)return value.toISOString();if(value instanceof URL)return value.toString();if(typeof Headers<"u"&&value instanceof Headers)return sanitizeRecord(headersToObject3(value),options,seen);if(typeof AbortSignal<"u"&&value instanceof AbortSignal)return{type:"AbortSignal",aborted:value.aborted};if(typeof Request<"u"&&value instanceof Request)return{type:"Request",url:value.url,method:value.method,headers:sanitizeRecord(headersToObject3(value.headers),options,seen)};if(typeof Response<"u"&&value instanceof Response)return{type:"Response",status:value.status,statusText:value.statusText,headers:sanitizeRecord(headersToObject3(value.headers),options,seen)};if(ArrayBuffer.isView(value))return{type:value.constructor.name,byteLength:value.byteLength};if(value instanceof ArrayBuffer)return{type:"ArrayBuffer",byteLength:value.byteLength};if(Array.isArray(value)){let items=[];for(let item of value){let normalized=sanitizeValue2(item,options,void 0,seen);if(normalized!==void 0)items.push(normalized)}return items}if(typeof value==="object"){if(seen.has(value))return CIRCULAR_VALUE;seen.add(value);let sanitized=sanitizeRecord(value,options,seen);return seen.delete(value),sanitized}return summarizeText2(String(value))}function sanitizeRecord(value,options,seen){let sanitized={};for(let[key,child]of Object.entries(value)){let normalized=sanitizeValue2(child,options,key,seen);if(normalized!==void 0)sanitized[key]=normalized}return sanitized}function headersToObject3(headers){let entries={};return headers.forEach((value,key)=>{entries[key]=value}),entries}function shouldRedact(key){return SECRET_KEYS.has(normalizeKey(key))}function normalizeKey(key){return key.toLowerCase().replace(/[^a-z0-9]/g,"")}function summarizeText2(value){if(value.length<=MAX_TEXT_SUMMARY_LENGTH)return value;return{text:value.slice(0,MAX_TEXT_SUMMARY_LENGTH),truncated:!0,length:value.length}}function isRetryableError(error){if(error.retryable===!0)return!0;if(error.retryable===!1)return!1;if(error.status&&RETRYABLE_STATUSES.has(error.status))return!0;return!1}function resolveRetryConfig(options){return{maxRetries:options?.maxRetries??DEFAULT_RETRY_OPTIONS.maxRetries,initialDelayMs:options?.initialDelayMs??DEFAULT_RETRY_OPTIONS.initialDelayMs,maxDelayMs:options?.maxDelayMs??DEFAULT_RETRY_OPTIONS.maxDelayMs,backoffMultiplier:options?.backoffMultiplier??DEFAULT_RETRY_OPTIONS.backoffMultiplier,shouldRetry:options?.shouldRetry??isRetryableError}}function calculateBackoff(attempt,config){let baseDelay=Math.min(config.maxDelayMs,config.initialDelayMs*config.backoffMultiplier**attempt);return baseDelay+Math.random()*baseDelay*0.1}function sleepWithSignal(ms,signal){if(signal?.aborted)return Promise.reject(signal.reason??Error("Aborted"));return new Promise((resolve,reject)=>{let timer=setTimeout(()=>{signal?.removeEventListener("abort",onAbort),resolve()},ms);function onAbort(){clearTimeout(timer),reject(signal.reason??Error("Aborted"))}signal?.addEventListener("abort",onAbort,{once:!0})})}function createProviderFactory(definition){return function(options){let provider=options.provider??definition.defaultProvider,defaultModel={provider,modelId:options.defaultModel},retryConfig=resolveRetryConfig(options.retry);return{provider,defaultModel,capabilities:options.capabilities?structuredClone(options.capabilities):void 0,countTokens(request){let effectiveRequest={...request,model:request.model??defaultModel};if(definition.driver.countTokens)return definition.driver.countTokens({options,provider,defaultModel,request:effectiveRequest});return estimateRequestTokens(effectiveRequest)},async*stream(request){let requestId=request.requestId??crypto.randomUUID(),model=request.model??defaultModel,baseRequest={...request,requestId,model},repairedMessages=repairToolMessageHistory(baseRequest.messages),repairedRequest=repairedMessages===baseRequest.messages?baseRequest:{...baseRequest,messages:repairedMessages};validateToolMessageHistory(repairedRequest.messages,{requestId,sessionId:readRequestMetadataString(repairedRequest,"sessionId"),turnId:readRequestMetadataString(repairedRequest,"turnId")}),yield{type:"response_start",requestId,model};let debug=createProviderRequestDebugContext({config:options.debug,requestId,provider,model}),boundaryRequest=await resolveProviderBoundaryRequest({options,provider,defaultModel,driver:definition.driver,request:repairedRequest}),context={options,provider,defaultModel,request:boundaryRequest.request,debug},streamMode=resolveStreamMode(request.streamMode,options.streamMode);if(await debug?.logModelRequest({adapterOptions:options,request:context.request,streamMode}),boundaryRequest.exhausted){let payload=createProviderOutputBudgetExhaustedPayload(provider,boundaryRequest.exhausted);await debug?.logModelError({error:payload,payload}),yield{type:"error",requestId,error:payload,terminal:!0};return}for(let attempt=0;attempt<=retryConfig.maxRetries;attempt++){if(attempt>0){let delay=calculateBackoff(attempt-1,retryConfig);try{await sleepWithSignal(delay,request.signal)}catch{break}options.logger?.emit({level:"debug",source:provider,message:`Retry attempt ${attempt}/${retryConfig.maxRetries} for request ${requestId}`})}let hasYieldedContent=!1;try{if(streamMode==="stream"&&definition.driver.stream){for await(let event of definition.driver.stream(context))hasYieldedContent=!0,yield attachRequestId(requestId,event);return}if(definition.driver.generate){yield*emitBufferedResult(requestId,await definition.driver.generate(context));return}if(definition.driver.stream){yield*emitBufferedResult(requestId,await collectProviderDriverStream(definition.driver.stream(context)));return}throw Error(`Provider ${provider} driver must implement generate() or stream()`)}catch(error){let payload=definition.driver.normalizeError?await definition.driver.normalizeError(error,context):createFallbackErrorPayload(provider,error);if(await debug?.logModelError({error,payload}),!(!hasYieldedContent&&attempt<retryConfig.maxRetries&&retryConfig.shouldRetry(payload,attempt+1))){yield{type:"error",requestId,error:payload,terminal:!0};return}}}}}}}async function resolveProviderBoundaryRequest(input){let contextWindow=input.options.capabilities?.contextWindow,requestedMaxOutputTokens=input.request.maxOutputTokens;if(!isPositiveFiniteNumber(contextWindow)||!isPositiveFiniteNumber(requestedMaxOutputTokens))return{request:input.request};let inputTokens=await countProviderBoundaryInputTokens(input),allowedMaxOutputTokens=Math.floor(contextWindow*PROVIDER_BOUNDARY_CONTEXT_WINDOW_RATIO-inputTokens);if(allowedMaxOutputTokens<1)return{request:input.request,exhausted:{contextWindow,inputTokens,requestedMaxOutputTokens,allowedMaxOutputTokens}};if(requestedMaxOutputTokens<=allowedMaxOutputTokens)return{request:input.request};return{request:{...input.request,maxOutputTokens:allowedMaxOutputTokens}}}async function countProviderBoundaryInputTokens(input){let rawTokens=input.driver.countTokens?await input.driver.countTokens({options:input.options,provider:input.provider,defaultModel:input.defaultModel,request:input.request}):estimateRequestTokens(input.request);if(!Number.isFinite(rawTokens)||rawTokens<0)return 0;return Math.ceil(rawTokens)}function createProviderOutputBudgetExhaustedPayload(provider,details){return{code:"provider_output_budget_exhausted",message:`${provider} output budget exhausted before request dispatch (input ${details.inputTokens} tokens, window ${details.contextWindow}, allowed maxOutputTokens ${details.allowedMaxOutputTokens})`,retryable:!1,details:{provider,contextWindow:details.contextWindow,inputTokens:details.inputTokens,requestedMaxOutputTokens:details.requestedMaxOutputTokens,allowedMaxOutputTokens:details.allowedMaxOutputTokens,ratio:PROVIDER_BOUNDARY_CONTEXT_WINDOW_RATIO}}}function isPositiveFiniteNumber(value){return typeof value==="number"&&Number.isFinite(value)&&value>0}function readRequestMetadataString(request,key){let value=request.metadata?.[key];return typeof value==="string"&&value.trim().length>0?value:void 0}function resolveStreamMode(requestMode,adapterMode){return requestMode??adapterMode??"stream"}async function*emitBufferedResult(requestId,result){for(let segment of result.content){if(segment.type==="text"){if(segment.text.length>0)yield{type:"text_delta",requestId,delta:segment.text};continue}if(segment.type==="thinking"){if(segment.text.length>0)yield{type:"thinking_delta",requestId,delta:segment.text};continue}yield{type:"tool_call_start",requestId,callId:segment.callId,toolName:segment.toolName},yield{type:"tool_call_args_delta",requestId,callId:segment.callId,delta:segment.argsText},yield{type:"tool_call_end",requestId,callId:segment.callId}}yield{type:"response_end",requestId,stopReason:result.stopReason,usage:result.usage,rawUsage:result.rawUsage,cost:result.cost,assistantMetadata:result.assistantMetadata}}function attachRequestId(requestId,event){switch(event.type){case"text_delta":return{type:"text_delta",requestId,delta:event.delta};case"thinking_delta":return{type:"thinking_delta",requestId,delta:event.delta};case"tool_call_start":return{type:"tool_call_start",requestId,callId:event.callId,toolName:event.toolName};case"tool_call_args_delta":return{type:"tool_call_args_delta",requestId,callId:event.callId,delta:event.delta};case"tool_call_end":return{type:"tool_call_end",requestId,callId:event.callId};case"response_end":return{type:"response_end",requestId,stopReason:event.stopReason,usage:event.usage,rawUsage:event.rawUsage,cost:event.cost,assistantMetadata:event.assistantMetadata}}}async function collectProviderDriverStream(events){let content=[],drafts=new Map,responseEnd;for await(let event of events){if(event.type==="text_delta"){if(event.delta.length>0)content.push({type:"text",text:event.delta});continue}if(event.type==="thinking_delta"){if(event.delta.length>0)content.push({type:"thinking",text:event.delta});continue}if(event.type==="tool_call_start"){drafts.set(event.callId,{toolName:event.toolName,argsText:""});continue}if(event.type==="tool_call_args_delta"){let draft=drafts.get(event.callId);if(!draft)throw Error(`Received tool_call_args_delta before tool_call_start for ${event.callId}`);draft.argsText+=event.delta,drafts.set(event.callId,draft);continue}if(event.type==="tool_call_end"){let draft=drafts.get(event.callId);if(!draft)throw Error(`Received tool_call_end before tool_call_start for ${event.callId}`);drafts.delete(event.callId),content.push({type:"tool_call",callId:event.callId,toolName:draft.toolName,argsText:draft.argsText});continue}responseEnd=event}if(!responseEnd)throw Error("Provider stream completed without response_end");return{content,stopReason:responseEnd.stopReason,usage:responseEnd.usage,rawUsage:responseEnd.rawUsage,cost:responseEnd.cost,assistantMetadata:responseEnd.assistantMetadata}}function createFallbackErrorPayload(provider,error){if(error instanceof Error)return{code:`${provider}_request_error`,message:error.message};return{code:`${provider}_request_error`,message:String(error)}}var REDACTED_VALUE="[REDACTED]",CIRCULAR_VALUE="[Circular]",MAX_TEXT_SUMMARY_LENGTH=4000,SECRET_KEYS,writeQueues,DEFAULT_RETRY_OPTIONS,RETRYABLE_STATUSES,PROVIDER_BOUNDARY_CONTEXT_WINDOW_RATIO=0.99;var init_create_provider_factory=__esm(()=>{init_heuristic();SECRET_KEYS=new Set(["authorization","proxyauthorization","apikey","xapikey","xgoogapikey"]),writeQueues=new Map;DEFAULT_RETRY_OPTIONS={maxRetries:5,initialDelayMs:1000,maxDelayMs:15000,backoffMultiplier:2},RETRYABLE_STATUSES=new Set([429,500,502,503,504])});function getErrorMessage(error){if(error==null)return"unknown error";if(typeof error==="string")return error;if(error instanceof Error)return error.message;return JSON.stringify(error)}var marker="vercel.ai.error",symbol,_a,_b,AISDKError,name="AI_APICallError",marker2,symbol2,_a2,_b2,APICallError,name2="AI_EmptyResponseBodyError",marker3,symbol3,_a3,_b3,EmptyResponseBodyError,name3="AI_InvalidArgumentError",marker4,symbol4,_a4,_b4,InvalidArgumentError,name4="AI_InvalidPromptError",marker5,symbol5,_a5,_b5,InvalidPromptError,name5="AI_InvalidResponseDataError",marker6,symbol6,_a6,_b6,InvalidResponseDataError,name6="AI_JSONParseError",marker7,symbol7,_a7,_b7,JSONParseError,name7="AI_LoadAPIKeyError",marker8,symbol8,_a8,_b8,LoadAPIKeyError,name8="AI_LoadSettingError",marker9,symbol9,_a9,_b9,LoadSettingError,name9="AI_NoContentGeneratedError",marker10,symbol10,_a10,_b10,NoContentGeneratedError,name10="AI_NoSuchModelError",marker11,symbol11,_a11,_b11,NoSuchModelError,name11="AI_TooManyEmbeddingValuesForCallError",marker12,symbol12,_a12,_b12,TooManyEmbeddingValuesForCallError,name12="AI_TypeValidationError",marker13,symbol13,_a13,_b13,TypeValidationError,name13="AI_UnsupportedFunctionalityError",marker14,symbol14,_a14,_b14,UnsupportedFunctionalityError;var init_dist=__esm(()=>{symbol=Symbol.for(marker),AISDKError=class _AISDKError extends(_b=Error,_a=symbol,_b){constructor({name:name14,message,cause}){super(message);this[_a]=!0,this.name=name14,this.cause=cause}static isInstance(error){return _AISDKError.hasMarker(error,marker)}static hasMarker(error,marker15){let markerSymbol=Symbol.for(marker15);return error!=null&&typeof error==="object"&&markerSymbol in error&&typeof error[markerSymbol]==="boolean"&&error[markerSymbol]===!0}},marker2=`vercel.ai.error.${name}`,symbol2=Symbol.for(marker2),APICallError=class extends(_b2=AISDKError,_a2=symbol2,_b2){constructor({message,url,requestBodyValues,statusCode,responseHeaders,responseBody,cause,isRetryable=statusCode!=null&&(statusCode===408||statusCode===409||statusCode===429||statusCode>=500),data}){super({name,message,cause});this[_a2]=!0,this.url=url,this.requestBodyValues=requestBodyValues,this.statusCode=statusCode,this.responseHeaders=responseHeaders,this.responseBody=responseBody,this.isRetryable=isRetryable,this.data=data}static isInstance(error){return AISDKError.hasMarker(error,marker2)}},marker3=`vercel.ai.error.${name2}`,symbol3=Symbol.for(marker3),EmptyResponseBodyError=class extends(_b3=AISDKError,_a3=symbol3,_b3){constructor({message="Empty response body"}={}){super({name:name2,message});this[_a3]=!0}static isInstance(error){return AISDKError.hasMarker(error,marker3)}};marker4=`vercel.ai.error.${name3}`,symbol4=Symbol.for(marker4),InvalidArgumentError=class extends(_b4=AISDKError,_a4=symbol4,_b4){constructor({message,cause,argument}){super({name:name3,message,cause});this[_a4]=!0,this.argument=argument}static isInstance(error){return AISDKError.hasMarker(error,marker4)}},marker5=`vercel.ai.error.${name4}`,symbol5=Symbol.for(marker5),InvalidPromptError=class extends(_b5=AISDKError,_a5=symbol5,_b5){constructor({prompt,message,cause}){super({name:name4,message:`Invalid prompt: ${message}`,cause});this[_a5]=!0,this.prompt=prompt}static isInstance(error){return AISDKError.hasMarker(error,marker5)}},marker6=`vercel.ai.error.${name5}`,symbol6=Symbol.for(marker6),InvalidResponseDataError=class extends(_b6=AISDKError,_a6=symbol6,_b6){constructor({data,message=`Invalid response data: ${JSON.stringify(data)}.`}){super({name:name5,message});this[_a6]=!0,this.data=data}static isInstance(error){return AISDKError.hasMarker(error,marker6)}},marker7=`vercel.ai.error.${name6}`,symbol7=Symbol.for(marker7),JSONParseError=class extends(_b7=AISDKError,_a7=symbol7,_b7){constructor({text,cause}){super({name:name6,message:`JSON parsing failed: Text: ${text}.
|
|
49
49
|
Error message: ${getErrorMessage(cause)}`,cause});this[_a7]=!0,this.text=text}static isInstance(error){return AISDKError.hasMarker(error,marker7)}},marker8=`vercel.ai.error.${name7}`,symbol8=Symbol.for(marker8),LoadAPIKeyError=class extends(_b8=AISDKError,_a8=symbol8,_b8){constructor({message}){super({name:name7,message});this[_a8]=!0}static isInstance(error){return AISDKError.hasMarker(error,marker8)}},marker9=`vercel.ai.error.${name8}`,symbol9=Symbol.for(marker9),LoadSettingError=class extends(_b9=AISDKError,_a9=symbol9,_b9){constructor({message}){super({name:name8,message});this[_a9]=!0}static isInstance(error){return AISDKError.hasMarker(error,marker9)}},marker10=`vercel.ai.error.${name9}`,symbol10=Symbol.for(marker10),NoContentGeneratedError=class extends(_b10=AISDKError,_a10=symbol10,_b10){constructor({message="No content generated."}={}){super({name:name9,message});this[_a10]=!0}static isInstance(error){return AISDKError.hasMarker(error,marker10)}},marker11=`vercel.ai.error.${name10}`,symbol11=Symbol.for(marker11),NoSuchModelError=class extends(_b11=AISDKError,_a11=symbol11,_b11){constructor({errorName=name10,modelId,modelType,message=`No such ${modelType}: ${modelId}`}){super({name:errorName,message});this[_a11]=!0,this.modelId=modelId,this.modelType=modelType}static isInstance(error){return AISDKError.hasMarker(error,marker11)}},marker12=`vercel.ai.error.${name11}`,symbol12=Symbol.for(marker12),TooManyEmbeddingValuesForCallError=class extends(_b12=AISDKError,_a12=symbol12,_b12){constructor(options){super({name:name11,message:`Too many values for a single embedding call. The ${options.provider} model "${options.modelId}" can only embed up to ${options.maxEmbeddingsPerCall} values per call, but ${options.values.length} values were provided.`});this[_a12]=!0,this.provider=options.provider,this.modelId=options.modelId,this.maxEmbeddingsPerCall=options.maxEmbeddingsPerCall,this.values=options.values}static isInstance(error){return AISDKError.hasMarker(error,marker12)}},marker13=`vercel.ai.error.${name12}`,symbol13=Symbol.for(marker13),TypeValidationError=class _TypeValidationError extends(_b13=AISDKError,_a13=symbol13,_b13){constructor({value,cause,context}){let contextPrefix="Type validation failed";if(context==null?void 0:context.field)contextPrefix+=` for ${context.field}`;if((context==null?void 0:context.entityName)||(context==null?void 0:context.entityId)){contextPrefix+=" (";let parts=[];if(context.entityName)parts.push(context.entityName);if(context.entityId)parts.push(`id: "${context.entityId}"`);contextPrefix+=parts.join(", "),contextPrefix+=")"}super({name:name12,message:`${contextPrefix}: Value: ${JSON.stringify(value)}.
|
|
@@ -194,7 +194,7 @@ ${body}
|
|
|
194
194
|
`)}function formatCountOutput(files,options){if(options.totalFiles===0)return"No files found";let lines=[buildSummaryLine("counts",options.totalMatches,options.totalFiles,{offset:options.offset,headLimit:options.headLimit,truncated:options.truncated})];for(let file2 of files)lines.push(`${file2.path}: ${file2.matchCount}`);return lines.join(`
|
|
195
195
|
`)}function buildSummaryLine(mode,totalMatches,totalFiles,options){let summary=mode==="files"?options.totalsAreLowerBounds?`Found at least ${totalFiles} files with matches`:`Found ${totalFiles} files with matches`:options.totalsAreLowerBounds?`Found at least ${totalMatches} matches in at least ${totalFiles} files`:`Found ${totalMatches} matches in ${totalFiles} files`;if(!options.truncated)return summary;if(options.headLimit===0)return summary;return`${summary} (showing ${Math.min(options.offset+1,Math.max(1,totalMatches))}-${Math.min(mode==="files"?totalFiles:totalMatches,options.offset+options.headLimit)})`}function renderGroupedMatches(matches,lineNumbers){let lines=[],lastRenderedLineNumber=0;for(let match of matches){for(let contextLine of match.beforeContext??[]){if(contextLine.lineNumber<=lastRenderedLineNumber)continue;lines.push(formatContextLine(contextLine.lineNumber,contextLine.line,lineNumbers)),lastRenderedLineNumber=contextLine.lineNumber}let matchEndLineNumber=match.endLineNumber??match.lineNumber;if(match.lineNumber>lastRenderedLineNumber)lines.push(formatMatchLine(match.lineNumber,matchEndLineNumber,match.line,lineNumbers));lastRenderedLineNumber=Math.max(lastRenderedLineNumber,matchEndLineNumber);for(let contextLine of match.afterContext??[]){if(contextLine.lineNumber<=lastRenderedLineNumber)continue;lines.push(formatContextLine(contextLine.lineNumber,contextLine.line,lineNumbers)),lastRenderedLineNumber=contextLine.lineNumber}}return lines.length>0?lines:[" (no visible matches in this page)"]}function formatContextLine(lineNumber,line,lineNumbers){if(!lineNumbers)return` - ${line}`;return` ${lineNumber}- ${line}`}function formatMatchLine(lineNumber,endLineNumber,line,lineNumbers){if(!lineNumbers)return` > ${line}`;if(endLineNumber!==lineNumber)return` ${lineNumber}-${endLineNumber}: ${line}`;return` ${lineNumber}: ${line}`}function serializeMatch(match){let serialized={path:match.path,lineNumber:match.lineNumber,line:match.line};if(match.endLineNumber!==void 0)serialized.endLineNumber=match.endLineNumber;if(match.truncated!==void 0)serialized.truncated=match.truncated;if(match.beforeContext!==void 0)serialized.beforeContext=match.beforeContext.map((line)=>({lineNumber:line.lineNumber,line:line.line}));if(match.afterContext!==void 0)serialized.afterContext=match.afterContext.map((line)=>({lineNumber:line.lineNumber,line:line.line}));return serialized}var DEFAULT_GLOB_LIMIT=100,DEFAULT_GREP_HEAD_LIMIT=100,DEFAULT_GREP_TIMEOUT_MS2=3000,GREP_GLOB_PROMPT_SEGMENTS,GlobTool,GrepTool;var init_dist15=__esm(()=>{init_dist12();GREP_GLOB_PROMPT_SEGMENTS=[["When using the official grep/glob tools:","- Narrow searches with path or include whenever possible.","- For open-ended discovery, use glob first and grep second.","- Avoid multiline, large context windows, and whole-repo regex scans unless necessary.","- If grep times out, narrow the search scope before retrying."].join(`
|
|
196
196
|
`)],GlobTool=class extends BaseTool{constructor(){super({name:"glob",description:"List files that match a glob pattern.",inputSchema:{type:"object",properties:{pattern:{type:"string",description:"Glob pattern to match."},path:{type:"string",description:"Optional file or directory path to search in. Relative paths resolve against the current working directory."},limit:{type:"number",description:"Optional maximum number of matches."},sortBy:{type:"string",enum:["path","mtime"],description:'Optional sort order. Defaults to "mtime".'}},required:["pattern"]}})}async execute(args,context){let fileSystem=context.services?.fileSystem;if(!fileSystem)throw Error("FileSystemGateway is not available in the tool execution context");if(!args.pattern)throw Error("pattern must be a non-empty string");let limit=args.limit??DEFAULT_GLOB_LIMIT,sortBy=resolveGlobSortBy(args.sortBy),{root:searchRoot,fileFilter}=await resolveSearchRoot(args.path??void 0,context.cwd),result=await fileSystem.glob(fileFilter??args.pattern,{cwd:searchRoot,limit,sortBy});return createToolResult({content:[{type:"text",text:formatGlobOutput(result)}],structuredContent:{pattern:args.pattern,path:searchRoot??context.cwd??process.cwd(),sortBy,files:result.files,numFiles:result.numFiles,truncated:result.truncated,durationMs:result.durationMs}})}},GrepTool=class extends BaseTool{constructor(){super({name:"grep",description:"Search file contents with a regex pattern. Narrow path or include to keep searches fast.",inputSchema:{type:"object",properties:{pattern:{type:"string",description:"Regex pattern to search for in file contents. Prefer specific patterns and a narrow path/include on large repos."},path:{type:"string",description:"Optional file or directory path to search in. Relative paths resolve against the current working directory."},include:{type:"string",description:'Optional glob pattern to limit searched files, for example "*.{ts,tsx}".'},glob:{type:"string",description:"Alias for include."},outputMode:{type:"string",enum:["content","files","count"],description:'Output style. Defaults to "content".'},output_mode:{type:"string",enum:["content","files","count"],description:"Alias for outputMode."},beforeContext:{type:"number",description:"Number of context lines to show before each match."},afterContext:{type:"number",description:"Number of context lines to show after each match."},context:{type:"number",description:"Shared context line count used for both beforeContext and afterContext."},"-B":{type:"number",description:"Alias for beforeContext."},"-A":{type:"number",description:"Alias for afterContext."},"-C":{type:"number",description:"Alias for context."},ignoreCase:{type:"boolean",description:"When true, perform a case-insensitive search."},"-i":{type:"boolean",description:"Alias for ignoreCase."},lineNumbers:{type:"boolean",description:"When true, include line numbers in content output."},"-n":{type:"boolean",description:"Alias for lineNumbers."},headLimit:{type:"number",description:"Maximum number of matches or files to return. Use 0 for no tool-level limit."},head_limit:{type:"number",description:"Alias for headLimit."},offset:{type:"number",description:"Number of matches or files to skip before rendering results."},multiline:{type:"boolean",description:"When true, allow regex matches to span multiple lines."},timeoutMs:{type:"number",description:`Optional regex search timeout in milliseconds. Defaults to ${DEFAULT_GREP_TIMEOUT_MS2}.`}},required:["pattern"]}})}async execute(args,context){let fileSystem=context.services?.fileSystem;if(!fileSystem)throw Error("FileSystemGateway is not available in the tool execution context");if(!args.pattern)throw Error("pattern must be a non-empty string");let normalized=normalizeGrepArgs(args),{root:searchRoot,fileFilter}=await resolveSearchRoot(normalized.path,context.cwd),boundedMatchLimit=getBoundedContentMatchLimit(normalized),rawMatches=await fileSystem.grep(normalized.pattern,{cwd:searchRoot,include:fileFilter??normalized.include,fixedStrings:!1,ignoreCase:normalized.ignoreCase,multiline:normalized.multiline,beforeContext:normalized.beforeContext,afterContext:normalized.afterContext,sortBy:"mtime",timeoutMs:normalized.timeoutMs,limit:boundedMatchLimit===void 0?void 0:boundedMatchLimit+1}),totalsAreLowerBounds=boundedMatchLimit!==void 0&&rawMatches.length>boundedMatchLimit,matches=totalsAreLowerBounds?rawMatches.slice(0,boundedMatchLimit):rawMatches,groups=groupMatchesByFile(matches),rawGroups=groupMatchesByFile(rawMatches),totalMatches=rawMatches.length,totalFiles=rawGroups.length;if(normalized.outputMode==="content"){let page2=applyHeadLimit(matches,normalized.headLimit,normalized.offset),pageGroups=groupMatchesByFile(page2.items),truncated=page2.truncated||totalsAreLowerBounds;return createToolResult({content:[{type:"text",text:formatContentOutput(pageGroups,{totalMatches,totalFiles,offset:normalized.offset,headLimit:normalized.headLimit,truncated,lineNumbers:normalized.lineNumbers,totalsAreLowerBounds})}],structuredContent:{pattern:normalized.pattern,outputMode:normalized.outputMode,totalMatches,totalFiles,returnedMatches:page2.items.length,returnedFiles:pageGroups.length,headLimit:normalized.headLimit,offset:normalized.offset,truncated,totalsAreLowerBounds,files:pageGroups.map((group)=>({path:group.path,matchCount:group.matchCount,matches:group.matches.map(serializeMatch)}))}})}let page=applyHeadLimit(groups.map((group)=>({path:group.path,matchCount:group.matchCount})),normalized.headLimit,normalized.offset);if(normalized.outputMode==="files")return createToolResult({content:[{type:"text",text:formatFilesOutput(page.items,{totalMatches,totalFiles,offset:normalized.offset,headLimit:normalized.headLimit,truncated:page.truncated})}],structuredContent:{pattern:normalized.pattern,outputMode:normalized.outputMode,totalMatches,totalFiles,returnedMatches:page.items.reduce((sum,item)=>sum+item.matchCount,0),returnedFiles:page.items.length,headLimit:normalized.headLimit,offset:normalized.offset,truncated:page.truncated,files:page.items.map((item)=>({...item}))}});return createToolResult({content:[{type:"text",text:formatCountOutput(page.items,{totalMatches,totalFiles,offset:normalized.offset,headLimit:normalized.headLimit,truncated:page.truncated})}],structuredContent:{pattern:normalized.pattern,outputMode:normalized.outputMode,totalMatches,totalFiles,returnedMatches:page.items.reduce((sum,item)=>sum+item.matchCount,0),returnedFiles:page.items.length,headLimit:normalized.headLimit,offset:normalized.offset,truncated:page.truncated,counts:page.items.map((item)=>({path:item.path,count:item.matchCount}))}})}}});var exports_dist3={};__export(exports_dist3,{createPlanModePlugin:()=>createPlanModePlugin});import{mkdir as mkdir6,readFile as readFile6,rm as rm3,writeFile as writeFile6}from"node:fs/promises";import path16 from"node:path";function createPlanModePlugin(options={}){let normalized=normalizeOptions(options);return{manifest:{id:normalized.id,version:"1.0.0",apiVersion:1,permissions:{fs:!0},capabilities:["plan-mode"]},setup(context){let hostDataDir=context.hostDataDir;if(!hostDataDir)throw Error("createPlanModePlugin requires createAgent({ hostDataDir }) so plan drafts can be stored outside the workspace");let planReadTool=new PlanReadTool(hostDataDir,normalized.activationMetadataKey),planWriteTool=new PlanWriteTool(hostDataDir,normalized.activationMetadataKey),planModeSwitchTool=new PlanModeSwitchTool(normalized);return{inspector:{getConfig:async()=>({id:normalized.id,modeName:normalized.modeName,description:normalized.description,activationMetadataKey:normalized.activationMetadataKey,allowedExecPatterns:normalized.allowedExecPatterns.map((rule)=>({pattern:rule.pattern,action:rule.action})),extraVisibleTools:[...normalized.extraVisibleTools]}),getSessionState:async(sessionId)=>{let state=readStateEntry(await context.services.pluginState.get(sessionId));return{active:state.active??!1,pendingActive:state.pendingActive??!1,draftPath:planDraftPath(hostDataDir,sessionId)}}},modes:[{name:normalized.modeName,description:normalized.description}],tools:normalized.allowModelSwitch?[planReadTool,planWriteTool,planModeSwitchTool]:[planReadTool,planWriteTool],createSessionController:(controllerContext)=>new DefaultPlanModeSessionController(normalized,controllerContext,hostDataDir),hooks:[{descriptor:{name:"run.start"},middleware:[async({payload,context:runtimeContext})=>{if(await reconcilePendingActivation(runtimeContext),await isPlanModeActiveForCurrentRun(runtimeContext,normalized.activationMetadataKey))await ensureDraftMetadata(hostDataDir,payload.sessionId);return payload}]},{descriptor:{name:"prompt.resolve"},middleware:[async({payload,context:runtimeContext})=>{if(!await isPlanModeActiveForCurrentRun(runtimeContext,normalized.activationMetadataKey))return payload;let sessionId=runtimeContext.sessionId;if(!sessionId)return payload;return{...payload,promptSegments:[buildReminderPrompt(hostDataDir,sessionId),...payload.promptSegments]}}]},{descriptor:{name:"toolset.resolve"},middleware:[async({payload,context:runtimeContext})=>{if(!await isPlanModeActiveForCurrentRun(runtimeContext,normalized.activationMetadataKey)){let hidden=new Set([PLAN_READ_TOOL_NAME,PLAN_WRITE_TOOL_NAME]);if(!normalized.allowModelSwitch)hidden.add(PLAN_MODE_SWITCH_TOOL_NAME);return{...payload,tools:payload.tools.filter((tool2)=>!hidden.has(tool2.name))}}let allowed=createAllowedToolNameSet(normalized);return{...payload,tools:payload.tools.filter((tool2)=>allowed.has(tool2.name))}}]},{descriptor:{name:"tool.beforeExecute"},middleware:[async({payload,context:runtimeContext})=>{let toolName=payload.toolCall.function.name;if(toolName===PLAN_MODE_SWITCH_TOOL_NAME){if(!normalized.allowModelSwitch)return denyToolCall("Model-initiated plan mode switching is disabled.");let args=payload.toolCall.function.arguments;if(args.action==="exit_plan")return askToolCall({message:args.reason?`Model requests exiting plan mode: ${args.reason}. Allow implementation?`:"Model requests exiting plan mode. Allow implementation?"});return payload}if(!await isPlanModeActiveForCurrentRun(runtimeContext,normalized.activationMetadataKey)){if(toolName===PLAN_READ_TOOL_NAME||toolName===PLAN_WRITE_TOOL_NAME)return denyToolCall("Plan mode is not active for this session.");return payload}if(IMMUTABLY_BLOCKED_TOOL_NAMES.has(toolName))return denyToolCall(`Plan mode blocks ${toolName}. Use ${PLAN_WRITE_TOOL_NAME} to update the plan draft instead.`);if(toolName===PLAN_READ_TOOL_NAME||toolName===PLAN_WRITE_TOOL_NAME)return payload;if(toolName==="exec"){let execInput;try{execInput=readExecToolInput(payload.toolCall.function.arguments)}catch(error48){return denyToolCall(`Plan mode could not parse exec tool input: ${error48 instanceof Error?error48.message:String(error48)}`)}let decision=classifyExecCommand(execInput,normalized.allowedExecPatterns);if(decision.action==="allow")return payload;if(decision.action==="ask")return askToolCall({message:decision.reason??`Plan mode requires approval for exec command: ${formatExecInput(execInput)}`});return denyToolCall(decision.reason??`Plan mode blocked exec command: ${formatExecInput(execInput)}`)}if(!createAllowedToolNameSet(normalized).has(toolName))return denyToolCall(`Plan mode blocks tool ${toolName}. Disable plan mode before implementation.`);return payload}]}]}}}}function normalizeOptions(options){return{id:options.id??"plan-mode",modeName:options.modeName??"plan",description:options.description??"Analyze and plan only. The runtime blocks implementation tools until the mode is disabled.",activationMetadataKey:options.activationMetadataKey??"planMode",allowedExecPatterns:[...DEFAULT_ALLOWED_EXEC_PATTERNS,...options.allowedExecPatterns??[]],extraVisibleTools:dedupeToolNames(options.extraVisibleTools??[]),allowModelSwitch:options.allowModelSwitch??!0}}function dedupeToolNames(names){let seen=new Set,deduped=[];for(let name15 of names){if(!name15.trim())continue;if(IMMUTABLY_BLOCKED_TOOL_NAMES.has(name15))continue;if(seen.has(name15))continue;seen.add(name15),deduped.push(name15)}return deduped}function createAllowedToolNameSet(options){return new Set([...DEFAULT_VISIBLE_TOOL_NAMES,PLAN_READ_TOOL_NAME,PLAN_WRITE_TOOL_NAME,PLAN_MODE_SWITCH_TOOL_NAME,...options.extraVisibleTools])}function buildReminderPrompt(hostDataDir,sessionId){return["PLAN MODE ACTIVE","","You are in planning mode.","","Rules:","- Analyze and plan only. Do not implement repository changes.","- `write`, `edit`, and `patch` style tools are blocked.","- `exec` accepts argv arrays and is restricted to read-only inspection commands.","- Build, test, lint, install, and typecheck commands are blocked in plan mode.",`- The only writable artifact is the plan draft at: ${planDraftPath(hostDataDir,sessionId)}`,`- Use \`${PLAN_WRITE_TOOL_NAME}\` to update the plan draft and \`${PLAN_READ_TOOL_NAME}\` to inspect it.`,"- If implementation is required, disable plan mode first."].join(`
|
|
197
|
-
`)}function resolvePlanModeStatus(state,metadata,isRunning,activationMetadataKey,hostDataDir,sessionId){let metadataActive=metadata?.[activationMetadataKey]===!0,persistedActive=state.active??metadataActive,pendingActive=typeof state.pendingActive==="boolean"?state.pendingActive:void 0;return{active:!isRunning&&pendingActive!==void 0?pendingActive:persistedActive,pendingActive:isRunning?pendingActive:void 0,draftPath:planDraftPath(hostDataDir,sessionId)}}async function isPlanModeActiveForCurrentRun(context,activationMetadataKey){if(!context.sessionId)return!1;return readStateEntry(await context.services.pluginState.get(context.sessionId)).active??context.metadata?.[activationMetadataKey]===!0}async function reconcilePendingActivation(context){if(!context.sessionId)return;let current=readStateEntry(await context.services.pluginState.get(context.sessionId));if(typeof current.pendingActive!=="boolean")return;let next={...current,active:current.pendingActive,pendingActive:void 0};await context.services.pluginState.replace(context.sessionId,createStateEntry(next))}function createStateEntry(state){let data={active:state.active??!1};if(typeof state.pendingActive==="boolean")data.pendingActive=state.pendingActive;return{version:1,data,updatedAt:Date.now()}}function readStateEntry(entry){if(!entry)return{};let data=entry.data;return{active:typeof data.active==="boolean"?data.active:void 0,pendingActive:typeof data.pendingActive==="boolean"?data.pendingActive:void 0}}function classifyExecCommand(input,rules){if(input.action==="poll"||input.action==="terminate")return{action:"allow"};let command=normalizeExecPatternInput(input.command);if(!command)return{action:"deny",reason:"Plan mode requires exec command to be a non-empty string array."};for(let deniedPrefix of HARD_DENIED_COMMAND_PREFIXES)if(matchesPrefix(command,deniedPrefix))return{action:"deny",reason:`Plan mode blocks exec command: ${command}`};let decision={action:"deny",reason:`Plan mode blocked exec command: ${command}`};for(let rule of rules){if(!matchesCommandPattern(command,rule.pattern))continue;decision={action:rule.action,reason:rule.action==="allow"?void 0:rule.action==="ask"?`Plan mode requires approval for exec command: ${command}`:`Plan mode blocked exec command: ${command}`}}return decision}function matchesPrefix(command,prefix){return command===prefix.trim()||command.startsWith(`${prefix.trim()} `)}function matchesCommandPattern(command,pattern){let escaped=pattern.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return new RegExp(`^${escaped}$`).test(command)}function readExecToolInput(args){let action=readExecAction(args.action,args),command=readExecCommand(args.command);if(action==="start"){if(!command)throw Error("Plan mode requires exec command to be a non-empty string array.");return{action,command}}let processId=args.processId;if(typeof processId!=="number"||!Number.isInteger(processId)||processId<=0)throw Error(`Plan mode requires exec ${action} processId to be a positive integer.`);return{action,processId}}function readExecAction(value,args){if(value===void 0){if("command"in args&&!("processId"in args))return"start";if("processId"in args&&!("command"in args))return"poll";throw Error("Plan mode requires exec to include either command or processId.")}if(value==="start"||value==="poll"||value==="terminate")return value;throw Error("Plan mode only allows exec action to be start, poll, or terminate.")}function readExecCommand(value){if(value===void 0)return;if(!Array.isArray(value)||value.length===0)throw Error("Plan mode requires exec command to be a non-empty string array.");if(value.some((entry)=>typeof entry!=="string"))throw Error("Plan mode requires every exec command entry to be a string.");if(typeof value[0]==="string"&&value[0].trim().length===0)throw Error("Plan mode requires exec command[0] to be a non-empty string.");return[...value]}function normalizeExecPatternInput(command){if(!command||command.length===0)return"";return command.map((part)=>part.trim()).join(" ").trim().replace(/\s+/g," ")}function formatExecInput(input){if(input.action==="start")return normalizeExecPatternInput(input.command);return`${input.action} process ${input.processId??"unknown"}`}function draftDirectory(hostDataDir,sessionId){return path16.join(path16.resolve(hostDataDir),"plans",encodeURIComponent(sessionId))}function planDraftPath(hostDataDir,sessionId){return path16.join(draftDirectory(hostDataDir,sessionId),"plan.md")}function draftMetaPath(hostDataDir,sessionId){return path16.join(draftDirectory(hostDataDir,sessionId),"meta.json")}async function ensureDraftMetadata(hostDataDir,sessionId){let directory=draftDirectory(hostDataDir,sessionId),metaPath=draftMetaPath(hostDataDir,sessionId),current=await readDraftMetadata(hostDataDir,sessionId),now=Date.now(),next={sessionId,mode:"plan",createdAt:current?.createdAt??now,updatedAt:now};await mkdir6(directory,{recursive:!0}),await writeFile6(metaPath,JSON.stringify(next,null,2),"utf8")}async function writeDraft(hostDataDir,sessionId,content){await ensureDraftMetadata(hostDataDir,sessionId),await writeFile6(planDraftPath(hostDataDir,sessionId),content,"utf8"),await ensureDraftMetadata(hostDataDir,sessionId)}async function readDraftMetadata(hostDataDir,sessionId){try{let raw=await readFile6(draftMetaPath(hostDataDir,sessionId),"utf8"),parsed=JSON.parse(raw);if(typeof parsed.sessionId!=="string")return;if(parsed.mode!=="plan")return;if(typeof parsed.createdAt!=="number"||typeof parsed.updatedAt!=="number")return;return{sessionId:parsed.sessionId,mode:"plan",createdAt:parsed.createdAt,updatedAt:parsed.updatedAt}}catch{return}}async function readTextIfExists(filePath){try{return await readFile6(filePath,"utf8")}catch{return}}async function assertActiveToolContext(context,activationMetadataKey){let state=context.services?readStateEntry(await context.services.pluginState.get(context.sessionId)):{},metadataActive=context.metadata?.[activationMetadataKey]===!0;if(!(state.active??metadataActive))throw Error("Plan mode is not active for this session.")}var PLAN_READ_TOOL_NAME="plan_read",PLAN_WRITE_TOOL_NAME="plan_write",PLAN_MODE_SWITCH_TOOL_NAME="plan_mode",DEFAULT_VISIBLE_TOOL_NAMES,IMMUTABLY_BLOCKED_TOOL_NAMES,DEFAULT_ALLOWED_EXEC_PATTERNS,HARD_DENIED_COMMAND_PREFIXES,DefaultPlanModeSessionController=class{options;context;hostDataDir;constructor(options,context,hostDataDir){this.options=options,this.context=context,this.hostDataDir=hostDataDir}async getState(){return resolvePlanModeStatus(readStateEntry(await this.context.pluginState.get(this.context.sessionId)),this.context.metadata,this.context.isRunning(),this.options.activationMetadataKey,this.hostDataDir,this.context.sessionId)}async enable(){return this.updateState((state)=>{if(this.context.isRunning())return{...state,pendingActive:!0};return{...state,active:!0,pendingActive:void 0}})}async disable(){return this.updateState((state)=>{if(this.context.isRunning())return{...state,pendingActive:!1};return{...state,active:!1,pendingActive:void 0}})}async clearDraft(){return await rm3(draftDirectory(this.hostDataDir,this.context.sessionId),{recursive:!0,force:!0}),this.getState()}async updateState(mutate){let next=mutate(readStateEntry(await this.context.pluginState.get(this.context.sessionId)));if(await this.context.pluginState.replace(this.context.sessionId,createStateEntry(next)),!this.context.isRunning())await this.context.save();return resolvePlanModeStatus(next,this.context.metadata,this.context.isRunning(),this.options.activationMetadataKey,this.hostDataDir,this.context.sessionId)}},PlanReadTool,PlanWriteTool,PlanModeSwitchTool;var init_dist16=__esm(()=>{init_dist12();init_dist13();DEFAULT_VISIBLE_TOOL_NAMES=["read","grep","glob","exec"],IMMUTABLY_BLOCKED_TOOL_NAMES=new Set(["write","edit","patch"]),DEFAULT_ALLOWED_EXEC_PATTERNS=[{pattern:"pwd",action:"allow"},{pattern:"ls",action:"allow"},{pattern:"ls *",action:"allow"},{pattern:"find *",action:"allow"},{pattern:"cat *",action:"allow"},{pattern:"head *",action:"allow"},{pattern:"tail *",action:"allow"},{pattern:"wc *",action:"allow"},{pattern:"stat *",action:"allow"},{pattern:"file *",action:"allow"},{pattern:"sed -n *",action:"allow"},{pattern:"rg *",action:"allow"},{pattern:"grep *",action:"allow"},{pattern:"fd *",action:"allow"},{pattern:"git status",action:"allow"},{pattern:"git status *",action:"allow"},{pattern:"git diff",action:"allow"},{pattern:"git diff *",action:"allow"},{pattern:"git show *",action:"allow"},{pattern:"git log",action:"allow"},{pattern:"git log *",action:"allow"},{pattern:"git branch",action:"allow"},{pattern:"git branch *",action:"allow"},{pattern:"git rev-parse *",action:"allow"},{pattern:"git ls-files",action:"allow"},{pattern:"git ls-files *",action:"allow"},{pattern:"git grep *",action:"allow"},{pattern:"git blame *",action:"allow"},{pattern:"git shortlog",action:"allow"},{pattern:"git shortlog *",action:"allow"},{pattern:"git describe",action:"allow"},{pattern:"git describe *",action:"allow"},{pattern:"git cat-file *",action:"allow"},{pattern:"git ls-tree *",action:"allow"},{pattern:"git show-ref",action:"allow"},{pattern:"git show-ref *",action:"allow"},{pattern:"git ls-remote",action:"allow"},{pattern:"git ls-remote *",action:"allow"},{pattern:"git for-each-ref",action:"allow"},{pattern:"git for-each-ref *",action:"allow"},{pattern:"git rev-list *",action:"allow"},{pattern:"git merge-base *",action:"allow"},{pattern:"git diff-tree *",action:"allow"},{pattern:"git cherry",action:"allow"},{pattern:"git cherry *",action:"allow"},{pattern:"git name-rev *",action:"allow"},{pattern:"git check-ignore *",action:"allow"},{pattern:"git tag",action:"allow"},{pattern:"git tag -l",action:"allow"},{pattern:"git tag -l *",action:"allow"},{pattern:"git tag --list",action:"allow"},{pattern:"git tag --list *",action:"allow"},{pattern:"git remote",action:"allow"},{pattern:"git remote -v",action:"allow"},{pattern:"git remote show *",action:"allow"},{pattern:"git remote get-url *",action:"allow"},{pattern:"git reflog",action:"allow"},{pattern:"git reflog show *",action:"allow"},{pattern:"git stash list",action:"allow"},{pattern:"git stash list *",action:"allow"},{pattern:"git stash show *",action:"allow"},{pattern:"git config --get *",action:"allow"},{pattern:"git config --get-regexp *",action:"allow"},{pattern:"git config --list",action:"allow"},{pattern:"git config -l",action:"allow"},{pattern:"head",action:"allow"},{pattern:"tail",action:"allow"},{pattern:"wc",action:"allow"},{pattern:"cat",action:"allow"},{pattern:"sort",action:"allow"},{pattern:"sort *",action:"allow"},{pattern:"uniq",action:"allow"},{pattern:"uniq *",action:"allow"},{pattern:"cut *",action:"allow"},{pattern:"tr *",action:"allow"},{pattern:"awk *",action:"allow"},{pattern:"jq",action:"allow"},{pattern:"jq *",action:"allow"},{pattern:"yq",action:"allow"},{pattern:"yq *",action:"allow"},{pattern:"xargs grep *",action:"allow"},{pattern:"xargs rg *",action:"allow"},{pattern:"du *",action:"allow"},{pattern:"df",action:"allow"},{pattern:"df *",action:"allow"},{pattern:"tree",action:"allow"},{pattern:"tree *",action:"allow"},{pattern:"which *",action:"allow"},{pattern:"echo",action:"allow"},{pattern:"echo *",action:"allow"},{pattern:"realpath *",action:"allow"},{pattern:"basename *",action:"allow"},{pattern:"dirname *",action:"allow"}],HARD_DENIED_COMMAND_PREFIXES=["touch","mkdir","rm","mv","cp","ln","chmod","chown","git add","git commit","git push","git checkout","git switch","git restore","git apply","npm ","pnpm ","yarn ","bun "];PlanReadTool=class extends BaseTool{hostDataDir;activationMetadataKey;constructor(hostDataDir,activationMetadataKey){super({name:PLAN_READ_TOOL_NAME,description:"Read the current plan draft for this session.",inputSchema:{type:"object",properties:{}}});this.hostDataDir=hostDataDir,this.activationMetadataKey=activationMetadataKey}async execute(_args,context){await assertActiveToolContext(context,this.activationMetadataKey);let sessionId=context.sessionId,draftPath=planDraftPath(this.hostDataDir,sessionId),content=await readTextIfExists(draftPath);return createToolResult({content:[{type:"text",text:content??`No plan draft has been written yet.
|
|
197
|
+
`)}function resolvePlanModeStatus(state,metadata,isRunning,activationMetadataKey,hostDataDir,sessionId){let metadataActive=metadata?.[activationMetadataKey]===!0,persistedActive=state.active??metadataActive,pendingActive=typeof state.pendingActive==="boolean"?state.pendingActive:void 0;return{active:!isRunning&&pendingActive!==void 0?pendingActive:persistedActive,pendingActive:isRunning?pendingActive:void 0,draftPath:planDraftPath(hostDataDir,sessionId)}}async function isPlanModeActiveForCurrentRun(context,activationMetadataKey){if(!context.sessionId)return!1;return readStateEntry(await context.services.pluginState.get(context.sessionId)).active??context.metadata?.[activationMetadataKey]===!0}async function reconcilePendingActivation(context){if(!context.sessionId)return;let current=readStateEntry(await context.services.pluginState.get(context.sessionId));if(typeof current.pendingActive!=="boolean")return;let next={...current,active:current.pendingActive,pendingActive:void 0};await context.services.pluginState.replace(context.sessionId,createStateEntry(next))}function createStateEntry(state){let data={active:state.active??!1};if(typeof state.pendingActive==="boolean")data.pendingActive=state.pendingActive;return{version:1,data,updatedAt:Date.now()}}function readStateEntry(entry){if(!entry)return{};let data=entry.data;return{active:typeof data.active==="boolean"?data.active:void 0,pendingActive:typeof data.pendingActive==="boolean"?data.pendingActive:void 0}}function classifyExecCommand(input,rules){let command=normalizeExecPatternInput(input.command);if(!command)return{action:"deny",reason:"Plan mode requires exec command to be a non-empty string array."};for(let deniedPrefix of HARD_DENIED_COMMAND_PREFIXES)if(matchesPrefix(command,deniedPrefix))return{action:"deny",reason:`Plan mode blocks exec command: ${command}`};let decision={action:"deny",reason:`Plan mode blocked exec command: ${command}`};for(let rule of rules){if(!matchesCommandPattern(command,rule.pattern))continue;decision={action:rule.action,reason:rule.action==="allow"?void 0:rule.action==="ask"?`Plan mode requires approval for exec command: ${command}`:`Plan mode blocked exec command: ${command}`}}return decision}function matchesPrefix(command,prefix){return command===prefix.trim()||command.startsWith(`${prefix.trim()} `)}function matchesCommandPattern(command,pattern){let escaped=pattern.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return new RegExp(`^${escaped}$`).test(command)}function readExecToolInput(args){let command=readExecCommand(args.command);if(!command)throw Error("Plan mode requires exec command to be a non-empty string array.");return{command}}function readExecCommand(value){if(value===void 0)return;if(!Array.isArray(value)||value.length===0)throw Error("Plan mode requires exec command to be a non-empty string array.");if(value.some((entry)=>typeof entry!=="string"))throw Error("Plan mode requires every exec command entry to be a string.");if(typeof value[0]==="string"&&value[0].trim().length===0)throw Error("Plan mode requires exec command[0] to be a non-empty string.");return[...value]}function normalizeExecPatternInput(command){if(!command||command.length===0)return"";return command.map((part)=>part.trim()).join(" ").trim().replace(/\s+/g," ")}function formatExecInput(input){return normalizeExecPatternInput(input.command)}function draftDirectory(hostDataDir,sessionId){return path16.join(path16.resolve(hostDataDir),"plans",encodeURIComponent(sessionId))}function planDraftPath(hostDataDir,sessionId){return path16.join(draftDirectory(hostDataDir,sessionId),"plan.md")}function draftMetaPath(hostDataDir,sessionId){return path16.join(draftDirectory(hostDataDir,sessionId),"meta.json")}async function ensureDraftMetadata(hostDataDir,sessionId){let directory=draftDirectory(hostDataDir,sessionId),metaPath=draftMetaPath(hostDataDir,sessionId),current=await readDraftMetadata(hostDataDir,sessionId),now=Date.now(),next={sessionId,mode:"plan",createdAt:current?.createdAt??now,updatedAt:now};await mkdir6(directory,{recursive:!0}),await writeFile6(metaPath,JSON.stringify(next,null,2),"utf8")}async function writeDraft(hostDataDir,sessionId,content){await ensureDraftMetadata(hostDataDir,sessionId),await writeFile6(planDraftPath(hostDataDir,sessionId),content,"utf8"),await ensureDraftMetadata(hostDataDir,sessionId)}async function readDraftMetadata(hostDataDir,sessionId){try{let raw=await readFile6(draftMetaPath(hostDataDir,sessionId),"utf8"),parsed=JSON.parse(raw);if(typeof parsed.sessionId!=="string")return;if(parsed.mode!=="plan")return;if(typeof parsed.createdAt!=="number"||typeof parsed.updatedAt!=="number")return;return{sessionId:parsed.sessionId,mode:"plan",createdAt:parsed.createdAt,updatedAt:parsed.updatedAt}}catch{return}}async function readTextIfExists(filePath){try{return await readFile6(filePath,"utf8")}catch{return}}async function assertActiveToolContext(context,activationMetadataKey){let state=context.services?readStateEntry(await context.services.pluginState.get(context.sessionId)):{},metadataActive=context.metadata?.[activationMetadataKey]===!0;if(!(state.active??metadataActive))throw Error("Plan mode is not active for this session.")}var PLAN_READ_TOOL_NAME="plan_read",PLAN_WRITE_TOOL_NAME="plan_write",PLAN_MODE_SWITCH_TOOL_NAME="plan_mode",DEFAULT_VISIBLE_TOOL_NAMES,IMMUTABLY_BLOCKED_TOOL_NAMES,DEFAULT_ALLOWED_EXEC_PATTERNS,HARD_DENIED_COMMAND_PREFIXES,DefaultPlanModeSessionController=class{options;context;hostDataDir;constructor(options,context,hostDataDir){this.options=options,this.context=context,this.hostDataDir=hostDataDir}async getState(){return resolvePlanModeStatus(readStateEntry(await this.context.pluginState.get(this.context.sessionId)),this.context.metadata,this.context.isRunning(),this.options.activationMetadataKey,this.hostDataDir,this.context.sessionId)}async enable(){return this.updateState((state)=>{if(this.context.isRunning())return{...state,pendingActive:!0};return{...state,active:!0,pendingActive:void 0}})}async disable(){return this.updateState((state)=>{if(this.context.isRunning())return{...state,pendingActive:!1};return{...state,active:!1,pendingActive:void 0}})}async clearDraft(){return await rm3(draftDirectory(this.hostDataDir,this.context.sessionId),{recursive:!0,force:!0}),this.getState()}async updateState(mutate){let next=mutate(readStateEntry(await this.context.pluginState.get(this.context.sessionId)));if(await this.context.pluginState.replace(this.context.sessionId,createStateEntry(next)),!this.context.isRunning())await this.context.save();return resolvePlanModeStatus(next,this.context.metadata,this.context.isRunning(),this.options.activationMetadataKey,this.hostDataDir,this.context.sessionId)}},PlanReadTool,PlanWriteTool,PlanModeSwitchTool;var init_dist16=__esm(()=>{init_dist12();init_dist13();DEFAULT_VISIBLE_TOOL_NAMES=["read","grep","glob","exec"],IMMUTABLY_BLOCKED_TOOL_NAMES=new Set(["write","edit","patch"]),DEFAULT_ALLOWED_EXEC_PATTERNS=[{pattern:"pwd",action:"allow"},{pattern:"ls",action:"allow"},{pattern:"ls *",action:"allow"},{pattern:"find *",action:"allow"},{pattern:"cat *",action:"allow"},{pattern:"head *",action:"allow"},{pattern:"tail *",action:"allow"},{pattern:"wc *",action:"allow"},{pattern:"stat *",action:"allow"},{pattern:"file *",action:"allow"},{pattern:"sed -n *",action:"allow"},{pattern:"rg *",action:"allow"},{pattern:"grep *",action:"allow"},{pattern:"fd *",action:"allow"},{pattern:"git status",action:"allow"},{pattern:"git status *",action:"allow"},{pattern:"git diff",action:"allow"},{pattern:"git diff *",action:"allow"},{pattern:"git show *",action:"allow"},{pattern:"git log",action:"allow"},{pattern:"git log *",action:"allow"},{pattern:"git branch",action:"allow"},{pattern:"git branch *",action:"allow"},{pattern:"git rev-parse *",action:"allow"},{pattern:"git ls-files",action:"allow"},{pattern:"git ls-files *",action:"allow"},{pattern:"git grep *",action:"allow"},{pattern:"git blame *",action:"allow"},{pattern:"git shortlog",action:"allow"},{pattern:"git shortlog *",action:"allow"},{pattern:"git describe",action:"allow"},{pattern:"git describe *",action:"allow"},{pattern:"git cat-file *",action:"allow"},{pattern:"git ls-tree *",action:"allow"},{pattern:"git show-ref",action:"allow"},{pattern:"git show-ref *",action:"allow"},{pattern:"git ls-remote",action:"allow"},{pattern:"git ls-remote *",action:"allow"},{pattern:"git for-each-ref",action:"allow"},{pattern:"git for-each-ref *",action:"allow"},{pattern:"git rev-list *",action:"allow"},{pattern:"git merge-base *",action:"allow"},{pattern:"git diff-tree *",action:"allow"},{pattern:"git cherry",action:"allow"},{pattern:"git cherry *",action:"allow"},{pattern:"git name-rev *",action:"allow"},{pattern:"git check-ignore *",action:"allow"},{pattern:"git tag",action:"allow"},{pattern:"git tag -l",action:"allow"},{pattern:"git tag -l *",action:"allow"},{pattern:"git tag --list",action:"allow"},{pattern:"git tag --list *",action:"allow"},{pattern:"git remote",action:"allow"},{pattern:"git remote -v",action:"allow"},{pattern:"git remote show *",action:"allow"},{pattern:"git remote get-url *",action:"allow"},{pattern:"git reflog",action:"allow"},{pattern:"git reflog show *",action:"allow"},{pattern:"git stash list",action:"allow"},{pattern:"git stash list *",action:"allow"},{pattern:"git stash show *",action:"allow"},{pattern:"git config --get *",action:"allow"},{pattern:"git config --get-regexp *",action:"allow"},{pattern:"git config --list",action:"allow"},{pattern:"git config -l",action:"allow"},{pattern:"head",action:"allow"},{pattern:"tail",action:"allow"},{pattern:"wc",action:"allow"},{pattern:"cat",action:"allow"},{pattern:"sort",action:"allow"},{pattern:"sort *",action:"allow"},{pattern:"uniq",action:"allow"},{pattern:"uniq *",action:"allow"},{pattern:"cut *",action:"allow"},{pattern:"tr *",action:"allow"},{pattern:"awk *",action:"allow"},{pattern:"jq",action:"allow"},{pattern:"jq *",action:"allow"},{pattern:"yq",action:"allow"},{pattern:"yq *",action:"allow"},{pattern:"xargs grep *",action:"allow"},{pattern:"xargs rg *",action:"allow"},{pattern:"du *",action:"allow"},{pattern:"df",action:"allow"},{pattern:"df *",action:"allow"},{pattern:"tree",action:"allow"},{pattern:"tree *",action:"allow"},{pattern:"which *",action:"allow"},{pattern:"echo",action:"allow"},{pattern:"echo *",action:"allow"},{pattern:"realpath *",action:"allow"},{pattern:"basename *",action:"allow"},{pattern:"dirname *",action:"allow"}],HARD_DENIED_COMMAND_PREFIXES=["touch","mkdir","rm","mv","cp","ln","chmod","chown","git add","git commit","git push","git checkout","git switch","git restore","git apply","npm ","pnpm ","yarn ","bun "];PlanReadTool=class extends BaseTool{hostDataDir;activationMetadataKey;constructor(hostDataDir,activationMetadataKey){super({name:PLAN_READ_TOOL_NAME,description:"Read the current plan draft for this session.",inputSchema:{type:"object",properties:{}}});this.hostDataDir=hostDataDir,this.activationMetadataKey=activationMetadataKey}async execute(_args,context){await assertActiveToolContext(context,this.activationMetadataKey);let sessionId=context.sessionId,draftPath=planDraftPath(this.hostDataDir,sessionId),content=await readTextIfExists(draftPath);return createToolResult({content:[{type:"text",text:content??`No plan draft has been written yet.
|
|
198
198
|
Path: ${draftPath}`}],structuredContent:{path:draftPath,hasDraft:content!==null}})}},PlanWriteTool=class extends BaseTool{hostDataDir;activationMetadataKey;constructor(hostDataDir,activationMetadataKey){super({name:PLAN_WRITE_TOOL_NAME,description:"Write the current plan draft for this session.",inputSchema:{type:"object",properties:{content:{type:"string",description:"Markdown content to write into the plan draft."},mode:{type:"string",enum:["append","replace"],description:"Whether to append to or replace the current draft."}},required:["content"]}});this.hostDataDir=hostDataDir,this.activationMetadataKey=activationMetadataKey}async execute(args,context){await assertActiveToolContext(context,this.activationMetadataKey);let sessionId=context.sessionId;if(typeof args.content!=="string")throw Error("content must be a string");let mode=(args.mode??"append")==="replace"?"replace":"append",draftPath=planDraftPath(this.hostDataDir,sessionId),existing=mode==="append"?await readTextIfExists(draftPath)??"":"",next=mode==="append"?`${existing}${args.content}`:args.content;return await writeDraft(this.hostDataDir,sessionId,next),createToolResult({content:[{type:"text",text:`Updated plan draft at ${draftPath}`}],structuredContent:{path:draftPath,bytes:Buffer.byteLength(next,"utf8"),mode}})}},PlanModeSwitchTool=class extends BaseTool{constructor(_normalized){super({name:PLAN_MODE_SWITCH_TOOL_NAME,description:'Switch plan mode on or off. Use action "enter_plan" to start planning (no approval needed). Use action "exit_plan" when the plan is ready for implementation (requires human approval).',inputSchema:{type:"object",properties:{action:{type:"string",enum:["enter_plan","exit_plan"],description:"Enter plan mode to start planning, or exit plan mode to begin implementation."},reason:{type:"string",description:"Why you are switching modes."}},required:["action"],additionalProperties:!1}})}async execute(args,context){if(!context.services)throw Error("plan_mode requires plugin services");let action=args.action,state=readStateEntry(await context.services.pluginState.get(context.sessionId)),next=action==="enter_plan"?{...state,active:!0,pendingActive:void 0}:{...state,active:!1,pendingActive:void 0};return await context.services.pluginState.replace(context.sessionId,createStateEntry(next)),createToolResult({content:[{type:"text",text:action==="enter_plan"?"Plan mode activated. Implementation tools are now restricted.":"Plan mode deactivated. All tools are now available."}],structuredContent:{action,active:next.active,reason:args.reason}})}}});var require_identity=__commonJS((exports)=>{var ALIAS=Symbol.for("yaml.alias"),DOC=Symbol.for("yaml.document"),MAP=Symbol.for("yaml.map"),PAIR=Symbol.for("yaml.pair"),SCALAR=Symbol.for("yaml.scalar"),SEQ=Symbol.for("yaml.seq"),NODE_TYPE=Symbol.for("yaml.node.type"),isAlias=(node)=>!!node&&typeof node==="object"&&node[NODE_TYPE]===ALIAS,isDocument=(node)=>!!node&&typeof node==="object"&&node[NODE_TYPE]===DOC,isMap=(node)=>!!node&&typeof node==="object"&&node[NODE_TYPE]===MAP,isPair=(node)=>!!node&&typeof node==="object"&&node[NODE_TYPE]===PAIR,isScalar=(node)=>!!node&&typeof node==="object"&&node[NODE_TYPE]===SCALAR,isSeq=(node)=>!!node&&typeof node==="object"&&node[NODE_TYPE]===SEQ;function isCollection(node){if(node&&typeof node==="object")switch(node[NODE_TYPE]){case MAP:case SEQ:return!0}return!1}function isNode(node){if(node&&typeof node==="object")switch(node[NODE_TYPE]){case ALIAS:case MAP:case SCALAR:case SEQ:return!0}return!1}var hasAnchor=(node)=>(isScalar(node)||isCollection(node))&&!!node.anchor;exports.ALIAS=ALIAS;exports.DOC=DOC;exports.MAP=MAP;exports.NODE_TYPE=NODE_TYPE;exports.PAIR=PAIR;exports.SCALAR=SCALAR;exports.SEQ=SEQ;exports.hasAnchor=hasAnchor;exports.isAlias=isAlias;exports.isCollection=isCollection;exports.isDocument=isDocument;exports.isMap=isMap;exports.isNode=isNode;exports.isPair=isPair;exports.isScalar=isScalar;exports.isSeq=isSeq});var require_visit=__commonJS((exports)=>{var identity=require_identity(),BREAK=Symbol("break visit"),SKIP=Symbol("skip children"),REMOVE=Symbol("remove node");function visit2(node,visitor){let visitor_=initVisitor(visitor);if(identity.isDocument(node)){if(visit_(null,node.contents,visitor_,Object.freeze([node]))===REMOVE)node.contents=null}else visit_(null,node,visitor_,Object.freeze([]))}visit2.BREAK=BREAK;visit2.SKIP=SKIP;visit2.REMOVE=REMOVE;function visit_(key,node,visitor,path17){let ctrl=callVisitor(key,node,visitor,path17);if(identity.isNode(ctrl)||identity.isPair(ctrl))return replaceNode(key,path17,ctrl),visit_(key,ctrl,visitor,path17);if(typeof ctrl!=="symbol"){if(identity.isCollection(node)){path17=Object.freeze(path17.concat(node));for(let i=0;i<node.items.length;++i){let ci=visit_(i,node.items[i],visitor,path17);if(typeof ci==="number")i=ci-1;else if(ci===BREAK)return BREAK;else if(ci===REMOVE)node.items.splice(i,1),i-=1}}else if(identity.isPair(node)){path17=Object.freeze(path17.concat(node));let ck=visit_("key",node.key,visitor,path17);if(ck===BREAK)return BREAK;else if(ck===REMOVE)node.key=null;let cv=visit_("value",node.value,visitor,path17);if(cv===BREAK)return BREAK;else if(cv===REMOVE)node.value=null}}return ctrl}async function visitAsync(node,visitor){let visitor_=initVisitor(visitor);if(identity.isDocument(node)){if(await visitAsync_(null,node.contents,visitor_,Object.freeze([node]))===REMOVE)node.contents=null}else await visitAsync_(null,node,visitor_,Object.freeze([]))}visitAsync.BREAK=BREAK;visitAsync.SKIP=SKIP;visitAsync.REMOVE=REMOVE;async function visitAsync_(key,node,visitor,path17){let ctrl=await callVisitor(key,node,visitor,path17);if(identity.isNode(ctrl)||identity.isPair(ctrl))return replaceNode(key,path17,ctrl),visitAsync_(key,ctrl,visitor,path17);if(typeof ctrl!=="symbol"){if(identity.isCollection(node)){path17=Object.freeze(path17.concat(node));for(let i=0;i<node.items.length;++i){let ci=await visitAsync_(i,node.items[i],visitor,path17);if(typeof ci==="number")i=ci-1;else if(ci===BREAK)return BREAK;else if(ci===REMOVE)node.items.splice(i,1),i-=1}}else if(identity.isPair(node)){path17=Object.freeze(path17.concat(node));let ck=await visitAsync_("key",node.key,visitor,path17);if(ck===BREAK)return BREAK;else if(ck===REMOVE)node.key=null;let cv=await visitAsync_("value",node.value,visitor,path17);if(cv===BREAK)return BREAK;else if(cv===REMOVE)node.value=null}}return ctrl}function initVisitor(visitor){if(typeof visitor==="object"&&(visitor.Collection||visitor.Node||visitor.Value))return Object.assign({Alias:visitor.Node,Map:visitor.Node,Scalar:visitor.Node,Seq:visitor.Node},visitor.Value&&{Map:visitor.Value,Scalar:visitor.Value,Seq:visitor.Value},visitor.Collection&&{Map:visitor.Collection,Seq:visitor.Collection},visitor);return visitor}function callVisitor(key,node,visitor,path17){if(typeof visitor==="function")return visitor(key,node,path17);if(identity.isMap(node))return visitor.Map?.(key,node,path17);if(identity.isSeq(node))return visitor.Seq?.(key,node,path17);if(identity.isPair(node))return visitor.Pair?.(key,node,path17);if(identity.isScalar(node))return visitor.Scalar?.(key,node,path17);if(identity.isAlias(node))return visitor.Alias?.(key,node,path17);return}function replaceNode(key,path17,node){let parent=path17[path17.length-1];if(identity.isCollection(parent))parent.items[key]=node;else if(identity.isPair(parent))if(key==="key")parent.key=node;else parent.value=node;else if(identity.isDocument(parent))parent.contents=node;else{let pt=identity.isAlias(parent)?"alias":"scalar";throw Error(`Cannot replace node with ${pt} parent`)}}exports.visit=visit2;exports.visitAsync=visitAsync});var require_directives=__commonJS((exports)=>{var identity=require_identity(),visit2=require_visit(),escapeChars={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},escapeTagName=(tn)=>tn.replace(/[!,[\]{}]/g,(ch)=>escapeChars[ch]);class Directives{constructor(yaml,tags){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},Directives.defaultYaml,yaml),this.tags=Object.assign({},Directives.defaultTags,tags)}clone(){let copy=new Directives(this.yaml,this.tags);return copy.docStart=this.docStart,copy}atDocument(){let res=new Directives(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:Directives.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},Directives.defaultTags);break}return res}add(line,onError){if(this.atNextDocument)this.yaml={explicit:Directives.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},Directives.defaultTags),this.atNextDocument=!1;let parts=line.trim().split(/[ \t]+/),name15=parts.shift();switch(name15){case"%TAG":{if(parts.length!==2){if(onError(0,"%TAG directive should contain exactly two parts"),parts.length<2)return!1}let[handle,prefix]=parts;return this.tags[handle]=prefix,!0}case"%YAML":{if(this.yaml.explicit=!0,parts.length!==1)return onError(0,"%YAML directive should contain exactly one part"),!1;let[version2]=parts;if(version2==="1.1"||version2==="1.2")return this.yaml.version=version2,!0;else{let isValid2=/^\d+\.\d+$/.test(version2);return onError(6,`Unsupported YAML version ${version2}`,isValid2),!1}}default:return onError(0,`Unknown directive ${name15}`,!0),!1}}tagName(source,onError){if(source==="!")return"!";if(source[0]!=="!")return onError(`Not a valid tag: ${source}`),null;if(source[1]==="<"){let verbatim=source.slice(2,-1);if(verbatim==="!"||verbatim==="!!")return onError(`Verbatim tags aren't resolved, so ${source} is invalid.`),null;if(source[source.length-1]!==">")onError("Verbatim tags must end with a >");return verbatim}let[,handle,suffix]=source.match(/^(.*!)([^!]*)$/s);if(!suffix)onError(`The ${source} tag has no suffix`);let prefix=this.tags[handle];if(prefix)try{return prefix+decodeURIComponent(suffix)}catch(error48){return onError(String(error48)),null}if(handle==="!")return source;return onError(`Could not resolve tag: ${source}`),null}tagString(tag){for(let[handle,prefix]of Object.entries(this.tags))if(tag.startsWith(prefix))return handle+escapeTagName(tag.substring(prefix.length));return tag[0]==="!"?tag:`!<${tag}>`}toString(doc2){let lines=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],tagEntries=Object.entries(this.tags),tagNames;if(doc2&&tagEntries.length>0&&identity.isNode(doc2.contents)){let tags={};visit2.visit(doc2.contents,(_key,node)=>{if(identity.isNode(node)&&node.tag)tags[node.tag]=!0}),tagNames=Object.keys(tags)}else tagNames=[];for(let[handle,prefix]of tagEntries){if(handle==="!!"&&prefix==="tag:yaml.org,2002:")continue;if(!doc2||tagNames.some((tn)=>tn.startsWith(prefix)))lines.push(`%TAG ${handle} ${prefix}`)}return lines.join(`
|
|
199
199
|
`)}}Directives.defaultYaml={explicit:!1,version:"1.2"};Directives.defaultTags={"!!":"tag:yaml.org,2002:"};exports.Directives=Directives});var require_anchors=__commonJS((exports)=>{var identity=require_identity(),visit2=require_visit();function anchorIsValid(anchor){if(/[\x00-\x19\s,[\]{}]/.test(anchor)){let msg=`Anchor must not contain whitespace or control characters: ${JSON.stringify(anchor)}`;throw Error(msg)}return!0}function anchorNames(root){let anchors=new Set;return visit2.visit(root,{Value(_key,node){if(node.anchor)anchors.add(node.anchor)}}),anchors}function findNewAnchor(prefix,exclude){for(let i=1;;++i){let name15=`${prefix}${i}`;if(!exclude.has(name15))return name15}}function createNodeAnchors(doc2,prefix){let aliasObjects=[],sourceObjects=new Map,prevAnchors=null;return{onAnchor:(source)=>{aliasObjects.push(source),prevAnchors??(prevAnchors=anchorNames(doc2));let anchor=findNewAnchor(prefix,prevAnchors);return prevAnchors.add(anchor),anchor},setAnchors:()=>{for(let source of aliasObjects){let ref=sourceObjects.get(source);if(typeof ref==="object"&&ref.anchor&&(identity.isScalar(ref.node)||identity.isCollection(ref.node)))ref.node.anchor=ref.anchor;else{let error48=Error("Failed to resolve repeated object (this should not happen)");throw error48.source=source,error48}}},sourceObjects}}exports.anchorIsValid=anchorIsValid;exports.anchorNames=anchorNames;exports.createNodeAnchors=createNodeAnchors;exports.findNewAnchor=findNewAnchor});var require_applyReviver=__commonJS((exports)=>{function applyReviver(reviver,obj,key,val){if(val&&typeof val==="object")if(Array.isArray(val))for(let i=0,len=val.length;i<len;++i){let v0=val[i],v1=applyReviver(reviver,val,String(i),v0);if(v1===void 0)delete val[i];else if(v1!==v0)val[i]=v1}else if(val instanceof Map)for(let k of Array.from(val.keys())){let v0=val.get(k),v1=applyReviver(reviver,val,k,v0);if(v1===void 0)val.delete(k);else if(v1!==v0)val.set(k,v1)}else if(val instanceof Set)for(let v0 of Array.from(val)){let v1=applyReviver(reviver,val,v0,v0);if(v1===void 0)val.delete(v0);else if(v1!==v0)val.delete(v0),val.add(v1)}else for(let[k,v0]of Object.entries(val)){let v1=applyReviver(reviver,val,k,v0);if(v1===void 0)delete val[k];else if(v1!==v0)val[k]=v1}return reviver.call(obj,key,val)}exports.applyReviver=applyReviver});var require_toJS=__commonJS((exports)=>{var identity=require_identity();function toJS(value,arg,ctx){if(Array.isArray(value))return value.map((v,i)=>toJS(v,String(i),ctx));if(value&&typeof value.toJSON==="function"){if(!ctx||!identity.hasAnchor(value))return value.toJSON(arg,ctx);let data={aliasCount:0,count:1,res:void 0};ctx.anchors.set(value,data),ctx.onCreate=(res2)=>{data.res=res2,delete ctx.onCreate};let res=value.toJSON(arg,ctx);if(ctx.onCreate)ctx.onCreate(res);return res}if(typeof value==="bigint"&&!ctx?.keep)return Number(value);return value}exports.toJS=toJS});var require_Node=__commonJS((exports)=>{var applyReviver=require_applyReviver(),identity=require_identity(),toJS=require_toJS();class NodeBase{constructor(type){Object.defineProperty(this,identity.NODE_TYPE,{value:type})}clone(){let copy=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));if(this.range)copy.range=this.range.slice();return copy}toJS(doc2,{mapAsMap,maxAliasCount,onAnchor,reviver}={}){if(!identity.isDocument(doc2))throw TypeError("A document argument is required");let ctx={anchors:new Map,doc:doc2,keep:!0,mapAsMap:mapAsMap===!0,mapKeyWarned:!1,maxAliasCount:typeof maxAliasCount==="number"?maxAliasCount:100},res=toJS.toJS(this,"",ctx);if(typeof onAnchor==="function")for(let{count,res:res2}of ctx.anchors.values())onAnchor(res2,count);return typeof reviver==="function"?applyReviver.applyReviver(reviver,{"":res},"",res):res}}exports.NodeBase=NodeBase});var require_Alias=__commonJS((exports)=>{var anchors=require_anchors(),visit2=require_visit(),identity=require_identity(),Node2=require_Node(),toJS=require_toJS();class Alias extends Node2.NodeBase{constructor(source){super(identity.ALIAS);this.source=source,Object.defineProperty(this,"tag",{set(){throw Error("Alias nodes cannot have tags")}})}resolve(doc2,ctx){let nodes;if(ctx?.aliasResolveCache)nodes=ctx.aliasResolveCache;else if(nodes=[],visit2.visit(doc2,{Node:(_key,node)=>{if(identity.isAlias(node)||identity.hasAnchor(node))nodes.push(node)}}),ctx)ctx.aliasResolveCache=nodes;let found=void 0;for(let node of nodes){if(node===this)break;if(node.anchor===this.source)found=node}return found}toJSON(_arg,ctx){if(!ctx)return{source:this.source};let{anchors:anchors2,doc:doc2,maxAliasCount}=ctx,source=this.resolve(doc2,ctx);if(!source){let msg=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw ReferenceError(msg)}let data=anchors2.get(source);if(!data)toJS.toJS(source,null,ctx),data=anchors2.get(source);if(data?.res===void 0)throw ReferenceError("This should not happen: Alias anchor was not resolved?");if(maxAliasCount>=0){if(data.count+=1,data.aliasCount===0)data.aliasCount=getAliasCount(doc2,source,anchors2);if(data.count*data.aliasCount>maxAliasCount)throw ReferenceError("Excessive alias count indicates a resource exhaustion attack")}return data.res}toString(ctx,_onComment,_onChompKeep){let src=`*${this.source}`;if(ctx){if(anchors.anchorIsValid(this.source),ctx.options.verifyAliasOrder&&!ctx.anchors.has(this.source)){let msg=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw Error(msg)}if(ctx.implicitKey)return`${src} `}return src}}function getAliasCount(doc2,node,anchors2){if(identity.isAlias(node)){let source=node.resolve(doc2),anchor=anchors2&&source&&anchors2.get(source);return anchor?anchor.count*anchor.aliasCount:0}else if(identity.isCollection(node)){let count=0;for(let item of node.items){let c=getAliasCount(doc2,item,anchors2);if(c>count)count=c}return count}else if(identity.isPair(node)){let kc=getAliasCount(doc2,node.key,anchors2),vc=getAliasCount(doc2,node.value,anchors2);return Math.max(kc,vc)}return 1}exports.Alias=Alias});var require_Scalar=__commonJS((exports)=>{var identity=require_identity(),Node2=require_Node(),toJS=require_toJS(),isScalarValue=(value)=>!value||typeof value!=="function"&&typeof value!=="object";class Scalar extends Node2.NodeBase{constructor(value){super(identity.SCALAR);this.value=value}toJSON(arg,ctx){return ctx?.keep?this.value:toJS.toJS(this.value,arg,ctx)}toString(){return String(this.value)}}Scalar.BLOCK_FOLDED="BLOCK_FOLDED";Scalar.BLOCK_LITERAL="BLOCK_LITERAL";Scalar.PLAIN="PLAIN";Scalar.QUOTE_DOUBLE="QUOTE_DOUBLE";Scalar.QUOTE_SINGLE="QUOTE_SINGLE";exports.Scalar=Scalar;exports.isScalarValue=isScalarValue});var require_createNode=__commonJS((exports)=>{var Alias=require_Alias(),identity=require_identity(),Scalar=require_Scalar(),defaultTagPrefix="tag:yaml.org,2002:";function findTagObject(value,tagName,tags){if(tagName){let match=tags.filter((t)=>t.tag===tagName),tagObj=match.find((t)=>!t.format)??match[0];if(!tagObj)throw Error(`Tag ${tagName} not found`);return tagObj}return tags.find((t)=>t.identify?.(value)&&!t.format)}function createNode(value,tagName,ctx){if(identity.isDocument(value))value=value.contents;if(identity.isNode(value))return value;if(identity.isPair(value)){let map2=ctx.schema[identity.MAP].createNode?.(ctx.schema,null,ctx);return map2.items.push(value),map2}if(value instanceof String||value instanceof Number||value instanceof Boolean||typeof BigInt<"u"&&value instanceof BigInt)value=value.valueOf();let{aliasDuplicateObjects,onAnchor,onTagObj,schema:schema2,sourceObjects}=ctx,ref=void 0;if(aliasDuplicateObjects&&value&&typeof value==="object")if(ref=sourceObjects.get(value),ref)return ref.anchor??(ref.anchor=onAnchor(value)),new Alias.Alias(ref.anchor);else ref={anchor:null,node:null},sourceObjects.set(value,ref);if(tagName?.startsWith("!!"))tagName=defaultTagPrefix+tagName.slice(2);let tagObj=findTagObject(value,tagName,schema2.tags);if(!tagObj){if(value&&typeof value.toJSON==="function")value=value.toJSON();if(!value||typeof value!=="object"){let node2=new Scalar.Scalar(value);if(ref)ref.node=node2;return node2}tagObj=value instanceof Map?schema2[identity.MAP]:(Symbol.iterator in Object(value))?schema2[identity.SEQ]:schema2[identity.MAP]}if(onTagObj)onTagObj(tagObj),delete ctx.onTagObj;let node=tagObj?.createNode?tagObj.createNode(ctx.schema,value,ctx):typeof tagObj?.nodeClass?.from==="function"?tagObj.nodeClass.from(ctx.schema,value,ctx):new Scalar.Scalar(value);if(tagName)node.tag=tagName;else if(!tagObj.default)node.tag=tagObj.tag;if(ref)ref.node=node;return node}exports.createNode=createNode});var require_Collection=__commonJS((exports)=>{var createNode=require_createNode(),identity=require_identity(),Node2=require_Node();function collectionFromPath(schema2,path17,value){let v=value;for(let i=path17.length-1;i>=0;--i){let k=path17[i];if(typeof k==="number"&&Number.isInteger(k)&&k>=0){let a=[];a[k]=v,v=a}else v=new Map([[k,v]])}return createNode.createNode(v,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw Error("This should not happen, please report a bug.")},schema:schema2,sourceObjects:new Map})}var isEmptyPath=(path17)=>path17==null||typeof path17==="object"&&!!path17[Symbol.iterator]().next().done;class Collection extends Node2.NodeBase{constructor(type,schema2){super(type);Object.defineProperty(this,"schema",{value:schema2,configurable:!0,enumerable:!1,writable:!0})}clone(schema2){let copy=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));if(schema2)copy.schema=schema2;if(copy.items=copy.items.map((it)=>identity.isNode(it)||identity.isPair(it)?it.clone(schema2):it),this.range)copy.range=this.range.slice();return copy}addIn(path17,value){if(isEmptyPath(path17))this.add(value);else{let[key,...rest]=path17,node=this.get(key,!0);if(identity.isCollection(node))node.addIn(rest,value);else if(node===void 0&&this.schema)this.set(key,collectionFromPath(this.schema,rest,value));else throw Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`)}}deleteIn(path17){let[key,...rest]=path17;if(rest.length===0)return this.delete(key);let node=this.get(key,!0);if(identity.isCollection(node))return node.deleteIn(rest);else throw Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`)}getIn(path17,keepScalar){let[key,...rest]=path17,node=this.get(key,!0);if(rest.length===0)return!keepScalar&&identity.isScalar(node)?node.value:node;else return identity.isCollection(node)?node.getIn(rest,keepScalar):void 0}hasAllNullValues(allowScalar){return this.items.every((node)=>{if(!identity.isPair(node))return!1;let n=node.value;return n==null||allowScalar&&identity.isScalar(n)&&n.value==null&&!n.commentBefore&&!n.comment&&!n.tag})}hasIn(path17){let[key,...rest]=path17;if(rest.length===0)return this.has(key);let node=this.get(key,!0);return identity.isCollection(node)?node.hasIn(rest):!1}setIn(path17,value){let[key,...rest]=path17;if(rest.length===0)this.set(key,value);else{let node=this.get(key,!0);if(identity.isCollection(node))node.setIn(rest,value);else if(node===void 0&&this.schema)this.set(key,collectionFromPath(this.schema,rest,value));else throw Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`)}}}exports.Collection=Collection;exports.collectionFromPath=collectionFromPath;exports.isEmptyPath=isEmptyPath});var require_stringifyComment=__commonJS((exports)=>{var stringifyComment=(str)=>str.replace(/^(?!$)(?: $)?/gm,"#");function indentComment(comment,indent){if(/^\n+$/.test(comment))return comment.substring(1);return indent?comment.replace(/^(?! *$)/gm,indent):comment}var lineComment=(str,indent,comment)=>str.endsWith(`
|
|
200
200
|
`)?indentComment(comment,indent):comment.includes(`
|
|
@@ -902,16 +902,16 @@ ${summaryText}`,baseBlocks=stripSummaryFromContent(existingContent,marker16);if(
|
|
|
902
902
|
|
|
903
903
|
`).trim();return messagesCopy[systemIndex]={...systemMessage,content:baseText?`${baseText}
|
|
904
904
|
|
|
905
|
-
${summaryBlockText}`:summaryBlockText},messagesCopy}return messagesCopy[systemIndex]={...systemMessage,content:[...baseBlocks,{type:"text",text:summaryBlockText}]},messagesCopy}import{existsSync,mkdirSync,rmSync}from"node:fs";import{mkdir as mkdir5,readdir as readdir3,readFile as readFile4,rm as rm2,writeFile as writeFile4}from"node:fs/promises";import path8 from"node:path";var StateKeys={RUNTIME_STATE:"runtime-state",COMPRESSION:"compression",COMPRESSION_VIEW:"compression-view",SESSION:"session",COMPRESSION_SNAPSHOT:"compression-snapshot"};class StateStore{opts;deleteOnComplete;constructor(options){this.opts=options,this.deleteOnComplete=options?.deleteOnComplete??!0}assertValidStorageSegment(label,value){if(!value)throw Error(`${label} must be a non-empty string`);if(value==="."||value==="..")throw Error(`${label} must not be "." or ".."`);if(value.includes("/")||value.includes("\\"))throw Error(`${label} must not contain path separators`);if(value.includes("\x00"))throw Error(`${label} must not contain NUL bytes`)}buildPath(sessionId,key){return this.assertValidStorageSegment("sessionId",sessionId),this.assertValidStorageSegment("key",key),`${sessionId}/${key}`}buildPrefix(sessionId){return this.assertValidStorageSegment("sessionId",sessionId),`${sessionId}/`}extractKey(sessionId,storagePath){let prefix=`${sessionId}/`;return storagePath.startsWith(prefix)?storagePath.slice(prefix.length):storagePath}extractSessionId(storagePath){let parts=storagePath.split("/");return parts.length>0?parts[0]:void 0}async save(sessionId,key,data){let storagePath=this.buildPath(sessionId,key);await this._write(storagePath,JSON.stringify(data,null,2))}async load(sessionId,key){let storagePath=this.buildPath(sessionId,key),content=await this._read(storagePath);if(content===void 0)return;try{return JSON.parse(content)}catch{return}}async delete(sessionId,key){await this._delete(this.buildPath(sessionId,key))}async deleteSession(sessionId){let prefix=this.buildPrefix(sessionId),paths=await this._list(prefix);await Promise.all(paths.map((path8)=>this._delete(path8)))}async listSessions(){let allPaths=await this._list(""),sessionIds=new Set;for(let storagePath of allPaths){let sessionId=this.extractSessionId(storagePath);if(sessionId)sessionIds.add(sessionId)}return Array.from(sessionIds)}async saveRuntimeState(runtimeState){let messageCount=runtimeState.kind==="idle"?runtimeState.messages.length:Array.isArray(runtimeState.checkpoint?.messages)?runtimeState.checkpoint.messages.length:0,wrapped={_meta:{description:"DimCode Runtime State - DO NOT EDIT MANUALLY",savedAt:new Date(runtimeState.savedAt).toISOString(),sessionId:runtimeState.sessionId,kind:runtimeState.kind,messageCount},runtimeState};await this.save(runtimeState.sessionId,StateKeys.RUNTIME_STATE,wrapped)}async loadRuntimeState(sessionId){return(await this.load(sessionId,StateKeys.RUNTIME_STATE))?.runtimeState}async deleteRuntimeState(sessionId){await this.delete(sessionId,StateKeys.RUNTIME_STATE)}}class FileStateStore2 extends StateStore{baseDir;writeQueues=new Map;pendingWrites=new Map;constructor(options){super(options);this.baseDir=path8.resolve(options.dir),this.ensureDir(this.baseDir)}async _write(storagePath,data){let filePath=this.toFilePath(storagePath);this.pendingWrites.set(filePath,data);let existingWrite=this.writeQueues.get(filePath);if(existingWrite){await existingWrite;return}let writePromise=(async()=>{while(this.pendingWrites.has(filePath)){let currentData=this.pendingWrites.get(filePath)??"";this.pendingWrites.delete(filePath),await this.ensureDirAsync(path8.dirname(filePath)),await writeFile4(filePath,currentData,"utf-8")}})();this.writeQueues.set(filePath,writePromise);try{await writePromise}finally{if(this.writeQueues.get(filePath)===writePromise)this.writeQueues.delete(filePath)}}async _read(storagePath){let filePath=this.toFilePath(storagePath);try{return await readFile4(filePath,"utf-8")}catch{return}}async _delete(storagePath){let filePath=this.toFilePath(storagePath);await rm2(filePath,{force:!0});let sessionDir=path8.dirname(filePath);if(!existsSync(sessionDir))return;try{if((await readdir3(sessionDir)).length===0)await rm2(sessionDir,{recursive:!0,force:!0})}catch{}}async deleteSession(sessionId){await super.deleteSession(sessionId),await this.deleteCacheRoot(sessionId,"blob-cache")}async _exists(storagePath){return existsSync(this.toFilePath(storagePath))}async _list(prefix){let results=[];if(!existsSync(this.baseDir))return results;let sessionDirs=(await readdir3(this.baseDir,{withFileTypes:!0})).filter((entry)=>entry.isDirectory()).map((entry)=>entry.name);for(let sessionId of sessionDirs){if(prefix&&!sessionId.startsWith(prefix.split("/")[0]??""))continue;let sessionDir=path8.join(this.baseDir,sessionId),files=await this.listJsonFiles(sessionDir);for(let file2 of files){let key=path8.basename(file2,".json"),storagePath=`${sessionId}/${key}`;if(!prefix||storagePath.startsWith(prefix))results.push(storagePath)}}return results}getBaseDir(){return this.baseDir}clear(){if(!existsSync(this.baseDir))return;rmSync(this.baseDir,{recursive:!0}),mkdirSync(this.baseDir,{recursive:!0})}toFilePath(storagePath){return path8.join(this.baseDir,`${storagePath}.json`)}ensureDir(dir){if(!existsSync(dir))mkdirSync(dir,{recursive:!0})}async ensureDirAsync(dir){if(existsSync(dir))return;await mkdir5(dir,{recursive:!0})}async listJsonFiles(dir){if(!existsSync(dir))return[];return(await readdir3(dir)).filter((file2)=>file2.endsWith(".json")).map((file2)=>path8.join(dir,file2))}async deleteCacheRoot(sessionId,rootDirName){this.assertValidStorageSegment("sessionId",sessionId);let cacheDir=path8.join(this.baseDir,rootDirName,sessionId);await rm2(cacheDir,{recursive:!0,force:!0});let rootDir=path8.join(this.baseDir,rootDirName);if(!existsSync(rootDir))return;try{if((await readdir3(rootDir)).length===0)await rm2(rootDir,{recursive:!0,force:!0})}catch{}}}class InMemoryStateStore2 extends StateStore{store=new Map;constructor(options){super(options)}async _write(path9,data){this.store.set(path9,data)}async _read(path9){return this.store.get(path9)}async _delete(path9){this.store.delete(path9)}async _exists(path9){return this.store.has(path9)}async _list(prefix){let paths=[];for(let key of this.store.keys())if(!prefix||key.startsWith(prefix))paths.push(key);return paths}clear(){this.store.clear()}}import path10 from"node:path";init_dist13();import path9 from"node:path";var SAFE_EXEC_ARG_PATTERN=/^[\w./:@%+=,-]+$/;function normalizeQuotedShellPath(value){let trimmed=value.trim();if(!trimmed)return null;let quote=trimmed[0];if((quote==='"'||quote==="'")&&trimmed.endsWith(quote)&&trimmed.length>=2)return trimmed.slice(1,-1);if(/[`"'\s]/.test(trimmed))return null;return trimmed}function quoteExecArg(part){if(!part)return"''";if(SAFE_EXEC_ARG_PATTERN.test(part))return part;return`'${part.replace(/'/g,"'\\''")}'`}function readExecProcessId(value){if(typeof value!=="number"||!Number.isInteger(value)||value<=0)return null;return value}function resolveExecAction(args){let action=args.action;if(action==="start"||action==="poll"||action==="terminate")return action;let hasCommand=Object.hasOwn(args,"command"),hasProcessId=Object.hasOwn(args,"processId");if(hasCommand&&!hasProcessId)return"start";if(hasProcessId&&!hasCommand)return"poll";return null}function formatExecCommandPreview(command){if(typeof command==="string")return command.trim();if(!Array.isArray(command)||command.some((part)=>typeof part!=="string"))return"";return command.map((part)=>quoteExecArg(String(part))).join(" ").trim()}function formatExecInvocationPreview(args){let action=resolveExecAction(args),command=formatExecCommandPreview(args.command),processId=readExecProcessId(args.processId);if(command)return command;if(action==="terminate"&&processId!==null)return`Terminate process ${processId}`;if(action==="poll"&&processId!==null)return`Poll process ${processId}`;if(action==="start")return"Start process";return""}function resolveExecListCommandTarget(command,cwd){if(typeof command==="string"){let trimmed=command.trim();if(!trimmed)return null;if(trimmed==="ls")return cwd;if(!trimmed.startsWith("ls "))return null;let rest=trimmed.slice(2).trim();if(!rest||rest.startsWith("-"))return null;if(/[;&|]/.test(rest)||rest.includes("$("))return null;let normalizedPath=normalizeQuotedShellPath(rest);if(!normalizedPath)return null;return path9.isAbsolute(normalizedPath)?path9.resolve(normalizedPath):path9.resolve(cwd,normalizedPath)}if(!Array.isArray(command)||command.some((part)=>typeof part!=="string"))return null;let argv=command.map((part)=>String(part).trim()).filter(Boolean);if(!argv.length||argv[0]!=="ls")return null;if(argv.length===1)return cwd;let nonOptionArgs=argv.slice(1).filter((part)=>!part.startsWith("-"));if(nonOptionArgs.length!==1)return null;let target=nonOptionArgs[0];if(!target||target.includes("$(")||/[;&|]/.test(target))return null;return path9.isAbsolute(target)?path9.resolve(target):path9.resolve(cwd,target)}var TOOL_APPROVAL_PLUGIN_ID="acp-tool-approvals";function normalizeRuntimeToolName(toolName){return toolName.trim()}function inferToolKind(toolName){let normalized=normalizeRuntimeToolName(toolName).toLowerCase();if(normalized==="read")return"read";if(normalized==="write"||normalized==="edit")return"edit";if(normalized==="grep"||normalized==="glob")return"search";if(normalized==="exec")return"execute";return"other"}function readApprovalArgs(value){if(!value||typeof value!=="object"||Array.isArray(value))return{};return value}function resolvePrimaryToolPath(rawInput,cwd){let args=readApprovalArgs(rawInput),rawPath=[args.file_path,args.filePath,args.path,args.targetPath,args.sourcePath,args.destinationPath].map((value)=>String(value??"").trim()).find(Boolean);if(!rawPath)return;return path10.isAbsolute(rawPath)?path10.resolve(rawPath):path10.resolve(cwd,rawPath)}function buildToolCallTitle(toolName,rawInput,cwd){let normalizedName=normalizeRuntimeToolName(toolName).toLowerCase(),args=readApprovalArgs(rawInput),commandPreview=formatExecInvocationPreview(args),listTarget=normalizedName==="exec"?resolveExecListCommandTarget(args.command,cwd):void 0;if(listTarget)return`List ${listTarget}`;if(normalizedName==="exec"&&commandPreview)return commandPreview;let primaryPath=resolvePrimaryToolPath(rawInput,cwd);if(normalizedName==="read"&&primaryPath)return`Read ${primaryPath}`;if(normalizedName==="write"&&primaryPath)return`Write ${primaryPath}`;if(normalizedName==="edit"&&primaryPath)return`Edit ${primaryPath}`;return toolName}function buildToolCallRawInput(toolName,rawInput){let normalizedName=normalizeRuntimeToolName(toolName).toLowerCase(),args=readApprovalArgs(rawInput);if(normalizedName!=="exec")return args;if(Object.keys(args).length===0)return args;let commandPreview=formatExecInvocationPreview(args);if(!commandPreview)return args;let normalizedArgs={...args,command:commandPreview};if(Array.isArray(args.command))normalizedArgs.commandArgv=[...args.command];return normalizedArgs}function resolveToolLocations(toolCall,cwd){let args=readApprovalArgs(toolCall.function?.arguments),rawPaths=[args.filePath,args.path,args.targetPath,args.sourcePath,args.destinationPath].map((value)=>String(value??"").trim()).filter(Boolean);if(!rawPaths.length)return;return rawPaths.map((filePath)=>{return{path:path10.isAbsolute(filePath)?filePath:path10.resolve(cwd,filePath)}})}function serializeToolCallForApproval(toolCall,cwd){let toolName=String(toolCall.function?.name??"").trim(),rawInput=structuredClone(toolCall.function?.arguments??{}),locations=resolveToolLocations(toolCall,cwd),serializedToolCall={toolCallId:String(toolCall.id??"").trim(),title:buildToolCallTitle(toolName,rawInput,cwd),kind:inferToolKind(toolName),status:"pending",rawInput:buildToolCallRawInput(toolName,rawInput),cwd};if(locations?.length)serializedToolCall.locations=locations;return serializedToolCall}function buildApprovalRequestMetadata(toolCall,cwd){return toMetadataMap({acpToolCall:serializeToolCallForApproval(toolCall,cwd??process.cwd())})}function createAcpToolApprovalPlugin(){return{manifest:{id:TOOL_APPROVAL_PLUGIN_ID,version:"1.0.0",apiVersion:1,permissions:{}},setup(){return{hooks:[{descriptor:{name:"tool.beforeExecute"},middleware:[({payload,context})=>{let toolName=String(payload?.toolCall?.function?.name??"").trim();if(toolName==="AskUserQuestion"||toolName==="delegate_tasks")return;return askToolCall({message:`Approval required to execute tool: ${toolName}`,metadata:buildApprovalRequestMetadata(payload.toolCall,context.cwd)})}]}]}}}}import{randomInt as randomInt3}from"node:crypto";import path13 from"node:path";import process4 from"node:process";import{spawn as spawn2}from"node:child_process";import{randomInt as randomInt2,randomUUID as randomUUID2}from"node:crypto";import fs2 from"node:fs";import os4 from"node:os";import path11 from"node:path";var DEFAULT_YIELD_TIME_MS2=1000,MAX_YIELD_TIME_MS2=1e4,MAX_ACTIVE_PROCESSES_PER_SESSION2=10,TERMINATE_GRACE_TIMEOUT_MS2=250,OUTPUT_SETTLE_TIME_MS2=25,MAX_EXEC_OUTPUT_FILE_BYTES2=67108864;class ManagedExecProcessManagerError extends Error{code;constructor(code,message){super(message);this.name="ManagedExecProcessManagerError",this.code=code}}class ManagedExecProcessManager{sessions=new Map;notifications=new Map;disposingSessions=new Set;disposePromises=new Map;async execute(request){switch(request.action){case"start":return await this.start(request);case"poll":return await this.poll(request);case"terminate":return await this.terminate(request)}}async disposeSession(sessionId){let existing=this.disposePromises.get(sessionId);if(existing){await existing;return}let disposePromise=(async()=>{this.disposingSessions.add(sessionId);try{let entries=this.sessions.get(sessionId);if(!entries||entries.size===0){this.sessions.delete(sessionId),this.notifications.delete(sessionId);return}await Promise.allSettled([...entries.values()].map(async(entry)=>{if(clearTimeout(entry.timeoutHandle),entry.suppressNotifications=!0,readChildExitCode2(entry.child.exitCode??void 0)!==void 0||entry.child.killed)return;entry.terminationReason="dispose",requestTerminate2(entry),await waitForExit2(entry,Date.now()+1000)})),this.sessions.delete(sessionId)}finally{this.notifications.delete(sessionId),this.disposingSessions.delete(sessionId),this.disposePromises.delete(sessionId)}})();this.disposePromises.set(sessionId,disposePromise),await disposePromise}drainNotifications(sessionId){let notifications=this.notifications.get(sessionId)??[];return this.notifications.delete(sessionId),notifications}queueNotification(sessionId,notification){let queue=this.notifications.get(sessionId)??[];queue.push(notification),this.notifications.set(sessionId,queue)}async start(request){this.assertSessionNotDisposing(request.sessionId);let command=assertCommand2(request.command),cwd=request.cwd??process.cwd(),timeoutMs=normalizeTimeoutMs2(request.timeoutMs),yieldTimeMs=normalizeYieldTimeMs2(request.yieldTimeMs),entries=this.getSessionEntries(request.sessionId);if(countActiveEntries2(entries)>=MAX_ACTIVE_PROCESSES_PER_SESSION2)throw new ManagedExecProcessManagerError("exec_process_limit_exceeded",`Session ${request.sessionId} already has ${MAX_ACTIVE_PROCESSES_PER_SESSION2} active exec processes.`);let processId=allocateProcessId2(entries),outputRecord=createManagedExecOutputStoreRecord({sessionId:request.sessionId,processId,rootDir:request.outputRoot}),startedAt=Date.now(),child=spawn2(command[0],command.slice(1),{cwd,env:process.env,shell:!1,stdio:["ignore","pipe","pipe"]}),entry={id:processId,sessionId:request.sessionId,command:[...command],cwd,child,startedAt,timeoutMs,timedOut:!1,readOffset:0,waiters:new Set,notifyOnTerminal:!1,suppressNotifications:!1,...outputRecord};if(entries.set(processId,entry),attachChildListeners2(entry),timeoutMs!==void 0)entry.timeoutHandle=setTimeout(()=>{entry.timedOut=!0,entry.terminationReason="timeout",requestTerminate2(entry)},timeoutMs);if(request.runInBackground===!0)return this.markForNotification(entry),createProcessResult2(entry,"",Date.now()-startedAt);let startedResult=await this.collect(entry,yieldTimeMs,request.signal);if(startedResult.status!=="running")this.deleteEntry(entry);else this.markForNotification(entry);return startedResult}async poll(request){this.assertSessionNotDisposing(request.sessionId);let processId=assertProcessId2(request.processId),yieldTimeMs=normalizeYieldTimeMs2(request.yieldTimeMs),entry=this.requireEntry(request.sessionId,processId),result=await this.collect(entry,yieldTimeMs,request.signal);if(result.status!=="running")this.deleteEntry(entry);else this.markForNotification(entry);return result}async terminate(request){this.assertSessionNotDisposing(request.sessionId);let processId=assertProcessId2(request.processId),yieldTimeMs=normalizeYieldTimeMs2(request.yieldTimeMs),entry=this.requireEntry(request.sessionId,processId);if(!entry.terminal)entry.terminationReason="user",requestTerminate2(entry);let result=await this.collect(entry,yieldTimeMs,request.signal);if(result.status!=="running")this.deleteEntry(entry);return result}requireEntry(sessionId,processId){let entry=this.sessions.get(sessionId)?.get(processId);if(entry)return entry;throw new ManagedExecProcessManagerError("exec_process_not_found",`Exec process ${processId} was not found for session ${sessionId}.`)}getSessionEntries(sessionId){let existing=this.sessions.get(sessionId);if(existing)return existing;let created=new Map;return this.sessions.set(sessionId,created),created}async collect(entry,yieldTimeMs,signal){let startedAt=Date.now(),deadline=startedAt+yieldTimeMs,observedOutputBytes=entry.outputBytes,observedOutputTruncated=entry.outputTruncated,quietDeadline;while(!entry.terminal&&Date.now()<deadline){if(entry.outputBytes!==observedOutputBytes||entry.outputTruncated!==observedOutputTruncated)observedOutputBytes=entry.outputBytes,observedOutputTruncated=entry.outputTruncated,quietDeadline=Math.min(deadline,Date.now()+OUTPUT_SETTLE_TIME_MS2);if(quietDeadline!==void 0&&Date.now()>=quietDeadline)break;await waitForChange2(entry,quietDeadline??deadline,signal)}let output=readManagedExecOutputSince(entry,entry.readOffset);return entry.readOffset=output.nextOffset,createProcessResult2(entry,output.text,Date.now()-startedAt)}deleteEntry(entry){clearTimeout(entry.timeoutHandle),clearTimeout(entry.terminateHandle);let entries=this.sessions.get(entry.sessionId);if(!entries)return;if(entries.delete(entry.id),entries.size===0&&!this.disposingSessions.has(entry.sessionId))this.sessions.delete(entry.sessionId)}assertSessionNotDisposing(sessionId){if(!this.disposingSessions.has(sessionId))return;throw new ManagedExecProcessManagerError("exec_session_disposing",`Session ${sessionId} is disposing exec processes and cannot start, poll, or terminate commands right now.`)}markForNotification(entry){entry.notifyOnTerminal=!0,this.enqueueTerminalNotification(entry)}enqueueTerminalNotification(entry){if(!entry.notifyOnTerminal)return;if(entry.suppressNotifications)return;if(!entry.terminal)return;if(entry.notifiedAt!==void 0)return;entry.notifiedAt=Date.now(),this.queueNotification(entry.sessionId,createTaskNotification2(entry))}completeTerminalEntry(entry){this.enqueueTerminalNotification(entry),this.deleteEntry(entry)}}var managedExecProcessManager=new ManagedExecProcessManager;function attachChildListeners2(entry){entry.child.stdout.setEncoding("utf8"),entry.child.stderr.setEncoding("utf8"),entry.child.stdout.on("data",(chunk)=>{appendManagedExecOutput(entry,String(chunk)),notifyWaiters2(entry)}),entry.child.stderr.on("data",(chunk)=>{appendManagedExecOutput(entry,String(chunk)),notifyWaiters2(entry)}),entry.child.on("error",(error48)=>{if(appendManagedExecOutput(entry,`${entry.outputBytes>0?`
|
|
906
|
-
`:""}${error48.message}`),!entry.terminal)entry.terminal=createTerminalState2({status:entry.timedOut?"terminated":"exited"});managedExecProcessManager.completeTerminalEntry(entry),notifyWaiters2(entry)}),entry.child.on("close",(code,signal)=>{if(!entry.terminal)entry.terminal=createTerminalState2({exitCode:readChildExitCode2(code??void 0),signal:readChildSignal2(signal??void 0),status:signal?"terminated":"exited"});else if(entry.terminal.signal===void 0&&signal)entry.terminal={...entry.terminal,signal,status:"terminated"};clearTimeout(entry.timeoutHandle),clearTimeout(entry.terminateHandle),managedExecProcessManager.completeTerminalEntry(entry),notifyWaiters2(entry)})}function createTaskNotification2(entry){let status=createTaskNotificationStatus2(entry),exitCode=entry.terminal?.exitCode,signal=entry.terminal?.signal,summary=createTaskNotificationSummary2(entry,status),notification={taskId:entry.id,status,outputPath:entry.outputPath,summary};if(exitCode!==void 0)notification.exitCode=exitCode;if(signal!==void 0)notification.signal=signal;return notification}function createTaskNotificationStatus2(entry){if(entry.timedOut)return"timed_out";if(entry.terminationReason==="user"||entry.terminationReason==="dispose")return"killed";if(entry.terminal?.status==="terminated")return"killed";return(entry.terminal?.exitCode??0)===0?"completed":"failed"}function createExecTaskNotificationSummary(input){let command=input.command.join(" ");if(input.status==="completed")return`Exec task ${input.taskId} completed: ${command}`;if(input.status==="failed")return`Exec task ${input.taskId} failed with exit code ${input.exitCode??-1}: ${command}`;if(input.status==="timed_out")return`Exec task ${input.taskId} timed out${input.timeoutMs?` after ${input.timeoutMs} ms`:""}: ${command}`;return`Exec task ${input.taskId} was killed${input.signal?` by ${input.signal}`:""}: ${command}`}function createTaskNotificationSummary2(entry,status){return createExecTaskNotificationSummary({command:entry.command,taskId:entry.id,status,exitCode:entry.terminal?.exitCode,signal:entry.terminal?.signal,timeoutMs:entry.timeoutMs})}function createProcessResult2(entry,output,wallTimeMs){return{chunkId:createId2("chunk"),command:[...entry.command],cwd:entry.cwd,output,outputPath:entry.outputPath,outputBytes:entry.outputBytes,outputTruncated:entry.outputTruncated,processId:entry.id,exitCode:entry.terminal?.exitCode,signal:entry.terminal?.signal,timedOut:entry.timedOut||void 0,timeoutMs:entry.timeoutMs,wallTimeMs,status:entry.terminal?.status??"running"}}function requestTerminate2(entry){if(readChildExitCode2(entry.child.exitCode??void 0)!==void 0)return;entry.child.kill("SIGTERM"),clearTimeout(entry.terminateHandle),entry.terminateHandle=setTimeout(()=>{if(readChildExitCode2(entry.child.exitCode??void 0)===void 0)entry.child.kill("SIGKILL")},TERMINATE_GRACE_TIMEOUT_MS2)}function createTerminalState2(input){let state={status:input.status};if(input.exitCode!==void 0)state.exitCode=input.exitCode;if(input.signal)state.signal=input.signal;return state}function readChildExitCode2(code){return code}function readChildSignal2(signal){return signal}function waitForChange2(entry,deadline,signal){return new Promise((resolve2,reject)=>{if(signal?.aborted){reject(createAbortError3());return}let timeoutHandle,onChange,onAbort,finalize2=(error48)=>{if(timeoutHandle)clearTimeout(timeoutHandle);if(entry.waiters.delete(onChange),signal?.removeEventListener("abort",onAbort),error48)reject(error48);else resolve2()};onChange=()=>finalize2(),onAbort=()=>finalize2(createAbortError3()),entry.waiters.add(onChange),signal?.addEventListener("abort",onAbort,{once:!0});let remaining=Math.max(0,deadline-Date.now());timeoutHandle=setTimeout(()=>finalize2(),remaining)})}function waitForExit2(entry,deadline){if(entry.terminal)return Promise.resolve();return waitForChange2(entry,deadline,void 0).then(async()=>{if(entry.terminal)return;if(Date.now()>=deadline)return;await waitForExit2(entry,deadline)})}function notifyWaiters2(entry){let waiters=[...entry.waiters];entry.waiters.clear();for(let waiter of waiters)waiter()}function assertCommand2(command){if(!Array.isArray(command))throw new ManagedExecProcessManagerError("exec_invalid_request","exec start requires command to be a non-empty string array.");if(command.length===0)throw new ManagedExecProcessManagerError("exec_invalid_request","exec start requires command to be a non-empty string array.");if(command.some((part)=>typeof part!=="string"))throw new ManagedExecProcessManagerError("exec_invalid_request","exec command entries must all be strings.");if(command[0]?.trim().length===0)throw new ManagedExecProcessManagerError("exec_invalid_request","exec command[0] must be a non-empty string.");return[...command]}function assertProcessId2(processId){if(typeof processId!=="number"||!Number.isInteger(processId)||processId<=0)throw new ManagedExecProcessManagerError("exec_invalid_request","exec processId must be a positive integer.");return processId}function normalizeYieldTimeMs2(value){if(value===void 0)return DEFAULT_YIELD_TIME_MS2;if(!Number.isInteger(value)||value<1||value>MAX_YIELD_TIME_MS2)throw new ManagedExecProcessManagerError("exec_invalid_request",`exec yieldTimeMs must be an integer between 1 and ${MAX_YIELD_TIME_MS2}.`);return value}function normalizeTimeoutMs2(value){if(value===void 0)return;if(!Number.isInteger(value)||value<=0)throw new ManagedExecProcessManagerError("exec_invalid_request","exec timeoutMs must be a positive integer.");return value}function allocateProcessId2(entries){for(let attempts=0;attempts<100;attempts+=1){let candidate=randomInt2(1000,100001);if(!entries.has(candidate))return candidate}throw new ManagedExecProcessManagerError("exec_process_limit_exceeded","Could not allocate a unique exec process id for this session.")}function countActiveEntries2(entries){let count=0;for(let entry of entries.values())if(!entry.terminal)count+=1;return count}function createAbortError3(){let error48=Error("The exec tool call was aborted.");return error48.name="AbortError",error48}function createId2(prefix){return`${prefix}_${randomUUID2()}`}function createManagedExecOutputStoreRecord(input){let rootDir=input.rootDir??path11.join(os4.tmpdir(),"dim-agent-sdk"),sessionDirectoryName=encodeURIComponent(input.sessionId),outputDirectory=path11.join(rootDir,"sessions",sessionDirectoryName,"tool-results");fs2.mkdirSync(outputDirectory,{recursive:!0});let outputPath=path11.join(outputDirectory,`${input.processId}-${randomUUID2()}.txt`);return fs2.writeFileSync(outputPath,""),{outputPath,outputBytes:0,outputTruncated:!1}}function appendManagedExecOutput(record2,chunk){if(chunk.length===0||record2.outputTruncated)return;let bytes=Buffer.from(chunk,"utf8"),remainingBytes=MAX_EXEC_OUTPUT_FILE_BYTES2-record2.outputBytes;if(remainingBytes<=0){record2.outputTruncated=!0;return}let chunkToWrite=bytes.byteLength<=remainingBytes?bytes:bytes.subarray(0,remainingBytes);if(chunkToWrite.byteLength>0)fs2.appendFileSync(record2.outputPath,chunkToWrite),record2.outputBytes+=chunkToWrite.byteLength;if(bytes.byteLength>remainingBytes)record2.outputTruncated=!0}function readManagedExecOutputSince(record2,offset){let fd=fs2.openSync(record2.outputPath,"r");try{let stats=fs2.fstatSync(fd),boundedOffset=Math.min(Math.max(0,offset),stats.size),chunks=[],position=boundedOffset,remainingBytes=stats.size-boundedOffset;while(remainingBytes>0){let buffer=Buffer.allocUnsafe(Math.min(65536,remainingBytes)),bytesRead=fs2.readSync(fd,buffer,0,buffer.byteLength,position);if(bytesRead<=0)break;chunks.push(bytesRead===buffer.byteLength?buffer:buffer.subarray(0,bytesRead)),position+=bytesRead,remainingBytes-=bytesRead}return{text:Buffer.concat(chunks).toString("utf8"),nextOffset:position}}finally{fs2.closeSync(fd)}}async function executeManagedExecProcess(request){return await managedExecProcessManager.execute(request)}async function disposeManagedExecSession(sessionId){await managedExecProcessManager.disposeSession(sessionId)}function drainManagedExecTaskNotifications(sessionId){return managedExecProcessManager.drainNotifications(sessionId)}function queueManagedExecTaskNotification(sessionId,notification){managedExecProcessManager.queueNotification(sessionId,notification)}init_dist12();import path12 from"node:path";import process3 from"node:process";var forbiddenReadonlyCommandPatterns=[/\bmkdir\b/,/\btouch\b/,/\brm\b/,/\brmdir\b/,/\bcp\b/,/\bmv\b/,/\bchmod\b/,/\bchown\b/,/\bln\b/,/\bgit\s+(?:add|commit|push|pull|fetch|merge|rebase|reset|checkout|stash|cherry-pick|revert|clean|restore|switch)\b/,/\b(?:npm|yarn|pnpm|bun)\s+(?:install|add|remove|update|upgrade|publish|init)\b/,/\bpip\s+(?:install|uninstall)\b/,/>\s*[^|&]/,/>>/,/\btee\b/,/\bsudo\b/,/\bsu\b/,/\bkill(?:all)?\b/,/\bpkill\b/,/\bshutdown\b/,/\breboot\b/,/\bsource\b/,/\b\.\s+\//,/\bcurl\b/,/\bwget\b/,/\bscp\b/,/\brsync\b/,/\bssh\b/,/\bsftp\b/,/\bncat\b/,/\bnetcat\b/,/\bnc\b/,/\bsed\s+(-[a-zA-Z]*i|-i[a-zA-Z]*)\b/,/\bawk\s+(-[a-zA-Z]*i|-i[a-zA-Z]*)\b/,/\bperl\s+-[A-Za-hj-oq-z]*[ip][A-Za-z]*\b/,/\bpython[23]?\s+-c\b/,/\bnode\s+-e\b/,/\bruby\s+-e\b/,/\beval\s+/,/\bexec\s+/];function normalizeReadonlyShellCommand(command){let normalized=command.trim();if(!normalized)return{isAllowed:!1,reason:"Empty command"};for(let pattern of forbiddenReadonlyCommandPatterns){let match=normalized.match(pattern);if(match)return{isAllowed:!1,reason:`Command contains forbidden pattern: ${match[0]}`}}return{isAllowed:!0}}var DEFAULT_YIELD_TIME_MS3=1000,MAX_YIELD_TIME_MS3=1e4,EXEC_OUTPUT_EVENT="exec.output",EXEC_INLINE_OUTPUT_CHAR_LIMIT=30000,EXEC_PREVIEW_SIZE_CHARS2=2000,EXEC_PLUGIN_ID="dim-agent.exec-tool";class ExecToolError extends Error{code;constructor(code,message){super(message);this.name="ExecToolError",this.code=code}}var DEFAULT_EXEC_SESSION_IDLE_TTL_MS=21600000,execSessionDisposers=new Map,execSessionDisposerIdleTtlMs=DEFAULT_EXEC_SESSION_IDLE_TTL_MS;function clearExecSessionDisposerTimeout(entry){if(!entry.timeoutHandle)return;clearTimeout(entry.timeoutHandle),entry.timeoutHandle=void 0}async function runExecSessionDisposers(sessionId){let normalizedSessionId=String(sessionId??"").trim();if(!normalizedSessionId)return;let entry=execSessionDisposers.get(normalizedSessionId);if(!entry)return;execSessionDisposers.delete(normalizedSessionId),clearExecSessionDisposerTimeout(entry);let disposers=[...entry.disposers];if(disposers.length===0)return;await Promise.allSettled(disposers.map(async(disposer)=>await disposer()))}function scheduleExecSessionDisposerExpiry(sessionId,entry){if(clearExecSessionDisposerTimeout(entry),entry.disposers.size===0||execSessionDisposerIdleTtlMs<=0)return;let timeoutHandle=setTimeout(()=>{runExecSessionDisposers(sessionId)},execSessionDisposerIdleTtlMs);timeoutHandle.unref?.(),entry.timeoutHandle=timeoutHandle}function hasOwn(value,key){return Object.prototype.hasOwnProperty.call(value,key)}function readToolResultText(result){if(!Array.isArray(result.content))return"";return result.content.map((part)=>{if(!part||typeof part!=="object")return"";if(part.type!=="text")return"";return String(part.text??"")}).join(`
|
|
905
|
+
${summaryBlockText}`:summaryBlockText},messagesCopy}return messagesCopy[systemIndex]={...systemMessage,content:[...baseBlocks,{type:"text",text:summaryBlockText}]},messagesCopy}import{existsSync,mkdirSync,rmSync}from"node:fs";import{mkdir as mkdir5,readdir as readdir3,readFile as readFile4,rm as rm2,writeFile as writeFile4}from"node:fs/promises";import path8 from"node:path";var StateKeys={RUNTIME_STATE:"runtime-state",COMPRESSION:"compression",COMPRESSION_VIEW:"compression-view",SESSION:"session",COMPRESSION_SNAPSHOT:"compression-snapshot"};class StateStore{opts;deleteOnComplete;constructor(options){this.opts=options,this.deleteOnComplete=options?.deleteOnComplete??!0}assertValidStorageSegment(label,value){if(!value)throw Error(`${label} must be a non-empty string`);if(value==="."||value==="..")throw Error(`${label} must not be "." or ".."`);if(value.includes("/")||value.includes("\\"))throw Error(`${label} must not contain path separators`);if(value.includes("\x00"))throw Error(`${label} must not contain NUL bytes`)}buildPath(sessionId,key){return this.assertValidStorageSegment("sessionId",sessionId),this.assertValidStorageSegment("key",key),`${sessionId}/${key}`}buildPrefix(sessionId){return this.assertValidStorageSegment("sessionId",sessionId),`${sessionId}/`}extractKey(sessionId,storagePath){let prefix=`${sessionId}/`;return storagePath.startsWith(prefix)?storagePath.slice(prefix.length):storagePath}extractSessionId(storagePath){let parts=storagePath.split("/");return parts.length>0?parts[0]:void 0}async save(sessionId,key,data){let storagePath=this.buildPath(sessionId,key);await this._write(storagePath,JSON.stringify(data,null,2))}async load(sessionId,key){let storagePath=this.buildPath(sessionId,key),content=await this._read(storagePath);if(content===void 0)return;try{return JSON.parse(content)}catch{return}}async delete(sessionId,key){await this._delete(this.buildPath(sessionId,key))}async deleteSession(sessionId){let prefix=this.buildPrefix(sessionId),paths=await this._list(prefix);await Promise.all(paths.map((path8)=>this._delete(path8)))}async listSessions(){let allPaths=await this._list(""),sessionIds=new Set;for(let storagePath of allPaths){let sessionId=this.extractSessionId(storagePath);if(sessionId)sessionIds.add(sessionId)}return Array.from(sessionIds)}async saveRuntimeState(runtimeState){let messageCount=runtimeState.kind==="idle"?runtimeState.messages.length:Array.isArray(runtimeState.checkpoint?.messages)?runtimeState.checkpoint.messages.length:0,wrapped={_meta:{description:"DimCode Runtime State - DO NOT EDIT MANUALLY",savedAt:new Date(runtimeState.savedAt).toISOString(),sessionId:runtimeState.sessionId,kind:runtimeState.kind,messageCount},runtimeState};await this.save(runtimeState.sessionId,StateKeys.RUNTIME_STATE,wrapped)}async loadRuntimeState(sessionId){return(await this.load(sessionId,StateKeys.RUNTIME_STATE))?.runtimeState}async deleteRuntimeState(sessionId){await this.delete(sessionId,StateKeys.RUNTIME_STATE)}}class FileStateStore2 extends StateStore{baseDir;writeQueues=new Map;pendingWrites=new Map;constructor(options){super(options);this.baseDir=path8.resolve(options.dir),this.ensureDir(this.baseDir)}async _write(storagePath,data){let filePath=this.toFilePath(storagePath);this.pendingWrites.set(filePath,data);let existingWrite=this.writeQueues.get(filePath);if(existingWrite){await existingWrite;return}let writePromise=(async()=>{while(this.pendingWrites.has(filePath)){let currentData=this.pendingWrites.get(filePath)??"";this.pendingWrites.delete(filePath),await this.ensureDirAsync(path8.dirname(filePath)),await writeFile4(filePath,currentData,"utf-8")}})();this.writeQueues.set(filePath,writePromise);try{await writePromise}finally{if(this.writeQueues.get(filePath)===writePromise)this.writeQueues.delete(filePath)}}async _read(storagePath){let filePath=this.toFilePath(storagePath);try{return await readFile4(filePath,"utf-8")}catch{return}}async _delete(storagePath){let filePath=this.toFilePath(storagePath);await rm2(filePath,{force:!0});let sessionDir=path8.dirname(filePath);if(!existsSync(sessionDir))return;try{if((await readdir3(sessionDir)).length===0)await rm2(sessionDir,{recursive:!0,force:!0})}catch{}}async deleteSession(sessionId){await super.deleteSession(sessionId),await this.deleteCacheRoot(sessionId,"blob-cache")}async _exists(storagePath){return existsSync(this.toFilePath(storagePath))}async _list(prefix){let results=[];if(!existsSync(this.baseDir))return results;let sessionDirs=(await readdir3(this.baseDir,{withFileTypes:!0})).filter((entry)=>entry.isDirectory()).map((entry)=>entry.name);for(let sessionId of sessionDirs){if(prefix&&!sessionId.startsWith(prefix.split("/")[0]??""))continue;let sessionDir=path8.join(this.baseDir,sessionId),files=await this.listJsonFiles(sessionDir);for(let file2 of files){let key=path8.basename(file2,".json"),storagePath=`${sessionId}/${key}`;if(!prefix||storagePath.startsWith(prefix))results.push(storagePath)}}return results}getBaseDir(){return this.baseDir}clear(){if(!existsSync(this.baseDir))return;rmSync(this.baseDir,{recursive:!0}),mkdirSync(this.baseDir,{recursive:!0})}toFilePath(storagePath){return path8.join(this.baseDir,`${storagePath}.json`)}ensureDir(dir){if(!existsSync(dir))mkdirSync(dir,{recursive:!0})}async ensureDirAsync(dir){if(existsSync(dir))return;await mkdir5(dir,{recursive:!0})}async listJsonFiles(dir){if(!existsSync(dir))return[];return(await readdir3(dir)).filter((file2)=>file2.endsWith(".json")).map((file2)=>path8.join(dir,file2))}async deleteCacheRoot(sessionId,rootDirName){this.assertValidStorageSegment("sessionId",sessionId);let cacheDir=path8.join(this.baseDir,rootDirName,sessionId);await rm2(cacheDir,{recursive:!0,force:!0});let rootDir=path8.join(this.baseDir,rootDirName);if(!existsSync(rootDir))return;try{if((await readdir3(rootDir)).length===0)await rm2(rootDir,{recursive:!0,force:!0})}catch{}}}class InMemoryStateStore2 extends StateStore{store=new Map;constructor(options){super(options)}async _write(path9,data){this.store.set(path9,data)}async _read(path9){return this.store.get(path9)}async _delete(path9){this.store.delete(path9)}async _exists(path9){return this.store.has(path9)}async _list(prefix){let paths=[];for(let key of this.store.keys())if(!prefix||key.startsWith(prefix))paths.push(key);return paths}clear(){this.store.clear()}}import path10 from"node:path";init_dist13();import path9 from"node:path";var SAFE_EXEC_ARG_PATTERN=/^[\w./:@%+=,-]+$/;function normalizeQuotedShellPath(value){let trimmed=value.trim();if(!trimmed)return null;let quote=trimmed[0];if((quote==='"'||quote==="'")&&trimmed.endsWith(quote)&&trimmed.length>=2)return trimmed.slice(1,-1);if(/[`"'\s]/.test(trimmed))return null;return trimmed}function quoteExecArg(part){if(!part)return"''";if(SAFE_EXEC_ARG_PATTERN.test(part))return part;return`'${part.replace(/'/g,"'\\''")}'`}function readExecProcessId(value){if(typeof value!=="number"||!Number.isInteger(value)||value<=0)return null;return value}function resolveExecAction(args){let action=args.action;if(action==="start"||action==="poll"||action==="terminate")return action;let hasCommand=Object.hasOwn(args,"command"),hasProcessId=Object.hasOwn(args,"processId");if(hasCommand&&!hasProcessId)return"start";if(hasProcessId&&!hasCommand)return"poll";return null}function formatExecCommandPreview(command){if(typeof command==="string")return command.trim();if(!Array.isArray(command)||command.some((part)=>typeof part!=="string"))return"";return command.map((part)=>quoteExecArg(String(part))).join(" ").trim()}function formatExecInvocationPreview(args){let action=resolveExecAction(args),command=formatExecCommandPreview(args.command),processId=readExecProcessId(args.processId);if(command)return command;if(action==="terminate"&&processId!==null)return`Terminate process ${processId}`;if(action==="poll"&&processId!==null)return`Poll process ${processId}`;if(action==="start")return"Start process";return""}function resolveExecListCommandTarget(command,cwd){if(typeof command==="string"){let trimmed=command.trim();if(!trimmed)return null;if(trimmed==="ls")return cwd;if(!trimmed.startsWith("ls "))return null;let rest=trimmed.slice(2).trim();if(!rest||rest.startsWith("-"))return null;if(/[;&|]/.test(rest)||rest.includes("$("))return null;let normalizedPath=normalizeQuotedShellPath(rest);if(!normalizedPath)return null;return path9.isAbsolute(normalizedPath)?path9.resolve(normalizedPath):path9.resolve(cwd,normalizedPath)}if(!Array.isArray(command)||command.some((part)=>typeof part!=="string"))return null;let argv=command.map((part)=>String(part).trim()).filter(Boolean);if(!argv.length||argv[0]!=="ls")return null;if(argv.length===1)return cwd;let nonOptionArgs=argv.slice(1).filter((part)=>!part.startsWith("-"));if(nonOptionArgs.length!==1)return null;let target=nonOptionArgs[0];if(!target||target.includes("$(")||/[;&|]/.test(target))return null;return path9.isAbsolute(target)?path9.resolve(target):path9.resolve(cwd,target)}var TOOL_APPROVAL_PLUGIN_ID="acp-tool-approvals";function normalizeRuntimeToolName(toolName){return toolName.trim()}function inferToolKind(toolName){let normalized=normalizeRuntimeToolName(toolName).toLowerCase();if(normalized==="read")return"read";if(normalized==="write"||normalized==="edit")return"edit";if(normalized==="grep"||normalized==="glob")return"search";if(normalized==="exec")return"execute";return"other"}function readApprovalArgs(value){if(!value||typeof value!=="object"||Array.isArray(value))return{};return value}function resolvePrimaryToolPath(rawInput,cwd){let args=readApprovalArgs(rawInput),rawPath=[args.file_path,args.filePath,args.path,args.targetPath,args.sourcePath,args.destinationPath].map((value)=>String(value??"").trim()).find(Boolean);if(!rawPath)return;return path10.isAbsolute(rawPath)?path10.resolve(rawPath):path10.resolve(cwd,rawPath)}function buildToolCallTitle(toolName,rawInput,cwd){let normalizedName=normalizeRuntimeToolName(toolName).toLowerCase(),args=readApprovalArgs(rawInput),commandPreview=formatExecInvocationPreview(args),listTarget=normalizedName==="exec"?resolveExecListCommandTarget(args.command,cwd):void 0;if(listTarget)return`List ${listTarget}`;if(normalizedName==="exec"&&commandPreview)return commandPreview;let primaryPath=resolvePrimaryToolPath(rawInput,cwd);if(normalizedName==="read"&&primaryPath)return`Read ${primaryPath}`;if(normalizedName==="write"&&primaryPath)return`Write ${primaryPath}`;if(normalizedName==="edit"&&primaryPath)return`Edit ${primaryPath}`;return toolName}function buildToolCallRawInput(toolName,rawInput){let normalizedName=normalizeRuntimeToolName(toolName).toLowerCase(),args=readApprovalArgs(rawInput);if(normalizedName!=="exec")return args;if(Object.keys(args).length===0)return args;let commandPreview=formatExecInvocationPreview(args);if(!commandPreview)return args;let normalizedArgs={...args,command:commandPreview};if(Array.isArray(args.command))normalizedArgs.commandArgv=[...args.command];return normalizedArgs}function resolveToolLocations(toolCall,cwd){let args=readApprovalArgs(toolCall.function?.arguments),rawPaths=[args.filePath,args.path,args.targetPath,args.sourcePath,args.destinationPath].map((value)=>String(value??"").trim()).filter(Boolean);if(!rawPaths.length)return;return rawPaths.map((filePath)=>{return{path:path10.isAbsolute(filePath)?filePath:path10.resolve(cwd,filePath)}})}function serializeToolCallForApproval(toolCall,cwd){let toolName=String(toolCall.function?.name??"").trim(),rawInput=structuredClone(toolCall.function?.arguments??{}),locations=resolveToolLocations(toolCall,cwd),serializedToolCall={toolCallId:String(toolCall.id??"").trim(),title:buildToolCallTitle(toolName,rawInput,cwd),kind:inferToolKind(toolName),status:"pending",rawInput:buildToolCallRawInput(toolName,rawInput),cwd};if(locations?.length)serializedToolCall.locations=locations;return serializedToolCall}function buildApprovalRequestMetadata(toolCall,cwd){return toMetadataMap({acpToolCall:serializeToolCallForApproval(toolCall,cwd??process.cwd())})}function createAcpToolApprovalPlugin(){return{manifest:{id:TOOL_APPROVAL_PLUGIN_ID,version:"1.0.0",apiVersion:1,permissions:{}},setup(){return{hooks:[{descriptor:{name:"tool.beforeExecute"},middleware:[({payload,context})=>{let toolName=String(payload?.toolCall?.function?.name??"").trim();if(toolName==="AskUserQuestion"||toolName==="delegate_tasks")return;return askToolCall({message:`Approval required to execute tool: ${toolName}`,metadata:buildApprovalRequestMetadata(payload.toolCall,context.cwd)})}]}]}}}}import{randomInt as randomInt3}from"node:crypto";import path13 from"node:path";import process4 from"node:process";import{spawn as spawn2}from"node:child_process";import{randomInt as randomInt2,randomUUID as randomUUID2}from"node:crypto";import fs2 from"node:fs";import os4 from"node:os";import path11 from"node:path";var DEFAULT_YIELD_TIME_MS=1000,MAX_YIELD_TIME_MS=1e4,MAX_ACTIVE_PROCESSES_PER_SESSION2=10,TERMINATE_GRACE_TIMEOUT_MS2=250,OUTPUT_SETTLE_TIME_MS=25,MAX_EXEC_OUTPUT_FILE_BYTES2=67108864;class ManagedExecProcessManagerError extends Error{code;constructor(code,message){super(message);this.name="ManagedExecProcessManagerError",this.code=code}}class ManagedExecProcessManager{sessions=new Map;notifications=new Map;disposingSessions=new Set;disposePromises=new Map;async execute(request){switch(request.action){case"start":return await this.start(request);case"poll":return await this.poll(request);case"terminate":return await this.terminate(request)}}async disposeSession(sessionId){let existing=this.disposePromises.get(sessionId);if(existing){await existing;return}let disposePromise=(async()=>{this.disposingSessions.add(sessionId);try{let entries=this.sessions.get(sessionId);if(!entries||entries.size===0){this.sessions.delete(sessionId),this.notifications.delete(sessionId);return}await Promise.allSettled([...entries.values()].map(async(entry)=>{if(clearTimeout(entry.timeoutHandle),entry.suppressNotifications=!0,readChildExitCode2(entry.child.exitCode??void 0)!==void 0||entry.child.killed)return;entry.terminationReason="dispose",requestTerminate2(entry),await waitForExit2(entry,Date.now()+1000)})),this.sessions.delete(sessionId)}finally{this.notifications.delete(sessionId),this.disposingSessions.delete(sessionId),this.disposePromises.delete(sessionId)}})();this.disposePromises.set(sessionId,disposePromise),await disposePromise}drainNotifications(sessionId){let notifications=this.notifications.get(sessionId)??[];return this.notifications.delete(sessionId),notifications}queueNotification(sessionId,notification){let queue=this.notifications.get(sessionId)??[];queue.push(notification),this.notifications.set(sessionId,queue)}async start(request){this.assertSessionNotDisposing(request.sessionId);let command=assertCommand2(request.command),cwd=request.cwd??process.cwd(),timeoutMs=normalizeTimeoutMs2(request.timeoutMs),yieldTimeMs=normalizeYieldTimeMs(request.yieldTimeMs),entries=this.getSessionEntries(request.sessionId);if(countActiveEntries2(entries)>=MAX_ACTIVE_PROCESSES_PER_SESSION2)throw new ManagedExecProcessManagerError("exec_process_limit_exceeded",`Session ${request.sessionId} already has ${MAX_ACTIVE_PROCESSES_PER_SESSION2} active exec processes.`);let processId=allocateProcessId(entries),outputRecord=createManagedExecOutputStoreRecord({sessionId:request.sessionId,processId,rootDir:request.outputRoot}),startedAt=Date.now(),child=spawn2(command[0],command.slice(1),{cwd,env:process.env,shell:!1,stdio:["ignore","pipe","pipe"]}),entry={id:processId,sessionId:request.sessionId,command:[...command],cwd,child,startedAt,timeoutMs,timedOut:!1,readOffset:0,waiters:new Set,notifyOnTerminal:!1,suppressNotifications:!1,...outputRecord};if(entries.set(processId,entry),attachChildListeners2(entry),timeoutMs!==void 0)entry.timeoutHandle=setTimeout(()=>{entry.timedOut=!0,entry.terminationReason="timeout",requestTerminate2(entry)},timeoutMs);if(request.runInBackground===!0)return this.markForNotification(entry),createProcessResult2(entry,"",Date.now()-startedAt);let startedResult=await this.collect(entry,yieldTimeMs,request.signal);if(startedResult.status!=="running")this.deleteEntry(entry);else this.markForNotification(entry);return startedResult}async poll(request){this.assertSessionNotDisposing(request.sessionId);let processId=assertProcessId(request.processId),yieldTimeMs=normalizeYieldTimeMs(request.yieldTimeMs),entry=this.requireEntry(request.sessionId,processId),result=await this.collect(entry,yieldTimeMs,request.signal);if(result.status!=="running")this.deleteEntry(entry);else this.markForNotification(entry);return result}async terminate(request){this.assertSessionNotDisposing(request.sessionId);let processId=assertProcessId(request.processId),yieldTimeMs=normalizeYieldTimeMs(request.yieldTimeMs),entry=this.requireEntry(request.sessionId,processId);if(!entry.terminal)entry.terminationReason="user",requestTerminate2(entry);let result=await this.collect(entry,yieldTimeMs,request.signal);if(result.status!=="running")this.deleteEntry(entry);return result}requireEntry(sessionId,processId){let entry=this.sessions.get(sessionId)?.get(processId);if(entry)return entry;throw new ManagedExecProcessManagerError("exec_process_not_found",`Exec process ${processId} was not found for session ${sessionId}.`)}getSessionEntries(sessionId){let existing=this.sessions.get(sessionId);if(existing)return existing;let created=new Map;return this.sessions.set(sessionId,created),created}async collect(entry,yieldTimeMs,signal){let startedAt=Date.now(),deadline=startedAt+yieldTimeMs,observedOutputBytes=entry.outputBytes,observedOutputTruncated=entry.outputTruncated,quietDeadline;while(!entry.terminal&&Date.now()<deadline){if(entry.outputBytes!==observedOutputBytes||entry.outputTruncated!==observedOutputTruncated)observedOutputBytes=entry.outputBytes,observedOutputTruncated=entry.outputTruncated,quietDeadline=Math.min(deadline,Date.now()+OUTPUT_SETTLE_TIME_MS);if(quietDeadline!==void 0&&Date.now()>=quietDeadline)break;await waitForChange2(entry,quietDeadline??deadline,signal)}let output=readManagedExecOutputSince(entry,entry.readOffset);return entry.readOffset=output.nextOffset,createProcessResult2(entry,output.text,Date.now()-startedAt)}deleteEntry(entry){clearTimeout(entry.timeoutHandle),clearTimeout(entry.terminateHandle);let entries=this.sessions.get(entry.sessionId);if(!entries)return;if(entries.delete(entry.id),entries.size===0&&!this.disposingSessions.has(entry.sessionId))this.sessions.delete(entry.sessionId)}assertSessionNotDisposing(sessionId){if(!this.disposingSessions.has(sessionId))return;throw new ManagedExecProcessManagerError("exec_session_disposing",`Session ${sessionId} is disposing exec processes and cannot start, poll, or terminate commands right now.`)}markForNotification(entry){entry.notifyOnTerminal=!0,this.enqueueTerminalNotification(entry)}enqueueTerminalNotification(entry){if(!entry.notifyOnTerminal)return;if(entry.suppressNotifications)return;if(!entry.terminal)return;if(entry.notifiedAt!==void 0)return;entry.notifiedAt=Date.now(),this.queueNotification(entry.sessionId,createTaskNotification2(entry))}completeTerminalEntry(entry){this.enqueueTerminalNotification(entry),this.deleteEntry(entry)}}var managedExecProcessManager=new ManagedExecProcessManager;function attachChildListeners2(entry){entry.child.stdout.setEncoding("utf8"),entry.child.stderr.setEncoding("utf8"),entry.child.stdout.on("data",(chunk)=>{appendManagedExecOutput(entry,String(chunk)),notifyWaiters2(entry)}),entry.child.stderr.on("data",(chunk)=>{appendManagedExecOutput(entry,String(chunk)),notifyWaiters2(entry)}),entry.child.on("error",(error48)=>{if(appendManagedExecOutput(entry,`${entry.outputBytes>0?`
|
|
906
|
+
`:""}${error48.message}`),!entry.terminal)entry.terminal=createTerminalState2({status:entry.timedOut?"terminated":"exited"});managedExecProcessManager.completeTerminalEntry(entry),notifyWaiters2(entry)}),entry.child.on("close",(code,signal)=>{if(!entry.terminal)entry.terminal=createTerminalState2({exitCode:readChildExitCode2(code??void 0),signal:readChildSignal2(signal??void 0),status:signal?"terminated":"exited"});else if(entry.terminal.signal===void 0&&signal)entry.terminal={...entry.terminal,signal,status:"terminated"};clearTimeout(entry.timeoutHandle),clearTimeout(entry.terminateHandle),managedExecProcessManager.completeTerminalEntry(entry),notifyWaiters2(entry)})}function createTaskNotification2(entry){let status=createTaskNotificationStatus2(entry),exitCode=entry.terminal?.exitCode,signal=entry.terminal?.signal,summary=createTaskNotificationSummary2(entry,status),notification={taskId:entry.id,status,outputPath:entry.outputPath,summary};if(exitCode!==void 0)notification.exitCode=exitCode;if(signal!==void 0)notification.signal=signal;return notification}function createTaskNotificationStatus2(entry){if(entry.timedOut)return"timed_out";if(entry.terminationReason==="user"||entry.terminationReason==="dispose")return"killed";if(entry.terminal?.status==="terminated")return"killed";return(entry.terminal?.exitCode??0)===0?"completed":"failed"}function createExecTaskNotificationSummary(input){let command=input.command.join(" ");if(input.status==="completed")return`Exec task ${input.taskId} completed: ${command}`;if(input.status==="failed")return`Exec task ${input.taskId} failed with exit code ${input.exitCode??-1}: ${command}`;if(input.status==="timed_out")return`Exec task ${input.taskId} timed out${input.timeoutMs?` after ${input.timeoutMs} ms`:""}: ${command}`;return`Exec task ${input.taskId} was killed${input.signal?` by ${input.signal}`:""}: ${command}`}function createTaskNotificationSummary2(entry,status){return createExecTaskNotificationSummary({command:entry.command,taskId:entry.id,status,exitCode:entry.terminal?.exitCode,signal:entry.terminal?.signal,timeoutMs:entry.timeoutMs})}function createProcessResult2(entry,output,wallTimeMs){return{chunkId:createId2("chunk"),command:[...entry.command],cwd:entry.cwd,output,outputPath:entry.outputPath,outputBytes:entry.outputBytes,outputTruncated:entry.outputTruncated,processId:entry.id,exitCode:entry.terminal?.exitCode,signal:entry.terminal?.signal,timedOut:entry.timedOut||void 0,timeoutMs:entry.timeoutMs,wallTimeMs,status:entry.terminal?.status??"running"}}function requestTerminate2(entry){if(readChildExitCode2(entry.child.exitCode??void 0)!==void 0)return;entry.child.kill("SIGTERM"),clearTimeout(entry.terminateHandle),entry.terminateHandle=setTimeout(()=>{if(readChildExitCode2(entry.child.exitCode??void 0)===void 0)entry.child.kill("SIGKILL")},TERMINATE_GRACE_TIMEOUT_MS2)}function createTerminalState2(input){let state={status:input.status};if(input.exitCode!==void 0)state.exitCode=input.exitCode;if(input.signal)state.signal=input.signal;return state}function readChildExitCode2(code){return code}function readChildSignal2(signal){return signal}function waitForChange2(entry,deadline,signal){return new Promise((resolve2,reject)=>{if(signal?.aborted){reject(createAbortError3());return}let timeoutHandle,onChange,onAbort,finalize2=(error48)=>{if(timeoutHandle)clearTimeout(timeoutHandle);if(entry.waiters.delete(onChange),signal?.removeEventListener("abort",onAbort),error48)reject(error48);else resolve2()};onChange=()=>finalize2(),onAbort=()=>finalize2(createAbortError3()),entry.waiters.add(onChange),signal?.addEventListener("abort",onAbort,{once:!0});let remaining=Math.max(0,deadline-Date.now());timeoutHandle=setTimeout(()=>finalize2(),remaining)})}function waitForExit2(entry,deadline){if(entry.terminal)return Promise.resolve();return waitForChange2(entry,deadline,void 0).then(async()=>{if(entry.terminal)return;if(Date.now()>=deadline)return;await waitForExit2(entry,deadline)})}function notifyWaiters2(entry){let waiters=[...entry.waiters];entry.waiters.clear();for(let waiter of waiters)waiter()}function assertCommand2(command){if(!Array.isArray(command))throw new ManagedExecProcessManagerError("exec_invalid_request","exec start requires command to be a non-empty string array.");if(command.length===0)throw new ManagedExecProcessManagerError("exec_invalid_request","exec start requires command to be a non-empty string array.");if(command.some((part)=>typeof part!=="string"))throw new ManagedExecProcessManagerError("exec_invalid_request","exec command entries must all be strings.");if(command[0]?.trim().length===0)throw new ManagedExecProcessManagerError("exec_invalid_request","exec command[0] must be a non-empty string.");return[...command]}function assertProcessId(processId){if(typeof processId!=="number"||!Number.isInteger(processId)||processId<=0)throw new ManagedExecProcessManagerError("exec_invalid_request","exec processId must be a positive integer.");return processId}function normalizeYieldTimeMs(value){if(value===void 0)return DEFAULT_YIELD_TIME_MS;if(!Number.isInteger(value)||value<1||value>MAX_YIELD_TIME_MS)throw new ManagedExecProcessManagerError("exec_invalid_request",`exec yieldTimeMs must be an integer between 1 and ${MAX_YIELD_TIME_MS}.`);return value}function normalizeTimeoutMs2(value){if(value===void 0)return;if(!Number.isInteger(value)||value<=0)throw new ManagedExecProcessManagerError("exec_invalid_request","exec timeoutMs must be a positive integer.");return value}function allocateProcessId(entries){for(let attempts=0;attempts<100;attempts+=1){let candidate=randomInt2(1000,100001);if(!entries.has(candidate))return candidate}throw new ManagedExecProcessManagerError("exec_process_limit_exceeded","Could not allocate a unique exec process id for this session.")}function countActiveEntries2(entries){let count=0;for(let entry of entries.values())if(!entry.terminal)count+=1;return count}function createAbortError3(){let error48=Error("The exec tool call was aborted.");return error48.name="AbortError",error48}function createId2(prefix){return`${prefix}_${randomUUID2()}`}function createManagedExecOutputStoreRecord(input){let rootDir=input.rootDir??path11.join(os4.tmpdir(),"dim-agent-sdk"),sessionDirectoryName=encodeURIComponent(input.sessionId),outputDirectory=path11.join(rootDir,"sessions",sessionDirectoryName,"tool-results");fs2.mkdirSync(outputDirectory,{recursive:!0});let outputPath=path11.join(outputDirectory,`${input.processId}-${randomUUID2()}.txt`);return fs2.writeFileSync(outputPath,""),{outputPath,outputBytes:0,outputTruncated:!1}}function appendManagedExecOutput(record2,chunk){if(chunk.length===0||record2.outputTruncated)return;let bytes=Buffer.from(chunk,"utf8"),remainingBytes=MAX_EXEC_OUTPUT_FILE_BYTES2-record2.outputBytes;if(remainingBytes<=0){record2.outputTruncated=!0;return}let chunkToWrite=bytes.byteLength<=remainingBytes?bytes:bytes.subarray(0,remainingBytes);if(chunkToWrite.byteLength>0)fs2.appendFileSync(record2.outputPath,chunkToWrite),record2.outputBytes+=chunkToWrite.byteLength;if(bytes.byteLength>remainingBytes)record2.outputTruncated=!0}function readManagedExecOutputSince(record2,offset){let fd=fs2.openSync(record2.outputPath,"r");try{let stats=fs2.fstatSync(fd),boundedOffset=Math.min(Math.max(0,offset),stats.size),chunks=[],position=boundedOffset,remainingBytes=stats.size-boundedOffset;while(remainingBytes>0){let buffer=Buffer.allocUnsafe(Math.min(65536,remainingBytes)),bytesRead=fs2.readSync(fd,buffer,0,buffer.byteLength,position);if(bytesRead<=0)break;chunks.push(bytesRead===buffer.byteLength?buffer:buffer.subarray(0,bytesRead)),position+=bytesRead,remainingBytes-=bytesRead}return{text:Buffer.concat(chunks).toString("utf8"),nextOffset:position}}finally{fs2.closeSync(fd)}}async function executeManagedExecProcess(request){return await managedExecProcessManager.execute(request)}async function disposeManagedExecSession(sessionId){await managedExecProcessManager.disposeSession(sessionId)}function drainManagedExecTaskNotifications(sessionId){return managedExecProcessManager.drainNotifications(sessionId)}function queueManagedExecTaskNotification(sessionId,notification){managedExecProcessManager.queueNotification(sessionId,notification)}init_dist12();import path12 from"node:path";import process3 from"node:process";var forbiddenReadonlyCommandPatterns=[/\bmkdir\b/,/\btouch\b/,/\brm\b/,/\brmdir\b/,/\bcp\b/,/\bmv\b/,/\bchmod\b/,/\bchown\b/,/\bln\b/,/\bgit\s+(?:add|commit|push|pull|fetch|merge|rebase|reset|checkout|stash|cherry-pick|revert|clean|restore|switch)\b/,/\b(?:npm|yarn|pnpm|bun)\s+(?:install|add|remove|update|upgrade|publish|init)\b/,/\bpip\s+(?:install|uninstall)\b/,/>\s*[^|&]/,/>>/,/\btee\b/,/\bsudo\b/,/\bsu\b/,/\bkill(?:all)?\b/,/\bpkill\b/,/\bshutdown\b/,/\breboot\b/,/\bsource\b/,/\b\.\s+\//,/\bcurl\b/,/\bwget\b/,/\bscp\b/,/\brsync\b/,/\bssh\b/,/\bsftp\b/,/\bncat\b/,/\bnetcat\b/,/\bnc\b/,/\bsed\s+(-[a-zA-Z]*i|-i[a-zA-Z]*)\b/,/\bawk\s+(-[a-zA-Z]*i|-i[a-zA-Z]*)\b/,/\bperl\s+-[A-Za-hj-oq-z]*[ip][A-Za-z]*\b/,/\bpython[23]?\s+-c\b/,/\bnode\s+-e\b/,/\bruby\s+-e\b/,/\beval\s+/,/\bexec\s+/];function normalizeReadonlyShellCommand(command){let normalized=command.trim();if(!normalized)return{isAllowed:!1,reason:"Empty command"};for(let pattern of forbiddenReadonlyCommandPatterns){let match=normalized.match(pattern);if(match)return{isAllowed:!1,reason:`Command contains forbidden pattern: ${match[0]}`}}return{isAllowed:!0}}var DEFAULT_YIELD_TIME_MS2=1000,MAX_YIELD_TIME_MS2=1e4,EXEC_OUTPUT_EVENT="exec.output",EXEC_INLINE_OUTPUT_CHAR_LIMIT=30000,EXEC_PREVIEW_SIZE_CHARS2=2000,EXEC_PLUGIN_ID="dim-agent.exec-tool";class ExecToolError extends Error{code;constructor(code,message){super(message);this.name="ExecToolError",this.code=code}}var DEFAULT_EXEC_SESSION_IDLE_TTL_MS=21600000,execSessionDisposers=new Map,execSessionDisposerIdleTtlMs=DEFAULT_EXEC_SESSION_IDLE_TTL_MS;function clearExecSessionDisposerTimeout(entry){if(!entry.timeoutHandle)return;clearTimeout(entry.timeoutHandle),entry.timeoutHandle=void 0}async function runExecSessionDisposers(sessionId){let normalizedSessionId=String(sessionId??"").trim();if(!normalizedSessionId)return;let entry=execSessionDisposers.get(normalizedSessionId);if(!entry)return;execSessionDisposers.delete(normalizedSessionId),clearExecSessionDisposerTimeout(entry);let disposers=[...entry.disposers];if(disposers.length===0)return;await Promise.allSettled(disposers.map(async(disposer)=>await disposer()))}function scheduleExecSessionDisposerExpiry(sessionId,entry){if(clearExecSessionDisposerTimeout(entry),entry.disposers.size===0||execSessionDisposerIdleTtlMs<=0)return;let timeoutHandle=setTimeout(()=>{runExecSessionDisposers(sessionId)},execSessionDisposerIdleTtlMs);timeoutHandle.unref?.(),entry.timeoutHandle=timeoutHandle}function hasOwn(value,key){return Object.prototype.hasOwnProperty.call(value,key)}function readToolResultText(result){if(!Array.isArray(result.content))return"";return result.content.map((part)=>{if(!part||typeof part!=="object")return"";if(part.type!=="text")return"";return String(part.text??"")}).join(`
|
|
907
907
|
`).trim()}function extractExecTextReceipt(result){if(typeof result.content==="string")return result.content.replace(/\r/g,"").trim();return readToolResultText(result).replace(/\r/g,"")}function hasExecStructuredShape(structured){return typeof structured.status==="string"||typeof structured.type==="string"||typeof structured.taskId==="number"||typeof structured.stdout==="string"||typeof structured.stderr==="string"||typeof structured.processId==="number"||hasOwn(structured,"exitCode")}var execStatusLineMatchers=[{regex:/^Command running with task ID: (\d+)\. It is still running; you will be notified when it completes\. Output is being written to: (.+)$/u,parse:(match)=>({status:"running",processId:Number.parseInt(match[1]??"",10)})},{regex:/^Command exited with code (-?\d+)\. Output is available at: (.+)$/u,parse:(match)=>({status:"exited",exitCode:Number.parseInt(match[1]??"",10)})},{regex:/^Process (\d+) is still running\. Output is being written to: (.+)$/u,parse:(match)=>({status:"running",processId:Number.parseInt(match[1]??"",10)})},{regex:/^Command running in background with ID: (\d+)\. Output is being written to: (.+)$/u,parse:(match)=>({status:"running",processId:Number.parseInt(match[1]??"",10)})},{regex:/^Command timed out after (\d+) ms\. Output is available at: (.+)$/u,parse:()=>({status:"terminated",timedOut:!0})},{regex:/^Command (\d+) was terminated\. Output is available at: (.+)$/u,parse:(match)=>({status:"terminated",processId:Number.parseInt(match[1]??"",10)})},{regex:/^Command terminated by signal (.+?)\. Output is available at: (.+)$/u,parse:(match)=>({status:"terminated",signal:String(match[1]??"").trim()})}];function matchExecStatusLine(line){let normalizedLine=line.trim();if(!normalizedLine)return null;for(let matcher of execStatusLineMatchers){let match=matcher.regex.exec(normalizedLine);if(!match)continue;return matcher.parse(match)}return null}function stripExecStatusTrailer(text){let trimmed=text.replace(/\r/g,"").trimEnd();if(!trimmed)return{stdout:"",matchedLine:null};let lastNewlineIndex=trimmed.lastIndexOf(`
|
|
908
|
-
`),candidate=lastNewlineIndex>=0?trimmed.slice(lastNewlineIndex+1):trimmed;if(!matchExecStatusLine(candidate))return{stdout:trimmed,matchedLine:null};return{stdout:lastNewlineIndex>=0?trimmed.slice(0,lastNewlineIndex).replace(/\n+$/u,""):"",matchedLine:candidate}}function parseExecReceiptOutput(text){let receipt=text.replace(/\r/g,"").trim();if(!receipt)return{stdout:"",parsedStatus:null};if(receipt.includes("<persisted-output>")&&receipt.includes("</persisted-output>"))return{stdout:receipt,parsedStatus:null};let{stdout,matchedLine}=stripExecStatusTrailer(receipt);return{stdout,parsedStatus:matchedLine?matchExecStatusLine(matchedLine):null}}function shouldInferSpawnFailureExitCode(input){if(input.status!=="exited"||typeof input.exitCode==="number")return!1;let visibleOutput=input.stdout.trim();return visibleOutput.length>0&&visibleOutput!=="(No output)"}function cloneExecCommand(command){return typeof command==="string"?command:[...command]}function parseExecTextOnlyResult(result,fallback){let receipt=extractExecTextReceipt(result);if(!receipt)return null;if(receipt.includes("<persisted-output>")&&receipt.includes("</persisted-output>"))return{command:cloneExecCommand(fallback.command),commandPreview:fallback.commandPreview,cwd:fallback.cwd,stdout:receipt,stderr:"",exitCode:0,wallTimeMs:0,status:"exited"};let{stdout,parsedStatus}=parseExecReceiptOutput(receipt);if(!parsedStatus)return null;return{command:cloneExecCommand(fallback.command),commandPreview:fallback.commandPreview,cwd:fallback.cwd,stdout,stderr:"",...parsedStatus.processId!==void 0?{processId:parsedStatus.processId}:{},...parsedStatus.exitCode!==void 0?{exitCode:parsedStatus.exitCode}:{},...parsedStatus.signal?{signal:parsedStatus.signal}:{},...parsedStatus.timedOut===!0?{timedOut:!0}:{},wallTimeMs:0,status:parsedStatus.status}}function parseOptionalPositiveIntegerArg(args,key){if(!hasOwn(args,key))return{present:!1};let value=args[key];if(typeof value==="number"&&Number.isInteger(value)&&value>0)return{present:!0,value};if(typeof value==="string"){let trimmed=value.trim();if(/^\d+$/.test(trimmed)){let parsed=Number.parseInt(trimmed,10);if(Number.isSafeInteger(parsed)&&parsed>0)return{present:!0,value:parsed}}}return{present:!0}}function readOptionalPositiveIntegerArg(arg,key){if(!arg.present)return;if(typeof arg.value==="number")return arg.value;throw new ExecToolError("exec_invalid_request",`exec ${key} must be a positive integer.`)}function readOptionalYieldTimeMsArg(args){let value=args.yieldTimeMs;if(value===void 0)return;if(typeof value==="number"&&Number.isInteger(value)&&value>=1&&value<=
|
|
908
|
+
`),candidate=lastNewlineIndex>=0?trimmed.slice(lastNewlineIndex+1):trimmed;if(!matchExecStatusLine(candidate))return{stdout:trimmed,matchedLine:null};return{stdout:lastNewlineIndex>=0?trimmed.slice(0,lastNewlineIndex).replace(/\n+$/u,""):"",matchedLine:candidate}}function parseExecReceiptOutput(text){let receipt=text.replace(/\r/g,"").trim();if(!receipt)return{stdout:"",parsedStatus:null};if(receipt.includes("<persisted-output>")&&receipt.includes("</persisted-output>"))return{stdout:receipt,parsedStatus:null};let{stdout,matchedLine}=stripExecStatusTrailer(receipt);return{stdout,parsedStatus:matchedLine?matchExecStatusLine(matchedLine):null}}function shouldInferSpawnFailureExitCode(input){if(input.status!=="exited"||typeof input.exitCode==="number")return!1;let visibleOutput=input.stdout.trim();return visibleOutput.length>0&&visibleOutput!=="(No output)"}function cloneExecCommand(command){return typeof command==="string"?command:[...command]}function parseExecTextOnlyResult(result,fallback){let receipt=extractExecTextReceipt(result);if(!receipt)return null;if(receipt.includes("<persisted-output>")&&receipt.includes("</persisted-output>"))return{command:cloneExecCommand(fallback.command),commandPreview:fallback.commandPreview,cwd:fallback.cwd,stdout:receipt,stderr:"",exitCode:0,wallTimeMs:0,status:"exited"};let{stdout,parsedStatus}=parseExecReceiptOutput(receipt);if(!parsedStatus)return null;return{command:cloneExecCommand(fallback.command),commandPreview:fallback.commandPreview,cwd:fallback.cwd,stdout,stderr:"",...parsedStatus.processId!==void 0?{processId:parsedStatus.processId}:{},...parsedStatus.exitCode!==void 0?{exitCode:parsedStatus.exitCode}:{},...parsedStatus.signal?{signal:parsedStatus.signal}:{},...parsedStatus.timedOut===!0?{timedOut:!0}:{},wallTimeMs:0,status:parsedStatus.status}}function parseOptionalPositiveIntegerArg(args,key){if(!hasOwn(args,key))return{present:!1};let value=args[key];if(typeof value==="number"&&Number.isInteger(value)&&value>0)return{present:!0,value};if(typeof value==="string"){let trimmed=value.trim();if(/^\d+$/.test(trimmed)){let parsed=Number.parseInt(trimmed,10);if(Number.isSafeInteger(parsed)&&parsed>0)return{present:!0,value:parsed}}}return{present:!0}}function readOptionalPositiveIntegerArg(arg,key){if(!arg.present)return;if(typeof arg.value==="number")return arg.value;throw new ExecToolError("exec_invalid_request",`exec ${key} must be a positive integer.`)}function readOptionalYieldTimeMsArg(args){let value=args.yieldTimeMs;if(value===void 0)return;if(typeof value==="number"&&Number.isInteger(value)&&value>=1&&value<=MAX_YIELD_TIME_MS2)return value;throw new ExecToolError("exec_invalid_request",`exec yieldTimeMs must be an integer between 1 and ${MAX_YIELD_TIME_MS2}.`)}function readOptionalBooleanArg2(args,key){let value=args[key];if(value===void 0)return;if(typeof value==="boolean")return value;throw new ExecToolError("exec_invalid_request",`exec ${key} must be a boolean.`)}function readOptionalCommandArg2(args){let value=args.command;if(value===void 0)return;if(!Array.isArray(value))throw new ExecToolError("exec_invalid_request","command must be a string array");if(value.some((part)=>typeof part!=="string"))throw new ExecToolError("exec_invalid_request","exec command entries must all be strings.");return[...value]}function assertStartCommand(command){if(!Array.isArray(command)||command.length===0)throw new ExecToolError("exec_invalid_request","exec requires a non-empty command.");if(command.some((part)=>typeof part!=="string"))throw new ExecToolError("exec_invalid_request","exec command entries must all be strings.");if(!String(command[0]??"").trim())throw new ExecToolError("exec_invalid_request","exec command[0] must be a non-empty string.");return validateCommandUsage2(command),[...command]}function validateCommandUsage2(command){if(hasShellBackgroundMarker2(command))throw new ExecToolError("exec_invalid_request","exec manages background tasks; remove shell background markers such as & and set runInBackground to true when the result can be handled later.");if(hasSleepThenCheck2(command))throw new ExecToolError("exec_invalid_request","exec waits for managed tasks through completion notifications; remove sleep-and-check commands and wait for the task notification before reading outputPath.")}function hasShellBackgroundMarker2(command){if(command.some((part)=>part.trim()==="&"))return!0;let shellScript=readShellScript2(command);if(!shellScript)return!1;return/(?<![<>&])&(?![&\d])/.test(stripQuotedShellText2(shellScript))}function hasSleepThenCheck2(command){let shellScript=readShellScript2(command);if(!shellScript)return!1;return/(?:^|[;&|()\s])sleep\s+\d+(?:\.\d+)?[smhd]?\s*(?:&&|;)/.test(shellScript)}function readShellScript2(command){let executable=path12.basename(command[0]??"").toLowerCase();if(!["sh","bash","zsh","fish","dash","ksh"].includes(executable))return;let commandFlagIndex=command.findIndex((part,index)=>index>0&&part.startsWith("-")&&part.includes("c"));if(commandFlagIndex<0)return;let script=command[commandFlagIndex+1];return typeof script==="string"?script:void 0}function stripQuotedShellText2(script){let output="",quote,escaping=!1;for(let char of script){if(escaping){output+=" ",escaping=!1;continue}if(char==="\\"){output+=" ",escaping=quote!=="'";continue}if(quote){if(char===quote)quote=void 0;output+=" ";continue}if(char==="'"||char==='"'){quote=char,output+=" ";continue}output+=char}return output}function assertProcessId2(processId){if(typeof processId!=="number"||!Number.isInteger(processId)||processId<=0)throw new ExecToolError("exec_invalid_request","exec processId must be a positive integer.");return processId}function resolveCompatExecAction(args,processIdArg){let explicitAction=args.action;if(explicitAction==="start"||explicitAction==="poll"||explicitAction==="terminate")return explicitAction;let hasCommand=hasOwn(args,"command"),processId=processIdArg.value;if(hasCommand&&!processIdArg.present)return"start";if(!hasCommand&&typeof processId==="number")return"poll";if(!hasCommand)return null;if(typeof processId!=="number")return"start";let preview=formatExecCommandPreview(args.command);if(preview===`Poll process ${processId}`)return"poll";if(preview===`Terminate process ${processId}`)return"terminate";return"start"}function validateExecArgs2(action,input){if(action==="start"){assertStartCommand(input.command);return}assertProcessId2(input.processId)}function countWrittenLines(chunk){if(!chunk)return 0;return chunk.split(`
|
|
909
909
|
`).length-1}function textResult(text,structuredContent,isError){let result={content:[{type:"text",text}]};if(structuredContent)result.structuredContent=structuredContent;if(isError)result.isError=!0;return createToolResult(result)}function formatExecFallbackText(result){let availableAt=result.outputPath?` Output is available at: ${result.outputPath}`:"",writtenTo=result.outputPath?` Output is being written to: ${result.outputPath}`:"",taskId=result.taskId??result.processId??"unknown";if(result.status==="running")return`Command running with task ID: ${taskId}. It is still running; you will be notified when it completes.${writtenTo}`;if(result.status==="terminated"){if(result.timedOut===!0)return`Command timed out${result.timeoutMs?` after ${result.timeoutMs} ms`:""}.${availableAt}`;return`Command terminated${result.signal?` by signal ${result.signal}`:""}.${availableAt}`}return`Command exited with code ${result.exitCode??-1}.${availableAt}`}function formatExecToolResultText(result){let outputText=[result.stdout,result.stderr].filter(Boolean).join(result.stdout&&result.stderr?`
|
|
910
910
|
`:"");return renderExecOutput2({output:outputText,statusInfo:formatExecFallbackText(result),includeStatusInfo:!isSuccessfulExitedResult2(result),emptyOutputInfo:"(No output)",outputPath:result.outputPath??"",outputTruncated:result.outputTruncated})}function isSuccessfulExitedResult2(result){return result.status==="exited"&&(result.exitCode??0)===0}function isExecFailureResult2(result){if(result.status==="running")return!1;return result.timedOut===!0||result.status==="terminated"||(result.exitCode??0)!==0}function createPayloadStatus2(result){if(result.status==="running")return"running";if(result.status==="terminated")return result.timedOut===!0?"timed_out":"killed";return(result.exitCode??0)===0?"completed":"failed"}function renderExecOutput2(input){let output=formatCollectedProcessOutput2(input.output),statusInfo=input.includeStatusInfo===!1?void 0:input.statusInfo,emptyOutputInfo=output||statusInfo?void 0:input.emptyOutputInfo,saveLimitInfo=input.outputTruncated===!0?"Output file reached the 64.0 MB save limit; additional process output was not saved.":void 0,renderedText=[output,statusInfo,emptyOutputInfo,saveLimitInfo].filter(Boolean).join(`
|
|
911
911
|
`);if(renderedText.length<=EXEC_INLINE_OUTPUT_CHAR_LIMIT)return renderedText;let preview=generatePreview2(renderedText,EXEC_PREVIEW_SIZE_CHARS2),suffix=preview.hasMore?`
|
|
912
912
|
...`:"";return["<persisted-output>",`Output too large (${formatByteSize2(Buffer.byteLength(renderedText,"utf8"))}). Full output saved to: ${input.outputPath}`,"",`Preview (first ${formatByteSize2(EXEC_PREVIEW_SIZE_CHARS2)}):`,`${preview.preview}${suffix}`,"</persisted-output>"].join(`
|
|
913
913
|
`)}function generatePreview2(content,maxChars=EXEC_PREVIEW_SIZE_CHARS2){if(content.length<=maxChars)return{preview:content,hasMore:!1};let lastNewline=content.slice(0,maxChars).lastIndexOf(`
|
|
914
|
-
`),cutPoint=lastNewline>maxChars*0.5?lastNewline:maxChars;return{preview:content.slice(0,cutPoint),hasMore:!0}}function formatByteSize2(bytes){if(bytes<1024)return`${bytes} B`;let kib=bytes/1024;if(kib<1024)return`${kib.toFixed(1)} KB`;return`${(kib/1024).toFixed(1)} MB`}function formatCollectedProcessOutput2(output){if(!output)return"";return output.replace(/^(\s*\n)+/,"").trimEnd()}function buildStructuredContent(result){let isRunning=result.status==="running",taskId=result.taskId??result.processId,structuredContent={type:isRunning?"running":"finished",status:createPayloadStatus2(result),command:Array.isArray(result.command)?[...result.command]:result.command,cwd:result.cwd,outputPath:result.outputPath??"",outputBytes:result.outputBytes??0,outputTruncated:result.outputTruncated??!1,wallTimeMs:result.wallTimeMs};if(typeof result.chunkId==="string")structuredContent.chunkId=result.chunkId;if(typeof taskId==="number")structuredContent.taskId=taskId;if(typeof result.exitCode==="number")structuredContent.exitCode=result.exitCode;if(typeof result.signal==="string"&&result.signal)structuredContent.signal=result.signal;if(result.timedOut===!0)structuredContent.timedOut=!0;if(typeof result.timeoutMs==="number")structuredContent.timeoutMs=result.timeoutMs;if(isRunning)structuredContent.runInBackground=result.runInBackground===!0,structuredContent.notification="completion-will-be-sent";else if(typeof result.runInBackground==="boolean")structuredContent.runInBackground=result.runInBackground;return structuredContent}function buildShellCommand(command){if(process3.platform==="win32")return{file:process3.env.ComSpec||"cmd.exe",args:["/d","/s","/c",command]};return{file:process3.env.SHELL||"/bin/sh",args:["-lc",command]}}function parseExecRequest(args,input){let sessionId=typeof input.sessionId==="string"&&input.sessionId.trim()?input.sessionId:"anonymous";if(input.allowLifecycleActions!==!0){let unsupportedKeys=["action","processId","timeoutMs","yieldTimeMs"].filter((key)=>hasOwn(args,key));if(unsupportedKeys.length>0)throw new ExecToolError("exec_invalid_request",`exec accepts command, cwd, and runInBackground; remove ${unsupportedKeys.join(", ")}.`);let command2=assertStartCommand(readOptionalCommandArg2(args)),runInBackground2=readOptionalBooleanArg2(args,"runInBackground"),cwd2=typeof args.cwd==="string"&&args.cwd.trim().length>0?args.cwd:input.cwd??process3.cwd();return{sessionId,action:"start",cwd:cwd2,command:command2,...runInBackground2!==void 0?{runInBackground:runInBackground2}:{},...input.outputRoot?{outputRoot:input.outputRoot}:{},...input.signal?{signal:input.signal}:{}}}let processIdArg=parseOptionalPositiveIntegerArg(args,"processId"),action=resolveCompatExecAction(args,processIdArg);if(!action)throw new ExecToolError("exec_invalid_request","exec requires either command for start or processId for poll.");let command=action==="start"?readOptionalCommandArg2(args):void 0,processId=action==="start"?void 0:readOptionalPositiveIntegerArg(processIdArg,"processId"),timeoutMs=action==="start"?readOptionalPositiveIntegerArg(parseOptionalPositiveIntegerArg(args,"timeoutMs"),"timeoutMs"):void 0,yieldTimeMs=readOptionalYieldTimeMsArg(args),runInBackground=action==="start"?readOptionalBooleanArg2(args,"runInBackground"):void 0,cwd=action==="start"&&typeof args.cwd==="string"&&args.cwd.trim().length>0?args.cwd:input.cwd??process3.cwd();return validateExecArgs2(action,{command,processId}),{sessionId,action,cwd,...action==="start"?{command:assertStartCommand(command)}:{processId:assertProcessId3(processId)},...timeoutMs!==void 0?{timeoutMs}:{},...yieldTimeMs!==void 0?{yieldTimeMs}:{},...runInBackground!==void 0?{runInBackground}:{},...input.outputRoot?{outputRoot:input.outputRoot}:{},...input.signal?{signal:input.signal}:{}}}function buildReadOnlyExecRejection(request){if(request.action!=="start"){let structuredContent2={code:"exec_read_only_rejected",status:"terminated"};if(typeof request.processId==="number")structuredContent2.processId=request.processId;return textResult("Read-only exec rejected: background process management is not allowed",structuredContent2,!0)}let readonlyCommand=formatExecCommandPreview(request.command),validation=normalizeReadonlyShellCommand(readonlyCommand);if(validation.isAllowed)return null;let structuredContent={code:"exec_read_only_rejected",commandPreview:readonlyCommand,stdout:"",stderr:validation.reason??"Command is not allowed",wallTimeMs:0,status:"terminated"};if(request.command!==void 0)structuredContent.command=Array.isArray(request.command)?[...request.command]:request.command;if(request.cwd)structuredContent.cwd=request.cwd;return textResult(`Read-only exec rejected: ${validation.reason??"Command is not allowed"}`,structuredContent,!0)}async function emitExecOutputEvents(context,result){if(!context.emitEvent)return;let emitChunk=async(chunk,isStderr)=>{if(!chunk)return;await Promise.resolve(context.emitEvent?.({pluginId:EXEC_PLUGIN_ID,event:EXEC_OUTPUT_EVENT,data:{chunk,isStderr,linesWritten:countWrittenLines(chunk)}}))};await emitChunk(result.stdout,!1),await emitChunk(result.stderr,!0)}function buildExecToolResult(result){return textResult(formatExecToolResultText(result),buildStructuredContent(result),isExecFailureResult2(result))}function normalizeExecToolError(error48){if(error48 instanceof Error&&error48.name==="AbortError")throw error48;let toolError=error48,message=(typeof toolError.data?.details==="string"&&toolError.data.details.trim()?toolError.data.details.trim():"")||(error48 instanceof Error?error48.message:String(error48)),code=typeof toolError.code==="string"?toolError.code:error48 instanceof ExecToolError?error48.code:"exec_invalid_request";return textResult(message,{code},!0)}function normalizeExecTerminalStatus(status){if(status==="running"||status==="exited"||status==="terminated")return status;if(status==="completed"||status==="failed")return"exited";if(status==="timed_out"||status==="killed")return"terminated";return"exited"}function parseExecStructuredContent(result,fallback){let structured=result.structuredContent??{};if(hasExecStructuredShape(structured)){let rawCommand=(()=>{let value=structured.command;if(typeof fallback.command==="string")return fallback.command;if(Array.isArray(value)&&value.every((part)=>typeof part==="string"))return[...value];if(typeof value==="string")return value;return[...fallback.command]})(),status=normalizeExecTerminalStatus(structured.status),hasStructuredStdout=typeof structured.stdout==="string",hasStructuredStderr=typeof structured.stderr==="string",textOutput=hasStructuredStdout||hasStructuredStderr?{stdout:"",parsedStatus:null}:parseExecReceiptOutput(extractExecTextReceipt(result)),stdout=hasStructuredStdout?structured.stdout:textOutput.stdout,stderr=hasStructuredStderr?structured.stderr:"",exitCode=(typeof structured.exitCode==="number"?structured.exitCode:void 0)??textOutput.parsedStatus?.exitCode,canonicalExitCode=shouldInferSpawnFailureExitCode({exitCode,status,stdout})?-1:exitCode,taskId=typeof structured.taskId==="number"&&Number.isInteger(structured.taskId)&&structured.taskId>0?structured.taskId:void 0,processId=typeof structured.processId==="number"&&Number.isInteger(structured.processId)&&structured.processId>0?structured.processId:typeof taskId==="number"?taskId:typeof textOutput.parsedStatus?.processId==="number"?textOutput.parsedStatus.processId:void 0;return{...typeof structured.chunkId==="string"?{chunkId:structured.chunkId}:{},command:rawCommand,commandPreview:typeof structured.commandPreview==="string"&&structured.commandPreview.trim().length>0?structured.commandPreview:fallback.commandPreview,cwd:typeof structured.cwd==="string"&&structured.cwd.trim().length>0?structured.cwd:fallback.cwd,stdout,stderr,...typeof taskId==="number"?{taskId}:{},...typeof processId==="number"?{processId}:{},...typeof canonicalExitCode==="number"?{exitCode:canonicalExitCode}:{},...typeof structured.signal==="string"&&structured.signal.trim()?{signal:structured.signal}:textOutput.parsedStatus?.signal?{signal:textOutput.parsedStatus.signal}:{},...structured.timedOut===!0||textOutput.parsedStatus?.timedOut===!0?{timedOut:!0}:{},...typeof structured.outputPath==="string"?{outputPath:structured.outputPath}:{},...typeof structured.outputBytes==="number"&&Number.isFinite(structured.outputBytes)?{outputBytes:structured.outputBytes}:{},...typeof structured.outputTruncated==="boolean"?{outputTruncated:structured.outputTruncated}:{},...typeof structured.timeoutMs==="number"&&Number.isFinite(structured.timeoutMs)?{timeoutMs:structured.timeoutMs}:{},...typeof structured.runInBackground==="boolean"?{runInBackground:structured.runInBackground}:{},...structured.notification==="completion-will-be-sent"?{notification:structured.notification}:{},wallTimeMs:typeof structured.wallTimeMs==="number"&&Number.isFinite(structured.wallTimeMs)?structured.wallTimeMs:0,status}}let textOnlyResult=parseExecTextOnlyResult(result,fallback);if(textOnlyResult)return textOnlyResult;if(result.isError===!0){let code=typeof structured.code==="string"?structured.code:"exec_invalid_request",message2=readToolResultText(result)||"Tool execution failed";throw new ExecToolError(code,message2)}let message=extractExecTextReceipt(result)||"Tool execution failed";throw new ExecToolError("exec_invalid_request",message)}function registerExecSessionDisposer(sessionId,disposer){let normalizedSessionId=String(sessionId??"").trim();if(!normalizedSessionId)return()=>{};let entry=execSessionDisposers.get(normalizedSessionId)??{disposers:new Set};return entry.disposers.add(disposer),execSessionDisposers.set(normalizedSessionId,entry),scheduleExecSessionDisposerExpiry(normalizedSessionId,entry),()=>{let current=execSessionDisposers.get(normalizedSessionId);if(!current)return;if(current.disposers.delete(disposer),current.disposers.size===0){clearExecSessionDisposerTimeout(current),execSessionDisposers.delete(normalizedSessionId);return}scheduleExecSessionDisposerExpiry(normalizedSessionId,current)}}function touchExecSessionDisposers(sessionId){let normalizedSessionId=String(sessionId??"").trim();if(!normalizedSessionId)return;let entry=execSessionDisposers.get(normalizedSessionId);if(!entry)return;scheduleExecSessionDisposerExpiry(normalizedSessionId,entry)}async function disposeExecSessionProcesses(sessionId){await Promise.allSettled([runExecSessionDisposers(sessionId),disposeManagedExecSession(sessionId)])}function drainExecTaskNotifications(sessionId){return drainManagedExecTaskNotifications(sessionId)}init_dist13();var GENERIC_SUBAGENT_TYPE="subagent",SUBAGENT_CHILDREN_METADATA_KEY="_dimSubagentChildren",DELEGATION_RECORDED_FINAL_MESSAGE="Delegation recorded. The host runtime will execute subagents and continue from their results.";function readSubagentMarker(metadata){return metadata?._dimSubagent}function isSubagentContext(metadata){return readSubagentMarker(metadata)!==void 0}function isSubagentParentReplayContext(metadata){return!!metadata?._subagentResult}function isDelegationRecordedFinalMessage(value){return String(value??"").trim()==="Delegation recorded. The host runtime will execute subagents and continue from their results."}function buildSubagentSystemPrompt(baseSystemPrompt,input){return[baseSystemPrompt.trim(),"You are operating as a collaborating subagent with an independent context window.","Take on work that can be done in parallel and is self-contained.","Use the same general engineering standards as the main agent.","Do not ask the user questions directly.","Do not start nested subagents.",input.description?`Subagent task: ${input.description}`:void 0,"","<subagent_env>",` Working directory: ${input.cwd}`,` Platform: ${process.platform}`,` Today's date: ${(input.now??new Date).toDateString()}`,"</subagent_env>"].filter(Boolean).join(`
|
|
914
|
+
`),cutPoint=lastNewline>maxChars*0.5?lastNewline:maxChars;return{preview:content.slice(0,cutPoint),hasMore:!0}}function formatByteSize2(bytes){if(bytes<1024)return`${bytes} B`;let kib=bytes/1024;if(kib<1024)return`${kib.toFixed(1)} KB`;return`${(kib/1024).toFixed(1)} MB`}function formatCollectedProcessOutput2(output){if(!output)return"";return output.replace(/^(\s*\n)+/,"").trimEnd()}function buildStructuredContent(result){let isRunning=result.status==="running",taskId=result.taskId??result.processId,structuredContent={type:isRunning?"running":"finished",status:createPayloadStatus2(result),command:Array.isArray(result.command)?[...result.command]:result.command,cwd:result.cwd,outputPath:result.outputPath??"",outputBytes:result.outputBytes??0,outputTruncated:result.outputTruncated??!1,wallTimeMs:result.wallTimeMs};if(typeof result.chunkId==="string")structuredContent.chunkId=result.chunkId;if(typeof taskId==="number")structuredContent.taskId=taskId;if(typeof result.exitCode==="number")structuredContent.exitCode=result.exitCode;if(typeof result.signal==="string"&&result.signal)structuredContent.signal=result.signal;if(result.timedOut===!0)structuredContent.timedOut=!0;if(typeof result.timeoutMs==="number")structuredContent.timeoutMs=result.timeoutMs;if(isRunning)structuredContent.runInBackground=result.runInBackground===!0,structuredContent.notification="completion-will-be-sent";else if(typeof result.runInBackground==="boolean")structuredContent.runInBackground=result.runInBackground;return structuredContent}function buildShellCommand(command){if(process3.platform==="win32")return{file:process3.env.ComSpec||"cmd.exe",args:["/d","/s","/c",command]};return{file:process3.env.SHELL||"/bin/sh",args:["-lc",command]}}function parseExecRequest(args,input){let sessionId=typeof input.sessionId==="string"&&input.sessionId.trim()?input.sessionId:"anonymous";if(input.allowLifecycleActions!==!0){let unsupportedKeys=["action","processId","timeoutMs","yieldTimeMs"].filter((key)=>hasOwn(args,key));if(unsupportedKeys.length>0)throw new ExecToolError("exec_invalid_request",`exec accepts command, cwd, and runInBackground; remove ${unsupportedKeys.join(", ")}.`);let command2=assertStartCommand(readOptionalCommandArg2(args)),runInBackground2=readOptionalBooleanArg2(args,"runInBackground"),cwd2=typeof args.cwd==="string"&&args.cwd.trim().length>0?args.cwd:input.cwd??process3.cwd();return{sessionId,action:"start",cwd:cwd2,command:command2,...runInBackground2!==void 0?{runInBackground:runInBackground2}:{},...input.outputRoot?{outputRoot:input.outputRoot}:{},...input.signal?{signal:input.signal}:{}}}let processIdArg=parseOptionalPositiveIntegerArg(args,"processId"),action=resolveCompatExecAction(args,processIdArg);if(!action)throw new ExecToolError("exec_invalid_request","exec requires either command for start or processId for poll.");let command=action==="start"?readOptionalCommandArg2(args):void 0,processId=action==="start"?void 0:readOptionalPositiveIntegerArg(processIdArg,"processId"),timeoutMs=action==="start"?readOptionalPositiveIntegerArg(parseOptionalPositiveIntegerArg(args,"timeoutMs"),"timeoutMs"):void 0,yieldTimeMs=readOptionalYieldTimeMsArg(args),runInBackground=action==="start"?readOptionalBooleanArg2(args,"runInBackground"):void 0,cwd=action==="start"&&typeof args.cwd==="string"&&args.cwd.trim().length>0?args.cwd:input.cwd??process3.cwd();return validateExecArgs2(action,{command,processId}),{sessionId,action,cwd,...action==="start"?{command:assertStartCommand(command)}:{processId:assertProcessId2(processId)},...timeoutMs!==void 0?{timeoutMs}:{},...yieldTimeMs!==void 0?{yieldTimeMs}:{},...runInBackground!==void 0?{runInBackground}:{},...input.outputRoot?{outputRoot:input.outputRoot}:{},...input.signal?{signal:input.signal}:{}}}function buildReadOnlyExecRejection(request){if(request.action!=="start"){let structuredContent2={code:"exec_read_only_rejected",status:"terminated"};if(typeof request.processId==="number")structuredContent2.processId=request.processId;return textResult("Read-only exec rejected: background process management is not allowed",structuredContent2,!0)}let readonlyCommand=formatExecCommandPreview(request.command),validation=normalizeReadonlyShellCommand(readonlyCommand);if(validation.isAllowed)return null;let structuredContent={code:"exec_read_only_rejected",commandPreview:readonlyCommand,stdout:"",stderr:validation.reason??"Command is not allowed",wallTimeMs:0,status:"terminated"};if(request.command!==void 0)structuredContent.command=Array.isArray(request.command)?[...request.command]:request.command;if(request.cwd)structuredContent.cwd=request.cwd;return textResult(`Read-only exec rejected: ${validation.reason??"Command is not allowed"}`,structuredContent,!0)}async function emitExecOutputEvents(context,result){if(!context.emitEvent)return;let emitChunk=async(chunk,isStderr)=>{if(!chunk)return;await Promise.resolve(context.emitEvent?.({pluginId:EXEC_PLUGIN_ID,event:EXEC_OUTPUT_EVENT,data:{chunk,isStderr,linesWritten:countWrittenLines(chunk)}}))};await emitChunk(result.stdout,!1),await emitChunk(result.stderr,!0)}function buildExecToolResult(result){return textResult(formatExecToolResultText(result),buildStructuredContent(result),isExecFailureResult2(result))}function normalizeExecToolError(error48){if(error48 instanceof Error&&error48.name==="AbortError")throw error48;let toolError=error48,message=(typeof toolError.data?.details==="string"&&toolError.data.details.trim()?toolError.data.details.trim():"")||(error48 instanceof Error?error48.message:String(error48)),code=typeof toolError.code==="string"?toolError.code:error48 instanceof ExecToolError?error48.code:"exec_invalid_request";return textResult(message,{code},!0)}function normalizeExecTerminalStatus(status){if(status==="running"||status==="exited"||status==="terminated")return status;if(status==="completed"||status==="failed")return"exited";if(status==="timed_out"||status==="killed")return"terminated";return"exited"}function parseExecStructuredContent(result,fallback){let structured=result.structuredContent??{};if(hasExecStructuredShape(structured)){let rawCommand=(()=>{let value=structured.command;if(typeof fallback.command==="string")return fallback.command;if(Array.isArray(value)&&value.every((part)=>typeof part==="string"))return[...value];if(typeof value==="string")return value;return[...fallback.command]})(),status=normalizeExecTerminalStatus(structured.status),hasStructuredStdout=typeof structured.stdout==="string",hasStructuredStderr=typeof structured.stderr==="string",textOutput=hasStructuredStdout||hasStructuredStderr?{stdout:"",parsedStatus:null}:parseExecReceiptOutput(extractExecTextReceipt(result)),stdout=hasStructuredStdout?structured.stdout:textOutput.stdout,stderr=hasStructuredStderr?structured.stderr:"",exitCode=(typeof structured.exitCode==="number"?structured.exitCode:void 0)??textOutput.parsedStatus?.exitCode,canonicalExitCode=shouldInferSpawnFailureExitCode({exitCode,status,stdout})?-1:exitCode,taskId=typeof structured.taskId==="number"&&Number.isInteger(structured.taskId)&&structured.taskId>0?structured.taskId:void 0,processId=typeof structured.processId==="number"&&Number.isInteger(structured.processId)&&structured.processId>0?structured.processId:typeof taskId==="number"?taskId:typeof textOutput.parsedStatus?.processId==="number"?textOutput.parsedStatus.processId:void 0;return{...typeof structured.chunkId==="string"?{chunkId:structured.chunkId}:{},command:rawCommand,commandPreview:typeof structured.commandPreview==="string"&&structured.commandPreview.trim().length>0?structured.commandPreview:fallback.commandPreview,cwd:typeof structured.cwd==="string"&&structured.cwd.trim().length>0?structured.cwd:fallback.cwd,stdout,stderr,...typeof taskId==="number"?{taskId}:{},...typeof processId==="number"?{processId}:{},...typeof canonicalExitCode==="number"?{exitCode:canonicalExitCode}:{},...typeof structured.signal==="string"&&structured.signal.trim()?{signal:structured.signal}:textOutput.parsedStatus?.signal?{signal:textOutput.parsedStatus.signal}:{},...structured.timedOut===!0||textOutput.parsedStatus?.timedOut===!0?{timedOut:!0}:{},...typeof structured.outputPath==="string"?{outputPath:structured.outputPath}:{},...typeof structured.outputBytes==="number"&&Number.isFinite(structured.outputBytes)?{outputBytes:structured.outputBytes}:{},...typeof structured.outputTruncated==="boolean"?{outputTruncated:structured.outputTruncated}:{},...typeof structured.timeoutMs==="number"&&Number.isFinite(structured.timeoutMs)?{timeoutMs:structured.timeoutMs}:{},...typeof structured.runInBackground==="boolean"?{runInBackground:structured.runInBackground}:{},...structured.notification==="completion-will-be-sent"?{notification:structured.notification}:{},wallTimeMs:typeof structured.wallTimeMs==="number"&&Number.isFinite(structured.wallTimeMs)?structured.wallTimeMs:0,status}}let textOnlyResult=parseExecTextOnlyResult(result,fallback);if(textOnlyResult)return textOnlyResult;if(result.isError===!0){let code=typeof structured.code==="string"?structured.code:"exec_invalid_request",message2=readToolResultText(result)||"Tool execution failed";throw new ExecToolError(code,message2)}let message=extractExecTextReceipt(result)||"Tool execution failed";throw new ExecToolError("exec_invalid_request",message)}function registerExecSessionDisposer(sessionId,disposer){let normalizedSessionId=String(sessionId??"").trim();if(!normalizedSessionId)return()=>{};let entry=execSessionDisposers.get(normalizedSessionId)??{disposers:new Set};return entry.disposers.add(disposer),execSessionDisposers.set(normalizedSessionId,entry),scheduleExecSessionDisposerExpiry(normalizedSessionId,entry),()=>{let current=execSessionDisposers.get(normalizedSessionId);if(!current)return;if(current.disposers.delete(disposer),current.disposers.size===0){clearExecSessionDisposerTimeout(current),execSessionDisposers.delete(normalizedSessionId);return}scheduleExecSessionDisposerExpiry(normalizedSessionId,current)}}function touchExecSessionDisposers(sessionId){let normalizedSessionId=String(sessionId??"").trim();if(!normalizedSessionId)return;let entry=execSessionDisposers.get(normalizedSessionId);if(!entry)return;scheduleExecSessionDisposerExpiry(normalizedSessionId,entry)}async function disposeExecSessionProcesses(sessionId){await Promise.allSettled([runExecSessionDisposers(sessionId),disposeManagedExecSession(sessionId)])}function drainExecTaskNotifications(sessionId){return drainManagedExecTaskNotifications(sessionId)}init_dist13();var GENERIC_SUBAGENT_TYPE="subagent",SUBAGENT_CHILDREN_METADATA_KEY="_dimSubagentChildren",DELEGATION_RECORDED_FINAL_MESSAGE="Delegation recorded. The host runtime will execute subagents and continue from their results.";function readSubagentMarker(metadata){return metadata?._dimSubagent}function isSubagentContext(metadata){return readSubagentMarker(metadata)!==void 0}function isSubagentParentReplayContext(metadata){return!!metadata?._subagentResult}function isDelegationRecordedFinalMessage(value){return String(value??"").trim()==="Delegation recorded. The host runtime will execute subagents and continue from their results."}function buildSubagentSystemPrompt(baseSystemPrompt,input){return[baseSystemPrompt.trim(),"You are operating as a collaborating subagent with an independent context window.","Take on work that can be done in parallel and is self-contained.","Use the same general engineering standards as the main agent.","Do not ask the user questions directly.","Do not start nested subagents.",input.description?`Subagent task: ${input.description}`:void 0,"","<subagent_env>",` Working directory: ${input.cwd}`,` Platform: ${process.platform}`,` Today's date: ${(input.now??new Date).toDateString()}`,"</subagent_env>"].filter(Boolean).join(`
|
|
915
915
|
`)}init_dist12();var promptCatalog=[{id:"system.intro.default",version:1,kind:"system-intro",stability:"canonical",summary:"Default system prompt intro.",variables:[],body:`You are DimCode, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.
|
|
916
916
|
`,sourcePath:"src/prompts/system/intro/default.prompt.md"},{id:"system.sections.capability-aware-guidance",version:2,kind:"system-section",stability:"canonical",summary:"Capability-aware guidance for the system prompt.",variables:[],body:`# Capability-aware guidance
|
|
917
917
|
|
|
@@ -1006,7 +1006,7 @@ ${formatConstraints(task.constraints)}`].filter(Boolean).join(`
|
|
|
1006
1006
|
|
|
1007
1007
|
\`\`\`json
|
|
1008
1008
|
${JSON.stringify(payload,null,2)}
|
|
1009
|
-
\`\`\``}function buildSubagentBatchFallbackParentInput(contexts){let payload={type:"subagent_result_batch",total:contexts.length,tasks:contexts.map((context)=>buildParentPayloadContextPayload(context))};return buildParentPayloadMessage("Subagent result batch package",payload)}function buildSubagentBatchFallbackSteer(){return["Integrate this subagent result batch now.","Use any successful child results and any failure details to continue the answer.","Do not stop only because one child failed unless the whole task is genuinely blocked.","Do not call delegate_tasks again while integrating this batch.","Use only the child results already provided in this replay."].join(" ")}function createDelegateTasksTool(){return new class extends BaseTool{constructor(){super({name:DELEGATE_TASKS_TOOL_NAME,description:renderPrompt("tools.delegate-tasks.description"),inputSchema:{type:"object",additionalProperties:!1,required:["goal","tasks"],properties:{goal:{type:"string",description:renderPrompt("tools.delegate-tasks.fields.goal")},tasks:{type:"array",minItems:1,maxItems:3,items:{type:"object",additionalProperties:!1,required:["instruction"],properties:{description:{type:"string",description:renderPrompt("tools.delegate-tasks.fields.task-description")},instruction:{type:"string",description:renderPrompt("tools.delegate-tasks.fields.task-instruction")},successCriteria:{type:"string",description:renderPrompt("tools.delegate-tasks.fields.task-success-criteria")},constraints:{type:"array",items:{type:"string"},description:renderPrompt("tools.delegate-tasks.fields.task-constraints")}}}}}}})}async execute(args,context){if(isSubagentContext(context.metadata))return textResult2("Nested delegate_tasks is unavailable inside a subagent. Return findings to the main agent instead.",{error:"nested_subagent_delegation_unsupported"},!0);if(isSubagentParentReplayContext(context.metadata))return textResult2("delegate_tasks is unavailable while integrating existing subagent results. Finish this package directly with the evidence already provided.",{error:"delegate_tasks_disabled_for_subagent_parent_replay"},!0);try{let intent=normalizeDelegationIntent(args);return textResult2(`Delegation intent recorded for ${intent.tasks.length} task(s).`,intent)}catch(error48){let message=error48 instanceof Error?error48.message:String(error48);return textResult2(`Invalid delegation intent: ${message}`,{error:message},!0)}}}}function buildDelegationFinalMessage(payload){return{...payload.assistantMessage,content:[{type:"text",text:DELEGATION_RECORDED_FINAL_MESSAGE}],toolCalls:void 0,stopReason:"final"}}function createDelegationFinalizerPlugin(){return{manifest:{id:"dim-agent-delegation-finalizer",version:"0.0.1",apiVersion:1,permissions:{},priority:100},setup(){return{hooks:[{descriptor:{name:"run.stop"},middleware:[({payload,context})=>{if(!payload.toolCalls.some((toolCall)=>toolCall.function.name===DELEGATE_TASKS_TOOL_NAME&&parseDelegationIntent(toolCall.function.arguments)!==void 0))return;if(isSubagentContext(context.metadata)||isSubagentParentReplayContext(context.metadata))return;return finalizeRun(buildDelegationFinalMessage(payload))}]}]}}}}var ACP_DELEGATION_PLUGIN_ID="acp-client-delegation",delegatedTerminalHandles=new Map,delegatedSessionUnregisters=new Map;function resolvePath(targetPath,cwd){if(!targetPath.trim())throw Error("path is required");if(path13.isAbsolute(targetPath))return path13.normalize(targetPath);return path13.resolve(cwd??process4.cwd(),targetPath)}function textResult3(text,structuredContent,isError){let result={content:[{type:"text",text}]};if(structuredContent)result.structuredContent=structuredContent;if(isError)result.isError=!0;return createToolResult(result)}function delegationErrorResult(error48,structuredContent){let delegatedError=error48,details=typeof delegatedError.data?.details==="string"&&delegatedError.data.details.trim()?delegatedError.data.details.trim():"",rpcMessage=typeof delegatedError.message==="string"&&delegatedError.message.trim()?delegatedError.message.trim():"",message=details||rpcMessage||"Tool execution failed",payload={...structuredContent??{}};if(delegatedError.code!==void 0)payload.code=delegatedError.code;if(rpcMessage)payload.rpcMessage=rpcMessage;if(details)payload.details=details;return textResult3(message,Object.keys(payload).length>0?payload:void 0,!0)}function clearDelegatedSession(sessionId){delegatedTerminalHandles.delete(sessionId);let unregister=delegatedSessionUnregisters.get(sessionId);if(!unregister)return;delegatedSessionUnregisters.delete(sessionId),unregister()}async function disposeDelegatedSession(sessionId){let entries=[...delegatedTerminalHandles.get(sessionId)?.values()??[]];clearDelegatedSession(sessionId),await Promise.allSettled(entries.map(async(entry)=>{if(entry.timeoutHandle)clearTimeout(entry.timeoutHandle);entry.terminating=!0,await entry.handle.kill().catch(()=>{}),await entry.handle.release().catch(()=>{})}))}function ensureDelegatedSessionRegistered(sessionId){if(delegatedSessionUnregisters.has(sessionId))return;delegatedSessionUnregisters.set(sessionId,registerExecSessionDisposer(sessionId,async()=>{await disposeDelegatedSession(sessionId)}))}function getDelegatedTerminalEntries(sessionId){let existing=delegatedTerminalHandles.get(sessionId);if(existing)return touchExecSessionDisposers(sessionId),existing;let created=new Map;return delegatedTerminalHandles.set(sessionId,created),ensureDelegatedSessionRegistered(sessionId),created}function maybeCleanupDelegatedSession(sessionId){if((delegatedTerminalHandles.get(sessionId)?.size??0)>0)return;clearDelegatedSession(sessionId)}function allocateDelegatedProcessId(sessionId){let entries=getDelegatedTerminalEntries(sessionId);for(let attempts=0;attempts<100;attempts+=1){let candidate=randomInt3(1000,100001);if(!entries.has(candidate))return candidate}throw new ExecToolError("exec_process_limit_exceeded",`Could not allocate exec process id for session ${sessionId}.`)}async function releaseDelegatedEntry(sessionId,processId){let entries=delegatedTerminalHandles.get(sessionId),entry=entries?.get(processId);if(!entries||!entry)return;if(entry.timeoutHandle)clearTimeout(entry.timeoutHandle);entries.delete(processId),await entry.handle.release().catch(()=>{}),maybeCleanupDelegatedSession(sessionId)}async function completeDelegatedEntry(sessionId,entry,result){if(appendManagedExecOutput(entry.outputRecord,result.output),entry.notifyOnTerminal&&entry.notifiedAt===void 0){entry.notifiedAt=Date.now();let status=createDelegatedTaskStatus(entry,result.exitCode);queueManagedExecTaskNotification(sessionId,{taskId:entry.processId,status,outputPath:entry.outputRecord.outputPath,summary:createExecTaskNotificationSummary({command:Array.isArray(entry.command)?entry.command:[entry.command],taskId:entry.processId,status,exitCode:result.exitCode,signal:result.signal,timeoutMs:void 0}),exitCode:result.exitCode,...result.signal?{signal:result.signal}:{}})}await releaseDelegatedEntry(sessionId,entry.processId)}function createDelegatedTaskStatus(entry,exitCode){if(entry.timedOut)return"timed_out";if(entry.terminating)return"killed";return exitCode===0?"completed":"failed"}function readDelegatedEntry(sessionId,processId){let entry=delegatedTerminalHandles.get(sessionId)?.get(processId)??null;if(entry)touchExecSessionDisposers(sessionId);return entry}async function waitForDelegatedTerminal(entry,yieldTimeMs,signal){let timeoutMs=typeof yieldTimeMs==="number"?yieldTimeMs:DEFAULT_YIELD_TIME_MS3;return await new Promise((resolve2,reject)=>{if(signal?.aborted){reject(Error("The operation was aborted."));return}let settled=!1,timer,onAbort,finalize2=(value,error48)=>{if(settled)return;if(settled=!0,timer)clearTimeout(timer);if(onAbort)signal?.removeEventListener("abort",onAbort);if(error48)reject(error48);else resolve2(value??{state:"running"})};onAbort=()=>finalize2(void 0,Error("The operation was aborted.")),signal?.addEventListener("abort",onAbort,{once:!0}),entry.exitPromise.then((result)=>finalize2({state:"done",...result}),(error48)=>finalize2(void 0,error48)),timer=setTimeout(()=>finalize2({state:"running"}),timeoutMs)})}async function delegateRead(conn,sessionId,toolCall,cwd){let args=toolCall.function?.arguments??{},rawPath=String(args.path??"").trim();if(!rawPath)return textResult3("Error: path argument is required",void 0,!0);let absolutePath=resolvePath(rawPath,cwd);try{let response=await conn.readTextFile({sessionId,path:absolutePath});return textResult3(response.content,{path:absolutePath,size:Buffer.byteLength(response.content,"utf8")})}catch(error48){return delegationErrorResult(error48,{path:absolutePath})}}async function delegateWrite(conn,sessionId,toolCall,cwd){let args=toolCall.function?.arguments??{},rawPath=String(args.path??"").trim(),content=String(args.content??"");if(!rawPath)return textResult3("Error: path argument is required",void 0,!0);let absolutePath=resolvePath(rawPath,cwd);try{return await conn.writeTextFile({sessionId,path:absolutePath,content}),textResult3(`Successfully wrote to ${absolutePath}`,{path:absolutePath,bytes:Buffer.byteLength(content,"utf8")})}catch(error48){return delegationErrorResult(error48,{path:absolutePath,bytes:Buffer.byteLength(content,"utf8")})}}class DelegatedExecBackend{conn;constructor(conn){this.conn=conn}async execute(request){if(request.action==="start")return await this.start(request);return await this.pollOrTerminate(request)}async start(request){let command=request.command??[],commandPreview=formatExecCommandPreview(command);if(!commandPreview)throw new ExecToolError("exec_invalid_request","Error: command argument is required");let spawnSpec=typeof command==="string"?(()=>{let spec=buildShellCommand(command);return{command:spec.file,args:spec.args}})():{command:command[0],args:command.slice(1)},handle,delegatedProcessId,waitStartedAt=Date.now();try{handle=await this.conn.createTerminal({sessionId:request.sessionId,command:spawnSpec.command,args:spawnSpec.args,cwd:request.cwd,env:[]}),delegatedProcessId=allocateDelegatedProcessId(request.sessionId);let outputRecord=createManagedExecOutputStoreRecord({sessionId:request.sessionId,processId:delegatedProcessId,rootDir:request.outputRoot}),entry={processId:delegatedProcessId,command:Array.isArray(command)?[...command]:command,commandPreview,cwd:request.cwd,handle,exitPromise:handle.waitForExit(),outputRecord,timedOut:!1,terminating:!1,notifyOnTerminal:!1};if(typeof request.timeoutMs==="number")entry.timeoutHandle=setTimeout(()=>{entry.timedOut=!0,entry.terminating=!0,entry.handle.kill().catch(()=>{})},request.timeoutMs);if(getDelegatedTerminalEntries(request.sessionId).set(delegatedProcessId,entry),request.runInBackground===!0)return entry.notifyOnTerminal=!0,entry.exitPromise.then((result)=>completeDelegatedEntry(request.sessionId,entry,{output:result.output,exitCode:result.exitCode,...entry.timedOut||entry.terminating?{signal:"SIGTERM"}:{}}),()=>releaseDelegatedEntry(request.sessionId,delegatedProcessId)).catch(()=>{}),{command:Array.isArray(entry.command)?[...entry.command]:entry.command,commandPreview:entry.commandPreview,cwd:entry.cwd,stdout:"",stderr:"",taskId:delegatedProcessId,processId:delegatedProcessId,outputPath:entry.outputRecord.outputPath,outputBytes:entry.outputRecord.outputBytes,outputTruncated:entry.outputRecord.outputTruncated,runInBackground:!0,notification:"completion-will-be-sent",wallTimeMs:Date.now()-waitStartedAt,status:"running"};let waited=await waitForDelegatedTerminal(entry,request.yieldTimeMs,request.signal);if(waited.state==="running")return entry.notifyOnTerminal=!0,entry.exitPromise.then((result)=>completeDelegatedEntry(request.sessionId,entry,{output:result.output,exitCode:result.exitCode,...entry.timedOut||entry.terminating?{signal:"SIGTERM"}:{}}),()=>releaseDelegatedEntry(request.sessionId,delegatedProcessId)).catch(()=>{}),{command:Array.isArray(entry.command)?[...entry.command]:entry.command,commandPreview:entry.commandPreview,cwd:entry.cwd,stdout:"",stderr:"",taskId:delegatedProcessId,processId:delegatedProcessId,outputPath:entry.outputRecord.outputPath,outputBytes:entry.outputRecord.outputBytes,outputTruncated:entry.outputRecord.outputTruncated,notification:"completion-will-be-sent",wallTimeMs:Date.now()-waitStartedAt,status:"running"};let signal=entry.timedOut?"SIGTERM":void 0;return await completeDelegatedEntry(request.sessionId,entry,{output:waited.output,exitCode:waited.exitCode,...signal?{signal}:{}}),{command:Array.isArray(entry.command)?[...entry.command]:entry.command,commandPreview:entry.commandPreview,cwd:entry.cwd,stdout:waited.output,stderr:"",taskId:delegatedProcessId,processId:delegatedProcessId,exitCode:waited.exitCode,...signal?{signal}:{},...entry.timedOut?{timedOut:!0}:{},outputPath:entry.outputRecord.outputPath,outputBytes:entry.outputRecord.outputBytes,outputTruncated:entry.outputRecord.outputTruncated,wallTimeMs:Date.now()-waitStartedAt,status:entry.timedOut?"terminated":"exited"}}catch(error48){if(delegatedProcessId!==void 0)await releaseDelegatedEntry(request.sessionId,delegatedProcessId);else await handle?.release().catch(()=>{});throw error48}}async pollOrTerminate(request){let processId=request.processId;if(typeof processId!=="number")throw new ExecToolError("exec_invalid_request",`Error: exec ${request.action} requires processId`);let entry=readDelegatedEntry(request.sessionId,processId);if(!entry)throw new ExecToolError("exec_process_not_found",`Exec process ${processId} was not found for session ${request.sessionId}.`);let waitStartedAt=Date.now();if(request.action==="terminate"&&!entry.terminating)entry.terminating=!0,await entry.handle.kill();let waited=await waitForDelegatedTerminal(entry,request.yieldTimeMs,request.signal);if(waited.state==="running")return{command:Array.isArray(entry.command)?[...entry.command]:entry.command,commandPreview:entry.commandPreview,cwd:entry.cwd,stdout:"",stderr:"",taskId:processId,processId,outputPath:entry.outputRecord.outputPath,outputBytes:entry.outputRecord.outputBytes,outputTruncated:entry.outputRecord.outputTruncated,notification:"completion-will-be-sent",wallTimeMs:Date.now()-waitStartedAt,status:"running"};let signal=entry.terminating?"SIGTERM":void 0;return await completeDelegatedEntry(request.sessionId,entry,{output:waited.output,exitCode:waited.exitCode,...signal?{signal}:{}}),{command:Array.isArray(entry.command)?[...entry.command]:entry.command,commandPreview:entry.commandPreview,cwd:entry.cwd,stdout:waited.output,stderr:"",taskId:processId,processId,exitCode:waited.exitCode,...signal?{signal}:{},...entry.timedOut?{timedOut:!0}:{},outputPath:entry.outputRecord.outputPath,outputBytes:entry.outputRecord.outputBytes,outputTruncated:entry.outputRecord.outputTruncated,wallTimeMs:Date.now()-waitStartedAt,status:entry.terminating||entry.timedOut?"terminated":"exited"}}}async function delegateExec(conn,sessionId,toolCall,cwd,readOnly,outputRoot){try{let request=parseExecRequest(toolCall.function?.arguments??{},{cwd,outputRoot,sessionId});if(readOnly){let rejection=buildReadOnlyExecRejection(request);if(rejection)return rejection}let result=await new DelegatedExecBackend(conn).execute(request);return buildExecToolResult(result)}catch(error48){return normalizeExecToolError(error48)}}function createAcpDelegationPlugin(ctx){return{manifest:{id:ACP_DELEGATION_PLUGIN_ID,version:"1.0.0",apiVersion:1,permissions:{},priority:10},setup(){return{hooks:[{descriptor:{name:"tool.beforeExecute"},middleware:[async({payload,context})=>{let toolName=String(payload?.toolCall?.function?.name??"").trim(),conn=ctx.getConnection();if(!conn)return;let sessionId=ctx.getSessionId(context.sessionId),cwd=context.cwd;if(toolName==="read"&&ctx.capabilities.fs.readTextFile){if(ctx.requestApproval){let decision=await ctx.requestApproval({sessionId,toolCall:payload.toolCall,cwd});if(decision.type==="denied")return{type:"deny",reason:decision.reason??"Permission denied by user"}}return{type:"provideResult",result:await delegateRead(conn,sessionId,payload.toolCall,cwd)}}if(toolName==="write"&&ctx.capabilities.fs.writeTextFile){if(ctx.requestApproval){let decision=await ctx.requestApproval({sessionId,toolCall:payload.toolCall,cwd});if(decision.type==="denied")return{type:"deny",reason:decision.reason??"Permission denied by user"}}return{type:"provideResult",result:await delegateWrite(conn,sessionId,payload.toolCall,cwd)}}if(toolName==="exec"&&ctx.capabilities.terminal){if(ctx.requestApproval){let decision=await ctx.requestApproval({sessionId,toolCall:payload.toolCall,cwd});if(decision.type==="denied")return{type:"deny",reason:decision.reason??"Permission denied by user"}}return{type:"provideResult",result:await delegateExec(conn,sessionId,payload.toolCall,cwd,context.metadata?.dimAgentReadOnlyExec===!0,context.hostDataDir)}}return}]}]}}}}import{access,readFile as readFile5,writeFile as writeFile5}from"node:fs/promises";import path14 from"node:path";import{fileURLToPath as fileURLToPath2}from"node:url";var dimPluginApiPatchPromises=new Map;async function pathExists(filePath){try{return await access(filePath),!0}catch{return!1}}function normalizePackageJson(raw){try{let parsed=JSON.parse(raw);if(parsed&&typeof parsed==="object"&&!Array.isArray(parsed))return parsed}catch{}return null}function getDefaultSearchStart(){return path14.dirname(fileURLToPath2(import.meta.url))}async function findDimPluginApiPackageJson(startDir){let current=path14.resolve(startDir);while(!0){let candidate=path14.join(current,"node_modules","@archships","dim-plugin-api","package.json");if(await pathExists(candidate))return candidate;let parent=path14.dirname(current);if(parent===current)return null;current=parent}}async function patchDimPluginApiPackageJson(packageJsonPath){let raw=await readFile5(packageJsonPath,"utf8"),parsed=normalizePackageJson(raw);if(!parsed)return!1;let exportsField=parsed.exports;if(!exportsField||typeof exportsField!=="object"||Array.isArray(exportsField))return!1;let rootExport=exportsField["."];if(!rootExport||typeof rootExport!=="object"||Array.isArray(rootExport))return!1;let exportRecord=rootExport;if(exportRecord.bun!=="./src/index.ts")return!1;let packageDir=path14.dirname(packageJsonPath),srcEntrypoint=path14.join(packageDir,"src","index.ts"),distEntrypoint=path14.join(packageDir,"dist","index.js");if(await pathExists(srcEntrypoint))return!1;if(!await pathExists(distEntrypoint))return!1;return exportRecord.bun="./dist/index.js",await writeFile5(packageJsonPath,`${JSON.stringify(parsed,null,2)}
|
|
1009
|
+
\`\`\``}function buildSubagentBatchFallbackParentInput(contexts){let payload={type:"subagent_result_batch",total:contexts.length,tasks:contexts.map((context)=>buildParentPayloadContextPayload(context))};return buildParentPayloadMessage("Subagent result batch package",payload)}function buildSubagentBatchFallbackSteer(){return["Integrate this subagent result batch now.","Use any successful child results and any failure details to continue the answer.","Do not stop only because one child failed unless the whole task is genuinely blocked.","Do not call delegate_tasks again while integrating this batch.","Use only the child results already provided in this replay."].join(" ")}function createDelegateTasksTool(){return new class extends BaseTool{constructor(){super({name:DELEGATE_TASKS_TOOL_NAME,description:renderPrompt("tools.delegate-tasks.description"),inputSchema:{type:"object",additionalProperties:!1,required:["goal","tasks"],properties:{goal:{type:"string",description:renderPrompt("tools.delegate-tasks.fields.goal")},tasks:{type:"array",minItems:1,maxItems:3,items:{type:"object",additionalProperties:!1,required:["instruction"],properties:{description:{type:"string",description:renderPrompt("tools.delegate-tasks.fields.task-description")},instruction:{type:"string",description:renderPrompt("tools.delegate-tasks.fields.task-instruction")},successCriteria:{type:"string",description:renderPrompt("tools.delegate-tasks.fields.task-success-criteria")},constraints:{type:"array",items:{type:"string"},description:renderPrompt("tools.delegate-tasks.fields.task-constraints")}}}}}}})}async execute(args,context){if(isSubagentContext(context.metadata))return textResult2("Nested delegate_tasks is unavailable inside a subagent. Return findings to the main agent instead.",{error:"nested_subagent_delegation_unsupported"},!0);if(isSubagentParentReplayContext(context.metadata))return textResult2("delegate_tasks is unavailable while integrating existing subagent results. Finish this package directly with the evidence already provided.",{error:"delegate_tasks_disabled_for_subagent_parent_replay"},!0);try{let intent=normalizeDelegationIntent(args);return textResult2(`Delegation intent recorded for ${intent.tasks.length} task(s).`,intent)}catch(error48){let message=error48 instanceof Error?error48.message:String(error48);return textResult2(`Invalid delegation intent: ${message}`,{error:message},!0)}}}}function buildDelegationFinalMessage(payload){return{...payload.assistantMessage,content:[{type:"text",text:DELEGATION_RECORDED_FINAL_MESSAGE}],toolCalls:void 0,stopReason:"final"}}function createDelegationFinalizerPlugin(){return{manifest:{id:"dim-agent-delegation-finalizer",version:"0.0.1",apiVersion:1,permissions:{},priority:100},setup(){return{hooks:[{descriptor:{name:"run.stop"},middleware:[({payload,context})=>{if(!payload.toolCalls.some((toolCall)=>toolCall.function.name===DELEGATE_TASKS_TOOL_NAME&&parseDelegationIntent(toolCall.function.arguments)!==void 0))return;if(isSubagentContext(context.metadata)||isSubagentParentReplayContext(context.metadata))return;return finalizeRun(buildDelegationFinalMessage(payload))}]}]}}}}var ACP_DELEGATION_PLUGIN_ID="acp-client-delegation",delegatedTerminalHandles=new Map,delegatedSessionUnregisters=new Map;function resolvePath(targetPath,cwd){if(!targetPath.trim())throw Error("path is required");if(path13.isAbsolute(targetPath))return path13.normalize(targetPath);return path13.resolve(cwd??process4.cwd(),targetPath)}function textResult3(text,structuredContent,isError){let result={content:[{type:"text",text}]};if(structuredContent)result.structuredContent=structuredContent;if(isError)result.isError=!0;return createToolResult(result)}function delegationErrorResult(error48,structuredContent){let delegatedError=error48,details=typeof delegatedError.data?.details==="string"&&delegatedError.data.details.trim()?delegatedError.data.details.trim():"",rpcMessage=typeof delegatedError.message==="string"&&delegatedError.message.trim()?delegatedError.message.trim():"",message=details||rpcMessage||"Tool execution failed",payload={...structuredContent??{}};if(delegatedError.code!==void 0)payload.code=delegatedError.code;if(rpcMessage)payload.rpcMessage=rpcMessage;if(details)payload.details=details;return textResult3(message,Object.keys(payload).length>0?payload:void 0,!0)}function clearDelegatedSession(sessionId){delegatedTerminalHandles.delete(sessionId);let unregister=delegatedSessionUnregisters.get(sessionId);if(!unregister)return;delegatedSessionUnregisters.delete(sessionId),unregister()}async function disposeDelegatedSession(sessionId){let entries=[...delegatedTerminalHandles.get(sessionId)?.values()??[]];clearDelegatedSession(sessionId),await Promise.allSettled(entries.map(async(entry)=>{if(entry.timeoutHandle)clearTimeout(entry.timeoutHandle);entry.terminating=!0,await entry.handle.kill().catch(()=>{}),await entry.handle.release().catch(()=>{})}))}function ensureDelegatedSessionRegistered(sessionId){if(delegatedSessionUnregisters.has(sessionId))return;delegatedSessionUnregisters.set(sessionId,registerExecSessionDisposer(sessionId,async()=>{await disposeDelegatedSession(sessionId)}))}function getDelegatedTerminalEntries(sessionId){let existing=delegatedTerminalHandles.get(sessionId);if(existing)return touchExecSessionDisposers(sessionId),existing;let created=new Map;return delegatedTerminalHandles.set(sessionId,created),ensureDelegatedSessionRegistered(sessionId),created}function maybeCleanupDelegatedSession(sessionId){if((delegatedTerminalHandles.get(sessionId)?.size??0)>0)return;clearDelegatedSession(sessionId)}function allocateDelegatedProcessId(sessionId){let entries=getDelegatedTerminalEntries(sessionId);for(let attempts=0;attempts<100;attempts+=1){let candidate=randomInt3(1000,100001);if(!entries.has(candidate))return candidate}throw new ExecToolError("exec_process_limit_exceeded",`Could not allocate exec process id for session ${sessionId}.`)}async function releaseDelegatedEntry(sessionId,processId){let entries=delegatedTerminalHandles.get(sessionId),entry=entries?.get(processId);if(!entries||!entry)return;if(entry.timeoutHandle)clearTimeout(entry.timeoutHandle);entries.delete(processId),await entry.handle.release().catch(()=>{}),maybeCleanupDelegatedSession(sessionId)}async function completeDelegatedEntry(sessionId,entry,result){if(appendManagedExecOutput(entry.outputRecord,result.output),entry.notifyOnTerminal&&entry.notifiedAt===void 0){entry.notifiedAt=Date.now();let status=createDelegatedTaskStatus(entry,result.exitCode);queueManagedExecTaskNotification(sessionId,{taskId:entry.processId,status,outputPath:entry.outputRecord.outputPath,summary:createExecTaskNotificationSummary({command:Array.isArray(entry.command)?entry.command:[entry.command],taskId:entry.processId,status,exitCode:result.exitCode,signal:result.signal,timeoutMs:void 0}),exitCode:result.exitCode,...result.signal?{signal:result.signal}:{}})}await releaseDelegatedEntry(sessionId,entry.processId)}function createDelegatedTaskStatus(entry,exitCode){if(entry.timedOut)return"timed_out";if(entry.terminating)return"killed";return exitCode===0?"completed":"failed"}function readDelegatedEntry(sessionId,processId){let entry=delegatedTerminalHandles.get(sessionId)?.get(processId)??null;if(entry)touchExecSessionDisposers(sessionId);return entry}async function waitForDelegatedTerminal(entry,yieldTimeMs,signal){let timeoutMs=typeof yieldTimeMs==="number"?yieldTimeMs:DEFAULT_YIELD_TIME_MS2;return await new Promise((resolve2,reject)=>{if(signal?.aborted){reject(Error("The operation was aborted."));return}let settled=!1,timer,onAbort,finalize2=(value,error48)=>{if(settled)return;if(settled=!0,timer)clearTimeout(timer);if(onAbort)signal?.removeEventListener("abort",onAbort);if(error48)reject(error48);else resolve2(value??{state:"running"})};onAbort=()=>finalize2(void 0,Error("The operation was aborted.")),signal?.addEventListener("abort",onAbort,{once:!0}),entry.exitPromise.then((result)=>finalize2({state:"done",...result}),(error48)=>finalize2(void 0,error48)),timer=setTimeout(()=>finalize2({state:"running"}),timeoutMs)})}async function delegateRead(conn,sessionId,toolCall,cwd){let args=toolCall.function?.arguments??{},rawPath=String(args.path??"").trim();if(!rawPath)return textResult3("Error: path argument is required",void 0,!0);let absolutePath=resolvePath(rawPath,cwd);try{let response=await conn.readTextFile({sessionId,path:absolutePath});return textResult3(response.content,{path:absolutePath,size:Buffer.byteLength(response.content,"utf8")})}catch(error48){return delegationErrorResult(error48,{path:absolutePath})}}async function delegateWrite(conn,sessionId,toolCall,cwd){let args=toolCall.function?.arguments??{},rawPath=String(args.path??"").trim(),content=String(args.content??"");if(!rawPath)return textResult3("Error: path argument is required",void 0,!0);let absolutePath=resolvePath(rawPath,cwd);try{return await conn.writeTextFile({sessionId,path:absolutePath,content}),textResult3(`Successfully wrote to ${absolutePath}`,{path:absolutePath,bytes:Buffer.byteLength(content,"utf8")})}catch(error48){return delegationErrorResult(error48,{path:absolutePath,bytes:Buffer.byteLength(content,"utf8")})}}class DelegatedExecBackend{conn;constructor(conn){this.conn=conn}async execute(request){if(request.action==="start")return await this.start(request);return await this.pollOrTerminate(request)}async start(request){let command=request.command??[],commandPreview=formatExecCommandPreview(command);if(!commandPreview)throw new ExecToolError("exec_invalid_request","Error: command argument is required");let spawnSpec=typeof command==="string"?(()=>{let spec=buildShellCommand(command);return{command:spec.file,args:spec.args}})():{command:command[0],args:command.slice(1)},handle,delegatedProcessId,waitStartedAt=Date.now();try{handle=await this.conn.createTerminal({sessionId:request.sessionId,command:spawnSpec.command,args:spawnSpec.args,cwd:request.cwd,env:[]}),delegatedProcessId=allocateDelegatedProcessId(request.sessionId);let outputRecord=createManagedExecOutputStoreRecord({sessionId:request.sessionId,processId:delegatedProcessId,rootDir:request.outputRoot}),entry={processId:delegatedProcessId,command:Array.isArray(command)?[...command]:command,commandPreview,cwd:request.cwd,handle,exitPromise:handle.waitForExit(),outputRecord,timedOut:!1,terminating:!1,notifyOnTerminal:!1};if(typeof request.timeoutMs==="number")entry.timeoutHandle=setTimeout(()=>{entry.timedOut=!0,entry.terminating=!0,entry.handle.kill().catch(()=>{})},request.timeoutMs);if(getDelegatedTerminalEntries(request.sessionId).set(delegatedProcessId,entry),request.runInBackground===!0)return entry.notifyOnTerminal=!0,entry.exitPromise.then((result)=>completeDelegatedEntry(request.sessionId,entry,{output:result.output,exitCode:result.exitCode,...entry.timedOut||entry.terminating?{signal:"SIGTERM"}:{}}),()=>releaseDelegatedEntry(request.sessionId,delegatedProcessId)).catch(()=>{}),{command:Array.isArray(entry.command)?[...entry.command]:entry.command,commandPreview:entry.commandPreview,cwd:entry.cwd,stdout:"",stderr:"",taskId:delegatedProcessId,processId:delegatedProcessId,outputPath:entry.outputRecord.outputPath,outputBytes:entry.outputRecord.outputBytes,outputTruncated:entry.outputRecord.outputTruncated,runInBackground:!0,notification:"completion-will-be-sent",wallTimeMs:Date.now()-waitStartedAt,status:"running"};let waited=await waitForDelegatedTerminal(entry,request.yieldTimeMs,request.signal);if(waited.state==="running")return entry.notifyOnTerminal=!0,entry.exitPromise.then((result)=>completeDelegatedEntry(request.sessionId,entry,{output:result.output,exitCode:result.exitCode,...entry.timedOut||entry.terminating?{signal:"SIGTERM"}:{}}),()=>releaseDelegatedEntry(request.sessionId,delegatedProcessId)).catch(()=>{}),{command:Array.isArray(entry.command)?[...entry.command]:entry.command,commandPreview:entry.commandPreview,cwd:entry.cwd,stdout:"",stderr:"",taskId:delegatedProcessId,processId:delegatedProcessId,outputPath:entry.outputRecord.outputPath,outputBytes:entry.outputRecord.outputBytes,outputTruncated:entry.outputRecord.outputTruncated,notification:"completion-will-be-sent",wallTimeMs:Date.now()-waitStartedAt,status:"running"};let signal=entry.timedOut?"SIGTERM":void 0;return await completeDelegatedEntry(request.sessionId,entry,{output:waited.output,exitCode:waited.exitCode,...signal?{signal}:{}}),{command:Array.isArray(entry.command)?[...entry.command]:entry.command,commandPreview:entry.commandPreview,cwd:entry.cwd,stdout:waited.output,stderr:"",taskId:delegatedProcessId,processId:delegatedProcessId,exitCode:waited.exitCode,...signal?{signal}:{},...entry.timedOut?{timedOut:!0}:{},outputPath:entry.outputRecord.outputPath,outputBytes:entry.outputRecord.outputBytes,outputTruncated:entry.outputRecord.outputTruncated,wallTimeMs:Date.now()-waitStartedAt,status:entry.timedOut?"terminated":"exited"}}catch(error48){if(delegatedProcessId!==void 0)await releaseDelegatedEntry(request.sessionId,delegatedProcessId);else await handle?.release().catch(()=>{});throw error48}}async pollOrTerminate(request){let processId=request.processId;if(typeof processId!=="number")throw new ExecToolError("exec_invalid_request",`Error: exec ${request.action} requires processId`);let entry=readDelegatedEntry(request.sessionId,processId);if(!entry)throw new ExecToolError("exec_process_not_found",`Exec process ${processId} was not found for session ${request.sessionId}.`);let waitStartedAt=Date.now();if(request.action==="terminate"&&!entry.terminating)entry.terminating=!0,await entry.handle.kill();let waited=await waitForDelegatedTerminal(entry,request.yieldTimeMs,request.signal);if(waited.state==="running")return{command:Array.isArray(entry.command)?[...entry.command]:entry.command,commandPreview:entry.commandPreview,cwd:entry.cwd,stdout:"",stderr:"",taskId:processId,processId,outputPath:entry.outputRecord.outputPath,outputBytes:entry.outputRecord.outputBytes,outputTruncated:entry.outputRecord.outputTruncated,notification:"completion-will-be-sent",wallTimeMs:Date.now()-waitStartedAt,status:"running"};let signal=entry.terminating?"SIGTERM":void 0;return await completeDelegatedEntry(request.sessionId,entry,{output:waited.output,exitCode:waited.exitCode,...signal?{signal}:{}}),{command:Array.isArray(entry.command)?[...entry.command]:entry.command,commandPreview:entry.commandPreview,cwd:entry.cwd,stdout:waited.output,stderr:"",taskId:processId,processId,exitCode:waited.exitCode,...signal?{signal}:{},...entry.timedOut?{timedOut:!0}:{},outputPath:entry.outputRecord.outputPath,outputBytes:entry.outputRecord.outputBytes,outputTruncated:entry.outputRecord.outputTruncated,wallTimeMs:Date.now()-waitStartedAt,status:entry.terminating||entry.timedOut?"terminated":"exited"}}}async function delegateExec(conn,sessionId,toolCall,cwd,readOnly,outputRoot){try{let request=parseExecRequest(toolCall.function?.arguments??{},{cwd,outputRoot,sessionId});if(readOnly){let rejection=buildReadOnlyExecRejection(request);if(rejection)return rejection}let result=await new DelegatedExecBackend(conn).execute(request);return buildExecToolResult(result)}catch(error48){return normalizeExecToolError(error48)}}function createAcpDelegationPlugin(ctx){return{manifest:{id:ACP_DELEGATION_PLUGIN_ID,version:"1.0.0",apiVersion:1,permissions:{},priority:10},setup(){return{hooks:[{descriptor:{name:"tool.beforeExecute"},middleware:[async({payload,context})=>{let toolName=String(payload?.toolCall?.function?.name??"").trim(),conn=ctx.getConnection();if(!conn)return;let sessionId=ctx.getSessionId(context.sessionId),cwd=context.cwd;if(toolName==="read"&&ctx.capabilities.fs.readTextFile){if(ctx.requestApproval){let decision=await ctx.requestApproval({sessionId,toolCall:payload.toolCall,cwd});if(decision.type==="denied")return{type:"deny",reason:decision.reason??"Permission denied by user"}}return{type:"provideResult",result:await delegateRead(conn,sessionId,payload.toolCall,cwd)}}if(toolName==="write"&&ctx.capabilities.fs.writeTextFile){if(ctx.requestApproval){let decision=await ctx.requestApproval({sessionId,toolCall:payload.toolCall,cwd});if(decision.type==="denied")return{type:"deny",reason:decision.reason??"Permission denied by user"}}return{type:"provideResult",result:await delegateWrite(conn,sessionId,payload.toolCall,cwd)}}if(toolName==="exec"&&ctx.capabilities.terminal){if(ctx.requestApproval){let decision=await ctx.requestApproval({sessionId,toolCall:payload.toolCall,cwd});if(decision.type==="denied")return{type:"deny",reason:decision.reason??"Permission denied by user"}}return{type:"provideResult",result:await delegateExec(conn,sessionId,payload.toolCall,cwd,context.metadata?.dimAgentReadOnlyExec===!0,context.hostDataDir)}}return}]}]}}}}import{access,readFile as readFile5,writeFile as writeFile5}from"node:fs/promises";import path14 from"node:path";import{fileURLToPath as fileURLToPath2}from"node:url";var dimPluginApiPatchPromises=new Map;async function pathExists(filePath){try{return await access(filePath),!0}catch{return!1}}function normalizePackageJson(raw){try{let parsed=JSON.parse(raw);if(parsed&&typeof parsed==="object"&&!Array.isArray(parsed))return parsed}catch{}return null}function getDefaultSearchStart(){return path14.dirname(fileURLToPath2(import.meta.url))}async function findDimPluginApiPackageJson(startDir){let current=path14.resolve(startDir);while(!0){let candidate=path14.join(current,"node_modules","@archships","dim-plugin-api","package.json");if(await pathExists(candidate))return candidate;let parent=path14.dirname(current);if(parent===current)return null;current=parent}}async function patchDimPluginApiPackageJson(packageJsonPath){let raw=await readFile5(packageJsonPath,"utf8"),parsed=normalizePackageJson(raw);if(!parsed)return!1;let exportsField=parsed.exports;if(!exportsField||typeof exportsField!=="object"||Array.isArray(exportsField))return!1;let rootExport=exportsField["."];if(!rootExport||typeof rootExport!=="object"||Array.isArray(rootExport))return!1;let exportRecord=rootExport;if(exportRecord.bun!=="./src/index.ts")return!1;let packageDir=path14.dirname(packageJsonPath),srcEntrypoint=path14.join(packageDir,"src","index.ts"),distEntrypoint=path14.join(packageDir,"dist","index.js");if(await pathExists(srcEntrypoint))return!1;if(!await pathExists(distEntrypoint))return!1;return exportRecord.bun="./dist/index.js",await writeFile5(packageJsonPath,`${JSON.stringify(parsed,null,2)}
|
|
1010
1010
|
`,"utf8"),!0}async function ensureDimPluginApiBunExportPatched(startDir=getDefaultSearchStart()){let packageJsonPath=await findDimPluginApiPackageJson(startDir);if(!packageJsonPath)return!1;let patchPromise=dimPluginApiPatchPromises.get(packageJsonPath);if(!patchPromise)patchPromise=patchDimPluginApiPackageJson(packageJsonPath),dimPluginApiPatchPromises.set(packageJsonPath,patchPromise);return await patchPromise}var autoCompactPluginFactoryPromise=null,grepGlobPluginFactoryPromise=null,planModePluginFactoryPromise=null,skillsPluginFactoryPromise=null;async function loadAutoCompactPluginFactory(){if(!autoCompactPluginFactoryPromise)autoCompactPluginFactoryPromise=Promise.resolve().then(() => (init_dist14(),exports_dist)).then((mod)=>mod.createAutoCompactPlugin);return await autoCompactPluginFactoryPromise}async function loadGrepGlobPluginFactory(){if(!grepGlobPluginFactoryPromise)grepGlobPluginFactoryPromise=Promise.resolve().then(() => (init_dist15(),exports_dist2)).then((mod)=>mod.createGrepGlobPlugin);return await grepGlobPluginFactoryPromise}async function loadPlanModePluginFactory(){if(!planModePluginFactoryPromise)await ensureDimPluginApiBunExportPatched(),planModePluginFactoryPromise=Promise.resolve().then(() => (init_dist16(),exports_dist3)).then((mod)=>mod.createPlanModePlugin);return await planModePluginFactoryPromise}async function loadSkillsPluginFactory(){if(!skillsPluginFactoryPromise)skillsPluginFactoryPromise=Promise.resolve().then(() => (init_dist18(),exports_dist4)).then((mod)=>mod.createSkillsPlugin);return await skillsPluginFactoryPromise}import{Buffer as Buffer2}from"node:buffer";import{appendFileSync,mkdirSync as mkdirSync2}from"node:fs";import path18 from"node:path";function readProcessEnv(){return globalThis?.process?.env??{}}function prefixedEnvKeys(name15){return[`DIMCODE_${name15}`]}function readPrefixedEnv(env,name15){let[primary]=prefixedEnvKeys(name15),source=env??readProcessEnv();return String(source?.[primary]??"").trim()}function readPrefixedEnvFlag(env,name15){return readPrefixedEnv(env,name15).toLowerCase()}function isNodeLike(){let p=globalThis.process;return Boolean(p&&typeof p?.versions?.node==="string")}function isDebugEnabled(){if(!isNodeLike())return!1;let v=readPrefixedEnvFlag(void 0,"DEBUG");return v==="1"||v==="true"||v==="yes"||v==="on"}var ensuredDirs=new Set;function ensureDir(dir){if(ensuredDirs.has(dir))return;try{mkdirSync2(dir,{recursive:!0})}catch{}ensuredDirs.add(dir)}function logsDir(){let raw=readPrefixedEnv(void 0,"DEBUG_LOG");if(raw)return path18.dirname(raw);return"./logs"}function formatLine(eventName,payload){let name15=String(eventName??"").trim()||"event",line=`[${new Date().toISOString()}] ${name15}`;if(payload!==void 0)try{line+=` ${JSON.stringify(payload)}`}catch{}return`${line}
|
|
1011
1011
|
`}function writeLine(filePath,line){try{appendFileSync(filePath,line)}catch{}}function debugLogPath(){let raw=readPrefixedEnv(void 0,"DEBUG_LOG");if(raw)return raw;let dir=logsDir();return ensureDir(dir),path18.join(dir,"dimcode-debug.log")}function debugLog(eventName,payload){if(!isDebugEnabled())return;writeLine(debugLogPath(),formatLine(eventName,payload))}function debugLogSession(sessionId,eventName,payload){if(!isDebugEnabled())return;let dir=logsDir();ensureDir(dir);let sanitized=sessionId.replace(/[^\w-]/g,"_"),filePath=path18.join(dir,`${sanitized}.log`);writeLine(filePath,formatLine(eventName,payload))}class McpClient{_enableLogging=!1}init_core2();function isZ4Schema(s){return!!s._zod}function safeParse3(schema2,data){if(isZ4Schema(schema2))return safeParse(schema2,data);return schema2.safeParse(data)}function getObjectShape(schema2){if(!schema2)return;let rawShape;if(isZ4Schema(schema2))rawShape=schema2._zod?.def?.shape;else rawShape=schema2.shape;if(!rawShape)return;if(typeof rawShape==="function")try{return rawShape()}catch{return}return rawShape}function getLiteralValue(schema2){if(isZ4Schema(schema2)){let def2=schema2._zod?.def;if(def2){if(def2.value!==void 0)return def2.value;if(Array.isArray(def2.values)&&def2.values.length>0)return def2.values[0]}}let def=schema2._def;if(def){if(def.value!==void 0)return def.value;if(Array.isArray(def.values)&&def.values.length>0)return def.values[0]}let directValue=schema2.value;if(directValue!==void 0)return directValue;return}init_v4();var LATEST_PROTOCOL_VERSION="2025-11-25";var SUPPORTED_PROTOCOL_VERSIONS=[LATEST_PROTOCOL_VERSION,"2025-06-18","2025-03-26","2024-11-05","2024-10-07"],RELATED_TASK_META_KEY="io.modelcontextprotocol/related-task",JSONRPC_VERSION="2.0",AssertObjectSchema=custom((v)=>v!==null&&(typeof v==="object"||typeof v==="function")),ProgressTokenSchema=union([string2(),number2().int()]),CursorSchema=string2(),TaskCreationParamsSchema=looseObject({ttl:number2().optional(),pollInterval:number2().optional()}),TaskMetadataSchema=object({ttl:number2().optional()}),RelatedTaskMetadataSchema=object({taskId:string2()}),RequestMetaSchema=looseObject({progressToken:ProgressTokenSchema.optional(),[RELATED_TASK_META_KEY]:RelatedTaskMetadataSchema.optional()}),BaseRequestParamsSchema=object({_meta:RequestMetaSchema.optional()}),TaskAugmentedRequestParamsSchema=BaseRequestParamsSchema.extend({task:TaskMetadataSchema.optional()}),isTaskAugmentedRequestParams=(value)=>TaskAugmentedRequestParamsSchema.safeParse(value).success,RequestSchema=object({method:string2(),params:BaseRequestParamsSchema.loose().optional()}),NotificationsParamsSchema=object({_meta:RequestMetaSchema.optional()}),NotificationSchema=object({method:string2(),params:NotificationsParamsSchema.loose().optional()}),ResultSchema=looseObject({_meta:RequestMetaSchema.optional()}),RequestIdSchema=union([string2(),number2().int()]),JSONRPCRequestSchema=object({jsonrpc:literal(JSONRPC_VERSION),id:RequestIdSchema,...RequestSchema.shape}).strict(),isJSONRPCRequest=(value)=>JSONRPCRequestSchema.safeParse(value).success,JSONRPCNotificationSchema=object({jsonrpc:literal(JSONRPC_VERSION),...NotificationSchema.shape}).strict(),isJSONRPCNotification=(value)=>JSONRPCNotificationSchema.safeParse(value).success,JSONRPCResultResponseSchema=object({jsonrpc:literal(JSONRPC_VERSION),id:RequestIdSchema,result:ResultSchema}).strict(),isJSONRPCResultResponse=(value)=>JSONRPCResultResponseSchema.safeParse(value).success;var ErrorCode;(function(ErrorCode2){ErrorCode2[ErrorCode2.ConnectionClosed=-32000]="ConnectionClosed",ErrorCode2[ErrorCode2.RequestTimeout=-32001]="RequestTimeout",ErrorCode2[ErrorCode2.ParseError=-32700]="ParseError",ErrorCode2[ErrorCode2.InvalidRequest=-32600]="InvalidRequest",ErrorCode2[ErrorCode2.MethodNotFound=-32601]="MethodNotFound",ErrorCode2[ErrorCode2.InvalidParams=-32602]="InvalidParams",ErrorCode2[ErrorCode2.InternalError=-32603]="InternalError",ErrorCode2[ErrorCode2.UrlElicitationRequired=-32042]="UrlElicitationRequired"})(ErrorCode||(ErrorCode={}));var JSONRPCErrorResponseSchema=object({jsonrpc:literal(JSONRPC_VERSION),id:RequestIdSchema.optional(),error:object({code:number2().int(),message:string2(),data:unknown().optional()})}).strict();var isJSONRPCErrorResponse=(value)=>JSONRPCErrorResponseSchema.safeParse(value).success;var JSONRPCMessageSchema=union([JSONRPCRequestSchema,JSONRPCNotificationSchema,JSONRPCResultResponseSchema,JSONRPCErrorResponseSchema]),JSONRPCResponseSchema=union([JSONRPCResultResponseSchema,JSONRPCErrorResponseSchema]),EmptyResultSchema=ResultSchema.strict(),CancelledNotificationParamsSchema=NotificationsParamsSchema.extend({requestId:RequestIdSchema.optional(),reason:string2().optional()}),CancelledNotificationSchema=NotificationSchema.extend({method:literal("notifications/cancelled"),params:CancelledNotificationParamsSchema}),IconSchema=object({src:string2(),mimeType:string2().optional(),sizes:array(string2()).optional(),theme:_enum2(["light","dark"]).optional()}),IconsSchema=object({icons:array(IconSchema).optional()}),BaseMetadataSchema=object({name:string2(),title:string2().optional()}),ImplementationSchema=BaseMetadataSchema.extend({...BaseMetadataSchema.shape,...IconsSchema.shape,version:string2(),websiteUrl:string2().optional(),description:string2().optional()}),FormElicitationCapabilitySchema=intersection(object({applyDefaults:boolean2().optional()}),record(string2(),unknown())),ElicitationCapabilitySchema=preprocess((value)=>{if(value&&typeof value==="object"&&!Array.isArray(value)){if(Object.keys(value).length===0)return{form:{}}}return value},intersection(object({form:FormElicitationCapabilitySchema.optional(),url:AssertObjectSchema.optional()}),record(string2(),unknown()).optional())),ClientTasksCapabilitySchema=looseObject({list:AssertObjectSchema.optional(),cancel:AssertObjectSchema.optional(),requests:looseObject({sampling:looseObject({createMessage:AssertObjectSchema.optional()}).optional(),elicitation:looseObject({create:AssertObjectSchema.optional()}).optional()}).optional()}),ServerTasksCapabilitySchema=looseObject({list:AssertObjectSchema.optional(),cancel:AssertObjectSchema.optional(),requests:looseObject({tools:looseObject({call:AssertObjectSchema.optional()}).optional()}).optional()}),ClientCapabilitiesSchema=object({experimental:record(string2(),AssertObjectSchema).optional(),sampling:object({context:AssertObjectSchema.optional(),tools:AssertObjectSchema.optional()}).optional(),elicitation:ElicitationCapabilitySchema.optional(),roots:object({listChanged:boolean2().optional()}).optional(),tasks:ClientTasksCapabilitySchema.optional(),extensions:record(string2(),AssertObjectSchema).optional()}),InitializeRequestParamsSchema=BaseRequestParamsSchema.extend({protocolVersion:string2(),capabilities:ClientCapabilitiesSchema,clientInfo:ImplementationSchema}),InitializeRequestSchema=RequestSchema.extend({method:literal("initialize"),params:InitializeRequestParamsSchema});var ServerCapabilitiesSchema=object({experimental:record(string2(),AssertObjectSchema).optional(),logging:AssertObjectSchema.optional(),completions:AssertObjectSchema.optional(),prompts:object({listChanged:boolean2().optional()}).optional(),resources:object({subscribe:boolean2().optional(),listChanged:boolean2().optional()}).optional(),tools:object({listChanged:boolean2().optional()}).optional(),tasks:ServerTasksCapabilitySchema.optional(),extensions:record(string2(),AssertObjectSchema).optional()}),InitializeResultSchema=ResultSchema.extend({protocolVersion:string2(),capabilities:ServerCapabilitiesSchema,serverInfo:ImplementationSchema,instructions:string2().optional()}),InitializedNotificationSchema=NotificationSchema.extend({method:literal("notifications/initialized"),params:NotificationsParamsSchema.optional()}),isInitializedNotification=(value)=>InitializedNotificationSchema.safeParse(value).success,PingRequestSchema=RequestSchema.extend({method:literal("ping"),params:BaseRequestParamsSchema.optional()}),ProgressSchema=object({progress:number2(),total:optional(number2()),message:optional(string2())}),ProgressNotificationParamsSchema=object({...NotificationsParamsSchema.shape,...ProgressSchema.shape,progressToken:ProgressTokenSchema}),ProgressNotificationSchema=NotificationSchema.extend({method:literal("notifications/progress"),params:ProgressNotificationParamsSchema}),PaginatedRequestParamsSchema=BaseRequestParamsSchema.extend({cursor:CursorSchema.optional()}),PaginatedRequestSchema=RequestSchema.extend({params:PaginatedRequestParamsSchema.optional()}),PaginatedResultSchema=ResultSchema.extend({nextCursor:CursorSchema.optional()}),TaskStatusSchema=_enum2(["working","input_required","completed","failed","cancelled"]),TaskSchema=object({taskId:string2(),status:TaskStatusSchema,ttl:union([number2(),_null3()]),createdAt:string2(),lastUpdatedAt:string2(),pollInterval:optional(number2()),statusMessage:optional(string2())}),CreateTaskResultSchema=ResultSchema.extend({task:TaskSchema}),TaskStatusNotificationParamsSchema=NotificationsParamsSchema.merge(TaskSchema),TaskStatusNotificationSchema=NotificationSchema.extend({method:literal("notifications/tasks/status"),params:TaskStatusNotificationParamsSchema}),GetTaskRequestSchema=RequestSchema.extend({method:literal("tasks/get"),params:BaseRequestParamsSchema.extend({taskId:string2()})}),GetTaskResultSchema=ResultSchema.merge(TaskSchema),GetTaskPayloadRequestSchema=RequestSchema.extend({method:literal("tasks/result"),params:BaseRequestParamsSchema.extend({taskId:string2()})}),GetTaskPayloadResultSchema=ResultSchema.loose(),ListTasksRequestSchema=PaginatedRequestSchema.extend({method:literal("tasks/list")}),ListTasksResultSchema=PaginatedResultSchema.extend({tasks:array(TaskSchema)}),CancelTaskRequestSchema=RequestSchema.extend({method:literal("tasks/cancel"),params:BaseRequestParamsSchema.extend({taskId:string2()})}),CancelTaskResultSchema=ResultSchema.merge(TaskSchema),ResourceContentsSchema=object({uri:string2(),mimeType:optional(string2()),_meta:record(string2(),unknown()).optional()}),TextResourceContentsSchema=ResourceContentsSchema.extend({text:string2()}),Base64Schema=string2().refine((val)=>{try{return atob(val),!0}catch{return!1}},{message:"Invalid Base64 string"}),BlobResourceContentsSchema=ResourceContentsSchema.extend({blob:Base64Schema}),RoleSchema=_enum2(["user","assistant"]),AnnotationsSchema=object({audience:array(RoleSchema).optional(),priority:number2().min(0).max(1).optional(),lastModified:exports_iso.datetime({offset:!0}).optional()}),ResourceSchema=object({...BaseMetadataSchema.shape,...IconsSchema.shape,uri:string2(),description:optional(string2()),mimeType:optional(string2()),size:optional(number2()),annotations:AnnotationsSchema.optional(),_meta:optional(looseObject({}))}),ResourceTemplateSchema=object({...BaseMetadataSchema.shape,...IconsSchema.shape,uriTemplate:string2(),description:optional(string2()),mimeType:optional(string2()),annotations:AnnotationsSchema.optional(),_meta:optional(looseObject({}))}),ListResourcesRequestSchema=PaginatedRequestSchema.extend({method:literal("resources/list")}),ListResourcesResultSchema=PaginatedResultSchema.extend({resources:array(ResourceSchema)}),ListResourceTemplatesRequestSchema=PaginatedRequestSchema.extend({method:literal("resources/templates/list")}),ListResourceTemplatesResultSchema=PaginatedResultSchema.extend({resourceTemplates:array(ResourceTemplateSchema)}),ResourceRequestParamsSchema=BaseRequestParamsSchema.extend({uri:string2()}),ReadResourceRequestParamsSchema=ResourceRequestParamsSchema,ReadResourceRequestSchema=RequestSchema.extend({method:literal("resources/read"),params:ReadResourceRequestParamsSchema}),ReadResourceResultSchema=ResultSchema.extend({contents:array(union([TextResourceContentsSchema,BlobResourceContentsSchema]))}),ResourceListChangedNotificationSchema=NotificationSchema.extend({method:literal("notifications/resources/list_changed"),params:NotificationsParamsSchema.optional()}),SubscribeRequestParamsSchema=ResourceRequestParamsSchema,SubscribeRequestSchema=RequestSchema.extend({method:literal("resources/subscribe"),params:SubscribeRequestParamsSchema}),UnsubscribeRequestParamsSchema=ResourceRequestParamsSchema,UnsubscribeRequestSchema=RequestSchema.extend({method:literal("resources/unsubscribe"),params:UnsubscribeRequestParamsSchema}),ResourceUpdatedNotificationParamsSchema=NotificationsParamsSchema.extend({uri:string2()}),ResourceUpdatedNotificationSchema=NotificationSchema.extend({method:literal("notifications/resources/updated"),params:ResourceUpdatedNotificationParamsSchema}),PromptArgumentSchema=object({name:string2(),description:optional(string2()),required:optional(boolean2())}),PromptSchema=object({...BaseMetadataSchema.shape,...IconsSchema.shape,description:optional(string2()),arguments:optional(array(PromptArgumentSchema)),_meta:optional(looseObject({}))}),ListPromptsRequestSchema=PaginatedRequestSchema.extend({method:literal("prompts/list")}),ListPromptsResultSchema=PaginatedResultSchema.extend({prompts:array(PromptSchema)}),GetPromptRequestParamsSchema=BaseRequestParamsSchema.extend({name:string2(),arguments:record(string2(),string2()).optional()}),GetPromptRequestSchema=RequestSchema.extend({method:literal("prompts/get"),params:GetPromptRequestParamsSchema}),TextContentSchema=object({type:literal("text"),text:string2(),annotations:AnnotationsSchema.optional(),_meta:record(string2(),unknown()).optional()}),ImageContentSchema=object({type:literal("image"),data:Base64Schema,mimeType:string2(),annotations:AnnotationsSchema.optional(),_meta:record(string2(),unknown()).optional()}),AudioContentSchema=object({type:literal("audio"),data:Base64Schema,mimeType:string2(),annotations:AnnotationsSchema.optional(),_meta:record(string2(),unknown()).optional()}),ToolUseContentSchema=object({type:literal("tool_use"),name:string2(),id:string2(),input:record(string2(),unknown()),_meta:record(string2(),unknown()).optional()}),EmbeddedResourceSchema=object({type:literal("resource"),resource:union([TextResourceContentsSchema,BlobResourceContentsSchema]),annotations:AnnotationsSchema.optional(),_meta:record(string2(),unknown()).optional()}),ResourceLinkSchema=ResourceSchema.extend({type:literal("resource_link")}),ContentBlockSchema=union([TextContentSchema,ImageContentSchema,AudioContentSchema,ResourceLinkSchema,EmbeddedResourceSchema]),PromptMessageSchema=object({role:RoleSchema,content:ContentBlockSchema}),GetPromptResultSchema=ResultSchema.extend({description:string2().optional(),messages:array(PromptMessageSchema)}),PromptListChangedNotificationSchema=NotificationSchema.extend({method:literal("notifications/prompts/list_changed"),params:NotificationsParamsSchema.optional()}),ToolAnnotationsSchema=object({title:string2().optional(),readOnlyHint:boolean2().optional(),destructiveHint:boolean2().optional(),idempotentHint:boolean2().optional(),openWorldHint:boolean2().optional()}),ToolExecutionSchema=object({taskSupport:_enum2(["required","optional","forbidden"]).optional()}),ToolSchema=object({...BaseMetadataSchema.shape,...IconsSchema.shape,description:string2().optional(),inputSchema:object({type:literal("object"),properties:record(string2(),AssertObjectSchema).optional(),required:array(string2()).optional()}).catchall(unknown()),outputSchema:object({type:literal("object"),properties:record(string2(),AssertObjectSchema).optional(),required:array(string2()).optional()}).catchall(unknown()).optional(),annotations:ToolAnnotationsSchema.optional(),execution:ToolExecutionSchema.optional(),_meta:record(string2(),unknown()).optional()}),ListToolsRequestSchema=PaginatedRequestSchema.extend({method:literal("tools/list")}),ListToolsResultSchema=PaginatedResultSchema.extend({tools:array(ToolSchema)}),CallToolResultSchema=ResultSchema.extend({content:array(ContentBlockSchema).default([]),structuredContent:record(string2(),unknown()).optional(),isError:boolean2().optional()}),CompatibilityCallToolResultSchema=CallToolResultSchema.or(ResultSchema.extend({toolResult:unknown()})),CallToolRequestParamsSchema=TaskAugmentedRequestParamsSchema.extend({name:string2(),arguments:record(string2(),unknown()).optional()}),CallToolRequestSchema=RequestSchema.extend({method:literal("tools/call"),params:CallToolRequestParamsSchema}),ToolListChangedNotificationSchema=NotificationSchema.extend({method:literal("notifications/tools/list_changed"),params:NotificationsParamsSchema.optional()}),ListChangedOptionsBaseSchema=object({autoRefresh:boolean2().default(!0),debounceMs:number2().int().nonnegative().default(300)}),LoggingLevelSchema=_enum2(["debug","info","notice","warning","error","critical","alert","emergency"]),SetLevelRequestParamsSchema=BaseRequestParamsSchema.extend({level:LoggingLevelSchema}),SetLevelRequestSchema=RequestSchema.extend({method:literal("logging/setLevel"),params:SetLevelRequestParamsSchema}),LoggingMessageNotificationParamsSchema=NotificationsParamsSchema.extend({level:LoggingLevelSchema,logger:string2().optional(),data:unknown()}),LoggingMessageNotificationSchema=NotificationSchema.extend({method:literal("notifications/message"),params:LoggingMessageNotificationParamsSchema}),ModelHintSchema=object({name:string2().optional()}),ModelPreferencesSchema=object({hints:array(ModelHintSchema).optional(),costPriority:number2().min(0).max(1).optional(),speedPriority:number2().min(0).max(1).optional(),intelligencePriority:number2().min(0).max(1).optional()}),ToolChoiceSchema=object({mode:_enum2(["auto","required","none"]).optional()}),ToolResultContentSchema=object({type:literal("tool_result"),toolUseId:string2().describe("The unique identifier for the corresponding tool call."),content:array(ContentBlockSchema).default([]),structuredContent:object({}).loose().optional(),isError:boolean2().optional(),_meta:record(string2(),unknown()).optional()}),SamplingContentSchema=discriminatedUnion("type",[TextContentSchema,ImageContentSchema,AudioContentSchema]),SamplingMessageContentBlockSchema=discriminatedUnion("type",[TextContentSchema,ImageContentSchema,AudioContentSchema,ToolUseContentSchema,ToolResultContentSchema]),SamplingMessageSchema=object({role:RoleSchema,content:union([SamplingMessageContentBlockSchema,array(SamplingMessageContentBlockSchema)]),_meta:record(string2(),unknown()).optional()}),CreateMessageRequestParamsSchema=TaskAugmentedRequestParamsSchema.extend({messages:array(SamplingMessageSchema),modelPreferences:ModelPreferencesSchema.optional(),systemPrompt:string2().optional(),includeContext:_enum2(["none","thisServer","allServers"]).optional(),temperature:number2().optional(),maxTokens:number2().int(),stopSequences:array(string2()).optional(),metadata:AssertObjectSchema.optional(),tools:array(ToolSchema).optional(),toolChoice:ToolChoiceSchema.optional()}),CreateMessageRequestSchema=RequestSchema.extend({method:literal("sampling/createMessage"),params:CreateMessageRequestParamsSchema}),CreateMessageResultSchema=ResultSchema.extend({model:string2(),stopReason:optional(_enum2(["endTurn","stopSequence","maxTokens"]).or(string2())),role:RoleSchema,content:SamplingContentSchema}),CreateMessageResultWithToolsSchema=ResultSchema.extend({model:string2(),stopReason:optional(_enum2(["endTurn","stopSequence","maxTokens","toolUse"]).or(string2())),role:RoleSchema,content:union([SamplingMessageContentBlockSchema,array(SamplingMessageContentBlockSchema)])}),BooleanSchemaSchema=object({type:literal("boolean"),title:string2().optional(),description:string2().optional(),default:boolean2().optional()}),StringSchemaSchema=object({type:literal("string"),title:string2().optional(),description:string2().optional(),minLength:number2().optional(),maxLength:number2().optional(),format:_enum2(["email","uri","date","date-time"]).optional(),default:string2().optional()}),NumberSchemaSchema=object({type:_enum2(["number","integer"]),title:string2().optional(),description:string2().optional(),minimum:number2().optional(),maximum:number2().optional(),default:number2().optional()}),UntitledSingleSelectEnumSchemaSchema=object({type:literal("string"),title:string2().optional(),description:string2().optional(),enum:array(string2()),default:string2().optional()}),TitledSingleSelectEnumSchemaSchema=object({type:literal("string"),title:string2().optional(),description:string2().optional(),oneOf:array(object({const:string2(),title:string2()})),default:string2().optional()}),LegacyTitledEnumSchemaSchema=object({type:literal("string"),title:string2().optional(),description:string2().optional(),enum:array(string2()),enumNames:array(string2()).optional(),default:string2().optional()}),SingleSelectEnumSchemaSchema=union([UntitledSingleSelectEnumSchemaSchema,TitledSingleSelectEnumSchemaSchema]),UntitledMultiSelectEnumSchemaSchema=object({type:literal("array"),title:string2().optional(),description:string2().optional(),minItems:number2().optional(),maxItems:number2().optional(),items:object({type:literal("string"),enum:array(string2())}),default:array(string2()).optional()}),TitledMultiSelectEnumSchemaSchema=object({type:literal("array"),title:string2().optional(),description:string2().optional(),minItems:number2().optional(),maxItems:number2().optional(),items:object({anyOf:array(object({const:string2(),title:string2()}))}),default:array(string2()).optional()}),MultiSelectEnumSchemaSchema=union([UntitledMultiSelectEnumSchemaSchema,TitledMultiSelectEnumSchemaSchema]),EnumSchemaSchema=union([LegacyTitledEnumSchemaSchema,SingleSelectEnumSchemaSchema,MultiSelectEnumSchemaSchema]),PrimitiveSchemaDefinitionSchema=union([EnumSchemaSchema,BooleanSchemaSchema,StringSchemaSchema,NumberSchemaSchema]),ElicitRequestFormParamsSchema=TaskAugmentedRequestParamsSchema.extend({mode:literal("form").optional(),message:string2(),requestedSchema:object({type:literal("object"),properties:record(string2(),PrimitiveSchemaDefinitionSchema),required:array(string2()).optional()})}),ElicitRequestURLParamsSchema=TaskAugmentedRequestParamsSchema.extend({mode:literal("url"),message:string2(),elicitationId:string2(),url:string2().url()}),ElicitRequestParamsSchema=union([ElicitRequestFormParamsSchema,ElicitRequestURLParamsSchema]),ElicitRequestSchema=RequestSchema.extend({method:literal("elicitation/create"),params:ElicitRequestParamsSchema}),ElicitationCompleteNotificationParamsSchema=NotificationsParamsSchema.extend({elicitationId:string2()}),ElicitationCompleteNotificationSchema=NotificationSchema.extend({method:literal("notifications/elicitation/complete"),params:ElicitationCompleteNotificationParamsSchema}),ElicitResultSchema=ResultSchema.extend({action:_enum2(["accept","decline","cancel"]),content:preprocess((val)=>val===null?void 0:val,record(string2(),union([string2(),number2(),boolean2(),array(string2())])).optional())}),ResourceTemplateReferenceSchema=object({type:literal("ref/resource"),uri:string2()});var PromptReferenceSchema=object({type:literal("ref/prompt"),name:string2()}),CompleteRequestParamsSchema=BaseRequestParamsSchema.extend({ref:union([PromptReferenceSchema,ResourceTemplateReferenceSchema]),argument:object({name:string2(),value:string2()}),context:object({arguments:record(string2(),string2()).optional()}).optional()}),CompleteRequestSchema=RequestSchema.extend({method:literal("completion/complete"),params:CompleteRequestParamsSchema});var CompleteResultSchema=ResultSchema.extend({completion:looseObject({values:array(string2()).max(100),total:optional(number2().int()),hasMore:optional(boolean2())})}),RootSchema=object({uri:string2().startsWith("file://"),name:string2().optional(),_meta:record(string2(),unknown()).optional()}),ListRootsRequestSchema=RequestSchema.extend({method:literal("roots/list"),params:BaseRequestParamsSchema.optional()}),ListRootsResultSchema=ResultSchema.extend({roots:array(RootSchema)}),RootsListChangedNotificationSchema=NotificationSchema.extend({method:literal("notifications/roots/list_changed"),params:NotificationsParamsSchema.optional()}),ClientRequestSchema=union([PingRequestSchema,InitializeRequestSchema,CompleteRequestSchema,SetLevelRequestSchema,GetPromptRequestSchema,ListPromptsRequestSchema,ListResourcesRequestSchema,ListResourceTemplatesRequestSchema,ReadResourceRequestSchema,SubscribeRequestSchema,UnsubscribeRequestSchema,CallToolRequestSchema,ListToolsRequestSchema,GetTaskRequestSchema,GetTaskPayloadRequestSchema,ListTasksRequestSchema,CancelTaskRequestSchema]),ClientNotificationSchema=union([CancelledNotificationSchema,ProgressNotificationSchema,InitializedNotificationSchema,RootsListChangedNotificationSchema,TaskStatusNotificationSchema]),ClientResultSchema=union([EmptyResultSchema,CreateMessageResultSchema,CreateMessageResultWithToolsSchema,ElicitResultSchema,ListRootsResultSchema,GetTaskResultSchema,ListTasksResultSchema,CreateTaskResultSchema]),ServerRequestSchema=union([PingRequestSchema,CreateMessageRequestSchema,ElicitRequestSchema,ListRootsRequestSchema,GetTaskRequestSchema,GetTaskPayloadRequestSchema,ListTasksRequestSchema,CancelTaskRequestSchema]),ServerNotificationSchema=union([CancelledNotificationSchema,ProgressNotificationSchema,LoggingMessageNotificationSchema,ResourceUpdatedNotificationSchema,ResourceListChangedNotificationSchema,ToolListChangedNotificationSchema,PromptListChangedNotificationSchema,TaskStatusNotificationSchema,ElicitationCompleteNotificationSchema]),ServerResultSchema=union([EmptyResultSchema,InitializeResultSchema,CompleteResultSchema,GetPromptResultSchema,ListPromptsResultSchema,ListResourcesResultSchema,ListResourceTemplatesResultSchema,ReadResourceResultSchema,CallToolResultSchema,ListToolsResultSchema,GetTaskResultSchema,ListTasksResultSchema,CreateTaskResultSchema]);class McpError extends Error{constructor(code,message,data){super(`MCP error ${code}: ${message}`);this.code=code,this.data=data,this.name="McpError"}static fromError(code,message,data){if(code===ErrorCode.UrlElicitationRequired&&data){let errorData=data;if(errorData.elicitations)return new UrlElicitationRequiredError(errorData.elicitations,message)}return new McpError(code,message,data)}}class UrlElicitationRequiredError extends McpError{constructor(elicitations,message=`URL elicitation${elicitations.length>1?"s":""} required`){super(ErrorCode.UrlElicitationRequired,message,{elicitations})}get elicitations(){return this.data?.elicitations??[]}}function isTerminal(status){return status==="completed"||status==="failed"||status==="cancelled"}var ignoreOverride2=Symbol("Let zodToJsonSchema decide on which parser to use");var ALPHA_NUMERIC2=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function getMethodLiteral(schema2){let methodSchema=getObjectShape(schema2)?.method;if(!methodSchema)throw Error("Schema is missing a method literal");let value=getLiteralValue(methodSchema);if(typeof value!=="string")throw Error("Schema method literal must be a string");return value}function parseWithCompat(schema2,data){let result=safeParse3(schema2,data);if(!result.success)throw result.error;return result.data}var DEFAULT_REQUEST_TIMEOUT_MSEC=60000;class Protocol{constructor(_options){if(this._options=_options,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(CancelledNotificationSchema,(notification)=>{this._oncancel(notification)}),this.setNotificationHandler(ProgressNotificationSchema,(notification)=>{this._onprogress(notification)}),this.setRequestHandler(PingRequestSchema,(_request)=>({})),this._taskStore=_options?.taskStore,this._taskMessageQueue=_options?.taskMessageQueue,this._taskStore)this.setRequestHandler(GetTaskRequestSchema,async(request,extra)=>{let task=await this._taskStore.getTask(request.params.taskId,extra.sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,"Failed to retrieve task: Task not found");return{...task}}),this.setRequestHandler(GetTaskPayloadRequestSchema,async(request,extra)=>{let handleTaskResult=async()=>{let taskId=request.params.taskId;if(this._taskMessageQueue){let queuedMessage;while(queuedMessage=await this._taskMessageQueue.dequeue(taskId,extra.sessionId)){if(queuedMessage.type==="response"||queuedMessage.type==="error"){let message=queuedMessage.message,requestId=message.id,resolver=this._requestResolvers.get(requestId);if(resolver)if(this._requestResolvers.delete(requestId),queuedMessage.type==="response")resolver(message);else{let errorMessage=message,error48=new McpError(errorMessage.error.code,errorMessage.error.message,errorMessage.error.data);resolver(error48)}else{let messageType=queuedMessage.type==="response"?"Response":"Error";this._onerror(Error(`${messageType} handler missing for request ${requestId}`))}continue}await this._transport?.send(queuedMessage.message,{relatedRequestId:extra.requestId})}}let task=await this._taskStore.getTask(taskId,extra.sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,`Task not found: ${taskId}`);if(!isTerminal(task.status))return await this._waitForTaskUpdate(taskId,extra.signal),await handleTaskResult();if(isTerminal(task.status)){let result=await this._taskStore.getTaskResult(taskId,extra.sessionId);return this._clearTaskQueue(taskId),{...result,_meta:{...result._meta,[RELATED_TASK_META_KEY]:{taskId}}}}return await handleTaskResult()};return await handleTaskResult()}),this.setRequestHandler(ListTasksRequestSchema,async(request,extra)=>{try{let{tasks,nextCursor}=await this._taskStore.listTasks(request.params?.cursor,extra.sessionId);return{tasks,nextCursor,_meta:{}}}catch(error48){throw new McpError(ErrorCode.InvalidParams,`Failed to list tasks: ${error48 instanceof Error?error48.message:String(error48)}`)}}),this.setRequestHandler(CancelTaskRequestSchema,async(request,extra)=>{try{let task=await this._taskStore.getTask(request.params.taskId,extra.sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,`Task not found: ${request.params.taskId}`);if(isTerminal(task.status))throw new McpError(ErrorCode.InvalidParams,`Cannot cancel task in terminal status: ${task.status}`);await this._taskStore.updateTaskStatus(request.params.taskId,"cancelled","Client cancelled task execution.",extra.sessionId),this._clearTaskQueue(request.params.taskId);let cancelledTask=await this._taskStore.getTask(request.params.taskId,extra.sessionId);if(!cancelledTask)throw new McpError(ErrorCode.InvalidParams,`Task not found after cancellation: ${request.params.taskId}`);return{_meta:{},...cancelledTask}}catch(error48){if(error48 instanceof McpError)throw error48;throw new McpError(ErrorCode.InvalidRequest,`Failed to cancel task: ${error48 instanceof Error?error48.message:String(error48)}`)}})}async _oncancel(notification){if(!notification.params.requestId)return;this._requestHandlerAbortControllers.get(notification.params.requestId)?.abort(notification.params.reason)}_setupTimeout(messageId,timeout,maxTotalTimeout,onTimeout,resetTimeoutOnProgress=!1){this._timeoutInfo.set(messageId,{timeoutId:setTimeout(onTimeout,timeout),startTime:Date.now(),timeout,maxTotalTimeout,resetTimeoutOnProgress,onTimeout})}_resetTimeout(messageId){let info=this._timeoutInfo.get(messageId);if(!info)return!1;let totalElapsed=Date.now()-info.startTime;if(info.maxTotalTimeout&&totalElapsed>=info.maxTotalTimeout)throw this._timeoutInfo.delete(messageId),McpError.fromError(ErrorCode.RequestTimeout,"Maximum total timeout exceeded",{maxTotalTimeout:info.maxTotalTimeout,totalElapsed});return clearTimeout(info.timeoutId),info.timeoutId=setTimeout(info.onTimeout,info.timeout),!0}_cleanupTimeout(messageId){let info=this._timeoutInfo.get(messageId);if(info)clearTimeout(info.timeoutId),this._timeoutInfo.delete(messageId)}async connect(transport){if(this._transport)throw Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection.");this._transport=transport;let _onclose=this.transport?.onclose;this._transport.onclose=()=>{_onclose?.(),this._onclose()};let _onerror=this.transport?.onerror;this._transport.onerror=(error48)=>{_onerror?.(error48),this._onerror(error48)};let _onmessage=this._transport?.onmessage;this._transport.onmessage=(message,extra)=>{if(_onmessage?.(message,extra),isJSONRPCResultResponse(message)||isJSONRPCErrorResponse(message))this._onresponse(message);else if(isJSONRPCRequest(message))this._onrequest(message,extra);else if(isJSONRPCNotification(message))this._onnotification(message);else this._onerror(Error(`Unknown message type: ${JSON.stringify(message)}`))},await this._transport.start()}_onclose(){let responseHandlers=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();for(let info of this._timeoutInfo.values())clearTimeout(info.timeoutId);this._timeoutInfo.clear();for(let controller of this._requestHandlerAbortControllers.values())controller.abort();this._requestHandlerAbortControllers.clear();let error48=McpError.fromError(ErrorCode.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let handler of responseHandlers.values())handler(error48)}_onerror(error48){this.onerror?.(error48)}_onnotification(notification){let handler=this._notificationHandlers.get(notification.method)??this.fallbackNotificationHandler;if(handler===void 0)return;Promise.resolve().then(()=>handler(notification)).catch((error48)=>this._onerror(Error(`Uncaught error in notification handler: ${error48}`)))}_onrequest(request,extra){let handler=this._requestHandlers.get(request.method)??this.fallbackRequestHandler,capturedTransport=this._transport,relatedTaskId=request.params?._meta?.[RELATED_TASK_META_KEY]?.taskId;if(handler===void 0){let errorResponse={jsonrpc:"2.0",id:request.id,error:{code:ErrorCode.MethodNotFound,message:"Method not found"}};if(relatedTaskId&&this._taskMessageQueue)this._enqueueTaskMessage(relatedTaskId,{type:"error",message:errorResponse,timestamp:Date.now()},capturedTransport?.sessionId).catch((error48)=>this._onerror(Error(`Failed to enqueue error response: ${error48}`)));else capturedTransport?.send(errorResponse).catch((error48)=>this._onerror(Error(`Failed to send an error response: ${error48}`)));return}let abortController=new AbortController;this._requestHandlerAbortControllers.set(request.id,abortController);let taskCreationParams=isTaskAugmentedRequestParams(request.params)?request.params.task:void 0,taskStore=this._taskStore?this.requestTaskStore(request,capturedTransport?.sessionId):void 0,fullExtra={signal:abortController.signal,sessionId:capturedTransport?.sessionId,_meta:request.params?._meta,sendNotification:async(notification)=>{if(abortController.signal.aborted)return;let notificationOptions={relatedRequestId:request.id};if(relatedTaskId)notificationOptions.relatedTask={taskId:relatedTaskId};await this.notification(notification,notificationOptions)},sendRequest:async(r,resultSchema,options)=>{if(abortController.signal.aborted)throw new McpError(ErrorCode.ConnectionClosed,"Request was cancelled");let requestOptions={...options,relatedRequestId:request.id};if(relatedTaskId&&!requestOptions.relatedTask)requestOptions.relatedTask={taskId:relatedTaskId};let effectiveTaskId=requestOptions.relatedTask?.taskId??relatedTaskId;if(effectiveTaskId&&taskStore)await taskStore.updateTaskStatus(effectiveTaskId,"input_required");return await this.request(r,resultSchema,requestOptions)},authInfo:extra?.authInfo,requestId:request.id,requestInfo:extra?.requestInfo,taskId:relatedTaskId,taskStore,taskRequestedTtl:taskCreationParams?.ttl,closeSSEStream:extra?.closeSSEStream,closeStandaloneSSEStream:extra?.closeStandaloneSSEStream};Promise.resolve().then(()=>{if(taskCreationParams)this.assertTaskHandlerCapability(request.method)}).then(()=>handler(request,fullExtra)).then(async(result)=>{if(abortController.signal.aborted)return;let response={result,jsonrpc:"2.0",id:request.id};if(relatedTaskId&&this._taskMessageQueue)await this._enqueueTaskMessage(relatedTaskId,{type:"response",message:response,timestamp:Date.now()},capturedTransport?.sessionId);else await capturedTransport?.send(response)},async(error48)=>{if(abortController.signal.aborted)return;let errorResponse={jsonrpc:"2.0",id:request.id,error:{code:Number.isSafeInteger(error48.code)?error48.code:ErrorCode.InternalError,message:error48.message??"Internal error",...error48.data!==void 0&&{data:error48.data}}};if(relatedTaskId&&this._taskMessageQueue)await this._enqueueTaskMessage(relatedTaskId,{type:"error",message:errorResponse,timestamp:Date.now()},capturedTransport?.sessionId);else await capturedTransport?.send(errorResponse)}).catch((error48)=>this._onerror(Error(`Failed to send response: ${error48}`))).finally(()=>{if(this._requestHandlerAbortControllers.get(request.id)===abortController)this._requestHandlerAbortControllers.delete(request.id)})}_onprogress(notification){let{progressToken,...params}=notification.params,messageId=Number(progressToken),handler=this._progressHandlers.get(messageId);if(!handler){this._onerror(Error(`Received a progress notification for an unknown token: ${JSON.stringify(notification)}`));return}let responseHandler=this._responseHandlers.get(messageId),timeoutInfo=this._timeoutInfo.get(messageId);if(timeoutInfo&&responseHandler&&timeoutInfo.resetTimeoutOnProgress)try{this._resetTimeout(messageId)}catch(error48){this._responseHandlers.delete(messageId),this._progressHandlers.delete(messageId),this._cleanupTimeout(messageId),responseHandler(error48);return}handler(params)}_onresponse(response){let messageId=Number(response.id),resolver=this._requestResolvers.get(messageId);if(resolver){if(this._requestResolvers.delete(messageId),isJSONRPCResultResponse(response))resolver(response);else{let error48=new McpError(response.error.code,response.error.message,response.error.data);resolver(error48)}return}let handler=this._responseHandlers.get(messageId);if(handler===void 0){this._onerror(Error(`Received a response for an unknown message ID: ${JSON.stringify(response)}`));return}this._responseHandlers.delete(messageId),this._cleanupTimeout(messageId);let isTaskResponse=!1;if(isJSONRPCResultResponse(response)&&response.result&&typeof response.result==="object"){let result=response.result;if(result.task&&typeof result.task==="object"){let task=result.task;if(typeof task.taskId==="string")isTaskResponse=!0,this._taskProgressTokens.set(task.taskId,messageId)}}if(!isTaskResponse)this._progressHandlers.delete(messageId);if(isJSONRPCResultResponse(response))handler(response);else{let error48=McpError.fromError(response.error.code,response.error.message,response.error.data);handler(error48)}}get transport(){return this._transport}async close(){await this._transport?.close()}async*requestStream(request,resultSchema,options){let{task}=options??{};if(!task){try{yield{type:"result",result:await this.request(request,resultSchema,options)}}catch(error48){yield{type:"error",error:error48 instanceof McpError?error48:new McpError(ErrorCode.InternalError,String(error48))}}return}let taskId;try{let createResult=await this.request(request,CreateTaskResultSchema,options);if(createResult.task)taskId=createResult.task.taskId,yield{type:"taskCreated",task:createResult.task};else throw new McpError(ErrorCode.InternalError,"Task creation did not return a task");while(!0){let task2=await this.getTask({taskId},options);if(yield{type:"taskStatus",task:task2},isTerminal(task2.status)){if(task2.status==="completed")yield{type:"result",result:await this.getTaskResult({taskId},resultSchema,options)};else if(task2.status==="failed")yield{type:"error",error:new McpError(ErrorCode.InternalError,`Task ${taskId} failed`)};else if(task2.status==="cancelled")yield{type:"error",error:new McpError(ErrorCode.InternalError,`Task ${taskId} was cancelled`)};return}if(task2.status==="input_required"){yield{type:"result",result:await this.getTaskResult({taskId},resultSchema,options)};return}let pollInterval=task2.pollInterval??this._options?.defaultTaskPollInterval??1000;await new Promise((resolve2)=>setTimeout(resolve2,pollInterval)),options?.signal?.throwIfAborted()}}catch(error48){yield{type:"error",error:error48 instanceof McpError?error48:new McpError(ErrorCode.InternalError,String(error48))}}}request(request,resultSchema,options){let{relatedRequestId,resumptionToken,onresumptiontoken,task,relatedTask}=options??{};return new Promise((resolve2,reject)=>{let earlyReject=(error48)=>{reject(error48)};if(!this._transport){earlyReject(Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===!0)try{if(this.assertCapabilityForMethod(request.method),task)this.assertTaskCapability(request.method)}catch(e){earlyReject(e);return}options?.signal?.throwIfAborted();let messageId=this._requestMessageId++,jsonrpcRequest={...request,jsonrpc:"2.0",id:messageId};if(options?.onprogress)this._progressHandlers.set(messageId,options.onprogress),jsonrpcRequest.params={...request.params,_meta:{...request.params?._meta||{},progressToken:messageId}};if(task)jsonrpcRequest.params={...jsonrpcRequest.params,task};if(relatedTask)jsonrpcRequest.params={...jsonrpcRequest.params,_meta:{...jsonrpcRequest.params?._meta||{},[RELATED_TASK_META_KEY]:relatedTask}};let cancel=(reason)=>{this._responseHandlers.delete(messageId),this._progressHandlers.delete(messageId),this._cleanupTimeout(messageId),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:messageId,reason:String(reason)}},{relatedRequestId,resumptionToken,onresumptiontoken}).catch((error49)=>this._onerror(Error(`Failed to send cancellation: ${error49}`)));let error48=reason instanceof McpError?reason:new McpError(ErrorCode.RequestTimeout,String(reason));reject(error48)};this._responseHandlers.set(messageId,(response)=>{if(options?.signal?.aborted)return;if(response instanceof Error)return reject(response);try{let parseResult=safeParse3(resultSchema,response.result);if(!parseResult.success)reject(parseResult.error);else resolve2(parseResult.data)}catch(error48){reject(error48)}}),options?.signal?.addEventListener("abort",()=>{cancel(options?.signal?.reason)});let timeout=options?.timeout??DEFAULT_REQUEST_TIMEOUT_MSEC,timeoutHandler=()=>cancel(McpError.fromError(ErrorCode.RequestTimeout,"Request timed out",{timeout}));this._setupTimeout(messageId,timeout,options?.maxTotalTimeout,timeoutHandler,options?.resetTimeoutOnProgress??!1);let relatedTaskId=relatedTask?.taskId;if(relatedTaskId){let responseResolver=(response)=>{let handler=this._responseHandlers.get(messageId);if(handler)handler(response);else this._onerror(Error(`Response handler missing for side-channeled request ${messageId}`))};this._requestResolvers.set(messageId,responseResolver),this._enqueueTaskMessage(relatedTaskId,{type:"request",message:jsonrpcRequest,timestamp:Date.now()}).catch((error48)=>{this._cleanupTimeout(messageId),reject(error48)})}else this._transport.send(jsonrpcRequest,{relatedRequestId,resumptionToken,onresumptiontoken}).catch((error48)=>{this._cleanupTimeout(messageId),reject(error48)})})}async getTask(params,options){return this.request({method:"tasks/get",params},GetTaskResultSchema,options)}async getTaskResult(params,resultSchema,options){return this.request({method:"tasks/result",params},resultSchema,options)}async listTasks(params,options){return this.request({method:"tasks/list",params},ListTasksResultSchema,options)}async cancelTask(params,options){return this.request({method:"tasks/cancel",params},CancelTaskResultSchema,options)}async notification(notification,options){if(!this._transport)throw Error("Not connected");this.assertNotificationCapability(notification.method);let relatedTaskId=options?.relatedTask?.taskId;if(relatedTaskId){let jsonrpcNotification2={...notification,jsonrpc:"2.0",params:{...notification.params,_meta:{...notification.params?._meta||{},[RELATED_TASK_META_KEY]:options.relatedTask}}};await this._enqueueTaskMessage(relatedTaskId,{type:"notification",message:jsonrpcNotification2,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(notification.method)&&!notification.params&&!options?.relatedRequestId&&!options?.relatedTask){if(this._pendingDebouncedNotifications.has(notification.method))return;this._pendingDebouncedNotifications.add(notification.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(notification.method),!this._transport)return;let jsonrpcNotification2={...notification,jsonrpc:"2.0"};if(options?.relatedTask)jsonrpcNotification2={...jsonrpcNotification2,params:{...jsonrpcNotification2.params,_meta:{...jsonrpcNotification2.params?._meta||{},[RELATED_TASK_META_KEY]:options.relatedTask}}};this._transport?.send(jsonrpcNotification2,options).catch((error48)=>this._onerror(error48))});return}let jsonrpcNotification={...notification,jsonrpc:"2.0"};if(options?.relatedTask)jsonrpcNotification={...jsonrpcNotification,params:{...jsonrpcNotification.params,_meta:{...jsonrpcNotification.params?._meta||{},[RELATED_TASK_META_KEY]:options.relatedTask}}};await this._transport.send(jsonrpcNotification,options)}setRequestHandler(requestSchema,handler){let method=getMethodLiteral(requestSchema);this.assertRequestHandlerCapability(method),this._requestHandlers.set(method,(request,extra)=>{let parsed=parseWithCompat(requestSchema,request);return Promise.resolve(handler(parsed,extra))})}removeRequestHandler(method){this._requestHandlers.delete(method)}assertCanSetRequestHandler(method){if(this._requestHandlers.has(method))throw Error(`A request handler for ${method} already exists, which would be overridden`)}setNotificationHandler(notificationSchema,handler){let method=getMethodLiteral(notificationSchema);this._notificationHandlers.set(method,(notification)=>{let parsed=parseWithCompat(notificationSchema,notification);return Promise.resolve(handler(parsed))})}removeNotificationHandler(method){this._notificationHandlers.delete(method)}_cleanupTaskProgressHandler(taskId){let progressToken=this._taskProgressTokens.get(taskId);if(progressToken!==void 0)this._progressHandlers.delete(progressToken),this._taskProgressTokens.delete(taskId)}async _enqueueTaskMessage(taskId,message,sessionId){if(!this._taskStore||!this._taskMessageQueue)throw Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let maxQueueSize=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(taskId,message,sessionId,maxQueueSize)}async _clearTaskQueue(taskId,sessionId){if(this._taskMessageQueue){let messages=await this._taskMessageQueue.dequeueAll(taskId,sessionId);for(let message of messages)if(message.type==="request"&&isJSONRPCRequest(message.message)){let requestId=message.message.id,resolver=this._requestResolvers.get(requestId);if(resolver)resolver(new McpError(ErrorCode.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(requestId);else this._onerror(Error(`Resolver missing for request ${requestId} during task ${taskId} cleanup`))}}}async _waitForTaskUpdate(taskId,signal){let interval=this._options?.defaultTaskPollInterval??1000;try{let task=await this._taskStore?.getTask(taskId);if(task?.pollInterval)interval=task.pollInterval}catch{}return new Promise((resolve2,reject)=>{if(signal.aborted){reject(new McpError(ErrorCode.InvalidRequest,"Request cancelled"));return}let timeoutId=setTimeout(resolve2,interval);signal.addEventListener("abort",()=>{clearTimeout(timeoutId),reject(new McpError(ErrorCode.InvalidRequest,"Request cancelled"))},{once:!0})})}requestTaskStore(request,sessionId){let taskStore=this._taskStore;if(!taskStore)throw Error("No task store configured");return{createTask:async(taskParams)=>{if(!request)throw Error("No request provided");return await taskStore.createTask(taskParams,request.id,{method:request.method,params:request.params},sessionId)},getTask:async(taskId)=>{let task=await taskStore.getTask(taskId,sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,"Failed to retrieve task: Task not found");return task},storeTaskResult:async(taskId,status,result)=>{await taskStore.storeTaskResult(taskId,status,result,sessionId);let task=await taskStore.getTask(taskId,sessionId);if(task){let notification=TaskStatusNotificationSchema.parse({method:"notifications/tasks/status",params:task});if(await this.notification(notification),isTerminal(task.status))this._cleanupTaskProgressHandler(taskId)}},getTaskResult:(taskId)=>{return taskStore.getTaskResult(taskId,sessionId)},updateTaskStatus:async(taskId,status,statusMessage)=>{let task=await taskStore.getTask(taskId,sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,`Task "${taskId}" not found - it may have been cleaned up`);if(isTerminal(task.status))throw new McpError(ErrorCode.InvalidParams,`Cannot update task "${taskId}" from terminal status "${task.status}" to "${status}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await taskStore.updateTaskStatus(taskId,status,statusMessage,sessionId);let updatedTask=await taskStore.getTask(taskId,sessionId);if(updatedTask){let notification=TaskStatusNotificationSchema.parse({method:"notifications/tasks/status",params:updatedTask});if(await this.notification(notification),isTerminal(updatedTask.status))this._cleanupTaskProgressHandler(taskId)}},listTasks:(cursor)=>{return taskStore.listTasks(cursor,sessionId)}}}}function isPlainObject5(value){return value!==null&&typeof value==="object"&&!Array.isArray(value)}function mergeCapabilities(base,additional){let result={...base};for(let key in additional){let k=key,addValue=additional[k];if(addValue===void 0)continue;let baseValue=result[k];if(isPlainObject5(baseValue)&&isPlainObject5(addValue))result[k]={...baseValue,...addValue};else result[k]=addValue}return result}var import_ajv=__toESM(require_ajv(),1),import_ajv_formats=__toESM(require_dist(),1);function createDefaultAjvInstance(){let ajv=new import_ajv.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return import_ajv_formats.default(ajv),ajv}class AjvJsonSchemaValidator{constructor(ajv){this._ajv=ajv??createDefaultAjvInstance()}getValidator(schema2){let ajvValidator="$id"in schema2&&typeof schema2.$id==="string"?this._ajv.getSchema(schema2.$id)??this._ajv.compile(schema2):this._ajv.compile(schema2);return(input)=>{if(ajvValidator(input))return{valid:!0,data:input,errorMessage:void 0};else return{valid:!1,data:void 0,errorMessage:this._ajv.errorsText(ajvValidator.errors)}}}}class ExperimentalClientTasks{constructor(_client){this._client=_client}async*callToolStream(params,resultSchema=CallToolResultSchema,options){let clientInternal=this._client,optionsWithTask={...options,task:options?.task??(clientInternal.isToolTask(params.name)?{}:void 0)},stream=clientInternal.requestStream({method:"tools/call",params},resultSchema,optionsWithTask),validator=clientInternal.getToolOutputValidator(params.name);for await(let message of stream){if(message.type==="result"&&validator){let result=message.result;if(!result.structuredContent&&!result.isError){yield{type:"error",error:new McpError(ErrorCode.InvalidRequest,`Tool ${params.name} has an output schema but did not return structured content`)};return}if(result.structuredContent)try{let validationResult=validator(result.structuredContent);if(!validationResult.valid){yield{type:"error",error:new McpError(ErrorCode.InvalidParams,`Structured content does not match the tool's output schema: ${validationResult.errorMessage}`)};return}}catch(error48){if(error48 instanceof McpError){yield{type:"error",error:error48};return}yield{type:"error",error:new McpError(ErrorCode.InvalidParams,`Failed to validate structured content: ${error48 instanceof Error?error48.message:String(error48)}`)};return}}yield message}}async getTask(taskId,options){return this._client.getTask({taskId},options)}async getTaskResult(taskId,resultSchema,options){return this._client.getTaskResult({taskId},resultSchema,options)}async listTasks(cursor,options){return this._client.listTasks(cursor?{cursor}:void 0,options)}async cancelTask(taskId,options){return this._client.cancelTask({taskId},options)}requestStream(request,resultSchema,options){return this._client.requestStream(request,resultSchema,options)}}function assertToolsCallTaskCapability(requests,method,entityName){if(!requests)throw Error(`${entityName} does not support task creation (required for ${method})`);switch(method){case"tools/call":if(!requests.tools?.call)throw Error(`${entityName} does not support task creation for tools/call (required for ${method})`);break;default:break}}function assertClientRequestTaskCapability(requests,method,entityName){if(!requests)throw Error(`${entityName} does not support task creation (required for ${method})`);switch(method){case"sampling/createMessage":if(!requests.sampling?.createMessage)throw Error(`${entityName} does not support task creation for sampling/createMessage (required for ${method})`);break;case"elicitation/create":if(!requests.elicitation?.create)throw Error(`${entityName} does not support task creation for elicitation/create (required for ${method})`);break;default:break}}function applyElicitationDefaults(schema2,data){if(!schema2||data===null||typeof data!=="object")return;if(schema2.type==="object"&&schema2.properties&&typeof schema2.properties==="object"){let obj=data,props=schema2.properties;for(let key of Object.keys(props)){let propSchema=props[key];if(obj[key]===void 0&&Object.prototype.hasOwnProperty.call(propSchema,"default"))obj[key]=propSchema.default;if(obj[key]!==void 0)applyElicitationDefaults(propSchema,obj[key])}}if(Array.isArray(schema2.anyOf)){for(let sub of schema2.anyOf)if(typeof sub!=="boolean")applyElicitationDefaults(sub,data)}if(Array.isArray(schema2.oneOf)){for(let sub of schema2.oneOf)if(typeof sub!=="boolean")applyElicitationDefaults(sub,data)}}function getSupportedElicitationModes(capabilities){if(!capabilities)return{supportsFormMode:!1,supportsUrlMode:!1};let hasFormCapability=capabilities.form!==void 0,hasUrlCapability=capabilities.url!==void 0;return{supportsFormMode:hasFormCapability||!hasFormCapability&&!hasUrlCapability,supportsUrlMode:hasUrlCapability}}class Client extends Protocol{constructor(_clientInfo,options){super(options);if(this._clientInfo=_clientInfo,this._cachedToolOutputValidators=new Map,this._cachedKnownTaskTools=new Set,this._cachedRequiredTaskTools=new Set,this._listChangedDebounceTimers=new Map,this._capabilities=options?.capabilities??{},this._jsonSchemaValidator=options?.jsonSchemaValidator??new AjvJsonSchemaValidator,options?.listChanged)this._pendingListChangedConfig=options.listChanged}_setupListChangedHandlers(config2){if(config2.tools&&this._serverCapabilities?.tools?.listChanged)this._setupListChangedHandler("tools",ToolListChangedNotificationSchema,config2.tools,async()=>{return(await this.listTools()).tools});if(config2.prompts&&this._serverCapabilities?.prompts?.listChanged)this._setupListChangedHandler("prompts",PromptListChangedNotificationSchema,config2.prompts,async()=>{return(await this.listPrompts()).prompts});if(config2.resources&&this._serverCapabilities?.resources?.listChanged)this._setupListChangedHandler("resources",ResourceListChangedNotificationSchema,config2.resources,async()=>{return(await this.listResources()).resources})}get experimental(){if(!this._experimental)this._experimental={tasks:new ExperimentalClientTasks(this)};return this._experimental}registerCapabilities(capabilities){if(this.transport)throw Error("Cannot register capabilities after connecting to transport");this._capabilities=mergeCapabilities(this._capabilities,capabilities)}setRequestHandler(requestSchema,handler){let methodSchema=getObjectShape(requestSchema)?.method;if(!methodSchema)throw Error("Schema is missing a method literal");let methodValue;if(isZ4Schema(methodSchema)){let v4Schema=methodSchema;methodValue=v4Schema._zod?.def?.value??v4Schema.value}else{let v3Schema=methodSchema;methodValue=v3Schema._def?.value??v3Schema.value}if(typeof methodValue!=="string")throw Error("Schema method literal must be a string");let method=methodValue;if(method==="elicitation/create"){let wrappedHandler=async(request,extra)=>{let validatedRequest=safeParse3(ElicitRequestSchema,request);if(!validatedRequest.success){let errorMessage=validatedRequest.error instanceof Error?validatedRequest.error.message:String(validatedRequest.error);throw new McpError(ErrorCode.InvalidParams,`Invalid elicitation request: ${errorMessage}`)}let{params}=validatedRequest.data;params.mode=params.mode??"form";let{supportsFormMode,supportsUrlMode}=getSupportedElicitationModes(this._capabilities.elicitation);if(params.mode==="form"&&!supportsFormMode)throw new McpError(ErrorCode.InvalidParams,"Client does not support form-mode elicitation requests");if(params.mode==="url"&&!supportsUrlMode)throw new McpError(ErrorCode.InvalidParams,"Client does not support URL-mode elicitation requests");let result=await Promise.resolve(handler(request,extra));if(params.task){let taskValidationResult=safeParse3(CreateTaskResultSchema,result);if(!taskValidationResult.success){let errorMessage=taskValidationResult.error instanceof Error?taskValidationResult.error.message:String(taskValidationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid task creation result: ${errorMessage}`)}return taskValidationResult.data}let validationResult=safeParse3(ElicitResultSchema,result);if(!validationResult.success){let errorMessage=validationResult.error instanceof Error?validationResult.error.message:String(validationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid elicitation result: ${errorMessage}`)}let validatedResult=validationResult.data,requestedSchema=params.mode==="form"?params.requestedSchema:void 0;if(params.mode==="form"&&validatedResult.action==="accept"&&validatedResult.content&&requestedSchema){if(this._capabilities.elicitation?.form?.applyDefaults)try{applyElicitationDefaults(requestedSchema,validatedResult.content)}catch{}}return validatedResult};return super.setRequestHandler(requestSchema,wrappedHandler)}if(method==="sampling/createMessage"){let wrappedHandler=async(request,extra)=>{let validatedRequest=safeParse3(CreateMessageRequestSchema,request);if(!validatedRequest.success){let errorMessage=validatedRequest.error instanceof Error?validatedRequest.error.message:String(validatedRequest.error);throw new McpError(ErrorCode.InvalidParams,`Invalid sampling request: ${errorMessage}`)}let{params}=validatedRequest.data,result=await Promise.resolve(handler(request,extra));if(params.task){let taskValidationResult=safeParse3(CreateTaskResultSchema,result);if(!taskValidationResult.success){let errorMessage=taskValidationResult.error instanceof Error?taskValidationResult.error.message:String(taskValidationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid task creation result: ${errorMessage}`)}return taskValidationResult.data}let resultSchema=params.tools||params.toolChoice?CreateMessageResultWithToolsSchema:CreateMessageResultSchema,validationResult=safeParse3(resultSchema,result);if(!validationResult.success){let errorMessage=validationResult.error instanceof Error?validationResult.error.message:String(validationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid sampling result: ${errorMessage}`)}return validationResult.data};return super.setRequestHandler(requestSchema,wrappedHandler)}return super.setRequestHandler(requestSchema,handler)}assertCapability(capability,method){if(!this._serverCapabilities?.[capability])throw Error(`Server does not support ${capability} (required for ${method})`)}async connect(transport,options){if(await super.connect(transport),transport.sessionId!==void 0)return;try{let result=await this.request({method:"initialize",params:{protocolVersion:LATEST_PROTOCOL_VERSION,capabilities:this._capabilities,clientInfo:this._clientInfo}},InitializeResultSchema,options);if(result===void 0)throw Error(`Server sent invalid initialize result: ${result}`);if(!SUPPORTED_PROTOCOL_VERSIONS.includes(result.protocolVersion))throw Error(`Server's protocol version is not supported: ${result.protocolVersion}`);if(this._serverCapabilities=result.capabilities,this._serverVersion=result.serverInfo,transport.setProtocolVersion)transport.setProtocolVersion(result.protocolVersion);if(this._instructions=result.instructions,await this.notification({method:"notifications/initialized"}),this._pendingListChangedConfig)this._setupListChangedHandlers(this._pendingListChangedConfig),this._pendingListChangedConfig=void 0}catch(error48){throw this.close(),error48}}getServerCapabilities(){return this._serverCapabilities}getServerVersion(){return this._serverVersion}getInstructions(){return this._instructions}assertCapabilityForMethod(method){switch(method){case"logging/setLevel":if(!this._serverCapabilities?.logging)throw Error(`Server does not support logging (required for ${method})`);break;case"prompts/get":case"prompts/list":if(!this._serverCapabilities?.prompts)throw Error(`Server does not support prompts (required for ${method})`);break;case"resources/list":case"resources/templates/list":case"resources/read":case"resources/subscribe":case"resources/unsubscribe":if(!this._serverCapabilities?.resources)throw Error(`Server does not support resources (required for ${method})`);if(method==="resources/subscribe"&&!this._serverCapabilities.resources.subscribe)throw Error(`Server does not support resource subscriptions (required for ${method})`);break;case"tools/call":case"tools/list":if(!this._serverCapabilities?.tools)throw Error(`Server does not support tools (required for ${method})`);break;case"completion/complete":if(!this._serverCapabilities?.completions)throw Error(`Server does not support completions (required for ${method})`);break;case"initialize":break;case"ping":break}}assertNotificationCapability(method){switch(method){case"notifications/roots/list_changed":if(!this._capabilities.roots?.listChanged)throw Error(`Client does not support roots list changed notifications (required for ${method})`);break;case"notifications/initialized":break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(method){if(!this._capabilities)return;switch(method){case"sampling/createMessage":if(!this._capabilities.sampling)throw Error(`Client does not support sampling capability (required for ${method})`);break;case"elicitation/create":if(!this._capabilities.elicitation)throw Error(`Client does not support elicitation capability (required for ${method})`);break;case"roots/list":if(!this._capabilities.roots)throw Error(`Client does not support roots capability (required for ${method})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw Error(`Client does not support tasks capability (required for ${method})`);break;case"ping":break}}assertTaskCapability(method){assertToolsCallTaskCapability(this._serverCapabilities?.tasks?.requests,method,"Server")}assertTaskHandlerCapability(method){if(!this._capabilities)return;assertClientRequestTaskCapability(this._capabilities.tasks?.requests,method,"Client")}async ping(options){return this.request({method:"ping"},EmptyResultSchema,options)}async complete(params,options){return this.request({method:"completion/complete",params},CompleteResultSchema,options)}async setLoggingLevel(level,options){return this.request({method:"logging/setLevel",params:{level}},EmptyResultSchema,options)}async getPrompt(params,options){return this.request({method:"prompts/get",params},GetPromptResultSchema,options)}async listPrompts(params,options){return this.request({method:"prompts/list",params},ListPromptsResultSchema,options)}async listResources(params,options){return this.request({method:"resources/list",params},ListResourcesResultSchema,options)}async listResourceTemplates(params,options){return this.request({method:"resources/templates/list",params},ListResourceTemplatesResultSchema,options)}async readResource(params,options){return this.request({method:"resources/read",params},ReadResourceResultSchema,options)}async subscribeResource(params,options){return this.request({method:"resources/subscribe",params},EmptyResultSchema,options)}async unsubscribeResource(params,options){return this.request({method:"resources/unsubscribe",params},EmptyResultSchema,options)}async callTool(params,resultSchema=CallToolResultSchema,options){if(this.isToolTaskRequired(params.name))throw new McpError(ErrorCode.InvalidRequest,`Tool "${params.name}" requires task-based execution. Use client.experimental.tasks.callToolStream() instead.`);let result=await this.request({method:"tools/call",params},resultSchema,options),validator=this.getToolOutputValidator(params.name);if(validator){if(!result.structuredContent&&!result.isError)throw new McpError(ErrorCode.InvalidRequest,`Tool ${params.name} has an output schema but did not return structured content`);if(result.structuredContent)try{let validationResult=validator(result.structuredContent);if(!validationResult.valid)throw new McpError(ErrorCode.InvalidParams,`Structured content does not match the tool's output schema: ${validationResult.errorMessage}`)}catch(error48){if(error48 instanceof McpError)throw error48;throw new McpError(ErrorCode.InvalidParams,`Failed to validate structured content: ${error48 instanceof Error?error48.message:String(error48)}`)}}return result}isToolTask(toolName){if(!this._serverCapabilities?.tasks?.requests?.tools?.call)return!1;return this._cachedKnownTaskTools.has(toolName)}isToolTaskRequired(toolName){return this._cachedRequiredTaskTools.has(toolName)}cacheToolMetadata(tools){this._cachedToolOutputValidators.clear(),this._cachedKnownTaskTools.clear(),this._cachedRequiredTaskTools.clear();for(let tool2 of tools){if(tool2.outputSchema){let toolValidator=this._jsonSchemaValidator.getValidator(tool2.outputSchema);this._cachedToolOutputValidators.set(tool2.name,toolValidator)}let taskSupport=tool2.execution?.taskSupport;if(taskSupport==="required"||taskSupport==="optional")this._cachedKnownTaskTools.add(tool2.name);if(taskSupport==="required")this._cachedRequiredTaskTools.add(tool2.name)}}getToolOutputValidator(toolName){return this._cachedToolOutputValidators.get(toolName)}async listTools(params,options){let result=await this.request({method:"tools/list",params},ListToolsResultSchema,options);return this.cacheToolMetadata(result.tools),result}_setupListChangedHandler(listType,notificationSchema,options,fetcher){let parseResult=ListChangedOptionsBaseSchema.safeParse(options);if(!parseResult.success)throw Error(`Invalid ${listType} listChanged options: ${parseResult.error.message}`);if(typeof options.onChanged!=="function")throw Error(`Invalid ${listType} listChanged options: onChanged must be a function`);let{autoRefresh,debounceMs}=parseResult.data,{onChanged}=options,refresh=async()=>{if(!autoRefresh){onChanged(null,null);return}try{let items=await fetcher();onChanged(null,items)}catch(e){let error48=e instanceof Error?e:Error(String(e));onChanged(error48,null)}},handler=()=>{if(debounceMs){let existingTimer=this._listChangedDebounceTimers.get(listType);if(existingTimer)clearTimeout(existingTimer);let timer=setTimeout(refresh,debounceMs);this._listChangedDebounceTimers.set(listType,timer)}else refresh()};this.setNotificationHandler(notificationSchema,handler)}async sendRootsListChanged(){return this.notification({method:"notifications/roots/list_changed"})}}function normalizeHeaders2(headers){if(!headers)return{};if(headers instanceof Headers)return Object.fromEntries(headers.entries());if(Array.isArray(headers))return Object.fromEntries(headers);return{...headers}}function createFetchWithInit(baseFetch=fetch,baseInit){if(!baseInit)return baseFetch;return async(url2,init)=>{let mergedInit={...baseInit,...init,headers:init?.headers?{...normalizeHeaders2(baseInit.headers),...normalizeHeaders2(init.headers)}:baseInit.headers};return baseFetch(url2,mergedInit)}}var crypto2;crypto2=globalThis.crypto?.webcrypto??globalThis.crypto??import("node:crypto").then((m)=>m.webcrypto);async function getRandomValues(size){return(await crypto2).getRandomValues(new Uint8Array(size))}async function random(size){let evenDistCutoff=Math.pow(2,8)-Math.pow(2,8)%66,result="";while(result.length<size){let randomBytes=await getRandomValues(size-result.length);for(let randomByte of randomBytes)if(randomByte<evenDistCutoff)result+="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~"[randomByte%66]}return result}async function generateVerifier(length){return await random(length)}async function generateChallenge(code_verifier){let buffer=await(await crypto2).subtle.digest("SHA-256",new TextEncoder().encode(code_verifier));return btoa(String.fromCharCode(...new Uint8Array(buffer))).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}async function pkceChallenge(length){if(!length)length=43;if(length<43||length>128)throw`Expected a length between 43 and 128. Received ${length}.`;let verifier=await generateVerifier(length),challenge=await generateChallenge(verifier);return{code_verifier:verifier,code_challenge:challenge}}init_v4();var SafeUrlSchema=url().superRefine((val,ctx)=>{if(!URL.canParse(val))return ctx.addIssue({code:ZodIssueCode.custom,message:"URL must be parseable",fatal:!0}),NEVER}).refine((url2)=>{let u=new URL(url2);return u.protocol!=="javascript:"&&u.protocol!=="data:"&&u.protocol!=="vbscript:"},{message:"URL cannot use javascript:, data:, or vbscript: scheme"}),OAuthProtectedResourceMetadataSchema=looseObject({resource:string2().url(),authorization_servers:array(SafeUrlSchema).optional(),jwks_uri:string2().url().optional(),scopes_supported:array(string2()).optional(),bearer_methods_supported:array(string2()).optional(),resource_signing_alg_values_supported:array(string2()).optional(),resource_name:string2().optional(),resource_documentation:string2().optional(),resource_policy_uri:string2().url().optional(),resource_tos_uri:string2().url().optional(),tls_client_certificate_bound_access_tokens:boolean2().optional(),authorization_details_types_supported:array(string2()).optional(),dpop_signing_alg_values_supported:array(string2()).optional(),dpop_bound_access_tokens_required:boolean2().optional()}),OAuthMetadataSchema=looseObject({issuer:string2(),authorization_endpoint:SafeUrlSchema,token_endpoint:SafeUrlSchema,registration_endpoint:SafeUrlSchema.optional(),scopes_supported:array(string2()).optional(),response_types_supported:array(string2()),response_modes_supported:array(string2()).optional(),grant_types_supported:array(string2()).optional(),token_endpoint_auth_methods_supported:array(string2()).optional(),token_endpoint_auth_signing_alg_values_supported:array(string2()).optional(),service_documentation:SafeUrlSchema.optional(),revocation_endpoint:SafeUrlSchema.optional(),revocation_endpoint_auth_methods_supported:array(string2()).optional(),revocation_endpoint_auth_signing_alg_values_supported:array(string2()).optional(),introspection_endpoint:string2().optional(),introspection_endpoint_auth_methods_supported:array(string2()).optional(),introspection_endpoint_auth_signing_alg_values_supported:array(string2()).optional(),code_challenge_methods_supported:array(string2()).optional(),client_id_metadata_document_supported:boolean2().optional()}),OpenIdProviderMetadataSchema=looseObject({issuer:string2(),authorization_endpoint:SafeUrlSchema,token_endpoint:SafeUrlSchema,userinfo_endpoint:SafeUrlSchema.optional(),jwks_uri:SafeUrlSchema,registration_endpoint:SafeUrlSchema.optional(),scopes_supported:array(string2()).optional(),response_types_supported:array(string2()),response_modes_supported:array(string2()).optional(),grant_types_supported:array(string2()).optional(),acr_values_supported:array(string2()).optional(),subject_types_supported:array(string2()),id_token_signing_alg_values_supported:array(string2()),id_token_encryption_alg_values_supported:array(string2()).optional(),id_token_encryption_enc_values_supported:array(string2()).optional(),userinfo_signing_alg_values_supported:array(string2()).optional(),userinfo_encryption_alg_values_supported:array(string2()).optional(),userinfo_encryption_enc_values_supported:array(string2()).optional(),request_object_signing_alg_values_supported:array(string2()).optional(),request_object_encryption_alg_values_supported:array(string2()).optional(),request_object_encryption_enc_values_supported:array(string2()).optional(),token_endpoint_auth_methods_supported:array(string2()).optional(),token_endpoint_auth_signing_alg_values_supported:array(string2()).optional(),display_values_supported:array(string2()).optional(),claim_types_supported:array(string2()).optional(),claims_supported:array(string2()).optional(),service_documentation:string2().optional(),claims_locales_supported:array(string2()).optional(),ui_locales_supported:array(string2()).optional(),claims_parameter_supported:boolean2().optional(),request_parameter_supported:boolean2().optional(),request_uri_parameter_supported:boolean2().optional(),require_request_uri_registration:boolean2().optional(),op_policy_uri:SafeUrlSchema.optional(),op_tos_uri:SafeUrlSchema.optional(),client_id_metadata_document_supported:boolean2().optional()}),OpenIdProviderDiscoveryMetadataSchema=object({...OpenIdProviderMetadataSchema.shape,...OAuthMetadataSchema.pick({code_challenge_methods_supported:!0}).shape}),OAuthTokensSchema=object({access_token:string2(),id_token:string2().optional(),token_type:string2(),expires_in:exports_coerce.number().optional(),scope:string2().optional(),refresh_token:string2().optional()}).strip(),OAuthErrorResponseSchema=object({error:string2(),error_description:string2().optional(),error_uri:string2().optional()}),OptionalSafeUrlSchema=SafeUrlSchema.optional().or(literal("").transform(()=>{return})),OAuthClientMetadataSchema=object({redirect_uris:array(SafeUrlSchema),token_endpoint_auth_method:string2().optional(),grant_types:array(string2()).optional(),response_types:array(string2()).optional(),client_name:string2().optional(),client_uri:SafeUrlSchema.optional(),logo_uri:OptionalSafeUrlSchema,scope:string2().optional(),contacts:array(string2()).optional(),tos_uri:OptionalSafeUrlSchema,policy_uri:string2().optional(),jwks_uri:SafeUrlSchema.optional(),jwks:any().optional(),software_id:string2().optional(),software_version:string2().optional(),software_statement:string2().optional()}).strip(),OAuthClientInformationSchema=object({client_id:string2(),client_secret:string2().optional(),client_id_issued_at:number2().optional(),client_secret_expires_at:number2().optional()}).strip(),OAuthClientInformationFullSchema=OAuthClientMetadataSchema.merge(OAuthClientInformationSchema),OAuthClientRegistrationErrorSchema=object({error:string2(),error_description:string2().optional()}).strip(),OAuthTokenRevocationRequestSchema=object({token:string2(),token_type_hint:string2().optional()}).strip();function resourceUrlFromServerUrl(url2){let resourceURL=typeof url2==="string"?new URL(url2):new URL(url2.href);return resourceURL.hash="",resourceURL}function checkResourceAllowed({requestedResource,configuredResource}){let requested=typeof requestedResource==="string"?new URL(requestedResource):new URL(requestedResource.href),configured=typeof configuredResource==="string"?new URL(configuredResource):new URL(configuredResource.href);if(requested.origin!==configured.origin)return!1;if(requested.pathname.length<configured.pathname.length)return!1;let requestedPath=requested.pathname.endsWith("/")?requested.pathname:requested.pathname+"/",configuredPath=configured.pathname.endsWith("/")?configured.pathname:configured.pathname+"/";return requestedPath.startsWith(configuredPath)}class OAuthError extends Error{constructor(message,errorUri){super(message);this.errorUri=errorUri,this.name=this.constructor.name}toResponseObject(){let response={error:this.errorCode,error_description:this.message};if(this.errorUri)response.error_uri=this.errorUri;return response}get errorCode(){return this.constructor.errorCode}}class InvalidRequestError extends OAuthError{}InvalidRequestError.errorCode="invalid_request";class InvalidClientError extends OAuthError{}InvalidClientError.errorCode="invalid_client";class InvalidGrantError extends OAuthError{}InvalidGrantError.errorCode="invalid_grant";class UnauthorizedClientError extends OAuthError{}UnauthorizedClientError.errorCode="unauthorized_client";class UnsupportedGrantTypeError extends OAuthError{}UnsupportedGrantTypeError.errorCode="unsupported_grant_type";class InvalidScopeError extends OAuthError{}InvalidScopeError.errorCode="invalid_scope";class AccessDeniedError extends OAuthError{}AccessDeniedError.errorCode="access_denied";class ServerError extends OAuthError{}ServerError.errorCode="server_error";class TemporarilyUnavailableError extends OAuthError{}TemporarilyUnavailableError.errorCode="temporarily_unavailable";class UnsupportedResponseTypeError extends OAuthError{}UnsupportedResponseTypeError.errorCode="unsupported_response_type";class UnsupportedTokenTypeError extends OAuthError{}UnsupportedTokenTypeError.errorCode="unsupported_token_type";class InvalidTokenError extends OAuthError{}InvalidTokenError.errorCode="invalid_token";class MethodNotAllowedError extends OAuthError{}MethodNotAllowedError.errorCode="method_not_allowed";class TooManyRequestsError extends OAuthError{}TooManyRequestsError.errorCode="too_many_requests";class InvalidClientMetadataError extends OAuthError{}InvalidClientMetadataError.errorCode="invalid_client_metadata";class InsufficientScopeError extends OAuthError{}InsufficientScopeError.errorCode="insufficient_scope";class InvalidTargetError extends OAuthError{}InvalidTargetError.errorCode="invalid_target";var OAUTH_ERRORS={[InvalidRequestError.errorCode]:InvalidRequestError,[InvalidClientError.errorCode]:InvalidClientError,[InvalidGrantError.errorCode]:InvalidGrantError,[UnauthorizedClientError.errorCode]:UnauthorizedClientError,[UnsupportedGrantTypeError.errorCode]:UnsupportedGrantTypeError,[InvalidScopeError.errorCode]:InvalidScopeError,[AccessDeniedError.errorCode]:AccessDeniedError,[ServerError.errorCode]:ServerError,[TemporarilyUnavailableError.errorCode]:TemporarilyUnavailableError,[UnsupportedResponseTypeError.errorCode]:UnsupportedResponseTypeError,[UnsupportedTokenTypeError.errorCode]:UnsupportedTokenTypeError,[InvalidTokenError.errorCode]:InvalidTokenError,[MethodNotAllowedError.errorCode]:MethodNotAllowedError,[TooManyRequestsError.errorCode]:TooManyRequestsError,[InvalidClientMetadataError.errorCode]:InvalidClientMetadataError,[InsufficientScopeError.errorCode]:InsufficientScopeError,[InvalidTargetError.errorCode]:InvalidTargetError};class UnauthorizedError extends Error{constructor(message){super(message??"Unauthorized")}}function isClientAuthMethod(method){return["client_secret_basic","client_secret_post","none"].includes(method)}var AUTHORIZATION_CODE_RESPONSE_TYPE="code",AUTHORIZATION_CODE_CHALLENGE_METHOD="S256";function selectClientAuthMethod(clientInformation,supportedMethods){let hasClientSecret=clientInformation.client_secret!==void 0;if("token_endpoint_auth_method"in clientInformation&&clientInformation.token_endpoint_auth_method&&isClientAuthMethod(clientInformation.token_endpoint_auth_method)&&(supportedMethods.length===0||supportedMethods.includes(clientInformation.token_endpoint_auth_method)))return clientInformation.token_endpoint_auth_method;if(supportedMethods.length===0)return hasClientSecret?"client_secret_basic":"none";if(hasClientSecret&&supportedMethods.includes("client_secret_basic"))return"client_secret_basic";if(hasClientSecret&&supportedMethods.includes("client_secret_post"))return"client_secret_post";if(supportedMethods.includes("none"))return"none";return hasClientSecret?"client_secret_post":"none"}function applyClientAuthentication(method,clientInformation,headers,params){let{client_id,client_secret}=clientInformation;switch(method){case"client_secret_basic":applyBasicAuth(client_id,client_secret,headers);return;case"client_secret_post":applyPostAuth(client_id,client_secret,params);return;case"none":applyPublicAuth(client_id,params);return;default:throw Error(`Unsupported client authentication method: ${method}`)}}function applyBasicAuth(clientId,clientSecret,headers){if(!clientSecret)throw Error("client_secret_basic authentication requires a client_secret");let credentials=btoa(`${clientId}:${clientSecret}`);headers.set("Authorization",`Basic ${credentials}`)}function applyPostAuth(clientId,clientSecret,params){if(params.set("client_id",clientId),clientSecret)params.set("client_secret",clientSecret)}function applyPublicAuth(clientId,params){params.set("client_id",clientId)}async function parseErrorResponse(input){let statusCode=input instanceof Response?input.status:void 0,body=input instanceof Response?await input.text():input;try{let result=OAuthErrorResponseSchema.parse(JSON.parse(body)),{error:error48,error_description,error_uri}=result;return new(OAUTH_ERRORS[error48]||ServerError)(error_description||"",error_uri)}catch(error48){let errorMessage=`${statusCode?`HTTP ${statusCode}: `:""}Invalid OAuth error response: ${error48}. Raw body: ${body}`;return new ServerError(errorMessage)}}async function auth(provider,options){try{return await authInternal(provider,options)}catch(error48){if(error48 instanceof InvalidClientError||error48 instanceof UnauthorizedClientError)return await provider.invalidateCredentials?.("all"),await authInternal(provider,options);else if(error48 instanceof InvalidGrantError)return await provider.invalidateCredentials?.("tokens"),await authInternal(provider,options);throw error48}}async function authInternal(provider,{serverUrl,authorizationCode,scope,resourceMetadataUrl,fetchFn}){let cachedState=await provider.discoveryState?.(),resourceMetadata,authorizationServerUrl,metadata,effectiveResourceMetadataUrl=resourceMetadataUrl;if(!effectiveResourceMetadataUrl&&cachedState?.resourceMetadataUrl)effectiveResourceMetadataUrl=new URL(cachedState.resourceMetadataUrl);if(cachedState?.authorizationServerUrl){if(authorizationServerUrl=cachedState.authorizationServerUrl,resourceMetadata=cachedState.resourceMetadata,metadata=cachedState.authorizationServerMetadata??await discoverAuthorizationServerMetadata(authorizationServerUrl,{fetchFn}),!resourceMetadata)try{resourceMetadata=await discoverOAuthProtectedResourceMetadata(serverUrl,{resourceMetadataUrl:effectiveResourceMetadataUrl},fetchFn)}catch{}if(metadata!==cachedState.authorizationServerMetadata||resourceMetadata!==cachedState.resourceMetadata)await provider.saveDiscoveryState?.({authorizationServerUrl:String(authorizationServerUrl),resourceMetadataUrl:effectiveResourceMetadataUrl?.toString(),resourceMetadata,authorizationServerMetadata:metadata})}else{let serverInfo=await discoverOAuthServerInfo(serverUrl,{resourceMetadataUrl:effectiveResourceMetadataUrl,fetchFn});authorizationServerUrl=serverInfo.authorizationServerUrl,metadata=serverInfo.authorizationServerMetadata,resourceMetadata=serverInfo.resourceMetadata,await provider.saveDiscoveryState?.({authorizationServerUrl:String(authorizationServerUrl),resourceMetadataUrl:effectiveResourceMetadataUrl?.toString(),resourceMetadata,authorizationServerMetadata:metadata})}let resource=await selectResourceURL(serverUrl,provider,resourceMetadata),resolvedScope=scope||resourceMetadata?.scopes_supported?.join(" ")||provider.clientMetadata.scope,clientInformation=await Promise.resolve(provider.clientInformation());if(!clientInformation){if(authorizationCode!==void 0)throw Error("Existing OAuth client information is required when exchanging an authorization code");let supportsUrlBasedClientId=metadata?.client_id_metadata_document_supported===!0,clientMetadataUrl=provider.clientMetadataUrl;if(clientMetadataUrl&&!isHttpsUrl(clientMetadataUrl))throw new InvalidClientMetadataError(`clientMetadataUrl must be a valid HTTPS URL with a non-root pathname, got: ${clientMetadataUrl}`);if(supportsUrlBasedClientId&&clientMetadataUrl)clientInformation={client_id:clientMetadataUrl},await provider.saveClientInformation?.(clientInformation);else{if(!provider.saveClientInformation)throw Error("OAuth client information must be saveable for dynamic registration");let fullInformation=await registerClient(authorizationServerUrl,{metadata,clientMetadata:provider.clientMetadata,scope:resolvedScope,fetchFn});await provider.saveClientInformation(fullInformation),clientInformation=fullInformation}}let nonInteractiveFlow=!provider.redirectUrl;if(authorizationCode!==void 0||nonInteractiveFlow){let tokens2=await fetchToken(provider,authorizationServerUrl,{metadata,resource,authorizationCode,fetchFn});return await provider.saveTokens(tokens2),"AUTHORIZED"}let tokens=await provider.tokens();if(tokens?.refresh_token)try{let newTokens=await refreshAuthorization(authorizationServerUrl,{metadata,clientInformation,refreshToken:tokens.refresh_token,resource,addClientAuthentication:provider.addClientAuthentication,fetchFn});return await provider.saveTokens(newTokens),"AUTHORIZED"}catch(error48){if(!(error48 instanceof OAuthError)||error48 instanceof ServerError);else throw error48}let state=provider.state?await provider.state():void 0,{authorizationUrl,codeVerifier}=await startAuthorization(authorizationServerUrl,{metadata,clientInformation,state,redirectUrl:provider.redirectUrl,scope:resolvedScope,resource});return await provider.saveCodeVerifier(codeVerifier),await provider.redirectToAuthorization(authorizationUrl),"REDIRECT"}function isHttpsUrl(value){if(!value)return!1;try{let url2=new URL(value);return url2.protocol==="https:"&&url2.pathname!=="/"}catch{return!1}}async function selectResourceURL(serverUrl,provider,resourceMetadata){let defaultResource=resourceUrlFromServerUrl(serverUrl);if(provider.validateResourceURL)return await provider.validateResourceURL(defaultResource,resourceMetadata?.resource);if(!resourceMetadata)return;if(!checkResourceAllowed({requestedResource:defaultResource,configuredResource:resourceMetadata.resource}))throw Error(`Protected resource ${resourceMetadata.resource} does not match expected ${defaultResource} (or origin)`);return new URL(resourceMetadata.resource)}function extractWWWAuthenticateParams(res){let authenticateHeader=res.headers.get("WWW-Authenticate");if(!authenticateHeader)return{};let[type,scheme]=authenticateHeader.split(" ");if(type.toLowerCase()!=="bearer"||!scheme)return{};let resourceMetadataMatch=extractFieldFromWwwAuth(res,"resource_metadata")||void 0,resourceMetadataUrl;if(resourceMetadataMatch)try{resourceMetadataUrl=new URL(resourceMetadataMatch)}catch{}let scope=extractFieldFromWwwAuth(res,"scope")||void 0,error48=extractFieldFromWwwAuth(res,"error")||void 0;return{resourceMetadataUrl,scope,error:error48}}function extractFieldFromWwwAuth(response,fieldName){let wwwAuthHeader=response.headers.get("WWW-Authenticate");if(!wwwAuthHeader)return null;let pattern=new RegExp(`${fieldName}=(?:"([^"]+)"|([^\\s,]+))`),match=wwwAuthHeader.match(pattern);if(match)return match[1]||match[2];return null}async function discoverOAuthProtectedResourceMetadata(serverUrl,opts,fetchFn=fetch){let response=await discoverMetadataWithFallback(serverUrl,"oauth-protected-resource",fetchFn,{protocolVersion:opts?.protocolVersion,metadataUrl:opts?.resourceMetadataUrl});if(!response||response.status===404)throw await response?.body?.cancel(),Error("Resource server does not implement OAuth 2.0 Protected Resource Metadata.");if(!response.ok)throw await response.body?.cancel(),Error(`HTTP ${response.status} trying to load well-known OAuth protected resource metadata.`);return OAuthProtectedResourceMetadataSchema.parse(await response.json())}async function fetchWithCorsRetry(url2,headers,fetchFn=fetch){try{return await fetchFn(url2,{headers})}catch(error48){if(error48 instanceof TypeError)if(headers)return fetchWithCorsRetry(url2,void 0,fetchFn);else return;throw error48}}function buildWellKnownPath(wellKnownPrefix,pathname="",options={}){if(pathname.endsWith("/"))pathname=pathname.slice(0,-1);return options.prependPathname?`${pathname}/.well-known/${wellKnownPrefix}`:`/.well-known/${wellKnownPrefix}${pathname}`}async function tryMetadataDiscovery(url2,protocolVersion,fetchFn=fetch){return await fetchWithCorsRetry(url2,{"MCP-Protocol-Version":protocolVersion},fetchFn)}function shouldAttemptFallback(response,pathname){return!response||response.status>=400&&response.status<500&&pathname!=="/"}async function discoverMetadataWithFallback(serverUrl,wellKnownType,fetchFn,opts){let issuer=new URL(serverUrl),protocolVersion=opts?.protocolVersion??LATEST_PROTOCOL_VERSION,url2;if(opts?.metadataUrl)url2=new URL(opts.metadataUrl);else{let wellKnownPath=buildWellKnownPath(wellKnownType,issuer.pathname);url2=new URL(wellKnownPath,opts?.metadataServerUrl??issuer),url2.search=issuer.search}let response=await tryMetadataDiscovery(url2,protocolVersion,fetchFn);if(!opts?.metadataUrl&&shouldAttemptFallback(response,issuer.pathname)){let rootUrl=new URL(`/.well-known/${wellKnownType}`,issuer);response=await tryMetadataDiscovery(rootUrl,protocolVersion,fetchFn)}return response}function buildDiscoveryUrls(authorizationServerUrl){let url2=typeof authorizationServerUrl==="string"?new URL(authorizationServerUrl):authorizationServerUrl,hasPath=url2.pathname!=="/",urlsToTry=[];if(!hasPath)return urlsToTry.push({url:new URL("/.well-known/oauth-authorization-server",url2.origin),type:"oauth"}),urlsToTry.push({url:new URL("/.well-known/openid-configuration",url2.origin),type:"oidc"}),urlsToTry;let pathname=url2.pathname;if(pathname.endsWith("/"))pathname=pathname.slice(0,-1);return urlsToTry.push({url:new URL(`/.well-known/oauth-authorization-server${pathname}`,url2.origin),type:"oauth"}),urlsToTry.push({url:new URL(`/.well-known/openid-configuration${pathname}`,url2.origin),type:"oidc"}),urlsToTry.push({url:new URL(`${pathname}/.well-known/openid-configuration`,url2.origin),type:"oidc"}),urlsToTry}async function discoverAuthorizationServerMetadata(authorizationServerUrl,{fetchFn=fetch,protocolVersion=LATEST_PROTOCOL_VERSION}={}){let headers={"MCP-Protocol-Version":protocolVersion,Accept:"application/json"},urlsToTry=buildDiscoveryUrls(authorizationServerUrl);for(let{url:endpointUrl,type}of urlsToTry){let response=await fetchWithCorsRetry(endpointUrl,headers,fetchFn);if(!response)continue;if(!response.ok){if(await response.body?.cancel(),response.status>=400&&response.status<500)continue;throw Error(`HTTP ${response.status} trying to load ${type==="oauth"?"OAuth":"OpenID provider"} metadata from ${endpointUrl}`)}if(type==="oauth")return OAuthMetadataSchema.parse(await response.json());else return OpenIdProviderDiscoveryMetadataSchema.parse(await response.json())}return}async function discoverOAuthServerInfo(serverUrl,opts){let resourceMetadata,authorizationServerUrl;try{if(resourceMetadata=await discoverOAuthProtectedResourceMetadata(serverUrl,{resourceMetadataUrl:opts?.resourceMetadataUrl},opts?.fetchFn),resourceMetadata.authorization_servers&&resourceMetadata.authorization_servers.length>0)authorizationServerUrl=resourceMetadata.authorization_servers[0]}catch{}if(!authorizationServerUrl)authorizationServerUrl=String(new URL("/",serverUrl));let authorizationServerMetadata=await discoverAuthorizationServerMetadata(authorizationServerUrl,{fetchFn:opts?.fetchFn});return{authorizationServerUrl,authorizationServerMetadata,resourceMetadata}}async function startAuthorization(authorizationServerUrl,{metadata,clientInformation,redirectUrl,scope,state,resource}){let authorizationUrl;if(metadata){if(authorizationUrl=new URL(metadata.authorization_endpoint),!metadata.response_types_supported.includes(AUTHORIZATION_CODE_RESPONSE_TYPE))throw Error(`Incompatible auth server: does not support response type ${AUTHORIZATION_CODE_RESPONSE_TYPE}`);if(metadata.code_challenge_methods_supported&&!metadata.code_challenge_methods_supported.includes(AUTHORIZATION_CODE_CHALLENGE_METHOD))throw Error(`Incompatible auth server: does not support code challenge method ${AUTHORIZATION_CODE_CHALLENGE_METHOD}`)}else authorizationUrl=new URL("/authorize",authorizationServerUrl);let challenge=await pkceChallenge(),codeVerifier=challenge.code_verifier,codeChallenge=challenge.code_challenge;if(authorizationUrl.searchParams.set("response_type",AUTHORIZATION_CODE_RESPONSE_TYPE),authorizationUrl.searchParams.set("client_id",clientInformation.client_id),authorizationUrl.searchParams.set("code_challenge",codeChallenge),authorizationUrl.searchParams.set("code_challenge_method",AUTHORIZATION_CODE_CHALLENGE_METHOD),authorizationUrl.searchParams.set("redirect_uri",String(redirectUrl)),state)authorizationUrl.searchParams.set("state",state);if(scope)authorizationUrl.searchParams.set("scope",scope);if(scope?.includes("offline_access"))authorizationUrl.searchParams.append("prompt","consent");if(resource)authorizationUrl.searchParams.set("resource",resource.href);return{authorizationUrl,codeVerifier}}function prepareAuthorizationCodeRequest(authorizationCode,codeVerifier,redirectUri){return new URLSearchParams({grant_type:"authorization_code",code:authorizationCode,code_verifier:codeVerifier,redirect_uri:String(redirectUri)})}async function executeTokenRequest(authorizationServerUrl,{metadata,tokenRequestParams,clientInformation,addClientAuthentication,resource,fetchFn}){let tokenUrl=metadata?.token_endpoint?new URL(metadata.token_endpoint):new URL("/token",authorizationServerUrl),headers=new Headers({"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"});if(resource)tokenRequestParams.set("resource",resource.href);if(addClientAuthentication)await addClientAuthentication(headers,tokenRequestParams,tokenUrl,metadata);else if(clientInformation){let supportedMethods=metadata?.token_endpoint_auth_methods_supported??[],authMethod=selectClientAuthMethod(clientInformation,supportedMethods);applyClientAuthentication(authMethod,clientInformation,headers,tokenRequestParams)}let response=await(fetchFn??fetch)(tokenUrl,{method:"POST",headers,body:tokenRequestParams});if(!response.ok)throw await parseErrorResponse(response);return OAuthTokensSchema.parse(await response.json())}async function refreshAuthorization(authorizationServerUrl,{metadata,clientInformation,refreshToken,resource,addClientAuthentication,fetchFn}){let tokenRequestParams=new URLSearchParams({grant_type:"refresh_token",refresh_token:refreshToken}),tokens=await executeTokenRequest(authorizationServerUrl,{metadata,tokenRequestParams,clientInformation,addClientAuthentication,resource,fetchFn});return{refresh_token:refreshToken,...tokens}}async function fetchToken(provider,authorizationServerUrl,{metadata,resource,authorizationCode,fetchFn}={}){let scope=provider.clientMetadata.scope,tokenRequestParams;if(provider.prepareTokenRequest)tokenRequestParams=await provider.prepareTokenRequest(scope);if(!tokenRequestParams){if(!authorizationCode)throw Error("Either provider.prepareTokenRequest() or authorizationCode is required");if(!provider.redirectUrl)throw Error("redirectUrl is required for authorization_code flow");let codeVerifier=await provider.codeVerifier();tokenRequestParams=prepareAuthorizationCodeRequest(authorizationCode,codeVerifier,provider.redirectUrl)}let clientInformation=await provider.clientInformation();return executeTokenRequest(authorizationServerUrl,{metadata,tokenRequestParams,clientInformation:clientInformation??void 0,addClientAuthentication:provider.addClientAuthentication,resource,fetchFn})}async function registerClient(authorizationServerUrl,{metadata,clientMetadata,scope,fetchFn}){let registrationUrl;if(metadata){if(!metadata.registration_endpoint)throw Error("Incompatible auth server: does not support dynamic client registration");registrationUrl=new URL(metadata.registration_endpoint)}else registrationUrl=new URL("/register",authorizationServerUrl);let response=await(fetchFn??fetch)(registrationUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...clientMetadata,...scope!==void 0?{scope}:{}})});if(!response.ok)throw await parseErrorResponse(response);return OAuthClientInformationFullSchema.parse(await response.json())}init_stream();var DEFAULT_STREAMABLE_HTTP_RECONNECTION_OPTIONS={initialReconnectionDelay:1000,maxReconnectionDelay:30000,reconnectionDelayGrowFactor:1.5,maxRetries:2};class StreamableHTTPError extends Error{constructor(code,message){super(`Streamable HTTP error: ${message}`);this.code=code}}class StreamableHTTPClientTransport{constructor(url2,opts){this._hasCompletedAuthFlow=!1,this._url=url2,this._resourceMetadataUrl=void 0,this._scope=void 0,this._requestInit=opts?.requestInit,this._authProvider=opts?.authProvider,this._fetch=opts?.fetch,this._fetchWithInit=createFetchWithInit(opts?.fetch,opts?.requestInit),this._sessionId=opts?.sessionId,this._reconnectionOptions=opts?.reconnectionOptions??DEFAULT_STREAMABLE_HTTP_RECONNECTION_OPTIONS}async _authThenStart(){if(!this._authProvider)throw new UnauthorizedError("No auth provider");let result;try{result=await auth(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})}catch(error48){throw this.onerror?.(error48),error48}if(result!=="AUTHORIZED")throw new UnauthorizedError;return await this._startOrAuthSse({resumptionToken:void 0})}async _commonHeaders(){let headers={};if(this._authProvider){let tokens=await this._authProvider.tokens();if(tokens)headers.Authorization=`Bearer ${tokens.access_token}`}if(this._sessionId)headers["mcp-session-id"]=this._sessionId;if(this._protocolVersion)headers["mcp-protocol-version"]=this._protocolVersion;let extraHeaders=normalizeHeaders2(this._requestInit?.headers);return new Headers({...headers,...extraHeaders})}async _startOrAuthSse(options){let{resumptionToken}=options;try{let headers=await this._commonHeaders();if(headers.set("Accept","text/event-stream"),resumptionToken)headers.set("last-event-id",resumptionToken);let response=await(this._fetch??fetch)(this._url,{method:"GET",headers,signal:this._abortController?.signal});if(!response.ok){if(await response.body?.cancel(),response.status===401&&this._authProvider)return await this._authThenStart();if(response.status===405)return;throw new StreamableHTTPError(response.status,`Failed to open SSE stream: ${response.statusText}`)}this._handleSseStream(response.body,options,!0)}catch(error48){throw this.onerror?.(error48),error48}}_getNextReconnectionDelay(attempt){if(this._serverRetryMs!==void 0)return this._serverRetryMs;let initialDelay=this._reconnectionOptions.initialReconnectionDelay,growFactor=this._reconnectionOptions.reconnectionDelayGrowFactor,maxDelay=this._reconnectionOptions.maxReconnectionDelay;return Math.min(initialDelay*Math.pow(growFactor,attempt),maxDelay)}_scheduleReconnection(options,attemptCount=0){let maxRetries=this._reconnectionOptions.maxRetries;if(attemptCount>=maxRetries){this.onerror?.(Error(`Maximum reconnection attempts (${maxRetries}) exceeded.`));return}let delay2=this._getNextReconnectionDelay(attemptCount);this._reconnectionTimeout=setTimeout(()=>{this._startOrAuthSse(options).catch((error48)=>{this.onerror?.(Error(`Failed to reconnect SSE stream: ${error48 instanceof Error?error48.message:String(error48)}`)),this._scheduleReconnection(options,attemptCount+1)})},delay2)}_handleSseStream(stream,options,isReconnectable){if(!stream)return;let{onresumptiontoken,replayMessageId}=options,lastEventId,hasPrimingEvent=!1,receivedResponse=!1;(async()=>{try{let reader=stream.pipeThrough(new TextDecoderStream).pipeThrough(new EventSourceParserStream({onRetry:(retryMs)=>{this._serverRetryMs=retryMs}})).getReader();while(!0){let{value:event,done}=await reader.read();if(done)break;if(event.id)lastEventId=event.id,hasPrimingEvent=!0,onresumptiontoken?.(event.id);if(!event.data)continue;if(!event.event||event.event==="message")try{let message=JSONRPCMessageSchema.parse(JSON.parse(event.data));if(isJSONRPCResultResponse(message)){if(receivedResponse=!0,replayMessageId!==void 0)message.id=replayMessageId}this.onmessage?.(message)}catch(error48){this.onerror?.(error48)}}if((isReconnectable||hasPrimingEvent)&&!receivedResponse&&this._abortController&&!this._abortController.signal.aborted)this._scheduleReconnection({resumptionToken:lastEventId,onresumptiontoken,replayMessageId},0)}catch(error48){if(this.onerror?.(Error(`SSE stream disconnected: ${error48}`)),(isReconnectable||hasPrimingEvent)&&!receivedResponse&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:lastEventId,onresumptiontoken,replayMessageId},0)}catch(error49){this.onerror?.(Error(`Failed to reconnect: ${error49 instanceof Error?error49.message:String(error49)}`))}}})()}async start(){if(this._abortController)throw Error("StreamableHTTPClientTransport already started! If using Client class, note that connect() calls start() automatically.");this._abortController=new AbortController}async finishAuth(authorizationCode){if(!this._authProvider)throw new UnauthorizedError("No auth provider");if(await auth(this._authProvider,{serverUrl:this._url,authorizationCode,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!=="AUTHORIZED")throw new UnauthorizedError("Failed to authorize")}async close(){if(this._reconnectionTimeout)clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=void 0;this._abortController?.abort(),this.onclose?.()}async send(message,options){try{let{resumptionToken,onresumptiontoken}=options||{};if(resumptionToken){this._startOrAuthSse({resumptionToken,replayMessageId:isJSONRPCRequest(message)?message.id:void 0}).catch((err)=>this.onerror?.(err));return}let headers=await this._commonHeaders();headers.set("content-type","application/json"),headers.set("accept","application/json, text/event-stream");let init={...this._requestInit,method:"POST",headers,body:JSON.stringify(message),signal:this._abortController?.signal},response=await(this._fetch??fetch)(this._url,init),sessionId=response.headers.get("mcp-session-id");if(sessionId)this._sessionId=sessionId;if(!response.ok){let text=await response.text().catch(()=>null);if(response.status===401&&this._authProvider){if(this._hasCompletedAuthFlow)throw new StreamableHTTPError(401,"Server returned 401 after successful authentication");let{resourceMetadataUrl,scope}=extractWWWAuthenticateParams(response);if(this._resourceMetadataUrl=resourceMetadataUrl,this._scope=scope,await auth(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!=="AUTHORIZED")throw new UnauthorizedError;return this._hasCompletedAuthFlow=!0,this.send(message)}if(response.status===403&&this._authProvider){let{resourceMetadataUrl,scope,error:error48}=extractWWWAuthenticateParams(response);if(error48==="insufficient_scope"){let wwwAuthHeader=response.headers.get("WWW-Authenticate");if(this._lastUpscopingHeader===wwwAuthHeader)throw new StreamableHTTPError(403,"Server returned 403 after trying upscoping");if(scope)this._scope=scope;if(resourceMetadataUrl)this._resourceMetadataUrl=resourceMetadataUrl;if(this._lastUpscopingHeader=wwwAuthHeader??void 0,await auth(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetch})!=="AUTHORIZED")throw new UnauthorizedError;return this.send(message)}}throw new StreamableHTTPError(response.status,`Error POSTing to endpoint: ${text}`)}if(this._hasCompletedAuthFlow=!1,this._lastUpscopingHeader=void 0,response.status===202){if(await response.body?.cancel(),isInitializedNotification(message))this._startOrAuthSse({resumptionToken:void 0}).catch((err)=>this.onerror?.(err));return}let hasRequests=(Array.isArray(message)?message:[message]).filter((msg)=>("method"in msg)&&("id"in msg)&&msg.id!==void 0).length>0,contentType=response.headers.get("content-type");if(hasRequests)if(contentType?.includes("text/event-stream"))this._handleSseStream(response.body,{onresumptiontoken},!1);else if(contentType?.includes("application/json")){let data=await response.json(),responseMessages=Array.isArray(data)?data.map((msg)=>JSONRPCMessageSchema.parse(msg)):[JSONRPCMessageSchema.parse(data)];for(let msg of responseMessages)this.onmessage?.(msg)}else throw await response.body?.cancel(),new StreamableHTTPError(-1,`Unexpected content type: ${contentType}`);else await response.body?.cancel()}catch(error48){throw this.onerror?.(error48),error48}}get sessionId(){return this._sessionId}async terminateSession(){if(!this._sessionId)return;try{let headers=await this._commonHeaders(),init={...this._requestInit,method:"DELETE",headers,signal:this._abortController?.signal},response=await(this._fetch??fetch)(this._url,init);if(await response.body?.cancel(),!response.ok&&response.status!==405)throw new StreamableHTTPError(response.status,`Failed to terminate session: ${response.statusText}`);this._sessionId=void 0}catch(error48){throw this.onerror?.(error48),error48}}setProtocolVersion(version2){this._protocolVersion=version2}get protocolVersion(){return this._protocolVersion}async resumeStream(lastEventId,options){await this._startOrAuthSse({resumptionToken:lastEventId,onresumptiontoken:options?.onresumptiontoken})}}class McpHttpClient extends McpClient{config;client;cachedTools=[];_connected=!1;lastError;constructor(config2){super();this.config=config2;if(this._enableLogging)console.warn(`\uD83D\uDD0C McpHttpClient created for: ${config2.name}`)}get connected(){return this._connected&&!!this.client}async initialize(){if(this._connected)return;try{if(this.client=await this.createClient(),await this.refreshToolCache(),this._connected=!0,this.lastError=void 0,this._enableLogging)console.warn(`✅ McpHttpClient initialized: ${this.config.name} (${this.cachedTools.length} tools)`)}catch(error48){let msg=error48 instanceof Error?error48.message:String(error48);if(this.lastError=msg,this._enableLogging)console.error(`Failed to initialize HTTP MCP client "${this.config.name}":`,msg);throw error48}}async createClient(){let headers={...this.config.headers};if(this.config.auth?.type==="bearer"){let token=typeof this.config.auth.token==="function"?this.config.auth.token():this.config.auth.token;if(token)headers.Authorization=`Bearer ${token}`}let requestInit=Object.keys(headers).length>0?{headers}:{},transport=new StreamableHTTPClientTransport(new URL(this.config.url),requestInit?{requestInit}:void 0),client=new Client({name:`mcp-http-client-${this.config.name}`,version:"1.0.0"},{capabilities:{roots:{},sampling:{}}});if(await client.connect(transport),this._enableLogging)console.warn(`\uD83D\uDD17 Connected to HTTP MCP server: ${this.config.name} at ${this.config.url}`);return client}async refreshToolCache(){if(!this.client)throw Error("Client not initialized. Call initialize() first.");try{let tools=(await this.client.listTools()).tools||[];if(this.cachedTools=tools.map((tool2)=>({name:tool2.name,title:tool2.title,description:tool2.description,inputSchema:tool2.inputSchema})),this._enableLogging)console.warn(`\uD83D\uDD04 Refreshed tool cache for ${this.config.name}: ${this.cachedTools.length} tools`)}catch(error48){let msg=error48 instanceof Error?error48.message:String(error48);if(this._enableLogging)console.error(`Failed to refresh tool cache for "${this.config.name}":`,msg);throw error48}}async listTools(){if(!this._connected){if(this._enableLogging)console.warn(`McpHttpClient "${this.config.name}" not initialized, returning cached tools`);return this.cachedTools}try{await this.refreshToolCache()}catch(error48){if(this._enableLogging)console.warn(`Failed to refresh tools, returning cached: ${error48}`)}return this.cachedTools}async callTool(name15,args){if(!this.client)throw Error(`HTTP MCP client for "${this.config.name}" not initialized. Call initialize() first.`);if(this._enableLogging)console.warn(`\uD83D\uDD27 Invoking HTTP MCP tool: ${this.config.name}/${name15}`,{args});try{return await this.client.callTool({name:name15,arguments:args})}catch(error48){let msg=error48 instanceof Error?error48.message:String(error48);if(this.lastError=msg,this._enableLogging)console.error(`Failed to invoke HTTP MCP tool "${this.config.name}/${name15}": ${msg}`);throw error48}}async disconnect(){if(this.client){try{if(await this.client.close(),this._enableLogging)console.warn(`\uD83D\uDD0C Closed HTTP MCP client: ${this.config.name}`)}catch(error48){if(this._enableLogging)console.error(`Error closing HTTP MCP client "${this.config.name}":`,error48 instanceof Error?error48.message:error48)}this.client=void 0}this._connected=!1,this.cachedTools=[]}getStatus(){return{connected:this._connected,toolCount:this.cachedTools.length,error:this.lastError}}}init_dist2();class ErrorEvent extends Event{constructor(type,errorEventInitDict){var _a16,_b16;super(type),this.code=(_a16=errorEventInitDict==null?void 0:errorEventInitDict.code)!=null?_a16:void 0,this.message=(_b16=errorEventInitDict==null?void 0:errorEventInitDict.message)!=null?_b16:void 0}[Symbol.for("nodejs.util.inspect.custom")](_depth,options,inspect){return inspect(inspectableError(this),options)}[Symbol.for("Deno.customInspect")](inspect,options){return inspect(inspectableError(this),options)}}function syntaxError(message){let DomException=globalThis.DOMException;return typeof DomException=="function"?new DomException(message,"SyntaxError"):SyntaxError(message)}function flattenError2(err){return err instanceof Error?"errors"in err&&Array.isArray(err.errors)?err.errors.map(flattenError2).join(", "):("cause"in err)&&err.cause instanceof Error?`${err}: ${flattenError2(err.cause)}`:err.message:`${err}`}function inspectableError(err){return{type:err.type,message:err.message,code:err.code,defaultPrevented:err.defaultPrevented,cancelable:err.cancelable,timeStamp:err.timeStamp}}var __typeError=(msg)=>{throw TypeError(msg)},__accessCheck=(obj,member,msg)=>member.has(obj)||__typeError("Cannot "+msg),__privateGet=(obj,member,getter)=>(__accessCheck(obj,member,"read from private field"),getter?getter.call(obj):member.get(obj)),__privateAdd=(obj,member,value)=>member.has(obj)?__typeError("Cannot add the same private member more than once"):member instanceof WeakSet?member.add(obj):member.set(obj,value),__privateSet=(obj,member,value,setter)=>(__accessCheck(obj,member,"write to private field"),member.set(obj,value),value),__privateMethod=(obj,member,method)=>(__accessCheck(obj,member,"access private method"),method),_readyState,_url2,_redirectUrl,_withCredentials,_fetch,_reconnectInterval,_reconnectTimer,_lastEventId,_controller,_parser,_onError,_onMessage,_onOpen,_EventSource_instances,connect_fn,_onFetchResponse,_onFetchError,getRequestOptions_fn,_onEvent,_onRetryChange,failConnection_fn,scheduleReconnect_fn,_reconnect;class EventSource extends EventTarget{constructor(url2,eventSourceInitDict){var _a16,_b16;super(),__privateAdd(this,_EventSource_instances),this.CONNECTING=0,this.OPEN=1,this.CLOSED=2,__privateAdd(this,_readyState),__privateAdd(this,_url2),__privateAdd(this,_redirectUrl),__privateAdd(this,_withCredentials),__privateAdd(this,_fetch),__privateAdd(this,_reconnectInterval),__privateAdd(this,_reconnectTimer),__privateAdd(this,_lastEventId,null),__privateAdd(this,_controller),__privateAdd(this,_parser),__privateAdd(this,_onError,null),__privateAdd(this,_onMessage,null),__privateAdd(this,_onOpen,null),__privateAdd(this,_onFetchResponse,async(response)=>{var _a22;__privateGet(this,_parser).reset();let{body,redirected,status,headers}=response;if(status===204){__privateMethod(this,_EventSource_instances,failConnection_fn).call(this,"Server sent HTTP 204, not reconnecting",204),this.close();return}if(redirected?__privateSet(this,_redirectUrl,new URL(response.url)):__privateSet(this,_redirectUrl,void 0),status!==200){__privateMethod(this,_EventSource_instances,failConnection_fn).call(this,`Non-200 status code (${status})`,status);return}if(!(headers.get("content-type")||"").startsWith("text/event-stream")){__privateMethod(this,_EventSource_instances,failConnection_fn).call(this,'Invalid content type, expected "text/event-stream"',status);return}if(__privateGet(this,_readyState)===this.CLOSED)return;__privateSet(this,_readyState,this.OPEN);let openEvent=new Event("open");if((_a22=__privateGet(this,_onOpen))==null||_a22.call(this,openEvent),this.dispatchEvent(openEvent),typeof body!="object"||!body||!("getReader"in body)){__privateMethod(this,_EventSource_instances,failConnection_fn).call(this,"Invalid response body, expected a web ReadableStream",status),this.close();return}let decoder=new TextDecoder,reader=body.getReader(),open=!0;do{let{done,value}=await reader.read();value&&__privateGet(this,_parser).feed(decoder.decode(value,{stream:!done})),done&&(open=!1,__privateGet(this,_parser).reset(),__privateMethod(this,_EventSource_instances,scheduleReconnect_fn).call(this))}while(open)}),__privateAdd(this,_onFetchError,(err)=>{__privateSet(this,_controller,void 0),!(err.name==="AbortError"||err.type==="aborted")&&__privateMethod(this,_EventSource_instances,scheduleReconnect_fn).call(this,flattenError2(err))}),__privateAdd(this,_onEvent,(event)=>{typeof event.id=="string"&&__privateSet(this,_lastEventId,event.id);let messageEvent=new MessageEvent(event.event||"message",{data:event.data,origin:__privateGet(this,_redirectUrl)?__privateGet(this,_redirectUrl).origin:__privateGet(this,_url2).origin,lastEventId:event.id||""});__privateGet(this,_onMessage)&&(!event.event||event.event==="message")&&__privateGet(this,_onMessage).call(this,messageEvent),this.dispatchEvent(messageEvent)}),__privateAdd(this,_onRetryChange,(value)=>{__privateSet(this,_reconnectInterval,value)}),__privateAdd(this,_reconnect,()=>{__privateSet(this,_reconnectTimer,void 0),__privateGet(this,_readyState)===this.CONNECTING&&__privateMethod(this,_EventSource_instances,connect_fn).call(this)});try{if(url2 instanceof URL)__privateSet(this,_url2,url2);else if(typeof url2=="string")__privateSet(this,_url2,new URL(url2,getBaseURL()));else throw Error("Invalid URL")}catch{throw syntaxError("An invalid or illegal string was specified")}__privateSet(this,_parser,createParser({onEvent:__privateGet(this,_onEvent),onRetry:__privateGet(this,_onRetryChange)})),__privateSet(this,_readyState,this.CONNECTING),__privateSet(this,_reconnectInterval,3000),__privateSet(this,_fetch,(_a16=eventSourceInitDict==null?void 0:eventSourceInitDict.fetch)!=null?_a16:globalThis.fetch),__privateSet(this,_withCredentials,(_b16=eventSourceInitDict==null?void 0:eventSourceInitDict.withCredentials)!=null?_b16:!1),__privateMethod(this,_EventSource_instances,connect_fn).call(this)}get readyState(){return __privateGet(this,_readyState)}get url(){return __privateGet(this,_url2).href}get withCredentials(){return __privateGet(this,_withCredentials)}get onerror(){return __privateGet(this,_onError)}set onerror(value){__privateSet(this,_onError,value)}get onmessage(){return __privateGet(this,_onMessage)}set onmessage(value){__privateSet(this,_onMessage,value)}get onopen(){return __privateGet(this,_onOpen)}set onopen(value){__privateSet(this,_onOpen,value)}addEventListener(type,listener,options){let listen=listener;super.addEventListener(type,listen,options)}removeEventListener(type,listener,options){let listen=listener;super.removeEventListener(type,listen,options)}close(){__privateGet(this,_reconnectTimer)&&clearTimeout(__privateGet(this,_reconnectTimer)),__privateGet(this,_readyState)!==this.CLOSED&&(__privateGet(this,_controller)&&__privateGet(this,_controller).abort(),__privateSet(this,_readyState,this.CLOSED),__privateSet(this,_controller,void 0))}}_readyState=new WeakMap,_url2=new WeakMap,_redirectUrl=new WeakMap,_withCredentials=new WeakMap,_fetch=new WeakMap,_reconnectInterval=new WeakMap,_reconnectTimer=new WeakMap,_lastEventId=new WeakMap,_controller=new WeakMap,_parser=new WeakMap,_onError=new WeakMap,_onMessage=new WeakMap,_onOpen=new WeakMap,_EventSource_instances=new WeakSet,connect_fn=function(){__privateSet(this,_readyState,this.CONNECTING),__privateSet(this,_controller,new AbortController),__privateGet(this,_fetch)(__privateGet(this,_url2),__privateMethod(this,_EventSource_instances,getRequestOptions_fn).call(this)).then(__privateGet(this,_onFetchResponse)).catch(__privateGet(this,_onFetchError))},_onFetchResponse=new WeakMap,_onFetchError=new WeakMap,getRequestOptions_fn=function(){var _a16;let init={mode:"cors",redirect:"follow",headers:{Accept:"text/event-stream",...__privateGet(this,_lastEventId)?{"Last-Event-ID":__privateGet(this,_lastEventId)}:void 0},cache:"no-store",signal:(_a16=__privateGet(this,_controller))==null?void 0:_a16.signal};return"window"in globalThis&&(init.credentials=this.withCredentials?"include":"same-origin"),init},_onEvent=new WeakMap,_onRetryChange=new WeakMap,failConnection_fn=function(message,code){var _a16;__privateGet(this,_readyState)!==this.CLOSED&&__privateSet(this,_readyState,this.CLOSED);let errorEvent=new ErrorEvent("error",{code,message});(_a16=__privateGet(this,_onError))==null||_a16.call(this,errorEvent),this.dispatchEvent(errorEvent)},scheduleReconnect_fn=function(message,code){var _a16;if(__privateGet(this,_readyState)===this.CLOSED)return;__privateSet(this,_readyState,this.CONNECTING);let errorEvent=new ErrorEvent("error",{code,message});(_a16=__privateGet(this,_onError))==null||_a16.call(this,errorEvent),this.dispatchEvent(errorEvent),__privateSet(this,_reconnectTimer,setTimeout(__privateGet(this,_reconnect),__privateGet(this,_reconnectInterval)))},_reconnect=new WeakMap,EventSource.CONNECTING=0,EventSource.OPEN=1,EventSource.CLOSED=2;function getBaseURL(){let doc2="document"in globalThis?globalThis.document:void 0;return doc2&&typeof doc2=="object"&&"baseURI"in doc2&&typeof doc2.baseURI=="string"?doc2.baseURI:void 0}class SseError extends Error{constructor(code,message,event){super(`SSE error: ${message}`);this.code=code,this.event=event}}class SSEClientTransport{constructor(url2,opts){this._url=url2,this._resourceMetadataUrl=void 0,this._scope=void 0,this._eventSourceInit=opts?.eventSourceInit,this._requestInit=opts?.requestInit,this._authProvider=opts?.authProvider,this._fetch=opts?.fetch,this._fetchWithInit=createFetchWithInit(opts?.fetch,opts?.requestInit)}async _authThenStart(){if(!this._authProvider)throw new UnauthorizedError("No auth provider");let result;try{result=await auth(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})}catch(error48){throw this.onerror?.(error48),error48}if(result!=="AUTHORIZED")throw new UnauthorizedError;return await this._startOrAuth()}async _commonHeaders(){let headers={};if(this._authProvider){let tokens=await this._authProvider.tokens();if(tokens)headers.Authorization=`Bearer ${tokens.access_token}`}if(this._protocolVersion)headers["mcp-protocol-version"]=this._protocolVersion;let extraHeaders=normalizeHeaders2(this._requestInit?.headers);return new Headers({...headers,...extraHeaders})}_startOrAuth(){let fetchImpl=this?._eventSourceInit?.fetch??this._fetch??fetch;return new Promise((resolve2,reject)=>{this._eventSource=new EventSource(this._url.href,{...this._eventSourceInit,fetch:async(url2,init)=>{let headers=await this._commonHeaders();headers.set("Accept","text/event-stream");let response=await fetchImpl(url2,{...init,headers});if(response.status===401&&response.headers.has("www-authenticate")){let{resourceMetadataUrl,scope}=extractWWWAuthenticateParams(response);this._resourceMetadataUrl=resourceMetadataUrl,this._scope=scope}return response}}),this._abortController=new AbortController,this._eventSource.onerror=(event)=>{if(event.code===401&&this._authProvider){this._authThenStart().then(resolve2,reject);return}let error48=new SseError(event.code,event.message,event);reject(error48),this.onerror?.(error48)},this._eventSource.onopen=()=>{},this._eventSource.addEventListener("endpoint",(event)=>{let messageEvent=event;try{if(this._endpoint=new URL(messageEvent.data,this._url),this._endpoint.origin!==this._url.origin)throw Error(`Endpoint origin does not match connection origin: ${this._endpoint.origin}`)}catch(error48){reject(error48),this.onerror?.(error48),this.close();return}resolve2()}),this._eventSource.onmessage=(event)=>{let messageEvent=event,message;try{message=JSONRPCMessageSchema.parse(JSON.parse(messageEvent.data))}catch(error48){this.onerror?.(error48);return}this.onmessage?.(message)}})}async start(){if(this._eventSource)throw Error("SSEClientTransport already started! If using Client class, note that connect() calls start() automatically.");return await this._startOrAuth()}async finishAuth(authorizationCode){if(!this._authProvider)throw new UnauthorizedError("No auth provider");if(await auth(this._authProvider,{serverUrl:this._url,authorizationCode,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!=="AUTHORIZED")throw new UnauthorizedError("Failed to authorize")}async close(){this._abortController?.abort(),this._eventSource?.close(),this.onclose?.()}async send(message){if(!this._endpoint)throw Error("Not connected");try{let headers=await this._commonHeaders();headers.set("content-type","application/json");let init={...this._requestInit,method:"POST",headers,body:JSON.stringify(message),signal:this._abortController?.signal},response=await(this._fetch??fetch)(this._endpoint,init);if(!response.ok){let text=await response.text().catch(()=>null);if(response.status===401&&this._authProvider){let{resourceMetadataUrl,scope}=extractWWWAuthenticateParams(response);if(this._resourceMetadataUrl=resourceMetadataUrl,this._scope=scope,await auth(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!=="AUTHORIZED")throw new UnauthorizedError;return this.send(message)}throw Error(`Error POSTing to endpoint (HTTP ${response.status}): ${text}`)}await response.body?.cancel()}catch(error48){throw this.onerror?.(error48),error48}}setProtocolVersion(version2){this._protocolVersion=version2}}class McpSseClient extends McpClient{config;client;cachedTools=[];_connected=!1;lastError;constructor(config2){super();this.config=config2;if(this._enableLogging)console.warn(`\uD83D\uDD0C McpSseClient created for: ${config2.name}`)}get connected(){return this._connected&&!!this.client}async initialize(){if(this._connected)return;try{if(this.client=await this.createClient(),await this.refreshToolCache(),this._connected=!0,this.lastError=void 0,this._enableLogging)console.warn(`✅ McpSseClient initialized: ${this.config.name} (${this.cachedTools.length} tools)`)}catch(error48){let msg=error48 instanceof Error?error48.message:String(error48);if(this.lastError=msg,this._enableLogging)console.error(`Failed to initialize SSE MCP client "${this.config.name}":`,msg);throw error48}}async createClient(){let headers={...this.config.headers};if(this.config.auth?.type==="bearer"){let token=typeof this.config.auth.token==="function"?this.config.auth.token():this.config.auth.token;if(token)headers.Authorization=`Bearer ${token}`}let transport=new SSEClientTransport(new URL(this.config.url),Object.keys(headers).length>0?{eventSourceInit:{fetch:(input,init)=>fetch(input,{...init,headers:{...init.headers,...headers}})},requestInit:{headers}}:void 0),client=new Client({name:`mcp-sse-client-${this.config.name}`,version:"1.0.0"},{capabilities:{roots:{},sampling:{}}});if(await client.connect(transport),this._enableLogging)console.warn(`\uD83D\uDD17 Connected to SSE MCP server: ${this.config.name} at ${this.config.url}`);return client}async refreshToolCache(){if(!this.client)throw Error("Client not initialized. Call initialize() first.");try{let tools=(await this.client.listTools()).tools||[];if(this.cachedTools=tools.map((tool2)=>({name:tool2.name,title:tool2.title,description:tool2.description,inputSchema:tool2.inputSchema})),this._enableLogging)console.warn(`\uD83D\uDD04 Refreshed tool cache for ${this.config.name}: ${this.cachedTools.length} tools`)}catch(error48){let msg=error48 instanceof Error?error48.message:String(error48);if(this._enableLogging)console.error(`Failed to refresh tool cache for "${this.config.name}":`,msg);throw error48}}async listTools(){if(!this._connected){if(this._enableLogging)console.warn(`McpSseClient "${this.config.name}" not initialized, returning cached tools`);return this.cachedTools}try{await this.refreshToolCache()}catch(error48){if(this._enableLogging)console.warn(`Failed to refresh tools, returning cached: ${error48}`)}return this.cachedTools}async callTool(name15,args){if(!this.client)throw Error(`SSE MCP client for "${this.config.name}" not initialized. Call initialize() first.`);if(this._enableLogging)console.warn(`\uD83D\uDD27 Invoking SSE MCP tool: ${this.config.name}/${name15}`,{args});try{return await this.client.callTool({name:name15,arguments:args})}catch(error48){let msg=error48 instanceof Error?error48.message:String(error48);if(this.lastError=msg,this._enableLogging)console.error(`Failed to invoke SSE MCP tool "${this.config.name}/${name15}": ${msg}`);throw error48}}async disconnect(){if(this.client){try{if(await this.client.close(),this._enableLogging)console.warn(`\uD83D\uDD0C Closed SSE MCP client: ${this.config.name}`)}catch(error48){if(this._enableLogging)console.error(`Error closing SSE MCP client "${this.config.name}":`,error48 instanceof Error?error48.message:error48)}this.client=void 0}this._connected=!1,this.cachedTools=[]}getStatus(){return{connected:this._connected,toolCount:this.cachedTools.length,error:this.lastError}}}var import_cross_spawn=__toESM(require_cross_spawn(),1);import process5 from"node:process";import{PassThrough}from"node:stream";class ReadBuffer{append(chunk){this._buffer=this._buffer?Buffer.concat([this._buffer,chunk]):chunk}readMessage(){if(!this._buffer)return null;let index=this._buffer.indexOf(`
|
|
1012
1012
|
`);if(index===-1)return null;let line=this._buffer.toString("utf8",0,index).replace(/\r$/,"");return this._buffer=this._buffer.subarray(index+1),deserializeMessage(line)}clear(){this._buffer=void 0}}function deserializeMessage(line){return JSONRPCMessageSchema.parse(JSON.parse(line))}function serializeMessage2(message){return JSON.stringify(message)+`
|
|
@@ -1068,7 +1068,7 @@ ${epoch}`).digest("hex");return record3.cachedPromptCacheKey={signature,value},v
|
|
|
1068
1068
|
`}function writeLine2(filePath,line){try{appendFileSync2(filePath,line)}catch{}}function debugLogPath2(){let raw=readPrefixedEnv2(void 0,"DEBUG_LOG");if(raw)return raw;let dir=logsDir2();return ensureDir2(dir),path32.join(dir,"dimcode-debug.log")}function debugLog2(eventName,payload){if(!isDebugEnabled2())return;writeLine2(debugLogPath2(),formatLine2(eventName,payload))}function debugLogSubagent(eventName,payload){if(!isDebugEnabled2())return;let dir=logsDir2();ensureDir2(dir);let filePath=path32.join(dir,"subagent-events.log");writeLine2(filePath,formatLine2(eventName,payload))}function readCliRuntimeConfig(env,configOpts){return resolveRuntimeConfigFromEnv(env,configOpts)}function buildRuntimeConfigFromContext(context,configOpts){let rc=context.runtimeConfig;if(!rc)return resolveRuntimeConfigFromEnv(context.env,configOpts);return{modelId:rc.modelId,...rc.adapter?{adapter:rc.adapter}:{},...rc.provider?{provider:rc.provider}:{},...rc.baseUrl?{baseUrl:rc.baseUrl}:{},...configOpts?.baseUrl&&!rc.baseUrl?{baseUrl:configOpts.baseUrl}:{},...rc.apiKey?{apiKey:rc.apiKey}:{},...rc.nextApiOAuth?{nextApiOAuth:!0}:{},...rc.responsesAutoPromptCacheKey?{responsesAutoPromptCacheKey:!0}:{},...rc.responsesUseSessionId?{responsesUseSessionId:!0}:{},...rc.modelCapabilities?{modelCapabilities:rc.modelCapabilities}:{},...rc.maxInputTokens?{maxInputTokens:rc.maxInputTokens}:{},...rc.maxOutputTokens?{maxOutputTokens:rc.maxOutputTokens}:{}}}function buildCliCreateAgentRuntimeOptions(opts){let configOpts=opts.baseUrl?{baseUrl:opts.baseUrl}:void 0,runtimeConfig=buildRuntimeConfigFromContext(opts.context,configOpts);return{systemPrompt:opts.context.system,modelId:runtimeConfig.modelId,adapter:runtimeConfig.adapter,provider:runtimeConfig.provider,baseUrl:runtimeConfig.baseUrl,apiKey:runtimeConfig.apiKey,nextApiOAuth:runtimeConfig.nextApiOAuth,responsesAutoPromptCacheKey:runtimeConfig.responsesAutoPromptCacheKey,responsesUseSessionId:runtimeConfig.responsesUseSessionId,modelCapabilities:runtimeConfig.modelCapabilities,maxInputTokens:runtimeConfig.maxInputTokens,maxOutputTokens:runtimeConfig.maxOutputTokens,stateDir:opts.stateDir,cliTools:!0,delegateTasks:!0,...opts.tools?{tools:opts.tools}:{},...opts.mcpServers?{mcpServers:opts.mcpServers}:{},...opts.mcpInitialState?{mcpInitialState:opts.mcpInitialState}:{},resolveRuntimeConfig:(input)=>{let current=buildRuntimeConfigFromContext(opts.context,configOpts),persistedWithoutTokenLimits=input.persisted?{...input.persisted,maxInputTokens:void 0,maxOutputTokens:void 0}:void 0;return input.requested?mergeRuntimeConfig(input.current??current,input.requested,{preferSourceMaxInputTokens:!0}):mergeRuntimeConfig(current,persistedWithoutTokenLimits,{preferSourceMaxInputTokens:!1})}}}async function createCliRuntime(opts){return await createAgentRuntime(buildCliCreateAgentRuntimeOptions(opts))}var RUNTIME_SESSION_METADATA_KEY2="dimAgentRuntime",DEBUG_LOG_FILE_NAME="<session-id>.jsonl";function createDefaultDebugLogState(){let directory=path33.join(os6.homedir(),".dimcode","debug");return{enabled:!1,directory,logFilePath:path33.join(directory,DEBUG_LOG_FILE_NAME)}}function normalizeText9(value){return String(value??"").trim()}function normalizeModeId(value){return value==="plan"?"plan":"agent"}function normalizeToolApprovalMode(value){if(value==="auto"||value==="normal"||value==="strict")return value;if(value==="all")return"auto";return}function cloneJson(value){return JSON.parse(JSON.stringify(value??null))}function cloneMetadata2(value){return value?cloneJson(value):void 0}function cloneEnvRecord3(source){return Object.entries(source??{}).reduce((next,[key,value])=>{return next[key]=value,next},{})}function readTruthyFlag(value){let normalized=normalizeText9(value).toLowerCase();return normalized==="1"||normalized==="true"||normalized==="yes"||normalized==="on"}function readNoInteractionFlag(config2){return readTruthyFlag(config2?.env?.DIMCODE_NO_INTERACTION)}function runtimeConfigsMatch(left,right){return normalizeText9(left?.modelId)===normalizeText9(right?.modelId)&&normalizeText9(left?.adapter)===normalizeText9(right?.adapter)&&normalizeText9(left?.provider)===normalizeText9(right?.provider)&&normalizeText9(left?.baseUrl)===normalizeText9(right?.baseUrl)&&normalizeText9(left?.apiKey)===normalizeText9(right?.apiKey)&&Boolean(left?.nextApiOAuth)===Boolean(right?.nextApiOAuth)&&Boolean(left?.responsesAutoPromptCacheKey)===Boolean(right?.responsesAutoPromptCacheKey)&&Boolean(left?.responsesUseSessionId)===Boolean(right?.responsesUseSessionId)&&JSON.stringify(cloneModelCapabilities(left?.modelCapabilities)??null)===JSON.stringify(cloneModelCapabilities(right?.modelCapabilities)??null)&&Number(left?.maxInputTokens??0)===Number(right?.maxInputTokens??0)&&Number(left?.maxOutputTokens??0)===Number(right?.maxOutputTokens??0)&&readNoInteractionFlag(left)===readNoInteractionFlag(right)}function mcpServersMatch(left,right){return JSON.stringify(left??[])===JSON.stringify(right??[])}function parseRuntimeConfig(raw,fallback){let record3=raw??{},persisted={modelId:normalizeText9(record3.modelId)||fallback.modelId,...normalizeText9(record3.adapter)?{adapter:normalizeText9(record3.adapter)}:{},...normalizeText9(record3.provider)?{provider:normalizeText9(record3.provider)}:{},...normalizeText9(record3.baseUrl)?{baseUrl:normalizeText9(record3.baseUrl)}:{},...record3.nextApiOAuth===!0?{nextApiOAuth:!0}:{},...record3.responsesAutoPromptCacheKey===!0?{responsesAutoPromptCacheKey:!0}:{},...record3.responsesUseSessionId===!0?{responsesUseSessionId:!0}:{},...cloneModelCapabilities(record3.modelCapabilities)?{modelCapabilities:cloneModelCapabilities(record3.modelCapabilities)}:{},...Number(record3.maxInputTokens)>0?{maxInputTokens:Number(record3.maxInputTokens)}:{},...Number(record3.maxOutputTokens)>0?{maxOutputTokens:Number(record3.maxOutputTokens)}:{}};return mergeRuntimeConfig(fallback,{...persisted,maxInputTokens:void 0,maxOutputTokens:void 0},{preferSourceMaxInputTokens:!1})}function readRuntimeEnvelopeFromSnapshot(snapshot,fallback){let runtimeMeta=(snapshot?.metadata??{})[RUNTIME_SESSION_METADATA_KEY2]??{},runtimeConfig=runtimeMeta.runtimeConfig??{};return{runtimeConfig:snapshot?parseRuntimeConfig(runtimeMeta.runtimeConfig,{...fallback,modelId:normalizeText9(runtimeConfig.modelId)||fallback.modelId}):null,modeId:normalizeModeId(runtimeMeta.modeId),toolApprovalMode:normalizeToolApprovalMode(runtimeMeta.toolApprovalMode),mcpServers:Array.isArray(runtimeMeta.mcpServers)?cloneJson(runtimeMeta.mcpServers):[]}}function createCliAgent(opts){let stateDir=path33.resolve(opts.stateDir),pendingMode="agent",runtimePromise=null,resolvedRuntime=null,facadeDebugLogState=createDefaultDebugLogState(),pendingRuntimeConfigReloads=new Set,getStateEnv=()=>({...cloneEnvRecord3(opts.context.env??{}),...cloneEnvRecord3(opts.processEnv)}),getRuntimeConfig=()=>{let rc=opts.context.runtimeConfig;if(rc)return{modelId:rc.modelId,...rc.adapter?{adapter:rc.adapter}:{},...rc.provider?{provider:rc.provider}:{},...rc.baseUrl?{baseUrl:rc.baseUrl}:{},...!rc.baseUrl&&opts.baseUrl?{baseUrl:opts.baseUrl}:{},...rc.apiKey?{apiKey:rc.apiKey}:{},...rc.nextApiOAuth?{nextApiOAuth:!0}:{},...rc.responsesAutoPromptCacheKey?{responsesAutoPromptCacheKey:!0}:{},...rc.responsesUseSessionId?{responsesUseSessionId:!0}:{},...rc.modelCapabilities?{modelCapabilities:rc.modelCapabilities}:{},...rc.maxInputTokens?{maxInputTokens:rc.maxInputTokens}:{},...rc.maxOutputTokens?{maxOutputTokens:rc.maxOutputTokens}:{}};return readCliRuntimeConfig({...getStateEnv(),...cloneEnvRecord3(typeof process<"u"?process.env:void 0)},{baseUrl:opts.baseUrl})},logSessionPersistence=(sessionId)=>{let normalizedSessionId=normalizeText9(sessionId);if(!normalizedSessionId)return;debugLog2("cli.session.persistence",{sessionId:normalizedSessionId,stateDir,snapshotPath:runtimeSnapshotPath(stateDir,normalizedSessionId)})},ensureRuntime=async()=>{if(runtimePromise)return await runtimePromise;runtimePromise=(async()=>{let runtime=await createCliRuntime({context:opts.context,stateDir,processEnv:opts.processEnv,tools:opts.tools,mcpServers:opts.mcpServers,mcpInitialState:opts.mcpInitialState});return resolvedRuntime=runtime,facadeDebugLogState=runtime.getDebugLogState(),runtime})();try{return await runtimePromise}catch(error48){throw runtimePromise=null,resolvedRuntime=null,error48}},runtimeSessions={list:async(options)=>{let runtime=await ensureRuntime();if(options)return await runtime.sessions.list(options);return await runtime.sessions.list()},get:async(sessionId)=>(await ensureRuntime()).sessions.get(sessionId),create:async(input)=>(await ensureRuntime()).sessions.create(input),createWithMessages:async(messages,input)=>await(await ensureRuntime()).sessions.createWithMessages(messages,input),destroy:async(sessionId)=>await(await ensureRuntime()).sessions.destroy(sessionId),rename:async(sessionId,title)=>await(await ensureRuntime()).sessions.rename(sessionId,title),updateMetadata:async(sessionId,metadata)=>await(await ensureRuntime()).sessions.updateMetadata(sessionId,metadata),interrupt:async(sessionId)=>await(await ensureRuntime()).sessions.interrupt(sessionId),getUsageSummary:async(sessionId)=>await(await ensureRuntime()).sessions.getUsageSummary(sessionId),getUsageLedger:async(sessionId)=>await(await ensureRuntime()).sessions.getUsageLedger(sessionId),getTurnUsage:async(sessionId,turnId)=>await(await ensureRuntime()).sessions.getTurnUsage(sessionId,turnId),listTurnUsages:async(sessionId)=>await(await ensureRuntime()).sessions.listTurnUsages(sessionId),listRequestUsages:async(sessionId,filter2)=>await(await ensureRuntime()).sessions.listRequestUsages(sessionId,filter2)},runtimeFacade={sessions:runtimeSessions,listSessions:async(options)=>{let runtime=await ensureRuntime();if(options)return await runtime.listSessions(options);return await runtime.listSessions()},openSession:async(sessionId)=>await(await ensureRuntime()).openSession(sessionId),createSession:async(input)=>await(await ensureRuntime()).createSession(input),destroySession:async(sessionId)=>await(await ensureRuntime()).destroySession(sessionId),getSessionState:async(sessionId)=>await(await ensureRuntime()).getSessionState(sessionId),replaceSessionSnapshot:async(sessionId,snapshot,update)=>{await(await ensureRuntime()).replaceSessionSnapshot(sessionId,snapshot,update)},persistSession:async(sessionId)=>{await(await ensureRuntime()).persistSession(sessionId)},unloadSession:async(sessionId,options)=>await(await ensureRuntime()).unloadSession(sessionId,options),runSubagent:(spec)=>runSubagentViaFacade(spec),getSessionHandle:async(sessionId)=>await(await ensureRuntime()).getSessionHandle(sessionId),getMcpState:async()=>await(await ensureRuntime()).getMcpState(),syncMcpServers:async(configs)=>await(await ensureRuntime()).syncMcpServers(configs),getDebugLogState:()=>resolvedRuntime?.getDebugLogState()??{...facadeDebugLogState},setDebugLogState:async(update)=>{let next=await(await ensureRuntime()).setDebugLogState(update);return facadeDebugLogState=next,next}};function runSubagentViaFacade(spec){let placeholderId=`subagent-pending-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`,resolvedHandle=null,cancelQueued=!1,resultPromise=(async()=>{let handle=(await ensureRuntime()).runSubagent(spec);if(resolvedHandle=handle,cancelQueued)handle.cancel();return await handle.result})();return{get subagentId(){return resolvedHandle?.subagentId??placeholderId},...spec.ownerSessionId?{ownerSessionId:spec.ownerSessionId}:{},get status(){return resolvedHandle?.status??"pending"},cancel:(reason)=>{if(resolvedHandle)resolvedHandle.cancel(reason);else cancelQueued=!0},result:resultPromise}}let openSession=async(sessionId)=>{let normalizedSessionId=normalizeText9(sessionId);if(!normalizedSessionId)return;return await(await ensureRuntime()).openSession(normalizedSessionId)},ensureSession=async(input)=>{let requestedSessionId=normalizeText9(input?.sessionId),runtime=requestedSessionId?await ensureRuntime():await ensureRuntime(),nextMode=normalizeModeId(input?.modeId??pendingMode),nextCwd=normalizeText9(input?.cwd)||normalizeText9(opts.context.cwd)||process.cwd(),nextRuntimeConfig=input?.runtimeConfig??getRuntimeConfig(),hasToolApprovalMode=Object.prototype.hasOwnProperty.call(input??{},"toolApprovalMode"),nextToolApprovalMode=normalizeToolApprovalMode(input?.toolApprovalMode),forceNoInteractionRuntimeConfigUpdate=readNoInteractionFlag(nextRuntimeConfig),hasMcpServers=Array.isArray(input?.mcpServers),nextMcpServers=Array.isArray(input?.mcpServers)?cloneJson(input.mcpServers):void 0,nextMetadata=cloneMetadata2(input?.metadata);if(requestedSessionId){let existing=await runtime.openSession(requestedSessionId);if(existing){let snapshot=await runtime.sessions.get(existing.id),envelope=readRuntimeEnvelopeFromSnapshot(snapshot,nextRuntimeConfig),runtimeMcpState=await runtime.getMcpState(),update={};if(normalizeText9(snapshot?.cwd)!==nextCwd)update.cwd=nextCwd;if(pendingRuntimeConfigReloads.delete(existing.id)||forceNoInteractionRuntimeConfigUpdate||!runtimeConfigsMatch(envelope.runtimeConfig,nextRuntimeConfig))update.runtimeConfig=nextRuntimeConfig;if(envelope.modeId!==nextMode)await existing.setMode(nextMode);if(hasToolApprovalMode&&envelope.toolApprovalMode!==nextToolApprovalMode)update.toolApprovalMode=nextToolApprovalMode;if(hasMcpServers&&Array.isArray(nextMcpServers)&&!mcpServersMatch(runtimeMcpState?.configs??envelope.mcpServers,nextMcpServers))update.mcpServers=nextMcpServers;if(nextMetadata)update.metadata=nextMetadata;if(Object.keys(update).length>0)await existing.updateConfig(update);return logSessionPersistence(existing.id),existing}}let created=await runtime.createSession({sessionId:requestedSessionId||void 0,cwd:nextCwd,modeId:nextMode,runtimeConfig:nextRuntimeConfig,...hasToolApprovalMode?{toolApprovalMode:nextToolApprovalMode}:{},...hasMcpServers?{mcpServers:nextMcpServers}:{},...nextMetadata?{metadata:nextMetadata}:{}});return logSessionPersistence(created.id),created};return{runtime:runtimeFacade,sessions:runtimeSessions,openSession,ensureSession,async steerSession(sessionId,input){let session=await openSession(sessionId);if(!session)return!1;return await session.steer(input)},setMode(modeId){pendingMode=normalizeModeId(modeId)},getMode(){return pendingMode},async triggerManualCompression(sessionId,options){let normalizedSessionId=normalizeText9(sessionId);if(!(normalizedSessionId?await openSession(normalizedSessionId):null))return{success:!1,error:normalizedSessionId?`Session not found: ${normalizedSessionId}`:"Manual compaction requires an active session id"};return await(await ensureSession({...options,sessionId:normalizedSessionId})).triggerManualCompaction()},invalidateSession(sessionId){let id=normalizeText9(sessionId);if(id)pendingRuntimeConfigReloads.add(id)},async getMcpState(){return await(await ensureRuntime()).getMcpState()},async syncMcpServers(configs){return await(await ensureRuntime()).syncMcpServers(configs)},async getDebugLogState(){return runtimeFacade.getDebugLogState()},async setDebugLogState(update){return await runtimeFacade.setDebugLogState(update)}}}function shouldInferCustomProviderFallbackMetadata2(adapter){if(!adapter)return!0;return adapter==="openai"||adapter==="openai-responses"||adapter==="gemini"||adapter==="anthropic"}function hasConfiguredModelMetadata(model){let limit=model.limit??{},hasContext=typeof limit.context==="number"&&Number.isFinite(limit.context),hasOutput=typeof limit.output==="number"&&Number.isFinite(limit.output);return hasContext||hasOutput||model.userDefined===!0||model.outputIsUserDefined===!0||typeof model.vision==="boolean"||model.reasoning?.supported===!0||model.extra_capabilities?.reasoning?.supported===!0}function inferCustomModelLimit(modelId,adapter){if(!shouldInferCustomProviderFallbackMetadata2(adapter))return;return getCustomProviderModelFallbackLimitForModelId(modelId)}function backfillCustomProviderModels(models,opts={}){if(!shouldInferCustomProviderFallbackMetadata2(opts.adapter))return[...models];let onlyIds=opts.onlyIds;return models.map((model)=>{let id=String(model?.id??"").trim();if(!id)return model;if(onlyIds&&!onlyIds.has(id))return model;if(hasConfiguredModelMetadata(model))return model;let currentLimit=model.limit??{},hasContext=typeof currentLimit.context==="number"&&Number.isFinite(currentLimit.context),hasOutput=typeof currentLimit.output==="number"&&Number.isFinite(currentLimit.output),hasVision=typeof model.vision==="boolean",hasReasoning=model.reasoning?.supported===!0,hasExtraReasoning=model.extra_capabilities?.reasoning?.supported===!0,inferredLimit=hasContext&&hasOutput?void 0:inferCustomModelLimit(id,opts.adapter),inferredCapabilities=hasVision&&hasReasoning?void 0:getCustomProviderModelFallbackCapabilitiesForModelId(id),inferredExtraReasoning=hasExtraReasoning?void 0:getCustomProviderModelFallbackReasoningEffortCapability(id),nextLimit={...currentLimit,...!hasContext&&typeof inferredLimit?.context==="number"?{context:inferredLimit.context}:{},...!hasOutput&&typeof inferredLimit?.output==="number"?{output:inferredLimit.output}:{}};return{...model,...Object.keys(nextLimit).length>0?{limit:nextLimit}:{},...!hasVision&&typeof inferredCapabilities?.vision==="boolean"?{vision:inferredCapabilities.vision}:{},...!hasReasoning&&inferredCapabilities?.reasoning?.supported?{reasoning:inferredCapabilities.reasoning}:{},...!hasExtraReasoning&&inferredExtraReasoning?{extra_capabilities:{...model.extra_capabilities??{},reasoning:inferredExtraReasoning}}:{}}})}var SYSTEM_SECTION_IDS=["system.sections.security","system.sections.code-safety","system.sections.url-policy","system.sections.tone-and-style","system.sections.professional-objectivity","system.sections.engineering-approach","system.sections.git-and-execution-guardrails","system.sections.doing-tasks","system.sections.capability-aware-guidance","system.sections.code-references"];function joinPromptSections(sections){return sections.filter((section)=>typeof section==="string"&§ion.trim().length>0).map((section)=>section.trim()).join(`
|
|
1069
1069
|
|
|
1070
1070
|
`)}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(`
|
|
1071
|
-
`)]})}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.66-beta.1")??(fastStart?null:await readRepoPackageVersion(opts.cwd)),resolveToolsPath=async()=>{let[{homedir:homedir3},path34]=await Promise.all([import("node:os"),import("node:path")]),dimcodeHome=readOptionalString3(opts.env.DIMCODE_HOME);if(dimcodeHome){let dir2=path34.resolve(dimcodeHome);return{dir:dir2,filePath:path34.join(dir2,"tools.json")}}let dir=path34.resolve(homedir3(),".dimcode");return{dir,filePath:path34.join(dir,"tools.json")}},[loadedCache,loadedConfig,loadedTools,loadedMcp]=fastStart?await(async()=>{let[cacheDir,configDir,toolsPath,path34]=await Promise.all([getDimcodeUserDir(opts.env),getDimcodeConfigDir(opts.env),resolveToolsPath(),import("node:path")]),cacheFile=path34.join(cacheDir,"cache.json"),configFile=path34.join(configDir,"config.json"),mcpJsonFile=path34.join(toolsPath.dir,"mcp.json");return[{dir:cacheDir,filePath:cacheFile,cache:{version:1,updatedAt:0}},{dir:configDir,filePath:configFile,config:{version:1,updatedAt:0}},{dir:toolsPath.dir,filePath:toolsPath.filePath,tools:{version:1,updatedAt:0}},{dir:toolsPath.dir,filePath:mcpJsonFile,servers:[]}]})():await Promise.all([loadDimcodeUserCache(opts.env),loadDimcodeUserConfig(opts.env),loadDimcodeUserTools(opts.env),loadMcpJson(opts.env)]),cache=loadedCache.cache,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",...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},path34]=await Promise.all([import("node:fs/promises"),import("node:path")]),raw=await readFile11(path34.join(cwd,"package.json"),"utf8"),parsed=JSON.parse(raw),v2=typeof parsed?.version==="string"?parsed.version:null;return v2&&v2.trim()?v2.trim():null}catch{return null}}import{createHash as createHash4,randomUUID as randomUUID8}from"node:crypto";import{copyFile as copyFile2,mkdir as mkdir11,readdir as readdir7,readFile as readFile11,rename as rename2,rm as rm7,stat as stat7,writeFile as writeFile10}from"node:fs/promises";import{homedir as homedir3}from"node:os";import path34 from"node:path";import process12 from"node:process";var BLOB_CACHE_DIR2="blob-cache",BLOB_DIR2="blobs",ATTACHMENTS_DIR2="attachments",META_DIR2="meta",BLOB_TTL_MS2=86400000,CLEANUP_MIN_INTERVAL_MS2=3600000,FILE_ID_PATTERN=/^[\w.-]{1,128}$/,HOME_SESSION_CACHE_ID="_home",IMAGE_EXTENSIONS=new Set(["png","jpg","jpeg","gif","svg","webp","bmp","ico"]),TEXT_LIKE_EXTENSIONS=new Set(["txt","text","md","markdown","mdx","rst","log","json","jsonl","json5","yaml","yml","toml","ini","cfg","conf","properties","env","xml","csv","tsv","html","htm","css","scss","less","sass","js","jsx","ts","tsx","mjs","cjs","mts","cts","vue","svelte","astro","py","rb","php","go","rs","java","kt","swift","c","cc","cpp","cxx","h","hh","hpp","hxx","m","mm","cs","sh","bash","zsh","fish","ps1","sql","graphql","gql","proto","diff","patch","gitignore","gitattributes","editorconfig","dockerfile","makefile","mk","lock"]),EXT_MIME={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".ico":"image/x-icon",".svg":"image/svg+xml",".mp4":"video/mp4",".mov":"video/quicktime",".m4v":"video/x-m4v",".webm":"video/webm",".avi":"video/x-msvideo",".mkv":"video/x-matroska",".mpeg":"video/mpeg",".mpg":"video/mpeg",".wmv":"video/x-ms-wmv",".3gp":"video/3gpp",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".pdf":"application/pdf",".txt":"text/plain",".md":"text/markdown",".json":"application/json",".yaml":"text/yaml",".yml":"text/yaml",".toml":"text/plain",".ini":"text/plain",".xml":"application/xml",".csv":"text/csv"},lastCleanupAt2=0;function resolveStateDir3(){let dimcodeHome=String(process12.env.DIMCODE_HOME??"").trim();if(dimcodeHome)return path34.resolve(dimcodeHome,"state");return path34.resolve(homedir3(),".dimcode","state")}function resolveSessionCacheDir2(sessionId){return path34.resolve(resolveStateDir3(),BLOB_CACHE_DIR2,sessionId)}function normalizeSessionId2(raw){let value=String(raw??"").trim();if(!value)return null;if(value==="."||value==="..")return null;if(value.includes("/")||value.includes("\\"))return null;if(value.includes("\x00"))return null;return value}function getFileExtension(filePath){let ext=path34.extname(filePath||"").toLowerCase();if(!ext)return"";return ext.startsWith(".")?ext.slice(1):ext}function basenameFromPath(filePath){return path34.basename(String(filePath??"").trim())}function parseAttachmentPathInfo(absPath){let blobMatch=normalizeMaybePath(absPath).match(/\/blob-cache\/([^/]+)\/attachments\/([^/]+)$/);if(!blobMatch)return null;let sessionId=normalizeSessionId2(blobMatch[1]??""),fileName=basenameFromPath(blobMatch[2]??"");if(!sessionId||!fileName)return null;return{sessionId,fileName}}function isTextLikeFilePath(filePath){let ext=getFileExtension(filePath);return Boolean(ext&&TEXT_LIKE_EXTENSIONS.has(ext))}function shouldCacheFileToSessionAttachment(filePath){return!isTextLikeFilePath(filePath)}function isSessionCachedImagePath(absPath){let info=parseAttachmentPathInfo(absPath);if(!info)return!1;let ext=getFileExtension(info.fileName);return Boolean(ext&&IMAGE_EXTENSIONS.has(ext))}function isHomeSessionAttachmentPath(absPath){let info=parseAttachmentPathInfo(absPath);return Boolean(info&&info.sessionId===HOME_SESSION_CACHE_ID)}function guessMimeTypeFromPath(filePath){let ext=path34.extname(filePath).toLowerCase();return EXT_MIME[ext]||"application/octet-stream"}function countLines2(text){if(!text)return 0;return text.split(`
|
|
1071
|
+
`)]})}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.67-beta.0")??(fastStart?null:await readRepoPackageVersion(opts.cwd)),resolveToolsPath=async()=>{let[{homedir:homedir3},path34]=await Promise.all([import("node:os"),import("node:path")]),dimcodeHome=readOptionalString3(opts.env.DIMCODE_HOME);if(dimcodeHome){let dir2=path34.resolve(dimcodeHome);return{dir:dir2,filePath:path34.join(dir2,"tools.json")}}let dir=path34.resolve(homedir3(),".dimcode");return{dir,filePath:path34.join(dir,"tools.json")}},[loadedCache,loadedConfig,loadedTools,loadedMcp]=fastStart?await(async()=>{let[cacheDir,configDir,toolsPath,path34]=await Promise.all([getDimcodeUserDir(opts.env),getDimcodeConfigDir(opts.env),resolveToolsPath(),import("node:path")]),cacheFile=path34.join(cacheDir,"cache.json"),configFile=path34.join(configDir,"config.json"),mcpJsonFile=path34.join(toolsPath.dir,"mcp.json");return[{dir:cacheDir,filePath:cacheFile,cache:{version:1,updatedAt:0}},{dir:configDir,filePath:configFile,config:{version:1,updatedAt:0}},{dir:toolsPath.dir,filePath:toolsPath.filePath,tools:{version:1,updatedAt:0}},{dir:toolsPath.dir,filePath:mcpJsonFile,servers:[]}]})():await Promise.all([loadDimcodeUserCache(opts.env),loadDimcodeUserConfig(opts.env),loadDimcodeUserTools(opts.env),loadMcpJson(opts.env)]),cache=loadedCache.cache,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",...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},path34]=await Promise.all([import("node:fs/promises"),import("node:path")]),raw=await readFile11(path34.join(cwd,"package.json"),"utf8"),parsed=JSON.parse(raw),v2=typeof parsed?.version==="string"?parsed.version:null;return v2&&v2.trim()?v2.trim():null}catch{return null}}import{createHash as createHash4,randomUUID as randomUUID8}from"node:crypto";import{copyFile as copyFile2,mkdir as mkdir11,readdir as readdir7,readFile as readFile11,rename as rename2,rm as rm7,stat as stat7,writeFile as writeFile10}from"node:fs/promises";import{homedir as homedir3}from"node:os";import path34 from"node:path";import process12 from"node:process";var BLOB_CACHE_DIR2="blob-cache",BLOB_DIR2="blobs",ATTACHMENTS_DIR2="attachments",META_DIR2="meta",BLOB_TTL_MS2=86400000,CLEANUP_MIN_INTERVAL_MS2=3600000,FILE_ID_PATTERN=/^[\w.-]{1,128}$/,HOME_SESSION_CACHE_ID="_home",IMAGE_EXTENSIONS=new Set(["png","jpg","jpeg","gif","svg","webp","bmp","ico"]),TEXT_LIKE_EXTENSIONS=new Set(["txt","text","md","markdown","mdx","rst","log","json","jsonl","json5","yaml","yml","toml","ini","cfg","conf","properties","env","xml","csv","tsv","html","htm","css","scss","less","sass","js","jsx","ts","tsx","mjs","cjs","mts","cts","vue","svelte","astro","py","rb","php","go","rs","java","kt","swift","c","cc","cpp","cxx","h","hh","hpp","hxx","m","mm","cs","sh","bash","zsh","fish","ps1","sql","graphql","gql","proto","diff","patch","gitignore","gitattributes","editorconfig","dockerfile","makefile","mk","lock"]),EXT_MIME={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".ico":"image/x-icon",".svg":"image/svg+xml",".mp4":"video/mp4",".mov":"video/quicktime",".m4v":"video/x-m4v",".webm":"video/webm",".avi":"video/x-msvideo",".mkv":"video/x-matroska",".mpeg":"video/mpeg",".mpg":"video/mpeg",".wmv":"video/x-ms-wmv",".3gp":"video/3gpp",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".pdf":"application/pdf",".txt":"text/plain",".md":"text/markdown",".json":"application/json",".yaml":"text/yaml",".yml":"text/yaml",".toml":"text/plain",".ini":"text/plain",".xml":"application/xml",".csv":"text/csv"},lastCleanupAt2=0;function resolveStateDir3(){let dimcodeHome=String(process12.env.DIMCODE_HOME??"").trim();if(dimcodeHome)return path34.resolve(dimcodeHome,"state");return path34.resolve(homedir3(),".dimcode","state")}function resolveSessionCacheDir2(sessionId){return path34.resolve(resolveStateDir3(),BLOB_CACHE_DIR2,sessionId)}function normalizeSessionId2(raw){let value=String(raw??"").trim();if(!value)return null;if(value==="."||value==="..")return null;if(value.includes("/")||value.includes("\\"))return null;if(value.includes("\x00"))return null;return value}function getFileExtension(filePath){let ext=path34.extname(filePath||"").toLowerCase();if(!ext)return"";return ext.startsWith(".")?ext.slice(1):ext}function basenameFromPath(filePath){return path34.basename(String(filePath??"").trim())}function parseAttachmentPathInfo(absPath){let blobMatch=normalizeMaybePath(absPath).match(/\/blob-cache\/([^/]+)\/attachments\/([^/]+)$/);if(!blobMatch)return null;let sessionId=normalizeSessionId2(blobMatch[1]??""),fileName=basenameFromPath(blobMatch[2]??"");if(!sessionId||!fileName)return null;return{sessionId,fileName}}function isTextLikeFilePath(filePath){let ext=getFileExtension(filePath);return Boolean(ext&&TEXT_LIKE_EXTENSIONS.has(ext))}function shouldCacheFileToSessionAttachment(filePath){return!isTextLikeFilePath(filePath)}function isSessionCachedImagePath(absPath){let info=parseAttachmentPathInfo(absPath);if(!info)return!1;let ext=getFileExtension(info.fileName);return Boolean(ext&&IMAGE_EXTENSIONS.has(ext))}function isHomeSessionAttachmentPath(absPath){let info=parseAttachmentPathInfo(absPath);return Boolean(info&&info.sessionId===HOME_SESSION_CACHE_ID)}function guessMimeTypeFromPath(filePath){let ext=path34.extname(filePath).toLowerCase();return EXT_MIME[ext]||"application/octet-stream"}function countLines2(text){if(!text)return 0;return text.split(`
|
|
1072
1072
|
`).length}function normalizeMaybePath(raw){return String(raw??"").replace(/\\/g,"/")}async function ensureBlobDirs2(sessionDir){let blobsDir=path34.join(sessionDir,BLOB_DIR2),metaDir=path34.join(sessionDir,META_DIR2);try{return await mkdir11(blobsDir,{recursive:!0}),await mkdir11(metaDir,{recursive:!0}),{blobsDir,metaDir}}catch{return null}}async function ensureAttachmentDirs(sessionDir){let attachmentsDir=path34.join(sessionDir,ATTACHMENTS_DIR2),metaDir=path34.join(sessionDir,META_DIR2);try{return await mkdir11(attachmentsDir,{recursive:!0}),await mkdir11(metaDir,{recursive:!0}),{attachmentsDir,metaDir}}catch{return null}}async function copyFileUnique(src,destDir,baseName){let safeBaseName=basenameFromPath(baseName)||basenameFromPath(src)||"attachment",ext=path34.extname(safeBaseName),stem=ext?safeBaseName.slice(0,-ext.length):safeBaseName,candidate=path34.join(destDir,safeBaseName);for(let i2=0;i2<40;i2++){try{await copyFile2(src,candidate);let info=await stat7(candidate);if(info.isFile()&&info.size>0)return candidate}catch{}let suffix=`-${i2+1}`;candidate=path34.join(destDir,`${stem}${suffix}${ext}`)}return null}async function readAttachmentMetaByPath(absPath){let info=parseAttachmentPathInfo(absPath);if(!info)return null;let metaDir=path34.join(resolveSessionCacheDir2(info.sessionId),META_DIR2),entries=[];try{entries=await readdir7(metaDir)}catch{return null}for(let entry of entries){if(!entry.endsWith(".json"))continue;let metaPath=path34.join(metaDir,entry);try{let raw=await readFile11(metaPath,"utf8"),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-${randomUUID8().replace(/-/g,"")}`,blobPath=path34.join(dirs.blobsDir,`${fileId}.txt`),metaPath=path34.join(dirs.metaDir,`${fileId}.json`),lineCount=countLines2(opts.content),sha256=createHash4("sha256").update(opts.content).digest("hex"),byteSize=Buffer.byteLength(opts.content,"utf-8"),nowIso=new Date().toISOString();try{return await writeFile10(blobPath,opts.content,"utf8"),await writeFile10(metaPath,JSON.stringify({file_id:fileId,kind:"text",sha256,line_count:lineCount,byte_size:byteSize,created_at:nowIso,source:String(opts.source??"unknown")},null,2),"utf8"),{fileId,filePath:blobPath,lineCount,sha256,byteSize}}catch{return null}}async function cacheFileToSessionAttachment(opts){let cleanedPath=String(opts.sourcePath??"").trim();if(!cleanedPath)return null;let sessionId=normalizeSessionId2(opts.sessionId);if(!sessionId)return null;let sourceInfo;try{sourceInfo=await stat7(cleanedPath)}catch{return null}if(!sourceInfo.isFile()||sourceInfo.size<=0)return null;await cleanupExpiredSessionCaches2({ttlMs:BLOB_TTL_MS2,logger:opts.logger}).catch(()=>{});let sessionDir=resolveSessionCacheDir2(sessionId),dirs=await ensureAttachmentDirs(sessionDir);if(!dirs)return null;let fileId=`att-${randomUUID8().replace(/-/g,"")}`,preferredBaseName=basenameFromPath(String(opts.preferredBaseName??"").trim()||basenameFromPath(cleanedPath)),storedPath=await copyFileUnique(cleanedPath,dirs.attachmentsDir,preferredBaseName);if(!storedPath)return null;let metaPath=path34.join(dirs.metaDir,`${fileId}.json`),mediaType=String(opts.mediaType??"").trim()||guessMimeTypeFromPath(storedPath),originalName=basenameFromPath(cleanedPath),storedName=basenameFromPath(storedPath),nowIso=new Date().toISOString();try{return await writeFile10(metaPath,JSON.stringify({file_id:fileId,kind:"attachment",byte_size:sourceInfo.size,created_at:nowIso,source:String(opts.source??"unknown"),media_type:mediaType,original_name:originalName,stored_name:storedName},null,2),"utf8"),opts.logger?.("session_attachment_cached",{sessionId,fileId,byteSize:sourceInfo.size,mediaType,originalName,storedName}),{fileId,filePath:storedPath,byteSize:sourceInfo.size,mediaType,originalName}}catch{return await rm7(storedPath,{force:!0}).catch(()=>{}),null}}async function deleteSessionAttachmentByPath(absPath,logger){let info=parseAttachmentPathInfo(absPath);if(!info)return!1;try{await rm7(absPath,{force:!0});let metaMatch=await readAttachmentMetaByPath(absPath);if(metaMatch)await rm7(metaMatch.metaPath,{force:!0});return await Promise.all([removeDirIfEmpty(path34.join(resolveSessionCacheDir2(info.sessionId),ATTACHMENTS_DIR2)),removeDirIfEmpty(path34.join(resolveSessionCacheDir2(info.sessionId),META_DIR2)),removeDirIfEmpty(resolveSessionCacheDir2(info.sessionId))]),logger?.("session_attachment_deleted",{sessionId:info.sessionId,fileName:info.fileName}),!0}catch{return!1}}async function relocateSessionAttachmentPath(absPath,targetSessionId,logger){let sourceInfo=parseAttachmentPathInfo(absPath),targetSid=normalizeSessionId2(targetSessionId);if(!sourceInfo||!targetSid)return null;if(sourceInfo.sessionId===targetSid)return absPath;let metaMatch=await readAttachmentMetaByPath(absPath),preferredBaseName=String(metaMatch?.meta.stored_name??basenameFromPath(absPath)).trim()||basenameFromPath(absPath),mediaType=String(metaMatch?.meta.media_type??"").trim()||guessMimeTypeFromPath(absPath),source=String(metaMatch?.meta.source??"attachment_relocate").trim()||"attachment_relocate",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(path34.join(resolveStateDir3(),BLOB_CACHE_DIR2),cutoff,opts?.logger)}async function cleanupDedicatedCacheRoot2(cacheRoot,cutoff,logger){let entries=[];try{entries=await readdir7(cacheRoot)}catch{return}await Promise.all(entries.map(async(entry)=>{let sid=normalizeSessionId2(entry);if(!sid)return;let sessionDir=path34.join(cacheRoot,sid),candidates=[sessionDir,path34.join(sessionDir,BLOB_DIR2),path34.join(sessionDir,ATTACHMENTS_DIR2),path34.join(sessionDir,META_DIR2)],mtimes=[];for(let candidate of candidates)try{let info=await stat7(candidate);if(info.isDirectory()||info.isFile())mtimes.push(info.mtimeMs)}catch{}if(!mtimes.length)return;if(Math.max(...mtimes)>=cutoff)return;try{await rm7(sessionDir,{recursive:!0,force:!0}),logger?.("session_cache_ttl_deleted",{sessionId:sid,mtimeMs:Math.max(...mtimes),cutoff})}catch{}}))}async function removeDirIfEmpty(dir){try{if((await readdir7(dir)).length===0)await rm7(dir,{recursive:!0,force:!0})}catch{}}var COMMIT_ID_RE=/^[0-9a-f]{7,40}$/i;function getCommitIdFromMention(value){let raw=String(value||"");if(!raw.startsWith("git:commit:"))return null;let sha=raw.slice(11).trim();if(!COMMIT_ID_RE.test(sha))return null;return sha}function formatCommitObjectPath(sha){let safe=String(sha||"").trim();if(!safe)return"";return`.git/objects/${safe.slice(0,2)}/${safe}`}function renderCommitMarkdownLink(sha){let safe=String(sha||"").trim();if(!safe)return"";let path35=formatCommitObjectPath(safe);return`[${safe}](${path35})`}function stripLeadingFocusFilesBlock(text){let normalized=String(text??"").replace(/\r/g,"");if(!normalized)return"";let lines=normalized.split(`
|
|
1073
1073
|
`),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]===`
|
|
1074
1074
|
`))idx++;let m2=s2.slice(idx).match(/^\[([^\]]*)\]\(((?:\\\)|[^)])+)\)/);if(!m2)break;let path35=String(m2[2]??"").trim();if(path35.startsWith("<")&&path35.endsWith(">"))path35=path35.slice(1,-1);if(path35=path35.replace(/\\\)/g,")").trim(),!(path35.startsWith("/")||/^[A-Z]:[\\/]/i.test(path35)))break;matched2++,idx+=m2[0].length}if(!matched2)return null;let rest=s2.slice(idx);if(rest=rest.replace(/^[ \t]+/g,""),rest.startsWith(`
|
|
@@ -1169,7 +1169,7 @@ tc:${toolCalls}`}function userTranscriptSignature(msg){let content=String(msg.co
|
|
|
1169
1169
|
`).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):""}
|
|
1170
1170
|
---
|
|
1171
1171
|
${assistantSig}`;rounds.delete(key),rounds.set(key,round)}return[...rounds.values()].slice(-opts.limit).flat().map(clonePersistableValue)}function collectInterruptedRoundMessagesForPersistence(messages){return collectAnchoredAssistantRoundsForPersistence(messages,{limit:INTERRUPTED_PERSISTED_MESSAGE_LIMIT2,include:isInterruptedAssistantMessage})}function collectCompactMessagesForPersistence(messages){let unique=new Map;for(let m2 of messages){if(!m2||m2.role!=="assistant")continue;let id2=String(m2?.id??"").trim();if(!isCompactTranscriptMessageId(id2))continue;if(id2.startsWith("compact-restored-")||id2.startsWith("restored-compact-"))continue;if(!m2.parts.some((p2)=>{if(p2.type==="markdown")return String(p2?.markdown??"").trim().length>0;if(p2.type==="info")return String(p2?.text??"").trim().length>0;return!1}))continue;let sig=messagePersistenceSignature(m2);if(!sig)continue;unique.delete(sig),unique.set(sig,m2)}let out=[...unique.values()];if(out.length<=COMPACT_PERSISTED_MESSAGE_LIMIT2)return out;return out.slice(-COMPACT_PERSISTED_MESSAGE_LIMIT2)}function collectCompressionMessagesForPersistence(messages){let unique=new Map;for(let m2 of messages){if(!m2||m2.role!=="assistant")continue;let id2=String(m2?.id??"").trim();if(!isCompressionTranscriptMessageId(id2))continue;if(id2.startsWith("compression-restored-")||id2.startsWith("restored-compression-"))continue;if(!m2.parts.some((p2)=>{if(p2.type==="markdown")return String(p2?.markdown??"").trim().length>0;if(p2.type==="info")return String(p2?.text??"").trim().length>0;return!1}))continue;let sig=messagePersistenceSignature(m2);if(!sig)continue;unique.delete(sig),unique.set(sig,m2)}let out=[...unique.values()];if(out.length<=COMPRESSION_PERSISTED_MESSAGE_LIMIT2)return out;return out.slice(-COMPRESSION_PERSISTED_MESSAGE_LIMIT2)}function clonePersistableValue(value){return JSON.parse(JSON.stringify(value))}function assistantMessageHasDurableTranscriptParts(message){if(!message||message.role!=="assistant")return!1;return message.parts.some((part)=>{if(part.type==="markdown")return String(part.markdown??"").trim().length>0;if(part.type==="thinking")return String(part.content??"").trim().length>0;if(part.type==="tool_call")return!0;if(part.type==="tool_result")return!0;return!1})}function hasPendingTranscriptTail(messages){for(let index=messages.length-1;index>=0;index-=1){let message=messages[index];if(!message)continue;if(message.role==="tool")continue;if(message.role==="user")return!0;if(message.role==="assistant")return!assistantMessageHasDurableTranscriptParts(message);return!1}return!1}function collectErrorMessagesForPersistence(messages){return collectAnchoredAssistantRoundsForPersistence(messages,{limit:ERROR_PERSISTED_MESSAGE_LIMIT2,include:isErrorAssistantMessage})}function buildSupplementalUiPayload(messages){let interruptedMessages=collectInterruptedRoundMessagesForPersistence(messages).map(clonePersistableValue),compact=collectCompactMessagesForPersistence(messages),compactMessages=uiMessagesToSnapshotMessages(compact),compression=collectCompressionMessagesForPersistence(messages),compressionMessages=uiMessagesToSnapshotMessages(compression),errorMessages2=collectErrorMessagesForPersistence(messages);return{interruptedMessages,compactMessages,compressionMessages,errorMessages:errorMessages2}}function serializeSupplementalSignature(payload){try{return JSON.stringify(payload)}catch{return""}}function createDimSdkPersistence(opts){let storeRef=null,persistEnabled=!opts.deferPersist,schedulePersist=null,lastSupplementalSig=null,seedSupplementalSignature=(sessionId)=>{let id2=String(sessionId??"").trim();if(!id2||!storeRef){lastSupplementalSig=null;return}let payload=buildSupplementalUiPayload(storeRef.state.messages);lastSupplementalSig={sessionId:id2,sig:serializeSupplementalSignature(payload)}},hydratedMcpServers=Array.isArray(opts.mcpServers)?JSON.parse(JSON.stringify(opts.mcpServers)):[],hydratedMcpPhase=normalizeMcpPhase(opts.mcpPhase),hydratedMcpConnectedCount=Math.max(0,Number(opts.mcpConnectedCount)||0),hydratedMcpConfiguredCount=Math.max(0,Number(opts.mcpConfiguredCount)||hydratedMcpServers.length),backend=opts.sessionsBackend??null,sessions=backend?{async list(options){let page=normalizeBackendSessionListResult(await backend.list(options));return{sessions:page.sessions.map(snapshotToListItem).filter((item)=>Boolean(item)),...page.nextCursor?{nextCursor:page.nextCursor}:{}}},async get(id2){let sessionId=String(id2??"").trim();if(!sessionId)return;return backend.get(sessionId)},async reload(id2){let sessionId=String(id2??"").trim();if(!sessionId||!storeRef)return!1;if(String(storeRef.state.sessionId??"")!==sessionId)return!1;if(storeRef.state.runningAgentRound)return!1;if(storeRef.state.paused)return!1;if(storeRef.state.approval?.active?.status==="pending")return!1;let snapshot=await backend.get(sessionId);if(!snapshot)return!1;hydrateStoreFromSnapshot(storeRef,snapshot,{preserveLocalSyntheticErrors:!0,preserveLocalInterruptedMessages:!0,preserveLocalCompactMessages:!0,preserveLocalCompressionMessages:!0}),seedSupplementalSignature(sessionId);let invalidator=opts.agent;if(invalidator?.invalidateSession)invalidator.invalidateSession(sessionId);return!0},async use(id2){let sessionId=String(id2??"").trim();if(!sessionId||!storeRef)return;if(String(storeRef.state.sessionId??"")===sessionId)return;let snapshot=await backend.get(sessionId);if(!snapshot)return;hydrateStoreFromSnapshot(storeRef,snapshot),seedSupplementalSignature(sessionId);let invalidator=opts.agent;if(invalidator?.invalidateSession)invalidator.invalidateSession(sessionId)},async createNew(){if(!storeRef)return;let snapshot=await backend.create();if(!snapshot)return;let newSessionId=snapshotId2(snapshot);if(hydrateStoreFromSnapshot(storeRef,snapshot),newSessionId)seedSupplementalSignature(newSessionId);if(newSessionId){let invalidator=opts.agent;if(invalidator?.invalidateSession)invalidator.invalidateSession(newSessionId)}},async delete(id2){let sessionId=String(id2??"").trim();if(!sessionId)return;if(await backend.destroy(sessionId),storeRef&&String(storeRef.state.sessionId??"")===sessionId)storeRef.state.sessionId=""},async rename(id2,title){if(!storeRef)return;if(typeof backend.rename!=="function")return;let sessionId=String(id2??"").trim(),nextTitle=String(title??"").trim();if(!sessionId||!nextTitle)return;let snapshot=await backend.rename(sessionId,nextTitle);if(snapshot&&String(storeRef.state.sessionId??"")===sessionId)hydrateStoreFromSnapshot(storeRef,snapshot,{preserveLocalSyntheticErrors:!0,preserveLocalInterruptedMessages:!0,preserveLocalCompactMessages:!0,preserveLocalCompressionMessages:!0}),seedSupplementalSignature(sessionId)},async updateMetadata(id2,metadata){if(typeof backend.updateMetadata!=="function")return;let sessionId=String(id2??"").trim();if(!sessionId)return;await backend.updateMetadata(sessionId,metadata)},async fork(opts2){if(!storeRef)return;let seed=Array.isArray(opts2?.messages)?opts2.messages:[];if(typeof backend.createWithMessages!=="function"){let snapshot2=await backend.create();if(snapshot2)storeRef.state.sessionId=snapshotId2(snapshot2);storeRef.replaceMessages(seed),storeRef.clearRevertedMessages(),storeRef.state.selectedToolCallId=null,storeRef.resetSessionUsageState(),storeRef.state.lastRequestBudget=null;return}let snapshot=await backend.createWithMessages(uiMessagesToSnapshotMessages(stripSupplementalTranscriptMessages(seed)));if(!snapshot)return;hydrateStoreFromSnapshot(storeRef,snapshot),seedSupplementalSignature(snapshotId2(snapshot))}}:void 0,replaceObjectContents=(target,source)=>{for(let key of Object.keys(target))delete target[key];Object.assign(target,source)},ensureStoreMcpState=(store3)=>{let current=store3.state.mcp;if(current&&Array.isArray(current.servers)){if(typeof current.phase!=="string")current.phase="ready";if(typeof current.connectedCount!=="number")current.connectedCount=0;if(typeof current.configuredCount!=="number")current.configuredCount=Array.isArray(current.servers)?current.servers.length:0;return current}return store3.state.mcp={servers:[],phase:"ready",connectedCount:0,configuredCount:0},store3.state.mcp},applyHydratedMcpState=(store3)=>{let mcpState=ensureStoreMcpState(store3),nextServers=JSON.parse(JSON.stringify(hydratedMcpServers));mcpState.servers.splice(0,mcpState.servers.length,...nextServers),mcpState.phase=hydratedMcpPhase,mcpState.connectedCount=hydratedMcpConnectedCount,mcpState.configuredCount=hydratedMcpConfiguredCount},applyHydration=(store3,cache,config2,tools)=>{let changed=!1,saved=config2.settings??{},providerId=normalizeProviderId(saved.providerId),provider=store3?.state.provider;if(!provider)return!1;if(providerId)provider.activeId=providerId;let connections=saved.providerConnections??{},normalizedConnections=Object.fromEntries(Object.entries(connections).map(([id2,conn])=>{let apiKey=readOptionalString3(conn?.apiKey),baseUrl=readOptionalString3(conn?.baseUrl),models=(Array.isArray(conn?.models)?conn.models:[]).map((m2)=>{let model=m2&&typeof m2==="object"?m2:{},id3=readOptionalString3(model.id);if(!id3)return null;let name15=readOptionalString3(model.name),limit=normalizeLimit2(model.limit),vision=typeof model.vision==="boolean"?model.vision:void 0,reasoning=model.reasoning?.supported?{supported:!0,default:model.reasoning.default}:void 0;return{id:id3,...name15?{name:name15}:{},...limit?{limit}:{},...model.userDefined===!0||model.outputIsUserDefined===!0?{userDefined:!0}:{},...typeof vision==="boolean"?{vision}:{},...reasoning?{reasoning}:{}}}).filter((m2)=>Boolean(m2));return[id2,{...apiKey?{apiKey}:{},...baseUrl?{baseUrl}:{},...models.length?{models}:{}}]}));provider.connections=normalizedConnections;let activeByProvider=saved.activeModelByProvider??{};provider.activeModelByProvider={...activeByProvider??{}};let toProviderAdapter=(value)=>{if(value==="openai"||value==="openai-responses"||value==="gemini"||value==="anthropic")return value;return},toCustomProviderId=(value)=>{if(typeof value==="string"&&value.startsWith("cp_"))return value;return},customProviders=Array.isArray(saved.customProviders)?saved.customProviders.map((p2)=>{let entry=p2&&typeof p2==="object"?p2:{},models=(Array.isArray(entry.models)?entry.models:[]).map((m2)=>{let model=m2&&typeof m2==="object"?m2:{},id3=readOptionalString3(model.id);if(!id3)return null;let name16=readOptionalString3(model.name),limit=normalizeLimit2(model.limit),vision=typeof model.vision==="boolean"?model.vision:void 0,reasoning=model.reasoning?.supported?{supported:!0,default:model.reasoning.default}:void 0;return{id:id3,...name16?{name:name16}:{},...limit?{limit}:{},...model.userDefined===!0||model.outputIsUserDefined===!0?{userDefined:!0}:{},...typeof vision==="boolean"?{vision}:{},...reasoning?{reasoning}:{}}}).filter((m2)=>Boolean(m2)),id2=toCustomProviderId(readOptionalString3(entry.id)),name15=readOptionalString3(entry.name),adapter=toProviderAdapter(readOptionalString3(entry.adapter));if(!id2||!name15||!adapter)return null;let baseUrl=readOptionalString3(entry.baseUrl),apiKey=readOptionalString3(entry.apiKey);return{id:id2,name:name15,adapter,...baseUrl?{baseUrl}:{},...apiKey?{apiKey}:{},...typeof entry.responsesAutoPromptCacheKey==="boolean"?{responsesAutoPromptCacheKey:entry.responsesAutoPromptCacheKey}:{},...typeof entry.responsesUseSessionId==="boolean"?{responsesUseSessionId:entry.responsesUseSessionId}:{},models:backfillCustomProviderModels(models,{adapter})}}).filter((p2)=>Boolean(p2)):[];provider.customProviders=customProviders,hydrateToolsStateFromConfig(tools,store3.state,hydratedMcpServers),applyHydratedMcpState(store3);let savedUi=cache.settings??{},uiState=store3.state.ui,env=store3?.state?.context?.env??{};if(!readOptionalString3(env.DIMCODE_TOOL_APPROVALS)&&savedUi.toolApprovals){let raw=String(savedUi.toolApprovals),mapped=raw==="auto"||raw==="all"?"auto":raw==="strict"||raw==="manual"?"strict":"normal";store3.state.approval.mode=mapped}if(uiState){if(typeof savedUi.themeMode==="string"&&savedUi.themeMode)store3.setThemeMode(savedUi.themeMode);if(typeof savedUi.statusCompact==="boolean")uiState.statusCompact=savedUi.statusCompact;if(typeof savedUi.onboardingSeenVersion==="string"&&savedUi.onboardingSeenVersion)uiState.onboarding={...uiState.onboarding??{},lastSeenVersion:savedUi.onboardingSeenVersion};if(savedUi.shortcuts)uiState.shortcuts=normalizeShortcutBindings(savedUi.shortcuts);if(typeof savedUi.greetingLastSeenDate==="string")uiState.greeting={...uiState.greeting??{},lastSeenDate:savedUi.greetingLastSeenDate};if(savedUi.providerFunnelCounts&&typeof savedUi.providerFunnelCounts==="object"){let counts=Object.fromEntries(Object.entries(savedUi.providerFunnelCounts).map(([step,count])=>[String(step),Number(count)]).filter(([step,count])=>step&&Number.isFinite(count)&&count>0));uiState.providerFunnel={...uiState.providerFunnel??{},counts,events:Array.isArray(uiState.providerFunnel?.events)?uiState.providerFunnel.events:[]}}if(savedUi.workspaceSelectionByCwd&&typeof savedUi.workspaceSelectionByCwd==="object"){let byCwd=Object.fromEntries(Object.entries(savedUi.workspaceSelectionByCwd).map(([cwd,value])=>{let key=readOptionalString3(cwd),providerId2=readOptionalString3(value?.providerId),modelId=readOptionalString3(value?.modelId);if(!key||!providerId2)return null;return[key,{providerId:providerId2,...modelId?{modelId}:{}}]}).filter((entry)=>Boolean(entry)));uiState.workspaceSelectionByCwd=byCwd}let savedDebugMode=readPersistedDebugLogMode(savedUi.debugLogMode);uiState.debugLogging={...uiState.debugLogging??{},enabled:savedDebugMode==="auto",auto:savedDebugMode==="auto",mode:savedDebugMode,directory:readOptionalString3(savedUi.debugLogDirectory)||readOptionalString3(uiState.debugLogging?.directory)||"~/.dimcode/debug"};let savedReasoningMap=savedUi.reasoningEffortByModel;if(savedReasoningMap){let entries=Object.entries(savedReasoningMap).map(([modelId,value])=>{let key=readOptionalString3(modelId),v2=readOptionalString3(value);return key&&v2?[key,v2]:null}).filter((e2)=>Boolean(e2));uiState.reasoningEffortByModel=Object.fromEntries(entries)}}let{candidates,existingProviderIds}=buildProviderSelectionCandidates({connections:provider.connections,customProviders,legacyCustom:provider.custom,rememberedModels:{...provider.activeModelByProvider??{}}}),rememberedModels=stripUnknownActiveModelSelections({...provider.activeModelByProvider??{}},existingProviderIds);if(JSON.stringify(provider.activeModelByProvider??{})!==JSON.stringify(rememberedModels))provider.activeModelByProvider=rememberedModels,changed=!0;if(uiState){let sanitizedWorkspaceSelections=sanitizeWorkspaceProviderSelections({workspaceSelections:uiState.workspaceSelectionByCwd,candidates,rememberedModels});if(JSON.stringify(uiState.workspaceSelectionByCwd??{})!==JSON.stringify(sanitizedWorkspaceSelections))uiState.workspaceSelectionByCwd=sanitizedWorkspaceSelections,changed=!0}let selection=resolveProviderSelection({candidates,preferredProviderId:String(provider.activeId??"").trim(),preferredModelId:String(store3.state.config.model??"").trim(),rememberedModels}),nextProviderId=String(selection.providerId??"").trim(),nextModelId=String(selection.modelId??"").trim();if(String(provider.activeId??"").trim()!==nextProviderId)provider.activeId=nextProviderId,changed=!0;if(String(store3.state.config.model??"").trim()!==nextModelId)store3.state.config.model=nextModelId,changed=!0;if(backend){let currentId=String(store3.state.sessionId??"").trim();if(currentId)backend.get(currentId).then((snapshot)=>{if(snapshot&&storeRef)hydrateStoreFromSnapshot(storeRef,snapshot,{preserveLocalSyntheticErrors:!0,preserveLocalInterruptedMessages:!0,preserveLocalCompactMessages:!0,preserveLocalCompressionMessages:!0}),seedSupplementalSignature(currentId)}).catch(()=>{})}return changed};return{sessions,onStoreCreated:(store3)=>{storeRef=store3,applyHydration(store3,opts.cache,opts.config,opts.tools),registerOAuthRuntimeSyncTarget({getStore:()=>storeRef,updatePersistenceSnapshots:(next)=>{if(next.cache)replaceObjectContents(opts.cache,next.cache);if(next.config)replaceObjectContents(opts.config,next.config)},invalidateSession:(sessionId)=>{let invalidator=opts.agent;if(invalidator?.invalidateSession)invalidator.invalidateSession(sessionId)}});let persist=createDebouncedAsyncTask(async()=>{try{let nextCache=buildUserCacheFromStore({prev:opts.cache,store:store3}),nextConfig=buildUserConfigFromStore({prev:opts.config,store:store3}),nextTools=buildUserToolsFromStore({prev:opts.tools,store:store3}),mcpServers=Array.isArray(store3.state?.mcp?.servers)?store3.state.mcp.servers:[],mcpPhase=normalizeMcpPhase(store3.state?.mcp?.phase),saves=[saveDimcodeUserCache(opts.cacheFile,nextCache),saveDimcodeUserConfig(opts.configFile,nextConfig),saveDimcodeUserTools(opts.toolsFile,nextTools)];if(opts.mcpJsonFile&&(mcpPhase==="ready"||mcpPhase==="error"))saves.push(saveMcpJson(opts.mcpJsonFile,mcpServers));await Promise.all(saves)}catch(e2){console.warn("[dimcode] Failed to persist cache:",e2)}},300);schedulePersist=()=>{if(!persistEnabled)return;persist.schedule()};let persistSupplementalTranscript=createDebouncedAsyncTask(async()=>{if(!backend||typeof backend.updateMetadata!=="function")return;let sessionId=String(store3.state.sessionId??"").trim();if(!sessionId)return;if(store3.state.runningAgentRound)return;if(hasPendingTranscriptTail(store3.state.messages))return;let payload=buildSupplementalUiPayload(store3.state.messages),sig=serializeSupplementalSignature(payload);if(lastSupplementalSig&&lastSupplementalSig.sessionId===sessionId&&lastSupplementalSig.sig===sig)return;try{await backend.updateMetadata(sessionId,{ui:payload}),lastSupplementalSig={sessionId,sig}}catch{}},0),scheduleSupplementalPersist=()=>{persistSupplementalTranscript.schedule()};if(watch(()=>store3.state.sessionId,schedulePersist),watch(()=>store3.state.config,schedulePersist,{deep:!0}),watch(()=>store3.state.context,schedulePersist,{deep:!0}),watch(()=>store3.state.approval.mode,schedulePersist),watch(()=>store3.state.ui?.locale,schedulePersist),watch(()=>store3.state.ui?.theme,schedulePersist,{deep:!0}),watch(()=>store3.state.ui?.statusCompact,schedulePersist),watch(()=>store3.state.ui?.onboarding,schedulePersist,{deep:!0}),watch(()=>store3.state.ui?.shortcuts,schedulePersist,{deep:!0}),watch(()=>store3.state.ui?.greeting,schedulePersist,{deep:!0}),watch(()=>store3.state.ui?.debugLogging,schedulePersist,{deep:!0}),watch(()=>store3.state.provider,schedulePersist,{deep:!0}),watch(()=>store3.state.tools,schedulePersist,{deep:!0}),watch(()=>store3.state.mcp?.servers,schedulePersist,{deep:!0}),watch(()=>store3.state.sessionId,scheduleSupplementalPersist),watch(()=>store3.state.messages.length,scheduleSupplementalPersist),watch(()=>store3.state.runningAgentRound,(running,prev)=>{if(prev&&!running)scheduleSupplementalPersist()}),opts.toolsRef)watch(()=>store3.state.tools,(newTools)=>{if(newTools)opts.toolsRef.current={...opts.toolsRef.current,websearch:{...opts.toolsRef.current?.websearch,apiKey:newTools.websearch?.apiKey??"",apiEndpoint:newTools.websearch?.apiEndpoint,numResults:newTools.websearch?.numResults},mcpServers:Array.isArray(store3.state.mcp?.servers)?JSON.parse(JSON.stringify(store3.state.mcp.servers)):opts.toolsRef.current?.mcpServers}},{deep:!0,immediate:!0}),watch(()=>store3.state.mcp?.servers,(servers)=>{opts.toolsRef.current={...opts.toolsRef.current,mcpServers:Array.isArray(servers)?JSON.parse(JSON.stringify(servers)):opts.toolsRef.current?.mcpServers}},{deep:!0,immediate:!0});schedulePersist()},rehydrate:(next)=>{if(next.cache)replaceObjectContents(opts.cache,next.cache);if(next.config)replaceObjectContents(opts.config,next.config);if(next.tools)replaceObjectContents(opts.tools,next.tools);if(Array.isArray(next.mcpServers))hydratedMcpServers=JSON.parse(JSON.stringify(next.mcpServers));if("mcpPhase"in next)hydratedMcpPhase=normalizeMcpPhase(next.mcpPhase);if("mcpConnectedCount"in next)hydratedMcpConnectedCount=Math.max(0,Number(next.mcpConnectedCount)||0);if("mcpConfiguredCount"in next)hydratedMcpConfiguredCount=Math.max(0,Number(next.mcpConfiguredCount)||hydratedMcpServers.length);else if(Array.isArray(next.mcpServers))hydratedMcpConfiguredCount=hydratedMcpServers.length;if(storeRef)applyHydration(storeRef,opts.cache,opts.config,opts.tools);if(!persistEnabled)persistEnabled=!0;schedulePersist?.()}}}async function resolveStartupSessionId(opts){return readOptionalString3(opts.envSessionId)}function createNoopToolRunner(){return async(call)=>{let name15=String(call?.name??"tool");return{id:String(call?.id??"tool"),status:"error",output:["Tool execution is handled by the DimCode agent.",`This UI cannot run tool "${name15}" locally.`].join(`
|
|
1172
|
-
`)}}}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=readPersistedDebugLogMode(startupDebugCache.settings?.debugLogMode),startupDebugSource=cliDebugDirectory?"cli":opts.enablePersistentDebugAuto&&persistedDebugMode==="auto"?"auto":"none",startupDebugDirectory=resolveDebugLogDirectory(cliDebugDirectory||readOptionalString3(startupDebugCache.settings?.debugLogDirectory)||void 0);if(startupDebugSource==="auto")await cleanupOldDebugJsonlLogs(startupDebugDirectory);if(startupDebugSource!=="none")await agent.setDebugLogState?.({enabled:!0,directory:startupDebugDirectory,reason:startupDebugSource==="auto"?"debug auto startup":"debug cli flag"});let sessionsBackend=agent.sessions??null,initialSessionId=await resolveStartupSessionId({sessionsBackend,envSessionId:opts.sessionId});opts.env.DIMCODE_SESSION_ID=initialSessionId??"",context.env.DIMCODE_SESSION_ID=initialSessionId??"";let{sessions,onStoreCreated,rehydrate}=createDimSdkPersistence({cacheFile,cache,configFile,config: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 spawn4}from"node:child_process";import path37 from"node:path";var import_semver2=__toESM(require_semver2(),1);var import_semver=__toESM(require_semver2(),1);function isPrereleaseVersion(version2){let parsed=import_semver.default.valid(version2);return Boolean(parsed&&import_semver.default.prerelease(parsed)?.length)}function resolveUpdateTrack(current){return isPrereleaseVersion(current)?"prerelease":"stable"}function selectUpdateVersion(versions2,track="stable"){return versions2.map((version2)=>import_semver.default.valid(String(version2??"").trim())).filter((version2)=>Boolean(version2)).filter((version2)=>track==="prerelease"?isPrereleaseVersion(version2):!isPrereleaseVersion(version2)).sort(import_semver.default.rcompare)[0]??null}function shouldInstallSelectedVersion(current,selected){let currentVersion=import_semver.default.valid(String(current??"").trim()),selectedVersion=import_semver.default.valid(String(selected??"").trim());if(!currentVersion||!selectedVersion)return String(current??"").trim()!==String(selected??"").trim();if(import_semver.default.eq(currentVersion,selectedVersion))return!1;if(import_semver.default.gt(selectedVersion,currentVersion))return!0;return isPrereleaseVersion(currentVersion)&&!isPrereleaseVersion(selectedVersion)}var UPGRADE_TOAST_FILE="upgrade-toast.json";function notifyUpgradeToast(message){let text=String(message??"").trim();if(!text)return;let handler=globalThis?.__DIMCODE_UPGRADE_TOAST__;if(typeof handler==="function")try{handler(text);return}catch{}writeUpgradeToastFile(text)}async function writeUpgradeToastFile(message){try{let[{mkdir:mkdir12,writeFile:writeFile11},path36]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env);await mkdir12(dir,{recursive:!0});let filePath=path36.join(dir,UPGRADE_TOAST_FILE),payload=JSON.stringify({message,createdAt:Date.now()});await writeFile11(filePath,payload,"utf8")}catch{}}async function consumeUpgradeToastFile(){try{let[{readFile:readFile12,unlink:unlink2},path36]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env),filePath=path36.join(dir,UPGRADE_TOAST_FILE),raw=await readFile12(filePath,"utf8");unlink2(filePath).catch(()=>{});let data=JSON.parse(raw);return String(data?.message??"").trim()||null}catch{return null}}import{existsSync as existsSync3,readFileSync as readFileSync2}from"node:fs";import path36 from"node:path";import{fileURLToPath as fileURLToPath4}from"node:url";function resolveCliVersion(){let injected="0.0.66-beta.1".trim();if(injected)return{version:injected,source:"injected"};let pkgVersion=readNearestPackageVersion();if(pkgVersion)return{version:pkgVersion,source:"package"};return null}function readNearestPackageVersion(){try{let dir=path36.dirname(fileURLToPath4(import.meta.url));for(let i2=0;i2<6;i2++){let candidate=path36.join(dir,"package.json");if(existsSync3(candidate)){let raw=readFileSync2(candidate,"utf8"),pkg=JSON.parse(raw),version2=typeof pkg?.version==="string"?pkg.version.trim():"";if(version2)return version2}let parent=path36.dirname(dir);if(parent===dir)break;dir=parent}}catch{}return null}var DEFAULT_GITLAB_HOST="gitlab.bfbops.com",DEFAULT_GITLAB_PROJECT="nextim/goatagent",DEFAULT_GITHUB_REPO="nextim/goatagent",DEFAULT_GITHUB_API_BASE_URL="https://api.github.com",RELEASE_CHECK_TIMEOUT_MS=5000;var RELEASE_LIST_PER_PAGE=100,RELEASE_LIST_MAX_PAGES=3,autoBinaryUpgradeStartedVersions=new Set;function getReleaseTimeoutMs(){let raw=String(process.env.DIMCODE_BINARY_UPDATE_CHECK_TIMEOUT_MS??"").trim(),n2=Number(raw);return Number.isFinite(n2)&&n2>100?Math.floor(n2):RELEASE_CHECK_TIMEOUT_MS}function isSelfContainedBinary(proc=process){try{let execPath=String(proc.execPath??"").trim();if(!execPath)return!1;let base=path37.basename(execPath.replace(/\\/g,"/")).toLowerCase();if(base==="node"||base.startsWith("node."))return!1;if(base==="bun"||base.startsWith("bun."))return!1;return!0}catch{return!1}}function resolveBunTarget(platform=process.platform,arch=process.arch){if(platform==="darwin"&&arch==="arm64")return"bun-darwin-arm64";if(platform==="darwin"&&arch==="x64")return"bun-darwin-x64";if(platform==="linux"&&arch==="x64")return"bun-linux-x64";if(platform==="linux"&&arch==="arm64")return"bun-linux-arm64";if(platform==="win32"&&arch==="x64")return"bun-windows-x64";return null}function resolveAssetName(target,platform=process.platform){return platform==="win32"?`dim-${target}.exe`:`dim-${target}`}function normalizeTagToSemver(tag){let raw=String(tag??"").trim();if(!raw)return null;let withoutV=raw.startsWith("v")?raw.slice(1):raw;return import_semver2.default.valid(withoutV)?withoutV:null}function selectGitHubAsset(releaseJson,assetName){let assets=Array.isArray(releaseJson?.assets)?releaseJson.assets:[];for(let asset of assets){let name15=typeof asset?.name==="string"?asset.name:"",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 release2=await fetchLatestReleaseInfo(process.env,current);if(!release2)return null;if(!import_semver2.default.valid(release2.version)||!shouldInstallSelectedVersion(current,release2.version))return null;if(process.env.DIMCODE_AUTOUPDATE!=="0"){if(autoBinaryUpgradeStartedVersions.has(release2.version))return null;return autoBinaryUpgradeStartedVersions.add(release2.version),startAutoBinaryUpgrade(release2.version),`Update available: dim ${release2.version} (current: ${current}). Installing in background; restart to use it.`}return`Update available: dim ${release2.version} (current: ${current}). Run: dim upgrade`}function resolveProvider(env){if(String(env.DIMCODE_BINARY_UPDATE_PROVIDER??"").trim().toLowerCase()==="github")return"github";if((typeof __CLI_BINARY_UPDATE_PROVIDER__==="string"?__CLI_BINARY_UPDATE_PROVIDER__.trim().toLowerCase():"")==="github")return"github";return"gitlab"}function resolveBinaryUpdateConfig(env){let provider=resolveProvider(env),githubApiBaseUrl=resolveGitHubApiBaseUrl(env),projectInfo=resolveProject(env,provider);return{provider,host:projectInfo.host,project:projectInfo.project,githubApiBaseUrl}}function resolveGitHubApiBaseUrl(env){let raw=String(env.DIMCODE_BINARY_UPDATE_GITHUB_API_BASE_URL??"").trim();if(raw)return raw.replace(/\/+$/,"");let injected=typeof __CLI_BINARY_UPDATE_GITHUB_API_BASE_URL__==="string"?__CLI_BINARY_UPDATE_GITHUB_API_BASE_URL__.trim():"";if(injected)return injected.replace(/\/+$/,"");return DEFAULT_GITHUB_API_BASE_URL}function resolveProject(env,provider){if(provider==="github"){let injectedRepo=typeof __CLI_BINARY_UPDATE_REPO__==="string"?__CLI_BINARY_UPDATE_REPO__.trim():"";return{project:String(env.DIMCODE_BINARY_UPDATE_REPO??injectedRepo??DEFAULT_GITHUB_REPO).trim()||DEFAULT_GITHUB_REPO}}let injectedHost=typeof __CLI_BINARY_UPDATE_GITLAB_HOST__==="string"?__CLI_BINARY_UPDATE_GITLAB_HOST__.trim():"",injectedProject=typeof __CLI_BINARY_UPDATE_PROJECT__==="string"?__CLI_BINARY_UPDATE_PROJECT__.trim():"",host=String(env.DIMCODE_BINARY_UPDATE_GITLAB_HOST??injectedHost??DEFAULT_GITLAB_HOST).trim()||DEFAULT_GITLAB_HOST,project=String(env.DIMCODE_BINARY_UPDATE_PROJECT??injectedProject??DEFAULT_GITLAB_PROJECT).trim()||DEFAULT_GITLAB_PROJECT;return{host,project}}function resolveAuthHeaders(env,provider){if(provider==="github"){let token2=String(env.DIMCODE_GITHUB_TOKEN??env.GITHUB_TOKEN??"").trim();return token2?{Authorization:`Bearer ${token2}`}:{}}let token=String(env.DIMCODE_GITLAB_TOKEN??env.GITLAB_TOKEN??"").trim();if(!token)return{};if(token.startsWith("glpat-"))return{"PRIVATE-TOKEN":token};return{Authorization:`Bearer ${token}`}}async function fetchLatestReleaseInfo(env,currentVersion){return await fetchReleaseInfo("latest",env,currentVersion)}async function fetchReleaseInfo(desired,env,currentVersion){let 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,currentVersion});let tagCandidates=buildTagCandidates(desired);for(let tagCandidate of tagCandidates){let releaseJson=await fetchReleaseJson({provider,host:projectInfo.host,project:projectInfo.project,tag:tagCandidate,headers,githubApiBaseUrl: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),resolveUpdateTrack(opts.currentVersion??""));if(!selected)return null;return releases.find((release2)=>release2.version===selected)??null}function releaseInfoFromJson(opts){let tag=String(opts.releaseJson?.tag_name??opts.releaseJson?.tagName??"").trim()||String(opts.fallbackTag??"").trim(),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{spawn4(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,promises as fsPromises}from"node:fs";import path39 from"node:path";import{existsSync as existsSync4,readFileSync as readFileSync3,realpathSync,statSync as statSync2}from"node:fs";import path38 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";function resolveCurrentInstallTarget(opts){let execPath=normalizeExistingPath(opts.execPath);if(opts.isSelfContainedBinary)return{kind:"binary",manager:"binary",binPath:execPath??normalizePath2(opts.execPath)};let wrapperName=String(opts.env?.DIMCODE_NPM_PACKAGE??"").trim()||"dimcode",wrapperRoot=normalizeExistingPath(opts.env?.DIMCODE_NPM_PACKAGE_ROOT),importPath=pathFromFileUrl(opts.importMetaUrl),argvPath=normalizeExistingPath(opts.argvPath),binPath=argvPath??normalizePath2(opts.argvPath);if(wrapperRoot){let bun=resolveBunGlobalTarget(wrapperRoot,wrapperName,binPath);if(bun)return bun;let npm=resolveNpmGlobalTarget(wrapperRoot,wrapperName,binPath);if(npm)return npm;return{kind:"unknown",manager:"unknown",packageRoot:wrapperRoot,binPath,reason:`${wrapperName} wrapper root is not a recognized global install`}}let candidates=uniqueStrings([importPath,argvPath,normalizeExistingPath(importPath),execPath]);for(let candidate of candidates){let packageRoot=findPackageRoot(candidate,wrapperName);if(!packageRoot)continue;let sourceEntry=path38.join(packageRoot,"src","cli.ts");if(existsSync4(sourceEntry))return{kind:"source",manager:"source",packageRoot,binPath};let bun=resolveBunGlobalTarget(packageRoot,wrapperName,binPath);if(bun)return bun;let npm=resolveNpmGlobalTarget(packageRoot,wrapperName,binPath);if(npm)return npm;return{kind:"unknown",manager:"unknown",packageRoot,binPath,reason:`${wrapperName} package root is not a recognized global install`}}return{kind:"unknown",manager:"unknown",binPath,reason:`unable to locate ${wrapperName} package root`}}function resolveBunGlobalTarget(packageRoot,wrapperName,binPath){let normalized=toPosix(packageRoot),marker16=`/.bun/install/global/node_modules/${wrapperName}`;if(!normalized.includes(marker16))return null;let index=normalized.lastIndexOf(marker16),prefix=index>=0?packageRoot.slice(0,index+5):void 0;return{kind:"bun",manager:"bun",packageRoot,binPath,prefix}}function resolveNpmGlobalTarget(packageRoot,wrapperName,binPath){let parts=toPosix(packageRoot).split("/");if(parts.at(-1)!==wrapperName)return null;let nodeModulesIndex=parts.length-2;if(parts[nodeModulesIndex]!=="node_modules")return null;let hasLibSegment=parts[nodeModulesIndex-1]==="lib",prefixParts=hasLibSegment?parts.slice(0,nodeModulesIndex-1):parts.slice(0,nodeModulesIndex),prefix=fromPosix(prefixParts.join("/"))||path38.parse(packageRoot).root;if(!prefix)return null;if(!hasLibSegment&&existsSync4(path38.join(prefix,"package.json")))return{kind:"unknown",manager:"unknown",packageRoot,binPath,reason:`${wrapperName} appears to be installed in a local node_modules`};return{kind:"npm",manager:"npm",packageRoot,binPath,prefix}}function findPackageRoot(startPath,wrapperName){let normalized=normalizeExistingPath(startPath);if(!normalized)return null;let dir=isLikelyFilePath(normalized)?path38.dirname(normalized):normalized;for(;;){let packagePath=path38.join(dir,"package.json");if(existsSync4(packagePath)&&readPackageName(packagePath)===wrapperName)return dir;let parent=path38.dirname(dir);if(!parent||parent===dir)return null;dir=parent}}function readPackageName(packagePath){try{let parsed=JSON.parse(readFileSync3(packagePath,"utf8"));return typeof parsed?.name==="string"?parsed.name:""}catch{return""}}function pathFromFileUrl(value){try{return value.startsWith("file:")?fileURLToPath5(value):void 0}catch{return}}function normalizeExistingPath(value){let normalized=normalizePath2(value);if(!normalized)return;try{return realpathSync(normalized)}catch{return normalized}}function normalizePath2(value){let raw=String(value??"").trim();if(!raw)return;if(!path38.isAbsolute(raw))return;return path38.resolve(raw)}function uniqueStrings(values){return[...new Set(values.filter((v2)=>Boolean(v2)))]}function isLikelyFilePath(value){if(existsSync4(value))try{return statSync2(value).isFile()}catch{}return Boolean(path38.extname(value))}function toPosix(value){return value.replace(/\\/g,"/")}function fromPosix(value){if(path38.sep==="/")return value;return value.replace(/\//g,path38.sep)}var DEFAULT_PACKAGE_NAME="dimcode";function resolveWrapperPackageVersion(){return(process.env.DIMCODE_NPM_PACKAGE_VERSION||"").trim()||null}var DEBUG_LOG_PATH=process.env.DIMCODE_DEBUG_LOG||"./dimcode-debug.log",CHECK_TIMEOUT_MS=5000,autoInstallStartedVersions=new Set;async function fetchPackageVersions(packageName=DEFAULT_PACKAGE_NAME){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),CHECK_TIMEOUT_MS);try{let response=await fetch(`https://registry.npmjs.org/${packageName}`,{signal:controller.signal,headers:{Accept:"application/json"}});if(!response.ok)throw Error(`npm registry returned ${response.status}`);let 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}finally{clearTimeout(timeoutId)}}async function resolveLatestNpmVersion(packageName,currentVersion){return selectUpdateVersion(await fetchPackageVersions(packageName),resolveUpdateTrack(currentVersion))}async function checkNpmUpgrade(packageName=DEFAULT_PACKAGE_NAME){if(await logUpgradeCheck("start",{disableAutoUpdate:process.env.DIMCODE_DISABLE_AUTOUPDATE==="1",autoUpdate:process.env.DIMCODE_AUTOUPDATE!=="0",cwd:safeCwd(),argv:safeArgv(),debugLogPath:DEBUG_LOG_PATH}),process.env.DIMCODE_DISABLE_AUTOUPDATE==="1")return await logUpgradeCheck("skip-disabled"),null;let resolvedVersion=resolveCliVersion();if(!resolvedVersion?.version)return await logUpgradeCheck("skip-missing-version"),null;let wrapperVersion=packageName!==DEFAULT_PACKAGE_NAME?resolveWrapperPackageVersion():null,current=wrapperVersion||resolvedVersion.version,hasInjectedVersion=resolvedVersion.source==="injected";try{let latest=await resolveLatestNpmVersion(packageName,current);if(await logUpgradeCheck("check-result",{current,latest,hasInjectedVersion,wrapperVersion,updateTrack:resolveUpdateTrack(current)}),!latest)return await logUpgradeCheck("error",{message:"Failed to fetch latest version"}),null;if(!shouldInstallSelectedVersion(current,latest))return await logUpgradeCheck("no-update",{current,latest}),null;if(process.env.DIMCODE_AUTOUPDATE!=="0"&&hasInjectedVersion){let installer=resolvePackageInstaller(latest,packageName);if(!installer)return await logUpgradeCheck("autoupdate-skip-unknown-install-target",{current,latest,target:resolveNpmInstallTarget()}),`Update available: ${packageName}@${latest} (current: ${current}). Auto-update skipped because the current install source could not be identified. Run: dim version`;let installKey=`${packageName}@${latest}:${installer.manager}:${installer.prefix??""}`;if(autoInstallStartedVersions.has(installKey))return await logUpgradeCheck("autoupdate-skip-duplicate",{version:latest}),null;return autoInstallStartedVersions.add(installKey),await logUpgradeCheck("update-available",{current,latest,autoUpdate:!0,installer:installer.manager,prefix:installer.prefix}),startAutoInstall(latest,packageName,installer),`Update available: ${packageName}@${latest} (current: ${current}). Installing ${installer.manager} global package in background. Restart terminal after it finishes.`}return await logUpgradeCheck("update-available",{current,latest,autoUpdate:!1}),`Update available: ${packageName}@${latest} (current: ${current})`}catch(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(path39.basename(execPath).toLowerCase().startsWith("bun")&&existsSync5(execPath))return{command:execPath,argsPrefix:[]}}let bunHome=String(process.env.BUN_INSTALL??"").trim();if(bunHome){let bunExe=path39.join(bunHome,"bin","bun.exe");if(existsSync5(bunExe))return{command:bunExe,argsPrefix:[]}}return{command:"bun",argsPrefix:[]}}function resolveNpmCommand(){let execPath=String(process.execPath??"").trim(),execDir=execPath?path39.dirname(execPath):"";if(execDir){let npmCmd=path39.join(execDir,"npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]};let npmCliCandidates=[path39.join(execDir,"node_modules","npm","bin","npm-cli.js"),path39.resolve(execDir,"..","lib","node_modules","npm","bin","npm-cli.js")];if(execPath){for(let npmCli of npmCliCandidates)if(existsSync5(npmCli))return{command:execPath,argsPrefix:[npmCli]}}}let appData=String(process.env.APPDATA??"").trim();if(appData){let npmCmd=path39.join(appData,"npm","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFiles=String(process.env.ProgramFiles??"").trim();if(programFiles){let npmCmd=path39.join(programFiles,"nodejs","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFilesX86=String(process.env["ProgramFiles(x86)"]??"").trim();if(programFilesX86){let npmCmd=path39.join(programFilesX86,"nodejs","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}return{command:"npm",argsPrefix:[]}}function getNpmPackageOverride(){return(process.env.DIMCODE_NPM_PACKAGE||"").trim()||void 0}async function checkUpgrade(){let npmPackage=getNpmPackageOverride();if(npmPackage)return await checkNpmUpgrade(npmPackage);if(isSelfContainedBinary())return await checkBinaryUpgrade();return await checkNpmUpgrade()}import process25 from"node:process";var logger=debugLog2;async function cleanupExpiredSessionCaches3(opts){return cleanupExpiredSessionCaches2({...opts,logger})}var DEFAULT_LINE_THRESHOLD=400,DEFAULT_TOKEN_THRESHOLD=12000,DEFAULT_PREVIEW_LINES=20,DEFAULT_FIRST_RANGE_LINES=300,DEFAULT_PREVIEW_MAX_LINE_CHARS=240,DEFAULT_PREVIEW_MAX_CHARS=4000;function isNodeLike3(){let p2=globalThis.process;return Boolean(p2&&typeof p2?.versions?.node==="string")}function estimateTokens(text){let raw=String(text??""),chars=raw.length,bytes=Buffer.byteLength(raw,"utf-8"),nonAsciiChars=0;for(let i2=0;i2<raw.length;i2++)if(raw.charCodeAt(i2)>127)nonAsciiChars++;let asciiChars=Math.max(0,chars-nonAsciiChars),byChars=Math.ceil(chars/4),byBytes=Math.ceil(bytes/3),byMixed=Math.ceil(asciiChars/4+nonAsciiChars*0.9);return Math.max(byChars,byBytes,byMixed)}function countLines3(text){if(!text)return 0;return text.split(`
|
|
1172
|
+
`)}}}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=readPersistedDebugLogMode(startupDebugCache.settings?.debugLogMode),startupDebugSource=cliDebugDirectory?"cli":opts.enablePersistentDebugAuto&&persistedDebugMode==="auto"?"auto":"none",startupDebugDirectory=resolveDebugLogDirectory(cliDebugDirectory||readOptionalString3(startupDebugCache.settings?.debugLogDirectory)||void 0);if(startupDebugSource==="auto")await cleanupOldDebugJsonlLogs(startupDebugDirectory);if(startupDebugSource!=="none")await agent.setDebugLogState?.({enabled:!0,directory:startupDebugDirectory,reason:startupDebugSource==="auto"?"debug auto startup":"debug cli flag"});let sessionsBackend=agent.sessions??null,initialSessionId=await resolveStartupSessionId({sessionsBackend,envSessionId:opts.sessionId});opts.env.DIMCODE_SESSION_ID=initialSessionId??"",context.env.DIMCODE_SESSION_ID=initialSessionId??"";let{sessions,onStoreCreated,rehydrate}=createDimSdkPersistence({cacheFile,cache,configFile,config: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 spawn4}from"node:child_process";import path37 from"node:path";var import_semver2=__toESM(require_semver2(),1);var import_semver=__toESM(require_semver2(),1);function isPrereleaseVersion(version2){let parsed=import_semver.default.valid(version2);return Boolean(parsed&&import_semver.default.prerelease(parsed)?.length)}function resolveUpdateTrack(current){return isPrereleaseVersion(current)?"prerelease":"stable"}function selectUpdateVersion(versions2,track="stable"){return versions2.map((version2)=>import_semver.default.valid(String(version2??"").trim())).filter((version2)=>Boolean(version2)).filter((version2)=>track==="prerelease"?isPrereleaseVersion(version2):!isPrereleaseVersion(version2)).sort(import_semver.default.rcompare)[0]??null}function shouldInstallSelectedVersion(current,selected){let currentVersion=import_semver.default.valid(String(current??"").trim()),selectedVersion=import_semver.default.valid(String(selected??"").trim());if(!currentVersion||!selectedVersion)return String(current??"").trim()!==String(selected??"").trim();if(import_semver.default.eq(currentVersion,selectedVersion))return!1;if(import_semver.default.gt(selectedVersion,currentVersion))return!0;return isPrereleaseVersion(currentVersion)&&!isPrereleaseVersion(selectedVersion)}var UPGRADE_TOAST_FILE="upgrade-toast.json";function notifyUpgradeToast(message){let text=String(message??"").trim();if(!text)return;let handler=globalThis?.__DIMCODE_UPGRADE_TOAST__;if(typeof handler==="function")try{handler(text);return}catch{}writeUpgradeToastFile(text)}async function writeUpgradeToastFile(message){try{let[{mkdir:mkdir12,writeFile:writeFile11},path36]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env);await mkdir12(dir,{recursive:!0});let filePath=path36.join(dir,UPGRADE_TOAST_FILE),payload=JSON.stringify({message,createdAt:Date.now()});await writeFile11(filePath,payload,"utf8")}catch{}}async function consumeUpgradeToastFile(){try{let[{readFile:readFile12,unlink:unlink2},path36]=await Promise.all([import("node:fs/promises"),import("node:path")]),dir=await getDimcodeUserDir(process.env),filePath=path36.join(dir,UPGRADE_TOAST_FILE),raw=await readFile12(filePath,"utf8");unlink2(filePath).catch(()=>{});let data=JSON.parse(raw);return String(data?.message??"").trim()||null}catch{return null}}import{existsSync as existsSync3,readFileSync as readFileSync2}from"node:fs";import path36 from"node:path";import{fileURLToPath as fileURLToPath4}from"node:url";function resolveCliVersion(){let injected="0.0.67-beta.0".trim();if(injected)return{version:injected,source:"injected"};let pkgVersion=readNearestPackageVersion();if(pkgVersion)return{version:pkgVersion,source:"package"};return null}function readNearestPackageVersion(){try{let dir=path36.dirname(fileURLToPath4(import.meta.url));for(let i2=0;i2<6;i2++){let candidate=path36.join(dir,"package.json");if(existsSync3(candidate)){let raw=readFileSync2(candidate,"utf8"),pkg=JSON.parse(raw),version2=typeof pkg?.version==="string"?pkg.version.trim():"";if(version2)return version2}let parent=path36.dirname(dir);if(parent===dir)break;dir=parent}}catch{}return null}var DEFAULT_GITLAB_HOST="gitlab.bfbops.com",DEFAULT_GITLAB_PROJECT="nextim/goatagent",DEFAULT_GITHUB_REPO="nextim/goatagent",DEFAULT_GITHUB_API_BASE_URL="https://api.github.com",RELEASE_CHECK_TIMEOUT_MS=5000;var RELEASE_LIST_PER_PAGE=100,RELEASE_LIST_MAX_PAGES=3,autoBinaryUpgradeStartedVersions=new Set;function getReleaseTimeoutMs(){let raw=String(process.env.DIMCODE_BINARY_UPDATE_CHECK_TIMEOUT_MS??"").trim(),n2=Number(raw);return Number.isFinite(n2)&&n2>100?Math.floor(n2):RELEASE_CHECK_TIMEOUT_MS}function isSelfContainedBinary(proc=process){try{let execPath=String(proc.execPath??"").trim();if(!execPath)return!1;let base=path37.basename(execPath.replace(/\\/g,"/")).toLowerCase();if(base==="node"||base.startsWith("node."))return!1;if(base==="bun"||base.startsWith("bun."))return!1;return!0}catch{return!1}}function resolveBunTarget(platform=process.platform,arch=process.arch){if(platform==="darwin"&&arch==="arm64")return"bun-darwin-arm64";if(platform==="darwin"&&arch==="x64")return"bun-darwin-x64";if(platform==="linux"&&arch==="x64")return"bun-linux-x64";if(platform==="linux"&&arch==="arm64")return"bun-linux-arm64";if(platform==="win32"&&arch==="x64")return"bun-windows-x64";return null}function resolveAssetName(target,platform=process.platform){return platform==="win32"?`dim-${target}.exe`:`dim-${target}`}function normalizeTagToSemver(tag){let raw=String(tag??"").trim();if(!raw)return null;let withoutV=raw.startsWith("v")?raw.slice(1):raw;return import_semver2.default.valid(withoutV)?withoutV:null}function selectGitHubAsset(releaseJson,assetName){let assets=Array.isArray(releaseJson?.assets)?releaseJson.assets:[];for(let asset of assets){let name15=typeof asset?.name==="string"?asset.name:"",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 release2=await fetchLatestReleaseInfo(process.env,current);if(!release2)return null;if(!import_semver2.default.valid(release2.version)||!shouldInstallSelectedVersion(current,release2.version))return null;if(process.env.DIMCODE_AUTOUPDATE!=="0"){if(autoBinaryUpgradeStartedVersions.has(release2.version))return null;return autoBinaryUpgradeStartedVersions.add(release2.version),startAutoBinaryUpgrade(release2.version),`Update available: dim ${release2.version} (current: ${current}). Installing in background; restart to use it.`}return`Update available: dim ${release2.version} (current: ${current}). Run: dim upgrade`}function resolveProvider(env){if(String(env.DIMCODE_BINARY_UPDATE_PROVIDER??"").trim().toLowerCase()==="github")return"github";if((typeof __CLI_BINARY_UPDATE_PROVIDER__==="string"?__CLI_BINARY_UPDATE_PROVIDER__.trim().toLowerCase():"")==="github")return"github";return"gitlab"}function resolveBinaryUpdateConfig(env){let provider=resolveProvider(env),githubApiBaseUrl=resolveGitHubApiBaseUrl(env),projectInfo=resolveProject(env,provider);return{provider,host:projectInfo.host,project:projectInfo.project,githubApiBaseUrl}}function resolveGitHubApiBaseUrl(env){let raw=String(env.DIMCODE_BINARY_UPDATE_GITHUB_API_BASE_URL??"").trim();if(raw)return raw.replace(/\/+$/,"");let injected=typeof __CLI_BINARY_UPDATE_GITHUB_API_BASE_URL__==="string"?__CLI_BINARY_UPDATE_GITHUB_API_BASE_URL__.trim():"";if(injected)return injected.replace(/\/+$/,"");return DEFAULT_GITHUB_API_BASE_URL}function resolveProject(env,provider){if(provider==="github"){let injectedRepo=typeof __CLI_BINARY_UPDATE_REPO__==="string"?__CLI_BINARY_UPDATE_REPO__.trim():"";return{project:String(env.DIMCODE_BINARY_UPDATE_REPO??injectedRepo??DEFAULT_GITHUB_REPO).trim()||DEFAULT_GITHUB_REPO}}let injectedHost=typeof __CLI_BINARY_UPDATE_GITLAB_HOST__==="string"?__CLI_BINARY_UPDATE_GITLAB_HOST__.trim():"",injectedProject=typeof __CLI_BINARY_UPDATE_PROJECT__==="string"?__CLI_BINARY_UPDATE_PROJECT__.trim():"",host=String(env.DIMCODE_BINARY_UPDATE_GITLAB_HOST??injectedHost??DEFAULT_GITLAB_HOST).trim()||DEFAULT_GITLAB_HOST,project=String(env.DIMCODE_BINARY_UPDATE_PROJECT??injectedProject??DEFAULT_GITLAB_PROJECT).trim()||DEFAULT_GITLAB_PROJECT;return{host,project}}function resolveAuthHeaders(env,provider){if(provider==="github"){let token2=String(env.DIMCODE_GITHUB_TOKEN??env.GITHUB_TOKEN??"").trim();return token2?{Authorization:`Bearer ${token2}`}:{}}let token=String(env.DIMCODE_GITLAB_TOKEN??env.GITLAB_TOKEN??"").trim();if(!token)return{};if(token.startsWith("glpat-"))return{"PRIVATE-TOKEN":token};return{Authorization:`Bearer ${token}`}}async function fetchLatestReleaseInfo(env,currentVersion){return await fetchReleaseInfo("latest",env,currentVersion)}async function fetchReleaseInfo(desired,env,currentVersion){let 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,currentVersion});let tagCandidates=buildTagCandidates(desired);for(let tagCandidate of tagCandidates){let releaseJson=await fetchReleaseJson({provider,host:projectInfo.host,project:projectInfo.project,tag:tagCandidate,headers,githubApiBaseUrl: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),resolveUpdateTrack(opts.currentVersion??""));if(!selected)return null;return releases.find((release2)=>release2.version===selected)??null}function releaseInfoFromJson(opts){let tag=String(opts.releaseJson?.tag_name??opts.releaseJson?.tagName??"").trim()||String(opts.fallbackTag??"").trim(),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{spawn4(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,promises as fsPromises}from"node:fs";import path39 from"node:path";import{existsSync as existsSync4,readFileSync as readFileSync3,realpathSync,statSync as statSync2}from"node:fs";import path38 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";function resolveCurrentInstallTarget(opts){let execPath=normalizeExistingPath(opts.execPath);if(opts.isSelfContainedBinary)return{kind:"binary",manager:"binary",binPath:execPath??normalizePath2(opts.execPath)};let wrapperName=String(opts.env?.DIMCODE_NPM_PACKAGE??"").trim()||"dimcode",wrapperRoot=normalizeExistingPath(opts.env?.DIMCODE_NPM_PACKAGE_ROOT),importPath=pathFromFileUrl(opts.importMetaUrl),argvPath=normalizeExistingPath(opts.argvPath),binPath=argvPath??normalizePath2(opts.argvPath);if(wrapperRoot){let bun=resolveBunGlobalTarget(wrapperRoot,wrapperName,binPath);if(bun)return bun;let npm=resolveNpmGlobalTarget(wrapperRoot,wrapperName,binPath);if(npm)return npm;return{kind:"unknown",manager:"unknown",packageRoot:wrapperRoot,binPath,reason:`${wrapperName} wrapper root is not a recognized global install`}}let candidates=uniqueStrings([importPath,argvPath,normalizeExistingPath(importPath),execPath]);for(let candidate of candidates){let packageRoot=findPackageRoot(candidate,wrapperName);if(!packageRoot)continue;let sourceEntry=path38.join(packageRoot,"src","cli.ts");if(existsSync4(sourceEntry))return{kind:"source",manager:"source",packageRoot,binPath};let bun=resolveBunGlobalTarget(packageRoot,wrapperName,binPath);if(bun)return bun;let npm=resolveNpmGlobalTarget(packageRoot,wrapperName,binPath);if(npm)return npm;return{kind:"unknown",manager:"unknown",packageRoot,binPath,reason:`${wrapperName} package root is not a recognized global install`}}return{kind:"unknown",manager:"unknown",binPath,reason:`unable to locate ${wrapperName} package root`}}function resolveBunGlobalTarget(packageRoot,wrapperName,binPath){let normalized=toPosix(packageRoot),marker16=`/.bun/install/global/node_modules/${wrapperName}`;if(!normalized.includes(marker16))return null;let index=normalized.lastIndexOf(marker16),prefix=index>=0?packageRoot.slice(0,index+5):void 0;return{kind:"bun",manager:"bun",packageRoot,binPath,prefix}}function resolveNpmGlobalTarget(packageRoot,wrapperName,binPath){let parts=toPosix(packageRoot).split("/");if(parts.at(-1)!==wrapperName)return null;let nodeModulesIndex=parts.length-2;if(parts[nodeModulesIndex]!=="node_modules")return null;let hasLibSegment=parts[nodeModulesIndex-1]==="lib",prefixParts=hasLibSegment?parts.slice(0,nodeModulesIndex-1):parts.slice(0,nodeModulesIndex),prefix=fromPosix(prefixParts.join("/"))||path38.parse(packageRoot).root;if(!prefix)return null;if(!hasLibSegment&&existsSync4(path38.join(prefix,"package.json")))return{kind:"unknown",manager:"unknown",packageRoot,binPath,reason:`${wrapperName} appears to be installed in a local node_modules`};return{kind:"npm",manager:"npm",packageRoot,binPath,prefix}}function findPackageRoot(startPath,wrapperName){let normalized=normalizeExistingPath(startPath);if(!normalized)return null;let dir=isLikelyFilePath(normalized)?path38.dirname(normalized):normalized;for(;;){let packagePath=path38.join(dir,"package.json");if(existsSync4(packagePath)&&readPackageName(packagePath)===wrapperName)return dir;let parent=path38.dirname(dir);if(!parent||parent===dir)return null;dir=parent}}function readPackageName(packagePath){try{let parsed=JSON.parse(readFileSync3(packagePath,"utf8"));return typeof parsed?.name==="string"?parsed.name:""}catch{return""}}function pathFromFileUrl(value){try{return value.startsWith("file:")?fileURLToPath5(value):void 0}catch{return}}function normalizeExistingPath(value){let normalized=normalizePath2(value);if(!normalized)return;try{return realpathSync(normalized)}catch{return normalized}}function normalizePath2(value){let raw=String(value??"").trim();if(!raw)return;if(!path38.isAbsolute(raw))return;return path38.resolve(raw)}function uniqueStrings(values){return[...new Set(values.filter((v2)=>Boolean(v2)))]}function isLikelyFilePath(value){if(existsSync4(value))try{return statSync2(value).isFile()}catch{}return Boolean(path38.extname(value))}function toPosix(value){return value.replace(/\\/g,"/")}function fromPosix(value){if(path38.sep==="/")return value;return value.replace(/\//g,path38.sep)}var DEFAULT_PACKAGE_NAME="dimcode";function resolveWrapperPackageVersion(){return(process.env.DIMCODE_NPM_PACKAGE_VERSION||"").trim()||null}var DEBUG_LOG_PATH=process.env.DIMCODE_DEBUG_LOG||"./dimcode-debug.log",CHECK_TIMEOUT_MS=5000,autoInstallStartedVersions=new Set;async function fetchPackageVersions(packageName=DEFAULT_PACKAGE_NAME){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),CHECK_TIMEOUT_MS);try{let response=await fetch(`https://registry.npmjs.org/${packageName}`,{signal:controller.signal,headers:{Accept:"application/json"}});if(!response.ok)throw Error(`npm registry returned ${response.status}`);let 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}finally{clearTimeout(timeoutId)}}async function resolveLatestNpmVersion(packageName,currentVersion){return selectUpdateVersion(await fetchPackageVersions(packageName),resolveUpdateTrack(currentVersion))}async function checkNpmUpgrade(packageName=DEFAULT_PACKAGE_NAME){if(await logUpgradeCheck("start",{disableAutoUpdate:process.env.DIMCODE_DISABLE_AUTOUPDATE==="1",autoUpdate:process.env.DIMCODE_AUTOUPDATE!=="0",cwd:safeCwd(),argv:safeArgv(),debugLogPath:DEBUG_LOG_PATH}),process.env.DIMCODE_DISABLE_AUTOUPDATE==="1")return await logUpgradeCheck("skip-disabled"),null;let resolvedVersion=resolveCliVersion();if(!resolvedVersion?.version)return await logUpgradeCheck("skip-missing-version"),null;let wrapperVersion=packageName!==DEFAULT_PACKAGE_NAME?resolveWrapperPackageVersion():null,current=wrapperVersion||resolvedVersion.version,hasInjectedVersion=resolvedVersion.source==="injected";try{let latest=await resolveLatestNpmVersion(packageName,current);if(await logUpgradeCheck("check-result",{current,latest,hasInjectedVersion,wrapperVersion,updateTrack:resolveUpdateTrack(current)}),!latest)return await logUpgradeCheck("error",{message:"Failed to fetch latest version"}),null;if(!shouldInstallSelectedVersion(current,latest))return await logUpgradeCheck("no-update",{current,latest}),null;if(process.env.DIMCODE_AUTOUPDATE!=="0"&&hasInjectedVersion){let installer=resolvePackageInstaller(latest,packageName);if(!installer)return await logUpgradeCheck("autoupdate-skip-unknown-install-target",{current,latest,target:resolveNpmInstallTarget()}),`Update available: ${packageName}@${latest} (current: ${current}). Auto-update skipped because the current install source could not be identified. Run: dim version`;let installKey=`${packageName}@${latest}:${installer.manager}:${installer.prefix??""}`;if(autoInstallStartedVersions.has(installKey))return await logUpgradeCheck("autoupdate-skip-duplicate",{version:latest}),null;return autoInstallStartedVersions.add(installKey),await logUpgradeCheck("update-available",{current,latest,autoUpdate:!0,installer:installer.manager,prefix:installer.prefix}),startAutoInstall(latest,packageName,installer),`Update available: ${packageName}@${latest} (current: ${current}). Installing ${installer.manager} global package in background. Restart terminal after it finishes.`}return await logUpgradeCheck("update-available",{current,latest,autoUpdate:!1}),`Update available: ${packageName}@${latest} (current: ${current})`}catch(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(path39.basename(execPath).toLowerCase().startsWith("bun")&&existsSync5(execPath))return{command:execPath,argsPrefix:[]}}let bunHome=String(process.env.BUN_INSTALL??"").trim();if(bunHome){let bunExe=path39.join(bunHome,"bin","bun.exe");if(existsSync5(bunExe))return{command:bunExe,argsPrefix:[]}}return{command:"bun",argsPrefix:[]}}function resolveNpmCommand(){let execPath=String(process.execPath??"").trim(),execDir=execPath?path39.dirname(execPath):"";if(execDir){let npmCmd=path39.join(execDir,"npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]};let npmCliCandidates=[path39.join(execDir,"node_modules","npm","bin","npm-cli.js"),path39.resolve(execDir,"..","lib","node_modules","npm","bin","npm-cli.js")];if(execPath){for(let npmCli of npmCliCandidates)if(existsSync5(npmCli))return{command:execPath,argsPrefix:[npmCli]}}}let appData=String(process.env.APPDATA??"").trim();if(appData){let npmCmd=path39.join(appData,"npm","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFiles=String(process.env.ProgramFiles??"").trim();if(programFiles){let npmCmd=path39.join(programFiles,"nodejs","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}let programFilesX86=String(process.env["ProgramFiles(x86)"]??"").trim();if(programFilesX86){let npmCmd=path39.join(programFilesX86,"nodejs","npm.cmd");if(existsSync5(npmCmd))return{command:npmCmd,argsPrefix:[]}}return{command:"npm",argsPrefix:[]}}function getNpmPackageOverride(){return(process.env.DIMCODE_NPM_PACKAGE||"").trim()||void 0}async function checkUpgrade(){let npmPackage=getNpmPackageOverride();if(npmPackage)return await checkNpmUpgrade(npmPackage);if(isSelfContainedBinary())return await checkBinaryUpgrade();return await checkNpmUpgrade()}import process25 from"node:process";var logger=debugLog2;async function cleanupExpiredSessionCaches3(opts){return cleanupExpiredSessionCaches2({...opts,logger})}var DEFAULT_LINE_THRESHOLD=400,DEFAULT_TOKEN_THRESHOLD=12000,DEFAULT_PREVIEW_LINES=20,DEFAULT_FIRST_RANGE_LINES=300,DEFAULT_PREVIEW_MAX_LINE_CHARS=240,DEFAULT_PREVIEW_MAX_CHARS=4000;function isNodeLike3(){let p2=globalThis.process;return Boolean(p2&&typeof p2?.versions?.node==="string")}function estimateTokens(text){let raw=String(text??""),chars=raw.length,bytes=Buffer.byteLength(raw,"utf-8"),nonAsciiChars=0;for(let i2=0;i2<raw.length;i2++)if(raw.charCodeAt(i2)>127)nonAsciiChars++;let asciiChars=Math.max(0,chars-nonAsciiChars),byChars=Math.ceil(chars/4),byBytes=Math.ceil(bytes/3),byMixed=Math.ceil(asciiChars/4+nonAsciiChars*0.9);return Math.max(byChars,byBytes,byMixed)}function countLines3(text){if(!text)return 0;return text.split(`
|
|
1173
1173
|
`).length}function buildPreview(text,maxLines){let lines=text.split(`
|
|
1174
1174
|
`).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(`
|
|
1175
1175
|
`)}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(`
|
|
@@ -1188,7 +1188,7 @@ ${assistantSig}`;rounds.delete(key),rounds.set(key,round)}return[...rounds.value
|
|
|
1188
1188
|
`).slice(0,8).join(`
|
|
1189
1189
|
`),"```"].join(`
|
|
1190
1190
|
`),modelId=String(opts.state?.config?.model??"").trim()||void 0;opts.pushMessage({id:opts.id("m"),role:"assistant",parts:[{type:"markdown",markdown:summary}],createdAtMs:Date.now(),...modelId?{modelId}:{}})}async function runToolCall(callId){if(opts.externalAgentProvided)return null;let found=findToolCall(callId);if(!found)return null;if(!opts.state.approval.approvedToolCalls[callId]){if(ensureApproved(found.messageId,found.call)==="pending")return null}opts.state.runningToolCallId=callId;let uiState=opts.state.ui;if(uiState)uiState.tool={callId,name:String(found.call.name??""),startedAtMs:Date.now()};try{let profile=isToolExecProfileEnabled(),t0=profile?Date.now():0;traceLog({tag:"TOOL",message:"run.start",payload:{callId,tool:String(found.call.name??""),sessionId:String(opts.state?.sessionId??"")}});let result=await(async()=>{try{return await withPerfSpanAsync("toolRunner",`tool=${String(found.call.name??"")} callId=${callId}`,async()=>{return await opts.toolRunner(found.call)})}catch(e2){let errText=e2 instanceof Error?e2.stack||e2.message:String(e2);return{id:callId,status:"error",output:`Tool runner error:
|
|
1191
|
-
${errText}`}}})(),toolNameLower=String(found.call.name??"").trim().toLowerCase(),normalizedResult=toolNameLower==="read"?(()=>{let truncated=truncateReadToolOutput(String(result.output??""),{maxLines:10,ellipsisLine:"..."});return{...result,output:truncated.output,outputAnsi:void 0}})():result;if(profile){let ms=Date.now()-t0;if(ms>=(isOneShotEnabled()?5:40)){let argsKeys=(()=>{let a2=found.call.arguments;if(!a2||typeof a2!=="object"||Array.isArray(a2))return 0;try{return Object.keys(a2).length}catch{return 0}})(),outChars=String(normalizedResult.output??"").length,outAnsiChars=String(normalizedResult.outputAnsi??"").length;perfLog(`[TOOL_EXEC] ${ms}ms callId=${callId} tool=${toolNameLower||"tool"} argsKeys=${argsKeys} outChars=${outChars} outAnsiChars=${outAnsiChars}`)}}return traceLog({tag:"TOOL",message:"run.end",payload:{callId,tool:toolNameLower||"tool",status:normalizedResult.status,outChars:String(normalizedResult.output??"").length}}),opts.pushMessage({id:opts.id("m"),role:"tool",result:normalizedResult}),opts.attachToolResultPart(found.messageId,normalizedResult),normalizedResult}finally{opts.state.runningToolCallId=null;let uiState2=opts.state.ui;if(uiState2?.tool)uiState2.tool={callId:null,name:"",startedAtMs:0}}}return{ensureApproved,findToolCall,resolveActiveApproval,runToolCall}}var MessageRoles=["user","assistant","tool"];var AssistantContentPartTypes=["status","thinking","markdown","tool_call","tool_output","tool_result","approve","todo","plan","llm_meta","info"];var GoatChainMessageTypes=[...MessageRoles,...AssistantContentPartTypes];function makeBase(fg,bg){let out={};for(let t3 of GoatChainMessageTypes)out[t3]={fg,bg};return out}var themeRegistry=new Map,DARK_MESSAGE_COLORS=Object.freeze({...makeBase("white","black"),user:{fg:"white",bg:"blackBright"},assistant:{fg:"white",bg:"black"},markdown:{fg:"white",bg:"black"},tool_call:{fg:"yellowBright",bg:"black"},tool:{fg:"white",bg:"black"},tool_output:{fg:"cyanBright",bg:"black"},tool_result:{fg:"white",bg:"black"},thinking:{fg:"magentaBright",bg:"black"},plan:{fg:"magentaBright",bg:"black"},todo:{fg:"greenBright",bg:"black"},status:{fg:"blueBright",bg:"blackBright"},approve:{fg:"yellowBright",bg:"black"},info:{fg:"yellowBright",bg:"black"}}),LIGHT_MESSAGE_COLORS=Object.freeze({...makeBase("black","white"),user:{fg:"black",bg:"blackBright"},assistant:{fg:"black",bg:"white"},markdown:{fg:"black",bg:"white"},tool_call:{fg:"yellowBright",bg:"white"},tool:{fg:"black",bg:"white"},tool_output:{fg:"cyanBright",bg:"white"},tool_result:{fg:"black",bg:"white"},thinking:{fg:"magentaBright",bg:"white"},plan:{fg:"magentaBright",bg:"white"},todo:{fg:"greenBright",bg:"white"},status:{fg:"blueBright",bg:"blackBright"},approve:{fg:"yellowBright",bg:"white"},info:{fg:"yellowBright",bg:"white"}});themeRegistry.set("dim-dark",{label:"Dim Dark",colorMode:"dark",messageColors:DARK_MESSAGE_COLORS});themeRegistry.set("dim-light",{label:"Dim Light",colorMode:"light",messageColors:LIGHT_MESSAGE_COLORS});themeRegistry.set("monokai-dark",{label:"Monokai Dark",colorMode:"dark",messageColors:DARK_MESSAGE_COLORS});themeRegistry.set("monokai-light",{label:"Monokai Light",colorMode:"light",messageColors:LIGHT_MESSAGE_COLORS});var ThemeModes=Object.freeze({dark:DARK_MESSAGE_COLORS,light:LIGHT_MESSAGE_COLORS});function normalizeThemeId(raw){let v2=String(raw??"").trim().toLowerCase();if(themeRegistry.has(v2))return v2;if(v2==="light")return"dim-light";if(v2==="dark")return"dim-dark";if(v2)return v2;return"dim-dark"}function normalizeThemeMode(mode2){let v2=String(mode2??"").trim().toLowerCase();if(v2==="light"||v2==="monokai-light")return"light";if(v2==="dark"||v2==="monokai-dark")return"dark";let entry=themeRegistry.get(v2);if(entry)return entry.colorMode;if(v2==="goatchain"||v2==="dimcode"||v2==="mono"||v2==="contrast")return"dark";return"dark"}function detectSystemTheme(env3){try{let mm=globalThis?.matchMedia;if(typeof mm==="function")return mm("(prefers-color-scheme: dark)").matches?"dark":"light"}catch{}let procEnv=env3??globalThis?.process?.env??{},colorfgbg=String(procEnv.COLORFGBG??"").trim();if(colorfgbg){let parts=colorfgbg.split(/[;,]/).map((p2)=>p2.trim()).filter(Boolean),bgRaw=parts[parts.length-1],bg=Number.parseInt(bgRaw??"",10);if(Number.isFinite(bg))return bg>=7?"light":"dark"}return"dark"}function resolveInitialThemeId(env3){let pref=readPrefixedEnv2(env3,"THEME");if(pref)return normalizeThemeId(pref);return detectSystemTheme(env3)==="light"?"dim-light":"dim-dark"}function resolveShikiTheme(mode2){return(typeof mode2==="string"?normalizeThemeMode(mode2):"dark")==="light"?"github-light":"monokai"}function createApprovalsFlow(opts){let shouldAutoApproveActiveApproval=()=>{if(opts.isInSendQueueRun())return!1;let active=opts.state.approval.active;if(!active||active.status!=="pending")return!1;if(!shouldAutoApproveRequest(opts.state.approval.mode,active))return!1;if(opts.state.runningAgentRound)return!1;return!0};return watch(()=>opts.state.approval.mode,()=>{if(shouldAutoApproveActiveApproval())opts.resolveActiveApproval("approved")}),watch(()=>opts.state.runningAgentRound,(running)=>{if(running)return;if(shouldAutoApproveActiveApproval())opts.resolveActiveApproval("approved")}),{shouldAutoApproveActiveApproval}}function normalizeText13(value){return String(value??"").trim()}function isPlainObject11(value){return Boolean(value)&&typeof value==="object"&&!Array.isArray(value)}function resolveProviderAdapter(state,providerId){let customProvider=(Array.isArray(state.provider?.customProviders)?state.provider.customProviders.filter(isPlainObject11):[]).find((provider)=>normalizeText13(provider.id)===providerId),customAdapter=normalizeText13(customProvider?.adapter);if(customAdapter==="openai"||customAdapter==="openai-responses"||customAdapter==="gemini"||customAdapter==="anthropic")return customAdapter;let builtinAdapter=normalizeText13(getBuiltinProvider(providerId)?.adapter);if(builtinAdapter==="openai"||builtinAdapter==="openai-responses"||builtinAdapter==="gemini"||builtinAdapter==="anthropic")return builtinAdapter;if(providerId==="google")return"gemini";if(providerId==="anthropic")return"anthropic";return"openai"}function buildRuntimeConfigFromState(state){let input=state,env3=isPlainObject11(input.context?.env)?input.context.env:{},base=input.context?.runtimeConfig?{...input.context.runtimeConfig,env:{...env3}}:readCliRuntimeConfig(env3),providerId=normalizeText13(input.provider?.activeId),activeModel=normalizeText13(input.config?.model)||normalizeText13(input.provider?.activeModelByProvider?.[providerId])||base.modelId,connections=isPlainObject11(input.provider?.connections)?input.provider.connections:{},connection=isPlainObject11(connections[providerId])?connections[providerId]:void 0,customProviders=Array.isArray(input.provider?.customProviders)?input.provider.customProviders.filter(isPlainObject11):[],customProvider=customProviders.find((provider2)=>normalizeText13(provider2.id)===providerId),legacyCustomProvider=isPlainObject11(input.provider?.custom)?input.provider.custom:void 0,builtin=providerId&&!customProvider&&!isLegacyCustomProviderId(providerId)?getBuiltinProvider(providerId):void 0,adapter=providerId?resolveProviderAdapter(input,providerId):base.adapter,baseUrl=customProvider?normalizeText13(customProvider?.baseUrl)||base.baseUrl:isLegacyCustomProviderId(providerId)?normalizeText13(legacyCustomProvider?.baseUrl)||base.baseUrl:providerId==="dimcode-api-oauth"?normalizeText13(connection?.baseUrl)||base.baseUrl:builtin&&!isBuiltinProviderBaseUrlEditable(providerId)?normalizeText13(resolveBuiltinProviderBaseUrl(builtin)):normalizeText13(resolveBuiltinProviderBaseUrl(builtin,normalizeText13(connection?.baseUrl)||void 0))||base.baseUrl,apiKey=customProvider?normalizeText13(customProvider?.apiKey)||base.apiKey:isLegacyCustomProviderId(providerId)?normalizeText13(legacyCustomProvider?.apiKey)||base.apiKey:normalizeText13(connection?.apiKey)||base.apiKey,responsesAutoPromptCacheKey=customProvider?.responsesAutoPromptCacheKey===!0,responsesUseSessionId=customProvider?.responsesUseSessionId===!0,provider=providerId||base.provider||adapter,modelCapabilityFallbackModels=isCustomProviderId(providerId)||isLegacyCustomProviderId(providerId)||builtin?.customModels?listCustomProviderModelFallbackModels():void 0,modelCapabilities=resolveProviderModelCapabilities({providerId,modelId:activeModel||base.modelId,connectionModels:Array.isArray(connection?.models)?connection.models:void 0,builtinModels:builtin?.models,customProviderModels:Array.isArray(customProvider?.models)?customProvider.models:void 0,legacyCustomModels:Array.isArray(legacyCustomProvider?.models)?legacyCustomProvider.models:void 0,fallbackModels:modelCapabilityFallbackModels})??base.modelCapabilities,resolvedMaxInputTokens=resolveProviderSelectionContextWindow({providerId:providerId||void 0,modelId:activeModel||base.modelId,connections,customProviders}),resolvedMaxOutputTokens=resolveProviderSelectionMaxOutputTokens({providerId:providerId||void 0,modelId:activeModel||base.modelId,connections,customProviders}),maxInputTokens=resolvedMaxInputTokens??base.maxInputTokens,maxOutputTokens=resolvedMaxOutputTokens??base.maxOutputTokens;return{...base,modelId:activeModel||base.modelId,...adapter?{adapter}:{},...provider?{provider}:{},...baseUrl?{baseUrl}:{},...apiKey?{apiKey}:{},...providerId==="dimcode-api-oauth"||base.nextApiOAuth===!0?{nextApiOAuth:!0}:{},...responsesAutoPromptCacheKey||base.responsesAutoPromptCacheKey===!0?{responsesAutoPromptCacheKey:!0}:{},...responsesUseSessionId||base.responsesUseSessionId===!0?{responsesUseSessionId:!0}:{},...modelCapabilities?{modelCapabilities}:{},...typeof maxInputTokens==="number"?{maxInputTokens}:{},...typeof maxOutputTokens==="number"?{maxOutputTokens}:{},env:{...base.env??env3}}}function normalizeText14(value){return String(value??"").trim()}function buildToolApprovalModeFromState(state){let mode2=state.approval?.mode;if(mode2==="auto"||mode2==="normal"||mode2==="strict")return mode2;return"normal"}function buildMcpServersFromState(state){return toMcpServerConfigs(Array.isArray(state.mcp?.servers)?state.mcp.servers:[])}function buildSessionModeIdFromState(state,agent){return normalizeText14(agent?.getMode?.()??state.ui?.mode)==="plan"?"plan":"agent"}function buildSessionRuntimeOptionsFromState(state,agent){return{cwd:normalizeText14(state.context?.cwd)||process.cwd(),modeId:buildSessionModeIdFromState(state,agent),runtimeConfig:buildRuntimeConfigFromState(state),toolApprovalMode:buildToolApprovalModeFromState(state),mcpServers:buildMcpServersFromState(state)}}function normalizeNonNegativeInteger5(value){let numeric=Number(value);if(!Number.isFinite(numeric)||numeric<0)return null;return Math.floor(numeric)}function formatInteger(value){return Math.max(0,Math.floor(value)).toLocaleString("en-US")}function readCompactionMetrics(result){let count=normalizeNonNegativeInteger5(result.messageCount??result.run?.cursorAfter),event=result.event??{},run=result.run,tokensBefore=normalizeNonNegativeInteger5(event.tokensBefore??run?.estimatedInputTokensBefore),tokensAfter=normalizeNonNegativeInteger5(event.tokensAfter??run?.estimatedInputTokensAfter),thresholdTokens=normalizeNonNegativeInteger5(event.threshold??run?.thresholdTokens),plannedOutput=normalizeNonNegativeInteger5(run?.plannedOutput),contextWindow=normalizeNonNegativeInteger5(run?.contextWindow),runId=String(event.runId??"").trim()||void 0,requestId=String(event.requestId??"").trim()||void 0;return{count,tokensBefore,tokensAfter,thresholdTokens,plannedOutput,contextWindow,...runId?{runId}:{},...requestId?{requestId}:{}}}function syncLastRequestBudgetFromCompaction(state,result){let metrics=readCompactionMetrics(result);if(metrics.tokensAfter==null||metrics.thresholdTokens==null||metrics.plannedOutput==null||metrics.contextWindow==null||metrics.contextWindow<=0)return;let nextBudget=normalizeLastRequestBudget({runId:metrics.runId,requestId:metrics.requestId??`manual_compact_${Date.now().toString(36)}`,estimatedInputTokens:metrics.tokensAfter,thresholdTokens:metrics.thresholdTokens,plannedOutput:metrics.plannedOutput,contextWindow:metrics.contextWindow,usedAutoCompaction:!1,updatedAtMs:Date.now()});state.lastRequestBudget=nextBudget}function formatCompactSuccessMessage(result){let{count,tokensBefore,tokensAfter}=readCompactionMetrics(result),savedTokens=tokensBefore!=null&&tokensAfter!=null?Math.max(0,tokensBefore-tokensAfter):null;if(count!=null&&tokensBefore!=null&&tokensAfter!=null&&savedTokens!=null){if(tokensAfter<tokensBefore)return{tone:"success",message:t2("chatPage.toast.compactSuccessDetailWithTokens",{count:formatInteger(count),before:formatInteger(tokensBefore),after:formatInteger(tokensAfter),saved:formatInteger(savedTokens)})};return{tone:"warning",message:t2("chatPage.toast.compactSuccessDetailNotReduced",{count:formatInteger(count),before:formatInteger(tokensBefore),after:formatInteger(tokensAfter)})}}if(count!=null)return{tone:"success",message:t2("chatPage.toast.compactSuccessDetailCountOnly",{count:formatInteger(count)})};return{tone:"success",message:t2("chatPage.toast.compactSuccessDetailSummaryOnly")}}async function runManualCompaction(opts){let sessionId=String(opts.state.sessionId??"").trim();if(!sessionId)return{success:!1,message:"No active session",reason:"generic"};let triggerManualCompression=opts.agent.triggerManualCompression;if(typeof triggerManualCompression!=="function")return{success:!1,message:"Manual compression not supported",reason:"generic"};let result=await triggerManualCompression(sessionId,buildSessionRuntimeOptionsFromState(opts.state,opts.agent));if(result?.success){opts.applyTurnUsageSummary?.(result.usageSummary),syncLastRequestBudgetFromCompaction(opts.state,result);let formatted=formatCompactSuccessMessage(result);return{success:!0,message:formatted.message,tone:formatted.tone}}let errorCode=typeof result?.errorCode==="string"&&result.errorCode.trim()?result.errorCode.trim():void 0,firstLine=String(result?.error??"Compression failed").trim().split(/\r?\n/u).find((line)=>line.trim())?.trim()||"Compression failed",reason=errorCode==="compact_token_limit"||isLikelyTokenLimitError(firstLine)?"token_limit":"generic";return{success:!1,message:firstLine,tone:"danger",...errorCode?{errorCode}:{},reason}}function formatCompactNoticeText(result,opts){if(result.success){let successKey=result.tone==="warning"?"chatPage.toast.compactWarning":"chatPage.toast.compactSuccess";return{text:t2(successKey,{message:result.message}),tone:result.tone??"success"}}let failureKey=opts?.preferTokenLimitFailure&&result.reason==="token_limit"?"chatPage.toast.compactFailedTokenLimit":"chatPage.toast.compactFailed";return{text:t2(failureKey,{error:result.message}),tone:"danger"}}function createAutoCompactFallbackRunner(opts){function canAutoCompact(){return typeof opts.agent.triggerManualCompression==="function"&&String(opts.state.sessionId??"").trim().length>0}function removeMessage(messageId){let normalized=String(messageId??"").trim();if(!normalized)return;opts.flushPendingAssistantOutput?.(normalized);let idx=opts.state.messages.findIndex((m2)=>m2.id===normalized);if(idx>=0)opts.state.messages.splice(idx,1)}function pushCompactNotice(text){let modelId=String(opts.state.config?.model??"").trim()||void 0,messageId=`compact-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;return opts.pushMessage({id:messageId,role:"assistant",createdAtMs:Date.now(),parts:[{type:"status",text:""},{type:"markdown",markdown:text,_noticeTone:"success",_noticeKind:"compact"}],...modelId?{modelId}:{}}),messageId}function updateCompactNotice(messageId,text,tone){opts.updateAssistant(messageId,(message)=>({...message,parts:[{type:"status",text:""},{type:"markdown",markdown:text,_noticeTone:tone,_noticeKind:"compact"}]}))}async function runWithFallback(runOpts,allowAutoCompact=!0){let result=await opts.runAgentRound(runOpts);if(!allowAutoCompact||result.success||!result.error)return result;if(!canAutoCompact())return result;let errText=formatAgentErrorForUi(result.error);if(!isLikelyTokenLimitError(errText))return result;removeMessage(result.assistantId);let noticeId=pushCompactNotice(t2("chatPage.toast.compactingSession"));opts.state.isCompacting=!0;let compactResult;try{compactResult=await runManualCompaction({state:opts.state,agent:opts.agent,applyTurnUsageSummary:opts.applyTurnUsageSummary})}finally{opts.state.isCompacting=!1}let notice=formatCompactNoticeText(compactResult);if(updateCompactNotice(noticeId,notice.text,notice.tone),!compactResult.success)return{assistantId:noticeId,toolCalls:[],success:!1,error:Error(compactResult.message)};let retryOpts=runOpts?.baseMessages?{...runOpts,baseMessages:void 0}:runOpts;return await runWithFallback(retryOpts,!1)}return{runAgentRound:async(runOpts)=>await runWithFallback(runOpts)}}function createContextActions(state){function setFocusFiles(files){let ctx=state.context,next=(files??[]).map((f2)=>String(f2??"")).filter(Boolean);state.context={...ctx,focusFiles:next.length?next:void 0}}function setCwd(cwd){let ctx=state.context,next=String(cwd??"").trim()||".";state.context={...ctx,cwd:next}}function setEnvVar(key,value){let ctx=state.context,prevEnv={...ctx.env??{}},k=String(key??"").trim();if(!k)return;let v2=value==null?"":String(value);if(!v2)delete prevEnv[k];else prevEnv[k]=v2;if(state.context={...ctx,env:prevEnv},typeof process<"u"&&process?.env)if(v2)process.env[k]=v2;else delete process.env[k]}function setAgent(agentName){let v2=agentName==null?void 0:String(agentName);for(let key of prefixedEnvKeys2("AGENT"))setEnvVar(key,v2)}function setThemeMode(mode2){let next=normalizeThemeId(mode2);state.ui.theme.mode=next;for(let key of prefixedEnvKeys2("THEME"))setEnvVar(key,next)}return{setFocusFiles,setCwd,setEnvVar,setAgent,setThemeMode}}var workerThreads=null,worker=null,workerInitFailed=!1,seq=0,pendingById=new Map;function wantsWorker(){return!0}async function ensureWorker(){if(!wantsWorker())return null;if(worker)return worker;if(workerInitFailed)return null;let wt;try{wt=workerThreads??await import("node:worker_threads"),workerThreads=wt}catch{return workerInitFailed=!0,null}let src=`
|
|
1191
|
+
${errText}`}}})(),toolNameLower=String(found.call.name??"").trim().toLowerCase(),normalizedResult=toolNameLower==="read"?(()=>{let truncated=truncateReadToolOutput(String(result.output??""),{maxLines:10,ellipsisLine:"..."});return{...result,output:truncated.output,outputAnsi:void 0}})():result;if(profile){let ms=Date.now()-t0;if(ms>=(isOneShotEnabled()?5:40)){let argsKeys=(()=>{let a2=found.call.arguments;if(!a2||typeof a2!=="object"||Array.isArray(a2))return 0;try{return Object.keys(a2).length}catch{return 0}})(),outChars=String(normalizedResult.output??"").length,outAnsiChars=String(normalizedResult.outputAnsi??"").length;perfLog(`[TOOL_EXEC] ${ms}ms callId=${callId} tool=${toolNameLower||"tool"} argsKeys=${argsKeys} outChars=${outChars} outAnsiChars=${outAnsiChars}`)}}return traceLog({tag:"TOOL",message:"run.end",payload:{callId,tool:toolNameLower||"tool",status:normalizedResult.status,outChars:String(normalizedResult.output??"").length}}),opts.pushMessage({id:opts.id("m"),role:"tool",result:normalizedResult}),opts.attachToolResultPart(found.messageId,normalizedResult),normalizedResult}finally{opts.state.runningToolCallId=null;let uiState2=opts.state.ui;if(uiState2?.tool)uiState2.tool={callId:null,name:"",startedAtMs:0}}}return{ensureApproved,findToolCall,resolveActiveApproval,runToolCall}}var MessageRoles=["user","assistant","tool"];var AssistantContentPartTypes=["status","thinking","markdown","tool_call","tool_output","tool_result","approve","todo","plan","llm_meta","info"];var GoatChainMessageTypes=[...MessageRoles,...AssistantContentPartTypes];function makeBase(fg,bg){let out={};for(let t3 of GoatChainMessageTypes)out[t3]={fg,bg};return out}var themeRegistry=new Map,DARK_MESSAGE_COLORS=Object.freeze({...makeBase("#e5e5e5","#0d0d0d"),user:{fg:"#e5e5e5",bg:"#1a1a1a"},assistant:{fg:"#e5e5e5",bg:"#0d0d0d"},markdown:{fg:"#e5e5e5",bg:"#0d0d0d"},tool_call:{fg:"#ffd75f",bg:"#0d0d0d"},tool:{fg:"#e5e5e5",bg:"#0d0d0d"},tool_output:{fg:"#5fd7d7",bg:"#0d0d0d"},tool_result:{fg:"#e5e5e5",bg:"#0d0d0d"},thinking:{fg:"#5fd7d7",bg:"#0d0d0d"},plan:{fg:"#d75fd7",bg:"#0d0d0d"},todo:{fg:"#5fd75f",bg:"#0d0d0d"},status:{fg:"#8a8a8a",bg:"#1a1a1a"},approve:{fg:"#ffd75f",bg:"#0d0d0d"},info:{fg:"#ffd75f",bg:"#0d0d0d"}}),LIGHT_MESSAGE_COLORS=Object.freeze({...makeBase("#1a1a1a","#fbfaf6"),user:{fg:"#1a1a1a",bg:"#ececea"},assistant:{fg:"#1a1a1a",bg:"#fbfaf6"},markdown:{fg:"#1a1a1a",bg:"#fbfaf6"},tool_call:{fg:"#b07d00",bg:"#fbfaf6"},tool:{fg:"#1a1a1a",bg:"#fbfaf6"},tool_output:{fg:"#0e8a8a",bg:"#fbfaf6"},tool_result:{fg:"#1a1a1a",bg:"#fbfaf6"},thinking:{fg:"#0e8a8a",bg:"#fbfaf6"},plan:{fg:"#8b3fc4",bg:"#fbfaf6"},todo:{fg:"#07845b",bg:"#fbfaf6"},status:{fg:"#6a6a6a",bg:"#ececea"},approve:{fg:"#b07d00",bg:"#fbfaf6"},info:{fg:"#b07d00",bg:"#fbfaf6"}});themeRegistry.set("dim-dark",{label:"Dim Dark",colorMode:"dark",messageColors:DARK_MESSAGE_COLORS});themeRegistry.set("dim-light",{label:"Dim Light",colorMode:"light",messageColors:LIGHT_MESSAGE_COLORS});themeRegistry.set("monokai-dark",{label:"Monokai Dark",colorMode:"dark",messageColors:DARK_MESSAGE_COLORS});themeRegistry.set("monokai-light",{label:"Monokai Light",colorMode:"light",messageColors:LIGHT_MESSAGE_COLORS});var ThemeModes=Object.freeze({dark:DARK_MESSAGE_COLORS,light:LIGHT_MESSAGE_COLORS});function normalizeThemeId(raw){let v2=String(raw??"").trim().toLowerCase();if(themeRegistry.has(v2))return v2;if(v2==="light")return"dim-light";if(v2==="dark")return"dim-dark";if(v2)return v2;return"dim-dark"}function normalizeThemeMode(mode2){let v2=String(mode2??"").trim().toLowerCase();if(v2==="light"||v2==="monokai-light")return"light";if(v2==="dark"||v2==="monokai-dark")return"dark";let entry=themeRegistry.get(v2);if(entry)return entry.colorMode;if(v2==="goatchain"||v2==="dimcode"||v2==="mono"||v2==="contrast")return"dark";return"dark"}function detectSystemTheme(env3){try{let mm=globalThis?.matchMedia;if(typeof mm==="function")return mm("(prefers-color-scheme: dark)").matches?"dark":"light"}catch{}let procEnv=env3??globalThis?.process?.env??{},colorfgbg=String(procEnv.COLORFGBG??"").trim();if(colorfgbg){let parts=colorfgbg.split(/[;,]/).map((p2)=>p2.trim()).filter(Boolean),bgRaw=parts[parts.length-1],bg=Number.parseInt(bgRaw??"",10);if(Number.isFinite(bg))return bg>=7?"light":"dark"}return"dark"}function resolveInitialThemeId(env3,opts){let pref=readPrefixedEnv2(env3,"THEME");if(pref)return normalizeThemeId(pref);if(opts?.preferSystemDefault)return"system";return detectSystemTheme(env3)==="light"?"dim-light":"dim-dark"}function resolveShikiTheme(mode2){return(typeof mode2==="string"?normalizeThemeMode(mode2):"dark")==="light"?"github-light":"monokai"}function createApprovalsFlow(opts){let shouldAutoApproveActiveApproval=()=>{if(opts.isInSendQueueRun())return!1;let active=opts.state.approval.active;if(!active||active.status!=="pending")return!1;if(!shouldAutoApproveRequest(opts.state.approval.mode,active))return!1;if(opts.state.runningAgentRound)return!1;return!0};return watch(()=>opts.state.approval.mode,()=>{if(shouldAutoApproveActiveApproval())opts.resolveActiveApproval("approved")}),watch(()=>opts.state.runningAgentRound,(running)=>{if(running)return;if(shouldAutoApproveActiveApproval())opts.resolveActiveApproval("approved")}),{shouldAutoApproveActiveApproval}}function normalizeText13(value){return String(value??"").trim()}function isPlainObject11(value){return Boolean(value)&&typeof value==="object"&&!Array.isArray(value)}function resolveProviderAdapter(state,providerId){let customProvider=(Array.isArray(state.provider?.customProviders)?state.provider.customProviders.filter(isPlainObject11):[]).find((provider)=>normalizeText13(provider.id)===providerId),customAdapter=normalizeText13(customProvider?.adapter);if(customAdapter==="openai"||customAdapter==="openai-responses"||customAdapter==="gemini"||customAdapter==="anthropic")return customAdapter;let builtinAdapter=normalizeText13(getBuiltinProvider(providerId)?.adapter);if(builtinAdapter==="openai"||builtinAdapter==="openai-responses"||builtinAdapter==="gemini"||builtinAdapter==="anthropic")return builtinAdapter;if(providerId==="google")return"gemini";if(providerId==="anthropic")return"anthropic";return"openai"}function buildRuntimeConfigFromState(state){let input=state,env3=isPlainObject11(input.context?.env)?input.context.env:{},base=input.context?.runtimeConfig?{...input.context.runtimeConfig,env:{...env3}}:readCliRuntimeConfig(env3),providerId=normalizeText13(input.provider?.activeId),activeModel=normalizeText13(input.config?.model)||normalizeText13(input.provider?.activeModelByProvider?.[providerId])||base.modelId,connections=isPlainObject11(input.provider?.connections)?input.provider.connections:{},connection=isPlainObject11(connections[providerId])?connections[providerId]:void 0,customProviders=Array.isArray(input.provider?.customProviders)?input.provider.customProviders.filter(isPlainObject11):[],customProvider=customProviders.find((provider2)=>normalizeText13(provider2.id)===providerId),legacyCustomProvider=isPlainObject11(input.provider?.custom)?input.provider.custom:void 0,builtin=providerId&&!customProvider&&!isLegacyCustomProviderId(providerId)?getBuiltinProvider(providerId):void 0,adapter=providerId?resolveProviderAdapter(input,providerId):base.adapter,baseUrl=customProvider?normalizeText13(customProvider?.baseUrl)||base.baseUrl:isLegacyCustomProviderId(providerId)?normalizeText13(legacyCustomProvider?.baseUrl)||base.baseUrl:providerId==="dimcode-api-oauth"?normalizeText13(connection?.baseUrl)||base.baseUrl:builtin&&!isBuiltinProviderBaseUrlEditable(providerId)?normalizeText13(resolveBuiltinProviderBaseUrl(builtin)):normalizeText13(resolveBuiltinProviderBaseUrl(builtin,normalizeText13(connection?.baseUrl)||void 0))||base.baseUrl,apiKey=customProvider?normalizeText13(customProvider?.apiKey)||base.apiKey:isLegacyCustomProviderId(providerId)?normalizeText13(legacyCustomProvider?.apiKey)||base.apiKey:normalizeText13(connection?.apiKey)||base.apiKey,responsesAutoPromptCacheKey=customProvider?.responsesAutoPromptCacheKey===!0,responsesUseSessionId=customProvider?.responsesUseSessionId===!0,provider=providerId||base.provider||adapter,modelCapabilityFallbackModels=isCustomProviderId(providerId)||isLegacyCustomProviderId(providerId)||builtin?.customModels?listCustomProviderModelFallbackModels():void 0,modelCapabilities=resolveProviderModelCapabilities({providerId,modelId:activeModel||base.modelId,connectionModels:Array.isArray(connection?.models)?connection.models:void 0,builtinModels:builtin?.models,customProviderModels:Array.isArray(customProvider?.models)?customProvider.models:void 0,legacyCustomModels:Array.isArray(legacyCustomProvider?.models)?legacyCustomProvider.models:void 0,fallbackModels:modelCapabilityFallbackModels})??base.modelCapabilities,resolvedMaxInputTokens=resolveProviderSelectionContextWindow({providerId:providerId||void 0,modelId:activeModel||base.modelId,connections,customProviders}),resolvedMaxOutputTokens=resolveProviderSelectionMaxOutputTokens({providerId:providerId||void 0,modelId:activeModel||base.modelId,connections,customProviders}),maxInputTokens=resolvedMaxInputTokens??base.maxInputTokens,maxOutputTokens=resolvedMaxOutputTokens??base.maxOutputTokens;return{...base,modelId:activeModel||base.modelId,...adapter?{adapter}:{},...provider?{provider}:{},...baseUrl?{baseUrl}:{},...apiKey?{apiKey}:{},...providerId==="dimcode-api-oauth"||base.nextApiOAuth===!0?{nextApiOAuth:!0}:{},...responsesAutoPromptCacheKey||base.responsesAutoPromptCacheKey===!0?{responsesAutoPromptCacheKey:!0}:{},...responsesUseSessionId||base.responsesUseSessionId===!0?{responsesUseSessionId:!0}:{},...modelCapabilities?{modelCapabilities}:{},...typeof maxInputTokens==="number"?{maxInputTokens}:{},...typeof maxOutputTokens==="number"?{maxOutputTokens}:{},env:{...base.env??env3}}}function normalizeText14(value){return String(value??"").trim()}function buildToolApprovalModeFromState(state){let mode2=state.approval?.mode;if(mode2==="auto"||mode2==="normal"||mode2==="strict")return mode2;return"normal"}function buildMcpServersFromState(state){return toMcpServerConfigs(Array.isArray(state.mcp?.servers)?state.mcp.servers:[])}function buildSessionModeIdFromState(state,agent){return normalizeText14(agent?.getMode?.()??state.ui?.mode)==="plan"?"plan":"agent"}function buildSessionRuntimeOptionsFromState(state,agent){return{cwd:normalizeText14(state.context?.cwd)||process.cwd(),modeId:buildSessionModeIdFromState(state,agent),runtimeConfig:buildRuntimeConfigFromState(state),toolApprovalMode:buildToolApprovalModeFromState(state),mcpServers:buildMcpServersFromState(state)}}function normalizeNonNegativeInteger5(value){let numeric=Number(value);if(!Number.isFinite(numeric)||numeric<0)return null;return Math.floor(numeric)}function formatInteger(value){return Math.max(0,Math.floor(value)).toLocaleString("en-US")}function readCompactionMetrics(result){let count=normalizeNonNegativeInteger5(result.messageCount??result.run?.cursorAfter),event=result.event??{},run=result.run,tokensBefore=normalizeNonNegativeInteger5(event.tokensBefore??run?.estimatedInputTokensBefore),tokensAfter=normalizeNonNegativeInteger5(event.tokensAfter??run?.estimatedInputTokensAfter),thresholdTokens=normalizeNonNegativeInteger5(event.threshold??run?.thresholdTokens),plannedOutput=normalizeNonNegativeInteger5(run?.plannedOutput),contextWindow=normalizeNonNegativeInteger5(run?.contextWindow),runId=String(event.runId??"").trim()||void 0,requestId=String(event.requestId??"").trim()||void 0;return{count,tokensBefore,tokensAfter,thresholdTokens,plannedOutput,contextWindow,...runId?{runId}:{},...requestId?{requestId}:{}}}function syncLastRequestBudgetFromCompaction(state,result){let metrics=readCompactionMetrics(result);if(metrics.tokensAfter==null||metrics.thresholdTokens==null||metrics.plannedOutput==null||metrics.contextWindow==null||metrics.contextWindow<=0)return;let nextBudget=normalizeLastRequestBudget({runId:metrics.runId,requestId:metrics.requestId??`manual_compact_${Date.now().toString(36)}`,estimatedInputTokens:metrics.tokensAfter,thresholdTokens:metrics.thresholdTokens,plannedOutput:metrics.plannedOutput,contextWindow:metrics.contextWindow,usedAutoCompaction:!1,updatedAtMs:Date.now()});state.lastRequestBudget=nextBudget}function formatCompactSuccessMessage(result){let{count,tokensBefore,tokensAfter}=readCompactionMetrics(result),savedTokens=tokensBefore!=null&&tokensAfter!=null?Math.max(0,tokensBefore-tokensAfter):null;if(count!=null&&tokensBefore!=null&&tokensAfter!=null&&savedTokens!=null){if(tokensAfter<tokensBefore)return{tone:"success",message:t2("chatPage.toast.compactSuccessDetailWithTokens",{count:formatInteger(count),before:formatInteger(tokensBefore),after:formatInteger(tokensAfter),saved:formatInteger(savedTokens)})};return{tone:"warning",message:t2("chatPage.toast.compactSuccessDetailNotReduced",{count:formatInteger(count),before:formatInteger(tokensBefore),after:formatInteger(tokensAfter)})}}if(count!=null)return{tone:"success",message:t2("chatPage.toast.compactSuccessDetailCountOnly",{count:formatInteger(count)})};return{tone:"success",message:t2("chatPage.toast.compactSuccessDetailSummaryOnly")}}async function runManualCompaction(opts){let sessionId=String(opts.state.sessionId??"").trim();if(!sessionId)return{success:!1,message:"No active session",reason:"generic"};let triggerManualCompression=opts.agent.triggerManualCompression;if(typeof triggerManualCompression!=="function")return{success:!1,message:"Manual compression not supported",reason:"generic"};let result=await triggerManualCompression(sessionId,buildSessionRuntimeOptionsFromState(opts.state,opts.agent));if(result?.success){opts.applyTurnUsageSummary?.(result.usageSummary),syncLastRequestBudgetFromCompaction(opts.state,result);let formatted=formatCompactSuccessMessage(result);return{success:!0,message:formatted.message,tone:formatted.tone}}let errorCode=typeof result?.errorCode==="string"&&result.errorCode.trim()?result.errorCode.trim():void 0,firstLine=String(result?.error??"Compression failed").trim().split(/\r?\n/u).find((line)=>line.trim())?.trim()||"Compression failed",reason=errorCode==="compact_token_limit"||isLikelyTokenLimitError(firstLine)?"token_limit":"generic";return{success:!1,message:firstLine,tone:"danger",...errorCode?{errorCode}:{},reason}}function formatCompactNoticeText(result,opts){if(result.success){let successKey=result.tone==="warning"?"chatPage.toast.compactWarning":"chatPage.toast.compactSuccess";return{text:t2(successKey,{message:result.message}),tone:result.tone??"success"}}let failureKey=opts?.preferTokenLimitFailure&&result.reason==="token_limit"?"chatPage.toast.compactFailedTokenLimit":"chatPage.toast.compactFailed";return{text:t2(failureKey,{error:result.message}),tone:"danger"}}function createAutoCompactFallbackRunner(opts){function canAutoCompact(){return typeof opts.agent.triggerManualCompression==="function"&&String(opts.state.sessionId??"").trim().length>0}function removeMessage(messageId){let normalized=String(messageId??"").trim();if(!normalized)return;opts.flushPendingAssistantOutput?.(normalized);let idx=opts.state.messages.findIndex((m2)=>m2.id===normalized);if(idx>=0)opts.state.messages.splice(idx,1)}function pushCompactNotice(text){let modelId=String(opts.state.config?.model??"").trim()||void 0,messageId=`compact-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;return opts.pushMessage({id:messageId,role:"assistant",createdAtMs:Date.now(),parts:[{type:"status",text:""},{type:"markdown",markdown:text,_noticeTone:"success",_noticeKind:"compact"}],...modelId?{modelId}:{}}),messageId}function updateCompactNotice(messageId,text,tone){opts.updateAssistant(messageId,(message)=>({...message,parts:[{type:"status",text:""},{type:"markdown",markdown:text,_noticeTone:tone,_noticeKind:"compact"}]}))}async function runWithFallback(runOpts,allowAutoCompact=!0){let result=await opts.runAgentRound(runOpts);if(!allowAutoCompact||result.success||!result.error)return result;if(!canAutoCompact())return result;let errText=formatAgentErrorForUi(result.error);if(!isLikelyTokenLimitError(errText))return result;removeMessage(result.assistantId);let noticeId=pushCompactNotice(t2("chatPage.toast.compactingSession"));opts.state.isCompacting=!0;let compactResult;try{compactResult=await runManualCompaction({state:opts.state,agent:opts.agent,applyTurnUsageSummary:opts.applyTurnUsageSummary})}finally{opts.state.isCompacting=!1}let notice=formatCompactNoticeText(compactResult);if(updateCompactNotice(noticeId,notice.text,notice.tone),!compactResult.success)return{assistantId:noticeId,toolCalls:[],success:!1,error:Error(compactResult.message)};let retryOpts=runOpts?.baseMessages?{...runOpts,baseMessages:void 0}:runOpts;return await runWithFallback(retryOpts,!1)}return{runAgentRound:async(runOpts)=>await runWithFallback(runOpts)}}function createContextActions(state){function setFocusFiles(files){let ctx=state.context,next=(files??[]).map((f2)=>String(f2??"")).filter(Boolean);state.context={...ctx,focusFiles:next.length?next:void 0}}function setCwd(cwd){let ctx=state.context,next=String(cwd??"").trim()||".";state.context={...ctx,cwd:next}}function setEnvVar(key,value){let ctx=state.context,prevEnv={...ctx.env??{}},k=String(key??"").trim();if(!k)return;let v2=value==null?"":String(value);if(!v2)delete prevEnv[k];else prevEnv[k]=v2;if(state.context={...ctx,env:prevEnv},typeof process<"u"&&process?.env)if(v2)process.env[k]=v2;else delete process.env[k]}function setAgent(agentName){let v2=agentName==null?void 0:String(agentName);for(let key of prefixedEnvKeys2("AGENT"))setEnvVar(key,v2)}function setThemeMode(mode2){let next=normalizeThemeId(mode2);state.ui.theme.mode=next;for(let key of prefixedEnvKeys2("THEME"))setEnvVar(key,next)}return{setFocusFiles,setCwd,setEnvVar,setAgent,setThemeMode}}var workerThreads=null,worker=null,workerInitFailed=!1,seq=0,pendingById=new Map;function wantsWorker(){return!0}async function ensureWorker(){if(!wantsWorker())return null;if(worker)return worker;if(workerInitFailed)return null;let wt;try{wt=workerThreads??await import("node:worker_threads"),workerThreads=wt}catch{return workerInitFailed=!0,null}let src=`
|
|
1192
1192
|
const { parentPort } = require('node:worker_threads');
|
|
1193
1193
|
let shikiModP = null;
|
|
1194
1194
|
async function getCodeToTokensBase() {
|
|
@@ -1242,7 +1242,7 @@ ${errText}`}}})(),toolNameLower=String(found.call.name??"").trim().toLowerCase()
|
|
|
1242
1242
|
`),output=normalizeText15(outputRecord?.output)||normalizeText15(textFromContent2)||serializeToolOutputValue(event.output);return{id:event.toolCallId,output,status:event.isError?"error":"success",...structuredContent?{structuredContent}:{}}}function isTodoToolName(toolName){return toolName==="todowrite"}function isPlanToolName(toolName){return toolName==="todoplan"||toolName==="plan_mode_todoplan"}function isInlinePlanMarkdownToolName2(toolName){return isPlanToolName(toolName)}function wrapInlinePlanMarkdown2(markdown){let body=String(markdown??"").replace(/\r/g,"").trim();if(!body)return"";return`${PROPOSED_PLAN_OPEN_TAG2}
|
|
1243
1243
|
${body}
|
|
1244
1244
|
${PROPOSED_PLAN_CLOSE_TAG2}`}function normalizeInlineMarkdownPreviewPath(value){if(typeof value!=="string")return null;let candidate=normalizeText15(value);if(!candidate||candidate.includes(`
|
|
1245
|
-
`)||candidate.includes("\x00"))return null;if(!path41.isAbsolute(candidate))return null;if(path41.extname(candidate).toLowerCase()!==".md")return null;return path41.normalize(candidate)}function extractInlinePlanMarkdownPath(event,result){let outputRecord=isPlainObject13(event.output)?event.output:void 0,structuredContent=isPlainObject13(outputRecord?.structuredContent)?outputRecord.structuredContent:void 0,candidates=[outputRecord?.markdownPath,outputRecord?.markdown_path,outputRecord?.filePath,outputRecord?.file_path,outputRecord?.path,structuredContent?.markdownPath,structuredContent?.markdown_path,structuredContent?.filePath,structuredContent?.file_path,structuredContent?.path,result.output,...extractTextParts(outputRecord?.content)];for(let candidate of candidates){let normalized=normalizeInlineMarkdownPreviewPath(candidate);if(normalized)return normalized}return null}async function readInlinePlanMarkdown(filePath){let normalizedPath=normalizeInlineMarkdownPreviewPath(filePath);if(!normalizedPath)return null;try{let fileInfo=await stat8(normalizedPath);if(!fileInfo.isFile()||fileInfo.size<=0||fileInfo.size>maxInlinePlanMarkdownBytes)return null;let markdown=await readFile12(normalizedPath,"utf-8");return markdown.trim()?markdown:null}catch{return null}}function assistantHasMarkdownContent2(messages,assistantId){let assistant=messages.find((message)=>message?.id===assistantId&&message.role==="assistant");if(!assistant)return!1;return assistant.parts.some((part)=>{if(part.type!=="markdown")return!1;return normalizeText15(part.markdown).length>0})}function isAbortLikeError(error48){let text=error48 instanceof Error?`${error48.name} ${error48.message}`:String(error48);return/\babort|cancel/i.test(text)}function asToolApprovalRequiredEvent(event){return event}function asAskUserRequiredEvent(event){return event}function normalizeAskUserQuestions(raw){return parseAskUserQuestions(raw).map((question)=>({question:normalizeText15(question.question),header:normalizeText15(question.header),options:Array.isArray(question.options)?question.options.map((option)=>({label:normalizeText15(option.label),description:normalizeText15(option.description)})):[],...question.multiSelect?{multiSelect:!0}:{}}))}function createNativeStreamRunner(opts){let activeAbortController=null,activeRunPromise=null,pendingAction=null,resetActiveRun=()=>{activeAbortController=null,activeRunPromise=null},clearPendingAction=()=>{pendingAction=null},cancelActiveAgentStream=()=>{activeAbortController?.abort("cancelled")},cancelActiveAgentStreamAndWaitWithTimeout=async(timeoutMs=200)=>{let waitPromise=activeRunPromise;if(activeAbortController?.abort("cancelled"),!waitPromise)return;let timeout=Math.max(0,Math.floor(timeoutMs));await Promise.race([waitPromise.catch(()=>{}),new Promise((resolve2)=>{setTimeout(resolve2,timeout)?.unref?.()})])},abortActiveAgentRound=()=>{activeAbortController?.abort("aborted")},clearThinkingState=()=>{opts.state.thinking.active=!1,opts.state.thinking.assistantId=null,opts.state.thinking.blockIndex=null},buildResumeInput=(toolContext)=>{let current=pendingAction;if(!current)return null;if(current.kind==="tool_approval"){let decisions=toolContext?.approval?.decisions??{},decision=current.toolCallId?decisions[current.toolCallId]:Object.values(decisions)[0];if(!decision)throw Error(`Missing approval decision for ${current.toolCallId??current.actionId}`);return{kind:"tool_approval",actionId:current.actionId,...current.toolCallId?{toolCallId:current.toolCallId}:{},approved:decision.approved,...decision.reason?{reason:decision.reason}:{},...toolContext?.approval?.alwaysAllowForConversation?{alwaysAllowForConversation:!0}:{}}}let answersByToolCall=toolContext?.askUser?.answers??{},rejectedByToolCall=toolContext?.askUser?.rejected??{},answers=current.toolCallId?answersByToolCall[current.toolCallId]:Object.values(answersByToolCall)[0];if(!answers&¤t.toolCallId&&rejectedByToolCall[current.toolCallId])console.warn("[dimcode] ask_user rejection is not supported by the native runtime; resuming with empty answers.");return{kind:"ask_user",actionId:current.actionId,...current.toolCallId?{toolCallId:current.toolCallId}:{},answers:{...answers??{}}}};return{async runAgentRound(runOpts){let toolCalls=[],baseMessages=runOpts?.baseMessages??opts.state.messages,resumeInput=buildResumeInput(runOpts?.toolContext),assistantId=resumeInput?pendingAction?.assistantId??opts.id("m"):opts.id("m");if(!resumeInput){clearThinkingState();let modelId=String(opts.state.config?.model??"").trim()||void 0;opts.pushMessage({id:assistantId,role:"assistant",parts:[{type:"status",text:""}],createdAtMs:Date.now(),...modelId?{modelId}:{}})}let latestUserMessage=resumeInput?null:[...baseMessages].reverse().find((message)=>message?.role==="user")??null;if(!resumeInput&&!latestUserMessage)return{assistantId,toolCalls,success:!1,error:Error("No user message found for native agent run")};let sessionId=normalizeText15(opts.state.sessionId),openSession=opts.agent.openSession,ensureSession=opts.agent.ensureSession,runtimeOptions=buildSessionRuntimeOptionsFromState(opts.state,opts.agent),session=resumeInput?typeof openSession==="function"?await openSession(sessionId):null:typeof ensureSession==="function"?await ensureSession({sessionId:sessionId||void 0,...runtimeOptions}):null;if(!session)return{assistantId,toolCalls,success:!1,error:Error("Native runtime session bridge is unavailable")};if(normalizeText15(opts.state.sessionId)!==session.id)opts.state.sessionId=session.id;let currentPendingAction=pendingAction;if(resumeInput)clearPendingAction();opts.state.runningAgentRound=!0,activeAbortController=new AbortController;let stream=resumeInput?session.resume(resumeInput,{signal:activeAbortController.signal}):session.run({content:await buildUserTurnContent(latestUserMessage,opts.state),metadata:{...runOpts?.steer?{steer:!0}:{}}},{signal:activeAbortController.signal}),sawAssistantDelta=!1,sawToolOutput=!1,toolCallStarted=new Set,toolOutputStarted=new Set,runtimeToLocalThinkingIndex=new Map,thinkingContentByLocalIndex=new Map,nextLocalThinkingIndex=getThinkingBlockCount(opts.state.messages,assistantId),activeRuntimeThinkingBlockIndex=null,activeLocalThinkingIndex=null,lastCreatedLocalThinkingIndex=nextLocalThinkingIndex>0?nextLocalThinkingIndex-1:null,roundError=null,pendingInlinePlanMarkdownPath=null,subagentSpinnerTimers=new Map,clearSubagentSpinner=(subagentId)=>{if(subagentId){let timer=subagentSpinnerTimers.get(subagentId);if(timer)clearInterval(timer),subagentSpinnerTimers.delete(subagentId)}else{for(let timer of subagentSpinnerTimers.values())clearInterval(timer);subagentSpinnerTimers.clear()}},removeDelegationPlaceholderMarkdown=()=>{opts.flushPendingAssistantOutput?.(assistantId),opts.updateAssistant(assistantId,(message)=>{let nextParts=message.parts.filter((part)=>{if(part.type!=="markdown")return!0;return!isDelegationRecordedFinalMessage(part.markdown)});if(nextParts.length===message.parts.length)return message;return{...message,parts:nextParts}})},startLocalThinkingBlock=(runtimeBlockIndex)=>{let localThinkingIndex=nextLocalThinkingIndex;nextLocalThinkingIndex+=1,opts.startNewThinkingBlock(assistantId);let normalizedRuntimeBlockIndex=normalizeThinkingBlockIndex(runtimeBlockIndex);if(normalizedRuntimeBlockIndex!=null)runtimeToLocalThinkingIndex.set(normalizedRuntimeBlockIndex,localThinkingIndex);return thinkingContentByLocalIndex.set(localThinkingIndex,""),activeRuntimeThinkingBlockIndex=normalizedRuntimeBlockIndex,activeLocalThinkingIndex=localThinkingIndex,lastCreatedLocalThinkingIndex=localThinkingIndex,localThinkingIndex},resolveLocalThinkingIndex=(runtimeBlockIndex)=>{let normalizedRuntimeBlockIndex=normalizeThinkingBlockIndex(runtimeBlockIndex);if(normalizedRuntimeBlockIndex!=null){let mapped=runtimeToLocalThinkingIndex.get(normalizedRuntimeBlockIndex);if(typeof mapped==="number")return mapped}if(activeLocalThinkingIndex!=null){if(normalizedRuntimeBlockIndex!=null)runtimeToLocalThinkingIndex.set(normalizedRuntimeBlockIndex,activeLocalThinkingIndex);return activeLocalThinkingIndex}if(lastCreatedLocalThinkingIndex!=null){if(normalizedRuntimeBlockIndex!=null)runtimeToLocalThinkingIndex.set(normalizedRuntimeBlockIndex,lastCreatedLocalThinkingIndex);return lastCreatedLocalThinkingIndex}return null},ensureLocalThinkingIndex=(runtimeBlockIndex)=>{return resolveLocalThinkingIndex(runtimeBlockIndex)??startLocalThinkingBlock(runtimeBlockIndex)},readThinkingContent=(localThinkingIndex)=>{if(thinkingContentByLocalIndex.has(localThinkingIndex))return thinkingContentByLocalIndex.get(localThinkingIndex)??"";let content=getThinkingBlockContent(opts.state.messages,assistantId,localThinkingIndex);return thinkingContentByLocalIndex.set(localThinkingIndex,content),content},setThinkingContent=(localThinkingIndex,content)=>{thinkingContentByLocalIndex.set(localThinkingIndex,content)},clearActiveLocalThinking=()=>{activeRuntimeThinkingBlockIndex=null,activeLocalThinkingIndex=null};if(activeRunPromise=(async()=>{try{for await(let event of stream){if(await yieldToNative(),event.type==="thinking.started"){startLocalThinkingBlock(event.blockIndex),opts.state.thinking.active=!0,opts.state.thinking.assistantId=assistantId,opts.state.thinking.blockIndex=event.blockIndex;continue}if(event.type==="thinking.delta"){let localThinkingIndex=ensureLocalThinkingIndex(event.blockIndex),nextThinking=`${readThinkingContent(localThinkingIndex)}${event.delta}`;setThinkingContent(localThinkingIndex,nextThinking),opts.setAssistantThinking(assistantId,nextThinking,localThinkingIndex),activeRuntimeThinkingBlockIndex=normalizeThinkingBlockIndex(event.blockIndex),activeLocalThinkingIndex=localThinkingIndex,opts.state.thinking.active=!0,opts.state.thinking.assistantId=assistantId,opts.state.thinking.blockIndex=event.blockIndex;continue}if(event.type==="thinking.finished"){let localThinkingIndex=ensureLocalThinkingIndex(event.blockIndex);if(typeof event.content==="string")setThinkingContent(localThinkingIndex,event.content),opts.setAssistantThinking(assistantId,event.content,localThinkingIndex);if(opts.endThinkingBlock(assistantId,localThinkingIndex,typeof event.content==="string"?event.content:readThinkingContent(localThinkingIndex)),activeLocalThinkingIndex===localThinkingIndex||activeRuntimeThinkingBlockIndex===normalizeThinkingBlockIndex(event.blockIndex))clearActiveLocalThinking();clearThinkingState();continue}if(event.type==="assistant.delta"){if(isDelegationRecordedFinalMessage(event.delta))continue;sawAssistantDelta=!0,opts.appendAssistantMarkdown(assistantId,event.delta);continue}if(event.type==="assistant.message"){if(typeof event.message.thinking==="string"){let thinking=event.message.thinking;if(!opts.state.messages.some((message)=>message?.id===assistantId&&message.role==="assistant"&&message.parts.some((part)=>part.type==="thinking"))&&thinking){let localThinkingIndex=startLocalThinkingBlock();setThinkingContent(localThinkingIndex,thinking),opts.setAssistantThinking(assistantId,thinking,localThinkingIndex),opts.endThinkingBlock(assistantId,localThinkingIndex,thinking),clearActiveLocalThinking()}}let content=extractTextContent2(event.message.content);if(content&&!sawAssistantDelta&&!isDelegationRecordedFinalMessage(content))opts.appendAssistantMarkdown(assistantId,content);continue}if(event.type==="tool.started"){let args=isPlainObject13(event.input)?event.input:{};if(toolCalls.push({id:event.toolCallId,name:event.toolName,arguments:args}),!toolCallStarted.has(event.toolCallId))toolCallStarted.add(event.toolCallId),opts.upsertToolCallDelta(assistantId,event.toolCallId,event.toolName,"",void 0);opts.upsertToolCallEnd(assistantId,event.toolCallId,event.toolName,args);continue}if(event.type==="tool.delta"){if(event.kind==="input"){opts.upsertToolCallDelta(assistantId,event.toolCallId,event.toolName,event.delta,event.linesWritten);continue}let toolName=normalizeText15(event.toolName)||event.toolCallId;if(!toolOutputStarted.has(event.toolCallId))toolOutputStarted.add(event.toolCallId),opts.upsertToolOutputStart(assistantId,event.toolCallId,toolName);opts.appendToolOutputDelta(assistantId,event.toolCallId,toolName,event.delta),sawToolOutput=!0;continue}if(event.type==="tool.finished"){let result=buildToolResult(event);opts.attachToolResultPart(assistantId,result),opts.scheduleToolResultHighlight(assistantId,result);let toolNameLower=normalizeText15(event.toolName).toLowerCase();if(result.structuredContent){if(isTodoToolName(toolNameLower))opts.upsertChecklistPartFromDimSdk(assistantId,"todo",event.toolCallId,result.structuredContent);else if(isPlanToolName(toolNameLower))opts.upsertChecklistPartFromDimSdk(assistantId,"plan",event.toolCallId,result.structuredContent)}if(isInlinePlanMarkdownToolName2(toolNameLower))pendingInlinePlanMarkdownPath=extractInlinePlanMarkdownPath(event,result);continue}if(event.type==="action.required"&&event.kind==="tool_approval"){let approvalEvent=asToolApprovalRequiredEvent(event),request=buildApprovalRequest(approvalEvent);if(pendingAction={kind:"tool_approval",actionId:approvalEvent.actionId,toolCallId:request.toolCallId,toolName:approvalEvent.toolName,assistantId},!opts.state.approval.active)opts.state.approval.active=request,opts.state.approval.pendingAutoRun={assistantId,toolCallId:request.toolCallId};else if(opts.state.approval.active.toolCallId!==request.toolCallId)opts.state.approval.queue.push({request,assistantId});opts.state.paused={kind:"tool_approval",toolCallId:request.toolCallId,actionId:approvalEvent.actionId},opts.insertApprovalPart(assistantId,request),opts.setAssistantStatus(assistantId,t2("chatStatus.awaitingApproval")),opts.state.runningAgentRound=!1;continue}if(event.type==="action.required"&&event.kind==="ask_user"){let askUserEvent=asAskUserRequiredEvent(event),toolCallId=normalizeText15(askUserEvent.toolCallId);if(!toolCallId)throw Error("Protocol error: ask_user action.required is missing toolCallId");let normalizedQuestions=normalizeAskUserQuestions(askUserEvent.questions),nextPending={kind:"ask_user",actionId:askUserEvent.actionId,toolCallId,toolName:askUserEvent.toolName,questions:normalizedQuestions,assistantId};pendingAction=nextPending;let autoResolveInvalid=normalizedQuestions.length===0;if(opts.state.paused={kind:"ask_user",...nextPending.toolCallId?{toolCallId:nextPending.toolCallId}:{},actionId:askUserEvent.actionId,...nextPending.questions?.length?{questions:[...nextPending.questions]}:{},...typeof askUserEvent.error<"u"?{error:askUserEvent.error}:{},...autoResolveInvalid?{autoResolve:!0}:{}},autoResolveInvalid)opts.appendInfoPart(assistantId,"AskUserQuestion was invoked without valid questions/options; auto-resuming so the model can retry."),opts.setAssistantStatus(assistantId,"");else opts.setAssistantStatus(assistantId,t2("chatStatus.awaitingAnswers"));opts.state.runningAgentRound=!1;continue}if(event.type==="steer_injected"){let steerContent=String(event.content??"");if(steerContent){let currentAssistantIdx=opts.state.messages.findIndex((m2)=>m2.id===assistantId&&m2.role==="assistant"),currentAssistant=currentAssistantIdx>=0?opts.state.messages[currentAssistantIdx]:null,userMsg={id:opts.id("m"),role:"user",content:steerContent,createdAtMs:Date.now(),metadata:{originalEventType:"steer_injected",steer:!0,...typeof event.count==="number"?{steerCount:event.count}:{}}};if(currentAssistant&¤tAssistantIdx>=0)if(currentAssistant.parts.some((p2)=>p2.type!=="status"||String(p2.text??"").trim())){let historicalAssistant={...currentAssistant,id:opts.id("m"),parts:[...currentAssistant.parts]},modelId=currentAssistant.modelId,continuedAssistant={id:assistantId,role:"assistant",parts:[{type:"status",text:""}],createdAtMs:Date.now(),...modelId?{modelId}:{}};opts.state.messages.splice(currentAssistantIdx,1,historicalAssistant,userMsg,continuedAssistant)}else opts.state.messages.splice(currentAssistantIdx,0,userMsg);else opts.pushMessage(userMsg);sawAssistantDelta=!1}continue}if(event.type==="subagent.started"){debugLogSubagent("cli.subagent.started",{assistantId,subagentId:event.subagentId,taskDescription:event.taskDescription,subagentType:event.subagentType,ts:Date.now()}),removeDelegationPlaceholderMarkdown();let desc=normalizeText15(event.taskDescription)||normalizeText15(event.subagentId);if(desc)opts.upsertSubagentInfo(assistantId,event.subagentId,"header",desc);clearSubagentSpinner(event.subagentId);let timer=setInterval(()=>{yieldToNative().then(()=>{opts.tickSubagentFrame(assistantId)})},150);subagentSpinnerTimers.set(event.subagentId,timer);continue}if(event.type==="subagent.output"){if(debugLogSubagent("cli.subagent.output",{assistantId,subagentId:event.subagentId,stream:event.stream,deltaLen:event.delta?.length,deltaPreview:String(event.delta??"").slice(0,120),ts:Date.now()}),event.stream==="tool"){let toolNameMatch=/^(\S+)\s+\{/.exec(event.delta);if(toolNameMatch){let label=toolNameMatch[1];try{let jsonStr=event.delta.slice(toolNameMatch[1].length).trim(),args=JSON.parse(jsonStr),summary=args.file_path??args.path??args.pattern??formatExecInvocationPreview(args)??args.query??args.file??args.url;if(typeof summary==="string"){let short=summary.length>60?`…${summary.slice(-57)}`:summary;label=`${label} ${short}`}}catch{}debugLogSubagent("cli.subagent.output.upsert_activity",{subagentId:event.subagentId,label,ts:Date.now()}),opts.upsertSubagentInfo(assistantId,event.subagentId,"activity",label)}}continue}if(event.type==="subagent.finished"){debugLogSubagent("cli.subagent.finished",{assistantId,subagentId:event.subagentId,state:event.state,taskDescription:event.taskDescription,stats:event.stats,ts:Date.now()}),clearSubagentSpinner(event.subagentId);let stateLabel=event.state==="completed"?"done":event.state;opts.upsertSubagentInfo(assistantId,event.subagentId,"finished",stateLabel);continue}if(event.type==="subagent.integrated"){debugLogSubagent("cli.subagent.integrated",{assistantId,subagentId:event.subagentId,state:event.state,taskDescription:event.taskDescription,stats:event.stats,timing:event.timing,ts:Date.now()}),opts.upsertSubagentInfo(assistantId,event.subagentId,"integrated","integrated");continue}if(event.type==="run.budget"){let nextBudget=normalizeLastRequestBudget({runId:event.runId,requestId:event.requestId,estimatedInputTokens:event.estimatedInputTokens,thresholdTokens:event.thresholdTokens,plannedOutput:event.plannedOutput,contextWindow:event.contextWindow,usedAutoCompaction:event.usedAutoCompaction,updatedAtMs:Date.now()});opts.state.lastRequestBudget=nextBudget;continue}if(event.type==="run.retrying"){opts.setAssistantStatus(assistantId,t2("chatStatus.retrying",{retry:String(event.retry),maxAttempts:String(event.maxAttempts)}));continue}if(event.type==="run.turn_usage"){opts.applyTurnUsageSummary(event.usageSummary);continue}if(event.type==="context.compression"){let compressionSummary=formatCompressionSummary(event);opts.appendInfoPart(assistantId,compressionSummary.text,{_tone:compressionSummary.tone});continue}if(event.type==="run.finished"){let usageSummary=event.usageSummary;if(debugLogSubagent("cli.run.finished.usage",{assistantId,hasUsageSummary:typeof usageSummary<"u",usageSummary,ts:Date.now()}),typeof usageSummary<"u")opts.applyTurnUsageSummary(usageSummary);clearThinkingState(),opts.setAssistantStatus(assistantId,t2("chatStatus.done")),opts.state.runningAgentRound=!1,clearPendingAction();continue}if(event.type==="run.error"){let usageSummary=event.usageSummary;if(typeof usageSummary<"u")opts.applyTurnUsageSummary(usageSummary);clearThinkingState(),opts.materializeAssistantError(assistantId,event.error),opts.state.runningAgentRound=!1,clearPendingAction(),roundError=Error(formatAgentErrorForUi(event.error))}}}catch(error48){if(!isAbortLikeError(error48)){let normalizedError=error48 instanceof Error?error48:Error(String(error48));roundError=normalizedError,clearThinkingState(),opts.materializeAssistantError(assistantId,normalizedError)}}finally{if(clearSubagentSpinner(),!opts.state.thinking.active||opts.state.thinking.assistantId===assistantId)clearThinkingState();if(!opts.state.paused&&!opts.state.approval.active)opts.state.runningAgentRound=!1;resetActiveRun()}})(),await activeRunPromise,opts.flushPendingAssistantOutput?.(assistantId),pendingInlinePlanMarkdownPath&&!assistantHasMarkdownContent2(opts.state.messages,assistantId)){let inlineMarkdown=await readInlinePlanMarkdown(pendingInlinePlanMarkdownPath),proposedPlanMarkdown=wrapInlinePlanMarkdown2(inlineMarkdown??"");if(proposedPlanMarkdown)opts.appendAssistantMarkdown(assistantId,proposedPlanMarkdown)}if(roundError)return{assistantId,toolCalls,success:!1,error:roundError};if(currentPendingAction&&!pendingAction&&!opts.state.paused&&!sawAssistantDelta&&!sawToolOutput)opts.setAssistantStatus(assistantId,t2("chatStatus.done"));return{assistantId,toolCalls,success:!0}},cancelActiveAgentStream,cancelActiveAgentStreamAndWaitWithTimeout,abortActiveAgentRound}}function createSessionUi(opts){async function compactSession(){return await runManualCompaction({state:opts.state,agent:opts.agent,applyTurnUsageSummary:opts.applyTurnUsageSummary})}let upgradeNotificationTimer=null;function showUpgradeNotification(message){if(opts.state.ui.upgradeNotification.visible=!0,opts.state.ui.upgradeNotification.message=message,upgradeNotificationTimer)clearTimeout(upgradeNotificationTimer);upgradeNotificationTimer=setTimeout(()=>{dismissUpgradeNotification(),upgradeNotificationTimer=null},3000)}function dismissUpgradeNotification(){if(opts.state.ui.upgradeNotification.visible=!1,opts.state.ui.upgradeNotification.message="",upgradeNotificationTimer)clearTimeout(upgradeNotificationTimer),upgradeNotificationTimer=null}let upgradeNotification=g(()=>opts.state.ui.upgradeNotification);return{compactSession,upgradeNotification,showUpgradeNotification,dismissUpgradeNotification}}function createDimSdkState(opts){let initialEnv=opts.context?.env,env6=createEnvReader(initialEnv),initialApprovalMode=resolveInitialApprovalMode(env6),initialMode=typeof opts.agent?.getMode==="function"?opts.agent.getMode():"agent",initialLocale=resolveLocalePreference({explicit:env6.prefixedStr("LANG"),env:initialEnv}),initialThemeMode=resolveInitialThemeId(initialEnv);return{state:reactive({config:{...resolveInitialRunConfig(env6)},usage:{prompt_tokens:0,completion_tokens:0,total_tokens:0,budget:4000},lastRequestBudget:null,runningAgentRound:!1,isCompacting:!1,thinking:{active:!1,assistantId:null,blockIndex:null},ui:{mode:initialMode,locale:initialLocale,theme:{mode:initialThemeMode},statusCompact:!1,onboarding:{lastSeenVersion:""},providerFunnel:{counts:{},events:[]},workspaceSelectionByCwd:{},reasoningEffortByModel:{},tipIntensity:DEFAULT_TIP_INTENSITY,shortcuts:{...DEFAULT_SHORTCUTS},recentCommands:[],greeting:{lastSeenDate:""},delight:{compactStreak:0,lastCompactAtMs:0,lastDelightAtMs:0},expandToolCallsAndThinking:!1,upgradeNotification:{visible:!1,message:""},debugLogging:{enabled:!1,auto:!1,mode:"off",directory:"~/.dimcode/debug"},debug:{lastRoundStartedAtMs:0,lastRoundFirstEventAtMs:0,lastRoundDoneAtMs:0,lastRoundHadError:!1},tool:{callId:null,name:"",startedAtMs:0}},context:opts.context,messages:[],sessionHistoryDirty:!1,revertedMessages:[],revertedFilesApplied:!1,fileRevertsByToolCallId:new Map,userHistory:[],layoutDirtyMessageId:null,layoutDirtySeq:0,selectedToolCallId:null,runningToolCallId:null,expandedBashOutputs:new Set,expandedToolOutputLineCounts:new Map,collapsedToolCallIds:new Set,expandedToolCallGroups:new Set,unifiedEditDiffToolCallIds:new Set,sessionId:resolveInitialSessionId(env6),sessionMeta:{...defaultSessionUiMetadata2(),queue:[],status:"idle",lastErrorCode:void 0},paused:null,approval:{active:null,approvedToolCalls:{},pendingAutoRun:null,mode:initialApprovalMode,queue:[],decisions:{}},provider:{activeId:"",activeModelByProvider:{},connections:{},customProviders:[],custom:{baseUrl:void 0,apiKey:void 0,models:[]}},tools:{websearch:{apiKey:"",apiEndpoint:"https://google.serper.dev/search?format=json",numResults:10}},mcp:{servers:[],phase:"ready",connectedCount:0,configuredCount:0}}),env:env6,initialLocale}}var NON_EXPANDABLE_TOOLS=new Set(["read","glob","grep","websearch"]);function isNonExpandableTool(toolName){if(typeof toolName!=="string")return!1;return NON_EXPANDABLE_TOOLS.has(toolName.trim().toLowerCase())}function readPositiveInt(key,fallback,min,max){let raw=String(globalThis?.process?.env?.[key]??"").trim();if(!raw)return fallback;let n2=Number(raw);if(!Number.isFinite(n2)||n2<=0)return fallback;return Math.max(min,Math.min(max,Math.floor(n2)))}var MAX_EXPANDED_TOOL_OUTPUT_LINES=readPositiveInt("DIMCODE_TOOL_OUTPUT_MAX_LINES",2000,1,50000),INITIAL_EXPANDED_TOOL_OUTPUT_LINES=Math.min(MAX_EXPANDED_TOOL_OUTPUT_LINES,readPositiveInt("DIMCODE_TOOL_OUTPUT_INITIAL_LINES",200,20,MAX_EXPANDED_TOOL_OUTPUT_LINES)),LOAD_MORE_TOOL_OUTPUT_LINES=Math.min(MAX_EXPANDED_TOOL_OUTPUT_LINES,readPositiveInt("DIMCODE_TOOL_OUTPUT_LOAD_MORE_LINES",200,20,MAX_EXPANDED_TOOL_OUTPUT_LINES));function clampExpandedToolOutputLines(count){if(!Number.isFinite(count)||count<=0)return INITIAL_EXPANDED_TOOL_OUTPUT_LINES;return Math.max(1,Math.min(MAX_EXPANDED_TOOL_OUTPUT_LINES,Math.floor(count)))}function createToolUiActions(opts){let state=opts.state;function findToolCallInTranscript(callId){let id3=String(callId??"").trim();if(!id3)return null;for(let m2 of state.messages){if(!m2||m2.role!=="assistant")continue;let part=m2.parts?.find((p2)=>p2?.type==="tool_call"&&p2?.call?.id===id3);if(part?.call)return{assistantId:m2.id,call:part.call}}return null}function selectToolCall(callId){if(callId){let found=findToolCallInTranscript(callId);if(isNonExpandableTool(found?.call?.name)){state.selectedToolCallId=null;return}}if(state.selectedToolCallId=callId,callId)opts.scheduleToolCallReadHighlightByCallId({state,callId,mode:"collapsed",updateAssistant:opts.updateAssistant}),opts.scheduleToolCallDiffHighlightByCallId({state,callId,updateAssistant:opts.updateAssistant})}function toggleBashOutput(toolCallId){let found=findToolCallInTranscript(toolCallId);if(String(found?.call?.name??"").trim().toLowerCase()==="read")return;let newSet=new Set(state.expandedBashOutputs),nextLineCounts=new Map(state.expandedToolOutputLineCounts);if(newSet.has(toolCallId))newSet.delete(toolCallId),nextLineCounts.delete(toolCallId);else newSet.add(toolCallId),nextLineCounts.set(toolCallId,clampExpandedToolOutputLines(INITIAL_EXPANDED_TOOL_OUTPUT_LINES));if(state.expandedBashOutputs=newSet,state.expandedToolOutputLineCounts=nextLineCounts,newSet.has(toolCallId))opts.scheduleToolCallReadHighlightByCallId({state,callId:toolCallId,mode:"expanded",updateAssistant:opts.updateAssistant})}function loadMoreBashOutput(toolCallId){let id3=String(toolCallId??"").trim();if(!id3||!state.expandedBashOutputs.has(id3))return;let next=new Map(state.expandedToolOutputLineCounts),current=clampExpandedToolOutputLines(Number(next.get(id3)??INITIAL_EXPANDED_TOOL_OUTPUT_LINES));next.set(id3,clampExpandedToolOutputLines(current+LOAD_MORE_TOOL_OUTPUT_LINES)),state.expandedToolOutputLineCounts=next;let found=findToolCallInTranscript(id3);if(String(found?.call?.name??"").trim().toLowerCase()==="read")opts.scheduleToolCallReadHighlightByCallId({state,callId:id3,mode:"expanded",updateAssistant:opts.updateAssistant})}function toggleEditDiffLayout(toolCallId){let found=findToolCallInTranscript(toolCallId);if(String(found?.call?.name??"").trim().toLowerCase()!=="edit")return;let next=new Set(state.unifiedEditDiffToolCallIds);if(next.has(toolCallId))next.delete(toolCallId);else next.add(toolCallId);state.unifiedEditDiffToolCallIds=next}function toggleToolCallCollapsed(toolCallId){let id3=String(toolCallId??"").trim();if(!id3)return;let next=new Set(state.collapsedToolCallIds);if(next.has(id3))next.delete(id3);else next.add(id3);state.collapsedToolCallIds=next}function toggleToolCallGroupCollapsed(groupKey){let id3=String(groupKey??"").trim();if(!id3)return;if(!state.collapsedToolCallIds.has(id3)||state.expandedToolCallGroups.has(id3)){let nextCollapsed=new Set(state.collapsedToolCallIds);nextCollapsed.add(id3);let childIds=findGroupChildCallIds(id3);for(let cid of childIds)nextCollapsed.add(cid);if(state.collapsedToolCallIds=nextCollapsed,state.expandedToolCallGroups.has(id3)){let nextExpanded=new Set(state.expandedToolCallGroups);nextExpanded.delete(id3),state.expandedToolCallGroups=nextExpanded}}else{let nextExpanded=new Set(state.expandedToolCallGroups);nextExpanded.add(id3),state.expandedToolCallGroups=nextExpanded}}function findGroupChildCallIds(groupKey){for(let m2 of state.messages){if(!m2||m2.role!=="assistant")continue;let parts=m2.parts;if(!parts)continue;let foundIdx=-1;for(let i2=0;i2<parts.length;i2++)if(parts[i2]?.type==="tool_call"&&parts[i2]?.call?.id===groupKey){foundIdx=i2;break}if(foundIdx<0)continue;let toolName=String(parts[foundIdx]?.call?.name??"").trim().toLowerCase(),childIds=[];for(let i2=foundIdx+1;i2<parts.length;i2++){let p2=parts[i2];if(p2?.type==="tool_call")if(String(p2.call?.name??"").trim().toLowerCase()===toolName)childIds.push(p2.call.id);else break;else if(p2?.type==="tool_output"||p2?.type==="tool_result"||p2?.type==="approve")continue;else break}return childIds}return[]}function toggleToolCallGroup(groupKey){let id3=String(groupKey??"").trim();if(!id3)return;let next=new Set(state.expandedToolCallGroups);if(next.has(id3)){if(next.delete(id3),state.selectedToolCallId){let childIds=findGroupChildCallIds(id3);if(state.selectedToolCallId===id3||childIds.includes(state.selectedToolCallId))state.selectedToolCallId=null}}else next.add(id3);state.expandedToolCallGroups=next}function clearCollapsedToolCalls(){if(state.collapsedToolCallIds.size===0)return;state.collapsedToolCallIds=new Set}function setAllThinkingCollapsed(collapsed){for(let msg of state.messages){if(!msg||msg.role!=="assistant")continue;opts.updateAssistant(msg.id,(m2)=>{let changed=!1,parts=m2.parts.map((p2)=>{if(p2.type!=="thinking")return p2;if(p2.collapsed===collapsed)return p2;return changed=!0,{...p2,collapsed}});return changed?{...m2,parts}:m2})}}return{selectToolCall,toggleBashOutput,loadMoreBashOutput,toggleEditDiffLayout,toggleToolCallCollapsed,toggleToolCallGroupCollapsed,toggleToolCallGroup,clearCollapsedToolCalls,setAllThinkingCollapsed}}function createUiState(opts){function setMode(modeId){if(opts.state.ui.mode=modeId,typeof opts.agent.setMode==="function")opts.agent.setMode(modeId)}function getMode(){if(typeof opts.agent.getMode==="function")return opts.agent.getMode()||"agent";return opts.state.ui.mode??"agent"}return{setMode,getMode}}function createUiSync(opts){watch(()=>opts.state.ui.locale,(next)=>{let locale=String(next||"").trim()||opts.initialLocale;opts.setLocale(locale)},{immediate:!0}),watch(()=>opts.state.ui.theme.mode,(mode2,prev)=>{let nextMode=opts.normalizeThemeMode(mode2),prevMode=opts.normalizeThemeMode(prev);if(nextMode===prevMode)return;let selected=opts.state.selectedToolCallId;if(selected){let viewMode=opts.state.expandedBashOutputs.has(selected)?"expanded":"collapsed";opts.scheduleToolCallReadHighlightByCallId({state:opts.state,callId:selected,mode:viewMode,updateAssistant:opts.updateAssistant}),opts.scheduleToolCallDiffHighlightByCallId({state:opts.state,callId:selected,updateAssistant:opts.updateAssistant})}for(let m2 of opts.state.messages){if(!m2||m2.role!=="assistant"||!Array.isArray(m2.parts))continue;let id3=String(m2.id??"").trim();if(!id3)continue;if(!m2.parts.some((p2)=>p2?.type==="markdown"&&String(p2?.markdown??"").includes("```")))continue;opts.scheduleAssistantMarkdownCodeHighlight({state:opts.state,assistantId:id3,updateAssistant:opts.updateAssistant})}});let mdHighlightSigByAssistantId=new Map,transcriptSignature=g(()=>{let msgs=opts.state.messages,firstId=String(msgs[0]?.id??""),lastId=String(msgs[msgs.length-1]?.id??"");return`${String(opts.state.sessionId??"")}|${msgs.length}|${firstId}|${lastId}`});watch(transcriptSignature,()=>{let globallyIdle=!(opts.state.runningAgentRound||opts.state.runningToolCallId);for(let m2 of opts.state.messages){if(!m2||m2.role!=="assistant"||!Array.isArray(m2.parts))continue;let id3=String(m2.id??"").trim();if(!id3)continue;if(!m2.parts.some((p2)=>p2?.type==="markdown"&&String(p2?.markdown??"").includes("```")))continue;let sig=m2.parts.filter((p2)=>p2?.type==="markdown").map((p2)=>{let md=String(p2?.markdown??"");if(!md.includes("```"))return"";let tail=md.length>16?md.slice(-16):md;return`${md.length}:${tail}`}).filter(Boolean).join("|");if(!sig)continue;if(mdHighlightSigByAssistantId.get(id3)===sig)continue;mdHighlightSigByAssistantId.set(id3,sig),opts.scheduleAssistantMarkdownCodeHighlight({state:opts.state,assistantId:id3,updateAssistant:opts.updateAssistant,force:globallyIdle})}},{immediate:!0})}function createDimSdkStore(opts){let externalAgentProvided=Boolean(opts.agent),{state,initialLocale}=createDimSdkState({context:opts.context,agent:opts.agent}),agent=opts.agent,usagePct=g(()=>{let budget=normalizeLastRequestBudget(state.lastRequestBudget);if(!budget)return 0;return Math.min(1,budget.estimatedInputTokens/Math.max(1,budget.contextWindow))}),{hydrateSessionUsageTotals,applyTurnUsageSummary,resetSessionUsageState}=createSessionUsagePersistence({state}),{setFocusFiles,setCwd,setEnvVar,setAgent,setThemeMode}=createContextActions(state),messagePipeline=createMessagePipeline({state,debugLog:debugLog2}),{pushMessage,setSessionHistoryDirty,replaceMessage,updateAssistant,setAssistantStatus,setAssistantThinking,startNewThinkingBlock,endThinkingBlock,appendAssistantMarkdown,appendInfoPart,upsertSubagentInfo,tickSubagentFrame,upsertToolCallDelta,upsertToolCallEndWithHighlights,upsertToolOutputStart,appendToolOutputDelta,attachToolResultPart,insertApprovalPart,toggleChecklist,toggleBlockCollapsed,replaceMessages,materializeAssistantError,flushPendingAssistantOutput,scheduleToolResultHighlight:scheduleToolResultHighlight2,hasRevertedMessages,revertedMessageCount,revertFromMessage,revertFilesFromMessage,restoreRevertedMessages,clearRevertedMessages,upsertChecklistPartFromDimSdk}=messagePipeline,toolUiActions=createToolUiActions({state,updateAssistant,scheduleToolCallReadHighlightByCallId,scheduleToolCallDiffHighlightByCallId}),{selectToolCall,toggleBashOutput,loadMoreBashOutput,toggleEditDiffLayout,toggleToolCallCollapsed,toggleToolCallGroupCollapsed,toggleToolCallGroup,clearCollapsedToolCalls,setAllThinkingCollapsed}=toolUiActions,sendQueue=createSendQueue(),{enqueue:enqueueSendLoop,serializeReceive}=sendQueue,sendLoopState={inSendQueueRun:!1},isInSendQueueRun=()=>sendLoopState.inSendQueueRun,streamRunner=createNativeStreamRunner({state,agent,id:id2,pushMessage,updateAssistant,setAssistantStatus,setAssistantThinking,startNewThinkingBlock,endThinkingBlock,appendAssistantMarkdown,appendInfoPart,upsertSubagentInfo,tickSubagentFrame,upsertToolCallDelta,upsertToolCallEnd:upsertToolCallEndWithHighlights,upsertToolOutputStart,appendToolOutputDelta,insertApprovalPart,attachToolResultPart,scheduleToolResultHighlight:scheduleToolResultHighlight2,upsertChecklistPartFromDimSdk,flushPendingAssistantOutput,applyTurnUsageSummary,materializeAssistantError}),{runAgentRound,cancelActiveAgentStream,cancelActiveAgentStreamAndWaitWithTimeout,abortActiveAgentRound}=streamRunner,{runAgentRound:runAgentRoundWithAutoCompact}=createAutoCompactFallbackRunner({state,agent,id:id2,pushMessage,updateAssistant,flushPendingAssistantOutput,applyTurnUsageSummary,runAgentRound:(o2)=>runAgentRound(o2)}),toolExecution=createToolExecution({state,externalAgentProvided,toolRunner:opts.toolRunner,id:id2,pushMessage,updateAssistant,setAssistantStatus,insertApprovalPart,attachToolResultPart,runAgentRound:(o2)=>runAgentRoundWithAutoCompact(o2),sleep,serializeReceive,isInSendQueueRun}),{ensureApproved,findToolCall,resolveActiveApproval,runToolCall}=toolExecution,sendInterrupt=createSendInterrupt({state,abortActiveAgentRound,cancelActiveAgentStream,cancelActiveAgentStreamAndWaitWithTimeout,setSessionHistoryDirty,setAssistantStatus,findToolCall,runAgentRound:(o2)=>runAgentRoundWithAutoCompact(o2),serializeReceive,interruptSession:async(sessionId)=>{let interruptSession=agent.sessions?.interrupt;if(!sessionId||typeof interruptSession!=="function")return;try{await interruptSession(sessionId)}catch(error48){debugLog2("agent_interrupt_session_error",error48 instanceof Error?{session_id:sessionId,message:error48.message,stack:error48.stack}:{session_id:sessionId,error:String(error48)})}}}),{interrupt,interruptAndWait,submitAskUserAnswers,cancelAskUser,getEpoch}=sendInterrupt,sendLoop=createSendLoop({state,externalAgentProvided,id:id2,pushMessage,replaceMessage,setAssistantStatus,setFocusFiles,runAgentRound:(o2)=>runAgentRoundWithAutoCompact(o2),abortActiveAgentRound,cancelActiveAgentStream,cancelActiveAgentStreamAndWaitWithTimeout,ensureApproved,runToolCall,resolveActiveApproval,sleep,yieldToEventLoop,enqueue:enqueueSendLoop,setInSendQueueRun:(value)=>{sendLoopState.inSendQueueRun=value},interruptAndWait,getInterruptEpoch:getEpoch,rewriteUserInput:async({content,sessionId})=>{return(await rewriteOversizedInputToReference({content,sessionId,source:"chat_input"})).content}}),{send}=sendLoop,steer=async(input)=>{let content=normalizeText11(input);if(!content)return!1;if(state.runningAgentRound){let sessionId=String(state.sessionId??"").trim();if(!sessionId||typeof agent.steerSession!=="function")return!1;try{return await agent.steerSession(sessionId,content)}catch(error48){return debugLog2("agent_steer_error",error48 instanceof Error?{session_id:sessionId,message:error48.message,stack:error48.stack}:{session_id:sessionId,error:String(error48)}),!1}}return await send({content,steer:!0}),!0};createApprovalsFlow({state,resolveActiveApproval,isInSendQueueRun}),createUiSync({state,initialLocale,setLocale:(locale)=>{let normalized=normalizeLocale(locale);if(normalized)setLocale(normalized)},normalizeThemeMode,scheduleToolCallReadHighlightByCallId,scheduleToolCallDiffHighlightByCallId,scheduleAssistantMarkdownCodeHighlight,updateAssistant});let{setMode,getMode}=createUiState({state,agent}),{compactSession,upgradeNotification,showUpgradeNotification,dismissUpgradeNotification}=createSessionUi({state,agent,applyTurnUsageSummary});return{state,agent,usagePct,scheduleToolResultHighlight:scheduleToolResultHighlight2,selectToolCall,toggleBashOutput,loadMoreBashOutput,toggleEditDiffLayout,toggleChecklist,toggleBlockCollapsed,toggleToolCallCollapsed,toggleToolCallGroupCollapsed,toggleToolCallGroup,clearCollapsedToolCalls,setAllThinkingCollapsed,send,steer,sendUser:send,sendUserInput:(input)=>send(input),setFocusFiles,setCwd,setEnvVar,setAgent,setThemeMode,replaceMessages,flushPendingAssistantOutput,approve:()=>resolveActiveApproval("approved"),deny:()=>resolveActiveApproval("denied"),runToolCall,interrupt,interruptAndWait,submitAskUserAnswers,cancelAskUser,revertFromMessage,revertFilesFromMessage,restoreRevertedMessages,clearRevertedMessages,hasRevertedMessages,revertedMessageCount,setMode,getMode,compactSession,upgradeNotification,showUpgradeNotification,dismissUpgradeNotification,hydrateSessionUsageTotals,resetSessionUsageState}}import{Stream}from"node:stream";import process23 from"node:process";var import_react10=__toESM(require_react_development(),1);import process22 from"node:process";function debounce(func,debounceMs,{signal,edges}={}){let pendingThis=void 0,pendingArgs=null,leading=edges!=null&&edges.includes("leading"),trailing=edges==null||edges.includes("trailing"),invoke=()=>{if(pendingArgs!==null)func.apply(pendingThis,pendingArgs),pendingThis=void 0,pendingArgs=null},onTimerEnd=()=>{if(trailing)invoke();cancel()},timeoutId=null,schedule=()=>{if(timeoutId!=null)clearTimeout(timeoutId);timeoutId=setTimeout(()=>{timeoutId=null,onTimerEnd()},debounceMs)},cancelTimer=()=>{if(timeoutId!==null)clearTimeout(timeoutId),timeoutId=null},cancel=()=>{cancelTimer(),pendingThis=void 0,pendingArgs=null},flush=()=>{invoke()},debounced=function(...args){if(signal?.aborted)return;pendingThis=this,pendingArgs=args;let isFirstCall=timeoutId==null;if(schedule(),leading&&isFirstCall)invoke()};return debounced.schedule=schedule,debounced.cancel=cancel,debounced.flush=flush,signal?.addEventListener("abort",cancel,{once:!0}),debounced}function debounce2(func,debounceMs=0,options={}){if(typeof options!=="object")options={};let{leading=!1,trailing=!0,maxWait}=options,edges=Array(2);if(leading)edges[0]="leading";if(trailing)edges[1]="trailing";let result=void 0,pendingAt=null,_debounced=debounce(function(...args){result=func.apply(this,args),pendingAt=null},debounceMs,{edges}),debounced=function(...args){if(maxWait!=null){if(pendingAt===null)pendingAt=Date.now();if(Date.now()-pendingAt>=maxWait)return result=func.apply(this,args),pendingAt=Date.now(),_debounced.cancel(),_debounced.schedule(),result}return _debounced.apply(this,args),result},flush=()=>{return _debounced.flush(),result};return debounced.cancel=_debounced.cancel,debounced.flush=flush,debounced}function throttle(func,throttleMs=0,options={}){let{leading=!0,trailing=!0}=options;return debounce2(func,throttleMs,{leading,maxWait:throttleMs,trailing})}var exports_base={};__export(exports_base,{synchronizedOutput:()=>synchronizedOutput,setCwd:()=>setCwd,scrollUp:()=>scrollUp,scrollDown:()=>scrollDown,link:()=>link,image:()=>image,iTerm:()=>iTerm,exitAlternativeScreen:()=>exitAlternativeScreen,eraseUp:()=>eraseUp,eraseStartLine:()=>eraseStartLine,eraseScreen:()=>eraseScreen,eraseLines:()=>eraseLines,eraseLine:()=>eraseLine,eraseEndLine:()=>eraseEndLine,eraseDown:()=>eraseDown,enterAlternativeScreen:()=>enterAlternativeScreen,endSynchronizedOutput:()=>endSynchronizedOutput,cursorUp:()=>cursorUp,cursorTo:()=>cursorTo,cursorShow:()=>cursorShow,cursorSavePosition:()=>cursorSavePosition,cursorRestorePosition:()=>cursorRestorePosition,cursorPrevLine:()=>cursorPrevLine,cursorNextLine:()=>cursorNextLine,cursorMove:()=>cursorMove,cursorLeft:()=>cursorLeft,cursorHide:()=>cursorHide,cursorGetPosition:()=>cursorGetPosition,cursorForward:()=>cursorForward,cursorDown:()=>cursorDown,cursorBackward:()=>cursorBackward,clearViewport:()=>clearViewport,clearTerminal:()=>clearTerminal,clearScreen:()=>clearScreen,beginSynchronizedOutput:()=>beginSynchronizedOutput,beep:()=>beep,ConEmu:()=>ConEmu});import process13 from"node:process";import os7 from"node:os";var isBrowser=globalThis.window?.document!==void 0,isNode=globalThis.process?.versions?.node!==void 0,isBun=globalThis.process?.versions?.bun!==void 0,isDeno=globalThis.Deno?.version?.deno!==void 0,isElectron=globalThis.process?.versions?.electron!==void 0,isJsDom=globalThis.navigator?.userAgent?.includes("jsdom")===!0,isWebWorker=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,isDedicatedWorker=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,isSharedWorker=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,isServiceWorker=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,platform=globalThis.navigator?.userAgentData?.platform,isMacOs=platform==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",isWindows=platform==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",isLinux=platform==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",isIos=platform==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),isAndroid=platform==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var ESC="\x1B[",OSC="\x1B]",BEL="\x07",SEP=";",isTerminalApp=!isBrowser&&process13.env.TERM_PROGRAM==="Apple_Terminal",isWindows2=!isBrowser&&process13.platform==="win32",isTmux=!isBrowser&&(process13.env.TERM?.startsWith("screen")||process13.env.TERM?.startsWith("tmux")||process13.env.TMUX!==void 0),cwdFunction=isBrowser?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:process13.cwd,wrapOsc=(sequence)=>{if(isTmux)return"\x1BPtmux;"+sequence.replaceAll("\x1B","\x1B\x1B")+"\x1B\\";return sequence},cursorTo=(x2,y2)=>{if(typeof x2!=="number")throw TypeError("The `x` argument is required");if(typeof y2!=="number")return ESC+(x2+1)+"G";return ESC+(y2+1)+SEP+(x2+1)+"H"},cursorMove=(x2,y2)=>{if(typeof x2!=="number")throw TypeError("The `x` argument is required");let returnValue="";if(x2<0)returnValue+=ESC+-x2+"D";else if(x2>0)returnValue+=ESC+x2+"C";if(y2<0)returnValue+=ESC+-y2+"A";else if(y2>0)returnValue+=ESC+y2+"B";return returnValue},cursorUp=(count=1)=>ESC+count+"A",cursorDown=(count=1)=>ESC+count+"B",cursorForward=(count=1)=>ESC+count+"C",cursorBackward=(count=1)=>ESC+count+"D",cursorLeft=ESC+"G",cursorSavePosition=isTerminalApp?"\x1B7":ESC+"s",cursorRestorePosition=isTerminalApp?"\x1B8":ESC+"u",cursorGetPosition=ESC+"6n",cursorNextLine=ESC+"E",cursorPrevLine=ESC+"F",cursorHide=ESC+"?25l",cursorShow=ESC+"?25h",eraseLines=(count)=>{let clear="";for(let i2=0;i2<count;i2++)clear+=eraseLine+(i2<count-1?cursorUp():"");if(count)clear+=cursorLeft;return clear},eraseEndLine=ESC+"K",eraseStartLine=ESC+"1K",eraseLine=ESC+"2K",eraseDown=ESC+"J",eraseUp=ESC+"1J",eraseScreen=ESC+"2J",scrollUp=ESC+"S",scrollDown=ESC+"T",clearScreen="\x1Bc",clearViewport=`${eraseScreen}${ESC}H`,isOldWindows=()=>{if(isBrowser||!isWindows2)return!1;let parts=os7.release().split("."),major=Number(parts[0]),build=Number(parts[2]??0);if(major<10)return!0;if(major===10&&build<10586)return!0;return!1},clearTerminal=isOldWindows()?`${eraseScreen}${ESC}0f`:`${eraseScreen}${ESC}3J${ESC}H`,enterAlternativeScreen=ESC+"?1049h",exitAlternativeScreen=ESC+"?1049l",beginSynchronizedOutput=ESC+"?2026h",endSynchronizedOutput=ESC+"?2026l",synchronizedOutput=(text)=>beginSynchronizedOutput+text+endSynchronizedOutput,beep=BEL,link=(text,url2)=>{let openLink=wrapOsc(`${OSC}8${SEP}${SEP}${url2}${BEL}`),closeLink=wrapOsc(`${OSC}8${SEP}${SEP}${BEL}`);return openLink+text+closeLink},image=(data,options={})=>{let returnValue=`${OSC}1337;File=inline=1`;if(options.width)returnValue+=`;width=${options.width}`;if(options.height)returnValue+=`;height=${options.height}`;if(options.preserveAspectRatio===!1)returnValue+=";preserveAspectRatio=0";let imageBuffer=Buffer.from(data);return wrapOsc(returnValue+`;size=${imageBuffer.byteLength}:`+imageBuffer.toString("base64")+BEL)},iTerm={setCwd:(cwd=cwdFunction())=>wrapOsc(`${OSC}50;CurrentDir=${cwd}${BEL}`),annotation(message,options={}){let returnValue=`${OSC}1337;`,hasX=options.x!==void 0,hasY=options.y!==void 0;if((hasX||hasY)&&!(hasX&&hasY&&options.length!==void 0))throw Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");if(message=message.replaceAll("|",""),returnValue+=options.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",options.length>0)returnValue+=(hasX?[message,options.length,options.x,options.y]:[options.length,message]).join("|");else returnValue+=message;return wrapOsc(returnValue+BEL)}},ConEmu={setCwd:(cwd=cwdFunction())=>wrapOsc(`${OSC}9;9;${cwd}${BEL}`)},setCwd=(cwd=cwdFunction())=>iTerm.setCwd(cwd)+ConEmu.setCwd(cwd);import{env as env6}from"node:process";var isInCi=env6.CI!=="0"&&env6.CI!=="false"&&(("CI"in env6)||("CONTINUOUS_INTEGRATION"in env6)||Object.keys(env6).some((key)=>key.startsWith("CI_"))),is_in_ci_default=isInCi;var getAllProperties=(object4)=>{let properties=new Set;do for(let key of Reflect.ownKeys(object4))properties.add([object4,key]);while((object4=Reflect.getPrototypeOf(object4))&&object4!==Object.prototype);return properties};function autoBind(self2,{include,exclude}={}){let filter3=(key)=>{let match=(pattern)=>typeof pattern==="string"?key===pattern:pattern.test(key);if(include)return include.some(match);if(exclude)return!exclude.some(match);return!0};for(let[object4,key]of getAllProperties(self2.constructor.prototype)){if(key==="constructor"||!filter3(key))continue;let descriptor=Reflect.getOwnPropertyDescriptor(object4,key);if(descriptor&&typeof descriptor.value==="function")self2[key]=self2[key].bind(self2)}return self2}var import_signal_exit2=__toESM(require_signal_exit(),1);import{PassThrough as PassThrough2}from"node:stream";var consoleMethods=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],originalMethods={},patchConsole=(callback)=>{let stdout=new PassThrough2,stderr=new PassThrough2;stdout.write=(data)=>{callback("stdout",data)},stderr.write=(data)=>{callback("stderr",data)};let internalConsole=new console.Console(stdout,stderr);for(let method2 of consoleMethods)originalMethods[method2]=console[method2],console[method2]=internalConsole[method2];return()=>{for(let method2 of consoleMethods)console[method2]=originalMethods[method2];originalMethods={}}},dist_default=patchConsole;var loadYoga=(()=>{var _scriptDir=import.meta.url;return function(loadYoga2){loadYoga2=loadYoga2||{};var h2;h2||(h2=typeof loadYoga2<"u"?loadYoga2:{});var aa,ca;h2.ready=new Promise(function(a2,b2){aa=a2,ca=b2});var da=Object.assign({},h2),q="";typeof document<"u"&&document.currentScript&&(q=document.currentScript.src),_scriptDir&&(q=_scriptDir),q.indexOf("blob:")!==0?q=q.substr(0,q.replace(/[?#].*/,"").lastIndexOf("/")+1):q="";var ea=h2.print||console.log.bind(console),v2=h2.printErr||console.warn.bind(console);Object.assign(h2,da),da=null;var w2;h2.wasmBinary&&(w2=h2.wasmBinary);var noExitRuntime=h2.noExitRuntime||!0;typeof WebAssembly!="object"&&x2("no native wasm support detected");var fa,ha=!1;function z2(a2,b2,c){c=b2+c;for(var d2="";!(b2>=c);){var e2=a2[b2++];if(!e2)break;if(e2&128){var f2=a2[b2++]&63;if((e2&224)==192)d2+=String.fromCharCode((e2&31)<<6|f2);else{var g2=a2[b2++]&63;e2=(e2&240)==224?(e2&15)<<12|f2<<6|g2:(e2&7)<<18|f2<<12|g2<<6|a2[b2++]&63,65536>e2?d2+=String.fromCharCode(e2):(e2-=65536,d2+=String.fromCharCode(55296|e2>>10,56320|e2&1023))}}else d2+=String.fromCharCode(e2)}return d2}var ia,ja,A,C,ka,D,E2,la,ma;function na(){var a2=fa.buffer;ia=a2,h2.HEAP8=ja=new Int8Array(a2),h2.HEAP16=C=new Int16Array(a2),h2.HEAP32=D=new Int32Array(a2),h2.HEAPU8=A=new Uint8Array(a2),h2.HEAPU16=ka=new Uint16Array(a2),h2.HEAPU32=E2=new Uint32Array(a2),h2.HEAPF32=la=new Float32Array(a2),h2.HEAPF64=ma=new Float64Array(a2)}var oa,pa=[],qa=[],ra=[];function sa(){var a2=h2.preRun.shift();pa.unshift(a2)}var F=0,ta=null,G=null;function x2(a2){if(h2.onAbort)h2.onAbort(a2);throw a2="Aborted("+a2+")",v2(a2),ha=!0,a2=new WebAssembly.RuntimeError(a2+". Build with -sASSERTIONS for more info."),ca(a2),a2}function ua(a2){return a2.startsWith("data:application/octet-stream;base64,")}var H="data:application/octet-stream;base64,AGFzbQEAAAABugM3YAF/AGACf38AYAF/AX9gA39/fwBgAn98AGACf38Bf2ADf39/AX9gBH9/f30BfWADf398AGAAAGAEf39/fwBgAX8BfGACf38BfGAFf39/f38Bf2AAAX9gA39/fwF9YAZ/f31/fX8AYAV/f39/fwBgAn9/AX1gBX9/f319AX1gAX8BfWADf35/AX5gB39/f39/f38AYAZ/f39/f38AYAR/f39/AX9gBn9/f319fQF9YAR/f31/AGADf399AX1gBn98f39/fwF/YAR/fHx/AGACf30AYAh/f39/f39/fwBgDX9/f39/f39/f39/f38AYAp/f39/f39/f39/AGAFf39/f38BfGAEfHx/fwF9YA1/fX1/f399fX9/f39/AX9gB39/f319f38AYAJ+fwF/YAN/fX0BfWABfAF8YAN/fHwAYAR/f319AGAHf39/fX19fQF9YA1/fX99f31/fX19fX1/AX9gC39/f39/f399fX19AX9gCH9/f39/f319AGAEf39+fgBgB39/f39/f38Bf2ACfH8BfGAFf398fH8AYAN/f38BfGAEf39/fABgA39/fQBgBn9/fX99fwF/ArUBHgFhAWEAHwFhAWIAAwFhAWMACQFhAWQAFgFhAWUAEQFhAWYAIAFhAWcAAAFhAWgAIQFhAWkAAwFhAWoAAAFhAWsAFwFhAWwACgFhAW0ABQFhAW4AAwFhAW8AAQFhAXAAFwFhAXEABgFhAXIAAAFhAXMAIgFhAXQACgFhAXUADQFhAXYAFgFhAXcAAgFhAXgAAwFhAXkAGAFhAXoAAgFhAUEAAQFhAUIAEQFhAUMAAQFhAUQAAAOiAqACAgMSBwcACRkDAAoRBgYKEwAPDxMBBiMTCgcHGgMUASQFJRQHAwMKCgMmAQYYDxobFAAKBw8KBwMDAgkCAAAFGwACBwIHBgIDAQMIDAABKAkHBQURACkZASoAAAIrLAIALQcHBy4HLwkFCgMCMA0xAgMJAgACAQYKAQIBBQEACQIFAQEABQAODQ0GFQIBHBUGAgkCEAAAAAUyDzMMBQYINAUCAwUODg41AgMCAgIDBgICNgIBDAwMAQsLCwsLCx0CAAIAAAABABABBQICAQMCEgMMCwEBAQEBAQsLAQICAwICAgICAgIDAgIICAEICAgEBAQEBAQEBAQABAQABAQEBAAE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GiABQQA2AvADIAFCADcC6AMgAigC7AMiAyACKALoAyIERwRAIAMgBGsiBEEASA0FIAEgBBAeIgM2AuwDIAEgAzYC6AMgASADIARqNgLwAyACKALoAyIEIAIoAuwDIghHBEADQCADIAQoAgA2AgAgA0EEaiEDIARBBGoiBCAIRw0ACwsgASADNgLsAwsgASACKQL0AzcC9AMgASACKAKEBDYChAQgASACKQL8AzcC/AMgAUEANgLkAwsgBSABNgIAIAEgADYC5AMLIAZBAWohBiAFQQRqIgUgB0cNAAsLDwsQAgALUAACQAJAAkACQAJAIAIOBAQAAQIDCyAAIAEgAUEwahBDDwsgACABIAFBMGogAxBEDwsgACABIAFBMGoQQg8LECQACyAAIAEgAUEwaiADEEULcAIBfwF9IwBBEGsiBCQAIARBCGogACABQQJ0QdwlaigCACACEDZDAADAfyEFAkACQAJAIAQtAAxBAWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwt5AgF/AX0jAEEQayIDJAAgA0EIaiAAIAFBAnRB7CVqKAIAIAIQU0MAAMB/IQQCQAJAAkAgAy0ADEEBaw4CAAECCyADKgIIIQQMAQsgAyoCCEMAAAAAlEMK1yM8lCEECyADQRBqJAAgBEMAAAAAl0MAAAAAIAQgBFsbC1QAAkACQAJAAkACQCACDgQEAAECAwsgACABIAFBwgBqEEMPCyAAIAEgAUHCAGogAxBEDwsgACABIAFBwgBqEEIPCxAkAAsgACABIAFBwgBqIAMQRQsvACAAIAJFQQF0IgIgASADEGAgACACIAEQS5IgACACIAEgAxB/IAAgAiABEFKSkgvOAQIDfwJ9IwBBEGsiAyQAQQEhBCADQQhqIABB/ABqIgUgACABQQF0akH2AGoiAS8BABAfAkACQCADKgIIIgcgAioCACIGXARAIAcgB1sEQCACLQAEIQIMAgsgBiAGXCEECyACLQAEIQIgBEUNACADLQAMIAJB/wFxRg0BCyAFIAEgBiACEDkDQCAALQAAIgFBBHENASAAIAFBBHI6AAAgACgCECIBBEAgACABEQAACyAAQYCAgP4HNgKcASAAKALkAyIADQALCyADQRBqJAALzgECA38CfSMAQRBrIgMk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AWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwscACAAIAFBCCACpyACQiCIpyADpyADQiCIpxAVCwUAEFgACzkAIABFBEBBAA8LAn8gAUGAf3FBgL8DRiABQf8ATXJFBEBB/DtBGTYCAEF/DAELIAAgAToAAEEBCwvEAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABQQlrDhIACgsMCgsCAwQFDAsMDAoLBwgJCyACIAIoAgAiAUEEajYCACAAIAEoAgA2AgAPCwALIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LAAsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAQALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC84BAgN/An0jAEEQayIDJABBASEEIANBCGogAEH8AGoiBSAAIAFBAXRqQegAaiIBLwEAEB8CQAJAIAMqAggiByACKgIAIgZcBEAgByAHWwRAIAItAAQhAgwCCyAGIAZcIQQLIAItAAQhAiAERQ0AIAMtAAwgAkH/AXFGDQELIAUgASAGIAIQOQNAIAAtAAAiAUEEcQ0BIAAgAUEEcjoAACAAKAIQIgEEQCAAIAERAAALIABBgICA/gc2ApwBIAAoAuQDIgANAAsLIANBEGokAAtdAQR/IAAoAgAhAgNAIAIsAAAiAxBXBEBBfyEEIAAgAkEBaiICNgIAIAFBzJmz5gBNBH9BfyADQTBrIgMgAUEKbCIEaiADIARB/////wdzShsFIAQLIQEMAQsLIAELrhQCEn8BfiMAQdAAayIIJAAgCCABNgJMIAhBN2ohFyAIQThqIRQCQAJAAkACQANAIAEhDSAHIA5B/////wdzSg0BIAcgDmohDgJAAkACQCANIgctAAAiCQRAA0ACQAJAIAlB/wFxIgFFBEAgByEBDAELIAFBJUcNASAH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IQEgAEIANwIEIAAgATYCACABIAA2AgQgAkEQaiQAIAALGwEBfyAABEAgACgCACIBBEAgARAjCyAAECMLC0kBAn9BBBAeIQFBIBAeIgBBADYCHCAAQoCAgICAgIDAPzcCFCAAQgA3AgwgAEEAOgAIIABBAzYCBCAAQQA2AgAgASAANgIAIAELIAAgAkEFR0EAIAIbRQRAQbgwIAMgBBBJDwsgAyAEEHALIgEBfiABIAKtIAOtQiCGhCAEIAARFQAiBUIgiKckASAFpwuoAQEFfyAAKAJUIgMoAgAhBSADKAIEIgQgACgCFCAAKAIcIgdrIgYgBCAGSRsiBgRAIAUgByAGECsaIAMgAygCACAGaiIFNgIAIAMgAygCBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEECsaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACCwQAQgALBABBAAuKBQIGfgJ/IAEgASgCAEEHakF4cSIBQRBqNgIAIAAhCSABKQMAIQMgASkDCCEGIwBBIGsiCCQAAkAgBkL///////////8AgyIEQoCAgICAgMCAPH0gBEKAgICAgIDA/8MAfVQEQCAGQgSGIANCPIiEIQQgA0L//////////w+DIgNCgYCAgICAgIAIWgRAIARCgYCAgICAgIDAAHwhAgwCCyAEQoCAgICAgICAQH0hAiADQoCAgICAgICACFINASACIARCAYN8IQIMAQsgA1AgBEKAgICAgIDA//8AVCAEQoCAgICAgMD//wBRG0UEQCAGQgSGIANCPIiEQv////////8Dg0KAgICAgICA/P8AhCECDAELQoCAgICAgID4/wAhAiAEQv///////7//wwBWDQBCACECIARCMIinIgBBkfcASQ0AIAMhAiAGQv///////z+DQoCAgICAgMAAhCIFIQcCQCAAQYH3AGsiAUHAAHEEQCACIAFBQGqthiEHQgAhAgwBCyABRQ0AIAcgAa0iBIYgAkHAACABa62IhCEHIAIgBIYhAgsgCCACNwMQIAggBzcDGAJAQYH4ACAAayIAQcAAcQRAIAUgAEFAaq2IIQNCACEFDAELIABFDQAgBUHAACAAa62GIAMgAK0iAoiEIQMgBSACiCEFCyAIIAM3AwAgCCAF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ASAAKAIAIQAgASACQQFxBH8gASgCACAAaigCAAUgAAsRCwALYQECfyMAQRBrIgIkACABIAAoAgQiA0EBdWohASAAKAIAIQAgAiABIANBAXEEfyABKAIAIABqKAIABSAACxEBAEEQEB4iACACKQMINwMIIAAgAikDADcDACACQRBqJAAgAAtjAQJ/IwBBEGsiAyQAIAEgACgCBCIEQQF1aiEBIAAoAgAhACADIAEgAiAEQQFxBH8gASgCACAAaigCAAUgAAsRAwBBEBAeIgAgAykDCDcDCCAAIAMpAwA3AwAgA0EQaiQAIAALNwEBfyABIAAoAgQiA0EBdWohASAAKAIAIQAgASACIANBAXEEfyABKAIAIABqKAIABSAACxEEAAs5AQF/IAEgACgCBCIEQQF1aiEBIAAoAgAhACABIAIgAyAEQQFxBH8gASgCACAAaigCAAUgAAsRCAALCQAgASAAEQIACwUAQcM7Cw8AIAEgACgCAGogAjYCAAsNACABIAAoAgBqKAIACxgBAX9BEBAeIgBCADcDCCAAQQA2AgAgAAsYAQF/QRAQHiIAQgA3AwAgAEIANwMIIAALDABBMBAeQQBBMBAqCzcBAX8gASAAKAIEIgNBAXVqIQEgACgCACEAIAEgAiADQQFxBH8gASgCACAAaigCAAUgAAsRHgALBQBBvjsLIQAgACABKAIAIAEgASwAC0EASBtBuzsgAigCABAQNgIACyoBAX9BDBAeIgFBADoABCABIAAoAgA2AgggAEEANgIAIAFB2Cc2AgAgAQsFAEG7OwsFAEG4OwshACAAIAEoAgAgASABLAALQQBIG0GkOyACKAIAEBA2AgAL2AEBBH8jAEEgayIDJAAgASgCACIEQfD///8HSQRAAkACQCAEQQtPBEAgBEEPckEBaiIFEB4hBiADIAVBgICAgHhyNgIQIAMgBjYCCCADIAQ2AgwgBCAGaiEFDAELIAMgBDoAEyADQQhqIgYgBGohBSAERQ0BCyAGIAFBBGogBBArGgsgBUEAOgAAIAMgAjYCACADQRhqIANBCGogAyAAEQMAIAMoAhgQHSADKAIYIgAQBiADKAIAEAYgAywAE0EASARAIAMoAggQIwsgA0EgaiQAIAAPCxACAAsqAQF/QQwQHiIBQQA6AAQgASAAKAIANgIIIABBADYCACABQeAmNgIA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AkEIaiAIIAYQHyACIAcgAC8AABAfQQEhAyACKgIIIgogAioCACILXAR/IAogClsNAyALIAtcBSADC0UNAiACLQAMIAItAARHDQILIABBAmohAEEBIQMgBCEGQQEhBCAGRQ0ACyABLwB6IgBBB3FFBEAgBS0AekEHcUUNAgsgCCAAECAiCiAHIAUvAHoQICILWw0BIAogClsNACALIAtcDQELIAFBFGogBUEUakHoABArGiABQfwAaiAFQfwAahCgAQNAIAEtAAAiAEEEcQ0BIAEgAEEEcjoAACABKAIQIgAEQCABIAARAAALIAFBgICA/gc2ApwBIAEoAuQDIgENAAsLIAJBEGokAAvGAwEEfyMAQaAEayICJAAgACgCBCEBIABBADYCBCABBEAgASABKAIAKAIEEQAACyAAKAIIIQEgAEEANgIIIAEEQCABIAEoAgAoAgQRAAALAkAgACgCACIAKALoAyAAKALsA0YEQCAAKALkAw0BIAAgAkEYaiAAKAL0AxBcIgEpAgA3AgAgACABKAIQNgIQIAAgASkCCDcCCCAAQRRqIAFBFGpB6AAQKxogACABKQKMATcCjAEgACABKQKEATcChAEgACABKQJ8NwJ8IAEoApQBIQQgAUEANgKUASAAKAKUASEDIAAgBDYClAEgAwRAIAMQWwsgAEGYAWogAUGYAWpB0AIQKxogACgC6AMiAwRAIAAgAzYC7AMgAxAjCyAAIAEoAugDNgLoAyAAIAEoAuwDNgLsAyAAIAEoAvADNgLwAyABQQA2AvADIAFCADcC6AMgACABKQL8AzcC/AMgACABKQL0AzcC9AMgACABKAKEBDYChAQgASgClAEhACABQQA2ApQBIAAEQCAAEFsLIAJBoARqJAAPCyACQfAcNgIQIABBBUHYJSACQRBqECwQJAALIAJB5hE2AgAgAEEFQdglIAIQLBAkAAsLAEEMEB4gABCiAQsLAEEMEB5BABCiAQsNACAAKAIALQAIQQFxCwoAIAAoAgAoAhQLGQAgAUH/AXEEQBACAAsgACgCACgCEEEBcQsYACAAKAIAIgAgAC0ACEH+AXEgAXI6AAgLJgAgASAAKAIAIgAoAhRHBEAgACABNgIUIAAgACgCDEEBajYCDAsLkgEBAn8jAEEQayICJAAgACgCACEAIAFDAAAAAGAEQCABIAAqAhhcBEAgACABOAIYIAAgACgCDEEBajYCDAsgAkEQaiQADwsgAkGIFDYCACMAQRBrIgMkACADIAI2AgwCQCAARQRAQbgwQdglIAIQSRoMAQsgAEEAQQVB2CUgAiAAKAIEEQ0AGgsgA0EQaiQAECQACz8AIAFB/wFxRQRAIAIgACgCACIAKAIQIgFBAXFHBEAgACABQX5xIAJyNgIQIAAgACgCDEEBajYCDAsPCxACAAsL4CYjAEGACAuBHk9ubHkgbGVhZiBub2RlcyB3aXRoIGN1c3RvbSBtZWFzdXJlIGZ1bmN0aW9ucyBzaG91bGQgbWFudWFsbHkgbWFyayB0aGVtc2VsdmVzIGFzIGRpcnR5AGlzRGlydHkAbWFya0RpcnR5AGRlc3Ryb3kAc2V0RGlzcGxheQBnZXREaXNwbGF5AHNldEZsZXgALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweABzZXRGbGV4R3JvdwBnZXRGbGV4R3JvdwBzZXRPdmVyZmxvdwBnZXRPdmVyZmxvdwBoYXNOZXdMYXlvdXQAY2FsY3VsYXRlTGF5b3V0AGdldENvbXB1dGVkTGF5b3V0AHVuc2lnbmVkIHNob3J0AGdldENoaWxkQ291bnQAdW5zaWduZWQgaW50AHNldEp1c3RpZnlDb250ZW50AGdldEp1c3RpZnlDb250ZW50AGF2YWlsYWJsZUhlaWdodCBpcyBpbmRlZmluaXRlIHNvIGhlaWdodFNpemluZ01vZGUgbXVzdCBiZSBTaXppbmdNb2RlOjpNYXhDb250ZW50AGF2YWlsYWJsZVdpZHRoIGlzIGluZGVmaW5pdGUgc28gd2lkdGhTaXppbmdNb2RlIG11c3QgYmUgU2l6aW5nTW9kZTo6TWF4Q29udGVudABzZXRBbGlnbkNvbnRlbnQAZ2V0QWxpZ25Db250ZW50AGdldFBhcmVudABpbXBsZW1lbnQAc2V0TWF4SGVpZ2h0UGVyY2VudABzZXRIZWlnaHRQZXJjZW50AHNldE1pbkhlaWdodFBlcmNlbnQAc2V0RmxleEJhc2lzUGVyY2VudABzZXRHYXBQZXJjZW50AHNldFBvc2l0aW9uUGVyY2VudABzZXRNYXJnaW5QZXJjZW50AHNldE1heFdpZHRoUGVyY2VudABzZXRXaWR0aFBlcmNlbnQAc2V0TWluV2lkdGhQZXJjZW50AHNldFBhZGRpbmdQZXJjZW50AGhhbmRsZS50eXBlKCkgPT0gU3R5bGVWYWx1ZUhhbmRsZTo6VHlwZTo6UG9pbnQgfHwgaGFuZGxlLnR5cGUoKSA9PSBTdHlsZVZhbHVlSGFuZGxlOjpUeXBlOjpQZXJjZW50AGNyZWF0ZURlZmF1bHQAdW5pdAByaWdodABoZWlnaHQAc2V0TWF4SGVpZ2h0AGdldE1heEhlaWdodABzZXRIZWlnaHQAZ2V0SGVpZ2h0AHNldE1pbkhlaWdodABnZXRNaW5IZWlnaHQAZ2V0Q29tcHV0ZWRIZWlnaHQAZ2V0Q29tcHV0ZWRSaWdodABsZWZ0AGdldENvbXB1dGVkTGVmdAByZXNldABfX2Rlc3RydWN0AGZsb2F0AHVpbnQ2NF90AHVzZVdlYkRlZmF1bHRzAHNldFVzZVdlYkRlZmF1bHRzAHNldEFsaWduSXRlbXMAZ2V0QWxpZ25JdGVtcwBzZXRGbGV4QmFzaXMAZ2V0RmxleEJhc2lzAENhbm5vdCBnZXQgbGF5b3V0IHByb3BlcnRpZXMgb2YgbXVsdGktZWRnZSBzaG9ydGhhbmRzAHNldFBvaW50U2NhbGVGYWN0b3IATWVhc3VyZUNhbGxiYWNrV3JhcHBlcgBEaXJ0aWVkQ2FsbGJhY2tXcmFwcGVyAENhbm5vdCByZXNldCBhIG5vZGUgc3RpbGwgYXR0YWNoZWQgdG8gYSBvd25lcgBzZXRCb3JkZXIAZ2V0Qm9yZGVyAGdldENvbXB1dGVkQm9yZGVyAGdldE51bWJlcgBoYW5kbGUudHlwZSgpID09IFN0eWxlVmFsdWVIYW5kbGU6OlR5cGU6Ok51bWJlcgB1bnNpZ25lZCBjaGFyAHRvcABnZXRDb21wdXRlZFRvcABzZXRGbGV4V3JhcABnZXRGbGV4V3JhcABzZXRHYXAAZ2V0R2FwACVwAHNldEhlaWdodEF1dG8Ac2V0RmxleEJhc2lzQXV0bwBzZXRQb3NpdGlvbkF1dG8Ac2V0TWFyZ2luQXV0bwBzZXRXaWR0aEF1dG8AU2NhbGUgZmFjdG9yIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHplcm8Ac2V0QXNwZWN0UmF0aW8AZ2V0QXNwZWN0UmF0aW8Ac2V0UG9zaXRpb24AZ2V0UG9zaXRpb24Abm90aWZ5T25EZXN0cnVjdGlvbgBzZXRGbGV4RGlyZWN0aW9uAGdldEZsZXhEaXJlY3Rpb24Ac2V0RGlyZWN0aW9uAGdldERpcmVjdGlvbgBzZXRNYXJnaW4AZ2V0TWFyZ2luAGdldENvbXB1dGVkTWFyZ2luAG1hcmtMYXlvdXRTZWVuAG5hbgBib3R0b20AZ2V0Q29tcHV0ZWRCb3R0b20AYm9vbABlbXNjcmlwdGVuOjp2YWwAc2V0RmxleFNocmluawBnZXRGbGV4U2hyaW5rAHNldEFsd2F5c0Zvcm1zQ29udGFpbmluZ0Jsb2NrAE1lYXN1cmVDYWxsYmFjawBEaXJ0aWVkQ2FsbGJhY2sAZ2V0TGVuZ3RoAHdpZHRoAHNldE1heFdpZHRoAGdldE1heFdpZHRoAHNldFdpZHRoAGdldFdpZHRoAHNldE1pbldpZHRoAGdldE1pbldpZHRoAGdldENvbXB1dGVkV2lkdGgAcHVzaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1NtYWxsVmFsdWVCdWZmZXIuaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1N0eWxlVmFsdWVQb29sLmgAdW5zaWduZWQgbG9uZwBzZXRCb3hTaXppbmcAZ2V0Qm94U2l6aW5nAHN0ZDo6d3N0cmluZwBzdGQ6OnN0cmluZwBzdGQ6OnUxNnN0cmluZwBzdGQ6OnUzMnN0cmluZwBzZXRQYWRkaW5nAGdldFBhZGRpbmcAZ2V0Q29tcHV0ZWRQYWRkaW5nAFRyaWVkIHRvIGNvbnN0cnVjdCBZR05vZGUgd2l0aCBudWxsIGNvbmZpZwBBdHRlbXB0aW5nIHRvIGNvbnN0cnVjdCBOb2RlIHdpdGggbnVsbCBjb25maWcAY3JlYXRlV2l0aENvbmZpZwBpbmYAc2V0QWxpZ25TZWxmAGdldEFsaWduU2VsZgBTaXplAHZhbHVlAFZhbHVlAGNyZWF0ZQBtZWFzdXJlAHNldFBvc2l0aW9uVHlwZQBnZXRQb3NpdGlvblR5cGUAaXNSZWZlcmVuY2VCYXNlbGluZQBzZXRJc1JlZmVyZW5jZUJhc2VsaW5lAGNvcHlTdHlsZQBkb3VibGUATm9kZQBleHRlbmQAaW5zZXJ0Q2hpbGQAZ2V0Q2hpbGQAcmVtb3ZlQ2hpbGQAdm9pZABzZXRFeHBlcmltZW50YWxGZWF0dXJlRW5hYmxlZABpc0V4cGVyaW1lbnRhbEZlYXR1cmVFbmFibGVkAGRpcnRpZWQAQ2Fubm90IHJlc2V0IGEgbm9kZSB3aGljaCBzdGlsbCBoYXMgY2hpbGRyZW4gYXR0YWNoZWQAdW5zZXRNZWFzdXJlRnVuYwB1bnNldERpcnRpZWRGdW5jAHNldEVycmF0YQBnZXRFcnJhdGEATWVhc3VyZSBmdW5jdGlvbiByZXR1cm5lZCBhbiBpbnZhbGlkIGRpbWVuc2lvbiB0byBZb2dhOiBbd2lkdGg9JWYsIGhlaWdodD0lZl0ARXhwZWN0IGN1c3RvbSBiYXNlbGluZSBmdW5jdGlvbiB0byBub3QgcmV0dXJuIE5hTgBOQU4ASU5GAGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNob3J0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBpbnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGZsb2F0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8Y2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgY2hhcj4Ac3RkOjpiYXNpY19zdHJpbmc8dW5zaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2lnbmVk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";if(!ua(H)){var va=H;H=h2.locateFile?h2.locateFile(va,q):q+va}function wa(){var a2=H;try{if(a2==H&&w2)return new Uint8Array(w2);if(ua(a2))try{var b2=xa(a2.slice(37)),c=new Uint8Array(b2.length);for(a2=0;a2<b2.length;++a2)c[a2]=b2.charCodeAt(a2);var d2=c}catch(f2){throw Error("Converting base64 string to bytes failed.")}else d2=void 0;var e2=d2;if(e2)return e2;throw"both async and sync fetching of the wasm failed"}catch(f2){x2(f2)}}function ya(){return w2||typeof fetch!="function"?Promise.resolve().then(function(){return wa()}):fetch(H,{credentials:"same-origin"}).then(function(a2){if(!a2.ok)throw"failed to load wasm binary file at '"+H+"'";return a2.arrayBuffer()}).catch(function(){return wa()})}function za(a2){for(;0<a2.length;)a2.shift()(h2)}function Aa(a2){if(a2===void 0)return"_unknown";a2=a2.replace(/[^a-zA-Z0-9_]/g,"$");var b2=a2.charCodeAt(0);return 48<=b2&&57>=b2?"_"+a2:a2}function Ba(a2,b2){return a2=Aa(a2),function(){return b2.apply(this,arguments)}}var J=[{},{value:void 0},{value:null},{value:!0},{value:!1}],Ca=[];function Da(a2){var b2=Error,c=Ba(a2,function(d2){this.name=a2,this.message=d2,d2=Error(d2).stack,d2!==void 0&&(this.stack=this.toString()+`
|
|
1245
|
+
`)||candidate.includes("\x00"))return null;if(!path41.isAbsolute(candidate))return null;if(path41.extname(candidate).toLowerCase()!==".md")return null;return path41.normalize(candidate)}function extractInlinePlanMarkdownPath(event,result){let outputRecord=isPlainObject13(event.output)?event.output:void 0,structuredContent=isPlainObject13(outputRecord?.structuredContent)?outputRecord.structuredContent:void 0,candidates=[outputRecord?.markdownPath,outputRecord?.markdown_path,outputRecord?.filePath,outputRecord?.file_path,outputRecord?.path,structuredContent?.markdownPath,structuredContent?.markdown_path,structuredContent?.filePath,structuredContent?.file_path,structuredContent?.path,result.output,...extractTextParts(outputRecord?.content)];for(let candidate of candidates){let normalized=normalizeInlineMarkdownPreviewPath(candidate);if(normalized)return normalized}return null}async function readInlinePlanMarkdown(filePath){let normalizedPath=normalizeInlineMarkdownPreviewPath(filePath);if(!normalizedPath)return null;try{let fileInfo=await stat8(normalizedPath);if(!fileInfo.isFile()||fileInfo.size<=0||fileInfo.size>maxInlinePlanMarkdownBytes)return null;let markdown=await readFile12(normalizedPath,"utf-8");return markdown.trim()?markdown:null}catch{return null}}function assistantHasMarkdownContent2(messages,assistantId){let assistant=messages.find((message)=>message?.id===assistantId&&message.role==="assistant");if(!assistant)return!1;return assistant.parts.some((part)=>{if(part.type!=="markdown")return!1;return normalizeText15(part.markdown).length>0})}function isAbortLikeError(error48){let text=error48 instanceof Error?`${error48.name} ${error48.message}`:String(error48);return/\babort|cancel/i.test(text)}function asToolApprovalRequiredEvent(event){return event}function asAskUserRequiredEvent(event){return event}function normalizeAskUserQuestions(raw){return parseAskUserQuestions(raw).map((question)=>({question:normalizeText15(question.question),header:normalizeText15(question.header),options:Array.isArray(question.options)?question.options.map((option)=>({label:normalizeText15(option.label),description:normalizeText15(option.description)})):[],...question.multiSelect?{multiSelect:!0}:{}}))}function createNativeStreamRunner(opts){let activeAbortController=null,activeRunPromise=null,pendingAction=null,resetActiveRun=()=>{activeAbortController=null,activeRunPromise=null},clearPendingAction=()=>{pendingAction=null},cancelActiveAgentStream=()=>{activeAbortController?.abort("cancelled")},cancelActiveAgentStreamAndWaitWithTimeout=async(timeoutMs=200)=>{let waitPromise=activeRunPromise;if(activeAbortController?.abort("cancelled"),!waitPromise)return;let timeout=Math.max(0,Math.floor(timeoutMs));await Promise.race([waitPromise.catch(()=>{}),new Promise((resolve2)=>{setTimeout(resolve2,timeout)?.unref?.()})])},abortActiveAgentRound=()=>{activeAbortController?.abort("aborted")},clearThinkingState=()=>{opts.state.thinking.active=!1,opts.state.thinking.assistantId=null,opts.state.thinking.blockIndex=null},buildResumeInput=(toolContext)=>{let current=pendingAction;if(!current)return null;if(current.kind==="tool_approval"){let decisions=toolContext?.approval?.decisions??{},decision=current.toolCallId?decisions[current.toolCallId]:Object.values(decisions)[0];if(!decision)throw Error(`Missing approval decision for ${current.toolCallId??current.actionId}`);return{kind:"tool_approval",actionId:current.actionId,...current.toolCallId?{toolCallId:current.toolCallId}:{},approved:decision.approved,...decision.reason?{reason:decision.reason}:{},...toolContext?.approval?.alwaysAllowForConversation?{alwaysAllowForConversation:!0}:{}}}let answersByToolCall=toolContext?.askUser?.answers??{},rejectedByToolCall=toolContext?.askUser?.rejected??{},answers=current.toolCallId?answersByToolCall[current.toolCallId]:Object.values(answersByToolCall)[0];if(!answers&¤t.toolCallId&&rejectedByToolCall[current.toolCallId])console.warn("[dimcode] ask_user rejection is not supported by the native runtime; resuming with empty answers.");return{kind:"ask_user",actionId:current.actionId,...current.toolCallId?{toolCallId:current.toolCallId}:{},answers:{...answers??{}}}};return{async runAgentRound(runOpts){let toolCalls=[],baseMessages=runOpts?.baseMessages??opts.state.messages,resumeInput=buildResumeInput(runOpts?.toolContext),assistantId=resumeInput?pendingAction?.assistantId??opts.id("m"):opts.id("m");if(!resumeInput){clearThinkingState();let modelId=String(opts.state.config?.model??"").trim()||void 0;opts.pushMessage({id:assistantId,role:"assistant",parts:[{type:"status",text:""}],createdAtMs:Date.now(),...modelId?{modelId}:{}})}let latestUserMessage=resumeInput?null:[...baseMessages].reverse().find((message)=>message?.role==="user")??null;if(!resumeInput&&!latestUserMessage)return{assistantId,toolCalls,success:!1,error:Error("No user message found for native agent run")};let sessionId=normalizeText15(opts.state.sessionId),openSession=opts.agent.openSession,ensureSession=opts.agent.ensureSession,runtimeOptions=buildSessionRuntimeOptionsFromState(opts.state,opts.agent),session=resumeInput?typeof openSession==="function"?await openSession(sessionId):null:typeof ensureSession==="function"?await ensureSession({sessionId:sessionId||void 0,...runtimeOptions}):null;if(!session)return{assistantId,toolCalls,success:!1,error:Error("Native runtime session bridge is unavailable")};if(normalizeText15(opts.state.sessionId)!==session.id)opts.state.sessionId=session.id;let currentPendingAction=pendingAction;if(resumeInput)clearPendingAction();opts.state.runningAgentRound=!0,activeAbortController=new AbortController;let stream=resumeInput?session.resume(resumeInput,{signal:activeAbortController.signal}):session.run({content:await buildUserTurnContent(latestUserMessage,opts.state),metadata:{...runOpts?.steer?{steer:!0}:{}}},{signal:activeAbortController.signal}),sawAssistantDelta=!1,sawToolOutput=!1,toolCallStarted=new Set,toolOutputStarted=new Set,runtimeToLocalThinkingIndex=new Map,thinkingContentByLocalIndex=new Map,nextLocalThinkingIndex=getThinkingBlockCount(opts.state.messages,assistantId),activeRuntimeThinkingBlockIndex=null,activeLocalThinkingIndex=null,lastCreatedLocalThinkingIndex=nextLocalThinkingIndex>0?nextLocalThinkingIndex-1:null,roundError=null,pendingInlinePlanMarkdownPath=null,subagentSpinnerTimers=new Map,clearSubagentSpinner=(subagentId)=>{if(subagentId){let timer=subagentSpinnerTimers.get(subagentId);if(timer)clearInterval(timer),subagentSpinnerTimers.delete(subagentId)}else{for(let timer of subagentSpinnerTimers.values())clearInterval(timer);subagentSpinnerTimers.clear()}},removeDelegationPlaceholderMarkdown=()=>{opts.flushPendingAssistantOutput?.(assistantId),opts.updateAssistant(assistantId,(message)=>{let nextParts=message.parts.filter((part)=>{if(part.type!=="markdown")return!0;return!isDelegationRecordedFinalMessage(part.markdown)});if(nextParts.length===message.parts.length)return message;return{...message,parts:nextParts}})},startLocalThinkingBlock=(runtimeBlockIndex)=>{let localThinkingIndex=nextLocalThinkingIndex;nextLocalThinkingIndex+=1,opts.startNewThinkingBlock(assistantId);let normalizedRuntimeBlockIndex=normalizeThinkingBlockIndex(runtimeBlockIndex);if(normalizedRuntimeBlockIndex!=null)runtimeToLocalThinkingIndex.set(normalizedRuntimeBlockIndex,localThinkingIndex);return thinkingContentByLocalIndex.set(localThinkingIndex,""),activeRuntimeThinkingBlockIndex=normalizedRuntimeBlockIndex,activeLocalThinkingIndex=localThinkingIndex,lastCreatedLocalThinkingIndex=localThinkingIndex,localThinkingIndex},resolveLocalThinkingIndex=(runtimeBlockIndex)=>{let normalizedRuntimeBlockIndex=normalizeThinkingBlockIndex(runtimeBlockIndex);if(normalizedRuntimeBlockIndex!=null){let mapped=runtimeToLocalThinkingIndex.get(normalizedRuntimeBlockIndex);if(typeof mapped==="number")return mapped}if(activeLocalThinkingIndex!=null){if(normalizedRuntimeBlockIndex!=null)runtimeToLocalThinkingIndex.set(normalizedRuntimeBlockIndex,activeLocalThinkingIndex);return activeLocalThinkingIndex}if(lastCreatedLocalThinkingIndex!=null){if(normalizedRuntimeBlockIndex!=null)runtimeToLocalThinkingIndex.set(normalizedRuntimeBlockIndex,lastCreatedLocalThinkingIndex);return lastCreatedLocalThinkingIndex}return null},ensureLocalThinkingIndex=(runtimeBlockIndex)=>{return resolveLocalThinkingIndex(runtimeBlockIndex)??startLocalThinkingBlock(runtimeBlockIndex)},readThinkingContent=(localThinkingIndex)=>{if(thinkingContentByLocalIndex.has(localThinkingIndex))return thinkingContentByLocalIndex.get(localThinkingIndex)??"";let content=getThinkingBlockContent(opts.state.messages,assistantId,localThinkingIndex);return thinkingContentByLocalIndex.set(localThinkingIndex,content),content},setThinkingContent=(localThinkingIndex,content)=>{thinkingContentByLocalIndex.set(localThinkingIndex,content)},clearActiveLocalThinking=()=>{activeRuntimeThinkingBlockIndex=null,activeLocalThinkingIndex=null};if(activeRunPromise=(async()=>{try{for await(let event of stream){if(await yieldToNative(),event.type==="thinking.started"){startLocalThinkingBlock(event.blockIndex),opts.state.thinking.active=!0,opts.state.thinking.assistantId=assistantId,opts.state.thinking.blockIndex=event.blockIndex;continue}if(event.type==="thinking.delta"){let localThinkingIndex=ensureLocalThinkingIndex(event.blockIndex),nextThinking=`${readThinkingContent(localThinkingIndex)}${event.delta}`;setThinkingContent(localThinkingIndex,nextThinking),opts.setAssistantThinking(assistantId,nextThinking,localThinkingIndex),activeRuntimeThinkingBlockIndex=normalizeThinkingBlockIndex(event.blockIndex),activeLocalThinkingIndex=localThinkingIndex,opts.state.thinking.active=!0,opts.state.thinking.assistantId=assistantId,opts.state.thinking.blockIndex=event.blockIndex;continue}if(event.type==="thinking.finished"){let localThinkingIndex=ensureLocalThinkingIndex(event.blockIndex);if(typeof event.content==="string")setThinkingContent(localThinkingIndex,event.content),opts.setAssistantThinking(assistantId,event.content,localThinkingIndex);if(opts.endThinkingBlock(assistantId,localThinkingIndex,typeof event.content==="string"?event.content:readThinkingContent(localThinkingIndex)),activeLocalThinkingIndex===localThinkingIndex||activeRuntimeThinkingBlockIndex===normalizeThinkingBlockIndex(event.blockIndex))clearActiveLocalThinking();clearThinkingState();continue}if(event.type==="assistant.delta"){if(isDelegationRecordedFinalMessage(event.delta))continue;sawAssistantDelta=!0,opts.appendAssistantMarkdown(assistantId,event.delta);continue}if(event.type==="assistant.message"){if(typeof event.message.thinking==="string"){let thinking=event.message.thinking;if(!opts.state.messages.some((message)=>message?.id===assistantId&&message.role==="assistant"&&message.parts.some((part)=>part.type==="thinking"))&&thinking){let localThinkingIndex=startLocalThinkingBlock();setThinkingContent(localThinkingIndex,thinking),opts.setAssistantThinking(assistantId,thinking,localThinkingIndex),opts.endThinkingBlock(assistantId,localThinkingIndex,thinking),clearActiveLocalThinking()}}let content=extractTextContent2(event.message.content);if(content&&!sawAssistantDelta&&!isDelegationRecordedFinalMessage(content))opts.appendAssistantMarkdown(assistantId,content);continue}if(event.type==="tool.started"){let args=isPlainObject13(event.input)?event.input:{};if(toolCalls.push({id:event.toolCallId,name:event.toolName,arguments:args}),!toolCallStarted.has(event.toolCallId))toolCallStarted.add(event.toolCallId),opts.upsertToolCallDelta(assistantId,event.toolCallId,event.toolName,"",void 0);opts.upsertToolCallEnd(assistantId,event.toolCallId,event.toolName,args);continue}if(event.type==="tool.delta"){if(event.kind==="input"){opts.upsertToolCallDelta(assistantId,event.toolCallId,event.toolName,event.delta,event.linesWritten);continue}let toolName=normalizeText15(event.toolName)||event.toolCallId;if(!toolOutputStarted.has(event.toolCallId))toolOutputStarted.add(event.toolCallId),opts.upsertToolOutputStart(assistantId,event.toolCallId,toolName);opts.appendToolOutputDelta(assistantId,event.toolCallId,toolName,event.delta),sawToolOutput=!0;continue}if(event.type==="tool.finished"){let result=buildToolResult(event);opts.attachToolResultPart(assistantId,result),opts.scheduleToolResultHighlight(assistantId,result);let toolNameLower=normalizeText15(event.toolName).toLowerCase();if(result.structuredContent){if(isTodoToolName(toolNameLower))opts.upsertChecklistPartFromDimSdk(assistantId,"todo",event.toolCallId,result.structuredContent);else if(isPlanToolName(toolNameLower))opts.upsertChecklistPartFromDimSdk(assistantId,"plan",event.toolCallId,result.structuredContent)}if(isInlinePlanMarkdownToolName2(toolNameLower))pendingInlinePlanMarkdownPath=extractInlinePlanMarkdownPath(event,result);continue}if(event.type==="action.required"&&event.kind==="tool_approval"){let approvalEvent=asToolApprovalRequiredEvent(event),request=buildApprovalRequest(approvalEvent);if(pendingAction={kind:"tool_approval",actionId:approvalEvent.actionId,toolCallId:request.toolCallId,toolName:approvalEvent.toolName,assistantId},!opts.state.approval.active)opts.state.approval.active=request,opts.state.approval.pendingAutoRun={assistantId,toolCallId:request.toolCallId};else if(opts.state.approval.active.toolCallId!==request.toolCallId)opts.state.approval.queue.push({request,assistantId});opts.state.paused={kind:"tool_approval",toolCallId:request.toolCallId,actionId:approvalEvent.actionId},opts.insertApprovalPart(assistantId,request),opts.setAssistantStatus(assistantId,t2("chatStatus.awaitingApproval")),opts.state.runningAgentRound=!1;continue}if(event.type==="action.required"&&event.kind==="ask_user"){let askUserEvent=asAskUserRequiredEvent(event),toolCallId=normalizeText15(askUserEvent.toolCallId);if(!toolCallId)throw Error("Protocol error: ask_user action.required is missing toolCallId");let normalizedQuestions=normalizeAskUserQuestions(askUserEvent.questions),nextPending={kind:"ask_user",actionId:askUserEvent.actionId,toolCallId,toolName:askUserEvent.toolName,questions:normalizedQuestions,assistantId};pendingAction=nextPending;let autoResolveInvalid=normalizedQuestions.length===0;if(opts.state.paused={kind:"ask_user",...nextPending.toolCallId?{toolCallId:nextPending.toolCallId}:{},actionId:askUserEvent.actionId,...nextPending.questions?.length?{questions:[...nextPending.questions]}:{},...typeof askUserEvent.error<"u"?{error:askUserEvent.error}:{},...autoResolveInvalid?{autoResolve:!0}:{}},autoResolveInvalid)opts.appendInfoPart(assistantId,"AskUserQuestion was invoked without valid questions/options; auto-resuming so the model can retry."),opts.setAssistantStatus(assistantId,"");else opts.setAssistantStatus(assistantId,t2("chatStatus.awaitingAnswers"));opts.state.runningAgentRound=!1;continue}if(event.type==="steer_injected"){let steerContent=String(event.content??"");if(steerContent){let currentAssistantIdx=opts.state.messages.findIndex((m2)=>m2.id===assistantId&&m2.role==="assistant"),currentAssistant=currentAssistantIdx>=0?opts.state.messages[currentAssistantIdx]:null,userMsg={id:opts.id("m"),role:"user",content:steerContent,createdAtMs:Date.now(),metadata:{originalEventType:"steer_injected",steer:!0,...typeof event.count==="number"?{steerCount:event.count}:{}}};if(currentAssistant&¤tAssistantIdx>=0)if(currentAssistant.parts.some((p2)=>p2.type!=="status"||String(p2.text??"").trim())){let historicalAssistant={...currentAssistant,id:opts.id("m"),parts:[...currentAssistant.parts]},modelId=currentAssistant.modelId,continuedAssistant={id:assistantId,role:"assistant",parts:[{type:"status",text:""}],createdAtMs:Date.now(),...modelId?{modelId}:{}};opts.state.messages.splice(currentAssistantIdx,1,historicalAssistant,userMsg,continuedAssistant)}else opts.state.messages.splice(currentAssistantIdx,0,userMsg);else opts.pushMessage(userMsg);sawAssistantDelta=!1}continue}if(event.type==="subagent.started"){debugLogSubagent("cli.subagent.started",{assistantId,subagentId:event.subagentId,taskDescription:event.taskDescription,subagentType:event.subagentType,ts:Date.now()}),removeDelegationPlaceholderMarkdown();let desc=normalizeText15(event.taskDescription)||normalizeText15(event.subagentId);if(desc)opts.upsertSubagentInfo(assistantId,event.subagentId,"header",desc);clearSubagentSpinner(event.subagentId);let timer=setInterval(()=>{yieldToNative().then(()=>{opts.tickSubagentFrame(assistantId)})},150);subagentSpinnerTimers.set(event.subagentId,timer);continue}if(event.type==="subagent.output"){if(debugLogSubagent("cli.subagent.output",{assistantId,subagentId:event.subagentId,stream:event.stream,deltaLen:event.delta?.length,deltaPreview:String(event.delta??"").slice(0,120),ts:Date.now()}),event.stream==="tool"){let toolNameMatch=/^(\S+)\s+\{/.exec(event.delta);if(toolNameMatch){let label=toolNameMatch[1];try{let jsonStr=event.delta.slice(toolNameMatch[1].length).trim(),args=JSON.parse(jsonStr),summary=args.file_path??args.path??args.pattern??formatExecInvocationPreview(args)??args.query??args.file??args.url;if(typeof summary==="string"){let short=summary.length>60?`…${summary.slice(-57)}`:summary;label=`${label} ${short}`}}catch{}debugLogSubagent("cli.subagent.output.upsert_activity",{subagentId:event.subagentId,label,ts:Date.now()}),opts.upsertSubagentInfo(assistantId,event.subagentId,"activity",label)}}continue}if(event.type==="subagent.finished"){debugLogSubagent("cli.subagent.finished",{assistantId,subagentId:event.subagentId,state:event.state,taskDescription:event.taskDescription,stats:event.stats,ts:Date.now()}),clearSubagentSpinner(event.subagentId);let stateLabel=event.state==="completed"?"done":event.state;opts.upsertSubagentInfo(assistantId,event.subagentId,"finished",stateLabel);continue}if(event.type==="subagent.integrated"){debugLogSubagent("cli.subagent.integrated",{assistantId,subagentId:event.subagentId,state:event.state,taskDescription:event.taskDescription,stats:event.stats,timing:event.timing,ts:Date.now()}),opts.upsertSubagentInfo(assistantId,event.subagentId,"integrated","integrated");continue}if(event.type==="run.budget"){let nextBudget=normalizeLastRequestBudget({runId:event.runId,requestId:event.requestId,estimatedInputTokens:event.estimatedInputTokens,thresholdTokens:event.thresholdTokens,plannedOutput:event.plannedOutput,contextWindow:event.contextWindow,usedAutoCompaction:event.usedAutoCompaction,updatedAtMs:Date.now()});opts.state.lastRequestBudget=nextBudget;continue}if(event.type==="run.retrying"){opts.setAssistantStatus(assistantId,t2("chatStatus.retrying",{retry:String(event.retry),maxAttempts:String(event.maxAttempts)}));continue}if(event.type==="run.turn_usage"){opts.applyTurnUsageSummary(event.usageSummary);continue}if(event.type==="context.compression"){let compressionSummary=formatCompressionSummary(event);opts.appendInfoPart(assistantId,compressionSummary.text,{_tone:compressionSummary.tone});continue}if(event.type==="run.finished"){let usageSummary=event.usageSummary;if(debugLogSubagent("cli.run.finished.usage",{assistantId,hasUsageSummary:typeof usageSummary<"u",usageSummary,ts:Date.now()}),typeof usageSummary<"u")opts.applyTurnUsageSummary(usageSummary);clearThinkingState(),opts.setAssistantStatus(assistantId,t2("chatStatus.done")),opts.state.runningAgentRound=!1,clearPendingAction();continue}if(event.type==="run.error"){let usageSummary=event.usageSummary;if(typeof usageSummary<"u")opts.applyTurnUsageSummary(usageSummary);clearThinkingState(),opts.materializeAssistantError(assistantId,event.error),opts.state.runningAgentRound=!1,clearPendingAction(),roundError=Error(formatAgentErrorForUi(event.error))}}}catch(error48){if(!isAbortLikeError(error48)){let normalizedError=error48 instanceof Error?error48:Error(String(error48));roundError=normalizedError,clearThinkingState(),opts.materializeAssistantError(assistantId,normalizedError)}}finally{if(clearSubagentSpinner(),!opts.state.thinking.active||opts.state.thinking.assistantId===assistantId)clearThinkingState();if(!opts.state.paused&&!opts.state.approval.active)opts.state.runningAgentRound=!1;resetActiveRun()}})(),await activeRunPromise,opts.flushPendingAssistantOutput?.(assistantId),pendingInlinePlanMarkdownPath&&!assistantHasMarkdownContent2(opts.state.messages,assistantId)){let inlineMarkdown=await readInlinePlanMarkdown(pendingInlinePlanMarkdownPath),proposedPlanMarkdown=wrapInlinePlanMarkdown2(inlineMarkdown??"");if(proposedPlanMarkdown)opts.appendAssistantMarkdown(assistantId,proposedPlanMarkdown)}if(roundError)return{assistantId,toolCalls,success:!1,error:roundError};if(currentPendingAction&&!pendingAction&&!opts.state.paused&&!sawAssistantDelta&&!sawToolOutput)opts.setAssistantStatus(assistantId,t2("chatStatus.done"));return{assistantId,toolCalls,success:!0}},cancelActiveAgentStream,cancelActiveAgentStreamAndWaitWithTimeout,abortActiveAgentRound}}function createSessionUi(opts){async function compactSession(){return await runManualCompaction({state:opts.state,agent:opts.agent,applyTurnUsageSummary:opts.applyTurnUsageSummary})}let upgradeNotificationTimer=null;function showUpgradeNotification(message){if(opts.state.ui.upgradeNotification.visible=!0,opts.state.ui.upgradeNotification.message=message,upgradeNotificationTimer)clearTimeout(upgradeNotificationTimer);upgradeNotificationTimer=setTimeout(()=>{dismissUpgradeNotification(),upgradeNotificationTimer=null},3000)}function dismissUpgradeNotification(){if(opts.state.ui.upgradeNotification.visible=!1,opts.state.ui.upgradeNotification.message="",upgradeNotificationTimer)clearTimeout(upgradeNotificationTimer),upgradeNotificationTimer=null}let upgradeNotification=g(()=>opts.state.ui.upgradeNotification);return{compactSession,upgradeNotification,showUpgradeNotification,dismissUpgradeNotification}}function parseColorMode(raw){let v2=String(raw??"").trim().toLowerCase();if(!v2)return null;if(v2==="truecolor"||v2==="24bit"||v2==="rgb")return"truecolor";if(v2==="ansi256"||v2==="256"||v2==="xterm256"||v2==="xterm-256color")return"ansi256";if(v2==="ansi16"||v2==="16")return"ansi16";if(v2==="ansi8"||v2==="8")return"ansi8";return null}function levelForMode(mode2){if(mode2==="ansi8")return 8;if(mode2==="ansi16")return 16;return 256}function detectTerminalColorCapability(opts){let env6=opts?.env??{},isTTY=opts?.isTTY??!1,isWindows=String(opts?.platform??"").trim().toLowerCase()==="win32"||String(env6.OS??"").trim().toLowerCase()==="windows_nt",forced=parseColorMode(env6.DIMCODE_COLOR_MODE??env6.VUE_TUI_COLOR_MODE);if(forced)return{mode:forced,level:levelForMode(forced)};if(!isTTY)return{mode:"truecolor",level:256};let termProgram=String(env6.TERM_PROGRAM??"").toLowerCase(),isAppleTerminal=termProgram.includes("apple_terminal"),colorterm=String(env6.COLORTERM??"").toLowerCase();if(!isAppleTerminal&&(colorterm.includes("truecolor")||colorterm.includes("24bit")))return{mode:"truecolor",level:256};if(termProgram.includes("vscode"))return{mode:"truecolor",level:256};if(termProgram.includes("wezterm")||termProgram.includes("alacritty")||termProgram.includes("ghostty")||termProgram.includes("kitty")||termProgram.includes("iterm")||termProgram.includes("windows terminal")||termProgram.includes("windowsterminal")||termProgram.includes("tabby")||termProgram.includes("hyper")||termProgram.includes("rio")||termProgram.includes("contour"))return{mode:"truecolor",level:256};let term=String(env6.TERM??"").toLowerCase();if(isWindows){let hasWindowsTerminal="WT_SESSION"in env6||"WT_PROFILE_ID"in env6||"WT_ID"in env6,hasWezterm="WEZTERM_EXECUTABLE"in env6||"WEZTERM_PANE"in env6,hasAlacritty="ALACRITTY_LOG"in env6||"ALACRITTY_WINDOW_ID"in env6,hasTabby="TABBY_CONFIG_DIRECTORY"in env6;if(hasWindowsTerminal||hasWezterm||hasAlacritty||hasTabby)return{mode:"truecolor",level:256};if(term.includes("xterm")&&term.includes("256color"))return{mode:"truecolor",level:256}}if(term.includes("256color"))return{mode:"ansi256",level:256};if(term.includes("color"))return{mode:"ansi16",level:16};if(term.includes("dumb"))return{mode:"ansi8",level:8};return{mode:"ansi16",level:16}}function createDimSdkState(opts){let initialEnv=opts.context?.env,env6=createEnvReader(initialEnv),initialApprovalMode=resolveInitialApprovalMode(env6),initialMode=typeof opts.agent?.getMode==="function"?opts.agent.getMode():"agent",initialLocale=resolveLocalePreference({explicit:env6.prefixedStr("LANG"),env:initialEnv}),proc=globalThis?.process,cap=detectTerminalColorCapability({env:initialEnv,isTTY:Boolean(proc?.stdout?.isTTY),platform:String(proc?.platform??"")}),initialThemeMode=resolveInitialThemeId(initialEnv,{preferSystemDefault:cap.mode!=="truecolor"});return{state:reactive({config:{...resolveInitialRunConfig(env6)},usage:{prompt_tokens:0,completion_tokens:0,total_tokens:0,budget:4000},lastRequestBudget:null,runningAgentRound:!1,isCompacting:!1,thinking:{active:!1,assistantId:null,blockIndex:null},ui:{mode:initialMode,locale:initialLocale,theme:{mode:initialThemeMode},statusCompact:!1,onboarding:{lastSeenVersion:""},providerFunnel:{counts:{},events:[]},workspaceSelectionByCwd:{},reasoningEffortByModel:{},tipIntensity:DEFAULT_TIP_INTENSITY,shortcuts:{...DEFAULT_SHORTCUTS},recentCommands:[],greeting:{lastSeenDate:""},delight:{compactStreak:0,lastCompactAtMs:0,lastDelightAtMs:0},expandToolCallsAndThinking:!1,upgradeNotification:{visible:!1,message:""},debugLogging:{enabled:!1,auto:!1,mode:"off",directory:"~/.dimcode/debug"},debug:{lastRoundStartedAtMs:0,lastRoundFirstEventAtMs:0,lastRoundDoneAtMs:0,lastRoundHadError:!1},tool:{callId:null,name:"",startedAtMs:0}},context:opts.context,messages:[],sessionHistoryDirty:!1,revertedMessages:[],revertedFilesApplied:!1,fileRevertsByToolCallId:new Map,userHistory:[],layoutDirtyMessageId:null,layoutDirtySeq:0,selectedToolCallId:null,runningToolCallId:null,expandedBashOutputs:new Set,expandedToolOutputLineCounts:new Map,collapsedToolCallIds:new Set,expandedToolCallGroups:new Set,unifiedEditDiffToolCallIds:new Set,sessionId:resolveInitialSessionId(env6),sessionMeta:{...defaultSessionUiMetadata2(),queue:[],status:"idle",lastErrorCode:void 0},paused:null,approval:{active:null,approvedToolCalls:{},pendingAutoRun:null,mode:initialApprovalMode,queue:[],decisions:{}},provider:{activeId:"",activeModelByProvider:{},connections:{},customProviders:[],custom:{baseUrl:void 0,apiKey:void 0,models:[]}},tools:{websearch:{apiKey:"",apiEndpoint:"https://google.serper.dev/search?format=json",numResults:10}},mcp:{servers:[],phase:"ready",connectedCount:0,configuredCount:0}}),env:env6,initialLocale}}var NON_EXPANDABLE_TOOLS=new Set(["read","glob","grep","websearch"]);function isNonExpandableTool(toolName){if(typeof toolName!=="string")return!1;return NON_EXPANDABLE_TOOLS.has(toolName.trim().toLowerCase())}function readPositiveInt(key,fallback,min,max){let raw=String(globalThis?.process?.env?.[key]??"").trim();if(!raw)return fallback;let n2=Number(raw);if(!Number.isFinite(n2)||n2<=0)return fallback;return Math.max(min,Math.min(max,Math.floor(n2)))}var MAX_EXPANDED_TOOL_OUTPUT_LINES=readPositiveInt("DIMCODE_TOOL_OUTPUT_MAX_LINES",2000,1,50000),INITIAL_EXPANDED_TOOL_OUTPUT_LINES=Math.min(MAX_EXPANDED_TOOL_OUTPUT_LINES,readPositiveInt("DIMCODE_TOOL_OUTPUT_INITIAL_LINES",200,20,MAX_EXPANDED_TOOL_OUTPUT_LINES)),LOAD_MORE_TOOL_OUTPUT_LINES=Math.min(MAX_EXPANDED_TOOL_OUTPUT_LINES,readPositiveInt("DIMCODE_TOOL_OUTPUT_LOAD_MORE_LINES",200,20,MAX_EXPANDED_TOOL_OUTPUT_LINES));function clampExpandedToolOutputLines(count){if(!Number.isFinite(count)||count<=0)return INITIAL_EXPANDED_TOOL_OUTPUT_LINES;return Math.max(1,Math.min(MAX_EXPANDED_TOOL_OUTPUT_LINES,Math.floor(count)))}function createToolUiActions(opts){let state=opts.state;function findToolCallInTranscript(callId){let id3=String(callId??"").trim();if(!id3)return null;for(let m2 of state.messages){if(!m2||m2.role!=="assistant")continue;let part=m2.parts?.find((p2)=>p2?.type==="tool_call"&&p2?.call?.id===id3);if(part?.call)return{assistantId:m2.id,call:part.call}}return null}function selectToolCall(callId){if(callId){let found=findToolCallInTranscript(callId);if(isNonExpandableTool(found?.call?.name)){state.selectedToolCallId=null;return}}if(state.selectedToolCallId=callId,callId)opts.scheduleToolCallReadHighlightByCallId({state,callId,mode:"collapsed",updateAssistant:opts.updateAssistant}),opts.scheduleToolCallDiffHighlightByCallId({state,callId,updateAssistant:opts.updateAssistant})}function toggleBashOutput(toolCallId){let found=findToolCallInTranscript(toolCallId);if(String(found?.call?.name??"").trim().toLowerCase()==="read")return;let newSet=new Set(state.expandedBashOutputs),nextLineCounts=new Map(state.expandedToolOutputLineCounts);if(newSet.has(toolCallId))newSet.delete(toolCallId),nextLineCounts.delete(toolCallId);else newSet.add(toolCallId),nextLineCounts.set(toolCallId,clampExpandedToolOutputLines(INITIAL_EXPANDED_TOOL_OUTPUT_LINES));if(state.expandedBashOutputs=newSet,state.expandedToolOutputLineCounts=nextLineCounts,newSet.has(toolCallId))opts.scheduleToolCallReadHighlightByCallId({state,callId:toolCallId,mode:"expanded",updateAssistant:opts.updateAssistant})}function loadMoreBashOutput(toolCallId){let id3=String(toolCallId??"").trim();if(!id3||!state.expandedBashOutputs.has(id3))return;let next=new Map(state.expandedToolOutputLineCounts),current=clampExpandedToolOutputLines(Number(next.get(id3)??INITIAL_EXPANDED_TOOL_OUTPUT_LINES));next.set(id3,clampExpandedToolOutputLines(current+LOAD_MORE_TOOL_OUTPUT_LINES)),state.expandedToolOutputLineCounts=next;let found=findToolCallInTranscript(id3);if(String(found?.call?.name??"").trim().toLowerCase()==="read")opts.scheduleToolCallReadHighlightByCallId({state,callId:id3,mode:"expanded",updateAssistant:opts.updateAssistant})}function toggleEditDiffLayout(toolCallId){let found=findToolCallInTranscript(toolCallId);if(String(found?.call?.name??"").trim().toLowerCase()!=="edit")return;let next=new Set(state.unifiedEditDiffToolCallIds);if(next.has(toolCallId))next.delete(toolCallId);else next.add(toolCallId);state.unifiedEditDiffToolCallIds=next}function toggleToolCallCollapsed(toolCallId){let id3=String(toolCallId??"").trim();if(!id3)return;let next=new Set(state.collapsedToolCallIds);if(next.has(id3))next.delete(id3);else next.add(id3);state.collapsedToolCallIds=next}function toggleToolCallGroupCollapsed(groupKey){let id3=String(groupKey??"").trim();if(!id3)return;if(!state.collapsedToolCallIds.has(id3)||state.expandedToolCallGroups.has(id3)){let nextCollapsed=new Set(state.collapsedToolCallIds);nextCollapsed.add(id3);let childIds=findGroupChildCallIds(id3);for(let cid of childIds)nextCollapsed.add(cid);if(state.collapsedToolCallIds=nextCollapsed,state.expandedToolCallGroups.has(id3)){let nextExpanded=new Set(state.expandedToolCallGroups);nextExpanded.delete(id3),state.expandedToolCallGroups=nextExpanded}}else{let nextExpanded=new Set(state.expandedToolCallGroups);nextExpanded.add(id3),state.expandedToolCallGroups=nextExpanded}}function findGroupChildCallIds(groupKey){for(let m2 of state.messages){if(!m2||m2.role!=="assistant")continue;let parts=m2.parts;if(!parts)continue;let foundIdx=-1;for(let i2=0;i2<parts.length;i2++)if(parts[i2]?.type==="tool_call"&&parts[i2]?.call?.id===groupKey){foundIdx=i2;break}if(foundIdx<0)continue;let toolName=String(parts[foundIdx]?.call?.name??"").trim().toLowerCase(),childIds=[];for(let i2=foundIdx+1;i2<parts.length;i2++){let p2=parts[i2];if(p2?.type==="tool_call")if(String(p2.call?.name??"").trim().toLowerCase()===toolName)childIds.push(p2.call.id);else break;else if(p2?.type==="tool_output"||p2?.type==="tool_result"||p2?.type==="approve")continue;else break}return childIds}return[]}function toggleToolCallGroup(groupKey){let id3=String(groupKey??"").trim();if(!id3)return;let next=new Set(state.expandedToolCallGroups);if(next.has(id3)){if(next.delete(id3),state.selectedToolCallId){let childIds=findGroupChildCallIds(id3);if(state.selectedToolCallId===id3||childIds.includes(state.selectedToolCallId))state.selectedToolCallId=null}}else next.add(id3);state.expandedToolCallGroups=next}function clearCollapsedToolCalls(){if(state.collapsedToolCallIds.size===0)return;state.collapsedToolCallIds=new Set}function setAllThinkingCollapsed(collapsed){for(let msg of state.messages){if(!msg||msg.role!=="assistant")continue;opts.updateAssistant(msg.id,(m2)=>{let changed=!1,parts=m2.parts.map((p2)=>{if(p2.type!=="thinking")return p2;if(p2.collapsed===collapsed)return p2;return changed=!0,{...p2,collapsed}});return changed?{...m2,parts}:m2})}}return{selectToolCall,toggleBashOutput,loadMoreBashOutput,toggleEditDiffLayout,toggleToolCallCollapsed,toggleToolCallGroupCollapsed,toggleToolCallGroup,clearCollapsedToolCalls,setAllThinkingCollapsed}}function createUiState(opts){function setMode(modeId){if(opts.state.ui.mode=modeId,typeof opts.agent.setMode==="function")opts.agent.setMode(modeId)}function getMode(){if(typeof opts.agent.getMode==="function")return opts.agent.getMode()||"agent";return opts.state.ui.mode??"agent"}return{setMode,getMode}}function createUiSync(opts){watch(()=>opts.state.ui.locale,(next)=>{let locale=String(next||"").trim()||opts.initialLocale;opts.setLocale(locale)},{immediate:!0}),watch(()=>opts.state.ui.theme.mode,(mode2,prev)=>{let nextMode=opts.normalizeThemeMode(mode2),prevMode=opts.normalizeThemeMode(prev);if(nextMode===prevMode)return;let selected=opts.state.selectedToolCallId;if(selected){let viewMode=opts.state.expandedBashOutputs.has(selected)?"expanded":"collapsed";opts.scheduleToolCallReadHighlightByCallId({state:opts.state,callId:selected,mode:viewMode,updateAssistant:opts.updateAssistant}),opts.scheduleToolCallDiffHighlightByCallId({state:opts.state,callId:selected,updateAssistant:opts.updateAssistant})}for(let m2 of opts.state.messages){if(!m2||m2.role!=="assistant"||!Array.isArray(m2.parts))continue;let id3=String(m2.id??"").trim();if(!id3)continue;if(!m2.parts.some((p2)=>p2?.type==="markdown"&&String(p2?.markdown??"").includes("```")))continue;opts.scheduleAssistantMarkdownCodeHighlight({state:opts.state,assistantId:id3,updateAssistant:opts.updateAssistant})}});let mdHighlightSigByAssistantId=new Map,transcriptSignature=g(()=>{let msgs=opts.state.messages,firstId=String(msgs[0]?.id??""),lastId=String(msgs[msgs.length-1]?.id??"");return`${String(opts.state.sessionId??"")}|${msgs.length}|${firstId}|${lastId}`});watch(transcriptSignature,()=>{let globallyIdle=!(opts.state.runningAgentRound||opts.state.runningToolCallId);for(let m2 of opts.state.messages){if(!m2||m2.role!=="assistant"||!Array.isArray(m2.parts))continue;let id3=String(m2.id??"").trim();if(!id3)continue;if(!m2.parts.some((p2)=>p2?.type==="markdown"&&String(p2?.markdown??"").includes("```")))continue;let sig=m2.parts.filter((p2)=>p2?.type==="markdown").map((p2)=>{let md=String(p2?.markdown??"");if(!md.includes("```"))return"";let tail=md.length>16?md.slice(-16):md;return`${md.length}:${tail}`}).filter(Boolean).join("|");if(!sig)continue;if(mdHighlightSigByAssistantId.get(id3)===sig)continue;mdHighlightSigByAssistantId.set(id3,sig),opts.scheduleAssistantMarkdownCodeHighlight({state:opts.state,assistantId:id3,updateAssistant:opts.updateAssistant,force:globallyIdle})}},{immediate:!0})}function createDimSdkStore(opts){let externalAgentProvided=Boolean(opts.agent),{state,initialLocale}=createDimSdkState({context:opts.context,agent:opts.agent}),agent=opts.agent,usagePct=g(()=>{let budget=normalizeLastRequestBudget(state.lastRequestBudget);if(!budget)return 0;return Math.min(1,budget.estimatedInputTokens/Math.max(1,budget.contextWindow))}),{hydrateSessionUsageTotals,applyTurnUsageSummary,resetSessionUsageState}=createSessionUsagePersistence({state}),{setFocusFiles,setCwd,setEnvVar,setAgent,setThemeMode}=createContextActions(state),messagePipeline=createMessagePipeline({state,debugLog:debugLog2}),{pushMessage,setSessionHistoryDirty,replaceMessage,updateAssistant,setAssistantStatus,setAssistantThinking,startNewThinkingBlock,endThinkingBlock,appendAssistantMarkdown,appendInfoPart,upsertSubagentInfo,tickSubagentFrame,upsertToolCallDelta,upsertToolCallEndWithHighlights,upsertToolOutputStart,appendToolOutputDelta,attachToolResultPart,insertApprovalPart,toggleChecklist,toggleBlockCollapsed,replaceMessages,materializeAssistantError,flushPendingAssistantOutput,scheduleToolResultHighlight:scheduleToolResultHighlight2,hasRevertedMessages,revertedMessageCount,revertFromMessage,revertFilesFromMessage,restoreRevertedMessages,clearRevertedMessages,upsertChecklistPartFromDimSdk}=messagePipeline,toolUiActions=createToolUiActions({state,updateAssistant,scheduleToolCallReadHighlightByCallId,scheduleToolCallDiffHighlightByCallId}),{selectToolCall,toggleBashOutput,loadMoreBashOutput,toggleEditDiffLayout,toggleToolCallCollapsed,toggleToolCallGroupCollapsed,toggleToolCallGroup,clearCollapsedToolCalls,setAllThinkingCollapsed}=toolUiActions,sendQueue=createSendQueue(),{enqueue:enqueueSendLoop,serializeReceive}=sendQueue,sendLoopState={inSendQueueRun:!1},isInSendQueueRun=()=>sendLoopState.inSendQueueRun,streamRunner=createNativeStreamRunner({state,agent,id:id2,pushMessage,updateAssistant,setAssistantStatus,setAssistantThinking,startNewThinkingBlock,endThinkingBlock,appendAssistantMarkdown,appendInfoPart,upsertSubagentInfo,tickSubagentFrame,upsertToolCallDelta,upsertToolCallEnd:upsertToolCallEndWithHighlights,upsertToolOutputStart,appendToolOutputDelta,insertApprovalPart,attachToolResultPart,scheduleToolResultHighlight:scheduleToolResultHighlight2,upsertChecklistPartFromDimSdk,flushPendingAssistantOutput,applyTurnUsageSummary,materializeAssistantError}),{runAgentRound,cancelActiveAgentStream,cancelActiveAgentStreamAndWaitWithTimeout,abortActiveAgentRound}=streamRunner,{runAgentRound:runAgentRoundWithAutoCompact}=createAutoCompactFallbackRunner({state,agent,id:id2,pushMessage,updateAssistant,flushPendingAssistantOutput,applyTurnUsageSummary,runAgentRound:(o2)=>runAgentRound(o2)}),toolExecution=createToolExecution({state,externalAgentProvided,toolRunner:opts.toolRunner,id:id2,pushMessage,updateAssistant,setAssistantStatus,insertApprovalPart,attachToolResultPart,runAgentRound:(o2)=>runAgentRoundWithAutoCompact(o2),sleep,serializeReceive,isInSendQueueRun}),{ensureApproved,findToolCall,resolveActiveApproval,runToolCall}=toolExecution,sendInterrupt=createSendInterrupt({state,abortActiveAgentRound,cancelActiveAgentStream,cancelActiveAgentStreamAndWaitWithTimeout,setSessionHistoryDirty,setAssistantStatus,findToolCall,runAgentRound:(o2)=>runAgentRoundWithAutoCompact(o2),serializeReceive,interruptSession:async(sessionId)=>{let interruptSession=agent.sessions?.interrupt;if(!sessionId||typeof interruptSession!=="function")return;try{await interruptSession(sessionId)}catch(error48){debugLog2("agent_interrupt_session_error",error48 instanceof Error?{session_id:sessionId,message:error48.message,stack:error48.stack}:{session_id:sessionId,error:String(error48)})}}}),{interrupt,interruptAndWait,submitAskUserAnswers,cancelAskUser,getEpoch}=sendInterrupt,sendLoop=createSendLoop({state,externalAgentProvided,id:id2,pushMessage,replaceMessage,setAssistantStatus,setFocusFiles,runAgentRound:(o2)=>runAgentRoundWithAutoCompact(o2),abortActiveAgentRound,cancelActiveAgentStream,cancelActiveAgentStreamAndWaitWithTimeout,ensureApproved,runToolCall,resolveActiveApproval,sleep,yieldToEventLoop,enqueue:enqueueSendLoop,setInSendQueueRun:(value)=>{sendLoopState.inSendQueueRun=value},interruptAndWait,getInterruptEpoch:getEpoch,rewriteUserInput:async({content,sessionId})=>{return(await rewriteOversizedInputToReference({content,sessionId,source:"chat_input"})).content}}),{send}=sendLoop,steer=async(input)=>{let content=normalizeText11(input);if(!content)return!1;if(state.runningAgentRound){let sessionId=String(state.sessionId??"").trim();if(!sessionId||typeof agent.steerSession!=="function")return!1;try{return await agent.steerSession(sessionId,content)}catch(error48){return debugLog2("agent_steer_error",error48 instanceof Error?{session_id:sessionId,message:error48.message,stack:error48.stack}:{session_id:sessionId,error:String(error48)}),!1}}return await send({content,steer:!0}),!0};createApprovalsFlow({state,resolveActiveApproval,isInSendQueueRun}),createUiSync({state,initialLocale,setLocale:(locale)=>{let normalized=normalizeLocale(locale);if(normalized)setLocale(normalized)},normalizeThemeMode,scheduleToolCallReadHighlightByCallId,scheduleToolCallDiffHighlightByCallId,scheduleAssistantMarkdownCodeHighlight,updateAssistant});let{setMode,getMode}=createUiState({state,agent}),{compactSession,upgradeNotification,showUpgradeNotification,dismissUpgradeNotification}=createSessionUi({state,agent,applyTurnUsageSummary});return{state,agent,usagePct,scheduleToolResultHighlight:scheduleToolResultHighlight2,selectToolCall,toggleBashOutput,loadMoreBashOutput,toggleEditDiffLayout,toggleChecklist,toggleBlockCollapsed,toggleToolCallCollapsed,toggleToolCallGroupCollapsed,toggleToolCallGroup,clearCollapsedToolCalls,setAllThinkingCollapsed,send,steer,sendUser:send,sendUserInput:(input)=>send(input),setFocusFiles,setCwd,setEnvVar,setAgent,setThemeMode,replaceMessages,flushPendingAssistantOutput,approve:()=>resolveActiveApproval("approved"),deny:()=>resolveActiveApproval("denied"),runToolCall,interrupt,interruptAndWait,submitAskUserAnswers,cancelAskUser,revertFromMessage,revertFilesFromMessage,restoreRevertedMessages,clearRevertedMessages,hasRevertedMessages,revertedMessageCount,setMode,getMode,compactSession,upgradeNotification,showUpgradeNotification,dismissUpgradeNotification,hydrateSessionUsageTotals,resetSessionUsageState}}import{Stream}from"node:stream";import process23 from"node:process";var import_react10=__toESM(require_react_development(),1);import process22 from"node:process";function debounce(func,debounceMs,{signal,edges}={}){let pendingThis=void 0,pendingArgs=null,leading=edges!=null&&edges.includes("leading"),trailing=edges==null||edges.includes("trailing"),invoke=()=>{if(pendingArgs!==null)func.apply(pendingThis,pendingArgs),pendingThis=void 0,pendingArgs=null},onTimerEnd=()=>{if(trailing)invoke();cancel()},timeoutId=null,schedule=()=>{if(timeoutId!=null)clearTimeout(timeoutId);timeoutId=setTimeout(()=>{timeoutId=null,onTimerEnd()},debounceMs)},cancelTimer=()=>{if(timeoutId!==null)clearTimeout(timeoutId),timeoutId=null},cancel=()=>{cancelTimer(),pendingThis=void 0,pendingArgs=null},flush=()=>{invoke()},debounced=function(...args){if(signal?.aborted)return;pendingThis=this,pendingArgs=args;let isFirstCall=timeoutId==null;if(schedule(),leading&&isFirstCall)invoke()};return debounced.schedule=schedule,debounced.cancel=cancel,debounced.flush=flush,signal?.addEventListener("abort",cancel,{once:!0}),debounced}function debounce2(func,debounceMs=0,options={}){if(typeof options!=="object")options={};let{leading=!1,trailing=!0,maxWait}=options,edges=Array(2);if(leading)edges[0]="leading";if(trailing)edges[1]="trailing";let result=void 0,pendingAt=null,_debounced=debounce(function(...args){result=func.apply(this,args),pendingAt=null},debounceMs,{edges}),debounced=function(...args){if(maxWait!=null){if(pendingAt===null)pendingAt=Date.now();if(Date.now()-pendingAt>=maxWait)return result=func.apply(this,args),pendingAt=Date.now(),_debounced.cancel(),_debounced.schedule(),result}return _debounced.apply(this,args),result},flush=()=>{return _debounced.flush(),result};return debounced.cancel=_debounced.cancel,debounced.flush=flush,debounced}function throttle(func,throttleMs=0,options={}){let{leading=!0,trailing=!0}=options;return debounce2(func,throttleMs,{leading,maxWait:throttleMs,trailing})}var exports_base={};__export(exports_base,{synchronizedOutput:()=>synchronizedOutput,setCwd:()=>setCwd,scrollUp:()=>scrollUp,scrollDown:()=>scrollDown,link:()=>link,image:()=>image,iTerm:()=>iTerm,exitAlternativeScreen:()=>exitAlternativeScreen,eraseUp:()=>eraseUp,eraseStartLine:()=>eraseStartLine,eraseScreen:()=>eraseScreen,eraseLines:()=>eraseLines,eraseLine:()=>eraseLine,eraseEndLine:()=>eraseEndLine,eraseDown:()=>eraseDown,enterAlternativeScreen:()=>enterAlternativeScreen,endSynchronizedOutput:()=>endSynchronizedOutput,cursorUp:()=>cursorUp,cursorTo:()=>cursorTo,cursorShow:()=>cursorShow,cursorSavePosition:()=>cursorSavePosition,cursorRestorePosition:()=>cursorRestorePosition,cursorPrevLine:()=>cursorPrevLine,cursorNextLine:()=>cursorNextLine,cursorMove:()=>cursorMove,cursorLeft:()=>cursorLeft,cursorHide:()=>cursorHide,cursorGetPosition:()=>cursorGetPosition,cursorForward:()=>cursorForward,cursorDown:()=>cursorDown,cursorBackward:()=>cursorBackward,clearViewport:()=>clearViewport,clearTerminal:()=>clearTerminal,clearScreen:()=>clearScreen,beginSynchronizedOutput:()=>beginSynchronizedOutput,beep:()=>beep,ConEmu:()=>ConEmu});import process13 from"node:process";import os7 from"node:os";var isBrowser=globalThis.window?.document!==void 0,isNode=globalThis.process?.versions?.node!==void 0,isBun=globalThis.process?.versions?.bun!==void 0,isDeno=globalThis.Deno?.version?.deno!==void 0,isElectron=globalThis.process?.versions?.electron!==void 0,isJsDom=globalThis.navigator?.userAgent?.includes("jsdom")===!0,isWebWorker=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope,isDedicatedWorker=typeof DedicatedWorkerGlobalScope<"u"&&globalThis instanceof DedicatedWorkerGlobalScope,isSharedWorker=typeof SharedWorkerGlobalScope<"u"&&globalThis instanceof SharedWorkerGlobalScope,isServiceWorker=typeof ServiceWorkerGlobalScope<"u"&&globalThis instanceof ServiceWorkerGlobalScope,platform=globalThis.navigator?.userAgentData?.platform,isMacOs=platform==="macOS"||globalThis.navigator?.platform==="MacIntel"||globalThis.navigator?.userAgent?.includes(" Mac ")===!0||globalThis.process?.platform==="darwin",isWindows=platform==="Windows"||globalThis.navigator?.platform==="Win32"||globalThis.process?.platform==="win32",isLinux=platform==="Linux"||globalThis.navigator?.platform?.startsWith("Linux")===!0||globalThis.navigator?.userAgent?.includes(" Linux ")===!0||globalThis.process?.platform==="linux",isIos=platform==="iOS"||globalThis.navigator?.platform==="MacIntel"&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),isAndroid=platform==="Android"||globalThis.navigator?.platform==="Android"||globalThis.navigator?.userAgent?.includes(" Android ")===!0||globalThis.process?.platform==="android";var ESC="\x1B[",OSC="\x1B]",BEL="\x07",SEP=";",isTerminalApp=!isBrowser&&process13.env.TERM_PROGRAM==="Apple_Terminal",isWindows2=!isBrowser&&process13.platform==="win32",isTmux=!isBrowser&&(process13.env.TERM?.startsWith("screen")||process13.env.TERM?.startsWith("tmux")||process13.env.TMUX!==void 0),cwdFunction=isBrowser?()=>{throw Error("`process.cwd()` only works in Node.js, not the browser.")}:process13.cwd,wrapOsc=(sequence)=>{if(isTmux)return"\x1BPtmux;"+sequence.replaceAll("\x1B","\x1B\x1B")+"\x1B\\";return sequence},cursorTo=(x2,y2)=>{if(typeof x2!=="number")throw TypeError("The `x` argument is required");if(typeof y2!=="number")return ESC+(x2+1)+"G";return ESC+(y2+1)+SEP+(x2+1)+"H"},cursorMove=(x2,y2)=>{if(typeof x2!=="number")throw TypeError("The `x` argument is required");let returnValue="";if(x2<0)returnValue+=ESC+-x2+"D";else if(x2>0)returnValue+=ESC+x2+"C";if(y2<0)returnValue+=ESC+-y2+"A";else if(y2>0)returnValue+=ESC+y2+"B";return returnValue},cursorUp=(count=1)=>ESC+count+"A",cursorDown=(count=1)=>ESC+count+"B",cursorForward=(count=1)=>ESC+count+"C",cursorBackward=(count=1)=>ESC+count+"D",cursorLeft=ESC+"G",cursorSavePosition=isTerminalApp?"\x1B7":ESC+"s",cursorRestorePosition=isTerminalApp?"\x1B8":ESC+"u",cursorGetPosition=ESC+"6n",cursorNextLine=ESC+"E",cursorPrevLine=ESC+"F",cursorHide=ESC+"?25l",cursorShow=ESC+"?25h",eraseLines=(count)=>{let clear="";for(let i2=0;i2<count;i2++)clear+=eraseLine+(i2<count-1?cursorUp():"");if(count)clear+=cursorLeft;return clear},eraseEndLine=ESC+"K",eraseStartLine=ESC+"1K",eraseLine=ESC+"2K",eraseDown=ESC+"J",eraseUp=ESC+"1J",eraseScreen=ESC+"2J",scrollUp=ESC+"S",scrollDown=ESC+"T",clearScreen="\x1Bc",clearViewport=`${eraseScreen}${ESC}H`,isOldWindows=()=>{if(isBrowser||!isWindows2)return!1;let parts=os7.release().split("."),major=Number(parts[0]),build=Number(parts[2]??0);if(major<10)return!0;if(major===10&&build<10586)return!0;return!1},clearTerminal=isOldWindows()?`${eraseScreen}${ESC}0f`:`${eraseScreen}${ESC}3J${ESC}H`,enterAlternativeScreen=ESC+"?1049h",exitAlternativeScreen=ESC+"?1049l",beginSynchronizedOutput=ESC+"?2026h",endSynchronizedOutput=ESC+"?2026l",synchronizedOutput=(text)=>beginSynchronizedOutput+text+endSynchronizedOutput,beep=BEL,link=(text,url2)=>{let openLink=wrapOsc(`${OSC}8${SEP}${SEP}${url2}${BEL}`),closeLink=wrapOsc(`${OSC}8${SEP}${SEP}${BEL}`);return openLink+text+closeLink},image=(data,options={})=>{let returnValue=`${OSC}1337;File=inline=1`;if(options.width)returnValue+=`;width=${options.width}`;if(options.height)returnValue+=`;height=${options.height}`;if(options.preserveAspectRatio===!1)returnValue+=";preserveAspectRatio=0";let imageBuffer=Buffer.from(data);return wrapOsc(returnValue+`;size=${imageBuffer.byteLength}:`+imageBuffer.toString("base64")+BEL)},iTerm={setCwd:(cwd=cwdFunction())=>wrapOsc(`${OSC}50;CurrentDir=${cwd}${BEL}`),annotation(message,options={}){let returnValue=`${OSC}1337;`,hasX=options.x!==void 0,hasY=options.y!==void 0;if((hasX||hasY)&&!(hasX&&hasY&&options.length!==void 0))throw Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");if(message=message.replaceAll("|",""),returnValue+=options.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",options.length>0)returnValue+=(hasX?[message,options.length,options.x,options.y]:[options.length,message]).join("|");else returnValue+=message;return wrapOsc(returnValue+BEL)}},ConEmu={setCwd:(cwd=cwdFunction())=>wrapOsc(`${OSC}9;9;${cwd}${BEL}`)},setCwd=(cwd=cwdFunction())=>iTerm.setCwd(cwd)+ConEmu.setCwd(cwd);import{env as env6}from"node:process";var isInCi=env6.CI!=="0"&&env6.CI!=="false"&&(("CI"in env6)||("CONTINUOUS_INTEGRATION"in env6)||Object.keys(env6).some((key)=>key.startsWith("CI_"))),is_in_ci_default=isInCi;var getAllProperties=(object4)=>{let properties=new Set;do for(let key of Reflect.ownKeys(object4))properties.add([object4,key]);while((object4=Reflect.getPrototypeOf(object4))&&object4!==Object.prototype);return properties};function autoBind(self2,{include,exclude}={}){let filter3=(key)=>{let match=(pattern)=>typeof pattern==="string"?key===pattern:pattern.test(key);if(include)return include.some(match);if(exclude)return!exclude.some(match);return!0};for(let[object4,key]of getAllProperties(self2.constructor.prototype)){if(key==="constructor"||!filter3(key))continue;let descriptor=Reflect.getOwnPropertyDescriptor(object4,key);if(descriptor&&typeof descriptor.value==="function")self2[key]=self2[key].bind(self2)}return self2}var import_signal_exit2=__toESM(require_signal_exit(),1);import{PassThrough as PassThrough2}from"node:stream";var consoleMethods=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],originalMethods={},patchConsole=(callback)=>{let stdout=new PassThrough2,stderr=new PassThrough2;stdout.write=(data)=>{callback("stdout",data)},stderr.write=(data)=>{callback("stderr",data)};let internalConsole=new console.Console(stdout,stderr);for(let method2 of consoleMethods)originalMethods[method2]=console[method2],console[method2]=internalConsole[method2];return()=>{for(let method2 of consoleMethods)console[method2]=originalMethods[method2];originalMethods={}}},dist_default=patchConsole;var loadYoga=(()=>{var _scriptDir=import.meta.url;return function(loadYoga2){loadYoga2=loadYoga2||{};var h2;h2||(h2=typeof loadYoga2<"u"?loadYoga2:{});var aa,ca;h2.ready=new Promise(function(a2,b2){aa=a2,ca=b2});var da=Object.assign({},h2),q="";typeof document<"u"&&document.currentScript&&(q=document.currentScript.src),_scriptDir&&(q=_scriptDir),q.indexOf("blob:")!==0?q=q.substr(0,q.replace(/[?#].*/,"").lastIndexOf("/")+1):q="";var ea=h2.print||console.log.bind(console),v2=h2.printErr||console.warn.bind(console);Object.assign(h2,da),da=null;var w2;h2.wasmBinary&&(w2=h2.wasmBinary);var noExitRuntime=h2.noExitRuntime||!0;typeof WebAssembly!="object"&&x2("no native wasm support detected");var fa,ha=!1;function z2(a2,b2,c){c=b2+c;for(var d2="";!(b2>=c);){var e2=a2[b2++];if(!e2)break;if(e2&128){var f2=a2[b2++]&63;if((e2&224)==192)d2+=String.fromCharCode((e2&31)<<6|f2);else{var g2=a2[b2++]&63;e2=(e2&240)==224?(e2&15)<<12|f2<<6|g2:(e2&7)<<18|f2<<12|g2<<6|a2[b2++]&63,65536>e2?d2+=String.fromCharCode(e2):(e2-=65536,d2+=String.fromCharCode(55296|e2>>10,56320|e2&1023))}}else d2+=String.fromCharCode(e2)}return d2}var ia,ja,A,C,ka,D,E2,la,ma;function na(){var a2=fa.buffer;ia=a2,h2.HEAP8=ja=new Int8Array(a2),h2.HEAP16=C=new Int16Array(a2),h2.HEAP32=D=new Int32Array(a2),h2.HEAPU8=A=new Uint8Array(a2),h2.HEAPU16=ka=new Uint16Array(a2),h2.HEAPU32=E2=new Uint32Array(a2),h2.HEAPF32=la=new Float32Array(a2),h2.HEAPF64=ma=new Float64Array(a2)}var oa,pa=[],qa=[],ra=[];function sa(){var a2=h2.preRun.shift();pa.unshift(a2)}var F=0,ta=null,G=null;function x2(a2){if(h2.onAbort)h2.onAbort(a2);throw a2="Aborted("+a2+")",v2(a2),ha=!0,a2=new WebAssembly.RuntimeError(a2+". Build with -sASSERTIONS for more info."),ca(a2),a2}function ua(a2){return a2.startsWith("data:application/octet-stream;base64,")}var H="data:application/octet-stream;base64,AGFzbQEAAAABugM3YAF/AGACf38AYAF/AX9gA39/fwBgAn98AGACf38Bf2ADf39/AX9gBH9/f30BfWADf398AGAAAGAEf39/fwBgAX8BfGACf38BfGAFf39/f38Bf2AAAX9gA39/fwF9YAZ/f31/fX8AYAV/f39/fwBgAn9/AX1gBX9/f319AX1gAX8BfWADf35/AX5gB39/f39/f38AYAZ/f39/f38AYAR/f39/AX9gBn9/f319fQF9YAR/f31/AGADf399AX1gBn98f39/fwF/YAR/fHx/AGACf30AYAh/f39/f39/fwBgDX9/f39/f39/f39/f38AYAp/f39/f39/f39/AGAFf39/f38BfGAEfHx/fwF9YA1/fX1/f399fX9/f39/AX9gB39/f319f38AYAJ+fwF/YAN/fX0BfWABfAF8YAN/fHwAYAR/f319AGAHf39/fX19fQF9YA1/fX99f31/fX19fX1/AX9gC39/f39/f399fX19AX9gCH9/f39/f319AGAEf39+fgBgB39/f39/f38Bf2ACfH8BfGAFf398fH8AYAN/f38BfGAEf39/fABgA39/fQBgBn9/fX99fwF/ArUBHgFhAWEAHwFhAWIAAwFhAWMACQFhAWQAFgFhAWUAEQFhAWYAIAFhAWcAAAFhAWgAIQFhAWkAAwFhAWoAAAFhAWsAFwFhAWwACgFhAW0ABQFhAW4AAwFhAW8AAQFhAXAAFwFhAXEABgFhAXIAAAFhAXMAIgFhAXQACgFhAXUADQFhAXYAFgFhAXcAAgFhAXgAAwFhAXkAGAFhAXoAAgFhAUEAAQFhAUIAEQFhAUMAAQFhAUQAAAOiAqACAgMSBwcACRkDAAoRBgYKEwAPDxMBBiMTCgcHGgMUASQFJRQHAwMKCgMmAQYYDxobFAAKBw8KBwMDAgkCAAAFGwACBwIHBgIDAQMIDAABKAkHBQURACkZASoAAAIrLAIALQcHBy4HLwkFCgMCMA0xAgMJAgACAQYKAQIBBQEACQIFAQEABQAODQ0GFQIBHBUGAgkCEAAAAAUyDzMMBQYINAUCAwUODg41AgMCAgIDBgICNgIBDAwMAQsLCwsLCx0CAAIAAAABABABBQICAQMCEgMMCwEBAQEBAQsLAQICAwICAgICAgIDAgIICAEICAgEBAQEBAQEBAQABAQABAQEBAAE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GiABQQA2AvADIAFCADcC6AMgAigC7AMiAyACKALoAyIERwRAIAMgBGsiBEEASA0FIAEgBBAeIgM2AuwDIAEgAzYC6AMgASADIARqNgLwAyACKALoAyIEIAIoAuwDIghHBEADQCADIAQoAgA2AgAgA0EEaiEDIARBBGoiBCAIRw0ACwsgASADNgLsAwsgASACKQL0AzcC9AMgASACKAKEBDYChAQgASACKQL8AzcC/AMgAUEANgLkAwsgBSABNgIAIAEgADYC5AMLIAZBAWohBiAFQQRqIgUgB0cNAAsLDwsQAgALUAACQAJAAkACQAJAIAIOBAQAAQIDCyAAIAEgAUEwahBDDwsgACABIAFBMGogAxBEDwsgACABIAFBMGoQQg8LECQACyAAIAEgAUEwaiADEEULcAIBfwF9IwBBEGsiBCQAIARBCGogACABQQJ0QdwlaigCACACEDZDAADAfyEFAkACQAJAIAQtAAxBAWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwt5AgF/AX0jAEEQayIDJAAgA0EIaiAAIAFBAnRB7CVqKAIAIAIQU0MAAMB/IQQCQAJAAkAgAy0ADEEBaw4CAAECCyADKgIIIQQMAQsgAyoCCEMAAAAAlEMK1yM8lCEECyADQRBqJAAgBEMAAAAAl0MAAAAAIAQgBFsbC1QAAkACQAJAAkACQCACDgQEAAECAwsgACABIAFBwgBqEEMPCyAAIAEgAUHCAGogAxBEDwsgACABIAFBwgBqEEIPCxAkAAsgACABIAFBwgBqIAMQRQsvACAAIAJFQQF0IgIgASADEGAgACACIAEQS5IgACACIAEgAxB/IAAgAiABEFKSkgvOAQIDfwJ9IwBBEGsiAyQAQQEhBCADQQhqIABB/ABqIgUgACABQQF0akH2AGoiAS8BABAfAkACQCADKgIIIgcgAioCACIGXARAIAcgB1sEQCACLQAEIQIMAgsgBiAGXCEECyACLQAEIQIgBEUNACADLQAMIAJB/wFxRg0BCyAFIAEgBiACEDkDQCAALQAAIgFBBHENASAAIAFBBHI6AAAgACgCECIBBEAgACABEQAACyAAQYCAgP4HNgKcASAAKALkAyIADQALCyADQRBqJAALzgECA38CfSMAQRBrIgMk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AWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwscACAAIAFBCCACpyACQiCIpyADpyADQiCIpxAVCwUAEFgACzkAIABFBEBBAA8LAn8gAUGAf3FBgL8DRiABQf8ATXJFBEBB/DtBGTYCAEF/DAELIAAgAToAAEEBCwvEAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABQQlrDhIACgsMCgsCAwQFDAsMDAoLBwgJCyACIAIoAgAiAUEEajYCACAAIAEoAgA2AgAPCwALIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LAAsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAQALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC84BAgN/An0jAEEQayIDJABBASEEIANBCGogAEH8AGoiBSAAIAFBAXRqQegAaiIBLwEAEB8CQAJAIAMqAggiByACKgIAIgZcBEAgByAHWwRAIAItAAQhAgwCCyAGIAZcIQQLIAItAAQhAiAERQ0AIAMtAAwgAkH/AXFGDQELIAUgASAGIAIQOQNAIAAtAAAiAUEEcQ0BIAAgAUEEcjoAACAAKAIQIgEEQCAAIAERAAALIABBgICA/gc2ApwBIAAoAuQDIgANAAsLIANBEGokAAtdAQR/IAAoAgAhAgNAIAIsAAAiAxBXBEBBfyEEIAAgAkEBaiICNgIAIAFBzJmz5gBNBH9BfyADQTBrIgMgAUEKbCIEaiADIARB/////wdzShsFIAQLIQEMAQsLIAELrhQCEn8BfiMAQdAAayIIJAAgCCABNgJMIAhBN2ohFyAIQThqIRQCQAJAAkACQANAIAEhDSAHIA5B/////wdzSg0BIAcgDmohDgJAAkACQCANIgctAAAiCQRAA0ACQAJAIAlB/wFxIgFFBEAgByEBDAELIAFBJUcNASAH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IQEgAEIANwIEIAAgATYCACABIAA2AgQgAkEQaiQAIAALGwEBfyAABEAgACgCACIBBEAgARAjCyAAECMLC0kBAn9BBBAeIQFBIBAeIgBBADYCHCAAQoCAgICAgIDAPzcCFCAAQgA3AgwgAEEAOgAIIABBAzYCBCAAQQA2AgAgASAANgIAIAELIAAgAkEFR0EAIAIbRQRAQbgwIAMgBBBJDwsgAyAEEHALIgEBfiABIAKtIAOtQiCGhCAEIAARFQAiBUIgiKckASAFpwuoAQEFfyAAKAJUIgMoAgAhBSADKAIEIgQgACgCFCAAKAIcIgdrIgYgBCAGSRsiBgRAIAUgByAGECsaIAMgAygCACAGaiIFNgIAIAMgAygCBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEECsaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACCwQAQgALBABBAAuKBQIGfgJ/IAEgASgCAEEHakF4cSIBQRBqNgIAIAAhCSABKQMAIQMgASkDCCEGIwBBIGsiCCQAAkAgBkL///////////8AgyIEQoCAgICAgMCAPH0gBEKAgICAgIDA/8MAfVQEQCAGQgSGIANCPIiEIQQgA0L//////////w+DIgNCgYCAgICAgIAIWgRAIARCgYCAgICAgIDAAHwhAgwCCyAEQoCAgICAgICAQH0hAiADQoCAgICAgICACFINASACIARCAYN8IQIMAQsgA1AgBEKAgICAgIDA//8AVCAEQoCAgICAgMD//wBRG0UEQCAGQgSGIANCPIiEQv////////8Dg0KAgICAgICA/P8AhCECDAELQoCAgICAgID4/wAhAiAEQv///////7//wwBWDQBCACECIARCMIinIgBBkfcASQ0AIAMhAiAGQv///////z+DQoCAgICAgMAAhCIFIQcCQCAAQYH3AGsiAUHAAHEEQCACIAFBQGqthiEHQgAhAgwBCyABRQ0AIAcgAa0iBIYgAkHAACABa62IhCEHIAIgBIYhAgsgCCACNwMQIAggBzcDGAJAQYH4ACAAayIAQcAAcQRAIAUgAEFAaq2IIQNCACEFDAELIABFDQAgBUHAACAAa62GIAMgAK0iAoiEIQMgBSACiCEFCyAIIAM3AwAgCCAF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ASAAKAIAIQAgASACQQFxBH8gASgCACAAaigCAAUgAAsRCwALYQECfyMAQRBrIgIkACABIAAoAgQiA0EBdWohASAAKAIAIQAgAiABIANBAXEEfyABKAIAIABqKAIABSAACxEBAEEQEB4iACACKQMINwMIIAAgAikDADcDACACQRBqJAAgAAtjAQJ/IwBBEGsiAyQAIAEgACgCBCIEQQF1aiEBIAAoAgAhACADIAEgAiAEQQFxBH8gASgCACAAaigCAAUgAAsRAwBBEBAeIgAgAykDCDcDCCAAIAMpAwA3AwAgA0EQaiQAIAALNwEBfyABIAAoAgQiA0EBdWohASAAKAIAIQAgASACIANBAXEEfyABKAIAIABqKAIABSAACxEEAAs5AQF/IAEgACgCBCIEQQF1aiEBIAAoAgAhACABIAIgAyAEQQFxBH8gASgCACAAaigCAAUgAAsRCAALCQAgASAAEQIACwUAQcM7Cw8AIAEgACgCAGogAjYCAAsNACABIAAoAgBqKAIACxgBAX9BEBAeIgBCADcDCCAAQQA2AgAgAAsYAQF/QRAQHiIAQgA3AwAgAEIANwMIIAALDABBMBAeQQBBMBAqCzcBAX8gASAAKAIEIgNBAXVqIQEgACgCACEAIAEgAiADQQFxBH8gASgCACAAaigCAAUgAAsRHgALBQBBvjsLIQAgACABKAIAIAEgASwAC0EASBtBuzsgAigCABAQNgIACyoBAX9BDBAeIgFBADoABCABIAAoAgA2AgggAEEANgIAIAFB2Cc2AgAgAQsFAEG7OwsFAEG4OwshACAAIAEoAgAgASABLAALQQBIG0GkOyACKAIAEBA2AgAL2AEBBH8jAEEgayIDJAAgASgCACIEQfD///8HSQRAAkACQCAEQQtPBEAgBEEPckEBaiIFEB4hBiADIAVBgICAgHhyNgIQIAMgBjYCCCADIAQ2AgwgBCAGaiEFDAELIAMgBDoAEyADQQhqIgYgBGohBSAERQ0BCyAGIAFBBGogBBArGgsgBUEAOgAAIAMgAjYCACADQRhqIANBCGogAyAAEQMAIAMoAhgQHSADKAIYIgAQBiADKAIAEAYgAywAE0EASARAIAMoAggQIwsgA0EgaiQAIAAPCxACAAsqAQF/QQwQHiIBQQA6AAQgASAAKAIANgIIIABBADYCACABQeAmNgIA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AkEIaiAIIAYQHyACIAcgAC8AABAfQQEhAyACKgIIIgogAioCACILXAR/IAogClsNAyALIAtcBSADC0UNAiACLQAMIAItAARHDQILIABBAmohAEEBIQMgBCEGQQEhBCAGRQ0ACyABLwB6IgBBB3FFBEAgBS0AekEHcUUNAgsgCCAAECAiCiAHIAUvAHoQICILWw0BIAogClsNACALIAtcDQELIAFBFGogBUEUakHoABArGiABQfwAaiAFQfwAahCgAQNAIAEtAAAiAEEEcQ0BIAEgAEEEcjoAACABKAIQIgAEQCABIAARAAALIAFBgICA/gc2ApwBIAEoAuQDIgENAAsLIAJBEGokAAvGAwEEfyMAQaAEayICJAAgACgCBCEBIABBADYCBCABBEAgASABKAIAKAIEEQAACyAAKAIIIQEgAEEANgIIIAEEQCABIAEoAgAoAgQRAAALAkAgACgCACIAKALoAyAAKALsA0YEQCAAKALkAw0BIAAgAkEYaiAAKAL0AxBcIgEpAgA3AgAgACABKAIQNgIQIAAgASkCCDcCCCAAQRRqIAFBFGpB6AAQKxogACABKQKMATcCjAEgACABKQKEATcChAEgACABKQJ8NwJ8IAEoApQBIQQgAUEANgKUASAAKAKUASEDIAAgBDYClAEgAwRAIAMQWwsgAEGYAWogAUGYAWpB0AIQKxogACgC6AMiAwRAIAAgAzYC7AMgAxAjCyAAIAEoAugDNgLoAyAAIAEoAuwDNgLsAyAAIAEoAvADNgLwAyABQQA2AvADIAFCADcC6AMgACABKQL8AzcC/AMgACABKQL0AzcC9AMgACABKAKEBDYChAQgASgClAEhACABQQA2ApQBIAAEQCAAEFsLIAJBoARqJAAPCyACQfAcNgIQIABBBUHYJSACQRBqECwQJAALIAJB5hE2AgAgAEEFQdglIAIQLBAkAAsLAEEMEB4gABCiAQsLAEEMEB5BABCiAQsNACAAKAIALQAIQQFxCwoAIAAoAgAoAhQLGQAgAUH/AXEEQBACAAsgACgCACgCEEEBcQsYACAAKAIAIgAgAC0ACEH+AXEgAXI6AAgLJgAgASAAKAIAIgAoAhRHBEAgACABNgIUIAAgACgCDEEBajYCDAsLkgEBAn8jAEEQayICJAAgACgCACEAIAFDAAAAAGAEQCABIAAqAhhcBEAgACABOAIYIAAgACgCDEEBajYCDAsgAkEQaiQADwsgAkGIFDYCACMAQRBrIgMkACADIAI2AgwCQCAARQRAQbgwQdglIAIQSRoMAQsgAEEAQQVB2CUgAiAAKAIEEQ0AGgsgA0EQaiQAECQACz8AIAFB/wFxRQRAIAIgACgCACIAKAIQIgFBAXFHBEAgACABQX5xIAJyNgIQIAAgACgCDEEBajYCDAsPCxACAAsL4CYjAEGACAuBHk9ubHkgbGVhZiBub2RlcyB3aXRoIGN1c3RvbSBtZWFzdXJlIGZ1bmN0aW9ucyBzaG91bGQgbWFudWFsbHkgbWFyayB0aGVtc2VsdmVzIGFzIGRpcnR5AGlzRGlydHkAbWFya0RpcnR5AGRlc3Ryb3kAc2V0RGlzcGxheQBnZXREaXNwbGF5AHNldEZsZXgALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweABzZXRGbGV4R3JvdwBnZXRGbGV4R3JvdwBzZXRPdmVyZmxvdwBnZXRPdmVyZmxvdwBoYXNOZXdMYXlvdXQAY2FsY3VsYXRlTGF5b3V0AGdldENvbXB1dGVkTGF5b3V0AHVuc2lnbmVkIHNob3J0AGdldENoaWxkQ291bnQAdW5zaWduZWQgaW50AHNldEp1c3RpZnlDb250ZW50AGdldEp1c3RpZnlDb250ZW50AGF2YWlsYWJsZUhlaWdodCBpcyBpbmRlZmluaXRlIHNvIGhlaWdodFNpemluZ01vZGUgbXVzdCBiZSBTaXppbmdNb2RlOjpNYXhDb250ZW50AGF2YWlsYWJsZVdpZHRoIGlzIGluZGVmaW5pdGUgc28gd2lkdGhTaXppbmdNb2RlIG11c3QgYmUgU2l6aW5nTW9kZTo6TWF4Q29udGVudABzZXRBbGlnbkNvbnRlbnQAZ2V0QWxpZ25Db250ZW50AGdldFBhcmVudABpbXBsZW1lbnQAc2V0TWF4SGVpZ2h0UGVyY2VudABzZXRIZWlnaHRQZXJjZW50AHNldE1pbkhlaWdodFBlcmNlbnQAc2V0RmxleEJhc2lzUGVyY2VudABzZXRHYXBQZXJjZW50AHNldFBvc2l0aW9uUGVyY2VudABzZXRNYXJnaW5QZXJjZW50AHNldE1heFdpZHRoUGVyY2VudABzZXRXaWR0aFBlcmNlbnQAc2V0TWluV2lkdGhQZXJjZW50AHNldFBhZGRpbmdQZXJjZW50AGhhbmRsZS50eXBlKCkgPT0gU3R5bGVWYWx1ZUhhbmRsZTo6VHlwZTo6UG9pbnQgfHwgaGFuZGxlLnR5cGUoKSA9PSBTdHlsZVZhbHVlSGFuZGxlOjpUeXBlOjpQZXJjZW50AGNyZWF0ZURlZmF1bHQAdW5pdAByaWdodABoZWlnaHQAc2V0TWF4SGVpZ2h0AGdldE1heEhlaWdodABzZXRIZWlnaHQAZ2V0SGVpZ2h0AHNldE1pbkhlaWdodABnZXRNaW5IZWlnaHQAZ2V0Q29tcHV0ZWRIZWlnaHQAZ2V0Q29tcHV0ZWRSaWdodABsZWZ0AGdldENvbXB1dGVkTGVmdAByZXNldABfX2Rlc3RydWN0AGZsb2F0AHVpbnQ2NF90AHVzZVdlYkRlZmF1bHRzAHNldFVzZVdlYkRlZmF1bHRzAHNldEFsaWduSXRlbXMAZ2V0QWxpZ25JdGVtcwBzZXRGbGV4QmFzaXMAZ2V0RmxleEJhc2lzAENhbm5vdCBnZXQgbGF5b3V0IHByb3BlcnRpZXMgb2YgbXVsdGktZWRnZSBzaG9ydGhhbmRzAHNldFBvaW50U2NhbGVGYWN0b3IATWVhc3VyZUNhbGxiYWNrV3JhcHBlcgBEaXJ0aWVkQ2FsbGJhY2tXcmFwcGVyAENhbm5vdCByZXNldCBhIG5vZGUgc3RpbGwgYXR0YWNoZWQgdG8gYSBvd25lcgBzZXRCb3JkZXIAZ2V0Qm9yZGVyAGdldENvbXB1dGVkQm9yZGVyAGdldE51bWJlcgBoYW5kbGUudHlwZSgpID09IFN0eWxlVmFsdWVIYW5kbGU6OlR5cGU6Ok51bWJlcgB1bnNpZ25lZCBjaGFyAHRvcABnZXRDb21wdXRlZFRvcABzZXRGbGV4V3JhcABnZXRGbGV4V3JhcABzZXRHYXAAZ2V0R2FwACVwAHNldEhlaWdodEF1dG8Ac2V0RmxleEJhc2lzQXV0bwBzZXRQb3NpdGlvbkF1dG8Ac2V0TWFyZ2luQXV0bwBzZXRXaWR0aEF1dG8AU2NhbGUgZmFjdG9yIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHplcm8Ac2V0QXNwZWN0UmF0aW8AZ2V0QXNwZWN0UmF0aW8Ac2V0UG9zaXRpb24AZ2V0UG9zaXRpb24Abm90aWZ5T25EZXN0cnVjdGlvbgBzZXRGbGV4RGlyZWN0aW9uAGdldEZsZXhEaXJlY3Rpb24Ac2V0RGlyZWN0aW9uAGdldERpcmVjdGlvbgBzZXRNYXJnaW4AZ2V0TWFyZ2luAGdldENvbXB1dGVkTWFyZ2luAG1hcmtMYXlvdXRTZWVuAG5hbgBib3R0b20AZ2V0Q29tcHV0ZWRCb3R0b20AYm9vbABlbXNjcmlwdGVuOjp2YWwAc2V0RmxleFNocmluawBnZXRGbGV4U2hyaW5rAHNldEFsd2F5c0Zvcm1zQ29udGFpbmluZ0Jsb2NrAE1lYXN1cmVDYWxsYmFjawBEaXJ0aWVkQ2FsbGJhY2sAZ2V0TGVuZ3RoAHdpZHRoAHNldE1heFdpZHRoAGdldE1heFdpZHRoAHNldFdpZHRoAGdldFdpZHRoAHNldE1pbldpZHRoAGdldE1pbldpZHRoAGdldENvbXB1dGVkV2lkdGgAcHVzaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1NtYWxsVmFsdWVCdWZmZXIuaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1N0eWxlVmFsdWVQb29sLmgAdW5zaWduZWQgbG9uZwBzZXRCb3hTaXppbmcAZ2V0Qm94U2l6aW5nAHN0ZDo6d3N0cmluZwBzdGQ6OnN0cmluZwBzdGQ6OnUxNnN0cmluZwBzdGQ6OnUzMnN0cmluZwBzZXRQYWRkaW5nAGdldFBhZGRpbmcAZ2V0Q29tcHV0ZWRQYWRkaW5nAFRyaWVkIHRvIGNvbnN0cnVjdCBZR05vZGUgd2l0aCBudWxsIGNvbmZpZwBBdHRlbXB0aW5nIHRvIGNvbnN0cnVjdCBOb2RlIHdpdGggbnVsbCBjb25maWcAY3JlYXRlV2l0aENvbmZpZwBpbmYAc2V0QWxpZ25TZWxmAGdldEFsaWduU2VsZgBTaXplAHZhbHVlAFZhbHVlAGNyZWF0ZQBtZWFzdXJlAHNldFBvc2l0aW9uVHlwZQBnZXRQb3NpdGlvblR5cGUAaXNSZWZlcmVuY2VCYXNlbGluZQBzZXRJc1JlZmVyZW5jZUJhc2VsaW5lAGNvcHlTdHlsZQBkb3VibGUATm9kZQBleHRlbmQAaW5zZXJ0Q2hpbGQAZ2V0Q2hpbGQAcmVtb3ZlQ2hpbGQAdm9pZABzZXRFeHBlcmltZW50YWxGZWF0dXJlRW5hYmxlZABpc0V4cGVyaW1lbnRhbEZlYXR1cmVFbmFibGVkAGRpcnRpZWQAQ2Fubm90IHJlc2V0IGEgbm9kZSB3aGljaCBzdGlsbCBoYXMgY2hpbGRyZW4gYXR0YWNoZWQAdW5zZXRNZWFzdXJlRnVuYwB1bnNldERpcnRpZWRGdW5jAHNldEVycmF0YQBnZXRFcnJhdGEATWVhc3VyZSBmdW5jdGlvbiByZXR1cm5lZCBhbiBpbnZhbGlkIGRpbWVuc2lvbiB0byBZb2dhOiBbd2lkdGg9JWYsIGhlaWdodD0lZl0ARXhwZWN0IGN1c3RvbSBiYXNlbGluZSBmdW5jdGlvbiB0byBub3QgcmV0dXJuIE5hTgBOQU4ASU5GAGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNob3J0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBpbnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGZsb2F0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8Y2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgY2hhcj4Ac3RkOjpiYXNpY19zdHJpbmc8dW5zaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2lnbmVk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";if(!ua(H)){var va=H;H=h2.locateFile?h2.locateFile(va,q):q+va}function wa(){var a2=H;try{if(a2==H&&w2)return new Uint8Array(w2);if(ua(a2))try{var b2=xa(a2.slice(37)),c=new Uint8Array(b2.length);for(a2=0;a2<b2.length;++a2)c[a2]=b2.charCodeAt(a2);var d2=c}catch(f2){throw Error("Converting base64 string to bytes failed.")}else d2=void 0;var e2=d2;if(e2)return e2;throw"both async and sync fetching of the wasm failed"}catch(f2){x2(f2)}}function ya(){return w2||typeof fetch!="function"?Promise.resolve().then(function(){return wa()}):fetch(H,{credentials:"same-origin"}).then(function(a2){if(!a2.ok)throw"failed to load wasm binary file at '"+H+"'";return a2.arrayBuffer()}).catch(function(){return wa()})}function za(a2){for(;0<a2.length;)a2.shift()(h2)}function Aa(a2){if(a2===void 0)return"_unknown";a2=a2.replace(/[^a-zA-Z0-9_]/g,"$");var b2=a2.charCodeAt(0);return 48<=b2&&57>=b2?"_"+a2:a2}function Ba(a2,b2){return a2=Aa(a2),function(){return b2.apply(this,arguments)}}var J=[{},{value:void 0},{value:null},{value:!0},{value:!1}],Ca=[];function Da(a2){var b2=Error,c=Ba(a2,function(d2){this.name=a2,this.message=d2,d2=Error(d2).stack,d2!==void 0&&(this.stack=this.toString()+`
|
|
1246
1246
|
`+d2.replace(/^Error(:[^\n]*)?\n/,""))});return c.prototype=Object.create(b2.prototype),c.prototype.constructor=c,c.prototype.toString=function(){return this.message===void 0?this.name:this.name+": "+this.message},c}var K=void 0;function L(a2){throw new K(a2)}var M=(a2)=>{return a2||L("Cannot use deleted val. handle = "+a2),J[a2].value},Ea=(a2)=>{switch(a2){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:var b2=Ca.length?Ca.pop():J.length;return J[b2]={ga:1,value:a2},b2}},Fa=void 0,Ga=void 0;function N(a2){for(var b2="";A[a2];)b2+=Ga[A[a2++]];return b2}var O=[];function Ha(){for(;O.length;){var a2=O.pop();a2.M.$=!1,a2.delete()}}var P=void 0,Q={};function Ia(a2,b2){for(b2===void 0&&L("ptr should not be undefined");a2.R;)b2=a2.ba(b2),a2=a2.R;return b2}var R={};function Ja(a2){a2=Ka(a2);var b2=N(a2);return S2(a2),b2}function La(a2,b2){var c=R[a2];return c===void 0&&L(b2+" has unknown type "+Ja(a2)),c}function Ma(){}var Na=!1;function Oa(a2){--a2.count.value,a2.count.value===0&&(a2.T?a2.U.W(a2.T):a2.P.N.W(a2.O))}function Pa(a2,b2,c){if(b2===c)return a2;if(c.R===void 0)return null;return a2=Pa(a2,b2,c.R),a2===null?null:c.na(a2)}var Qa={};function Ra(a2,b2){return b2=Ia(a2,b2),Q[b2]}var Sa=void 0;function Ta(a2){throw new Sa(a2)}function Ua(a2,b2){return b2.P&&b2.O||Ta("makeClassHandle requires ptr and ptrType"),!!b2.U!==!!b2.T&&Ta("Both smartPtrType and smartPtr must be specified"),b2.count={value:1},T(Object.create(a2,{M:{value:b2}}))}function T(a2){if(typeof FinalizationRegistry>"u")return T=(b2)=>b2,a2;return Na=new FinalizationRegistry((b2)=>{Oa(b2.M)}),T=(b2)=>{var c=b2.M;return c.T&&Na.register(b2,{M:c},b2),b2},Ma=(b2)=>{Na.unregister(b2)},T(a2)}var Va={};function Wa(a2){for(;a2.length;){var b2=a2.pop();a2.pop()(b2)}}function Xa(a2){return this.fromWireType(D[a2>>2])}var U={},Ya={};function V(a2,b2,c){function d2(k){k=c(k),k.length!==a2.length&&Ta("Mismatched type converter count");for(var m2=0;m2<a2.length;++m2)W(a2[m2],k[m2])}a2.forEach(function(k){Ya[k]=b2});var e2=Array(b2.length),f2=[],g2=0;b2.forEach((k,m2)=>{R.hasOwnProperty(k)?e2[m2]=R[k]:(f2.push(k),U.hasOwnProperty(k)||(U[k]=[]),U[k].push(()=>{e2[m2]=R[k],++g2,g2===f2.length&&d2(e2)}))}),f2.length===0&&d2(e2)}function Za(a2){switch(a2){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw TypeError("Unknown type size: "+a2)}}function W(a2,b2,c={}){if(!("argPackAdvance"in b2))throw TypeError("registerType registeredInstance requires argPackAdvance");var d2=b2.name;if(a2||L('type "'+d2+'" must have a positive integer typeid pointer'),R.hasOwnProperty(a2)){if(c.ua)return;L("Cannot register type '"+d2+"' twice")}R[a2]=b2,delete Ya[a2],U.hasOwnProperty(a2)&&(b2=U[a2],delete U[a2],b2.forEach((e2)=>e2()))}function $a(a2){L(a2.M.P.N.name+" instance already deleted")}function X(){}function ab(a2,b2,c){if(a2[b2].S===void 0){var d2=a2[b2];a2[b2]=function(){return a2[b2].S.hasOwnProperty(arguments.length)||L("Function '"+c+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+a2[b2].S+")!"),a2[b2].S[arguments.length].apply(this,arguments)},a2[b2].S=[],a2[b2].S[d2.Z]=d2}}function bb(a2,b2){h2.hasOwnProperty(a2)?(L("Cannot register public name '"+a2+"' twice"),ab(h2,a2,a2),h2.hasOwnProperty(void 0)&&L("Cannot register multiple overloads of a function with the same number of arguments (undefined)!"),h2[a2].S[void 0]=b2):h2[a2]=b2}function cb(a2,b2,c,d2,e2,f2,g2,k){this.name=a2,this.constructor=b2,this.X=c,this.W=d2,this.R=e2,this.pa=f2,this.ba=g2,this.na=k,this.ja=[]}function db(a2,b2,c){for(;b2!==c;)b2.ba||L("Expected null or instance of "+c.name+", got an instance of "+b2.name),a2=b2.ba(a2),b2=b2.R;return a2}function eb(a2,b2){if(b2===null)return this.ea&&L("null is not a valid "+this.name),0;return b2.M||L('Cannot pass "'+fb(b2)+'" as a '+this.name),b2.M.O||L("Cannot pass deleted object as a pointer of type "+this.name),db(b2.M.O,b2.M.P.N,this.N)}function gb(a2,b2){if(b2===null){if(this.ea&&L("null is not a valid "+this.name),this.da){var c=this.fa();return a2!==null&&a2.push(this.W,c),c}return 0}if(b2.M||L('Cannot pass "'+fb(b2)+'" as a '+this.name),b2.M.O||L("Cannot pass deleted object as a pointer of type "+this.name),!this.ca&&b2.M.P.ca&&L("Cannot convert argument of type "+(b2.M.U?b2.M.U.name:b2.M.P.name)+" to parameter type "+this.name),c=db(b2.M.O,b2.M.P.N,this.N),this.da)switch(b2.M.T===void 0&&L("Passing raw pointer to smart pointer is illegal"),this.Ba){case 0:b2.M.U===this?c=b2.M.T:L("Cannot convert argument of type "+(b2.M.U?b2.M.U.name:b2.M.P.name)+" to parameter type "+this.name);break;case 1:c=b2.M.T;break;case 2:if(b2.M.U===this)c=b2.M.T;else{var d2=b2.clone();c=this.xa(c,Ea(function(){d2.delete()})),a2!==null&&a2.push(this.W,c)}break;default:L("Unsupporting sharing policy")}return c}function hb(a2,b2){if(b2===null)return this.ea&&L("null is not a valid "+this.name),0;return b2.M||L('Cannot pass "'+fb(b2)+'" as a '+this.name),b2.M.O||L("Cannot pass deleted object as a pointer of type "+this.name),b2.M.P.ca&&L("Cannot convert argument of type "+b2.M.P.name+" to parameter type "+this.name),db(b2.M.O,b2.M.P.N,this.N)}function Y(a2,b2,c,d2){this.name=a2,this.N=b2,this.ea=c,this.ca=d2,this.da=!1,this.W=this.xa=this.fa=this.ka=this.Ba=this.wa=void 0,b2.R!==void 0?this.toWireType=gb:(this.toWireType=d2?eb:hb,this.V=null)}function ib(a2,b2){h2.hasOwnProperty(a2)||Ta("Replacing nonexistant public symbol"),h2[a2]=b2,h2[a2].Z=void 0}function jb(a2,b2){var c=[];return function(){if(c.length=0,Object.assign(c,arguments),a2.includes("j")){var d2=h2["dynCall_"+a2];d2=c&&c.length?d2.apply(null,[b2].concat(c)):d2.call(null,b2)}else d2=oa.get(b2).apply(null,c);return d2}}function Z(a2,b2){a2=N(a2);var c=a2.includes("j")?jb(a2,b2):oa.get(b2);return typeof c!="function"&&L("unknown function pointer with signature "+a2+": "+b2),c}var mb=void 0;function nb(a2,b2){function c(f2){e2[f2]||R[f2]||(Ya[f2]?Ya[f2].forEach(c):(d2.push(f2),e2[f2]=!0))}var d2=[],e2={};throw b2.forEach(c),new mb(a2+": "+d2.map(Ja).join([", "]))}function ob(a2,b2,c,d2,e2){var f2=b2.length;2>f2&&L("argTypes array size mismatch! Must at least get return value and 'this' types!");var g2=b2[1]!==null&&c!==null,k=!1;for(c=1;c<b2.length;++c)if(b2[c]!==null&&b2[c].V===void 0){k=!0;break}var m2=b2[0].name!=="void",l2=f2-2,n2=Array(l2),p2=[],r2=[];return function(){if(arguments.length!==l2&&L("function "+a2+" called with "+arguments.length+" arguments, expected "+l2+" args!"),r2.length=0,p2.length=g2?2:1,p2[0]=e2,g2){var u2=b2[1].toWireType(r2,this);p2[1]=u2}for(var t3=0;t3<l2;++t3)n2[t3]=b2[t3+2].toWireType(r2,arguments[t3]),p2.push(n2[t3]);if(t3=d2.apply(null,p2),k)Wa(r2);else for(var y2=g2?1:2;y2<b2.length;y2++){var B=y2===1?u2:n2[y2-2];b2[y2].V!==null&&b2[y2].V(B)}return u2=m2?b2[0].fromWireType(t3):void 0,u2}}function pb(a2,b2){for(var c=[],d2=0;d2<a2;d2++)c.push(E2[b2+4*d2>>2]);return c}function qb(a2){4<a2&&--J[a2].ga===0&&(J[a2]=void 0,Ca.push(a2))}function fb(a2){if(a2===null)return"null";var b2=typeof a2;return b2==="object"||b2==="array"||b2==="function"?a2.toString():""+a2}function rb(a2,b2){switch(b2){case 2:return function(c){return this.fromWireType(la[c>>2])};case 3:return function(c){return this.fromWireType(ma[c>>3])};default:throw TypeError("Unknown float type: "+a2)}}function sb(a2,b2,c){switch(b2){case 0:return c?function(d2){return ja[d2]}:function(d2){return A[d2]};case 1:return c?function(d2){return C[d2>>1]}:function(d2){return ka[d2>>1]};case 2:return c?function(d2){return D[d2>>2]}:function(d2){return E2[d2>>2]};default:throw TypeError("Unknown integer type: "+a2)}}function tb(a2,b2){for(var c="",d2=0;!(d2>=b2/2);++d2){var e2=C[a2+2*d2>>1];if(e2==0)break;c+=String.fromCharCode(e2)}return c}function ub(a2,b2,c){if(c===void 0&&(c=2147483647),2>c)return 0;c-=2;var d2=b2;c=c<2*a2.length?c/2:a2.length;for(var e2=0;e2<c;++e2)C[b2>>1]=a2.charCodeAt(e2),b2+=2;return C[b2>>1]=0,b2-d2}function vb(a2){return 2*a2.length}function wb(a2,b2){for(var c=0,d2="";!(c>=b2/4);){var e2=D[a2+4*c>>2];if(e2==0)break;++c,65536<=e2?(e2-=65536,d2+=String.fromCharCode(55296|e2>>10,56320|e2&1023)):d2+=String.fromCharCode(e2)}return d2}function xb(a2,b2,c){if(c===void 0&&(c=2147483647),4>c)return 0;var d2=b2;c=d2+c-4;for(var e2=0;e2<a2.length;++e2){var f2=a2.charCodeAt(e2);if(55296<=f2&&57343>=f2){var g2=a2.charCodeAt(++e2);f2=65536+((f2&1023)<<10)|g2&1023}if(D[b2>>2]=f2,b2+=4,b2+4>c)break}return D[b2>>2]=0,b2-d2}function yb(a2){for(var b2=0,c=0;c<a2.length;++c){var d2=a2.charCodeAt(c);55296<=d2&&57343>=d2&&++c,b2+=4}return b2}var zb={};function Ab(a2){var b2=zb[a2];return b2===void 0?N(a2):b2}var Bb=[];function Cb(a2){var b2=Bb.length;return Bb.push(a2),b2}function Db(a2,b2){for(var c=Array(a2),d2=0;d2<a2;++d2)c[d2]=La(E2[b2+4*d2>>2],"parameter "+d2);return c}var Eb=[],Fb=[null,[],[]];K=h2.BindingError=Da("BindingError"),h2.count_emval_handles=function(){for(var a2=0,b2=5;b2<J.length;++b2)J[b2]!==void 0&&++a2;return a2},h2.get_first_emval=function(){for(var a2=5;a2<J.length;++a2)if(J[a2]!==void 0)return J[a2];return null},Fa=h2.PureVirtualError=Da("PureVirtualError");for(var Gb=Array(256),Hb=0;256>Hb;++Hb)Gb[Hb]=String.fromCharCode(Hb);Ga=Gb,h2.getInheritedInstanceCount=function(){return Object.keys(Q).length},h2.getLiveInheritedInstances=function(){var a2=[],b2;for(b2 in Q)Q.hasOwnProperty(b2)&&a2.push(Q[b2]);return a2},h2.flushPendingDeletes=Ha,h2.setDelayFunction=function(a2){P=a2,O.length&&P&&P(Ha)},Sa=h2.InternalError=Da("InternalError"),X.prototype.isAliasOf=function(a2){if(!(this instanceof X&&a2 instanceof X))return!1;var b2=this.M.P.N,c=this.M.O,d2=a2.M.P.N;for(a2=a2.M.O;b2.R;)c=b2.ba(c),b2=b2.R;for(;d2.R;)a2=d2.ba(a2),d2=d2.R;return b2===d2&&c===a2},X.prototype.clone=function(){if(this.M.O||$a(this),this.M.aa)return this.M.count.value+=1,this;var a2=T,b2=Object,c=b2.create,d2=Object.getPrototypeOf(this),e2=this.M;return a2=a2(c.call(b2,d2,{M:{value:{count:e2.count,$:e2.$,aa:e2.aa,O:e2.O,P:e2.P,T:e2.T,U:e2.U}}})),a2.M.count.value+=1,a2.M.$=!1,a2},X.prototype.delete=function(){this.M.O||$a(this),this.M.$&&!this.M.aa&&L("Object already scheduled for deletion"),Ma(this),Oa(this.M),this.M.aa||(this.M.T=void 0,this.M.O=void 0)},X.prototype.isDeleted=function(){return!this.M.O},X.prototype.deleteLater=function(){return this.M.O||$a(this),this.M.$&&!this.M.aa&&L("Object already scheduled for deletion"),O.push(this),O.length===1&&P&&P(Ha),this.M.$=!0,this},Y.prototype.qa=function(a2){return this.ka&&(a2=this.ka(a2)),a2},Y.prototype.ha=function(a2){this.W&&this.W(a2)},Y.prototype.argPackAdvance=8,Y.prototype.readValueFromPointer=Xa,Y.prototype.deleteObject=function(a2){if(a2!==null)a2.delete()},Y.prototype.fromWireType=function(a2){function b2(){return this.da?Ua(this.N.X,{P:this.wa,O:c,U:this,T:a2}):Ua(this.N.X,{P:this,O:a2})}var c=this.qa(a2);if(!c)return this.ha(a2),null;var d2=Ra(this.N,c);if(d2!==void 0){if(d2.M.count.value===0)return d2.M.O=c,d2.M.T=a2,d2.clone();return d2=d2.clone(),this.ha(a2),d2}if(d2=this.N.pa(c),d2=Qa[d2],!d2)return b2.call(this);d2=this.ca?d2.la:d2.pointerType;var e2=Pa(c,this.N,d2.N);return e2===null?b2.call(this):this.da?Ua(d2.N.X,{P:d2,O:e2,U:this,T:a2}):Ua(d2.N.X,{P:d2,O:e2})},mb=h2.UnboundTypeError=Da("UnboundTypeError");var xa=typeof atob=="function"?atob:function(a2){var b2="",c=0;a2=a2.replace(/[^A-Za-z0-9\+\/=]/g,"");do{var d2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a2.charAt(c++)),e2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a2.charAt(c++)),f2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a2.charAt(c++)),g2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a2.charAt(c++));d2=d2<<2|e2>>4,e2=(e2&15)<<4|f2>>2;var k=(f2&3)<<6|g2;b2+=String.fromCharCode(d2),f2!==64&&(b2+=String.fromCharCode(e2)),g2!==64&&(b2+=String.fromCharCode(k))}while(c<a2.length);return b2},Jb={l:function(a2,b2,c,d2){x2("Assertion failed: "+(a2?z2(A,a2):"")+", at: "+[b2?b2?z2(A,b2):"":"unknown filename",c,d2?d2?z2(A,d2):"":"unknown function"])},q:function(a2,b2,c){a2=N(a2),b2=La(b2,"wrapper"),c=M(c);var d2=[].slice,e2=b2.N,f2=e2.X,g2=e2.R.X,k=e2.R.constructor;a2=Ba(a2,function(){e2.R.ja.forEach(function(l2){if(this[l2]===g2[l2])throw new Fa("Pure virtual function "+l2+" must be implemented in JavaScript")}.bind(this)),Object.defineProperty(this,"__parent",{value:f2}),this.__construct.apply(this,d2.call(arguments))}),f2.__construct=function(){this===f2&&L("Pass correct 'this' to __construct");var l2=k.implement.apply(void 0,[this].concat(d2.call(arguments)));Ma(l2);var n2=l2.M;l2.notifyOnDestruction(),n2.aa=!0,Object.defineProperties(this,{M:{value:n2}}),T(this),l2=n2.O,l2=Ia(e2,l2),Q.hasOwnProperty(l2)?L("Tried to register registered instance: "+l2):Q[l2]=this},f2.__destruct=function(){this===f2&&L("Pass correct 'this' to __destruct"),Ma(this);var l2=this.M.O;l2=Ia(e2,l2),Q.hasOwnProperty(l2)?delete Q[l2]:L("Tried to unregister unregistered instance: "+l2)},a2.prototype=Object.create(f2);for(var m2 in c)a2.prototype[m2]=c[m2];return Ea(a2)},j:function(a2){var b2=Va[a2];delete Va[a2];var{fa:c,W:d2,ia:e2}=b2,f2=e2.map((g2)=>g2.ta).concat(e2.map((g2)=>g2.za));V([a2],f2,(g2)=>{var k={};return e2.forEach((m2,l2)=>{var n2=g2[l2],p2=m2.ra,r2=m2.sa,u2=g2[l2+e2.length],t3=m2.ya,y2=m2.Aa;k[m2.oa]={read:(B)=>n2.fromWireType(p2(r2,B)),write:(B,ba)=>{var I=[];t3(y2,B,u2.toWireType(I,ba)),Wa(I)}}}),[{name:b2.name,fromWireType:function(m2){var l2={},n2;for(n2 in k)l2[n2]=k[n2].read(m2);return d2(m2),l2},toWireType:function(m2,l2){for(var n2 in k)if(!(n2 in l2))throw TypeError('Missing field: "'+n2+'"');var p2=c();for(n2 in k)k[n2].write(p2,l2[n2]);return m2!==null&&m2.push(d2,p2),p2},argPackAdvance:8,readValueFromPointer:Xa,V:d2}]})},v:function(){},B:function(a2,b2,c,d2,e2){var f2=Za(c);b2=N(b2),W(a2,{name:b2,fromWireType:function(g2){return!!g2},toWireType:function(g2,k){return k?d2:e2},argPackAdvance:8,readValueFromPointer:function(g2){if(c===1)var k=ja;else if(c===2)k=C;else if(c===4)k=D;else throw TypeError("Unknown boolean type size: "+b2);return this.fromWireType(k[g2>>f2])},V:null})},f:function(a2,b2,c,d2,e2,f2,g2,k,m2,l2,n2,p2,r2){n2=N(n2),f2=Z(e2,f2),k&&(k=Z(g2,k)),l2&&(l2=Z(m2,l2)),r2=Z(p2,r2);var u2=Aa(n2);bb(u2,function(){nb("Cannot construct "+n2+" due to unbound types",[d2])}),V([a2,b2,c],d2?[d2]:[],function(t3){if(t3=t3[0],d2)var y2=t3.N,B=y2.X;else B=X.prototype;t3=Ba(u2,function(){if(Object.getPrototypeOf(this)!==ba)throw new K("Use 'new' to construct "+n2);if(I.Y===void 0)throw new K(n2+" has no accessible constructor");var kb=I.Y[arguments.length];if(kb===void 0)throw new K("Tried to invoke ctor of "+n2+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(I.Y).toString()+") parameters instead!");return kb.apply(this,arguments)});var ba=Object.create(B,{constructor:{value:t3}});t3.prototype=ba;var I=new cb(n2,t3,ba,r2,y2,f2,k,l2);y2=new Y(n2,I,!0,!1),B=new Y(n2+"*",I,!1,!1);var lb=new Y(n2+" const*",I,!1,!0);return Qa[a2]={pointerType:B,la:lb},ib(u2,t3),[y2,B,lb]})},d:function(a2,b2,c,d2,e2,f2,g2){var k=pb(c,d2);b2=N(b2),f2=Z(e2,f2),V([],[a2],function(m2){function l2(){nb("Cannot call "+n2+" due to unbound types",k)}m2=m2[0];var n2=m2.name+"."+b2;b2.startsWith("@@")&&(b2=Symbol[b2.substring(2)]);var p2=m2.N.constructor;return p2[b2]===void 0?(l2.Z=c-1,p2[b2]=l2):(ab(p2,b2,n2),p2[b2].S[c-1]=l2),V([],k,function(r2){return r2=ob(n2,[r2[0],null].concat(r2.slice(1)),null,f2,g2),p2[b2].S===void 0?(r2.Z=c-1,p2[b2]=r2):p2[b2].S[c-1]=r2,[]}),[]})},p:function(a2,b2,c,d2,e2,f2){0<b2||x2();var g2=pb(b2,c);e2=Z(d2,e2),V([],[a2],function(k){k=k[0];var m2="constructor "+k.name;if(k.N.Y===void 0&&(k.N.Y=[]),k.N.Y[b2-1]!==void 0)throw new K("Cannot register multiple constructors with identical number of parameters ("+(b2-1)+") for class '"+k.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");return k.N.Y[b2-1]=()=>{nb("Cannot construct "+k.name+" due to unbound types",g2)},V([],g2,function(l2){return l2.splice(1,0,null),k.N.Y[b2-1]=ob(m2,l2,null,e2,f2),[]}),[]})},a:function(a2,b2,c,d2,e2,f2,g2,k){var m2=pb(c,d2);b2=N(b2),f2=Z(e2,f2),V([],[a2],function(l2){function n2(){nb("Cannot call "+p2+" due to unbound types",m2)}l2=l2[0];var p2=l2.name+"."+b2;b2.startsWith("@@")&&(b2=Symbol[b2.substring(2)]),k&&l2.N.ja.push(b2);var r2=l2.N.X,u2=r2[b2];return u2===void 0||u2.S===void 0&&u2.className!==l2.name&&u2.Z===c-2?(n2.Z=c-2,n2.className=l2.name,r2[b2]=n2):(ab(r2,b2,p2),r2[b2].S[c-2]=n2),V([],m2,function(t3){return t3=ob(p2,t3,l2,f2,g2),r2[b2].S===void 0?(t3.Z=c-2,r2[b2]=t3):r2[b2].S[c-2]=t3,[]}),[]})},A:function(a2,b2){b2=N(b2),W(a2,{name:b2,fromWireType:function(c){var d2=M(c);return qb(c),d2},toWireType:function(c,d2){return Ea(d2)},argPackAdvance:8,readValueFromPointer:Xa,V:null})},n:function(a2,b2,c){c=Za(c),b2=N(b2),W(a2,{name:b2,fromWireType:function(d2){return d2},toWireType:function(d2,e2){return e2},argPackAdvance:8,readValueFromPointer:rb(b2,c),V:null})},e:function(a2,b2,c,d2,e2){b2=N(b2),e2===-1&&(e2=4294967295),e2=Za(c);var f2=(k)=>k;if(d2===0){var g2=32-8*c;f2=(k)=>k<<g2>>>g2}c=b2.includes("unsigned")?function(k,m2){return m2>>>0}:function(k,m2){return m2},W(a2,{name:b2,fromWireType:f2,toWireType:c,argPackAdvance:8,readValueFromPointer:sb(b2,e2,d2!==0),V:null})},b:function(a2,b2,c){function d2(f2){f2>>=2;var g2=E2;return new e2(ia,g2[f2+1],g2[f2])}var e2=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b2];c=N(c),W(a2,{name:c,fromWireType:d2,argPackAdvance:8,readValueFromPointer:d2},{ua:!0})},o:function(a2,b2){b2=N(b2);var c=b2==="std::string";W(a2,{name:b2,fromWireType:function(d2){var e2=E2[d2>>2],f2=d2+4;if(c)for(var g2=f2,k=0;k<=e2;++k){var m2=f2+k;if(k==e2||A[m2]==0){if(g2=g2?z2(A,g2,m2-g2):"",l2===void 0)var l2=g2;else l2+=String.fromCharCode(0),l2+=g2;g2=m2+1}}else{l2=Array(e2);for(k=0;k<e2;++k)l2[k]=String.fromCharCode(A[f2+k]);l2=l2.join("")}return S2(d2),l2},toWireType:function(d2,e2){e2 instanceof ArrayBuffer&&(e2=new Uint8Array(e2));var f2,g2=typeof e2=="string";if(g2||e2 instanceof Uint8Array||e2 instanceof Uint8ClampedArray||e2 instanceof Int8Array||L("Cannot pass non-string to std::string"),c&&g2){var k=0;for(f2=0;f2<e2.length;++f2){var m2=e2.charCodeAt(f2);127>=m2?k++:2047>=m2?k+=2:55296<=m2&&57343>=m2?(k+=4,++f2):k+=3}f2=k}else f2=e2.length;if(k=Ib(4+f2+1),m2=k+4,E2[k>>2]=f2,c&&g2){if(g2=m2,m2=f2+1,f2=A,0<m2){m2=g2+m2-1;for(var l2=0;l2<e2.length;++l2){var n2=e2.charCodeAt(l2);if(55296<=n2&&57343>=n2){var p2=e2.charCodeAt(++l2);n2=65536+((n2&1023)<<10)|p2&1023}if(127>=n2){if(g2>=m2)break;f2[g2++]=n2}else{if(2047>=n2){if(g2+1>=m2)break;f2[g2++]=192|n2>>6}else{if(65535>=n2){if(g2+2>=m2)break;f2[g2++]=224|n2>>12}else{if(g2+3>=m2)break;f2[g2++]=240|n2>>18,f2[g2++]=128|n2>>12&63}f2[g2++]=128|n2>>6&63}f2[g2++]=128|n2&63}}f2[g2]=0}}else if(g2)for(g2=0;g2<f2;++g2)l2=e2.charCodeAt(g2),255<l2&&(S2(m2),L("String has UTF-16 code units that do not fit in 8 bits")),A[m2+g2]=l2;else for(g2=0;g2<f2;++g2)A[m2+g2]=e2[g2];return d2!==null&&d2.push(S2,k),k},argPackAdvance:8,readValueFromPointer:Xa,V:function(d2){S2(d2)}})},i:function(a2,b2,c){if(c=N(c),b2===2)var d2=tb,e2=ub,f2=vb,g2=()=>ka,k=1;else b2===4&&(d2=wb,e2=xb,f2=yb,g2=()=>E2,k=2);W(a2,{name:c,fromWireType:function(m2){for(var l2=E2[m2>>2],n2=g2(),p2,r2=m2+4,u2=0;u2<=l2;++u2){var t3=m2+4+u2*b2;if(u2==l2||n2[t3>>k]==0)r2=d2(r2,t3-r2),p2===void 0?p2=r2:(p2+=String.fromCharCode(0),p2+=r2),r2=t3+b2}return S2(m2),p2},toWireType:function(m2,l2){typeof l2!="string"&&L("Cannot pass non-string to C++ string type "+c);var n2=f2(l2),p2=Ib(4+n2+b2);return E2[p2>>2]=n2>>k,e2(l2,p2+4,n2+b2),m2!==null&&m2.push(S2,p2),p2},argPackAdvance:8,readValueFromPointer:Xa,V:function(m2){S2(m2)}})},k:function(a2,b2,c,d2,e2,f2){Va[a2]={name:N(b2),fa:Z(c,d2),W:Z(e2,f2),ia:[]}},h:function(a2,b2,c,d2,e2,f2,g2,k,m2,l2){Va[a2].ia.push({oa:N(b2),ta:c,ra:Z(d2,e2),sa:f2,za:g2,ya:Z(k,m2),Aa:l2})},C:function(a2,b2){b2=N(b2),W(a2,{va:!0,name:b2,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},s:function(a2,b2,c,d2,e2){a2=Bb[a2],b2=M(b2),c=Ab(c);var f2=[];return E2[d2>>2]=Ea(f2),a2(b2,c,f2,e2)},t:function(a2,b2,c,d2){a2=Bb[a2],b2=M(b2),c=Ab(c),a2(b2,c,null,d2)},g:qb,m:function(a2,b2){var c=Db(a2,b2),d2=c[0];b2=d2.name+"_$"+c.slice(1).map(function(g2){return g2.name}).join("_")+"$";var e2=Eb[b2];if(e2!==void 0)return e2;var f2=Array(a2-1);return e2=Cb((g2,k,m2,l2)=>{for(var n2=0,p2=0;p2<a2-1;++p2)f2[p2]=c[p2+1].readValueFromPointer(l2+n2),n2+=c[p2+1].argPackAdvance;g2=g2[k].apply(g2,f2);for(p2=0;p2<a2-1;++p2)c[p2+1].ma&&c[p2+1].ma(f2[p2]);if(!d2.va)return d2.toWireType(m2,g2)}),Eb[b2]=e2},D:function(a2){4<a2&&(J[a2].ga+=1)},r:function(a2){var b2=M(a2);Wa(b2),qb(a2)},c:function(){x2("")},x:function(a2,b2,c){A.copyWithin(a2,b2,b2+c)},w:function(a2){var b2=A.length;if(a2>>>=0,2147483648<a2)return!1;for(var c=1;4>=c;c*=2){var d2=b2*(1+0.2/c);d2=Math.min(d2,a2+100663296);var e2=Math;d2=Math.max(a2,d2),e2=e2.min.call(e2,2147483648,d2+(65536-d2%65536)%65536);a:{try{fa.grow(e2-ia.byteLength+65535>>>16),na();var f2=1;break a}catch(g2){}f2=void 0}if(f2)return!0}return!1},z:function(){return 52},u:function(){return 70},y:function(a2,b2,c,d2){for(var e2=0,f2=0;f2<c;f2++){var g2=E2[b2>>2],k=E2[b2+4>>2];b2+=8;for(var m2=0;m2<k;m2++){var l2=A[g2+m2],n2=Fb[a2];l2===0||l2===10?((a2===1?ea:v2)(z2(n2,0)),n2.length=0):n2.push(l2)}e2+=k}return E2[d2>>2]=e2,0}};(function(){function a2(e2){h2.asm=e2.exports,fa=h2.asm.E,na(),oa=h2.asm.J,qa.unshift(h2.asm.F),F--,h2.monitorRunDependencies&&h2.monitorRunDependencies(F),F==0&&(ta!==null&&(clearInterval(ta),ta=null),G&&(e2=G,G=null,e2()))}function b2(e2){a2(e2.instance)}function c(e2){return ya().then(function(f2){return WebAssembly.instantiate(f2,d2)}).then(function(f2){return f2}).then(e2,function(f2){v2("failed to asynchronously prepare wasm: "+f2),x2(f2)})}var d2={a:Jb};if(F++,h2.monitorRunDependencies&&h2.monitorRunDependencies(F),h2.instantiateWasm)try{return h2.instantiateWasm(d2,a2)}catch(e2){v2("Module.instantiateWasm callback failed with error: "+e2),ca(e2)}return function(){return w2||typeof WebAssembly.instantiateStreaming!="function"||ua(H)||typeof fetch!="function"?c(b2):fetch(H,{credentials:"same-origin"}).then(function(e2){return WebAssembly.instantiateStreaming(e2,d2).then(b2,function(f2){return v2("wasm streaming compile failed: "+f2),v2("falling back to ArrayBuffer instantiation"),c(b2)})})}().catch(ca),{}})(),h2.___wasm_call_ctors=function(){return(h2.___wasm_call_ctors=h2.asm.F).apply(null,arguments)};var Ka=h2.___getTypeName=function(){return(Ka=h2.___getTypeName=h2.asm.G).apply(null,arguments)};h2.__embind_initialize_bindings=function(){return(h2.__embind_initialize_bindings=h2.asm.H).apply(null,arguments)};var Ib=h2._malloc=function(){return(Ib=h2._malloc=h2.asm.I).apply(null,arguments)},S2=h2._free=function(){return(S2=h2._free=h2.asm.K).apply(null,arguments)};h2.dynCall_jiji=function(){return(h2.dynCall_jiji=h2.asm.L).apply(null,arguments)};var Kb;G=function Lb(){Kb||Mb(),Kb||(G=Lb)};function Mb(){function a2(){if(!Kb&&(Kb=!0,h2.calledRun=!0,!ha)){if(za(qa),aa(h2),h2.onRuntimeInitialized)h2.onRuntimeInitialized();if(h2.postRun)for(typeof h2.postRun=="function"&&(h2.postRun=[h2.postRun]);h2.postRun.length;){var b2=h2.postRun.shift();ra.unshift(b2)}za(ra)}}if(!(0<F)){if(h2.preRun)for(typeof h2.preRun=="function"&&(h2.preRun=[h2.preRun]);h2.preRun.length;)sa();za(pa),0<F||(h2.setStatus?(h2.setStatus("Running..."),setTimeout(function(){setTimeout(function(){h2.setStatus("")},1),a2()},1)):a2())}}if(h2.preInit)for(typeof h2.preInit=="function"&&(h2.preInit=[h2.preInit]);0<h2.preInit.length;)h2.preInit.pop()();return Mb(),loadYoga2.ready}})(),yoga_wasm_base64_esm_default=loadYoga;var Align=function(Align2){return Align2[Align2.Auto=0]="Auto",Align2[Align2.FlexStart=1]="FlexStart",Align2[Align2.Center=2]="Center",Align2[Align2.FlexEnd=3]="FlexEnd",Align2[Align2.Stretch=4]="Stretch",Align2[Align2.Baseline=5]="Baseline",Align2[Align2.SpaceBetween=6]="SpaceBetween",Align2[Align2.SpaceAround=7]="SpaceAround",Align2[Align2.SpaceEvenly=8]="SpaceEvenly",Align2}({}),BoxSizing=function(BoxSizing2){return BoxSizing2[BoxSizing2.BorderBox=0]="BorderBox",BoxSizing2[BoxSizing2.ContentBox=1]="ContentBox",BoxSizing2}({}),Dimension=function(Dimension2){return Dimension2[Dimension2.Width=0]="Width",Dimension2[Dimension2.Height=1]="Height",Dimension2}({}),Direction=function(Direction2){return Direction2[Direction2.Inherit=0]="Inherit",Direction2[Direction2.LTR=1]="LTR",Direction2[Direction2.RTL=2]="RTL",Direction2}({}),Display=function(Display2){return Display2[Display2.Flex=0]="Flex",Display2[Display2.None=1]="None",Display2[Display2.Contents=2]="Contents",Display2}({}),Edge=function(Edge2){return Edge2[Edge2.Left=0]="Left",Edge2[Edge2.Top=1]="Top",Edge2[Edge2.Right=2]="Right",Edge2[Edge2.Bottom=3]="Bottom",Edge2[Edge2.Start=4]="Start",Edge2[Edge2.End=5]="End",Edge2[Edge2.Horizontal=6]="Horizontal",Edge2[Edge2.Vertical=7]="Vertical",Edge2[Edge2.All=8]="All",Edge2}({}),Errata=function(Errata2){return Errata2[Errata2.None=0]="None",Errata2[Errata2.StretchFlexBasis=1]="StretchFlexBasis",Errata2[Errata2.AbsolutePositionWithoutInsetsExcludesPadding=2]="AbsolutePositionWithoutInsetsExcludesPadding",Errata2[Errata2.AbsolutePercentAgainstInnerSize=4]="AbsolutePercentAgainstInnerSize",Errata2[Errata2.All=2147483647]="All",Errata2[Errata2.Classic=2147483646]="Classic",Errata2}({}),ExperimentalFeature=function(ExperimentalFeature2){return ExperimentalFeature2[ExperimentalFeature2.WebFlexBasis=0]="WebFlexBasis",ExperimentalFeature2}({}),FlexDirection=function(FlexDirection2){return FlexDirection2[FlexDirection2.Column=0]="Column",FlexDirection2[FlexDirection2.ColumnReverse=1]="ColumnReverse",FlexDirection2[FlexDirection2.Row=2]="Row",FlexDirection2[FlexDirection2.RowReverse=3]="RowReverse",FlexDirection2}({}),Gutter=function(Gutter2){return Gutter2[Gutter2.Column=0]="Column",Gutter2[Gutter2.Row=1]="Row",Gutter2[Gutter2.All=2]="All",Gutter2}({}),Justify=function(Justify2){return Justify2[Justify2.FlexStart=0]="FlexStart",Justify2[Justify2.Center=1]="Center",Justify2[Justify2.FlexEnd=2]="FlexEnd",Justify2[Justify2.SpaceBetween=3]="SpaceBetween",Justify2[Justify2.SpaceAround=4]="SpaceAround",Justify2[Justify2.SpaceEvenly=5]="SpaceEvenly",Justify2}({}),LogLevel=function(LogLevel2){return LogLevel2[LogLevel2.Error=0]="Error",LogLevel2[LogLevel2.Warn=1]="Warn",LogLevel2[LogLevel2.Info=2]="Info",LogLevel2[LogLevel2.Debug=3]="Debug",LogLevel2[LogLevel2.Verbose=4]="Verbose",LogLevel2[LogLevel2.Fatal=5]="Fatal",LogLevel2}({}),MeasureMode=function(MeasureMode2){return MeasureMode2[MeasureMode2.Undefined=0]="Undefined",MeasureMode2[MeasureMode2.Exactly=1]="Exactly",MeasureMode2[MeasureMode2.AtMost=2]="AtMost",MeasureMode2}({}),NodeType=function(NodeType2){return NodeType2[NodeType2.Default=0]="Default",NodeType2[NodeType2.Text=1]="Text",NodeType2}({}),Overflow=function(Overflow2){return Overflow2[Overflow2.Visible=0]="Visible",Overflow2[Overflow2.Hidden=1]="Hidden",Overflow2[Overflow2.Scroll=2]="Scroll",Overflow2}({}),PositionType=function(PositionType2){return PositionType2[PositionType2.Static=0]="Static",PositionType2[PositionType2.Relative=1]="Relative",PositionType2[PositionType2.Absolute=2]="Absolute",PositionType2}({}),Unit=function(Unit2){return Unit2[Unit2.Undefined=0]="Undefined",Unit2[Unit2.Point=1]="Point",Unit2[Unit2.Percent=2]="Percent",Unit2[Unit2.Auto=3]="Auto",Unit2}({}),Wrap=function(Wrap2){return Wrap2[Wrap2.NoWrap=0]="NoWrap",Wrap2[Wrap2.Wrap=1]="Wrap",Wrap2[Wrap2.WrapReverse=2]="WrapReverse",Wrap2}({}),constants2={ALIGN_AUTO:Align.Auto,ALIGN_FLEX_START:Align.FlexStart,ALIGN_CENTER:Align.Center,ALIGN_FLEX_END:Align.FlexEnd,ALIGN_STRETCH:Align.Stretch,ALIGN_BASELINE:Align.Baseline,ALIGN_SPACE_BETWEEN:Align.SpaceBetween,ALIGN_SPACE_AROUND:Align.SpaceAround,ALIGN_SPACE_EVENLY:Align.SpaceEvenly,BOX_SIZING_BORDER_BOX:BoxSizing.BorderBox,BOX_SIZING_CONTENT_BOX:BoxSizing.ContentBox,DIMENSION_WIDTH:Dimension.Width,DIMENSION_HEIGHT:Dimension.Height,DIRECTION_INHERIT:Direction.Inherit,DIRECTION_LTR:Direction.LTR,DIRECTION_RTL:Direction.RTL,DISPLAY_FLEX:Display.Flex,DISPLAY_NONE:Display.None,DISPLAY_CONTENTS:Display.Contents,EDGE_LEFT:Edge.Left,EDGE_TOP:Edge.Top,EDGE_RIGHT:Edge.Right,EDGE_BOTTOM:Edge.Bottom,EDGE_START:Edge.Start,EDGE_END:Edge.End,EDGE_HORIZONTAL:Edge.Horizontal,EDGE_VERTICAL:Edge.Vertical,EDGE_ALL:Edge.All,ERRATA_NONE:Errata.None,ERRATA_STRETCH_FLEX_BASIS:Errata.StretchFlexBasis,ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING:Errata.AbsolutePositionWithoutInsetsExcludesPadding,ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE:Errata.AbsolutePercentAgainstInnerSize,ERRATA_ALL:Errata.All,ERRATA_CLASSIC:Errata.Classic,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:ExperimentalFeature.WebFlexBasis,FLEX_DIRECTION_COLUMN:FlexDirection.Column,FLEX_DIRECTION_COLUMN_REVERSE:FlexDirection.ColumnReverse,FLEX_DIRECTION_ROW:FlexDirection.Row,FLEX_DIRECTION_ROW_REVERSE:FlexDirection.RowReverse,GUTTER_COLUMN:Gutter.Column,GUTTER_ROW:Gutter.Row,GUTTER_ALL:Gutter.All,JUSTIFY_FLEX_START:Justify.FlexStart,JUSTIFY_CENTER:Justify.Center,JUSTIFY_FLEX_END:Justify.FlexEnd,JUSTIFY_SPACE_BETWEEN:Justify.SpaceBetween,JUSTIFY_SPACE_AROUND:Justify.SpaceAround,JUSTIFY_SPACE_EVENLY:Justify.SpaceEvenly,LOG_LEVEL_ERROR:LogLevel.Error,LOG_LEVEL_WARN:LogLevel.Warn,LOG_LEVEL_INFO:LogLevel.Info,LOG_LEVEL_DEBUG:LogLevel.Debug,LOG_LEVEL_VERBOSE:LogLevel.Verbose,LOG_LEVEL_FATAL:LogLevel.Fatal,MEASURE_MODE_UNDEFINED:MeasureMode.Undefined,MEASURE_MODE_EXACTLY:MeasureMode.Exactly,MEASURE_MODE_AT_MOST:MeasureMode.AtMost,NODE_TYPE_DEFAULT:NodeType.Default,NODE_TYPE_TEXT:NodeType.Text,OVERFLOW_VISIBLE:Overflow.Visible,OVERFLOW_HIDDEN:Overflow.Hidden,OVERFLOW_SCROLL:Overflow.Scroll,POSITION_TYPE_STATIC:PositionType.Static,POSITION_TYPE_RELATIVE:PositionType.Relative,POSITION_TYPE_ABSOLUTE:PositionType.Absolute,UNIT_UNDEFINED:Unit.Undefined,UNIT_POINT:Unit.Point,UNIT_PERCENT:Unit.Percent,UNIT_AUTO:Unit.Auto,WRAP_NO_WRAP:Wrap.NoWrap,WRAP_WRAP:Wrap.Wrap,WRAP_WRAP_REVERSE:Wrap.WrapReverse},YGEnums_default=constants2;function wrapAssembly(lib){function patch(prototype,name15,fn){let original=prototype[name15];prototype[name15]=function(){for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return fn.call(this,original,...args)}}for(let fnName of["setPosition","setMargin","setFlexBasis","setWidth","setHeight","setMinWidth","setMinHeight","setMaxWidth","setMaxHeight","setPadding","setGap"]){let methods={[Unit.Point]:lib.Node.prototype[fnName],[Unit.Percent]:lib.Node.prototype[`${fnName}Percent`],[Unit.Auto]:lib.Node.prototype[`${fnName}Auto`]};patch(lib.Node.prototype,fnName,function(original){for(var _len2=arguments.length,args=Array(_len2>1?_len2-1:0),_key2=1;_key2<_len2;_key2++)args[_key2-1]=arguments[_key2];let value=args.pop(),unit,asNumber;if(value==="auto")unit=Unit.Auto,asNumber=void 0;else if(typeof value==="object")unit=value.unit,asNumber=value.valueOf();else if(unit=typeof value==="string"&&value.endsWith("%")?Unit.Percent:Unit.Point,asNumber=parseFloat(value),value!==void 0&&!Number.isNaN(value)&&Number.isNaN(asNumber))throw Error(`Invalid value ${value} for ${fnName}`);if(!methods[unit])throw Error(`Failed to execute "${fnName}": Unsupported unit '${value}'`);if(asNumber!==void 0)return methods[unit].call(this,...args,asNumber);else return methods[unit].call(this,...args)})}function wrapMeasureFunction(measureFunction){return lib.MeasureCallback.implement({measure:function(){let{width,height}=measureFunction(...arguments);return{width:width??NaN,height:height??NaN}}})}patch(lib.Node.prototype,"setMeasureFunc",function(original,measureFunc){if(measureFunc)return original.call(this,wrapMeasureFunction(measureFunc));else return this.unsetMeasureFunc()});function wrapDirtiedFunc(dirtiedFunction){return lib.DirtiedCallback.implement({dirtied:dirtiedFunction})}return patch(lib.Node.prototype,"setDirtiedFunc",function(original,dirtiedFunc){original.call(this,wrapDirtiedFunc(dirtiedFunc))}),patch(lib.Config.prototype,"free",function(){lib.Config.destroy(this)}),patch(lib.Node,"create",(_2,config2)=>{return config2?lib.Node.createWithConfig(config2):lib.Node.createDefault()}),patch(lib.Node.prototype,"free",function(){lib.Node.destroy(this)}),patch(lib.Node.prototype,"freeRecursive",function(){for(let t3=0,T=this.getChildCount();t3<T;++t3)this.getChild(0).freeRecursive();this.free()}),patch(lib.Node.prototype,"calculateLayout",function(original){let width=arguments.length>1&&arguments[1]!==void 0?arguments[1]:NaN,height=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,direction=arguments.length>3&&arguments[3]!==void 0?arguments[3]:Direction.LTR;return original.call(this,width,height,direction)}),{Config:lib.Config,Node:lib.Node,...YGEnums_default}}var Yoga=wrapAssembly(await yoga_wasm_base64_esm_default()),src_default=Yoga;var import_react_reconciler=__toESM(require_react_reconciler_development(),1),import_constants=__toESM(require_react_reconciler_constants_development(),1);import process14 from"node:process";function ansiRegex({onlyFirst=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",onlyFirst?void 0:"g")}var regex=ansiRegex();function stripAnsi(string5){if(typeof string5!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof string5}\``);if(!string5.includes("\x1B")&&!string5.includes(""))return string5;return string5.replace(regex,"")}var ambiguousRanges=[161,161,164,164,167,168,170,170,173,174,176,180,182,186,188,191,198,198,208,208,215,216,222,225,230,230,232,234,236,237,240,240,242,243,247,250,252,252,254,254,257,257,273,273,275,275,283,283,294,295,299,299,305,307,312,312,319,322,324,324,328,331,333,333,338,339,358,359,363,363,462,462,464,464,466,466,468,468,470,470,472,472,474,474,476,476,593,593,609,609,708,708,711,711,713,715,717,717,720,720,728,731,733,733,735,735,768,879,913,929,931,937,945,961,963,969,1025,1025,1040,1103,1105,1105,8208,8208,8211,8214,8216,8217,8220,8221,8224,8226,8228,8231,8240,8240,8242,8243,8245,8245,8251,8251,8254,8254,8308,8308,8319,8319,8321,8324,8364,8364,8451,8451,8453,8453,8457,8457,8467,8467,8470,8470,8481,8482,8486,8486,8491,8491,8531,8532,8539,8542,8544,8555,8560,8569,8585,8585,8592,8601,8632,8633,8658,8658,8660,8660,8679,8679,8704,8704,8706,8707,8711,8712,8715,8715,8719,8719,8721,8721,8725,8725,8730,8730,8733,8736,8739,8739,8741,8741,8743,8748,8750,8750,8756,8759,8764,8765,8776,8776,8780,8780,8786,8786,8800,8801,8804,8807,8810,8811,8814,8815,8834,8835,8838,8839,8853,8853,8857,8857,8869,8869,8895,8895,8978,8978,9312,9449,9451,9547,9552,9587,9600,9615,9618,9621,9632,9633,9635,9641,9650,9651,9654,9655,9660,9661,9664,9665,9670,9672,9675,9675,9678,9681,9698,9701,9711,9711,9733,9734,9737,9737,9742,9743,9756,9756,9758,9758,9792,9792,9794,9794,9824,9825,9827,9829,9831,9834,9836,9837,9839,9839,9886,9887,9919,9919,9926,9933,9935,9939,9941,9953,9955,9955,9960,9961,9963,9969,9972,9972,9974,9977,9979,9980,9982,9983,10045,10045,10102,10111,11094,11097,12872,12879,57344,63743,65024,65039,65533,65533,127232,127242,127248,127277,127280,127337,127344,127373,127375,127376,127387,127404,917760,917999,983040,1048573,1048576,1114109],fullwidthRanges=[12288,12288,65281,65376,65504,65510],halfwidthRanges=[8361,8361,65377,65470,65474,65479,65482,65487,65490,65495,65498,65500,65512,65518],narrowRanges=[32,126,162,163,165,166,172,172,175,175,10214,10221,10629,10630],wideRanges=[4352,4447,8986,8987,9001,9002,9193,9196,9200,9200,9203,9203,9725,9726,9748,9749,9776,9783,9800,9811,9855,9855,9866,9871,9875,9875,9889,9889,9898,9899,9917,9918,9924,9925,9934,9934,9940,9940,9962,9962,9970,9971,9973,9973,9978,9978,9981,9981,9989,9989,9994,9995,10024,10024,10060,10060,10062,10062,10067,10069,10071,10071,10133,10135,10160,10160,10175,10175,11035,11036,11088,11088,11093,11093,11904,11929,11931,12019,12032,12245,12272,12287,12289,12350,12353,12438,12441,12543,12549,12591,12593,12686,12688,12773,12783,12830,12832,12871,12880,42124,42128,42182,43360,43388,44032,55203,63744,64255,65040,65049,65072,65106,65108,65126,65128,65131,94176,94180,94192,94198,94208,101589,101631,101662,101760,101874,110576,110579,110581,110587,110589,110590,110592,110882,110898,110898,110928,110930,110933,110933,110948,110951,110960,111355,119552,119638,119648,119670,126980,126980,127183,127183,127374,127374,127377,127386,127488,127490,127504,127547,127552,127560,127568,127569,127584,127589,127744,127776,127789,127797,127799,127868,127870,127891,127904,127946,127951,127955,127968,127984,127988,127988,127992,128062,128064,128064,128066,128252,128255,128317,128331,128334,128336,128359,128378,128378,128405,128406,128420,128420,128507,128591,128640,128709,128716,128716,128720,128722,128725,128728,128732,128735,128747,128748,128756,128764,128992,129003,129008,129008,129292,129338,129340,129349,129351,129535,129648,129660,129664,129674,129678,129734,129736,129736,129741,129756,129759,129770,129775,129784,131072,196605,196608,262141];var isInRange=(ranges,codePoint)=>{let low=0,high=Math.floor(ranges.length/2)-1;while(low<=high){let mid=Math.floor((low+high)/2),i2=mid*2;if(codePoint<ranges[i2])high=mid-1;else if(codePoint>ranges[i2+1])low=mid+1;else return!0}return!1};var minimumAmbiguousCodePoint=ambiguousRanges[0],maximumAmbiguousCodePoint=ambiguousRanges.at(-1),minimumFullWidthCodePoint=fullwidthRanges[0],maximumFullWidthCodePoint=fullwidthRanges.at(-1),minimumHalfWidthCodePoint=halfwidthRanges[0],maximumHalfWidthCodePoint=halfwidthRanges.at(-1),minimumNarrowCodePoint=narrowRanges[0],maximumNarrowCodePoint=narrowRanges.at(-1),minimumWideCodePoint=wideRanges[0],maximumWideCodePoint=wideRanges.at(-1),commonCjkCodePoint=19968,[wideFastPathStart,wideFastPathEnd]=findWideFastPathRange(wideRanges);function findWideFastPathRange(ranges){let fastPathStart=ranges[0],fastPathEnd=ranges[1];for(let index=0;index<ranges.length;index+=2){let start=ranges[index],end=ranges[index+1];if(commonCjkCodePoint>=start&&commonCjkCodePoint<=end)return[start,end];if(end-start>fastPathEnd-fastPathStart)fastPathStart=start,fastPathEnd=end}return[fastPathStart,fastPathEnd]}var isAmbiguous=(codePoint)=>{if(codePoint<minimumAmbiguousCodePoint||codePoint>maximumAmbiguousCodePoint)return!1;return isInRange(ambiguousRanges,codePoint)},isFullWidth=(codePoint)=>{if(codePoint<minimumFullWidthCodePoint||codePoint>maximumFullWidthCodePoint)return!1;return isInRange(fullwidthRanges,codePoint)};var isWide=(codePoint)=>{if(codePoint>=wideFastPathStart&&codePoint<=wideFastPathEnd)return!0;if(codePoint<minimumWideCodePoint||codePoint>maximumWideCodePoint)return!1;return isInRange(wideRanges,codePoint)};function validate(codePoint){if(!Number.isSafeInteger(codePoint))throw TypeError(`Expected a code point, got \`${typeof codePoint}\`.`)}function eastAsianWidth(codePoint,{ambiguousAsWide=!1}={}){if(validate(codePoint),isFullWidth(codePoint)||isWide(codePoint)||ambiguousAsWide&&isAmbiguous(codePoint))return 2;return 1}var import_emoji_regex=__toESM(require_emoji_regex(),1),segmenter=new Intl.Segmenter,defaultIgnorableCodePointRegex=/^\p{Default_Ignorable_Code_Point}$/u;function stringWidth(string5,options={}){if(typeof string5!=="string"||string5.length===0)return 0;let{ambiguousIsNarrow=!0,countAnsiEscapeCodes=!1}=options;if(!countAnsiEscapeCodes)string5=stripAnsi(string5);if(string5.length===0)return 0;let width=0,eastAsianWidthOptions={ambiguousAsWide:!ambiguousIsNarrow};for(let{segment:character}of segmenter.segment(string5)){let codePoint=character.codePointAt(0);if(codePoint<=31||codePoint>=127&&codePoint<=159)continue;if(codePoint>=8203&&codePoint<=8207||codePoint===65279)continue;if(codePoint>=768&&codePoint<=879||codePoint>=6832&&codePoint<=6911||codePoint>=7616&&codePoint<=7679||codePoint>=8400&&codePoint<=8447||codePoint>=65056&&codePoint<=65071)continue;if(codePoint>=55296&&codePoint<=57343)continue;if(codePoint>=65024&&codePoint<=65039)continue;if(defaultIgnorableCodePointRegex.test(character))continue;if(import_emoji_regex.default().test(character)){width+=2;continue}width+=eastAsianWidth(codePoint,eastAsianWidthOptions)}return width}function widestLine(string5){let lineWidth=0;for(let line of string5.split(`
|
|
1247
1247
|
`))lineWidth=Math.max(lineWidth,stringWidth(line));return lineWidth}var cache={},measureText=(text)=>{if(text.length===0)return{width:0,height:0};let cachedDimensions=cache[text];if(cachedDimensions)return cachedDimensions;let width=widestLine(text),height=text.split(`
|
|
1248
1248
|
`).length;return cache[text]={width,height},{width,height}},measure_text_default=measureText;var wrapAnsi16=(offset=0)=>(code)=>`\x1B[${code+offset}m`,wrapAnsi256=(offset=0)=>(code)=>`\x1B[${38+offset};5;${code}m`,wrapAnsi16m=(offset=0)=>(red,green,blue)=>`\x1B[${38+offset};2;${red};${green};${blue}m`,styles={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},modifierNames=Object.keys(styles.modifier),foregroundColorNames=Object.keys(styles.color),backgroundColorNames=Object.keys(styles.bgColor),colorNames=[...foregroundColorNames,...backgroundColorNames];function assembleStyles(){let codes=new Map;for(let[groupName,group]of Object.entries(styles)){for(let[styleName,style]of Object.entries(group))styles[styleName]={open:`\x1B[${style[0]}m`,close:`\x1B[${style[1]}m`},group[styleName]=styles[styleName],codes.set(style[0],style[1]);Object.defineProperty(styles,groupName,{value:group,enumerable:!1})}return Object.defineProperty(styles,"codes",{value:codes,enumerable:!1}),styles.color.close="\x1B[39m",styles.bgColor.close="\x1B[49m",styles.color.ansi=wrapAnsi16(),styles.color.ansi256=wrapAnsi256(),styles.color.ansi16m=wrapAnsi16m(),styles.bgColor.ansi=wrapAnsi16(10),styles.bgColor.ansi256=wrapAnsi256(10),styles.bgColor.ansi16m=wrapAnsi16m(10),Object.defineProperties(styles,{rgbToAnsi256:{value(red,green,blue){if(red===green&&green===blue){if(red<8)return 16;if(red>248)return 231;return Math.round((red-8)/247*24)+232}return 16+36*Math.round(red/255*5)+6*Math.round(green/255*5)+Math.round(blue/255*5)},enumerable:!1},hexToRgb:{value(hex3){let matches2=/[a-f\d]{6}|[a-f\d]{3}/i.exec(hex3.toString(16));if(!matches2)return[0,0,0];let[colorString]=matches2;if(colorString.length===3)colorString=[...colorString].map((character)=>character+character).join("");let integer2=Number.parseInt(colorString,16);return[integer2>>16&255,integer2>>8&255,integer2&255]},enumerable:!1},hexToAnsi256:{value:(hex3)=>styles.rgbToAnsi256(...styles.hexToRgb(hex3)),enumerable:!1},ansi256ToAnsi:{value(code){if(code<8)return 30+code;if(code<16)return 90+(code-8);let red,green,blue;if(code>=232)red=((code-232)*10+8)/255,green=red,blue=red;else{code-=16;let remainder=code%36;red=Math.floor(code/36)/5,green=Math.floor(remainder/6)/5,blue=remainder%6/5}let value=Math.max(red,green,blue)*2;if(value===0)return 30;let result2=30+(Math.round(blue)<<2|Math.round(green)<<1|Math.round(red));if(value===2)result2+=60;return result2},enumerable:!1},rgbToAnsi:{value:(red,green,blue)=>styles.ansi256ToAnsi(styles.rgbToAnsi256(red,green,blue)),enumerable:!1},hexToAnsi:{value:(hex3)=>styles.ansi256ToAnsi(styles.hexToAnsi256(hex3)),enumerable:!1}}),styles}var ansiStyles=assembleStyles(),ansi_styles_default=ansiStyles;var ESCAPES=new Set(["\x1B",""]),END_CODE=39,ANSI_ESCAPE_BELL="\x07",ANSI_CSI="[",ANSI_OSC="]",ANSI_SGR_TERMINATOR="m",ANSI_ESCAPE_LINK=`${ANSI_OSC}8;;`,wrapAnsiCode=(code)=>`${ESCAPES.values().next().value}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`,wrapAnsiHyperlink=(url2)=>`${ESCAPES.values().next().value}${ANSI_ESCAPE_LINK}${url2}${ANSI_ESCAPE_BELL}`,wordLengths=(string5)=>string5.split(" ").map((character)=>stringWidth(character)),wrapWord=(rows,word,columns)=>{let characters=[...word],isInsideEscape=!1,isInsideLinkEscape=!1,visible=stringWidth(stripAnsi(rows.at(-1)));for(let[index,character]of characters.entries()){let characterLength=stringWidth(character);if(visible+characterLength<=columns)rows[rows.length-1]+=character;else rows.push(character),visible=0;if(ESCAPES.has(character))isInsideEscape=!0,isInsideLinkEscape=characters.slice(index+1,index+1+ANSI_ESCAPE_LINK.length).join("")===ANSI_ESCAPE_LINK;if(isInsideEscape){if(isInsideLinkEscape){if(character===ANSI_ESCAPE_BELL)isInsideEscape=!1,isInsideLinkEscape=!1}else if(character===ANSI_SGR_TERMINATOR)isInsideEscape=!1;continue}if(visible+=characterLength,visible===columns&&index<characters.length-1)rows.push(""),visible=0}if(!visible&&rows.at(-1).length>0&&rows.length>1)rows[rows.length-2]+=rows.pop()},stringVisibleTrimSpacesRight=(string5)=>{let words2=string5.split(" "),last2=words2.length;while(last2>0){if(stringWidth(words2[last2-1])>0)break;last2--}if(last2===words2.length)return string5;return words2.slice(0,last2).join(" ")+words2.slice(last2).join("")},exec=(string5,columns,options={})=>{if(options.trim!==!1&&string5.trim()==="")return"";let returnValue="",escapeCode,escapeUrl,lengths=wordLengths(string5),rows=[""];for(let[index,word]of string5.split(" ").entries()){if(options.trim!==!1)rows[rows.length-1]=rows.at(-1).trimStart();let rowLength=stringWidth(rows.at(-1));if(index!==0){if(rowLength>=columns&&(options.wordWrap===!1||options.trim===!1))rows.push(""),rowLength=0;if(rowLength>0||options.trim===!1)rows[rows.length-1]+=" ",rowLength++}if(options.hard&&lengths[index]>columns){let remainingColumns=columns-rowLength,breaksStartingThisLine=1+Math.floor((lengths[index]-remainingColumns-1)/columns);if(Math.floor((lengths[index]-1)/columns)<breaksStartingThisLine)rows.push("");wrapWord(rows,word,columns);continue}if(rowLength+lengths[index]>columns&&rowLength>0&&lengths[index]>0){if(options.wordWrap===!1&&rowLength<columns){wrapWord(rows,word,columns);continue}rows.push("")}if(rowLength+lengths[index]>columns&&options.wordWrap===!1){wrapWord(rows,word,columns);continue}rows[rows.length-1]+=word}if(options.trim!==!1)rows=rows.map((row)=>stringVisibleTrimSpacesRight(row));let preString=rows.join(`
|