@code-yeongyu/senpi 2026.9.19-2 → 2026.9.19
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/CHANGELOG.md +0 -14
- package/dist/bundle/chunks/{app-server-command-QBJ4GPN7.js → app-server-command-QK7Q6XK5.js} +1 -1
- package/dist/bundle/chunks/{chunk-EHSDTQ6I.js → chunk-KKDSBABY.js} +5 -5
- package/dist/bundle/chunks/{chunk-5E5TLB76.js → chunk-NARL7XFO.js} +1 -1
- package/dist/bundle/chunks/{cli-main-MLJ2H637.js → cli-main-7SG3K4K3.js} +1 -1
- package/dist/bundle/chunks/{interactive-mode-7C75IXNF.js → interactive-mode-7MN6GGCG.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-2YCJKQOL.js → multi-session-host-WKX34SOP.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-4ANSELYT.js → package-manager-cli-CB2X57TD.js} +1 -1
- package/dist/bundle/chunks/{rpc-mode-OPFQIWFP.js → rpc-mode-CI6V2SBW.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +4 -4
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/agent-session.d.ts +0 -4
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +33 -57
- package/dist/core/agent-session.js.map +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +0 -12
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
|
|
2
|
-
import{CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,SessionSelectorComponent,appendHiddenTuiStdout,appendUncaughtCrashLog,areExperimentalFeaturesEnabled,formatKeyText,keyDisplayText,keyHint,keyText,minimatch,parseGitUrl,rawKeyHint,readPiManifest,readSkillMarkdownSource,redactSensitiveOutput,redactSensitiveTokenValues,require_ignore,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector}from"./chunk-3FRTRCR6.js";import{TIP_DEFINITIONS}from"./chunk-EONVPHVX.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-3Q4WGKFA.js";import{CURRENT_SESSION_VERSION,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,GOAL_CONTINUATION_MESSAGE_TYPE,MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,SESSION_CONTEXT_ENTRY_ID,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,assertSessionCwdExists,assertValidSessionId,buildContextEntries,buildSessionContext,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,executeBashWithOperations,formatMissingSessionCwdPrompt,formatSize,getDefaultSessionDir,getLatestCompactionEntry,getMissingSessionCwdIssue,getSessionContextEntryId,isContextExcludedCustomMessage,isTransportGoneError,migrateSessionEntries,parseSessionEntries,reserveSessionWrite,sessionEntryToContextMessages,stripAnsi,truncateHead,truncateLine,truncateTail,unregisterSessionWriter}from"./chunk-W4SRGDQ4.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MAX_DURABLE_MONITORS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,safeRegExp}from"./chunk-GFUZPFHN.js";import{AssistantEditError,BUILT_IN_PROVIDER_DISPLAY_NAMES,CLAUDE_SDK_OAUTH_PROVIDER_ID,CODEX_RESPONSES_API,FooterDataProvider,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,SENTINEL_OAUTH_FIELDS,SessionStreamingError,addAccount,all_exports,assertExpectedLeaf,assertValidAccountName,assistantTextEquals,buildEditedAssistantMessage,builtinProviders,classifyReasoningCapability,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findGitPaths,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,upsertAccount}from"./chunk-5E5TLB76.js";import{Theme,canonicalWatchPath,detectTerminalBackgroundFromEnv,detectTerminalBackgroundTheme,detectTerminalThemeForAuto,flushRawStdout,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getThemeByName,getThemeExportColors,highlightCode,initTheme,loadThemeFromPath,onThemeChange,parseAutoThemeSetting,probeDirectoryOpenable,resolveThemeSetting,restoreStderr,restoreStdout,setRegisteredThemes,setTheme,setThemeInstance,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,watchWithErrorHandler,writeRawStdout}from"./chunk-RLRLQRI2.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,Z,decodeKittyPrintable,dist_exports,expandPasteMarkers,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,hyperlink,imageFallback,isKeyRelease,isViewportTUI,matchesKey,outerKittyGraphicsMode,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-YRN3PCTM.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SettingsManager,TERMINAL_MOUSE_MODES,applyHttpProxySettings,configureHttpDispatcher,formatHttpIdleTimeoutMs,getSettingsPath,isTerminalMouseMode,parseSettingsJson,require_undici,wasSelfWrite}from"./chunk-PLZK7ABD.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{DEFAULT_HOST_LAUNCH_SPEC,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HostLaunchSpecError,loadHostLaunchSpec,parseHostLaunchSpec,readHostStatus,runHostCommand,runHostRequest}from"./chunk-IUZUN32Z.js";import{GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,decideHostAction,ensureHost,handoffHost,parseHostProtocolInfo,probeHost,stopHost}from"./chunk-P7PWCGLJ.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-U6Z6OBX4.js";import{createHostDaemonPaths}from"./chunk-LF3XTYYF.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-HSH674C6.js";import{createRgEngine,ensureTool}from"./chunk-BQVRDBW6.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialFailoverError,TURN_RETRY_SUPPRESSION_PREFIX,getConfigValueEnvVarNames,isCommandConfigValue,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep}from"./chunk-XK24AFYU.js";import{discoverEnvSlots}from"./chunk-MUC3MZTV.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid}from"./chunk-2H3Y7EYQ.js";import{AssistantMessageFrameEncoder,Compile,DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,StringEnum,compile_exports,composeShellCommand,contentText,cursorOverflowCompactionSettings,describeProviderStallForUser,dropFailedAssistantTurns,findEnvKeys,getApiProvider,getCursorVariantAlias,getEnvApiKey,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isProviderStreamStallError,isProviderTimeoutError,isRecoverableLength,isRetryableAssistantError,isRetryableErrorMessage,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,retryAssistantCall,retryDelayMs,retryTransientCall,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-FDLVINNY.js";import{extractOpenAiCodexAccountId,setWireIdentity,uuidv7}from"./chunk-56TWFZ2C.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,isLockError}from"./chunk-7X72IACK.js";import{external_exports}from"./chunk-3XHLKHSK.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{cleanupSessionResources}from"./chunk-WVGCQOLJ.js";import{isAnthropicApiBaseUrl,resolvePromptCacheTtlSeconds}from"./chunk-EAMTSSEH.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance}from"./chunk-OYXTZDVT.js";import{parseStreamingJson}from"./chunk-FC7R7NOV.js";import{ModelsError,accountLabel,appendLoginSlot,calculateCost,clampThinkingLevel,createModels,estimateContextTokens,lazyStream,listSlots,modelsAreEqual,providerNotConfiguredMessage,removeSlot,repairManagedSentinelSlots,upsertSlot}from"./chunk-I3F6VZZF.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-BPX6QWPD.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{INSPECTOR_VM_IMPORT_WARNING,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,getPiUserAgent,getReleaseChangelogUrl,isRecoverableInspectorVmImportError}from"./chunk-TVOODZJH.js";import{require_semver}from"./chunk-I7YUNMWH.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-U7RQY7MH.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-UAYBYTFN.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-QPIXPR6I.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-HGAX6JZ7.js";import{source_default}from"./chunk-26UBFF6N.js";import{require_proper_lockfile}from"./chunk-3P23SBT3.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,VERSION,canonicalizePath,envValue,expandTildePath,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-H5RK2RYZ.js";import{__commonJS,__export,__toESM}from"./chunk-VR4X5O2Z.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win325){return win325===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform4=navigator.platform.toLowerCase();return platform4==="win32"||platform4==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path13,{windows}={})=>{let segs=path13.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance();continue}if(code===CHAR_RIGHT_PARENTHESES){isGlob=token.isGlob=!0,finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){for(;eos()!==!0&&(code=advance());){if(code===CHAR_LEFT_PARENTHESES){backslashes=token.backslashes=!0,code=advance();continue}if(code===CHAR_RIGHT_PARENTHESES){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state.maxDepth=0,isPathSeparator(code)||tokens.push(token),state.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n=prevIndex?prevIndex+1:start,i=slashes[idx],value2=input.slice(n,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value2,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),(idx!==0||value2!=="")&&parts.push(value2),prevIndex=i}if(prevIndex&&prevIndex+1<input.length){let value2=input.slice(prevIndex+1);parts.push(value2),opts.tokens&&(tokens[tokens.length-1].value=value2,depth(tokens[tokens.length-1]),state.maxDepth+=tokens[tokens.length-1].depth)}state.slashes=slashes,state.parts=parts}return state};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants10=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants10,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants10.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants10.globChars(opts.windows),EXTGLOB_CHARS=constants10.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open7=tokens[token.tokensIndex];open7.type="text",open7.value=literal,open7.output=safeOutput||utils.escapeRegex(literal);for(let i=token.tokensIndex+1;i<tokens.length;i++)tokens[i].value="",tokens[i].output="",delete tokens[i].suffix;state.output=token.output+open7.output,state.backtrack=!0,push({type:"paren",extglob:!0,value:value2,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse5(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state.negatedExtglob=!0)}push({type:"paren",extglob:!0,value:value2,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state.output=input,state):(state.output=utils.wrapOutput(output,state,options),state)}for(;!eos();){if(value2=advance(),value2==="\0")continue;if(value2==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value2+="\\",push({type:"text",value:value2});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state.index+=slashes,slashes%2!==0&&(value2+="\\")),opts.unescape===!0?value2=advance():value2+=advance(),state.brackets===0){push({type:"text",value:value2});continue}}if(state.brackets>0&&(value2!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value2===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value2==="["&&peek()!==":"||value2==="-"&&peek()==="]")&&(value2=`\\${value2}`),value2==="]"&&(prev.value==="["||prev.value==="[^")&&(value2=`\\${value2}`),opts.posix===!0&&value2==="!"&&prev.value==="["&&(value2="^"),prev.value+=value2,append({value:value2});continue}if(state.quotes===1&&value2!=='"'){value2=utils.escapeRegex(value2),prev.value+=value2,append({value:value2});continue}if(value2==='"'){state.quotes=state.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value:value2});continue}if(value2==="("){increment("parens"),push({type:"paren",value:value2});continue}if(value2===")"){if(state.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value:value2,output:state.parens?")":"\\)"}),decrement("parens");continue}if(value2==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value2=`\\${value2}`}else increment("brackets");push({type:"bracket",value:value2});continue}if(value2==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value:value2,output:`\\${value2}`});continue}if(state.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value:value2,output:`\\${value2}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value2=`/${value2}`),prev.value+=value2,append({value:value2}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state.output=state.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state.output+=prev.value;continue}if(value2==="{"&&opts.nobrace!==!0){increment("braces");let open7={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open7),push(open7);continue}if(value2==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value:value2,output:value2});continue}let output=")";if(brace.dots===!0){let arr=tokens.slice(),range=[];for(let i=arr.length-1;i>=0&&(tokens.pop(),arr[i].type!=="brace");i--)arr[i].type!=="dots"&&range.unshift(arr[i].value);output=expandRange(range,opts),state.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state.output.slice(0,brace.outputIndex),toks=state.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value2=output="\\}",state.output=out;for(let t of toks)state.output+=t.output||t.value}push({type:"brace",value:value2,output}),decrement("braces"),braces.pop();continue}if(value2==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value:value2});continue}if(value2===","){let output=value2,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value:value2,output});continue}if(value2==="/"){if(prev.type==="dot"&&state.index===state.start+1){state.start=state.index+1,state.consumed="",state.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value:value2,output:SLASH_LITERAL});continue}if(value2==="."){if(state.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value2,prev.value+=value2,brace.dots=!0;continue}if(state.braces+state.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value:value2,output:DOT_LITERAL});continue}push({type:"dot",value:value2,output:DOT_LITERAL});continue}if(value2==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value2);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value2;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value2}`),push({type:"text",value:value2,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value:value2,output:QMARK_NO_DOT});continue}push({type:"qmark",value:value2,output:QMARK});continue}if(value2==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value2);continue}if(opts.nonegate!==!0&&state.index===0){negate();continue}}if(value2==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value2);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value:value2,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state.parens>0){push({type:"plus",value:value2});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value2==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value:value2,output:""});continue}push({type:"text",value:value2});continue}if(value2!=="*"){(value2==="$"||value2==="^")&&(value2=`\\${value2}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value2+=match[0],state.index+=match[0].length),push({type:"text",value:value2});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value2,prev.output=star,state.backtrack=!0,state.globstar=!0,consume(value2);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value2);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value2);continue}let prior=prev.prev,before=prior.prev,isStart=prior.type==="slash"||prior.type==="bos",afterStar=before&&(before.type==="star"||before.type==="globstar");if(opts.bash===!0&&(!isStart||rest[0]&&rest[0]!=="/")){push({type:"star",value:value2,output:""});continue}let isBrace=state.braces>0&&(prior.type==="comma"||prior.type==="brace"),isExtglob=extglobs.length&&(prior.type==="pipe"||prior.type==="paren");if(!isStart&&prior.type!=="paren"&&!isBrace&&!isExtglob){push({type:"star",value:value2,output:""});continue}for(;rest.slice(0,3)==="/**";){let after=input[state.index+4];if(after&&after!=="/")break;rest=rest.slice(3),consume("/**",3)}if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value2,prev.output=globstar(opts),state.output=prev.output,state.globstar=!0,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&eos()){state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value2,state.globstar=!0,state.output+=prior.output+prev.output,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value2,state.output+=prior.output+prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value2,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state.output=prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}state.output=state.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value2,state.output+=prev.output,state.globstar=!0,consume(value2);continue}let token={type:"star",value:value2,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value2,push(token);continue}(state.index===state.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state.output=utils.escapeLast(state.output,"["),decrement("brackets")}for(;state.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state.output=utils.escapeLast(state.output,"("),decrement("parens")}for(;state.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state.output=utils.escapeLast(state.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state.backtrack===!0){state.output="";for(let token of state.tokens)state.output+=token.output!=null?token.output:token.value,token.suffix&&(state.output+=token.suffix)}return state};parse5.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants10.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source2=create(match[1]);return source2?source2+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source=create(output);return source&&opts.strictSlashes!==!0&&(source+=`${SLASH_LITERAL}?`),source};module.exports=parse5}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse5=require_parse(),utils=require_utils(),constants10=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex.state;delete regex.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex,options,{glob,posix:posix5}),result3={glob,state,regex,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex,options,posix5):match=regex.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse5(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source=`^(?!${source}).*$`);let regex=picomatch4.toRegex(source,options);return returnState===!0&&(regex.state=state),regex};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse5.fastpaths(input,options)),parsed.output||(parsed=parse5(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source,options)=>{try{let opts=options||{};return new RegExp(source,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants10;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os6 from"node:os";import*as path12 from"node:path";import{spawn as spawn11,spawnSync}from"child_process";import{randomUUID as randomUUID11}from"node:crypto";import{existsSync as existsSync35,mkdirSync as mkdirSync23,readFileSync as readFileSync35,writeFileSync as writeFileSync19}from"node:fs";import{rm as rm9}from"node:fs/promises";import{dirname as dirname43}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual2}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES2,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES2,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize2,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead2,truncateLine:()=>truncateLine2,truncateTail:()=>truncateTail2,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2);return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let newMessages=[...prompts],currentContext={...context,messages:[...context.messages,...prompts]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let prompt of prompts)await emit({type:"message_start",message:prompt}),await emit({type:"message_end",message:prompt});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}if(pendingMessages.length>0){for(let message2 of pendingMessages)await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);pendingMessages=[]}let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}let nextTurnContext={message,toolResults,context:currentContext,newMessages};if(await config.shouldStopAfterTurn?.(nextTurnContext)){await emit({type:"agent_end",messages:newMessages});return}if(toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,config={...config,model:nextTurnSnapshot.model??config.model,reasoning:nextTurnSnapshot.thinkingLevel===void 0?config.reasoning:nextTurnSnapshot.thinkingLevel==="off"?void 0:nextTurnSnapshot.thinkingLevel,thinkingSelection:nextTurnSnapshot.thinkingSelection===void 0?config.thinkingSelection:nextTurnSnapshot.thinkingSelection??void 0,abortServerSideFallback:nextTurnSnapshot.abortServerSideFallback??config.abortServerSideFallback}),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[])}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){pendingMessages=followUpMessages;continue}break}await emit({type:"agent_end",messages:newMessages})}async function buildProviderContext(context,config,signal){let messages=context.messages;return config.transformContext&&(messages=await config.transformContext(messages,signal)),{systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),tools:context.tools}}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result3=>{providerToolResults.push(result3)}}:{}}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await response.result(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await response.result();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(resolve42=>{let abortHandler=()=>resolve42(ABORTED);signal.addEventListener("abort",abortHandler,{once:!0}),removeAbortListener2=()=>signal.removeEventListener("abort",abortHandler)})),{next:async()=>{if(signal?.aborted)return closeAssistantIterator(iterator),Promise.reject(abortError(signal.reason));let useStartBound=!sawFirstEvent&&startTimeoutMs!==void 0,result3=await readNextAssistantEvent(iterator,useStartBound?startTimeoutMs:idleTimeoutMs,useStartBound?ms=>new StreamStartTimeoutError(ms):ms=>new StreamIdleTimeoutError(ms),abortPromise,onIdleTimeout,stream2,signal);return result3.done||(sawFirstEvent=!0),result3},dispose:()=>removeAbortListener2?.()}}async function readNextAssistantEvent(iterator,idleTimeoutMs,makeTimeoutError,abortPromise,onIdleTimeout,stream2,signal){if(idleTimeoutMs===void 0&&abortPromise===void 0)return iterator.next();let timeout,settled=!1;return new Promise((resolve42,reject)=>{let settle=complete=>{settled||(settled=!0,timeout!==void 0&&clearTimeout(timeout),complete())};if(idleTimeoutMs!==void 0){let onIdleDeadline=()=>{if(stream2?.hasPendingLocalWork?.()){timeout=setTimeout(onIdleDeadline,idleTimeoutMs);return}let error2=makeTimeoutError(idleTimeoutMs);closeAssistantIterator(iterator),settle(()=>reject(error2)),onIdleTimeout?.(error2)};timeout=setTimeout(onIdleDeadline,idleTimeoutMs)}(abortPromise?Promise.race([iterator.next(),abortPromise]):iterator.next()).then(result3=>{if(result3===ABORTED){closeAssistantIterator(iterator),settle(()=>reject(abortError(signal?.reason)));return}settle(()=>resolve42(result3))},error2=>settle(()=>reject(error2)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage8){return errorMessage8!==void 0?`${errorMessage8}${errorMessage8.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return config.toolExecution==="sequential"?executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit):executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit)}async function executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,emit);finalized=await finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);if(await emitToolResultMessage(toolResultMessage,emit),finalizedCalls.push(finalized),messages.push(toolResultMessage),signal?.aborted)break}return{messages,terminate:shouldTerminateToolBatch(finalizedCalls)}}async function executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],preparedCalls=[],lastSequentialCall,currentParallelWave=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,config,signal),isSequential=isSequentialToolCall(currentContext,toolCall),dependencies=isSequential?[...lastSequentialCall?[lastSequentialCall]:[],...currentParallelWave]:lastSequentialCall?[lastSequentialCall]:[];if(preparedCalls.push({preparation,isSequential,dependencies}),isSequential?(lastSequentialCall=void 0,currentParallelWave=[]):currentParallelWave.push(Promise.resolve(void 0)),signal?.aborted)break}let previousSequential,previousWave=[];for(let{preparation,isSequential}of preparedCalls){let dependencies=isSequential?[...previousSequential?[previousSequential]:[],...previousWave]:previousSequential?[previousSequential]:[],finalizedCall=(async()=>{await Promise.all(dependencies);let finalized=signal?.aborted?{toolCall:preparation.toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:await runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit);return await emitToolExecutionEnd(finalized,emit),finalized})();finalizedCalls.push(finalizedCall),isSequential?(previousSequential=finalizedCall,previousWave=[]):previousWave.push(finalizedCall)}let orderedFinalizedCalls=await Promise.all(finalizedCalls),messages=[];for(let finalized of orderedFinalizedCalls){let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:shouldTerminateToolBatch(orderedFinalizedCalls)}}async function runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit){if(preparation.kind==="immediate")return{toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,emit);return finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}function isSequentialToolCall(currentContext,toolCall){return currentContext.tools?.find(tool=>tool.name===toolCall.name)?.executionMode==="sequential"}function shouldTerminateToolBatch(finalizedCalls){return finalizedCalls.length>0&&finalizedCalls.every(finalized=>finalized.result.terminate===!0)}function prepareAgentToolCallArguments(tool,toolCall){if(!tool.prepareArguments)return toolCall;let preparedArguments=tool.prepareArguments(toolCall.arguments);return preparedArguments===toolCall.arguments?toolCall:{...toolCall,arguments:preparedArguments}}function prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};let tool=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(!tool&&config.resolveUnknownToolCall&&(tool=await config.resolveUnknownToolCall(toolCall.name,currentContext)),!tool){let hint=config.removedToolHints?.[toolCall.name];return{kind:"immediate",toolCall,result:createErrorToolResult(hint===void 0?`Tool ${toolCall.name} not found`:`Tool ${toolCall.name} not found. ${hint}`),isError:!0}}try{let preparedToolCall=prepareAgentToolCall(tool,toolCall),validatedArgs=preparedToolCall.args;if(config.beforeToolCall){let beforeResult=await config.beforeToolCall({assistantMessage,toolCall:preparedToolCall.toolCall,args:validatedArgs,context:currentContext},signal);if(signal?.aborted)return{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0};if(beforeResult?.block){let result3=createErrorToolResult(beforeResult.reason||"Tool execution was blocked");return beforeResult.terminate===!0&&(result3.terminate=!0),{kind:"immediate",toolCall,result:result3,isError:!0}}}return signal?.aborted?{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:{kind:"prepared",toolCall:preparedToolCall.toolCall,tool,args:validatedArgs}}catch(error2){return{kind:"immediate",toolCall,result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}}function abortReleasePromise(signal){if(signal!==void 0)return signal.aborted?Promise.resolve(ABORTED):new Promise(resolve42=>{signal.addEventListener("abort",()=>resolve42(ABORTED),{once:!0})})}async function executePreparedToolCall(prepared,signal,emit){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(emit({type:"tool_execution_update",toolCallId:prepared.toolCall.id,toolName:prepared.toolCall.name,args:prepared.toolCall.arguments,partialResult})))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error2){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result3=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result:result3,isError,context:currentContext},signal);afterResult&&(result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},isError=afterResult.isError??isError)}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return{toolCall:prepared.toolCall,result:result3,isError}}function createErrorToolResult(message){return{content:[{type:"text",text:message}],details:{}}}async function emitToolExecutionEnd(finalized,emit){await emit({type:"tool_execution_end",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,result:finalized.result,isError:finalized.isError})}function createToolResultMessage(finalized){return{role:"toolResult",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,content:finalized.result.content??[],details:finalized.result.details,usage:finalized.result.usage,...finalized.result.addedToolNames?.length?{addedToolNames:finalized.result.addedToolNames}:{},isError:finalized.isError,timestamp:Date.now()}}async function emitToolResultMessage(toolResultMessage,emit){await emit({type:"message_start",message:toolResultMessage}),await emit({type:"message_end",message:toolResultMessage})}function defaultConvertToLlm(messages){return messages.filter(message=>message.role==="user"||message.role==="assistant"||message.role==="toolResult")}var EMPTY_USAGE2={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},DEFAULT_MODEL={id:"unknown",name:"unknown",api:"unknown",provider:"unknown",baseUrl:"",reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function createMutableAgentState(initialState){let tools=initialState?.tools?.slice()??[],messages=initialState?.messages?.slice()??[];return{systemPrompt:initialState?.systemPrompt??"",model:initialState?.model??DEFAULT_MODEL,thinkingLevel:initialState?.thinkingLevel??"off",reasoningBaseline:initialState?.reasoningBaseline,get tools(){return tools},set tools(nextTools){tools=nextTools.slice()},get messages(){return messages},set messages(nextMessages){messages=nextMessages.slice()},isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0}}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}drain(){if(this.mode==="all"){let drained=this.messages.slice();return this.messages=[],drained}let first=this.messages[0];return first?(this.messages=this.messages.slice(1),[first]):[]}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.shouldStopAfterTurn=runtimeOptions.shouldStopAfterTurn,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage)throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice()}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),shouldStopAfterTurn=this.shouldStopAfterTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,shouldStopAfterTurn:shouldStopAfterTurn?async context=>await shouldStopAfterTurn(context,this.signal):void 0,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve42=>{resolvePromise=resolve42});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage);break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve42,reject)=>{resolveCompletion=resolve42,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome){this.resolveCompletion(outcome)}fail(error2){this.rejectCompletion(error2)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error2){this.control.close(error2),this.closeSignal.aborted||this.closeController.abort(error2),this.rejectCompletion(error2)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
|
|
2
|
+
import{CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,SessionSelectorComponent,appendHiddenTuiStdout,appendUncaughtCrashLog,areExperimentalFeaturesEnabled,formatKeyText,keyDisplayText,keyHint,keyText,minimatch,parseGitUrl,rawKeyHint,readPiManifest,readSkillMarkdownSource,redactSensitiveOutput,redactSensitiveTokenValues,require_ignore,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector}from"./chunk-3FRTRCR6.js";import{TIP_DEFINITIONS}from"./chunk-EONVPHVX.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-3Q4WGKFA.js";import{CURRENT_SESSION_VERSION,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,GOAL_CONTINUATION_MESSAGE_TYPE,MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,SESSION_CONTEXT_ENTRY_ID,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,assertSessionCwdExists,assertValidSessionId,buildContextEntries,buildSessionContext,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,executeBashWithOperations,formatMissingSessionCwdPrompt,formatSize,getDefaultSessionDir,getLatestCompactionEntry,getMissingSessionCwdIssue,getSessionContextEntryId,isContextExcludedCustomMessage,isTransportGoneError,migrateSessionEntries,parseSessionEntries,reserveSessionWrite,sessionEntryToContextMessages,stripAnsi,truncateHead,truncateLine,truncateTail,unregisterSessionWriter}from"./chunk-W4SRGDQ4.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MAX_DURABLE_MONITORS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,safeRegExp}from"./chunk-GFUZPFHN.js";import{AssistantEditError,BUILT_IN_PROVIDER_DISPLAY_NAMES,CLAUDE_SDK_OAUTH_PROVIDER_ID,CODEX_RESPONSES_API,FooterDataProvider,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,SENTINEL_OAUTH_FIELDS,SessionStreamingError,addAccount,all_exports,assertExpectedLeaf,assertValidAccountName,assistantTextEquals,buildEditedAssistantMessage,builtinProviders,classifyReasoningCapability,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findGitPaths,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,upsertAccount}from"./chunk-NARL7XFO.js";import{Theme,canonicalWatchPath,detectTerminalBackgroundFromEnv,detectTerminalBackgroundTheme,detectTerminalThemeForAuto,flushRawStdout,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getThemeByName,getThemeExportColors,highlightCode,initTheme,loadThemeFromPath,onThemeChange,parseAutoThemeSetting,probeDirectoryOpenable,resolveThemeSetting,restoreStderr,restoreStdout,setRegisteredThemes,setTheme,setThemeInstance,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,watchWithErrorHandler,writeRawStdout}from"./chunk-RLRLQRI2.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,Z,decodeKittyPrintable,dist_exports,expandPasteMarkers,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,hyperlink,imageFallback,isKeyRelease,isViewportTUI,matchesKey,outerKittyGraphicsMode,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-YRN3PCTM.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SettingsManager,TERMINAL_MOUSE_MODES,applyHttpProxySettings,configureHttpDispatcher,formatHttpIdleTimeoutMs,getSettingsPath,isTerminalMouseMode,parseSettingsJson,require_undici,wasSelfWrite}from"./chunk-PLZK7ABD.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{DEFAULT_HOST_LAUNCH_SPEC,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HostLaunchSpecError,loadHostLaunchSpec,parseHostLaunchSpec,readHostStatus,runHostCommand,runHostRequest}from"./chunk-IUZUN32Z.js";import{GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,decideHostAction,ensureHost,handoffHost,parseHostProtocolInfo,probeHost,stopHost}from"./chunk-P7PWCGLJ.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-U6Z6OBX4.js";import{createHostDaemonPaths}from"./chunk-LF3XTYYF.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-HSH674C6.js";import{createRgEngine,ensureTool}from"./chunk-BQVRDBW6.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialFailoverError,TURN_RETRY_SUPPRESSION_PREFIX,getConfigValueEnvVarNames,isCommandConfigValue,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep}from"./chunk-XK24AFYU.js";import{discoverEnvSlots}from"./chunk-MUC3MZTV.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid}from"./chunk-2H3Y7EYQ.js";import{AssistantMessageFrameEncoder,Compile,DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,StringEnum,compile_exports,composeShellCommand,contentText,cursorOverflowCompactionSettings,describeProviderStallForUser,dropFailedAssistantTurns,findEnvKeys,getApiProvider,getCursorVariantAlias,getEnvApiKey,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isProviderStreamStallError,isProviderTimeoutError,isRecoverableLength,isRetryableAssistantError,isRetryableErrorMessage,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,retryAssistantCall,retryDelayMs,retryTransientCall,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-FDLVINNY.js";import{extractOpenAiCodexAccountId,setWireIdentity,uuidv7}from"./chunk-56TWFZ2C.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,isLockError}from"./chunk-7X72IACK.js";import{external_exports}from"./chunk-3XHLKHSK.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{cleanupSessionResources}from"./chunk-WVGCQOLJ.js";import{isAnthropicApiBaseUrl,resolvePromptCacheTtlSeconds}from"./chunk-EAMTSSEH.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance}from"./chunk-OYXTZDVT.js";import{parseStreamingJson}from"./chunk-FC7R7NOV.js";import{ModelsError,accountLabel,appendLoginSlot,calculateCost,clampThinkingLevel,createModels,estimateContextTokens,lazyStream,listSlots,modelsAreEqual,providerNotConfiguredMessage,removeSlot,repairManagedSentinelSlots,upsertSlot}from"./chunk-I3F6VZZF.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-BPX6QWPD.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{INSPECTOR_VM_IMPORT_WARNING,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,getPiUserAgent,getReleaseChangelogUrl,isRecoverableInspectorVmImportError}from"./chunk-TVOODZJH.js";import{require_semver}from"./chunk-I7YUNMWH.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-U7RQY7MH.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-UAYBYTFN.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-QPIXPR6I.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-HGAX6JZ7.js";import{source_default}from"./chunk-26UBFF6N.js";import{require_proper_lockfile}from"./chunk-3P23SBT3.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,VERSION,canonicalizePath,envValue,expandTildePath,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-H5RK2RYZ.js";import{__commonJS,__export,__toESM}from"./chunk-VR4X5O2Z.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win325){return win325===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform4=navigator.platform.toLowerCase();return platform4==="win32"||platform4==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path13,{windows}={})=>{let segs=path13.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance();continue}if(code===CHAR_RIGHT_PARENTHESES){isGlob=token.isGlob=!0,finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){for(;eos()!==!0&&(code=advance());){if(code===CHAR_LEFT_PARENTHESES){backslashes=token.backslashes=!0,code=advance();continue}if(code===CHAR_RIGHT_PARENTHESES){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state.maxDepth=0,isPathSeparator(code)||tokens.push(token),state.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n=prevIndex?prevIndex+1:start,i=slashes[idx],value2=input.slice(n,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value2,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),(idx!==0||value2!=="")&&parts.push(value2),prevIndex=i}if(prevIndex&&prevIndex+1<input.length){let value2=input.slice(prevIndex+1);parts.push(value2),opts.tokens&&(tokens[tokens.length-1].value=value2,depth(tokens[tokens.length-1]),state.maxDepth+=tokens[tokens.length-1].depth)}state.slashes=slashes,state.parts=parts}return state};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants10=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants10,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants10.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants10.globChars(opts.windows),EXTGLOB_CHARS=constants10.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open7=tokens[token.tokensIndex];open7.type="text",open7.value=literal,open7.output=safeOutput||utils.escapeRegex(literal);for(let i=token.tokensIndex+1;i<tokens.length;i++)tokens[i].value="",tokens[i].output="",delete tokens[i].suffix;state.output=token.output+open7.output,state.backtrack=!0,push({type:"paren",extglob:!0,value:value2,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse5(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state.negatedExtglob=!0)}push({type:"paren",extglob:!0,value:value2,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state.output=input,state):(state.output=utils.wrapOutput(output,state,options),state)}for(;!eos();){if(value2=advance(),value2==="\0")continue;if(value2==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value2+="\\",push({type:"text",value:value2});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state.index+=slashes,slashes%2!==0&&(value2+="\\")),opts.unescape===!0?value2=advance():value2+=advance(),state.brackets===0){push({type:"text",value:value2});continue}}if(state.brackets>0&&(value2!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value2===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value2==="["&&peek()!==":"||value2==="-"&&peek()==="]")&&(value2=`\\${value2}`),value2==="]"&&(prev.value==="["||prev.value==="[^")&&(value2=`\\${value2}`),opts.posix===!0&&value2==="!"&&prev.value==="["&&(value2="^"),prev.value+=value2,append({value:value2});continue}if(state.quotes===1&&value2!=='"'){value2=utils.escapeRegex(value2),prev.value+=value2,append({value:value2});continue}if(value2==='"'){state.quotes=state.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value:value2});continue}if(value2==="("){increment("parens"),push({type:"paren",value:value2});continue}if(value2===")"){if(state.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value:value2,output:state.parens?")":"\\)"}),decrement("parens");continue}if(value2==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value2=`\\${value2}`}else increment("brackets");push({type:"bracket",value:value2});continue}if(value2==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value:value2,output:`\\${value2}`});continue}if(state.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value:value2,output:`\\${value2}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value2=`/${value2}`),prev.value+=value2,append({value:value2}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state.output=state.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state.output+=prev.value;continue}if(value2==="{"&&opts.nobrace!==!0){increment("braces");let open7={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open7),push(open7);continue}if(value2==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value:value2,output:value2});continue}let output=")";if(brace.dots===!0){let arr=tokens.slice(),range=[];for(let i=arr.length-1;i>=0&&(tokens.pop(),arr[i].type!=="brace");i--)arr[i].type!=="dots"&&range.unshift(arr[i].value);output=expandRange(range,opts),state.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state.output.slice(0,brace.outputIndex),toks=state.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value2=output="\\}",state.output=out;for(let t of toks)state.output+=t.output||t.value}push({type:"brace",value:value2,output}),decrement("braces"),braces.pop();continue}if(value2==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value:value2});continue}if(value2===","){let output=value2,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value:value2,output});continue}if(value2==="/"){if(prev.type==="dot"&&state.index===state.start+1){state.start=state.index+1,state.consumed="",state.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value:value2,output:SLASH_LITERAL});continue}if(value2==="."){if(state.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value2,prev.value+=value2,brace.dots=!0;continue}if(state.braces+state.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value:value2,output:DOT_LITERAL});continue}push({type:"dot",value:value2,output:DOT_LITERAL});continue}if(value2==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value2);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value2;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value2}`),push({type:"text",value:value2,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value:value2,output:QMARK_NO_DOT});continue}push({type:"qmark",value:value2,output:QMARK});continue}if(value2==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value2);continue}if(opts.nonegate!==!0&&state.index===0){negate();continue}}if(value2==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value2);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value:value2,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state.parens>0){push({type:"plus",value:value2});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value2==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value:value2,output:""});continue}push({type:"text",value:value2});continue}if(value2!=="*"){(value2==="$"||value2==="^")&&(value2=`\\${value2}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value2+=match[0],state.index+=match[0].length),push({type:"text",value:value2});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value2,prev.output=star,state.backtrack=!0,state.globstar=!0,consume(value2);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value2);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value2);continue}let prior=prev.prev,before=prior.prev,isStart=prior.type==="slash"||prior.type==="bos",afterStar=before&&(before.type==="star"||before.type==="globstar");if(opts.bash===!0&&(!isStart||rest[0]&&rest[0]!=="/")){push({type:"star",value:value2,output:""});continue}let isBrace=state.braces>0&&(prior.type==="comma"||prior.type==="brace"),isExtglob=extglobs.length&&(prior.type==="pipe"||prior.type==="paren");if(!isStart&&prior.type!=="paren"&&!isBrace&&!isExtglob){push({type:"star",value:value2,output:""});continue}for(;rest.slice(0,3)==="/**";){let after=input[state.index+4];if(after&&after!=="/")break;rest=rest.slice(3),consume("/**",3)}if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value2,prev.output=globstar(opts),state.output=prev.output,state.globstar=!0,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&eos()){state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value2,state.globstar=!0,state.output+=prior.output+prev.output,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value2,state.output+=prior.output+prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value2,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state.output=prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}state.output=state.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value2,state.output+=prev.output,state.globstar=!0,consume(value2);continue}let token={type:"star",value:value2,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value2,push(token);continue}(state.index===state.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state.output=utils.escapeLast(state.output,"["),decrement("brackets")}for(;state.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state.output=utils.escapeLast(state.output,"("),decrement("parens")}for(;state.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state.output=utils.escapeLast(state.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state.backtrack===!0){state.output="";for(let token of state.tokens)state.output+=token.output!=null?token.output:token.value,token.suffix&&(state.output+=token.suffix)}return state};parse5.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants10.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source2=create(match[1]);return source2?source2+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source=create(output);return source&&opts.strictSlashes!==!0&&(source+=`${SLASH_LITERAL}?`),source};module.exports=parse5}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse5=require_parse(),utils=require_utils(),constants10=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex.state;delete regex.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex,options,{glob,posix:posix5}),result3={glob,state,regex,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex,options,posix5):match=regex.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse5(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source=`^(?!${source}).*$`);let regex=picomatch4.toRegex(source,options);return returnState===!0&&(regex.state=state),regex};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse5.fastpaths(input,options)),parsed.output||(parsed=parse5(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source,options)=>{try{let opts=options||{};return new RegExp(source,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants10;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os6 from"node:os";import*as path12 from"node:path";import{spawn as spawn11,spawnSync}from"child_process";import{randomUUID as randomUUID11}from"node:crypto";import{existsSync as existsSync35,mkdirSync as mkdirSync23,readFileSync as readFileSync35,writeFileSync as writeFileSync19}from"node:fs";import{rm as rm9}from"node:fs/promises";import{dirname as dirname43}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual2}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES2,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES2,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize2,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead2,truncateLine:()=>truncateLine2,truncateTail:()=>truncateTail2,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2);return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let newMessages=[...prompts],currentContext={...context,messages:[...context.messages,...prompts]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let prompt of prompts)await emit({type:"message_start",message:prompt}),await emit({type:"message_end",message:prompt});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}if(pendingMessages.length>0){for(let message2 of pendingMessages)await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);pendingMessages=[]}let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}let nextTurnContext={message,toolResults,context:currentContext,newMessages};if(await config.shouldStopAfterTurn?.(nextTurnContext)){await emit({type:"agent_end",messages:newMessages});return}if(toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,config={...config,model:nextTurnSnapshot.model??config.model,reasoning:nextTurnSnapshot.thinkingLevel===void 0?config.reasoning:nextTurnSnapshot.thinkingLevel==="off"?void 0:nextTurnSnapshot.thinkingLevel,thinkingSelection:nextTurnSnapshot.thinkingSelection===void 0?config.thinkingSelection:nextTurnSnapshot.thinkingSelection??void 0,abortServerSideFallback:nextTurnSnapshot.abortServerSideFallback??config.abortServerSideFallback}),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[])}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){pendingMessages=followUpMessages;continue}break}await emit({type:"agent_end",messages:newMessages})}async function buildProviderContext(context,config,signal){let messages=context.messages;return config.transformContext&&(messages=await config.transformContext(messages,signal)),{systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),tools:context.tools}}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result3=>{providerToolResults.push(result3)}}:{}}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await response.result(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await response.result();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(resolve42=>{let abortHandler=()=>resolve42(ABORTED);signal.addEventListener("abort",abortHandler,{once:!0}),removeAbortListener2=()=>signal.removeEventListener("abort",abortHandler)})),{next:async()=>{if(signal?.aborted)return closeAssistantIterator(iterator),Promise.reject(abortError(signal.reason));let useStartBound=!sawFirstEvent&&startTimeoutMs!==void 0,result3=await readNextAssistantEvent(iterator,useStartBound?startTimeoutMs:idleTimeoutMs,useStartBound?ms=>new StreamStartTimeoutError(ms):ms=>new StreamIdleTimeoutError(ms),abortPromise,onIdleTimeout,stream2,signal);return result3.done||(sawFirstEvent=!0),result3},dispose:()=>removeAbortListener2?.()}}async function readNextAssistantEvent(iterator,idleTimeoutMs,makeTimeoutError,abortPromise,onIdleTimeout,stream2,signal){if(idleTimeoutMs===void 0&&abortPromise===void 0)return iterator.next();let timeout,settled=!1;return new Promise((resolve42,reject)=>{let settle=complete=>{settled||(settled=!0,timeout!==void 0&&clearTimeout(timeout),complete())};if(idleTimeoutMs!==void 0){let onIdleDeadline=()=>{if(stream2?.hasPendingLocalWork?.()){timeout=setTimeout(onIdleDeadline,idleTimeoutMs);return}let error2=makeTimeoutError(idleTimeoutMs);closeAssistantIterator(iterator),settle(()=>reject(error2)),onIdleTimeout?.(error2)};timeout=setTimeout(onIdleDeadline,idleTimeoutMs)}(abortPromise?Promise.race([iterator.next(),abortPromise]):iterator.next()).then(result3=>{if(result3===ABORTED){closeAssistantIterator(iterator),settle(()=>reject(abortError(signal?.reason)));return}settle(()=>resolve42(result3))},error2=>settle(()=>reject(error2)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage8){return errorMessage8!==void 0?`${errorMessage8}${errorMessage8.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return config.toolExecution==="sequential"?executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit):executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit)}async function executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,emit);finalized=await finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);if(await emitToolResultMessage(toolResultMessage,emit),finalizedCalls.push(finalized),messages.push(toolResultMessage),signal?.aborted)break}return{messages,terminate:shouldTerminateToolBatch(finalizedCalls)}}async function executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],preparedCalls=[],lastSequentialCall,currentParallelWave=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,config,signal),isSequential=isSequentialToolCall(currentContext,toolCall),dependencies=isSequential?[...lastSequentialCall?[lastSequentialCall]:[],...currentParallelWave]:lastSequentialCall?[lastSequentialCall]:[];if(preparedCalls.push({preparation,isSequential,dependencies}),isSequential?(lastSequentialCall=void 0,currentParallelWave=[]):currentParallelWave.push(Promise.resolve(void 0)),signal?.aborted)break}let previousSequential,previousWave=[];for(let{preparation,isSequential}of preparedCalls){let dependencies=isSequential?[...previousSequential?[previousSequential]:[],...previousWave]:previousSequential?[previousSequential]:[],finalizedCall=(async()=>{await Promise.all(dependencies);let finalized=signal?.aborted?{toolCall:preparation.toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:await runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit);return await emitToolExecutionEnd(finalized,emit),finalized})();finalizedCalls.push(finalizedCall),isSequential?(previousSequential=finalizedCall,previousWave=[]):previousWave.push(finalizedCall)}let orderedFinalizedCalls=await Promise.all(finalizedCalls),messages=[];for(let finalized of orderedFinalizedCalls){let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:shouldTerminateToolBatch(orderedFinalizedCalls)}}async function runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit){if(preparation.kind==="immediate")return{toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,emit);return finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}function isSequentialToolCall(currentContext,toolCall){return currentContext.tools?.find(tool=>tool.name===toolCall.name)?.executionMode==="sequential"}function shouldTerminateToolBatch(finalizedCalls){return finalizedCalls.length>0&&finalizedCalls.every(finalized=>finalized.result.terminate===!0)}function prepareAgentToolCallArguments(tool,toolCall){if(!tool.prepareArguments)return toolCall;let preparedArguments=tool.prepareArguments(toolCall.arguments);return preparedArguments===toolCall.arguments?toolCall:{...toolCall,arguments:preparedArguments}}function prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};let tool=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(!tool&&config.resolveUnknownToolCall&&(tool=await config.resolveUnknownToolCall(toolCall.name,currentContext)),!tool){let hint=config.removedToolHints?.[toolCall.name];return{kind:"immediate",toolCall,result:createErrorToolResult(hint===void 0?`Tool ${toolCall.name} not found`:`Tool ${toolCall.name} not found. ${hint}`),isError:!0}}try{let preparedToolCall=prepareAgentToolCall(tool,toolCall),validatedArgs=preparedToolCall.args;if(config.beforeToolCall){let beforeResult=await config.beforeToolCall({assistantMessage,toolCall:preparedToolCall.toolCall,args:validatedArgs,context:currentContext},signal);if(signal?.aborted)return{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0};if(beforeResult?.block){let result3=createErrorToolResult(beforeResult.reason||"Tool execution was blocked");return beforeResult.terminate===!0&&(result3.terminate=!0),{kind:"immediate",toolCall,result:result3,isError:!0}}}return signal?.aborted?{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:{kind:"prepared",toolCall:preparedToolCall.toolCall,tool,args:validatedArgs}}catch(error2){return{kind:"immediate",toolCall,result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}}function abortReleasePromise(signal){if(signal!==void 0)return signal.aborted?Promise.resolve(ABORTED):new Promise(resolve42=>{signal.addEventListener("abort",()=>resolve42(ABORTED),{once:!0})})}async function executePreparedToolCall(prepared,signal,emit){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(emit({type:"tool_execution_update",toolCallId:prepared.toolCall.id,toolName:prepared.toolCall.name,args:prepared.toolCall.arguments,partialResult})))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error2){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result3=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result:result3,isError,context:currentContext},signal);afterResult&&(result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},isError=afterResult.isError??isError)}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return{toolCall:prepared.toolCall,result:result3,isError}}function createErrorToolResult(message){return{content:[{type:"text",text:message}],details:{}}}async function emitToolExecutionEnd(finalized,emit){await emit({type:"tool_execution_end",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,result:finalized.result,isError:finalized.isError})}function createToolResultMessage(finalized){return{role:"toolResult",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,content:finalized.result.content??[],details:finalized.result.details,usage:finalized.result.usage,...finalized.result.addedToolNames?.length?{addedToolNames:finalized.result.addedToolNames}:{},isError:finalized.isError,timestamp:Date.now()}}async function emitToolResultMessage(toolResultMessage,emit){await emit({type:"message_start",message:toolResultMessage}),await emit({type:"message_end",message:toolResultMessage})}function defaultConvertToLlm(messages){return messages.filter(message=>message.role==="user"||message.role==="assistant"||message.role==="toolResult")}var EMPTY_USAGE2={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},DEFAULT_MODEL={id:"unknown",name:"unknown",api:"unknown",provider:"unknown",baseUrl:"",reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function createMutableAgentState(initialState){let tools=initialState?.tools?.slice()??[],messages=initialState?.messages?.slice()??[];return{systemPrompt:initialState?.systemPrompt??"",model:initialState?.model??DEFAULT_MODEL,thinkingLevel:initialState?.thinkingLevel??"off",reasoningBaseline:initialState?.reasoningBaseline,get tools(){return tools},set tools(nextTools){tools=nextTools.slice()},get messages(){return messages},set messages(nextMessages){messages=nextMessages.slice()},isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0}}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}drain(){if(this.mode==="all"){let drained=this.messages.slice();return this.messages=[],drained}let first=this.messages[0];return first?(this.messages=this.messages.slice(1),[first]):[]}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.shouldStopAfterTurn=runtimeOptions.shouldStopAfterTurn,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage)throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice()}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),shouldStopAfterTurn=this.shouldStopAfterTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,shouldStopAfterTurn:shouldStopAfterTurn?async context=>await shouldStopAfterTurn(context,this.signal):void 0,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve42=>{resolvePromise=resolve42});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage);break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve42,reject)=>{resolveCompletion=resolve42,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome){this.resolveCompletion(outcome)}fail(error2){this.rejectCompletion(error2)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error2){this.control.close(error2),this.closeSignal.aborted||this.closeController.abort(error2),this.rejectCompletion(error2)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
|
|
3
3
|
|
|
4
4
|
<summary>
|
|
5
5
|
`,COMPACTION_SUMMARY_SUFFIX=`
|
|
@@ -2194,7 +2194,7 @@ ${renderedLines.slice(0,maxLines).map(line=>lang?line:theme2.fg("toolOutput",lin
|
|
|
2194
2194
|
pi auth print-bearer-token [--provider <provider>] [--model <model>] [--min-expiry <duration>]
|
|
2195
2195
|
pi auth check [--provider <provider>] [--model <model>] [--json] [--credentials] [--no-refresh]
|
|
2196
2196
|
|
|
2197
|
-
Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host";function isPackageCommandArgv(args){let command=args[0]??"";return Object.hasOwn(PACKAGE_COMMAND_ARGV,command)||command===PACKAGE_COMMAND_ALIAS}async function dispatchPackageCommand(args,runtimeOptions={}){if(!isPackageCommandArgv(args))return!1;let{handlePackageCommand}=await import("./package-manager-cli-
|
|
2197
|
+
Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host";function isPackageCommandArgv(args){let command=args[0]??"";return Object.hasOwn(PACKAGE_COMMAND_ARGV,command)||command===PACKAGE_COMMAND_ALIAS}async function dispatchPackageCommand(args,runtimeOptions={}){if(!isPackageCommandArgv(args))return!1;let{handlePackageCommand}=await import("./package-manager-cli-CB2X57TD.js");return await handlePackageCommand(args,runtimeOptions)}async function dispatchConfigCommand(args,runtimeOptions={}){if(args[0]!==CONFIG_COMMAND_ARGV)return!1;let{handleConfigCommand}=await import("./package-manager-cli-CB2X57TD.js");return await handleConfigCommand(args,runtimeOptions)}async function dispatchAppServerCommand(args){if(args[0]!==APP_SERVER_COMMAND_ARGV)return!1;let{handleAppServerCommand}=await import("./app-server-command-QK7Q6XK5.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-3LS772D5.js");return await runHostCommand2(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat8}from"node:fs/promises";import{resolve as resolve35}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve35(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat8(absolutePath)).size===0)continue;let mimeType=await detectSupportedImageMimeTypeFromFile(absolutePath);if(mimeType){let content=await readFile19(absolutePath),processed=await processImage(content,mimeType,{autoResizeImages});if(!processed.ok){text2+=`<file name="${absolutePath}">${processed.message}</file>
|
|
2198
2198
|
`;continue}let attachment={type:"image",mimeType:processed.mimeType,data:processed.data};images.push(attachment),processed.hints.length>0?text2+=`<file name="${absolutePath}">${processed.hints.join(`
|
|
2199
2199
|
`)}</file>
|
|
2200
2200
|
`:text2+=`<file name="${absolutePath}"></file>
|
|
@@ -2245,7 +2245,7 @@ Press any key to continue...`)),await new Promise(resolve42=>{process.stdin.setR
|
|
|
2245
2245
|
`))}}return await session.waitForSettledSessionWork(),exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-TA5XGUW5.js"),supervisorArgs=findInternalSupervisorArgs(args);if(!supervisorArgs)return!1;let launch=parseSupervisorArgs(supervisorArgs);return launch||(console.error("invalid internal RPC host supervisor arguments"),process.exit(2)),await runHostSupervisor(launch),!0}import{randomUUID as randomUUID10}from"node:crypto";import{copyFileSync as copyFileSync2,existsSync as existsSync33,mkdirSync as mkdirSync21,renameSync as renameSync13,rmSync as rmSync8}from"node:fs";import{basename as basename23,dirname as dirname40,join as join69,relative as relative17,resolve as resolve37,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path13){return toNamespacedPath(resolve37(path13))}function getQuarantineRoot(packageDir){let current=resolve37(packageDir);for(;;){if(basename23(current).toLowerCase()==="node_modules")return join69(current,QUARANTINE_DIR_NAME);let parent=dirname40(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath3(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value2 of sharedObjects){if(typeof value2!="string")continue;let filePath=normalizePath3(value2),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync8(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath3(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join69(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID10()}`);for(let loadedFile of loadedFiles){if(!existsSync33(loadedFile))continue;let quarantinePath=join69(quarantineRunDir,relative17(resolvedPackageDir,loadedFile));mkdirSync21(dirname40(quarantinePath),{recursive:!0}),renameSync13(loadedFile,quarantinePath),copyFileSync2(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;async function readPipedStdin(){if(!process.stdin.isTTY)return new Promise(resolve42=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve42(data.trim()||void 0)}),process.stdin.resume()})}function collectSettingsDiagnostics(settingsManager,context){return settingsManager.drainErrors().map(({scope,error:error2})=>({type:"warning",message:`(${context}, ${scope} settings) ${error2.message}`}))}function collectAuthDiagnostics(authStorage,context){return authStorage.drainErrors().map(error2=>({type:"warning",message:`(${context}, auth storage) ${error2.message}`}))}function collectExtensionLoadDiagnostics(errors){return errors.map(({path:path13,error:error2})=>({type:"warning",message:`Failed to load extension "${path13}": ${error2}`}))}function reportDiagnostics(diagnostics){for(let diagnostic2 of diagnostics){let color=diagnostic2.type==="error"?source_default.red:diagnostic2.type==="warning"?source_default.yellow:source_default.dim,prefix=diagnostic2.type==="error"?"Error: ":diagnostic2.type==="warning"?"Warning: ":"";console.error(color(`${prefix}${diagnostic2.message}`))}}function isTruthyEnvFlag2(value2){return value2?value2==="1"||value2.toLowerCase()==="true"||value2.toLowerCase()==="yes":!1}function resolveAppMode(parsed,stdinIsTTY,stdoutIsTTY){return parsed.mode===void 0&&parsed.messages[0]==="app-server"?"app-server":parsed.mode==="rpc"?"rpc":parsed.mode==="json"?"json":parsed.print||!stdinIsTTY||!stdoutIsTTY?"print":"interactive"}function toPrintOutputMode(appMode){return appMode==="json"?"json":"text"}function toProjectTrustMode(appMode){return appMode==="app-server"?"print":appMode}function resolveAutoTitleSessions(appMode,parsed,hasContextMessages,clientCapabilities=parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),sessionAutoTitle){return hasContextMessages?!1:sessionAutoTitle!==void 0?sessionAutoTitle:appMode==="interactive"||parsed.autoTitleSessions===!0||appMode==="rpc"&&clientCapabilities.includes(AUTO_TITLE_SESSIONS_CAPABILITY)}function isPlainRuntimeMetadataCommand(parsed){return!parsed.print&&parsed.mode===void 0&&(parsed.help===!0||parsed.listModels!==void 0||parsed.listTips===!0)}async function runAuthCommand(args){if(isAuthCommandHelp(args))return printAuthCommandHelp(),!0;let command;try{command=parseAuthCommand(args)}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to parse auth command";return console.error(source_default.red(`Error: ${message}`)),process.exitCode=1,!0}if(!command)return!1;let parsed=parseArgs(command.args);if(parsed.unknownFlags.size>0){let option=parsed.unknownFlags.keys().next().value;return console.error(source_default.red(`Unknown option --${option} for "${getAuthCommandName(command.kind)}".`)),console.error(source_default.dim(`Use "${APP_NAME} --help" or "${getAuthCommandUsage(command.kind)}".`)),process.exitCode=1,!0}try{if(parsed.diagnostics.length>0)throw new AuthCommandError(parsed.diagnostics.map(diagnostic2=>diagnostic2.message).join(`
|
|
2246
2246
|
`));if(command.kind!=="check"){let signal=AbortSignal.timeout(15e3),modelRuntime=await ModelRuntime.create({allowModelNetwork:!1,signal}),credential2=await resolveCredentialForPrint(parsed,modelRuntime,command.kind,command.minExpiryMs,signal);return process.stdout.write(`${credential2}
|
|
2247
2247
|
`),!0}let requestedAuth=validateAuthCommandArgs(parsed,command.kind),result3,credential;try{let credentials=command.noRefresh?new ReadOnlyAuthStorage:AuthStorage.create(),modelRuntime=await createAuthCheckModelRuntime(credentials);result3=await checkProviderAuth(parsed,modelRuntime,{refresh:!command.noRefresh}),command.credentials&&result3.status==="ready"&&(credential=await getProviderCredential(result3.provider,modelRuntime,credentials,{refresh:!command.noRefresh}),credential||(result3={status:"not_ready",provider:result3.provider,reason:"credential_not_available"}))}catch{result3={status:"invalid",provider:requestedAuth.provider??requestedAuth.model,reason:"invalid_state"}}let accounts=[];if(command.json&&result3.status!=="invalid")try{let credentials=command.noRefresh?new ReadOnlyAuthStorage:AuthStorage.create();accounts=await summarizeCredentialAccounts(result3.provider,await credentials.read(result3.provider))}catch{}let output=command.json?JSON.stringify({...result3,accounts,...credential?{credentials:credential}:{}}):credential??result3.status;process.stdout.write(`${output}
|
|
2248
|
-
`),process.exitCode=result3.status==="ready"?0:result3.status==="not_ready"?1:2}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,autoResizeImages,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text:text2,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text2,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localMatch=(sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd)).find(s=>s.id===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=localSessions.find(s=>s.id===sessionArg)??localSessions.find(s=>s.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s=>s.id===sessionArg)??allSessions.find(s=>s.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve42=>{let rl=createInterface2({input:process.stdin,output:process.stdout});rl.question(`${message} [y/N] `,answer=>{rl.close(),resolve42(answer.toLowerCase()==="y"||answer.toLowerCase()==="yes")}),rl.on("close",()=>resolve42(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path13,sessionDir){try{return SessionManager.open(path13,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":return appMode!=="interactive"&&(console.error(source_default.red(`Session found in different project: ${resolved.cwd}`)),console.error(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${parsed.session}' to fork it into the current directory, or re-run interactively from ${resolved.cwd}.`)),process.exit(1)),console.log(source_default.yellow(`Session found in different project: ${resolved.cwd}`)),await promptConfirm("Fork this session into current directory?")||(console.log(source_default.dim("Aborted.")),process.exit(0)),forkSessionOrExit(resolved.path,cwd,sessionDir);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-DXCITGLS.js"),selectedPath=await selectSession(onProgress=>SessionManager.list(cwd,sessionDir,onProgress),onProgress=>SessionManager.listAll(sessionDir,onProgress),settingsManager);return selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0)),SessionManager.open(selectedPath,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue)return SessionManager.continueRecent(cwd,sessionDir);if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme2=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme2(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);return async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile})=>{let isInitialRuntime=sessionStartEvent===void 0,projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted}),services=await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:parsed.unknownFlags,resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:toProjectTrustMode(appMode),settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sharedHostEnabled:shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtimeSettingsManager.getExperimentalSharedHost()}),sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnostics(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors)],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle)}),cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}}}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args)||await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;process.exit(exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&process.exit(hostExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(DISPLAY_VERSION),process.exit(0)),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}console.log(`Exported to: ${result3}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnostics(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags),writeHelpFlagsCache({scope,flags,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-KTDNGQUK.js");listTips(),process.exit(0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnostics(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing")]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await listModels(services2.modelRuntime,searchPattern2),process.exit(0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-2YCJKQOL.js");printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime");let selectedRuntime=runtime;if(isTruthyEnvFlag2(envValue("DISABLE_SHARED_HOST"))&&console.error(source_default.yellow("DISABLE_SHARED_HOST is obsolete: the shared session host is now off by default. Enable the experimental.sharedHost setting (or set the brand-prefixed ENABLE_SHARED_HOST=1 env flag) to opt in.")),shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtime.services.settingsManager.getExperimentalSharedHost()})){let socket=envValue("RPC_SOCKET")??resolve38(agentDir,"rpc","rpc.sock"),{createInteractiveHostRuntime}=await import("./interactive-host-runtime-AITXUDCT.js");selectedRuntime=await createInteractiveHostRuntime(runtime,{socket,agentDir,onWarning:warning=>console.error(source_default.yellow(warning.message))})}let{services,session,modelFallbackMessage}=selectedRuntime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&(printHelp(extensionFlags),process.exit(0)),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)});let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-OPFQIWFP.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-7C75IXNF.js"),interactiveMode=new InteractiveMode2(selectedRuntime,{migratedProviders,modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve42=>setTimeout(resolve42,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve42=>process.stdout.once("drain",resolve42)),process.stderr.writableLength>0&&await new Promise(resolve42=>process.stderr.once("drain",resolve42)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let label2=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label2,thinkingRun}):descriptors.push({kind:"thinking-label",text:label2,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
|
|
2248
|
+
`),process.exitCode=result3.status==="ready"?0:result3.status==="not_ready"?1:2}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,autoResizeImages,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text:text2,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text2,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localMatch=(sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd)).find(s=>s.id===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=localSessions.find(s=>s.id===sessionArg)??localSessions.find(s=>s.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s=>s.id===sessionArg)??allSessions.find(s=>s.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve42=>{let rl=createInterface2({input:process.stdin,output:process.stdout});rl.question(`${message} [y/N] `,answer=>{rl.close(),resolve42(answer.toLowerCase()==="y"||answer.toLowerCase()==="yes")}),rl.on("close",()=>resolve42(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path13,sessionDir){try{return SessionManager.open(path13,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":return appMode!=="interactive"&&(console.error(source_default.red(`Session found in different project: ${resolved.cwd}`)),console.error(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${parsed.session}' to fork it into the current directory, or re-run interactively from ${resolved.cwd}.`)),process.exit(1)),console.log(source_default.yellow(`Session found in different project: ${resolved.cwd}`)),await promptConfirm("Fork this session into current directory?")||(console.log(source_default.dim("Aborted.")),process.exit(0)),forkSessionOrExit(resolved.path,cwd,sessionDir);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-DXCITGLS.js"),selectedPath=await selectSession(onProgress=>SessionManager.list(cwd,sessionDir,onProgress),onProgress=>SessionManager.listAll(sessionDir,onProgress),settingsManager);return selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0)),SessionManager.open(selectedPath,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue)return SessionManager.continueRecent(cwd,sessionDir);if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme2=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme2(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);return async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile})=>{let isInitialRuntime=sessionStartEvent===void 0,projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted}),services=await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:parsed.unknownFlags,resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:toProjectTrustMode(appMode),settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sharedHostEnabled:shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtimeSettingsManager.getExperimentalSharedHost()}),sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnostics(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors)],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle)}),cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}}}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args)||await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;process.exit(exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&process.exit(hostExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(DISPLAY_VERSION),process.exit(0)),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}console.log(`Exported to: ${result3}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnostics(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags),writeHelpFlagsCache({scope,flags,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-KTDNGQUK.js");listTips(),process.exit(0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnostics(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing")]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await listModels(services2.modelRuntime,searchPattern2),process.exit(0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-WKX34SOP.js");printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime");let selectedRuntime=runtime;if(isTruthyEnvFlag2(envValue("DISABLE_SHARED_HOST"))&&console.error(source_default.yellow("DISABLE_SHARED_HOST is obsolete: the shared session host is now off by default. Enable the experimental.sharedHost setting (or set the brand-prefixed ENABLE_SHARED_HOST=1 env flag) to opt in.")),shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtime.services.settingsManager.getExperimentalSharedHost()})){let socket=envValue("RPC_SOCKET")??resolve38(agentDir,"rpc","rpc.sock"),{createInteractiveHostRuntime}=await import("./interactive-host-runtime-AITXUDCT.js");selectedRuntime=await createInteractiveHostRuntime(runtime,{socket,agentDir,onWarning:warning=>console.error(source_default.yellow(warning.message))})}let{services,session,modelFallbackMessage}=selectedRuntime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&(printHelp(extensionFlags),process.exit(0)),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)});let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-CI6V2SBW.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-7MN6GGCG.js"),interactiveMode=new InteractiveMode2(selectedRuntime,{migratedProviders,modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve42=>setTimeout(resolve42,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve42=>process.stdout.once("drain",resolve42)),process.stderr.writableLength>0&&await new Promise(resolve42=>process.stderr.once("drain",resolve42)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let label2=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label2,thinkingRun}):descriptors.push({kind:"thinking-label",text:label2,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
|
|
2249
2249
|
|
|
2250
2250
|
`),thinkingRun})}else{let text2=hidden?theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel)):thinkingBlocks.join(`
|
|
2251
2251
|
|
|
@@ -2332,8 +2332,8 @@ ${loaderAppendSystemPrompt.join(`
|
|
|
2332
2332
|
|
|
2333
2333
|
${sentences.join(`
|
|
2334
2334
|
|
|
2335
|
-
`)}`:prompt}async _runInputHandlers(text2,images,source,streamingBehavior){if(!this._extensionRunner.hasHandlers("input"))return{text:text2,images};let inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`,inputResult=await this._extensionRunner.emitInput(text2,images,source,streamingBehavior,inputId);if(inputResult.action==="handled"){await this._emitInputDisposition(inputId,"handled");return}return inputResult.action==="transform"?{text:inputResult.text,images:inputResult.images??images,inputId}:{text:text2,images,inputId}}async _emitInputDisposition(inputId,disposition){inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})}async prompt(text2,options){let throwIfCancelled=()=>{if(!options?.signal?.aborted)return;let error2=new Error("Prompt cancelled before acceptance");throw error2.name="AbortError",error2};throwIfCancelled();let userAbortPromise=this._userAbortPromise;userAbortPromise&&(await userAbortPromise,throwIfCancelled());try{if((options?.expandPromptTemplates??!0)&&text2.startsWith("/")){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName)){let handled=await this._tryExecuteExtensionCommand(text2);if(throwIfCancelled(),handled){options?.promptDisposition?.("handled"),options?.preflightResult?.(!0);return}}}}catch(error2){throw options?.preflightResult?.(!1),error2}if(options?.source!=="extension"&&this._compactionAbortController!==void 0)throw options?.preflightResult?.(!1),new Error("Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.");let ownsPromptStart=!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior===void 0;ownsPromptStart&&(this._promptStartPending=!0);let shouldWaitForSessionWork=!0,pendingCompactionAdmissionAtExtensionAdmission=options?.source==="extension"?this._pendingCompactionAdmission:void 0,compactionGenerationAtExtensionAdmission=options?.source==="extension"&&this._sessionWorkBarrier.hasActiveWork&&this._compactionLifecycle.state.status!=="idle"?this._compactionLifecycle.state.generation:void 0,canQueueWhileStreaming=(this.isStreaming||this._promptStartPending)&&!this.isCompacting&&options?.streamingBehavior!==void 0,canQueueDuringAutoCompaction=this._autoCompactionAbortController!==void 0&&this._compactionAbortController===void 0&&!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior!==void 0;if(shouldWaitForSessionWork&&!canQueueWhileStreaming&&!canQueueDuringAutoCompaction&&(!this.isStreaming||this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),options?.onSessionWorkReady?.()),!this.isStreaming)try{await this._maybeRestoreFallbackPrimary()}catch(error2){throw ownsPromptStart&&(this._promptStartPending=!1),error2}let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,promptDisposition=options?.promptDisposition,messages,titlePrompt,consumedNextTurnMessages,inputId,pendingCommandInvocation,emitPendingCommandInvocation=()=>{pendingCommandInvocation&&(this._emit({type:"command_invocation",command:pendingCommandInvocation}),pendingCommandInvocation=void 0)},emitInputDisposition=async disposition=>{inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})};try{if(isManualContinueSubmission({text:text2,hasMessages:this.agent.state.messages.length>0,hasImages:(options?.images?.length??0)>0})){await this.sendCustomMessage({customType:MANUAL_CONTINUE_CUSTOM_TYPE,content:MANUAL_CONTINUE_DIRECTIVE,display:!1},{triggerTurn:!0,deliverAs:options?.streamingBehavior==="followUp"?"followUp":"steer"}),promptDisposition?.("handled"),preflightResult?.(!0);return}let currentText=text2,currentImages=options?.images;if(this._extensionRunner.hasHandlers("input")){inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`;let inputResult=await this._extensionRunner.emitInput(currentText,currentImages,options?.source??"interactive",this.isStreaming?options?.streamingBehavior:void 0,inputId);if(throwIfCancelled(),inputResult.action==="handled"){await emitInputDisposition("handled"),promptDisposition?.("handled"),preflightResult?.(!0);return}inputResult.action==="transform"&&(currentText=inputResult.text,currentImages=inputResult.images??currentImages)}let expandedText=currentText;if(expandPromptTemplates){expandedText=this._expandSkillCommand(expandedText);let templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,templateExpansion.template&&(pendingCommandInvocation={name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"})}if(titlePrompt=options?.sessionTitlePrompt===!1?void 0:options?.sessionTitlePrompt??text2,this.isStreaming){if(!options?.streamingBehavior)throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");if(options.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueDuringAutoCompaction&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&shouldWaitForSessionWork&&(this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),this.isStreaming)){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(pendingCompactionAdmissionAtExtensionAdmission!==void 0&&pendingCompactionAdmissionAtExtensionAdmission.outcome!=="completed"||compactionGenerationAtExtensionAdmission!==void 0&&this._compactionLifecycle.state.generation===compactionGenerationAtExtensionAdmission&&(this._compactionLifecycle.state.status==="failed"||this._compactionLifecycle.state.status==="aborted")){options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(this._flushPendingBashMessages(),!this.model)throw new Error(formatNoModelSelectedMessage());if(!(this._modelRuntime.hasConfiguredAuth(this.model.provider)||await this._modelRuntime.checkAuth(this.model.provider)!==void 0))throw this._modelRuntime.isUsingOAuth(this.model.provider)?new Error(`Authentication failed for "${this.model.provider}". Credentials may have expired or network is unavailable. Run '/login ${this.model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(this.model.provider));await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),messages=[];let userContent=[{type:"text",text:expandedText}];currentImages&&userContent.push(...currentImages),messages.push({role:"user",content:userContent,timestamp:Date.now()}),consumedNextTurnMessages=this._pendingNextTurnMessages,this._pendingNextTurnMessages=[];for(let msg of consumedNextTurnMessages)messages.push(msg);let result3=await this._extensionRunner.emitBeforeAgentStart(expandedText,currentImages,this._baseSystemPrompt,this._baseSystemPromptOptions);this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),throwIfCancelled(),await emitInputDisposition("started")}catch(error2){throw await emitInputDisposition("rejected"),consumedNextTurnMessages&&consumedNextTurnMessages.length>0&&(this._pendingNextTurnMessages=[...consumedNextTurnMessages,...this._pendingNextTurnMessages]),preflightResult?.(!1),error2}finally{ownsPromptStart&&(this._promptStartPending=!1)}messages&&(promptDisposition?.("started"),emitPendingCommandInvocation(),preflightResult?.(!0),options?.thinkingLevel!==void 0&&this.setSessionThinkingLevel(options.thinkingLevel),await this._promptAgent(messages),await this.waitForRetry(),await this.waitForIdle(),options?.onSessionWorkReady?await this.agent.waitForIdle():shouldWaitForSessionWork?await this._waitForSettledSessionWork():await this.agent.waitForIdle(),titlePrompt!==void 0&&this._startSessionTitleGeneration(titlePrompt))}_applyBeforeAgentStartResult(messages,result3){if(result3?.messages)for(let msg of result3.messages)messages.push({role:"custom",customType:msg.customType,content:msg.content??[],display:msg.display,details:msg.details,timestamp:Date.now()});result3?.systemPrompt!==void 0?(this._systemPromptOverride=result3.systemPrompt,this.agent.state.systemPrompt=result3.systemPrompt):(this._systemPromptOverride=void 0,this.agent.state.systemPrompt=this._baseSystemPrompt)}async _tryExecuteExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex),args=spaceIndex===-1?"":text2.slice(spaceIndex+1),command=this._extensionRunner.getCommand(commandName);if(!command)return!1;this._emit({type:"command_invocation",command:{name:commandName,source:"extension",sourceInfo:command.sourceInfo,syntax:"slash"}});let ctx=this._extensionRunner.createCommandContext();try{return await command.handler(args,ctx),!0}catch(err2){return this._extensionRunner.emitError({extensionPath:`command:${commandName}`,event:"command",error:err2 instanceof Error?err2.message:String(err2)}),!0}}_expandSkillCommand(text2){let skills=this.resourceLoader.getSkills().skills,invocationTokens=parseSkillInvocationTokens(text2,{knownSkillNames:new Set(skills.map(skill=>skill.name))});if(invocationTokens.length===0)return text2;let expandedSkillNames=new Set,skillBlocks=[],invocationMetadata=[],removedTokens=[];for(let token of invocationTokens){let skill=skills.find(candidate=>candidate.name===token.name);if(!skill){if(token.position==="leading")break;continue}if(skillBlocks.length>=MAX_SKILL_EXPANSIONS_PER_PROMPT){this._extensionRunner.emitError({extensionPath:"skill:expansion",event:"skill_expansion",error:`Expanded at most ${MAX_SKILL_EXPANSIONS_PER_PROMPT} skills; remaining skill commands were left as literal text.`});break}if(removedTokens.push(token),expandedSkillNames.has(skill.name)){this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:`Skipped duplicate skill invocation: ${skill.name}`});continue}try{let content=readFileSync35(skill.filePath,"utf-8"),body=stripFrontmatter(content).trim();skillBlocks.push({name:skill.name,filePath:skill.filePath,baseDir:skill.baseDir,body}),expandedSkillNames.add(skill.name),invocationMetadata.push({name:skill.name,path:skill.filePath,syntax:token.syntax})}catch(err2){return this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:err2 instanceof Error?err2.message:String(err2)}),text2}}if(skillBlocks.length===0)return text2;let userRequest=removeSkillInvocationTokens(text2,removedTokens);return this._emit({type:"skill_invocation",skills:invocationMetadata}),formatSkillInvocationPrompt(skillBlocks,userRequest)}async _queueUserInput(text2,images,behavior,options){text2.startsWith("/")&&this._throwIfExtensionCommand(text2);let processedInput=await this._runInputHandlers(text2,images,options?.source??"interactive",this.isStreaming?behavior:void 0);if(!processedInput)return;let expandedText=this._expandSkillCommand(processedInput.text),templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,behavior==="steer"?await this._queueSteer(expandedText,processedInput.images,options?.enqueueOrder):await this._queueFollowUp(expandedText,processedInput.images,options?.enqueueOrder),await this._emitInputDisposition(processedInput.inputId,"queued"),templateExpansion.template&&this._emit({type:"command_invocation",command:{name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"}})}async steer(text2,images,options){await this._queueUserInput(text2,images,"steer",options)}async followUp(text2,images,options){await this._queueUserInput(text2,images,"followUp",options)}_startSessionTitleGeneration(firstPrompt){if(!this._autoTitleSessions||this.sessionManager.getSessionName()||shouldSkipSessionTitle(firstPrompt)||this._sessionTitleAbortController!==void 0)return;let model=this.model;if(!model)return;let abortController=new AbortController;this._sessionTitleAbortController=abortController,this._sessionTitlePromise=this._generateSessionTitle(firstPrompt,model,abortController)}async _generateSessionTitle(firstPrompt,model,abortController){try{let auth=await this._getSummarizationRequestAuth(model),title=await generateSessionTitle({firstPrompt,model,auth,sessionId:this.sessionId,baseOptions:this._buildSessionTitleBaseOptions(),retry:sessionTitleRetryPolicy(this.settingsManager.getRetrySettings()),signal:abortController.signal,streamFn:this.agent.streamFunction});if(abortController.signal.aborted)return;title&&!this.sessionManager.getSessionName()&&this.setSessionName(title)}catch(error2){if(abortController.signal.aborted)return;let message=error2 instanceof Error?error2.message:String(error2);this._extensionRunner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"session_title_generation",error:message})}finally{this._sessionTitleAbortController===abortController&&(this._sessionTitleAbortController=void 0),this._sessionTitlePromise!==void 0&&(this._sessionTitlePromise=void 0)}}abortSessionTitleGeneration(){this._sessionTitleAbortController?.abort(),this._sessionTitleAbortController=void 0}_buildSessionTitleBaseOptions(){return{onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,timeoutMs:this.agent.timeoutMs,maxRetryDelayMs:this.agent.maxRetryDelayMs}}async _queueSteer(text2,images,enqueueOrder){this._steeringMessages.push(text2),this._recordQueuedInput(text2,"steer",enqueueOrder),this._sessionLogger.debug("queue_enqueue",{mode:"steer",count:this._steeringMessages.length}),this._emitQueueUpdate();let content=[{type:"text",text:text2}];images&&content.push(...images);let message={role:"user",content,timestamp:Date.now()};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){this._postCompactionDeferredSteeringMessages.push(message);return}this.agent.steer(message)}async _queueFollowUp(text2,images,enqueueOrder){this._followUpMessages.push(text2),this._recordQueuedInput(text2,"followUp",enqueueOrder),this._sessionLogger.debug("queue_enqueue",{mode:"followUp",count:this._followUpMessages.length}),this._emitQueueUpdate();let content=[{type:"text",text:text2}];images&&content.push(...images);let message={role:"user",content,timestamp:Date.now()};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){this._postCompactionDeferredFollowUpMessages.push(message);return}this.agent.followUp(message)}_flushPostCompactionDeferredMessages(){for(let message of this._postCompactionDeferredSteeringMessages)this.agent.steer(message);this._postCompactionDeferredSteeringMessages=[];for(let message of this._postCompactionDeferredFollowUpMessages)this.agent.followUp(message);this._postCompactionDeferredFollowUpMessages=[]}_throwIfExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName))throw new Error(`Extension command "/${commandName}" cannot be queued. Use prompt() or execute the command when not streaming.`)}async sendCustomMessage(message,options,deferredTurnClaim){let userAbortGeneration=this._userAbortGeneration,appMessage={role:"custom",customType:message.customType,content:message.content??[],display:message.display,details:message.details,timestamp:Date.now()},waitForExistingSessionWork=options?.triggerTurn===!0&&options.deliverAs!=="nextTurn"&&!this.isStreaming&&this._sessionWorkBarrier.hasActiveWork&&this._extensionBindingPromptReadiness===void 0,pendingCompactionAdmission=this._pendingCompactionAdmission,activeCompactionGeneration=this._compactionLifecycle.state.status==="running"?this._compactionLifecycle.state.generation:void 0,finishSessionWork;try{if(waitForExistingSessionWork){if(await this._waitForSettledSessionWork(),userAbortGeneration!==this._userAbortGeneration)return;finishSessionWork=this._sessionWorkBarrier.begin()}if(options?.deliverAs==="nextTurn")this._pendingNextTurnMessages.push(appMessage);else if(this.isStreaming&&options?.triggerTurn!==!1)deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn===!0&&(pendingCompactionAdmission!==void 0&&pendingCompactionAdmission.outcome!=="completed"||activeCompactionGeneration!==void 0&&this._compactionLifecycle.state.generation===activeCompactionGeneration&&this._compactionLifecycle.state.status!=="completed"))deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn){finishSessionWork??=this._sessionWorkBarrier.begin();let messages=[appMessage],queueTriggerForLater=()=>{options.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage)};this._triggerTurnAdmissionAbortGeneration=userAbortGeneration;try{await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt");let result3=await this._extensionRunner.emitBeforeAgentStart(contentText(appMessage.content,""),void 0,this._baseSystemPrompt,this._baseSystemPromptOptions);if(userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}if(this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}}catch(error2){throw queueTriggerForLater(),error2}finally{this._triggerTurnAdmissionAbortGeneration=void 0}await this._promptAgent(messages,deferredTurnClaim)}else this.isStreaming?this._pendingCustomMessages.push(appMessage):this._appendCustomMessage(appMessage)}finally{deferredTurnClaim?.resolve("finished-without-start"),finishSessionWork?.()}}_appendCustomMessage(appMessage){this.agent.state.messages.push(appMessage),this._emitEntryAppended(this.sessionManager.appendCustomMessageEntry(appMessage.customType,appMessage.content,appMessage.display,appMessage.details)),this._incrementMessageRevision(),this._emit({type:"message_start",message:appMessage}),this._emit({type:"message_end",message:appMessage})}_flushPendingCustomMessages(){let pending=this._pendingCustomMessages;this._pendingCustomMessages=[];for(let message of pending)this._appendCustomMessage(message)}async sendUserMessage(content,options,deferredTurnClaim){let bindingPromptReadiness=this._extensionBindingPromptReadiness,resolveBindingPromptReadiness;if(bindingPromptReadiness){let readiness=new Promise(resolve42=>{resolveBindingPromptReadiness=resolve42});bindingPromptReadiness.add(readiness)}let text2,images;try{if(typeof content=="string")text2=content;else{let textParts=[];images=[];for(let part of content)part.type==="text"?textParts.push(part.text):images.push(part);text2=textParts.join(`
|
|
2336
|
-
`),images.length===0&&(images=void 0)}}catch(error2){throw deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),error2}let waitForExistingSessionWork=this._sessionWorkBarrier.hasActiveWork,finishSessionWork,disposition;try{await this.prompt(text2,{expandPromptTemplates:options?.expandPromptTemplates??!1,streamingBehavior:options?.deliverAs,images,source:"extension",promptDisposition:nextDisposition=>{disposition=nextDisposition,nextDisposition==="started"?deferredTurnClaim?.resolve("started"):nextDisposition==="queued"&&deferredTurnClaim?.resolve("delegated"),resolveBindingPromptReadiness?.()},onSessionWorkReady:waitForExistingSessionWork?()=>{finishSessionWork??=this._sessionWorkBarrier.begin()}:void 0,sessionTitlePrompt:!1})}catch(error2){throw disposition===void 0&&(options?.deliverAs==="steer"?await this._queueSteer(text2,images):await this._queueFollowUp(text2,images)),error2}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),finishSessionWork?.()}}reserveQueuedInputOrder(){return this._nextQueuedInputOrder+=1,this._nextQueuedInputOrder}_recordQueuedInput(text2,mode,enqueueOrder){let order=enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order),this._queuedInputOrder.push({text:text2,mode,enqueueOrder:order})}_removeQueuedInput(text2,mode){let index=this._queuedInputOrder.findIndex(message=>message.mode===mode&&message.text===text2);index!==-1&&this._queuedInputOrder.splice(index,1)}clearQueue(options={abortWillFollow:!1}){let steering=[...this._steeringMessages],followUp=[...this._followUpMessages],ordered=[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder);options.abortWillFollow&&(steering.length>0||followUp.length>0)&&(this._hadClearedQueuedMessages=!0),this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this.agent.clearAllQueues(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}get pendingMessageCount(){return this._steeringMessages.length+this._followUpMessages.length}getSteeringMessages(){return this._steeringMessages}getFollowUpMessages(){return this._followUpMessages}get resourceLoader(){return this._resourceLoader}async abort(){let wasMidRun=this.isStreaming&&this._retryAbortController===void 0,hadRetryBackoff=this._retryAbortController!==void 0,hasPendingTriggerTurnAdmission=this._triggerTurnAdmissionAbortGeneration===this._userAbortGeneration,hadCompactionOrPending=!this.isStreaming&&(this.isCompacting||this.pendingMessageCount>0||hasPendingTriggerTurnAdmission),hadClearedQueues=this._hadClearedQueuedMessages,joinedAgentEndBoundary=this._abortProvenance.hasOpenAgentEndBoundary;this._hadClearedQueuedMessages=!1;let shouldEmitAbort=!joinedAgentEndBoundary&&!wasMidRun&&(hadRetryBackoff||hadCompactionOrPending||hadClearedQueues);if(this.abortCompaction(),hasPendingTriggerTurnAdmission&&this._recordUserAbort(),await this._abortActiveAgentAndRetry("user"),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source,systemPrompt:this.agent.state.systemPrompt,systemPromptOptions:this._baseSystemPromptOptions});if(result3?.systemPrompt===void 0)return;let previousSystemPrompt=this.agent.state.systemPrompt,systemPrompt=result3.systemPrompt??this._baseSystemPrompt;if(previousSystemPrompt===systemPrompt)return;this.agent.state.systemPrompt=systemPrompt;let event={type:"system_prompt_change",systemPrompt,previousSystemPrompt,model:nextModel,previousModel,source:"model_select"};return result3.systemPromptName&&(event.systemPromptName=result3.systemPromptName),await this._extensionRunner.emit(event),this._emit(event),event}async setModel(model){return this._setModel(model,!0)}assertModelUsable(model=this.model,liveContextTokens=0,options){if(!model||model.contextWindow<=0)return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:options?.includeSpeculationLead,admission:options?.admission});if(!projection.usable)throw new ModelUsabilityBudgetError(projection)}admitResumeCompactionRequired(projection){this._resumeCompactionRequirement=createResumeCompactionRequirement(projection)}applyResumeSlice(plan){this.sessionManager.appendCompaction(plan.summary,plan.firstKeptEntryId,plan.tokensBefore,{schema:RESUME_SLICE_SCHEMA,origin:RESUME_SLICE_ORIGIN}),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._resumeSlice=plan,this._sessionLogger.info("resume_context_reduced",{count:plan.droppedEntries,tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter}),this._emit(this._resumeSliceEvent(plan))}_resumeSliceEvent(plan){return{type:"resume_context_reduced",tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter,droppedEntries:plan.droppedEntries,notice:resumeSliceNotice(plan)}}_getDownswitchLiveContextTokens(model){let currentModel=this.model;if(!currentModel)return 0;let compaction=this._getCompactionSettings(),currentBudget=projectModelUsabilityBudget({model:currentModel,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),targetBudget=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),currentUsableContext=currentBudget.contextWindow-currentBudget.requiredTokens;if(targetBudget.contextWindow-targetBudget.requiredTokens>=currentUsableContext)return 0;let fixedPrefixTokens=currentBudget.systemPromptTokens+currentBudget.activeToolSchemaTokens;return Math.max(0,(this.getContextUsage()?.tokens??0)-fixedPrefixTokens)}async setSessionModel(model){return this._setModel(model,!1)}_recordRejectedModelChange(model,error2){let budget=error2 instanceof ModelUsabilityBudgetError?error2.projection:void 0,detail=error2 instanceof Error?error2.message:String(error2),reason=budget?"context-budget":"auth",numbers=budget?{contextWindow:budget.contextWindow,liveContextTokens:budget.liveContextTokens,requiredTokens:budget.requiredTokens,shortfallTokens:budget.shortfallTokens,safetyMarginProfile:budget.safetyMarginProfile}:{};this.sessionManager.appendModelChangeRejected({provider:model.provider,modelId:model.id,reason,detail,...numbers}),this._emit({type:"model_change_rejected",model,reason,detail,...numbers})}_modelSwitchAdmission(){return this.sessionManager.hasContextMessages()?"switch":"start"}_assertModelUsableForSwitch(model,liveContextTokens){try{this.assertModelUsable(model,liveContextTokens,{admission:this._modelSwitchAdmission()})}catch(error2){throw this._recordRejectedModelChange(model,error2),error2}}async _setModel(model,updateGlobalDefaults){if(this._assertModelUsableForSwitch(model,this._getDownswitchLiveContextTokens(model)),!await this._modelRuntime.checkAuth(model.provider)){let error2=new Error(`No API key for ${model.provider}/${model.id}`);throw this._recordRejectedModelChange(model,error2),error2}let hadActiveFallback=this._retryFallback.activeState!==void 0;return this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(model),hadActiveFallback&&this._retryAbortController&&this.abortRetry(),await this._switchActiveModel(model,{persistDefault:updateGlobalDefaults,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0})}async _maybeRestoreFallbackPrimary(){try{await this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy)}catch(error2){this._retryFallback.clear(),console.error("fallback revert failed; cleared fallback state",error2)}}async _onCompactionContextChanged(){this._retryFallback.notifyCompactionApplied()&&!this.isStreaming&&await this._maybeRestoreFallbackPrimary()}async _switchActiveModel(model,opts){let previousModel=this.model;opts.invalidateCompaction&&(this._modelSelectionChangesContext(previousModel,model)||previousModel?.provider!==model.provider||previousModel?.id!==model.id)&&this._invalidateCompactionForModelSelection();let thinking=this._getThinkingForModelSwitch(model,opts.ephemeralThinkingLevel),liveContextTokens=this._getDownswitchLiveContextTokens(model);this.agent.state.model=model,model.id==="gpt-6-astra"&&(model.provider==="openai"||model.provider==="openai-codex")||(this.agent.state.reasoningBaseline=void 0);let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,model)),previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive(),previousThinkingLevel=this.agent.state.thinkingLevel,previousThinkingSelection=this.agent.state.thinkingSelection,previousReasoningBaseline=this.agent.state.reasoningBaseline,previousAbortServerSideFallback=this.agent.abortServerSideFallback;this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain(),this._currentServiceTier=this._resolveServiceTier(model,scopedMatch?.serviceTier),opts.ephemeralThinkingLevel!==void 0?this._applyEphemeralThinkingLevel(thinking.level):this._setThinkingLevel(thinking.level,!1,thinking.selection),this._emitHighReasoningWarningIfNeeded();let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=opts.emitModelSelect?await this._emitModelSelect(model,previousModel,opts.modelSelectSource):void 0;return this._assertModelUsableForSwitch(model,liveContextTokens),opts.appendSessionEntry&&this.sessionManager.appendModelChange(model.provider,model.id,opts.entryReason,previousModel?.provider,previousModel?.id),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._emit({type:"model_changed",model,thinkingLevel:this.thinkingLevel,source:opts.modelSelectSource}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode),systemPromptChange}catch(error2){throw previousModel?this.agent.state.model=previousModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,error2}}_applyEphemeralThinkingLevel(level){let previousLevel=this.agent.state.thinkingLevel;this.agent.state.thinkingLevel=level,this.agent.state.thinkingSelection=void 0,previousLevel!==level&&this._emit({type:"thinking_level_changed",level})}async cycleModel(direction="forward"){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2)}async _cycleFavoriteModel(direction,favoriteModels2){if(favoriteModels2.length<=1)return;let currentModel=this.model;if(!currentModel)return;let currentIndex=favoriteModels2.findIndex(sm=>modelsAreEqual(sm.model,currentModel)),nextIndex;if(currentIndex===-1)nextIndex=direction==="forward"?0:favoriteModels2.length-1;else{let len=favoriteModels2.length;nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len}let favoriteCount=favoriteModels2.length,step=direction==="forward"?1:-1,selectedIndex,skippedModels=[];for(let offset=0;offset<favoriteCount;offset++){let candidate=favoriteModels2[(nextIndex+step*offset+favoriteCount)%favoriteCount];if(modelsAreEqual(candidate.model,currentModel))continue;let admission=this._modelChangeWouldExhaustContext(candidate.model);if(admission){skippedModels.push(candidate.model),this._emit({type:"model_change_skipped",model:candidate.model,contextWindow:candidate.model.contextWindow,liveContextTokens:admission.liveContextTokens,requiredTokens:admission.requiredTokens,shortfallTokens:admission.shortfallTokens,safetyMarginProfile:admission.safetyMarginProfile,direction});continue}selectedIndex=(nextIndex+step*offset+favoriteCount)%favoriteCount;break}if(selectedIndex===void 0){let alternatives=favoriteModels2.filter(entry=>!modelsAreEqual(entry.model,currentModel)),onlyAlternative=alternatives.length===1?alternatives[0]:void 0;return onlyAlternative&&this._assertModelUsableForSwitch(onlyAlternative.model,this._getDownswitchLiveContextTokens(onlyAlternative.model)),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model);this._assertModelUsableForSwitch(next.model,liveContextTokens),(this._modelSelectionChangesContext(currentModel,next.model)||currentModel?.provider!==next.model.provider||currentModel?.id!==next.model.id)&&this._invalidateCompactionForModelSelection(),this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(next.model);let thinking=this._getThinkingForModelSwitch(next.model,next.thinkingLevel,next.thinkingSelection);this.agent.state.model=next.model;let previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive();this._currentServiceTier=this._resolveServiceTier(next.model,next.serviceTier),this._setThinkingLevel(thinking.level,!1,thinking.selection);let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=await this._emitModelSelect(next.model,currentModel,"cycle");this._assertModelUsableForSwitch(next.model,liveContextTokens),this.sessionManager.appendModelChange(next.model.provider,next.model.id),this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._emit({type:"model_changed",model:next.model,thinkingLevel:this.thinkingLevel,source:"cycle"}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode);let cycleResult={model:next.model,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};return systemPromptChange&&(cycleResult.systemPromptChange=systemPromptChange),cycleResult}catch(error2){throw currentModel?this.agent.state.model=currentModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,error2}}setThinkingLevel(level){this._setThinkingLevel(level,!0,{level,source:"explicit"})}setSessionThinkingLevel(level){this._setThinkingLevel(level,!1,{level,source:"explicit"})}_setThinkingLevel(level,updateGlobalDefault,selection){let availableLevels=this.getAvailableThinkingLevels(),effectiveLevel=availableLevels.includes(level)?level:this._clampThinkingLevel(level,availableLevels),previousLevel=this.agent.state.thinkingLevel,previousSelection=this.agent.state.thinkingSelection,effectiveSelection=selection?{...selection,level:effectiveLevel}:void 0,selectionChanged=previousSelection?.level!==effectiveSelection?.level||previousSelection?.source!==effectiveSelection?.source||previousSelection?.legacyVariantId!==effectiveSelection?.legacyVariantId,isChanging=effectiveLevel!==previousLevel;if((isChanging||selectionChanged)&&this._retryFallback.noteManualThinkingLevel(),this.agent.state.thinkingLevel=effectiveLevel,this.agent.state.thinkingSelection=effectiveSelection,updateGlobalDefault){let model=this.model;model&&this.settingsManager.setModelThinkingLevel(model.provider,model.id,effectiveLevel)}if(isChanging||selectionChanged){this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection);let model=this.model;isChanging&&model?.id==="gpt-6-astra"&&(model.provider==="openai"||model.provider==="openai-codex")&&(this.agent.state.reasoningBaseline??=previousLevel,this.sessionManager.appendConfigurationUpdate(effectiveLevel),this.agent.state.messages=this.sessionManager.buildSessionContext().messages),updateGlobalDefault&&(this.supportsThinking()||effectiveLevel!=="off")&&this.settingsManager.setDefaultThinkingLevel(effectiveLevel),this._emit({type:"thinking_level_changed",level:effectiveLevel}),this._extensionRunner.emit({type:"thinking_level_select",level:effectiveLevel,previousLevel}),this._emitHighReasoningWarningIfNeeded()}}_emitHighReasoningWarningIfNeeded(){let model=this.model,level=this.thinkingLevel;if(!model||!shouldWarnHighReasoning(model,level))return;let key=`${model.provider}/${model.id}`;this._shownHighReasoningWarningKeys.has(key)||(this._shownHighReasoningWarningKeys.add(key),this._emit({type:"high_reasoning_warning",modelId:model.id,provider:model.provider,thinkingLevel:level}))}cycleThinkingLevel(){if(!this.supportsThinking())return;let levels=this.getAvailableThinkingLevels(),nextIndex=(levels.indexOf(this.thinkingLevel)+1)%levels.length,nextLevel=levels[nextIndex];return this.setThinkingLevel(nextLevel),nextLevel}getAvailableThinkingLevels(){let model=this.model;return model?getSupportedThinkingLevels(model):["off"]}supportsXhighThinking(){return this.model?supportsXhigh(this.model):!1}supportsMaxThinking(){return this.model?supportsMax(this.model):!1}supportsThinking(){return!!this.model?.reasoning}_getThinkingForModelSwitch(model,explicitLevel,explicitSelection){let requestedLevel=explicitLevel,selection=explicitSelection;if(requestedLevel!==void 0&&!selection&&(selection={level:requestedLevel,source:"explicit"}),requestedLevel===void 0){let remembered=this.settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(requestedLevel=remembered,selection={level:remembered,source:"explicit"})}if(requestedLevel===void 0){let configuredDefault=this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"})}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels(model));return{level,selection:selection?{...selection,level}:void 0}}_clampThinkingLevel(level,availableLevels){let available=new Set(availableLevels),requestedIndex=THINKING_LEVELS_WITH_MAX.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let index=requestedIndex;index<THINKING_LEVELS_WITH_MAX.length;index++){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}for(let index=requestedIndex-1;index>=0;index--){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}return availableLevels[0]??"off"}syncQueueModesFromSettings(){this.agent.steeringMode=this.settingsManager.getSteeringMode(),this.agent.followUpMode=this.settingsManager.getFollowUpMode()}setSteeringMode(mode){this.agent.steeringMode=mode,this.settingsManager.setSteeringMode(mode),this._emitSessionSettingsChanged()}setFollowUpMode(mode){this.agent.followUpMode=mode,this.settingsManager.setFollowUpMode(mode),this._emitSessionSettingsChanged()}_claimCompactionController(controller,owner){(this._compactionAbortController!==void 0&&this._compactionAbortController!==controller||this._autoCompactionAbortController!==void 0&&this._autoCompactionAbortController!==controller)&&this._compactionLifecycle.abort(this._messageRevision),this._compactionAbortController&&this._compactionAbortController!==controller&&(this._compactionAbortController.abort(),this._compactionAbortController=void 0),this._autoCompactionAbortController&&this._autoCompactionAbortController!==controller&&(this._autoCompactionAbortController.abort(),this._autoCompactionAbortController=void 0),owner==="auto"?this._autoCompactionAbortController=controller:this._compactionAbortController=controller}_ownsCompactionController(controller,owner){return!controller.signal.aborted&&(owner==="auto"?this._autoCompactionAbortController===controller:this._compactionAbortController===controller)}_releaseCompactionController(signal){this._compactionAbortController?.signal===signal&&(this._compactionAbortController=void 0),this._autoCompactionAbortController?.signal===signal&&(this._autoCompactionAbortController=void 0)}_claimPendingCompactionAdmission(){let priorAdmission=this._pendingCompactionAdmission;priorAdmission&&(priorAdmission.controller.abort(),priorAdmission.outcome="aborted",priorAdmission.finishSessionWork());let controller=new AbortController,admission={controller,finishSessionWork:this._sessionWorkBarrier.begin()};return this._pendingCompactionAdmission=admission,this._claimCompactionController(controller,"compaction"),admission}_releasePendingCompactionAdmission(admission,outcome){admission.outcome=outcome,this._pendingCompactionAdmission===admission&&(this._pendingCompactionAdmission=void 0,admission.finishSessionWork())}_recordUserAbort(){this._suppressQueuedContinuationAfterUserAbort=!0,this._userAbortGeneration+=1}async _abortActiveAgentAndRetry(source){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source)&&this._recordUserAbort();let abortPromise=(async()=>{this.agent.abort(),await this.waitForIdle()})();this._userAbortPromise=abortPromise;try{await abortPromise}finally{this._userAbortPromise===abortPromise&&(this._userAbortPromise=void 0)}}async _runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,customInstructions,signal,env,reason){let cacheFriendly;if(areExperimentalFeaturesEnabled()){let systemPrompt=this.agent.state.systemPrompt,tools=this.agent.state.tools.slice(),buildSourceContext=messages=>this.agent.buildProviderContext({systemPrompt,messages:messages.slice(),tools:tools.slice()},signal),fullContext=await buildSourceContext(this.agent.state.messages),isExactPrefix=candidate=>candidate.messages.length>0&&candidate.messages.length<=fullContext.messages.length&&isDeepStrictEqual2(candidate.messages,fullContext.messages.slice(0,candidate.messages.length)),sourceContext;if(preparation.messagesToSummarize.length>0&&preparation.sourceMessages){let candidate=await buildSourceContext(preparation.sourceMessages);isExactPrefix(candidate)&&(sourceContext=candidate)}let turnPrefixSourceContext;if(preparation.isSplitTurn&&preparation.turnPrefixMessages.length>0&&preparation.turnPrefixSourceMessages){let candidate=await buildSourceContext(preparation.turnPrefixSourceMessages),providerTurnPrefix=await this.agent.convertToLlm(preparation.turnPrefixMessages.slice());isExactPrefix(candidate)&&providerTurnPrefix.length>0&&providerTurnPrefix.length<=candidate.messages.length&&isDeepStrictEqual2(candidate.messages.slice(-providerTurnPrefix.length),providerTurnPrefix)&&(turnPrefixSourceContext=candidate)}(sourceContext||turnPrefixSourceContext)&&(cacheFriendly={sourceContext,turnPrefixSourceContext,requestOptions:{sessionId:this.agent.sessionId,onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,maxRetryDelayMs:this.agent.maxRetryDelayMs}})}return compact2(preparation,requestModel,apiKey,headers,customInstructions,signal,extraBody,this.thinkingLevel,this.agent.streamFunction,env,this.agent.transformContext,this.settingsManager.getRetrySettings(),this._summarizationRetryCallbacks({source:"compaction",reason}),this.sessionManager.getSessionId(),cacheFriendly)}async compact(customInstructions){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());this._releaseBlockedPostCompactionAdmission();let pathEntries=this.sessionManager.getBranch(),settings=cursorOverflowCompactionSettings(this._getCompactionSettings(model),model.provider,"manual");if(!prepareCompaction2(pathEntries,settings)){let requestId2=randomUUID11(),lastEntry=pathEntries[pathEntries.length-1],error2=new Error(lastEntry?.type==="compaction"?"Already compacted":"Nothing to compact (session too small)"),errorMessage8=`Compaction failed: ${error2.message}`;throw this._emit({type:"compaction_start",reason:"manual",requestId:requestId2}),this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted:!1,willRetry:!1,requestId:requestId2,errorMessage:errorMessage8}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage8,aborted:!1,willRetry:!1,fromExtension:!1}),error2}let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID11(),outcome="failed",disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"manual",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"manual",requestId,customInstructions,willRetry:!1});if(!execution.accepted)throw new CompactionRejectedError(execution.rejectionCause);return outcome="completed",execution.result}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",error2 instanceof CompactionRejectedError)throw new Error(error2.message);if(!compactionExecutionOwnsTerminalTransition(error2))throw error2;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2),errorMessage8=aborted?void 0:`Compaction failed: ${message}`;throw this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted,willRetry:!1,requestId,errorMessage:errorMessage8}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage8,aborted,willRetry:!1,fromExtension:!1}),error2}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),outcome==="completed"&&this._resumeQueuedMessagesAfterCompaction()}}async applyCompaction(precomputed,options){if(options.signal!==void 0&&options.signal!==this._compactionAbortController?.signal)return{applied:!1,reason:"stale"};if(options.expectedRevision!==void 0&&options.expectedRevision!==this._messageRevision)return{applied:!1,reason:"stale"};if(options.expectedWarmAnchor!==void 0&&!isWarmSummaryAnchorValid(options.expectedWarmAnchor,this.sessionManager.getBranch()))return{applied:!1,reason:"stale"};let ownsController=this._compactionAbortController===void 0,lifecycleState=this._compactionLifecycle.state,requestId=!ownsController&&lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:randomUUID11();ownsController&&(this._claimCompactionController(new AbortController,"compaction"),this._emit({type:"compaction_start",reason:options.reason,requestId}));let controller=this._compactionAbortController;if(!controller)return{applied:!1,reason:"rejected"};this._claimCompactionController(controller,"compaction");try{return(await this._executeCompaction({controller,owner:"compaction",reason:options.reason,requestId,willRetry:!1,precomputed})).accepted?(this._resumeQueuedMessagesAfterCompaction(),{applied:!0,reason:"ok"}):{applied:!1,reason:"rejected"}}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return{applied:!1,reason:"rejected"};let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`}),{applied:!1,reason:"rejected"}}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}_beginExtensionCompactionFeedback(reason){let controller=new AbortController;this._claimCompactionController(controller,"compaction");let model=this.model,requestId=randomUUID11();return this._compactionLifecycle.begin({operationId:requestId,stage:"feedback",reason,model:model?{provider:model.provider,id:model.id}:void 0,startedRevision:this._messageRevision},controller),this._emit({type:"compaction_start",reason,requestId}),controller.signal}_updateExtensionCompactionFeedback(options){!options.signal||!this._compactionLifecycle.hasCurrentSignal(options.signal)||this._emit({type:"compaction_progress",reason:options.reason,...options.delta!==void 0?{delta:options.delta}:{},...options.text!==void 0?{text:options.text}:{}})}_endExtensionCompactionFeedback(options){if(!options.signal)return;if(!this._compactionLifecycle.hasCurrentSignal(options.signal)){this._releaseCompactionController(options.signal);return}let operation=this._compactionLifecycle.state;if(operation.status!=="running"||operation.stage!=="feedback")return;let aborted=options.aborted??options.signal.aborted;this._compactionLifecycle.finish({operationId:operation.operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,...aborted?{errorMessage:"Compaction cancelled"}:{errorMessage:options.errorMessage??"Compaction did not apply"}}),this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId:operation.operationId,errorMessage:aborted?void 0:options.errorMessage??"Compaction did not apply"}),this._releaseCompactionController(options.signal)}async _executeCompaction(request2){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());let controller=request2.controller;if(!this._ownsCompactionController(controller,request2.owner))throw new CompactionExecutionError(new CompactionCancelledError,!1,!0);let requestId=request2.requestId??randomUUID11(),operationId=this._compactionLifecycle.begin({operationId:requestId,stage:"execution",reason:request2.reason,model:{provider:model.provider,id:model.id},startedRevision:this._messageRevision},controller),finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=request2.agentMessagesAtStart??this.agent.state.messages.slice(),compactionOwnedDiagnosticMessages=new Set,signal=controller.signal;try{if(signal.aborted)throw new CompactionCancelledError;let pathEntries=this.sessionManager.getBranch(),settings=cursorOverflowCompactionSettings(this._getCompactionSettings(),this.model?.provider,request2.reason),compactionResult=request2.precomputed,fromExtension=request2.precomputed!==void 0;if(!compactionResult){let preparation=prepareCompaction2(pathEntries,settings,request2.reason==="overflow",request2.allowSummaryOnly);if(!preparation)throw pathEntries[pathEntries.length-1]?.type==="compaction"?new Error("Already compacted"):new Error("Nothing to compact (session too small)");if(this._extensionRunner.hasHandlers("session_before_compact")){let messagesBeforeExtension=new Set(this.agent.state.messages),extensionResult=await this._extensionRunner.emit({type:"session_before_compact",reason:request2.reason,willRetry:request2.willRetry,requestId,preparation,branchEntries:pathEntries,customInstructions:request2.customInstructions,signal});for(let message of this.agent.state.messages)!messagesBeforeExtension.has(message)&&isCompactionOwnedPreCompactDiagnostic(message,requestId)&&compactionOwnedDiagnosticMessages.add(message);if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;if(extensionResult?.cancel)return await this._rejectCompaction(request2,requestId,operationId,extensionResult.rejectionCause??"cancelled-by-extension",!0,extensionResult.reason);extensionResult?.compaction&&(compactionResult=extensionResult.compaction,fromExtension=!0)}if(!compactionResult){let compactionModel=this._resolveCompactionModel(model),{model:requestModel,apiKey,headers,extraBody,env}=await this._getCompactionRequestAuth(compactionModel);compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason)}}if(signal.aborted)throw new CompactionCancelledError;if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;let lifecycleState=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&¤tMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState.status!=="running"||lifecycleState.operationId!==operationId||lifecycleState.startedRevision+compactionOwnedDiagnosticMessages.size!==this._messageRevision||!onlyPendingPersistenceAppends)return await this._rejectCompaction(request2,requestId,operationId,"stale-revision",!1);if(await this._wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model))return await this._rejectCompaction(request2,requestId,operationId,"would-overflow",!1);let latestConfigurationEffort=this.sessionManager.getBranch().findLast(entry=>entry.type==="configuration_update")?.reasoning.effort,compactionEntryId=this.sessionManager.appendCompaction(compactionResult.summary,compactionResult.firstKeptEntryId,compactionResult.tokensBefore,compactionResult.details,fromExtension,compactionResult.usage),savedEntry=this.sessionManager.getEntry(compactionEntryId);if(savedEntry?.type!=="compaction")throw new Error("Compaction entry was not saved");let modelAfterCompaction=this.model;latestConfigurationEffort!==void 0&&modelAfterCompaction?.id==="gpt-6-astra"&&(modelAfterCompaction.provider==="openai"||modelAfterCompaction.provider==="openai-codex")&&this.sessionManager.appendConfigurationUpdate(latestConfigurationEffort);let sessionContext=this.sessionManager.buildSessionContext(),currentAgentMessages=this.agent.state.messages,messagesAppendedDuringCompaction=agentMessagesAtStart.every((message,index)=>currentAgentMessages[index]===message)?currentAgentMessages.slice(agentMessagesAtStart.length):[],preservedIdentities=new Set(messagesAppendedDuringCompaction);for(let message of currentAgentMessages)this._messageEndsAwaitingPersistence.has(message)&&preservedIdentities.add(message);let preservedPendingMessages=currentAgentMessages.filter(message=>preservedIdentities.delete(message));this._skipNextPostCompactionAssistantCheck=!0;for(let message of preservedPendingMessages)message.role==="assistant"&&this._assistantsPendingAtCompaction.add(message);if(this.agent.state.messages=[...sessionContext.messages,...preservedPendingMessages],compactionResult.estimatedTokensAfter=estimateMessagesTokens2(sessionContext.messages),this._incrementMessageRevision(),!this._compactionLifecycle.finish({operationId,status:"completed",endedRevision:this._messageRevision}))throw new CompactionCancelledError;return this._delegatedCompactionKey=void 0,request2.owner==="compaction"&&this._compactionAbortController===request2.controller&&(this._compactionAbortController=void 0),this._emit({type:"compaction_end",reason:request2.reason,result:compactionResult,aborted:!1,willRetry:request2.willRetry,requestId,accepted:!0}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!0,compactionEntry:savedEntry,fromExtension,willRetry:request2.willRetry}),await this._onCompactionContextChanged(),{accepted:!0,requestId,result:compactionResult,compactionEntry:savedEntry,fromExtension}}catch(error2){if(error2 instanceof CompactionExecutionError)throw error2;let lifecycleState=this._compactionLifecycle.state,ownsTerminalTransition=lifecycleState.status!=="idle"&&lifecycleState.operationId===operationId,aborted=signal.aborted||isCompactionExecutionAborted(error2);throw ownsTerminalTransition&&lifecycleState.status==="running"&&this._compactionLifecycle.finish({operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,errorMessage:error2 instanceof Error?error2.message:String(error2)}),new CompactionExecutionError(error2,ownsTerminalTransition,aborted)}finally{finishCompactionWork()}}async _wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model){let currentLeaf=pathEntries[pathEntries.length-1];if(!currentLeaf)return!1;let simulatedCompactionEntry={type:"compaction",id:`simulated-${randomUUID11()}`,parentId:currentLeaf.id,timestamp:new Date().toISOString(),summary:compactionResult.summary,firstKeptEntryId:compactionResult.firstKeptEntryId,tokensBefore:compactionResult.tokensBefore,details:compactionResult.details,fromHook:fromExtension},simulatedMessages=buildSessionContext([...pathEntries,simulatedCompactionEntry],simulatedCompactionEntry.id).messages;(model.provider==="cursor"||model.provider==="cursor-cli-oauth")&&(simulatedMessages=admitCursorHistory({messages:simulatedMessages,budgetBytes:cursorAdmissionBudgetBytes(model.contextWindow)}).messages??simulatedMessages);let contextTokens=estimateMessagesTokens2(simulatedMessages),settings=this._getCompactionSettings(),reserveTokens=settings.reserveScalingEnabled===!1?settings.reserveTokens:resolveReserveTokens(model.contextWindow,settings.reserveTokens);return contextTokens>model.contextWindow-reserveTokens}_restoreAgentMessagesFromSession(){let sessionMessages=this.sessionManager.buildSessionContext().messages,seen=new Set(sessionMessages),pendingMessages=[];for(let message of this.agent.state.messages)seen.has(message)||!this._messageEndsAwaitingPersistence.has(message)||(seen.add(message),pendingMessages.push(message));this.agent.state.messages=[...sessionMessages,...pendingMessages]}async _rejectCompaction(request2,requestId,operationId,rejectionCause,aborted,extensionReason){rejectionCause==="external-owner"&&this.model&&(this._delegatedCompactionKey={provider:this.model.provider,id:this.model.id});let trimmedExtensionReason=extensionReason?.trim(),detailedMessage=trimmedExtensionReason?`Compaction rejected: ${trimmedExtensionReason}`:describeCompactionRejection(rejectionCause),errorMessage8=aborted&&!trimmedExtensionReason?void 0:detailedMessage;if(!this._compactionLifecycle.finish({operationId,status:"failed",endedRevision:this._messageRevision,rejectionCause,...trimmedExtensionReason!==void 0?{errorMessage:trimmedExtensionReason}:{}}))throw new CompactionCancelledError;return this._emit({type:"compaction_end",reason:request2.reason,result:void 0,aborted,willRetry:!1,requestId,accepted:!1,rejectionCause,errorMessage:errorMessage8}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!1,rejectionCause,fromExtension:!1,willRetry:!1}),{accepted:!1,requestId,rejectionCause}}abortCompaction(){let lifecycleState=this._compactionLifecycle.state,activeFeedbackRequestId=lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:void 0,feedbackOperation=this._compactionLifecycle.abort(this._messageRevision);this._compactionAbortController?.abort(),this._autoCompactionAbortController?.abort(),feedbackOperation?.stage==="feedback"&&(this._compactionAbortController=void 0,this._emit({type:"compaction_end",reason:feedbackOperation.reason,result:void 0,aborted:!0,willRetry:!1,requestId:activeFeedbackRequestId}))}abortBranchSummary(){this._branchSummaryAbortController?.abort()}async _enforceCompactionBeforeProvider(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction=!1){this._releaseBlockedPostCompactionAdmissionIfReduced();let blockedAdmission=this._blockedPostCompactionAssistant;if(blockedAdmission!==void 0&&blockedAdmission.assistant===assistantMessage)throw new RequiredCompactionError;let settings=this._getCompactionSettings(),model=this.model;if(this._resumeCompactionRequirement!==void 0){if(!model)throw new RequiredCompactionError;if(!await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))throw new RequiredCompactionError;let currentContext=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(!projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:currentContext,compaction:settings,includeSpeculationLead:!1,admission:"resume"}).usable)throw new RequiredCompactionError;return this._resumeCompactionRequirement=void 0,!0}let contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens,compacted=assistantMessage?await this._checkCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction):!1;if(compacted||assistantMessage&&this._postCompactionUsageExemptAssistants.has(assistantMessage))return compacted;if(!settings.enabled||!model||!shouldCompact2(contextTokens,model.contextWindow,settings))return!1;let latestCompaction2=getLatestCompactionEntry(this.sessionManager.getBranch()),assistantBeforeLatestCompaction=assistantMessage!==void 0&&this._isAssistantFromBeforeLatestCompaction(assistantMessage),hasPostCompactionCustomState=latestCompaction2!==null&&this.agent.state.messages.some(message=>message.role==="custom"&&message.timestamp>=new Date(latestCompaction2.timestamp).getTime());if(assistantBeforeLatestCompaction&&!hasPostCompactionCustomState)return!1;if(assistantBeforeLatestCompaction&&assistantMessage&&await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))return!0;if(this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return!1;throw new RequiredCompactionError}_pendingQueuedInputMessages(){let timestamp=Date.now();return[...this._steeringMessages,...this._followUpMessages].map(text2=>({role:"user",content:[{type:"text",text:text2}],timestamp}))}async _enforceFinalProviderAdmission(messages){let lateQueuedMessages=this._pendingQueuedInputMessages();if(!messages.some(message=>message.role==="custom")&&lateQueuedMessages.length===0)return;let model=this.model;if(!model)return;let settings=this._getCompactionSettings(),reserveTokens=resolveEffectiveReserveTokens(model.contextWindow,settings),isOversized=()=>{let providerMessages=[...this.agent.state.messages,...messages,...this._pendingQueuedInputMessages()],estimate=estimateContextTokens3(providerMessages),usageMessage=estimate.lastUsageIndex===null?void 0:providerMessages[estimate.lastUsageIndex];return(usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(providerMessages):estimate.tokens)>model.contextWindow-reserveTokens};if(!settings.enabled||!isOversized())return;let lastAssistantMessage2=this._findLastAssistantMessage();if(!lastAssistantMessage2)throw new RequiredCompactionError;let compacted=await this._runPrePromptCompaction(lastAssistantMessage2,!1,"pre_prompt");if(!(!compacted&&this._isCompactionDelegated())&&!(!compacted&&this._hasSupersedingCompactionClaim())&&!(!compacted&&!isOversized()&&this._isCompactionOnCooldown())&&(!compacted||isOversized()))throw new RequiredCompactionError}async _checkCompaction(assistantMessage,skipAbortedCheck=!0,inlineReason,retryAfterCompaction=!1){let settings=this._getCompactionSettings();if(skipAbortedCheck&&assistantMessage.stopReason==="aborted")return!1;let contextWindow=this.model?.contextWindow??0,sameModel=this.model&&isSameOverflowSource(assistantMessage,this.model,this._modelRuntime.getCompatibilityRequestConfig(this.model).upstreamModelId),compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(this._isAssistantFromBeforeLatestCompaction(assistantMessage)&&(inlineReason!==void 0||!this._exceedsPolicyByContentEstimate()))return!1;let contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings),recoverableLength=sameModel&&isRecoverableLength(assistantMessage,this.model?.maxTokens??0),isOverflow=isContextOverflow(assistantMessage,contextWindow)&&(sameModel||currentContextNeedsCompaction)||recoverableLength||this._isCursorPayloadOverflow(assistantMessage);if(isOverflow&&!settings.enabled&&!isTurnStuckOnContextOverflow(assistantMessage,contextWindow)||isOverflow&&assistantMessage.stopReason==="stop"&&this._consumePostCompactionUsageExemption(assistantMessage))return!1;if(isOverflow){this._flushPostCompactionDeferredMessages();let willRetry=retryAfterCompaction||assistantMessage.stopReason!=="stop";if(!willRetry){let compacted2=await this._runAutoCompaction("overflow",!1);return!compacted2&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted2}if(this._overflowRecoveryAttempted){let errorMessage8="Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.";if(this._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage8}),inlineReason==="pre_prompt")throw new Error(errorMessage8);return!1}this._overflowRecoveryAttempted=!0;let messages=this.agent.state.messages,removedOverflowAssistant=!1;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),removedOverflowAssistant=!0,this._incrementMessageRevision());let compacted=inlineReason?await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,"overflow",willRetry):await this._runAutoCompaction("overflow",willRetry);if(!compacted&&removedOverflowAssistant&&(this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),!compacted&&inlineReason&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){if(this._compactionSkippedTooSmall){this._compactionSkippedTooSmall=!1;let provider=this.model?.provider;return(provider==="cursor"||provider==="cursor-cli-oauth")&&this._truncateAgentMessagesToLastUserTurn(),!0}throw new RequiredCompactionError}return compacted}if(!settings.enabled||this._consumePostCompactionUsageExemption(assistantMessage))return!1;let contextTokens,staleUsageContentTokens;if(inlineReason){let messages=this.sessionManager.buildSessionContext().messages;contextTokens=estimateContextTokens3(messages).tokens}else{let directContextTokens=assistantMessage.usage?calculateContextTokens2(assistantMessage.usage):0;if(assistantMessage.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this.agent.state.messages,estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex!==null){let usageMsg=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMsg.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMsg)&&(staleUsageContentTokens=estimateMessagesTokens2(messages),!shouldCompact2(staleUsageContentTokens,contextWindow,settings)))return!1}contextTokens=staleUsageContentTokens??estimate.tokens}}if(shouldCompact2(contextTokens,contextWindow,settings)){if(inlineReason)return await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction);{let compacted=await this._runAutoCompaction("threshold",retryAfterCompaction);return!compacted&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted}}return!1}_isCompactionOnCooldown(){let state=this._compactionLifecycle.state;return state.status==="failed"&&state.rejectionCause==="circuit-breaker"}_hasSupersedingCompactionClaim(){let claimant=this._compactionAbortController??this._autoCompactionAbortController;return claimant!==void 0&&!claimant.signal.aborted}_isCompactionDelegated(){let model=this.model;return this._delegatedCompactionKey!==void 0&&model!==void 0&&this._delegatedCompactionKey.provider===model.provider&&this._delegatedCompactionKey.id===model.id}async _runPrePromptCompaction(lastAssistantMessage2,skipAbortedCheck,reason="pre_prompt",willRetry=!1,allowSummaryOnly=!1){if(this._isCompactionDelegated())return!1;let controller=new AbortController,requestId=randomUUID11();this._claimCompactionController(controller,"compaction"),this._emit({type:"compaction_start",reason,requestId});try{let execution=await this._executeCompaction({controller,owner:"compaction",reason,requestId,willRetry,lastAssistantMessage:lastAssistantMessage2,skipAbortedCheck,allowSummaryOnly});return!execution.accepted&&lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryAttempted=!1),execution.accepted}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryAttempted=!1);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage8);let aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Pre-prompt compaction failed: ${errorMessage8}`}),!1}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}async _revalidateScheduledContinuationAdmission(){let model=this.model,settings=this._getCompactionSettings();if(!model||!settings.enabled)return;let canonicalMessages=this.sessionManager.buildSessionContext().messages,estimate=estimateContextTokens3(canonicalMessages),usageMessage=estimate.lastUsageIndex===null?void 0:canonicalMessages[estimate.lastUsageIndex],contextTokens=usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(canonicalMessages):estimate.tokens,atHardLimit=shouldCompact2(contextTokens,model.contextWindow,settings),overProactiveThreshold=shouldTriggerCompaction({tokens:contextTokens,contextWindow:model.contextWindow,percent:model.contextWindow>0?contextTokens/model.contextWindow*100:0},model.contextWindow,settings);if(!atHardLimit&&!overProactiveThreshold)return;if(!await this._runPrePromptCompaction(this._findLastAssistantMessage(),!0,"pre_prompt")){if(!atHardLimit||this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return;throw new RequiredCompactionError}this._scheduledContinuationRecompacted=!0}async _continueAgentAfterCurrentRun(options={},retryTimeoutMs){await this.agent.waitForIdle();try{return this.agent.state.isStreaming||(await this._maybeRestoreFallbackPrimary(),await this._revalidateScheduledContinuationAdmission(),this.agent.state.isStreaming)?"taken-over":(await runBoundedRetryContinuation({continueRun:async()=>{if(this._scheduledContinuationRecompacted){let tail=this.agent.state.messages.at(-1);tail?.role==="assistant"&&(tail.stopReason==="error"||tail.stopReason==="aborted")&&(this._retireFailedRetryAssistant(tail),this.agent.state.messages.at(-1)===tail&&(this.agent.state.messages=this.agent.state.messages.slice(0,-1),this._incrementMessageRevision())),await this.agent.continueWithQueuedMessages(options)}else await this.agent.continue(options)},getActiveSignal:()=>this.agent.signal,abortActive:()=>this.agent.abort(new ProviderRetryWatchdogAbortError(providerRetryWatchdogAbortMessage(retryTimeoutMs,this.agent.streamStartTimeoutMs))),timeoutMs:retryTimeoutMs}),"continued")}catch(error2){if(this.agent.state.isStreaming&&error2 instanceof Error&&error2.message.startsWith("Agent is already processing"))return"taken-over";throw error2}finally{this._scheduledContinuationRecompacted=!1}}_resumeQueuedMessagesAfterCompaction(){(this.pendingMessageCount>0||this.agent.hasQueuedMessages())&&this._scheduleContinuationAfterCurrentEvent()}_scheduleContinuationAfterCurrentEvent(options={},retryContinuation=!1,retryTimeoutMs){let currentEventQueue=this._agentEventQueue,finishContinuationWork=this._sessionWorkBarrier.begin(),continueAfterEvent=async()=>{try{let outcome=await this._continueAgentAfterCurrentRun(options,retryTimeoutMs);retryContinuation&&outcome==="taken-over"&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this)}catch(error2){retryContinuation&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this);let message=error2 instanceof Error?error2.message:String(error2);this._emit({type:"continuation_error",errorMessage:`Failed to continue queued messages: ${message}`}),this.agent.state.isStreaming||await this._emitAgentSettled(),retryContinuation&&this._resolveRetry()}};currentEventQueue.then(continueAfterEvent,continueAfterEvent).finally(finishContinuationWork).catch(()=>{})}async _runAutoCompaction(reason,willRetry){if(this._isCompactionDelegated())return!1;let model=this.model,finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=this.agent.state.messages.slice(),autoCompactionController=new AbortController,requestId=randomUUID11();this._claimCompactionController(autoCompactionController,"auto");let endBeforeExecution=()=>(this._emit({type:"compaction_start",reason,requestId}),reason==="overflow"&&this._autoCompactionAbortController===autoCompactionController&&(this._overflowRecoveryAttempted=!1),this._autoCompactionAbortController!==autoCompactionController||this._emit({type:"compaction_end",reason,result:void 0,aborted:autoCompactionController.signal.aborted,willRetry:!1,requestId}),!1);try{if(!this.model)return endBeforeExecution();try{await this._modelRuntime.getAuth(this.model)}catch{return this._ownsCompactionController(autoCompactionController,"auto")?endBeforeExecution():!1}if(!this._ownsCompactionController(autoCompactionController,"auto"))return!1;if(!prepareCompaction2(this.sessionManager.getBranch(),cursorOverflowCompactionSettings(this._getCompactionSettings(model),model?.provider,reason),reason==="overflow"))return endBeforeExecution();if(!this._ownsCompactionController(autoCompactionController,"auto"))return!1;if(this._emit({type:"compaction_start",reason,requestId}),!(await this._executeCompaction({controller:autoCompactionController,owner:"auto",reason,requestId,willRetry,agentMessagesAtStart})).accepted)return reason==="overflow"&&(this._overflowRecoveryAttempted=!1),!1;if(this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),willRetry){let messages=this.agent.state.messages,lastMsg=messages[messages.length-1];return lastMsg?.role==="assistant"&&(lastMsg.stopReason==="error"||lastMsg.stopReason==="length")&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision()),this._scheduleContinuationAfterCurrentEvent(),!0}else{if(this.pendingMessageCount>0)return this._scheduleContinuationAfterCurrentEvent(),!0;if(this.agent.hasQueuedMessages())return this._scheduleContinuationAfterCurrentEvent(),!0}return!1}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;reason==="overflow"&&(this._overflowRecoveryAttempted=!1);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage8}`:`Auto-compaction failed: ${errorMessage8}`;return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:formattedErrorMessage}),await this._emitSessionCompactFailed({reason,errorMessage:formattedErrorMessage,aborted,willRetry:!1,fromExtension:!1}),!1}finally{this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),finishCompactionWork()}}setAutoCompactionEnabled(enabled){this._autoCompactionSessionOverride=enabled,this._emitSessionSettingsChanged()}_getCompactionSettings(forModel=this.model){let settings=this.settingsManager.getCompactionSettings(forModel);return this._autoCompactionSessionOverride===void 0?settings:{...settings,enabled:this._autoCompactionSessionOverride}}_emitSessionSettingsChanged(){this._emit({type:"session_settings_changed",steeringMode:this.steeringMode,followUpMode:this.followUpMode,autoCompactionEnabled:this.autoCompactionEnabled})}get autoCompactionEnabled(){return this._autoCompactionSessionOverride??this.settingsManager.getCompactionEnabled()}async bindExtensions(bindings2){let finishBindingWork=this._sessionWorkBarrier.begin(),bindingPromptReadiness=new Set;this._extensionBindingPromptReadiness=bindingPromptReadiness;try{bindings2.uiContext!==void 0&&(this._extensionUIContext=bindings2.uiContext),bindings2.mode!==void 0&&(this._extensionMode=bindings2.mode),bindings2.commandContextActions!==void 0&&(this._extensionCommandContextActions=bindings2.commandContextActions),bindings2.abortHandler!==void 0&&(this._extensionAbortHandler=bindings2.abortHandler),bindings2.shutdownHandler!==void 0&&(this._extensionShutdownHandler=bindings2.shutdownHandler),bindings2.onError!==void 0&&(this._extensionErrorListener=bindings2.onError),this._applyExtensionBindings(this._extensionRunner),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit(this._sessionStartEvent),this._enforceConfiguredDefaultTools(),await this.extendResourcesFromExtensions(this._sessionStartEvent.reason==="reload"?"reload":"startup")}finally{this._extensionBindingPromptReadiness===bindingPromptReadiness&&(this._extensionBindingPromptReadiness=void 0),finishBindingWork()}await Promise.all(bindingPromptReadiness)}async extendResourcesFromExtensions(reason){if(!this._extensionRunner.hasHandlers("resources_discover"))return;let{skillPaths,promptPaths,themePaths,hookPaths}=await this._extensionRunner.emitResourcesDiscover(this._cwd,reason);if(skillPaths.length===0&&promptPaths.length===0&&themePaths.length===0&&hookPaths.length===0)return;let extensions=this._resourceLoader.getExtensions().extensions,extensionPaths={skillPaths:resolveDiscoveredResourcePaths(skillPaths,extensions),promptPaths:resolveDiscoveredResourcePaths(promptPaths,extensions),themePaths:resolveDiscoveredResourcePaths(themePaths,extensions),hookPaths:resolveDiscoveredResourcePaths(hookPaths,extensions)};this._resourceLoader.extendResources(extensionPaths),(skillPaths.length>0||promptPaths.length>0||themePaths.length>0)&&(this._baseSystemPrompt=this._rebuildSystemPrompt(this.getActiveToolNames()),this.agent.state.systemPrompt=this._baseSystemPrompt)}_applyExtensionBindings(runner){runner.setUIContext(this._extensionUIContext,this._extensionMode),runner.setToolHookLifecycleObserver(event=>{this._emit(event)}),runner.bindCommandContext(this._extensionCommandContextActions),this._extensionErrorUnsubscriber?.(),this._extensionErrorUnsubscriber=this._extensionErrorListener?runner.onError(this._extensionErrorListener):void 0}_refreshCurrentModelFromRegistry(){this._delegatedCompactionKey=void 0;let currentModel=this.model;if(!currentModel)return;let refreshedModel=this._modelRuntime.getModel(currentModel.provider,currentModel.id);!refreshedModel||refreshedModel===currentModel||(this.agent.state.model=refreshedModel)}_bindExtensionCore(runner){this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data));let getCommands=()=>{let extensionCommands=runner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,source:"extension",sourceInfo:command.sourceInfo})),templates=this.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=this._resourceLoader.getSkills().skills.map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...extensionCommands,...templates,...skills]};runner.bindCore({sendMessage:(message,options)=>{let reportError=err2=>{runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_message",error:err2 instanceof Error?err2.message:String(err2)})};if(options?.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendCustomMessage(message,options,claim).catch(reportError)}))return;let send=()=>this.sendCustomMessage(message,options).catch(reportError);this._agentSettledDelivery.defer(send)||send()},sendUserMessage:(content,options)=>{let reportError=err2=>{runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_user_message",error:err2 instanceof Error?err2.message:String(err2)})};this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendUserMessage(content,options,claim).catch(reportError)})||this.sendUserMessage(content,options).catch(reportError)},appendEntry:(customType,data)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data),entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})},setSessionName:name=>{this.setSessionName(name)},getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label2)=>{this.sessionManager.appendLabelChange(entryId,label2)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivators.push(activator)},getCommands,setModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled)},{getModel:()=>this.model,getServiceTier:()=>this.serviceTier,getEffectiveServiceTier:()=>this.effectiveServiceTier,getScopedModels:()=>this._scopedModels,isIdle:()=>this.isIdle,getAgentDir:()=>this._agentDir,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),getSignal:()=>this._extensionEventSignal??this.agent.signal,abort:(source="user")=>{if(source==="system")return void this._abortActiveAgentAndRetry("system");if(this._extensionAbortHandler)return this._extensionAbortHandler();this.abort()},hasPendingMessages:()=>this.pendingMessageCount>0,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getPromptCacheSafeWaitSeconds:()=>this.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getPromptCacheKeepAliveSettings:()=>this.settingsManager.getPromptCacheKeepAliveSettings(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getAskUserSettings:()=>this.settingsManager.getAskUserSettings(),getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:{getRetryFallbackSettings:()=>this.settingsManager.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{this.settingsManager.setFallbackChain(key,[...entries]),await this.settingsManager.flush()},removeFallbackChain:async key=>{this.settingsManager.removeFallbackChain(key),await this.settingsManager.flush()},setModelFallbackEnabled:async enabled=>{this.settingsManager.setModelFallbackEnabled(enabled),await this.settingsManager.flush()},setFallbackRevertPolicy:async policy=>{this.settingsManager.setFallbackRevertPolicy(policy),await this.settingsManager.flush()},reload:()=>this.settingsManager.reload(),getFallbackStatus:()=>{let active=this._retryFallback.activeState;if(active)return{active:!0,currentModel:this.model?`${this.model.provider}/${this.model.id}`:void 0,originalSelector:active.originalSelector,pinned:active.pinned}}},compact:options=>{let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID11();(async()=>{let outcome="failed",compactionCompleted=!1,disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"extension",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"extension",requestId,customInstructions:options?.customInstructions,willRetry:!1});execution.accepted?(outcome="completed",compactionCompleted=!0,options?.onComplete?.(execution.result)):(outcome="failed",options?.onError?.(new CompactionRejectedError(execution.rejectionCause)))}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",!compactionExecutionOwnsTerminalTransition(error2))return;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);this._emit({type:"compaction_end",reason:"extension",result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`});let err2=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err2)}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),compactionCompleted&&this._resumeQueuedMessagesAfterCompaction()}})()},beginCompaction:options=>this._beginExtensionCompactionFeedback(options.reason),updateCompaction:options=>this._updateExtensionCompactionFeedback(options),endCompaction:options=>this._endExtensionCompactionFeedback(options),getMessageRevision:()=>this.getMessageRevision(),applyCompaction:(precomputed,options)=>this.applyCompaction(precomputed,options),getSystemPrompt:()=>this.systemPrompt,getLoadedHookSources:()=>this._resourceLoader.getLoadedHookSources?.()??{agentDir:this._cwd,cwd:this._cwd,globalHookSourcePaths:[],globalHooksPath:`${this._cwd}/hooks.json`,preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:`${this._cwd}/.senpi/hooks.json`,runtimeHookSourcePaths:[]},getSystemPromptOptions:()=>this._baseSystemPromptOptions},{registerProvider:(name,config)=>{this._modelRuntime.registerProvider(name,config),this._refreshCurrentModelFromRegistry()},registerNativeProvider:provider=>{this._modelRuntime.registerNativeProvider(provider),this._refreshCurrentModelFromRegistry()},unregisterProvider:name=>{this._modelRuntime.unregisterProvider(name),this._refreshCurrentModelFromRegistry()}}),this._bindToolSearchRemovedHints()}get fallbackValidationWarnings(){return this._fallbackValidationWarnings}_isBuiltinExtensionPath(path13){return path13.startsWith("<builtin:")||/[\\/]senpi-codemode[\\/]/u.test(path13)}_enforceConfiguredDefaultTools(){let defaultToolNames=this._defaultToolNames;defaultToolNames!==void 0&&this.setActiveToolsByName(this.getActiveToolNames().filter(name=>{if(defaultToolNames.has(name))return!0;let entry=this._toolDefinitions.get(name);return entry!==void 0&&!this._isBuiltinExtensionPath(entry.sourceInfo.path)&&entry.sourceInfo.source!=="builtin"}))}_refreshToolRegistry(options){let previousRegistryNames=new Set(this._toolRegistry.keys()),previousActiveToolNames=this.getActiveToolNames(),allowedToolNames=this._allowedToolNames,excludedToolNames=this._excludedToolNames,isAllowedTool=name=>(!allowedToolNames||allowedToolNames.has(name))&&!excludedToolNames?.has(name),registeredTools=this._extensionRunner.getAllRegisteredTools(),defaultToolNames=this._defaultToolNames,isConfiguredBuiltinTool=tool=>tool.sourceInfo.source!=="builtin"&&!this._isBuiltinExtensionPath(tool.sourceInfo.path)||defaultToolNames===void 0||defaultToolNames.has(tool.definition.name),allCustomTools=[...registeredTools.filter(isConfiguredBuiltinTool),...this._customTools.map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<sdk:${definition.name}>`,{source:"sdk"})}))].filter(tool=>isAllowedTool(tool.definition.name)),definitionRegistry=new Map(Array.from(this._baseToolDefinitions.entries()).filter(([name])=>isAllowedTool(name)).map(([name,definition])=>[name,{definition,sourceInfo:createSyntheticSourceInfo(`<builtin:${name}>`,{source:"builtin"})}]));for(let tool of allCustomTools)definitionRegistry.set(tool.definition.name,{definition:tool.definition,sourceInfo:tool.sourceInfo});this._toolDefinitions=definitionRegistry,this._toolPromptSnippets=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let snippet=this._normalizePromptSnippet(definition.promptSnippet);return snippet?[definition.name,snippet]:void 0}).filter(entry=>entry!==void 0)),this._toolPromptGuidelines=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let guidelines=this._normalizePromptGuidelines(definition.promptGuidelines);return guidelines.length>0?[definition.name,guidelines]:void 0}).filter(entry=>entry!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext),wrappedBuiltInTools=wrapRegisteredTools(Array.from(this._baseToolDefinitions.values()).filter(definition=>isAllowedTool(definition.name)).map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<builtin:${definition.name}>`,{source:"builtin"})})),runner,createToolContext),toolRegistry=new Map(wrappedBuiltInTools.map(tool=>[tool.name,tool]));for(let tool of wrappedExtensionTools)toolRegistry.set(tool.name,tool);this._toolRegistry=toolRegistry,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._publishEvalOnlyToolHints();let isDirectlyExposed=name=>{let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return exposure==="direct"||exposure==="eval"},nextActiveToolNames=(options?.activeToolNames?[...options.activeToolNames]:[...this._requestedActiveToolNames??previousActiveToolNames]).filter(name=>{if(!isAllowedTool(name))return!1;let previousRegistrationIds=options?.previousActiveToolRegistrationIds;if(!previousRegistrationIds)return!0;let current=this._toolDefinitions.get(name);return current!==void 0&&previousRegistrationIds.get(name)===deriveExtensionRegistrationId(current.sourceInfo,name)});if(allowedToolNames)for(let toolName of this._toolRegistry.keys())allowedToolNames.has(toolName)&&nextActiveToolNames.push(toolName);else if(options?.includeAllExtensionTools)for(let tool of wrappedExtensionTools)isDirectlyExposed(tool.name)&&nextActiveToolNames.push(tool.name);else if(!options?.activeToolNames)for(let toolName of this._toolRegistry.keys())!previousRegistryNames.has(toolName)&&isDirectlyExposed(toolName)&&nextActiveToolNames.push(toolName);this.setActiveToolsByName([...new Set(nextActiveToolNames)])}_buildRuntime(options){this._delegatedCompactionKey=void 0;let autoResizeImages=this.settingsManager.getImageAutoResize(),shellCommandPrefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),extensionsResult=this._resourceLoader.getExtensions(),filesystemPolicy=composeFilesystemPolicies(extensionsResult.extensions.flatMap(extension=>extension.filesystemPolicies??[])),baseToolDefinitions=this._baseToolsOverride?Object.fromEntries(Object.entries(this._baseToolsOverride).map(([name,tool])=>[name,createToolDefinitionFromAgentTool(tool)])):createAllToolDefinitions(this._cwd,{read:{autoResizeImages,filesystemPolicy},bash:{commandPrefix:shellCommandPrefix,shellPath},write:{filesystemPolicy},edit:{filesystemPolicy},grep:{filesystemPolicy},find:{filesystemPolicy},ls:{filesystemPolicy}});if(this._baseToolDefinitions=new Map(Object.entries(baseToolDefinitions).map(([name,tool])=>[name,tool])),options.flagValues)for(let[name,value2]of options.flagValues)extensionsResult.runtime.flagValues.set(name,value2);this._extensionRunner=new ExtensionRunner(extensionsResult.extensions,extensionsResult.runtime,this._cwd,this.sessionManager,this._modelRegistry,extensionsResult.eventBus),this._extensionRunnerRef&&(this._extensionRunnerRef.current=this._extensionRunner),this._bindExtensionCore(this._extensionRunner),this._applyExtensionBindings(this._extensionRunner);let defaultActiveToolNames=this._baseToolsOverride?Object.keys(this._baseToolsOverride):["read","bash","edit","write","grep"],baseActiveToolNames=options.activeToolNames??defaultActiveToolNames;this._refreshToolRegistry({activeToolNames:baseActiveToolNames,includeAllExtensionTools:options.includeAllExtensionTools,previousActiveToolRegistrationIds:options.previousActiveToolRegistrationIds})}async reload(options){let veto=await this.checkReloadVeto();if(veto.cancelled)return veto;resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousFlagValues=oldExtensionRunner.getFlagValues(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry=this._toolDefinitions.get(name);entry&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry.sourceInfo,name))}await emitSessionShutdownEvent(oldExtensionRunner,{type:"session_shutdown",reason:"reload"}),time("shutdown","reload"),await this.settingsManager.reload(),this._delegatedCompactionKey=void 0;let requestedActiveToolNamesBeforeRebuild=[...this._requestedActiveToolNames??this.getActiveToolNames()];this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this.syncQueueModesFromSettings(),resetApiProviders(),time("settings","reload"),await this._modelRuntime.reloadConfig();let refreshedModels=this._modelRuntime.hasFreshAvailabilitySnapshot()?{getAvailable:async()=>this._modelRuntime.getAvailableSnapshot()}:this._modelRuntime;this.setScopedModels(await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:this.settingsManager.getEnabledModels()}),refreshedModels)),this.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels()??[],refreshedModels)),time("models","reload"),await this._resourceLoader.reload({settingsAlreadyReloadedFor:this.settingsManager}),time("resources","reload");try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:previousFlagValues,includeAllExtensionTools:!0,previousActiveToolRegistrationIds})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}return(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener)&&(await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")),time("lifecycle","reload"),{cancelled:!1}}async checkReloadVeto(){if(!this._extensionRunner.hasHandlers("session_before_reload"))return{cancelled:!1};let result3=await this._extensionRunner.emit({type:"session_before_reload"});return result3?.cancel!==!0?{cancelled:!1}:result3.reason===void 0?{cancelled:!0}:{cancelled:!0,reason:result3.reason}}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||isContextOverflow(message,this.model?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isCursorPayloadOverflow(message){return isCursorPayloadResourceExhausted(message,0)}_truncateAgentMessagesToLastUserTurn(){let messages=this.agent?.state?.messages;if(!Array.isArray(messages)||messages.length===0)return!1;let lastUser=-1;for(let i=messages.length-1;i>=0;i--)if(messages[i]?.role==="user"){lastUser=i;break}return lastUser<=0?!1:(this.agent.state.messages=messages.slice(lastUser),!0)}_isClaudeSdkSessionLockError(message){return(message.errorMessage??"").includes("Lock file is already being held")}_isClaudeSdkInvalidRequestError(message){return message.errorMessage==="invalid_request"}_isClaudeSdkSameModelRemintError(message){return this.model?.provider!==CLAUDE_SDK_OAUTH_PROVIDER_ID?!1:this._isClaudeSdkSessionLockError(message)||this._isClaudeSdkInvalidRequestError(message)}_isClaudeSdkAuthMissError(message){return this.model?.provider===CLAUDE_SDK_OAUTH_PROVIDER_ID&&message.errorMessage===providerNotConfiguredMessage(CLAUDE_SDK_OAUTH_PROVIDER_ID)}_isHardErrorFallbackEligible(message){return!message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)&&!this._isClaudeSdkAuthMissError(message)&&!this._isClaudeSdkSameModelRemintError(message)&&message.stopReason==="error"&&!isContextOverflow(message,this.model?.contextWindow??0)&&!this._isCursorPayloadOverflow(message)&&!isCursorZeroTokenResourceExhausted(message)&&!isClassifierRefusal(message)&&!message.content.some(content=>content.type==="toolCall")&&this._retryFallback.canTryFallback()}_takeNativeToolSearchInjectionFailure(){try{return getToolSearchService().takeNativeInjectionFailure()}catch{return null}}_getProviderRetryDelayMs(errorMessage8){let markerMs=parseRetryAfterMsMarker(errorMessage8);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage8})}_summarizationRetryCallbacks(source){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage8)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage8})},onRetryAttemptStart:()=>{this._emit({type:"summarization_retry_attempt_start",...source})},onRetryFinished:()=>{this._emit({type:"summarization_retry_finished"})}}}_terminalFailureText(message,attempts){let model=this.model?`${this.model.provider}/${this.model.id}`:void 0;return describeProviderStallForUser(message.errorMessage,{attempts,model,recovery:this._retryFallback.hasConfiguredChain()?"chain-exhausted":"no-fallback-configured"})??message.errorMessage}_degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8){let settings=this.settingsManager.getRetrySettings(),turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,hintSettings=this.settingsManager.getHintPolicySettings(),finishTurn2=(attempt2,finalError)=>{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry()},degraded=degradeWithoutFallback(tier,hintMs,this._retryAttempt+1,settings.baseDelayMs,hintSettings.hintedWaitCapMs);if(degraded.kind==="fail"){let waitSeconds=Math.ceil(degraded.hintMs/1e3);finishTurn2(this._retryAttempt,`Provider requested a ${waitSeconds}s wait before retrying and no usable fallback model is available. ${message.errorMessage??""}`);return}if(this._retryAttempt++,this._retryAttempt>turnMaxRetries){finishTurn2(this._retryAttempt-1,message.errorMessage);return}return degraded.delayMs}async _handleRetryableError(message,options={}){let settings=this.settingsManager.getRetrySettings();if(!settings.enabled)return this._resolveRetry(),"not-handled";let retryProfile=this._resolveRetryProfile();this._retryPromise||(this._retryPromise=new Promise(resolve42=>{this._retryResolve=resolve42}));let errorMessage8=message.errorMessage||"Unknown error",isRefusal=isClassifierRefusal(message),hardErrorFallback=options.hardErrorFallback===!0,sameModelRemint=options.sameModelRemint===!0,switchedFallback=!1,sameModelNativeRecovery=!1,is429TierRouted=!1,hintTierDelayMs,tryFallback=async(reason,failure2)=>{try{return await this._retryFallback.tryFallback(reason,failure2)}catch(error2){if(error2 instanceof ModelUsabilityBudgetError)return this._resolveRetry(),!1;throw error2}};if(sameModelRemint){if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)return this._retryAttempt>1&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else if(hardErrorFallback)if(this._takeNativeToolSearchInjectionFailure()!==null)sameModelNativeRecovery=!0,this._retryAttempt=1;else{let reason=isBillingErrorMessage(errorMessage8)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage8}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._resolveRetry(),"not-handled"}this._retryAttempt=1}else if(isRefusal){if(this._retryAttempt+1>retryProfile.turn.maxRetries)return this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";if(switchedFallback=await tryFallback("refusal",{}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}this._retryAttempt++}else{let is429Class=!isProviderStreamStallError(message)&&/rate.?limit|(?:^429(?=\s+\{)|(?:\bHTTP\/1\.[01]\s+|\bHTTP\s+|\bstatus(?:\s+code)?\s+|\berror\s+|\bcode\s+)429\b)|too many requests|resource.?exhausted/i.test(errorMessage8);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else if(is429Class){let hintMs=this._getProviderRetryDelayMs(errorMessage8),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}else if(tier==="tier1-in-turn")if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else{let inTurnResult=nextInTurnDelayMs({probePhase:this._probePhase,hintDeadlineMs:this._hintDeadlineMs,attempt:this._retryAttempt,cumulativeHintedWaitMs:this._cumulativeHintedWaitMs},hintMs,settings.baseDelayMs,hintSettings.hintedWaitCapMs,Date.now());if(this._probePhase=inTurnResult.probePhase,this._hintDeadlineMs=inTurnResult.hintDeadlineMs,this._cumulativeHintedWaitMs=inTurnResult.cumulativeHintedWaitMs,inTurnResult.demoteToProbeBack){let remainingHintMs=Math.max(0,(this._hintDeadlineMs??Date.now())-Date.now());if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else hintTierDelayMs=inTurnResult.delayMs}else{let remainingHintMs=hintMs??0;if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback){if(this._retryAttempt=1,tier==="tier2-fallback-probe-back"){let selector=this._retryFallback.activeState?.originalSelector??"";this._armProbeBackForDemotedSelector(selector,remainingHintMs)}}else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}}}if(is429TierRouted||this._retryAttempt++,!is429TierRouted&&this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:this._terminalFailureText(message,this._retryAttempt-1)}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}let providerDelayMs=isRefusal||hardErrorFallback?void 0:this._getProviderRetryDelayMs(errorMessage8),maxRetryDelayMs=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs,effectiveMaxRetryDelayMs=(retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:maxRetryDelayMs)??Number.MAX_SAFE_INTEGER;if(!is429TierRouted&&providerDelayMs!==void 0&&providerDelayMs>effectiveMaxRetryDelayMs&&(switchedFallback||(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:providerDelayMs}),switchedFallback&&(this._retryAttempt=1)),!switchedFallback))return this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:`Provider requested retry delay ${providerDelayMs}ms, exceeding configured maximum ${maxRetryDelayMs}ms`}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";let nonTierProviderDelayMs=providerDelayMs===0?void 0:providerDelayMs,localExponentialMs=retryBackoffDelayMs(retryProfile.turn.backoff,this._retryAttempt,this._retryRandom()),plannedDelayMs=switchedFallback||sameModelNativeRecovery?0:is429TierRouted?hintTierDelayMs??providerDelayMs??localExponentialMs:nonTierProviderDelayMs??localExponentialMs,profileTurnCeilingMs=retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:void 0,agentCeilingMs=(this.settingsManager.isRetryMaxAgentDelayMsConfigured?.()??!1)||profileTurnCeilingMs===void 0?settings.maxAgentDelayMs:profileTurnCeilingMs,delayMs=Math.min(plannedDelayMs,agentCeilingMs??Number.MAX_SAFE_INTEGER);this._retryAbortController=new AbortController,this._emit({type:"auto_retry_start",attempt:this._retryAttempt,maxAttempts:retryProfile.turn.maxRetries,delayMs,errorMessage:errorMessage8});let messages=this.agent.state.messages;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision());try{await sleep(delayMs,this._retryAbortController.signal)}catch{let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._retryAbortController=void 0,await this._emitAgentSettled(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:"Retry cancelled"}),this._resolveRetry(),"cancelled"}this._retryAbortController=void 0,await this._maybeRestoreFallbackPrimary();let model=this.model,compactionSettings=this._getCompactionSettings(),contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(compactionSettings.enabled&&model&&shouldCompact2(contextTokens,model.contextWindow,compactionSettings)){if(!await this._runPrePromptCompaction(message,!0,"threshold",!0,!0)&&!this._isCompactionOnCooldown()&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:new RequiredCompactionError().message}),this._resolveRetry(),"blocked"}this._skipNextPostRetryCompactionCheck=!0}let continuation=createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs:this.settingsManager.getProviderStreamRetryTimeoutMs(),timeoutMs:this.agent.timeoutMs,streamStartTimeoutMs:this.agent.streamStartTimeoutMs});return continuation.options.deferQueuedMessages===!0?DEFERRED_RETRY_QUEUE_OWNERS.add(this):DEFERRED_RETRY_QUEUE_OWNERS.delete(this),this.agent.suppressQueuedMessageDrain(),this._scheduleContinuationAfterCurrentEvent(continuation.options,!0,continuation.watchdogTimeoutMs),"continued"}abortRetry(){this._retryAbortController?.abort(),this._resolveRetry()}async waitForRetry(){this._retryPromise&&(await this._retryPromise,await this.agent.waitForIdle())}get isRetrying(){return this._retryPromise!==void 0}get autoRetryEnabled(){return this.settingsManager.getRetryEnabled()}setAutoRetryEnabled(enabled){this.settingsManager.setRetryEnabled(enabled)}async executeBash(command,onChunk,options){let abortController=new AbortController;this._bashAbortControllers.add(abortController);let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
|
|
2335
|
+
`)}`:prompt}async _runInputHandlers(text2,images,source,streamingBehavior){if(!this._extensionRunner.hasHandlers("input"))return{text:text2,images};let inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`,inputResult=await this._extensionRunner.emitInput(text2,images,source,streamingBehavior,inputId);if(inputResult.action==="handled"){await this._emitInputDisposition(inputId,"handled");return}return inputResult.action==="transform"?{text:inputResult.text,images:inputResult.images??images,inputId}:{text:text2,images,inputId}}async _emitInputDisposition(inputId,disposition){inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})}async prompt(text2,options){let throwIfCancelled=()=>{if(!options?.signal?.aborted)return;let error2=new Error("Prompt cancelled before acceptance");throw error2.name="AbortError",error2};throwIfCancelled();let userAbortPromise=this._userAbortPromise;userAbortPromise&&(await userAbortPromise,throwIfCancelled());try{if((options?.expandPromptTemplates??!0)&&text2.startsWith("/")){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName)){let handled=await this._tryExecuteExtensionCommand(text2);if(throwIfCancelled(),handled){options?.promptDisposition?.("handled"),options?.preflightResult?.(!0);return}}}}catch(error2){throw options?.preflightResult?.(!1),error2}if(options?.source!=="extension"&&this._compactionAbortController!==void 0)throw options?.preflightResult?.(!1),new Error("Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.");let ownsPromptStart=!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior===void 0;ownsPromptStart&&(this._promptStartPending=!0);let shouldWaitForSessionWork=!0,pendingCompactionAdmissionAtExtensionAdmission=options?.source==="extension"?this._pendingCompactionAdmission:void 0,compactionGenerationAtExtensionAdmission=options?.source==="extension"&&this._sessionWorkBarrier.hasActiveWork&&this._compactionLifecycle.state.status!=="idle"?this._compactionLifecycle.state.generation:void 0,canQueueWhileStreaming=(this.isStreaming||this._promptStartPending)&&!this.isCompacting&&options?.streamingBehavior!==void 0,canQueueDuringAutoCompaction=this._autoCompactionAbortController!==void 0&&this._compactionAbortController===void 0&&!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior!==void 0;if(shouldWaitForSessionWork&&!canQueueWhileStreaming&&!canQueueDuringAutoCompaction&&(!this.isStreaming||this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),options?.onSessionWorkReady?.()),!this.isStreaming)try{await this._maybeRestoreFallbackPrimary()}catch(error2){throw ownsPromptStart&&(this._promptStartPending=!1),error2}let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,promptDisposition=options?.promptDisposition,messages,titlePrompt,consumedNextTurnMessages,inputId,pendingCommandInvocation,emitPendingCommandInvocation=()=>{pendingCommandInvocation&&(this._emit({type:"command_invocation",command:pendingCommandInvocation}),pendingCommandInvocation=void 0)},emitInputDisposition=async disposition=>{inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})};try{if(isManualContinueSubmission({text:text2,hasMessages:this.agent.state.messages.length>0,hasImages:(options?.images?.length??0)>0})){await this.sendCustomMessage({customType:MANUAL_CONTINUE_CUSTOM_TYPE,content:MANUAL_CONTINUE_DIRECTIVE,display:!1},{triggerTurn:!0,deliverAs:options?.streamingBehavior==="followUp"?"followUp":"steer"}),promptDisposition?.("handled"),preflightResult?.(!0);return}let currentText=text2,currentImages=options?.images;if(this._extensionRunner.hasHandlers("input")){inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`;let inputResult=await this._extensionRunner.emitInput(currentText,currentImages,options?.source??"interactive",this.isStreaming?options?.streamingBehavior:void 0,inputId);if(throwIfCancelled(),inputResult.action==="handled"){await emitInputDisposition("handled"),promptDisposition?.("handled"),preflightResult?.(!0);return}inputResult.action==="transform"&&(currentText=inputResult.text,currentImages=inputResult.images??currentImages)}let expandedText=currentText;if(expandPromptTemplates){expandedText=this._expandSkillCommand(expandedText);let templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,templateExpansion.template&&(pendingCommandInvocation={name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"})}if(titlePrompt=options?.sessionTitlePrompt===!1?void 0:options?.sessionTitlePrompt??text2,this.isStreaming){if(!options?.streamingBehavior)throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");if(options.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueDuringAutoCompaction&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&shouldWaitForSessionWork&&(this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),this.isStreaming)){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(pendingCompactionAdmissionAtExtensionAdmission!==void 0&&pendingCompactionAdmissionAtExtensionAdmission.outcome!=="completed"||compactionGenerationAtExtensionAdmission!==void 0&&this._compactionLifecycle.state.generation===compactionGenerationAtExtensionAdmission&&(this._compactionLifecycle.state.status==="failed"||this._compactionLifecycle.state.status==="aborted")){options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(this._flushPendingBashMessages(),!this.model)throw new Error(formatNoModelSelectedMessage());if(!(this._modelRuntime.hasConfiguredAuth(this.model.provider)||await this._modelRuntime.checkAuth(this.model.provider)!==void 0))throw this._modelRuntime.isUsingOAuth(this.model.provider)?new Error(`Authentication failed for "${this.model.provider}". Credentials may have expired or network is unavailable. Run '/login ${this.model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(this.model.provider));await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),messages=[];let userContent=[{type:"text",text:expandedText}];currentImages&&userContent.push(...currentImages),messages.push({role:"user",content:userContent,timestamp:Date.now()}),consumedNextTurnMessages=this._pendingNextTurnMessages,this._pendingNextTurnMessages=[];for(let msg of consumedNextTurnMessages)messages.push(msg);let result3=await this._extensionRunner.emitBeforeAgentStart(expandedText,currentImages,this._baseSystemPrompt,this._baseSystemPromptOptions);if(result3?.messages)for(let msg of result3.messages)messages.push({role:"custom",customType:msg.customType,content:msg.content??[],display:msg.display,details:msg.details,timestamp:Date.now()});result3?.systemPrompt!==void 0?(this._systemPromptOverride=result3.systemPrompt,this.agent.state.systemPrompt=result3.systemPrompt):(this._systemPromptOverride=void 0,this.agent.state.systemPrompt=this._baseSystemPrompt),await this._enforceFinalProviderAdmission(messages),throwIfCancelled(),await emitInputDisposition("started")}catch(error2){throw await emitInputDisposition("rejected"),consumedNextTurnMessages&&consumedNextTurnMessages.length>0&&(this._pendingNextTurnMessages=[...consumedNextTurnMessages,...this._pendingNextTurnMessages]),preflightResult?.(!1),error2}finally{ownsPromptStart&&(this._promptStartPending=!1)}messages&&(promptDisposition?.("started"),emitPendingCommandInvocation(),preflightResult?.(!0),options?.thinkingLevel!==void 0&&this.setSessionThinkingLevel(options.thinkingLevel),await this._promptAgent(messages),await this.waitForRetry(),await this.waitForIdle(),options?.onSessionWorkReady?await this.agent.waitForIdle():shouldWaitForSessionWork?await this._waitForSettledSessionWork():await this.agent.waitForIdle(),titlePrompt!==void 0&&this._startSessionTitleGeneration(titlePrompt))}async _tryExecuteExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex),args=spaceIndex===-1?"":text2.slice(spaceIndex+1),command=this._extensionRunner.getCommand(commandName);if(!command)return!1;this._emit({type:"command_invocation",command:{name:commandName,source:"extension",sourceInfo:command.sourceInfo,syntax:"slash"}});let ctx=this._extensionRunner.createCommandContext();try{return await command.handler(args,ctx),!0}catch(err2){return this._extensionRunner.emitError({extensionPath:`command:${commandName}`,event:"command",error:err2 instanceof Error?err2.message:String(err2)}),!0}}_expandSkillCommand(text2){let skills=this.resourceLoader.getSkills().skills,invocationTokens=parseSkillInvocationTokens(text2,{knownSkillNames:new Set(skills.map(skill=>skill.name))});if(invocationTokens.length===0)return text2;let expandedSkillNames=new Set,skillBlocks=[],invocationMetadata=[],removedTokens=[];for(let token of invocationTokens){let skill=skills.find(candidate=>candidate.name===token.name);if(!skill){if(token.position==="leading")break;continue}if(skillBlocks.length>=MAX_SKILL_EXPANSIONS_PER_PROMPT){this._extensionRunner.emitError({extensionPath:"skill:expansion",event:"skill_expansion",error:`Expanded at most ${MAX_SKILL_EXPANSIONS_PER_PROMPT} skills; remaining skill commands were left as literal text.`});break}if(removedTokens.push(token),expandedSkillNames.has(skill.name)){this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:`Skipped duplicate skill invocation: ${skill.name}`});continue}try{let content=readFileSync35(skill.filePath,"utf-8"),body=stripFrontmatter(content).trim();skillBlocks.push({name:skill.name,filePath:skill.filePath,baseDir:skill.baseDir,body}),expandedSkillNames.add(skill.name),invocationMetadata.push({name:skill.name,path:skill.filePath,syntax:token.syntax})}catch(err2){return this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:err2 instanceof Error?err2.message:String(err2)}),text2}}if(skillBlocks.length===0)return text2;let userRequest=removeSkillInvocationTokens(text2,removedTokens);return this._emit({type:"skill_invocation",skills:invocationMetadata}),formatSkillInvocationPrompt(skillBlocks,userRequest)}async _queueUserInput(text2,images,behavior,options){text2.startsWith("/")&&this._throwIfExtensionCommand(text2);let processedInput=await this._runInputHandlers(text2,images,options?.source??"interactive",this.isStreaming?behavior:void 0);if(!processedInput)return;let expandedText=this._expandSkillCommand(processedInput.text),templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,behavior==="steer"?await this._queueSteer(expandedText,processedInput.images,options?.enqueueOrder):await this._queueFollowUp(expandedText,processedInput.images,options?.enqueueOrder),await this._emitInputDisposition(processedInput.inputId,"queued"),templateExpansion.template&&this._emit({type:"command_invocation",command:{name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"}})}async steer(text2,images,options){await this._queueUserInput(text2,images,"steer",options)}async followUp(text2,images,options){await this._queueUserInput(text2,images,"followUp",options)}_startSessionTitleGeneration(firstPrompt){if(!this._autoTitleSessions||this.sessionManager.getSessionName()||shouldSkipSessionTitle(firstPrompt)||this._sessionTitleAbortController!==void 0)return;let model=this.model;if(!model)return;let abortController=new AbortController;this._sessionTitleAbortController=abortController,this._sessionTitlePromise=this._generateSessionTitle(firstPrompt,model,abortController)}async _generateSessionTitle(firstPrompt,model,abortController){try{let auth=await this._getSummarizationRequestAuth(model),title=await generateSessionTitle({firstPrompt,model,auth,sessionId:this.sessionId,baseOptions:this._buildSessionTitleBaseOptions(),retry:sessionTitleRetryPolicy(this.settingsManager.getRetrySettings()),signal:abortController.signal,streamFn:this.agent.streamFunction});if(abortController.signal.aborted)return;title&&!this.sessionManager.getSessionName()&&this.setSessionName(title)}catch(error2){if(abortController.signal.aborted)return;let message=error2 instanceof Error?error2.message:String(error2);this._extensionRunner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"session_title_generation",error:message})}finally{this._sessionTitleAbortController===abortController&&(this._sessionTitleAbortController=void 0),this._sessionTitlePromise!==void 0&&(this._sessionTitlePromise=void 0)}}abortSessionTitleGeneration(){this._sessionTitleAbortController?.abort(),this._sessionTitleAbortController=void 0}_buildSessionTitleBaseOptions(){return{onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,timeoutMs:this.agent.timeoutMs,maxRetryDelayMs:this.agent.maxRetryDelayMs}}async _queueSteer(text2,images,enqueueOrder){this._steeringMessages.push(text2),this._recordQueuedInput(text2,"steer",enqueueOrder),this._sessionLogger.debug("queue_enqueue",{mode:"steer",count:this._steeringMessages.length}),this._emitQueueUpdate();let content=[{type:"text",text:text2}];images&&content.push(...images);let message={role:"user",content,timestamp:Date.now()};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){this._postCompactionDeferredSteeringMessages.push(message);return}this.agent.steer(message)}async _queueFollowUp(text2,images,enqueueOrder){this._followUpMessages.push(text2),this._recordQueuedInput(text2,"followUp",enqueueOrder),this._sessionLogger.debug("queue_enqueue",{mode:"followUp",count:this._followUpMessages.length}),this._emitQueueUpdate();let content=[{type:"text",text:text2}];images&&content.push(...images);let message={role:"user",content,timestamp:Date.now()};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){this._postCompactionDeferredFollowUpMessages.push(message);return}this.agent.followUp(message)}_flushPostCompactionDeferredMessages(){for(let message of this._postCompactionDeferredSteeringMessages)this.agent.steer(message);this._postCompactionDeferredSteeringMessages=[];for(let message of this._postCompactionDeferredFollowUpMessages)this.agent.followUp(message);this._postCompactionDeferredFollowUpMessages=[]}_throwIfExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName))throw new Error(`Extension command "/${commandName}" cannot be queued. Use prompt() or execute the command when not streaming.`)}async sendCustomMessage(message,options,deferredTurnClaim){let userAbortGeneration=this._userAbortGeneration,appMessage={role:"custom",customType:message.customType,content:message.content??[],display:message.display,details:message.details,timestamp:Date.now()},waitForExistingSessionWork=options?.triggerTurn===!0&&options.deliverAs!=="nextTurn"&&!this.isStreaming&&this._sessionWorkBarrier.hasActiveWork&&this._extensionBindingPromptReadiness===void 0,pendingCompactionAdmission=this._pendingCompactionAdmission,activeCompactionGeneration=this._compactionLifecycle.state.status==="running"?this._compactionLifecycle.state.generation:void 0,finishSessionWork;try{if(waitForExistingSessionWork){if(await this._waitForSettledSessionWork(),userAbortGeneration!==this._userAbortGeneration)return;finishSessionWork=this._sessionWorkBarrier.begin()}if(options?.deliverAs==="nextTurn")this._pendingNextTurnMessages.push(appMessage);else if(this.isStreaming&&options?.triggerTurn!==!1)deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn===!0&&(pendingCompactionAdmission!==void 0&&pendingCompactionAdmission.outcome!=="completed"||activeCompactionGeneration!==void 0&&this._compactionLifecycle.state.generation===activeCompactionGeneration&&this._compactionLifecycle.state.status!=="completed"))deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn){try{await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),await this._enforceFinalProviderAdmission([appMessage])}catch(error2){throw options.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage),error2}await this._promptAgent(appMessage,deferredTurnClaim)}else this.isStreaming?this._pendingCustomMessages.push(appMessage):this._appendCustomMessage(appMessage)}finally{deferredTurnClaim?.resolve("finished-without-start"),finishSessionWork?.()}}_appendCustomMessage(appMessage){this.agent.state.messages.push(appMessage),this._emitEntryAppended(this.sessionManager.appendCustomMessageEntry(appMessage.customType,appMessage.content,appMessage.display,appMessage.details)),this._incrementMessageRevision(),this._emit({type:"message_start",message:appMessage}),this._emit({type:"message_end",message:appMessage})}_flushPendingCustomMessages(){let pending=this._pendingCustomMessages;this._pendingCustomMessages=[];for(let message of pending)this._appendCustomMessage(message)}async sendUserMessage(content,options,deferredTurnClaim){let bindingPromptReadiness=this._extensionBindingPromptReadiness,resolveBindingPromptReadiness;if(bindingPromptReadiness){let readiness=new Promise(resolve42=>{resolveBindingPromptReadiness=resolve42});bindingPromptReadiness.add(readiness)}let text2,images;try{if(typeof content=="string")text2=content;else{let textParts=[];images=[];for(let part of content)part.type==="text"?textParts.push(part.text):images.push(part);text2=textParts.join(`
|
|
2336
|
+
`),images.length===0&&(images=void 0)}}catch(error2){throw deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),error2}let waitForExistingSessionWork=this._sessionWorkBarrier.hasActiveWork,finishSessionWork,disposition;try{await this.prompt(text2,{expandPromptTemplates:options?.expandPromptTemplates??!1,streamingBehavior:options?.deliverAs,images,source:"extension",promptDisposition:nextDisposition=>{disposition=nextDisposition,nextDisposition==="started"?deferredTurnClaim?.resolve("started"):nextDisposition==="queued"&&deferredTurnClaim?.resolve("delegated"),resolveBindingPromptReadiness?.()},onSessionWorkReady:waitForExistingSessionWork?()=>{finishSessionWork??=this._sessionWorkBarrier.begin()}:void 0,sessionTitlePrompt:!1})}catch(error2){throw disposition===void 0&&(options?.deliverAs==="steer"?await this._queueSteer(text2,images):await this._queueFollowUp(text2,images)),error2}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),finishSessionWork?.()}}reserveQueuedInputOrder(){return this._nextQueuedInputOrder+=1,this._nextQueuedInputOrder}_recordQueuedInput(text2,mode,enqueueOrder){let order=enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order),this._queuedInputOrder.push({text:text2,mode,enqueueOrder:order})}_removeQueuedInput(text2,mode){let index=this._queuedInputOrder.findIndex(message=>message.mode===mode&&message.text===text2);index!==-1&&this._queuedInputOrder.splice(index,1)}clearQueue(options={abortWillFollow:!1}){let steering=[...this._steeringMessages],followUp=[...this._followUpMessages],ordered=[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder);options.abortWillFollow&&(steering.length>0||followUp.length>0)&&(this._hadClearedQueuedMessages=!0),this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this.agent.clearAllQueues(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}get pendingMessageCount(){return this._steeringMessages.length+this._followUpMessages.length}getSteeringMessages(){return this._steeringMessages}getFollowUpMessages(){return this._followUpMessages}get resourceLoader(){return this._resourceLoader}async abort(){let wasMidRun=this.isStreaming&&this._retryAbortController===void 0,hadRetryBackoff=this._retryAbortController!==void 0,hadCompactionOrPending=!this.isStreaming&&(this.isCompacting||this.pendingMessageCount>0),hadClearedQueues=this._hadClearedQueuedMessages,joinedAgentEndBoundary=this._abortProvenance.hasOpenAgentEndBoundary;this._hadClearedQueuedMessages=!1;let shouldEmitAbort=!joinedAgentEndBoundary&&!wasMidRun&&(hadRetryBackoff||hadCompactionOrPending||hadClearedQueues);if(this.abortCompaction(),await this._abortActiveAgentAndRetry("user"),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source,systemPrompt:this.agent.state.systemPrompt,systemPromptOptions:this._baseSystemPromptOptions});if(result3?.systemPrompt===void 0)return;let previousSystemPrompt=this.agent.state.systemPrompt,systemPrompt=result3.systemPrompt??this._baseSystemPrompt;if(previousSystemPrompt===systemPrompt)return;this.agent.state.systemPrompt=systemPrompt;let event={type:"system_prompt_change",systemPrompt,previousSystemPrompt,model:nextModel,previousModel,source:"model_select"};return result3.systemPromptName&&(event.systemPromptName=result3.systemPromptName),await this._extensionRunner.emit(event),this._emit(event),event}async setModel(model){return this._setModel(model,!0)}assertModelUsable(model=this.model,liveContextTokens=0,options){if(!model||model.contextWindow<=0)return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:options?.includeSpeculationLead,admission:options?.admission});if(!projection.usable)throw new ModelUsabilityBudgetError(projection)}admitResumeCompactionRequired(projection){this._resumeCompactionRequirement=createResumeCompactionRequirement(projection)}applyResumeSlice(plan){this.sessionManager.appendCompaction(plan.summary,plan.firstKeptEntryId,plan.tokensBefore,{schema:RESUME_SLICE_SCHEMA,origin:RESUME_SLICE_ORIGIN}),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._resumeSlice=plan,this._sessionLogger.info("resume_context_reduced",{count:plan.droppedEntries,tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter}),this._emit(this._resumeSliceEvent(plan))}_resumeSliceEvent(plan){return{type:"resume_context_reduced",tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter,droppedEntries:plan.droppedEntries,notice:resumeSliceNotice(plan)}}_getDownswitchLiveContextTokens(model){let currentModel=this.model;if(!currentModel)return 0;let compaction=this._getCompactionSettings(),currentBudget=projectModelUsabilityBudget({model:currentModel,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),targetBudget=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),currentUsableContext=currentBudget.contextWindow-currentBudget.requiredTokens;if(targetBudget.contextWindow-targetBudget.requiredTokens>=currentUsableContext)return 0;let fixedPrefixTokens=currentBudget.systemPromptTokens+currentBudget.activeToolSchemaTokens;return Math.max(0,(this.getContextUsage()?.tokens??0)-fixedPrefixTokens)}async setSessionModel(model){return this._setModel(model,!1)}_recordRejectedModelChange(model,error2){let budget=error2 instanceof ModelUsabilityBudgetError?error2.projection:void 0,detail=error2 instanceof Error?error2.message:String(error2),reason=budget?"context-budget":"auth",numbers=budget?{contextWindow:budget.contextWindow,liveContextTokens:budget.liveContextTokens,requiredTokens:budget.requiredTokens,shortfallTokens:budget.shortfallTokens,safetyMarginProfile:budget.safetyMarginProfile}:{};this.sessionManager.appendModelChangeRejected({provider:model.provider,modelId:model.id,reason,detail,...numbers}),this._emit({type:"model_change_rejected",model,reason,detail,...numbers})}_modelSwitchAdmission(){return this.sessionManager.hasContextMessages()?"switch":"start"}_assertModelUsableForSwitch(model,liveContextTokens){try{this.assertModelUsable(model,liveContextTokens,{admission:this._modelSwitchAdmission()})}catch(error2){throw this._recordRejectedModelChange(model,error2),error2}}async _setModel(model,updateGlobalDefaults){if(this._assertModelUsableForSwitch(model,this._getDownswitchLiveContextTokens(model)),!await this._modelRuntime.checkAuth(model.provider)){let error2=new Error(`No API key for ${model.provider}/${model.id}`);throw this._recordRejectedModelChange(model,error2),error2}let hadActiveFallback=this._retryFallback.activeState!==void 0;return this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(model),hadActiveFallback&&this._retryAbortController&&this.abortRetry(),await this._switchActiveModel(model,{persistDefault:updateGlobalDefaults,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0})}async _maybeRestoreFallbackPrimary(){try{await this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy)}catch(error2){this._retryFallback.clear(),console.error("fallback revert failed; cleared fallback state",error2)}}async _onCompactionContextChanged(){this._retryFallback.notifyCompactionApplied()&&!this.isStreaming&&await this._maybeRestoreFallbackPrimary()}async _switchActiveModel(model,opts){let previousModel=this.model;opts.invalidateCompaction&&(this._modelSelectionChangesContext(previousModel,model)||previousModel?.provider!==model.provider||previousModel?.id!==model.id)&&this._invalidateCompactionForModelSelection();let thinking=this._getThinkingForModelSwitch(model,opts.ephemeralThinkingLevel),liveContextTokens=this._getDownswitchLiveContextTokens(model);this.agent.state.model=model,model.id==="gpt-6-astra"&&(model.provider==="openai"||model.provider==="openai-codex")||(this.agent.state.reasoningBaseline=void 0);let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,model)),previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive(),previousThinkingLevel=this.agent.state.thinkingLevel,previousThinkingSelection=this.agent.state.thinkingSelection,previousReasoningBaseline=this.agent.state.reasoningBaseline,previousAbortServerSideFallback=this.agent.abortServerSideFallback;this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain(),this._currentServiceTier=this._resolveServiceTier(model,scopedMatch?.serviceTier),opts.ephemeralThinkingLevel!==void 0?this._applyEphemeralThinkingLevel(thinking.level):this._setThinkingLevel(thinking.level,!1,thinking.selection),this._emitHighReasoningWarningIfNeeded();let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=opts.emitModelSelect?await this._emitModelSelect(model,previousModel,opts.modelSelectSource):void 0;return this._assertModelUsableForSwitch(model,liveContextTokens),opts.appendSessionEntry&&this.sessionManager.appendModelChange(model.provider,model.id,opts.entryReason,previousModel?.provider,previousModel?.id),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._emit({type:"model_changed",model,thinkingLevel:this.thinkingLevel,source:opts.modelSelectSource}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode),systemPromptChange}catch(error2){throw previousModel?this.agent.state.model=previousModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,error2}}_applyEphemeralThinkingLevel(level){let previousLevel=this.agent.state.thinkingLevel;this.agent.state.thinkingLevel=level,this.agent.state.thinkingSelection=void 0,previousLevel!==level&&this._emit({type:"thinking_level_changed",level})}async cycleModel(direction="forward"){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2)}async _cycleFavoriteModel(direction,favoriteModels2){if(favoriteModels2.length<=1)return;let currentModel=this.model;if(!currentModel)return;let currentIndex=favoriteModels2.findIndex(sm=>modelsAreEqual(sm.model,currentModel)),nextIndex;if(currentIndex===-1)nextIndex=direction==="forward"?0:favoriteModels2.length-1;else{let len=favoriteModels2.length;nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len}let favoriteCount=favoriteModels2.length,step=direction==="forward"?1:-1,selectedIndex,skippedModels=[];for(let offset=0;offset<favoriteCount;offset++){let candidate=favoriteModels2[(nextIndex+step*offset+favoriteCount)%favoriteCount];if(modelsAreEqual(candidate.model,currentModel))continue;let admission=this._modelChangeWouldExhaustContext(candidate.model);if(admission){skippedModels.push(candidate.model),this._emit({type:"model_change_skipped",model:candidate.model,contextWindow:candidate.model.contextWindow,liveContextTokens:admission.liveContextTokens,requiredTokens:admission.requiredTokens,shortfallTokens:admission.shortfallTokens,safetyMarginProfile:admission.safetyMarginProfile,direction});continue}selectedIndex=(nextIndex+step*offset+favoriteCount)%favoriteCount;break}if(selectedIndex===void 0){let alternatives=favoriteModels2.filter(entry=>!modelsAreEqual(entry.model,currentModel)),onlyAlternative=alternatives.length===1?alternatives[0]:void 0;return onlyAlternative&&this._assertModelUsableForSwitch(onlyAlternative.model,this._getDownswitchLiveContextTokens(onlyAlternative.model)),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model);this._assertModelUsableForSwitch(next.model,liveContextTokens),(this._modelSelectionChangesContext(currentModel,next.model)||currentModel?.provider!==next.model.provider||currentModel?.id!==next.model.id)&&this._invalidateCompactionForModelSelection(),this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(next.model);let thinking=this._getThinkingForModelSwitch(next.model,next.thinkingLevel,next.thinkingSelection);this.agent.state.model=next.model;let previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive();this._currentServiceTier=this._resolveServiceTier(next.model,next.serviceTier),this._setThinkingLevel(thinking.level,!1,thinking.selection);let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=await this._emitModelSelect(next.model,currentModel,"cycle");this._assertModelUsableForSwitch(next.model,liveContextTokens),this.sessionManager.appendModelChange(next.model.provider,next.model.id),this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._emit({type:"model_changed",model:next.model,thinkingLevel:this.thinkingLevel,source:"cycle"}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode);let cycleResult={model:next.model,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};return systemPromptChange&&(cycleResult.systemPromptChange=systemPromptChange),cycleResult}catch(error2){throw currentModel?this.agent.state.model=currentModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,error2}}setThinkingLevel(level){this._setThinkingLevel(level,!0,{level,source:"explicit"})}setSessionThinkingLevel(level){this._setThinkingLevel(level,!1,{level,source:"explicit"})}_setThinkingLevel(level,updateGlobalDefault,selection){let availableLevels=this.getAvailableThinkingLevels(),effectiveLevel=availableLevels.includes(level)?level:this._clampThinkingLevel(level,availableLevels),previousLevel=this.agent.state.thinkingLevel,previousSelection=this.agent.state.thinkingSelection,effectiveSelection=selection?{...selection,level:effectiveLevel}:void 0,selectionChanged=previousSelection?.level!==effectiveSelection?.level||previousSelection?.source!==effectiveSelection?.source||previousSelection?.legacyVariantId!==effectiveSelection?.legacyVariantId,isChanging=effectiveLevel!==previousLevel;if((isChanging||selectionChanged)&&this._retryFallback.noteManualThinkingLevel(),this.agent.state.thinkingLevel=effectiveLevel,this.agent.state.thinkingSelection=effectiveSelection,updateGlobalDefault){let model=this.model;model&&this.settingsManager.setModelThinkingLevel(model.provider,model.id,effectiveLevel)}if(isChanging||selectionChanged){this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection);let model=this.model;isChanging&&model?.id==="gpt-6-astra"&&(model.provider==="openai"||model.provider==="openai-codex")&&(this.agent.state.reasoningBaseline??=previousLevel,this.sessionManager.appendConfigurationUpdate(effectiveLevel),this.agent.state.messages=this.sessionManager.buildSessionContext().messages),updateGlobalDefault&&(this.supportsThinking()||effectiveLevel!=="off")&&this.settingsManager.setDefaultThinkingLevel(effectiveLevel),this._emit({type:"thinking_level_changed",level:effectiveLevel}),this._extensionRunner.emit({type:"thinking_level_select",level:effectiveLevel,previousLevel}),this._emitHighReasoningWarningIfNeeded()}}_emitHighReasoningWarningIfNeeded(){let model=this.model,level=this.thinkingLevel;if(!model||!shouldWarnHighReasoning(model,level))return;let key=`${model.provider}/${model.id}`;this._shownHighReasoningWarningKeys.has(key)||(this._shownHighReasoningWarningKeys.add(key),this._emit({type:"high_reasoning_warning",modelId:model.id,provider:model.provider,thinkingLevel:level}))}cycleThinkingLevel(){if(!this.supportsThinking())return;let levels=this.getAvailableThinkingLevels(),nextIndex=(levels.indexOf(this.thinkingLevel)+1)%levels.length,nextLevel=levels[nextIndex];return this.setThinkingLevel(nextLevel),nextLevel}getAvailableThinkingLevels(){let model=this.model;return model?getSupportedThinkingLevels(model):["off"]}supportsXhighThinking(){return this.model?supportsXhigh(this.model):!1}supportsMaxThinking(){return this.model?supportsMax(this.model):!1}supportsThinking(){return!!this.model?.reasoning}_getThinkingForModelSwitch(model,explicitLevel,explicitSelection){let requestedLevel=explicitLevel,selection=explicitSelection;if(requestedLevel!==void 0&&!selection&&(selection={level:requestedLevel,source:"explicit"}),requestedLevel===void 0){let remembered=this.settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(requestedLevel=remembered,selection={level:remembered,source:"explicit"})}if(requestedLevel===void 0){let configuredDefault=this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"})}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels(model));return{level,selection:selection?{...selection,level}:void 0}}_clampThinkingLevel(level,availableLevels){let available=new Set(availableLevels),requestedIndex=THINKING_LEVELS_WITH_MAX.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let index=requestedIndex;index<THINKING_LEVELS_WITH_MAX.length;index++){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}for(let index=requestedIndex-1;index>=0;index--){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}return availableLevels[0]??"off"}syncQueueModesFromSettings(){this.agent.steeringMode=this.settingsManager.getSteeringMode(),this.agent.followUpMode=this.settingsManager.getFollowUpMode()}setSteeringMode(mode){this.agent.steeringMode=mode,this.settingsManager.setSteeringMode(mode),this._emitSessionSettingsChanged()}setFollowUpMode(mode){this.agent.followUpMode=mode,this.settingsManager.setFollowUpMode(mode),this._emitSessionSettingsChanged()}_claimCompactionController(controller,owner){(this._compactionAbortController!==void 0&&this._compactionAbortController!==controller||this._autoCompactionAbortController!==void 0&&this._autoCompactionAbortController!==controller)&&this._compactionLifecycle.abort(this._messageRevision),this._compactionAbortController&&this._compactionAbortController!==controller&&(this._compactionAbortController.abort(),this._compactionAbortController=void 0),this._autoCompactionAbortController&&this._autoCompactionAbortController!==controller&&(this._autoCompactionAbortController.abort(),this._autoCompactionAbortController=void 0),owner==="auto"?this._autoCompactionAbortController=controller:this._compactionAbortController=controller}_ownsCompactionController(controller,owner){return!controller.signal.aborted&&(owner==="auto"?this._autoCompactionAbortController===controller:this._compactionAbortController===controller)}_releaseCompactionController(signal){this._compactionAbortController?.signal===signal&&(this._compactionAbortController=void 0),this._autoCompactionAbortController?.signal===signal&&(this._autoCompactionAbortController=void 0)}_claimPendingCompactionAdmission(){let priorAdmission=this._pendingCompactionAdmission;priorAdmission&&(priorAdmission.controller.abort(),priorAdmission.outcome="aborted",priorAdmission.finishSessionWork());let controller=new AbortController,admission={controller,finishSessionWork:this._sessionWorkBarrier.begin()};return this._pendingCompactionAdmission=admission,this._claimCompactionController(controller,"compaction"),admission}_releasePendingCompactionAdmission(admission,outcome){admission.outcome=outcome,this._pendingCompactionAdmission===admission&&(this._pendingCompactionAdmission=void 0,admission.finishSessionWork())}_recordUserAbort(){this._suppressQueuedContinuationAfterUserAbort=!0,this._userAbortGeneration+=1}async _abortActiveAgentAndRetry(source){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source)&&this._recordUserAbort();let abortPromise=(async()=>{this.agent.abort(),await this.waitForIdle()})();this._userAbortPromise=abortPromise;try{await abortPromise}finally{this._userAbortPromise===abortPromise&&(this._userAbortPromise=void 0)}}async _runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,customInstructions,signal,env,reason){let cacheFriendly;if(areExperimentalFeaturesEnabled()){let systemPrompt=this.agent.state.systemPrompt,tools=this.agent.state.tools.slice(),buildSourceContext=messages=>this.agent.buildProviderContext({systemPrompt,messages:messages.slice(),tools:tools.slice()},signal),fullContext=await buildSourceContext(this.agent.state.messages),isExactPrefix=candidate=>candidate.messages.length>0&&candidate.messages.length<=fullContext.messages.length&&isDeepStrictEqual2(candidate.messages,fullContext.messages.slice(0,candidate.messages.length)),sourceContext;if(preparation.messagesToSummarize.length>0&&preparation.sourceMessages){let candidate=await buildSourceContext(preparation.sourceMessages);isExactPrefix(candidate)&&(sourceContext=candidate)}let turnPrefixSourceContext;if(preparation.isSplitTurn&&preparation.turnPrefixMessages.length>0&&preparation.turnPrefixSourceMessages){let candidate=await buildSourceContext(preparation.turnPrefixSourceMessages),providerTurnPrefix=await this.agent.convertToLlm(preparation.turnPrefixMessages.slice());isExactPrefix(candidate)&&providerTurnPrefix.length>0&&providerTurnPrefix.length<=candidate.messages.length&&isDeepStrictEqual2(candidate.messages.slice(-providerTurnPrefix.length),providerTurnPrefix)&&(turnPrefixSourceContext=candidate)}(sourceContext||turnPrefixSourceContext)&&(cacheFriendly={sourceContext,turnPrefixSourceContext,requestOptions:{sessionId:this.agent.sessionId,onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,maxRetryDelayMs:this.agent.maxRetryDelayMs}})}return compact2(preparation,requestModel,apiKey,headers,customInstructions,signal,extraBody,this.thinkingLevel,this.agent.streamFunction,env,this.agent.transformContext,this.settingsManager.getRetrySettings(),this._summarizationRetryCallbacks({source:"compaction",reason}),this.sessionManager.getSessionId(),cacheFriendly)}async compact(customInstructions){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());this._releaseBlockedPostCompactionAdmission();let pathEntries=this.sessionManager.getBranch(),settings=cursorOverflowCompactionSettings(this._getCompactionSettings(model),model.provider,"manual");if(!prepareCompaction2(pathEntries,settings)){let requestId2=randomUUID11(),lastEntry=pathEntries[pathEntries.length-1],error2=new Error(lastEntry?.type==="compaction"?"Already compacted":"Nothing to compact (session too small)"),errorMessage8=`Compaction failed: ${error2.message}`;throw this._emit({type:"compaction_start",reason:"manual",requestId:requestId2}),this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted:!1,willRetry:!1,requestId:requestId2,errorMessage:errorMessage8}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage8,aborted:!1,willRetry:!1,fromExtension:!1}),error2}let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID11(),outcome="failed",disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"manual",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"manual",requestId,customInstructions,willRetry:!1});if(!execution.accepted)throw new CompactionRejectedError(execution.rejectionCause);return outcome="completed",execution.result}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",error2 instanceof CompactionRejectedError)throw new Error(error2.message);if(!compactionExecutionOwnsTerminalTransition(error2))throw error2;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2),errorMessage8=aborted?void 0:`Compaction failed: ${message}`;throw this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted,willRetry:!1,requestId,errorMessage:errorMessage8}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage8,aborted,willRetry:!1,fromExtension:!1}),error2}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),outcome==="completed"&&this._resumeQueuedMessagesAfterCompaction()}}async applyCompaction(precomputed,options){if(options.signal!==void 0&&options.signal!==this._compactionAbortController?.signal)return{applied:!1,reason:"stale"};if(options.expectedRevision!==void 0&&options.expectedRevision!==this._messageRevision)return{applied:!1,reason:"stale"};if(options.expectedWarmAnchor!==void 0&&!isWarmSummaryAnchorValid(options.expectedWarmAnchor,this.sessionManager.getBranch()))return{applied:!1,reason:"stale"};let ownsController=this._compactionAbortController===void 0,lifecycleState=this._compactionLifecycle.state,requestId=!ownsController&&lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:randomUUID11();ownsController&&(this._claimCompactionController(new AbortController,"compaction"),this._emit({type:"compaction_start",reason:options.reason,requestId}));let controller=this._compactionAbortController;if(!controller)return{applied:!1,reason:"rejected"};this._claimCompactionController(controller,"compaction");try{return(await this._executeCompaction({controller,owner:"compaction",reason:options.reason,requestId,willRetry:!1,precomputed})).accepted?(this._resumeQueuedMessagesAfterCompaction(),{applied:!0,reason:"ok"}):{applied:!1,reason:"rejected"}}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return{applied:!1,reason:"rejected"};let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`}),{applied:!1,reason:"rejected"}}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}_beginExtensionCompactionFeedback(reason){let controller=new AbortController;this._claimCompactionController(controller,"compaction");let model=this.model,requestId=randomUUID11();return this._compactionLifecycle.begin({operationId:requestId,stage:"feedback",reason,model:model?{provider:model.provider,id:model.id}:void 0,startedRevision:this._messageRevision},controller),this._emit({type:"compaction_start",reason,requestId}),controller.signal}_updateExtensionCompactionFeedback(options){!options.signal||!this._compactionLifecycle.hasCurrentSignal(options.signal)||this._emit({type:"compaction_progress",reason:options.reason,...options.delta!==void 0?{delta:options.delta}:{},...options.text!==void 0?{text:options.text}:{}})}_endExtensionCompactionFeedback(options){if(!options.signal)return;if(!this._compactionLifecycle.hasCurrentSignal(options.signal)){this._releaseCompactionController(options.signal);return}let operation=this._compactionLifecycle.state;if(operation.status!=="running"||operation.stage!=="feedback")return;let aborted=options.aborted??options.signal.aborted;this._compactionLifecycle.finish({operationId:operation.operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,...aborted?{errorMessage:"Compaction cancelled"}:{errorMessage:options.errorMessage??"Compaction did not apply"}}),this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId:operation.operationId,errorMessage:aborted?void 0:options.errorMessage??"Compaction did not apply"}),this._releaseCompactionController(options.signal)}async _executeCompaction(request2){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());let controller=request2.controller;if(!this._ownsCompactionController(controller,request2.owner))throw new CompactionExecutionError(new CompactionCancelledError,!1,!0);let requestId=request2.requestId??randomUUID11(),operationId=this._compactionLifecycle.begin({operationId:requestId,stage:"execution",reason:request2.reason,model:{provider:model.provider,id:model.id},startedRevision:this._messageRevision},controller),finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=request2.agentMessagesAtStart??this.agent.state.messages.slice(),compactionOwnedDiagnosticMessages=new Set,signal=controller.signal;try{if(signal.aborted)throw new CompactionCancelledError;let pathEntries=this.sessionManager.getBranch(),settings=cursorOverflowCompactionSettings(this._getCompactionSettings(),this.model?.provider,request2.reason),compactionResult=request2.precomputed,fromExtension=request2.precomputed!==void 0;if(!compactionResult){let preparation=prepareCompaction2(pathEntries,settings,request2.reason==="overflow",request2.allowSummaryOnly);if(!preparation)throw pathEntries[pathEntries.length-1]?.type==="compaction"?new Error("Already compacted"):new Error("Nothing to compact (session too small)");if(this._extensionRunner.hasHandlers("session_before_compact")){let messagesBeforeExtension=new Set(this.agent.state.messages),extensionResult=await this._extensionRunner.emit({type:"session_before_compact",reason:request2.reason,willRetry:request2.willRetry,requestId,preparation,branchEntries:pathEntries,customInstructions:request2.customInstructions,signal});for(let message of this.agent.state.messages)!messagesBeforeExtension.has(message)&&isCompactionOwnedPreCompactDiagnostic(message,requestId)&&compactionOwnedDiagnosticMessages.add(message);if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;if(extensionResult?.cancel)return await this._rejectCompaction(request2,requestId,operationId,extensionResult.rejectionCause??"cancelled-by-extension",!0,extensionResult.reason);extensionResult?.compaction&&(compactionResult=extensionResult.compaction,fromExtension=!0)}if(!compactionResult){let compactionModel=this._resolveCompactionModel(model),{model:requestModel,apiKey,headers,extraBody,env}=await this._getCompactionRequestAuth(compactionModel);compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason)}}if(signal.aborted)throw new CompactionCancelledError;if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;let lifecycleState=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&¤tMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState.status!=="running"||lifecycleState.operationId!==operationId||lifecycleState.startedRevision+compactionOwnedDiagnosticMessages.size!==this._messageRevision||!onlyPendingPersistenceAppends)return await this._rejectCompaction(request2,requestId,operationId,"stale-revision",!1);if(await this._wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model))return await this._rejectCompaction(request2,requestId,operationId,"would-overflow",!1);let latestConfigurationEffort=this.sessionManager.getBranch().findLast(entry=>entry.type==="configuration_update")?.reasoning.effort,compactionEntryId=this.sessionManager.appendCompaction(compactionResult.summary,compactionResult.firstKeptEntryId,compactionResult.tokensBefore,compactionResult.details,fromExtension,compactionResult.usage),savedEntry=this.sessionManager.getEntry(compactionEntryId);if(savedEntry?.type!=="compaction")throw new Error("Compaction entry was not saved");let modelAfterCompaction=this.model;latestConfigurationEffort!==void 0&&modelAfterCompaction?.id==="gpt-6-astra"&&(modelAfterCompaction.provider==="openai"||modelAfterCompaction.provider==="openai-codex")&&this.sessionManager.appendConfigurationUpdate(latestConfigurationEffort);let sessionContext=this.sessionManager.buildSessionContext(),currentAgentMessages=this.agent.state.messages,messagesAppendedDuringCompaction=agentMessagesAtStart.every((message,index)=>currentAgentMessages[index]===message)?currentAgentMessages.slice(agentMessagesAtStart.length):[],preservedIdentities=new Set(messagesAppendedDuringCompaction);for(let message of currentAgentMessages)this._messageEndsAwaitingPersistence.has(message)&&preservedIdentities.add(message);let preservedPendingMessages=currentAgentMessages.filter(message=>preservedIdentities.delete(message));this._skipNextPostCompactionAssistantCheck=!0;for(let message of preservedPendingMessages)message.role==="assistant"&&this._assistantsPendingAtCompaction.add(message);if(this.agent.state.messages=[...sessionContext.messages,...preservedPendingMessages],compactionResult.estimatedTokensAfter=estimateMessagesTokens2(sessionContext.messages),this._incrementMessageRevision(),!this._compactionLifecycle.finish({operationId,status:"completed",endedRevision:this._messageRevision}))throw new CompactionCancelledError;return this._delegatedCompactionKey=void 0,request2.owner==="compaction"&&this._compactionAbortController===request2.controller&&(this._compactionAbortController=void 0),this._emit({type:"compaction_end",reason:request2.reason,result:compactionResult,aborted:!1,willRetry:request2.willRetry,requestId,accepted:!0}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!0,compactionEntry:savedEntry,fromExtension,willRetry:request2.willRetry}),await this._onCompactionContextChanged(),{accepted:!0,requestId,result:compactionResult,compactionEntry:savedEntry,fromExtension}}catch(error2){if(error2 instanceof CompactionExecutionError)throw error2;let lifecycleState=this._compactionLifecycle.state,ownsTerminalTransition=lifecycleState.status!=="idle"&&lifecycleState.operationId===operationId,aborted=signal.aborted||isCompactionExecutionAborted(error2);throw ownsTerminalTransition&&lifecycleState.status==="running"&&this._compactionLifecycle.finish({operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,errorMessage:error2 instanceof Error?error2.message:String(error2)}),new CompactionExecutionError(error2,ownsTerminalTransition,aborted)}finally{finishCompactionWork()}}async _wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model){let currentLeaf=pathEntries[pathEntries.length-1];if(!currentLeaf)return!1;let simulatedCompactionEntry={type:"compaction",id:`simulated-${randomUUID11()}`,parentId:currentLeaf.id,timestamp:new Date().toISOString(),summary:compactionResult.summary,firstKeptEntryId:compactionResult.firstKeptEntryId,tokensBefore:compactionResult.tokensBefore,details:compactionResult.details,fromHook:fromExtension},simulatedMessages=buildSessionContext([...pathEntries,simulatedCompactionEntry],simulatedCompactionEntry.id).messages;(model.provider==="cursor"||model.provider==="cursor-cli-oauth")&&(simulatedMessages=admitCursorHistory({messages:simulatedMessages,budgetBytes:cursorAdmissionBudgetBytes(model.contextWindow)}).messages??simulatedMessages);let contextTokens=estimateMessagesTokens2(simulatedMessages),settings=this._getCompactionSettings(),reserveTokens=settings.reserveScalingEnabled===!1?settings.reserveTokens:resolveReserveTokens(model.contextWindow,settings.reserveTokens);return contextTokens>model.contextWindow-reserveTokens}_restoreAgentMessagesFromSession(){let sessionMessages=this.sessionManager.buildSessionContext().messages,seen=new Set(sessionMessages),pendingMessages=[];for(let message of this.agent.state.messages)seen.has(message)||!this._messageEndsAwaitingPersistence.has(message)||(seen.add(message),pendingMessages.push(message));this.agent.state.messages=[...sessionMessages,...pendingMessages]}async _rejectCompaction(request2,requestId,operationId,rejectionCause,aborted,extensionReason){rejectionCause==="external-owner"&&this.model&&(this._delegatedCompactionKey={provider:this.model.provider,id:this.model.id});let trimmedExtensionReason=extensionReason?.trim(),detailedMessage=trimmedExtensionReason?`Compaction rejected: ${trimmedExtensionReason}`:describeCompactionRejection(rejectionCause),errorMessage8=aborted&&!trimmedExtensionReason?void 0:detailedMessage;if(!this._compactionLifecycle.finish({operationId,status:"failed",endedRevision:this._messageRevision,rejectionCause,...trimmedExtensionReason!==void 0?{errorMessage:trimmedExtensionReason}:{}}))throw new CompactionCancelledError;return this._emit({type:"compaction_end",reason:request2.reason,result:void 0,aborted,willRetry:!1,requestId,accepted:!1,rejectionCause,errorMessage:errorMessage8}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!1,rejectionCause,fromExtension:!1,willRetry:!1}),{accepted:!1,requestId,rejectionCause}}abortCompaction(){let lifecycleState=this._compactionLifecycle.state,activeFeedbackRequestId=lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:void 0,feedbackOperation=this._compactionLifecycle.abort(this._messageRevision);this._compactionAbortController?.abort(),this._autoCompactionAbortController?.abort(),feedbackOperation?.stage==="feedback"&&(this._compactionAbortController=void 0,this._emit({type:"compaction_end",reason:feedbackOperation.reason,result:void 0,aborted:!0,willRetry:!1,requestId:activeFeedbackRequestId}))}abortBranchSummary(){this._branchSummaryAbortController?.abort()}async _enforceCompactionBeforeProvider(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction=!1){this._releaseBlockedPostCompactionAdmissionIfReduced();let blockedAdmission=this._blockedPostCompactionAssistant;if(blockedAdmission!==void 0&&blockedAdmission.assistant===assistantMessage)throw new RequiredCompactionError;let settings=this._getCompactionSettings(),model=this.model;if(this._resumeCompactionRequirement!==void 0){if(!model)throw new RequiredCompactionError;if(!await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))throw new RequiredCompactionError;let currentContext=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(!projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:currentContext,compaction:settings,includeSpeculationLead:!1,admission:"resume"}).usable)throw new RequiredCompactionError;return this._resumeCompactionRequirement=void 0,!0}let contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens,compacted=assistantMessage?await this._checkCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction):!1;if(compacted||assistantMessage&&this._postCompactionUsageExemptAssistants.has(assistantMessage))return compacted;if(!settings.enabled||!model||!shouldCompact2(contextTokens,model.contextWindow,settings))return!1;let latestCompaction2=getLatestCompactionEntry(this.sessionManager.getBranch()),assistantBeforeLatestCompaction=assistantMessage!==void 0&&this._isAssistantFromBeforeLatestCompaction(assistantMessage),hasPostCompactionCustomState=latestCompaction2!==null&&this.agent.state.messages.some(message=>message.role==="custom"&&message.timestamp>=new Date(latestCompaction2.timestamp).getTime());if(assistantBeforeLatestCompaction&&!hasPostCompactionCustomState)return!1;if(assistantBeforeLatestCompaction&&assistantMessage&&await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))return!0;if(this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return!1;throw new RequiredCompactionError}_pendingQueuedInputMessages(){let timestamp=Date.now();return[...this._steeringMessages,...this._followUpMessages].map(text2=>({role:"user",content:[{type:"text",text:text2}],timestamp}))}async _enforceFinalProviderAdmission(messages){let lateQueuedMessages=this._pendingQueuedInputMessages();if(!messages.some(message=>message.role==="custom")&&lateQueuedMessages.length===0)return;let model=this.model;if(!model)return;let settings=this._getCompactionSettings(),reserveTokens=resolveEffectiveReserveTokens(model.contextWindow,settings),isOversized=()=>{let providerMessages=[...this.agent.state.messages,...messages,...this._pendingQueuedInputMessages()],estimate=estimateContextTokens3(providerMessages),usageMessage=estimate.lastUsageIndex===null?void 0:providerMessages[estimate.lastUsageIndex];return(usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(providerMessages):estimate.tokens)>model.contextWindow-reserveTokens};if(!settings.enabled||!isOversized())return;let lastAssistantMessage2=this._findLastAssistantMessage();if(!lastAssistantMessage2)throw new RequiredCompactionError;let compacted=await this._runPrePromptCompaction(lastAssistantMessage2,!1,"pre_prompt");if(!(!compacted&&this._isCompactionDelegated())&&!(!compacted&&this._hasSupersedingCompactionClaim())&&!(!compacted&&!isOversized()&&this._isCompactionOnCooldown())&&(!compacted||isOversized()))throw new RequiredCompactionError}async _checkCompaction(assistantMessage,skipAbortedCheck=!0,inlineReason,retryAfterCompaction=!1){let settings=this._getCompactionSettings();if(skipAbortedCheck&&assistantMessage.stopReason==="aborted")return!1;let contextWindow=this.model?.contextWindow??0,sameModel=this.model&&isSameOverflowSource(assistantMessage,this.model,this._modelRuntime.getCompatibilityRequestConfig(this.model).upstreamModelId),compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(this._isAssistantFromBeforeLatestCompaction(assistantMessage)&&(inlineReason!==void 0||!this._exceedsPolicyByContentEstimate()))return!1;let contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings),recoverableLength=sameModel&&isRecoverableLength(assistantMessage,this.model?.maxTokens??0),isOverflow=isContextOverflow(assistantMessage,contextWindow)&&(sameModel||currentContextNeedsCompaction)||recoverableLength||this._isCursorPayloadOverflow(assistantMessage);if(isOverflow&&!settings.enabled&&!isTurnStuckOnContextOverflow(assistantMessage,contextWindow)||isOverflow&&assistantMessage.stopReason==="stop"&&this._consumePostCompactionUsageExemption(assistantMessage))return!1;if(isOverflow){this._flushPostCompactionDeferredMessages();let willRetry=retryAfterCompaction||assistantMessage.stopReason!=="stop";if(!willRetry){let compacted2=await this._runAutoCompaction("overflow",!1);return!compacted2&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted2}if(this._overflowRecoveryAttempted){let errorMessage8="Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.";if(this._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage8}),inlineReason==="pre_prompt")throw new Error(errorMessage8);return!1}this._overflowRecoveryAttempted=!0;let messages=this.agent.state.messages,removedOverflowAssistant=!1;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),removedOverflowAssistant=!0,this._incrementMessageRevision());let compacted=inlineReason?await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,"overflow",willRetry):await this._runAutoCompaction("overflow",willRetry);if(!compacted&&removedOverflowAssistant&&(this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),!compacted&&inlineReason&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){if(this._compactionSkippedTooSmall){this._compactionSkippedTooSmall=!1;let provider=this.model?.provider;return(provider==="cursor"||provider==="cursor-cli-oauth")&&this._truncateAgentMessagesToLastUserTurn(),!0}throw new RequiredCompactionError}return compacted}if(!settings.enabled||this._consumePostCompactionUsageExemption(assistantMessage))return!1;let contextTokens,staleUsageContentTokens;if(inlineReason){let messages=this.sessionManager.buildSessionContext().messages;contextTokens=estimateContextTokens3(messages).tokens}else{let directContextTokens=assistantMessage.usage?calculateContextTokens2(assistantMessage.usage):0;if(assistantMessage.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this.agent.state.messages,estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex!==null){let usageMsg=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMsg.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMsg)&&(staleUsageContentTokens=estimateMessagesTokens2(messages),!shouldCompact2(staleUsageContentTokens,contextWindow,settings)))return!1}contextTokens=staleUsageContentTokens??estimate.tokens}}if(shouldCompact2(contextTokens,contextWindow,settings)){if(inlineReason)return await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction);{let compacted=await this._runAutoCompaction("threshold",retryAfterCompaction);return!compacted&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted}}return!1}_isCompactionOnCooldown(){let state=this._compactionLifecycle.state;return state.status==="failed"&&state.rejectionCause==="circuit-breaker"}_hasSupersedingCompactionClaim(){let claimant=this._compactionAbortController??this._autoCompactionAbortController;return claimant!==void 0&&!claimant.signal.aborted}_isCompactionDelegated(){let model=this.model;return this._delegatedCompactionKey!==void 0&&model!==void 0&&this._delegatedCompactionKey.provider===model.provider&&this._delegatedCompactionKey.id===model.id}async _runPrePromptCompaction(lastAssistantMessage2,skipAbortedCheck,reason="pre_prompt",willRetry=!1,allowSummaryOnly=!1){if(this._isCompactionDelegated())return!1;let controller=new AbortController,requestId=randomUUID11();this._claimCompactionController(controller,"compaction"),this._emit({type:"compaction_start",reason,requestId});try{let execution=await this._executeCompaction({controller,owner:"compaction",reason,requestId,willRetry,lastAssistantMessage:lastAssistantMessage2,skipAbortedCheck,allowSummaryOnly});return!execution.accepted&&lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryAttempted=!1),execution.accepted}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryAttempted=!1);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage8);let aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Pre-prompt compaction failed: ${errorMessage8}`}),!1}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}async _revalidateScheduledContinuationAdmission(){let model=this.model,settings=this._getCompactionSettings();if(!model||!settings.enabled)return;let canonicalMessages=this.sessionManager.buildSessionContext().messages,estimate=estimateContextTokens3(canonicalMessages),usageMessage=estimate.lastUsageIndex===null?void 0:canonicalMessages[estimate.lastUsageIndex],contextTokens=usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(canonicalMessages):estimate.tokens,atHardLimit=shouldCompact2(contextTokens,model.contextWindow,settings),overProactiveThreshold=shouldTriggerCompaction({tokens:contextTokens,contextWindow:model.contextWindow,percent:model.contextWindow>0?contextTokens/model.contextWindow*100:0},model.contextWindow,settings);if(!atHardLimit&&!overProactiveThreshold)return;if(!await this._runPrePromptCompaction(this._findLastAssistantMessage(),!0,"pre_prompt")){if(!atHardLimit||this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return;throw new RequiredCompactionError}this._scheduledContinuationRecompacted=!0}async _continueAgentAfterCurrentRun(options={},retryTimeoutMs){await this.agent.waitForIdle();try{return this.agent.state.isStreaming||(await this._maybeRestoreFallbackPrimary(),await this._revalidateScheduledContinuationAdmission(),this.agent.state.isStreaming)?"taken-over":(await runBoundedRetryContinuation({continueRun:async()=>{if(this._scheduledContinuationRecompacted){let tail=this.agent.state.messages.at(-1);tail?.role==="assistant"&&(tail.stopReason==="error"||tail.stopReason==="aborted")&&(this._retireFailedRetryAssistant(tail),this.agent.state.messages.at(-1)===tail&&(this.agent.state.messages=this.agent.state.messages.slice(0,-1),this._incrementMessageRevision())),await this.agent.continueWithQueuedMessages(options)}else await this.agent.continue(options)},getActiveSignal:()=>this.agent.signal,abortActive:()=>this.agent.abort(new ProviderRetryWatchdogAbortError(providerRetryWatchdogAbortMessage(retryTimeoutMs,this.agent.streamStartTimeoutMs))),timeoutMs:retryTimeoutMs}),"continued")}catch(error2){if(this.agent.state.isStreaming&&error2 instanceof Error&&error2.message.startsWith("Agent is already processing"))return"taken-over";throw error2}finally{this._scheduledContinuationRecompacted=!1}}_resumeQueuedMessagesAfterCompaction(){(this.pendingMessageCount>0||this.agent.hasQueuedMessages())&&this._scheduleContinuationAfterCurrentEvent()}_scheduleContinuationAfterCurrentEvent(options={},retryContinuation=!1,retryTimeoutMs){let currentEventQueue=this._agentEventQueue,finishContinuationWork=this._sessionWorkBarrier.begin(),continueAfterEvent=async()=>{try{let outcome=await this._continueAgentAfterCurrentRun(options,retryTimeoutMs);retryContinuation&&outcome==="taken-over"&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this)}catch(error2){retryContinuation&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this);let message=error2 instanceof Error?error2.message:String(error2);this._emit({type:"continuation_error",errorMessage:`Failed to continue queued messages: ${message}`}),this.agent.state.isStreaming||await this._emitAgentSettled(),retryContinuation&&this._resolveRetry()}};currentEventQueue.then(continueAfterEvent,continueAfterEvent).finally(finishContinuationWork).catch(()=>{})}async _runAutoCompaction(reason,willRetry){if(this._isCompactionDelegated())return!1;let model=this.model,finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=this.agent.state.messages.slice(),autoCompactionController=new AbortController,requestId=randomUUID11();this._claimCompactionController(autoCompactionController,"auto");let endBeforeExecution=()=>(this._emit({type:"compaction_start",reason,requestId}),reason==="overflow"&&this._autoCompactionAbortController===autoCompactionController&&(this._overflowRecoveryAttempted=!1),this._autoCompactionAbortController!==autoCompactionController||this._emit({type:"compaction_end",reason,result:void 0,aborted:autoCompactionController.signal.aborted,willRetry:!1,requestId}),!1);try{if(!this.model)return endBeforeExecution();try{await this._modelRuntime.getAuth(this.model)}catch{return this._ownsCompactionController(autoCompactionController,"auto")?endBeforeExecution():!1}if(!this._ownsCompactionController(autoCompactionController,"auto"))return!1;if(!prepareCompaction2(this.sessionManager.getBranch(),cursorOverflowCompactionSettings(this._getCompactionSettings(model),model?.provider,reason),reason==="overflow"))return endBeforeExecution();if(!this._ownsCompactionController(autoCompactionController,"auto"))return!1;if(this._emit({type:"compaction_start",reason,requestId}),!(await this._executeCompaction({controller:autoCompactionController,owner:"auto",reason,requestId,willRetry,agentMessagesAtStart})).accepted)return reason==="overflow"&&(this._overflowRecoveryAttempted=!1),!1;if(this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),willRetry){let messages=this.agent.state.messages,lastMsg=messages[messages.length-1];return lastMsg?.role==="assistant"&&(lastMsg.stopReason==="error"||lastMsg.stopReason==="length")&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision()),this._scheduleContinuationAfterCurrentEvent(),!0}else{if(this.pendingMessageCount>0)return this._scheduleContinuationAfterCurrentEvent(),!0;if(this.agent.hasQueuedMessages())return this._scheduleContinuationAfterCurrentEvent(),!0}return!1}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;reason==="overflow"&&(this._overflowRecoveryAttempted=!1);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage8}`:`Auto-compaction failed: ${errorMessage8}`;return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:formattedErrorMessage}),await this._emitSessionCompactFailed({reason,errorMessage:formattedErrorMessage,aborted,willRetry:!1,fromExtension:!1}),!1}finally{this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),finishCompactionWork()}}setAutoCompactionEnabled(enabled){this._autoCompactionSessionOverride=enabled,this._emitSessionSettingsChanged()}_getCompactionSettings(forModel=this.model){let settings=this.settingsManager.getCompactionSettings(forModel);return this._autoCompactionSessionOverride===void 0?settings:{...settings,enabled:this._autoCompactionSessionOverride}}_emitSessionSettingsChanged(){this._emit({type:"session_settings_changed",steeringMode:this.steeringMode,followUpMode:this.followUpMode,autoCompactionEnabled:this.autoCompactionEnabled})}get autoCompactionEnabled(){return this._autoCompactionSessionOverride??this.settingsManager.getCompactionEnabled()}async bindExtensions(bindings2){let finishBindingWork=this._sessionWorkBarrier.begin(),bindingPromptReadiness=new Set;this._extensionBindingPromptReadiness=bindingPromptReadiness;try{bindings2.uiContext!==void 0&&(this._extensionUIContext=bindings2.uiContext),bindings2.mode!==void 0&&(this._extensionMode=bindings2.mode),bindings2.commandContextActions!==void 0&&(this._extensionCommandContextActions=bindings2.commandContextActions),bindings2.abortHandler!==void 0&&(this._extensionAbortHandler=bindings2.abortHandler),bindings2.shutdownHandler!==void 0&&(this._extensionShutdownHandler=bindings2.shutdownHandler),bindings2.onError!==void 0&&(this._extensionErrorListener=bindings2.onError),this._applyExtensionBindings(this._extensionRunner),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit(this._sessionStartEvent),this._enforceConfiguredDefaultTools(),await this.extendResourcesFromExtensions(this._sessionStartEvent.reason==="reload"?"reload":"startup")}finally{this._extensionBindingPromptReadiness===bindingPromptReadiness&&(this._extensionBindingPromptReadiness=void 0),finishBindingWork()}await Promise.all(bindingPromptReadiness)}async extendResourcesFromExtensions(reason){if(!this._extensionRunner.hasHandlers("resources_discover"))return;let{skillPaths,promptPaths,themePaths,hookPaths}=await this._extensionRunner.emitResourcesDiscover(this._cwd,reason);if(skillPaths.length===0&&promptPaths.length===0&&themePaths.length===0&&hookPaths.length===0)return;let extensions=this._resourceLoader.getExtensions().extensions,extensionPaths={skillPaths:resolveDiscoveredResourcePaths(skillPaths,extensions),promptPaths:resolveDiscoveredResourcePaths(promptPaths,extensions),themePaths:resolveDiscoveredResourcePaths(themePaths,extensions),hookPaths:resolveDiscoveredResourcePaths(hookPaths,extensions)};this._resourceLoader.extendResources(extensionPaths),(skillPaths.length>0||promptPaths.length>0||themePaths.length>0)&&(this._baseSystemPrompt=this._rebuildSystemPrompt(this.getActiveToolNames()),this.agent.state.systemPrompt=this._baseSystemPrompt)}_applyExtensionBindings(runner){runner.setUIContext(this._extensionUIContext,this._extensionMode),runner.setToolHookLifecycleObserver(event=>{this._emit(event)}),runner.bindCommandContext(this._extensionCommandContextActions),this._extensionErrorUnsubscriber?.(),this._extensionErrorUnsubscriber=this._extensionErrorListener?runner.onError(this._extensionErrorListener):void 0}_refreshCurrentModelFromRegistry(){this._delegatedCompactionKey=void 0;let currentModel=this.model;if(!currentModel)return;let refreshedModel=this._modelRuntime.getModel(currentModel.provider,currentModel.id);!refreshedModel||refreshedModel===currentModel||(this.agent.state.model=refreshedModel)}_bindExtensionCore(runner){this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data));let getCommands=()=>{let extensionCommands=runner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,source:"extension",sourceInfo:command.sourceInfo})),templates=this.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=this._resourceLoader.getSkills().skills.map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...extensionCommands,...templates,...skills]};runner.bindCore({sendMessage:(message,options)=>{let reportError=err2=>{runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_message",error:err2 instanceof Error?err2.message:String(err2)})};if(options?.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendCustomMessage(message,options,claim).catch(reportError)}))return;let send=()=>this.sendCustomMessage(message,options).catch(reportError);this._agentSettledDelivery.defer(send)||send()},sendUserMessage:(content,options)=>{let reportError=err2=>{runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_user_message",error:err2 instanceof Error?err2.message:String(err2)})};this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendUserMessage(content,options,claim).catch(reportError)})||this.sendUserMessage(content,options).catch(reportError)},appendEntry:(customType,data)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data),entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})},setSessionName:name=>{this.setSessionName(name)},getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label2)=>{this.sessionManager.appendLabelChange(entryId,label2)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivators.push(activator)},getCommands,setModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled)},{getModel:()=>this.model,getServiceTier:()=>this.serviceTier,getEffectiveServiceTier:()=>this.effectiveServiceTier,getScopedModels:()=>this._scopedModels,isIdle:()=>this.isIdle,getAgentDir:()=>this._agentDir,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),getSignal:()=>this._extensionEventSignal??this.agent.signal,abort:(source="user")=>{if(source==="system")return void this._abortActiveAgentAndRetry("system");if(this._extensionAbortHandler)return this._extensionAbortHandler();this.abort()},hasPendingMessages:()=>this.pendingMessageCount>0,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getPromptCacheSafeWaitSeconds:()=>this.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getPromptCacheKeepAliveSettings:()=>this.settingsManager.getPromptCacheKeepAliveSettings(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getAskUserSettings:()=>this.settingsManager.getAskUserSettings(),getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:{getRetryFallbackSettings:()=>this.settingsManager.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{this.settingsManager.setFallbackChain(key,[...entries]),await this.settingsManager.flush()},removeFallbackChain:async key=>{this.settingsManager.removeFallbackChain(key),await this.settingsManager.flush()},setModelFallbackEnabled:async enabled=>{this.settingsManager.setModelFallbackEnabled(enabled),await this.settingsManager.flush()},setFallbackRevertPolicy:async policy=>{this.settingsManager.setFallbackRevertPolicy(policy),await this.settingsManager.flush()},reload:()=>this.settingsManager.reload(),getFallbackStatus:()=>{let active=this._retryFallback.activeState;if(active)return{active:!0,currentModel:this.model?`${this.model.provider}/${this.model.id}`:void 0,originalSelector:active.originalSelector,pinned:active.pinned}}},compact:options=>{let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID11();(async()=>{let outcome="failed",compactionCompleted=!1,disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"extension",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"extension",requestId,customInstructions:options?.customInstructions,willRetry:!1});execution.accepted?(outcome="completed",compactionCompleted=!0,options?.onComplete?.(execution.result)):(outcome="failed",options?.onError?.(new CompactionRejectedError(execution.rejectionCause)))}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",!compactionExecutionOwnsTerminalTransition(error2))return;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);this._emit({type:"compaction_end",reason:"extension",result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`});let err2=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err2)}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),compactionCompleted&&this._resumeQueuedMessagesAfterCompaction()}})()},beginCompaction:options=>this._beginExtensionCompactionFeedback(options.reason),updateCompaction:options=>this._updateExtensionCompactionFeedback(options),endCompaction:options=>this._endExtensionCompactionFeedback(options),getMessageRevision:()=>this.getMessageRevision(),applyCompaction:(precomputed,options)=>this.applyCompaction(precomputed,options),getSystemPrompt:()=>this.systemPrompt,getLoadedHookSources:()=>this._resourceLoader.getLoadedHookSources?.()??{agentDir:this._cwd,cwd:this._cwd,globalHookSourcePaths:[],globalHooksPath:`${this._cwd}/hooks.json`,preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:`${this._cwd}/.senpi/hooks.json`,runtimeHookSourcePaths:[]},getSystemPromptOptions:()=>this._baseSystemPromptOptions},{registerProvider:(name,config)=>{this._modelRuntime.registerProvider(name,config),this._refreshCurrentModelFromRegistry()},registerNativeProvider:provider=>{this._modelRuntime.registerNativeProvider(provider),this._refreshCurrentModelFromRegistry()},unregisterProvider:name=>{this._modelRuntime.unregisterProvider(name),this._refreshCurrentModelFromRegistry()}}),this._bindToolSearchRemovedHints()}get fallbackValidationWarnings(){return this._fallbackValidationWarnings}_isBuiltinExtensionPath(path13){return path13.startsWith("<builtin:")||/[\\/]senpi-codemode[\\/]/u.test(path13)}_enforceConfiguredDefaultTools(){let defaultToolNames=this._defaultToolNames;defaultToolNames!==void 0&&this.setActiveToolsByName(this.getActiveToolNames().filter(name=>{if(defaultToolNames.has(name))return!0;let entry=this._toolDefinitions.get(name);return entry!==void 0&&!this._isBuiltinExtensionPath(entry.sourceInfo.path)&&entry.sourceInfo.source!=="builtin"}))}_refreshToolRegistry(options){let previousRegistryNames=new Set(this._toolRegistry.keys()),previousActiveToolNames=this.getActiveToolNames(),allowedToolNames=this._allowedToolNames,excludedToolNames=this._excludedToolNames,isAllowedTool=name=>(!allowedToolNames||allowedToolNames.has(name))&&!excludedToolNames?.has(name),registeredTools=this._extensionRunner.getAllRegisteredTools(),defaultToolNames=this._defaultToolNames,isConfiguredBuiltinTool=tool=>tool.sourceInfo.source!=="builtin"&&!this._isBuiltinExtensionPath(tool.sourceInfo.path)||defaultToolNames===void 0||defaultToolNames.has(tool.definition.name),allCustomTools=[...registeredTools.filter(isConfiguredBuiltinTool),...this._customTools.map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<sdk:${definition.name}>`,{source:"sdk"})}))].filter(tool=>isAllowedTool(tool.definition.name)),definitionRegistry=new Map(Array.from(this._baseToolDefinitions.entries()).filter(([name])=>isAllowedTool(name)).map(([name,definition])=>[name,{definition,sourceInfo:createSyntheticSourceInfo(`<builtin:${name}>`,{source:"builtin"})}]));for(let tool of allCustomTools)definitionRegistry.set(tool.definition.name,{definition:tool.definition,sourceInfo:tool.sourceInfo});this._toolDefinitions=definitionRegistry,this._toolPromptSnippets=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let snippet=this._normalizePromptSnippet(definition.promptSnippet);return snippet?[definition.name,snippet]:void 0}).filter(entry=>entry!==void 0)),this._toolPromptGuidelines=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let guidelines=this._normalizePromptGuidelines(definition.promptGuidelines);return guidelines.length>0?[definition.name,guidelines]:void 0}).filter(entry=>entry!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext),wrappedBuiltInTools=wrapRegisteredTools(Array.from(this._baseToolDefinitions.values()).filter(definition=>isAllowedTool(definition.name)).map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<builtin:${definition.name}>`,{source:"builtin"})})),runner,createToolContext),toolRegistry=new Map(wrappedBuiltInTools.map(tool=>[tool.name,tool]));for(let tool of wrappedExtensionTools)toolRegistry.set(tool.name,tool);this._toolRegistry=toolRegistry,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._publishEvalOnlyToolHints();let isDirectlyExposed=name=>{let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return exposure==="direct"||exposure==="eval"},nextActiveToolNames=(options?.activeToolNames?[...options.activeToolNames]:[...this._requestedActiveToolNames??previousActiveToolNames]).filter(name=>{if(!isAllowedTool(name))return!1;let previousRegistrationIds=options?.previousActiveToolRegistrationIds;if(!previousRegistrationIds)return!0;let current=this._toolDefinitions.get(name);return current!==void 0&&previousRegistrationIds.get(name)===deriveExtensionRegistrationId(current.sourceInfo,name)});if(allowedToolNames)for(let toolName of this._toolRegistry.keys())allowedToolNames.has(toolName)&&nextActiveToolNames.push(toolName);else if(options?.includeAllExtensionTools)for(let tool of wrappedExtensionTools)isDirectlyExposed(tool.name)&&nextActiveToolNames.push(tool.name);else if(!options?.activeToolNames)for(let toolName of this._toolRegistry.keys())!previousRegistryNames.has(toolName)&&isDirectlyExposed(toolName)&&nextActiveToolNames.push(toolName);this.setActiveToolsByName([...new Set(nextActiveToolNames)])}_buildRuntime(options){this._delegatedCompactionKey=void 0;let autoResizeImages=this.settingsManager.getImageAutoResize(),shellCommandPrefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),extensionsResult=this._resourceLoader.getExtensions(),filesystemPolicy=composeFilesystemPolicies(extensionsResult.extensions.flatMap(extension=>extension.filesystemPolicies??[])),baseToolDefinitions=this._baseToolsOverride?Object.fromEntries(Object.entries(this._baseToolsOverride).map(([name,tool])=>[name,createToolDefinitionFromAgentTool(tool)])):createAllToolDefinitions(this._cwd,{read:{autoResizeImages,filesystemPolicy},bash:{commandPrefix:shellCommandPrefix,shellPath},write:{filesystemPolicy},edit:{filesystemPolicy},grep:{filesystemPolicy},find:{filesystemPolicy},ls:{filesystemPolicy}});if(this._baseToolDefinitions=new Map(Object.entries(baseToolDefinitions).map(([name,tool])=>[name,tool])),options.flagValues)for(let[name,value2]of options.flagValues)extensionsResult.runtime.flagValues.set(name,value2);this._extensionRunner=new ExtensionRunner(extensionsResult.extensions,extensionsResult.runtime,this._cwd,this.sessionManager,this._modelRegistry,extensionsResult.eventBus),this._extensionRunnerRef&&(this._extensionRunnerRef.current=this._extensionRunner),this._bindExtensionCore(this._extensionRunner),this._applyExtensionBindings(this._extensionRunner);let defaultActiveToolNames=this._baseToolsOverride?Object.keys(this._baseToolsOverride):["read","bash","edit","write","grep"],baseActiveToolNames=options.activeToolNames??defaultActiveToolNames;this._refreshToolRegistry({activeToolNames:baseActiveToolNames,includeAllExtensionTools:options.includeAllExtensionTools,previousActiveToolRegistrationIds:options.previousActiveToolRegistrationIds})}async reload(options){let veto=await this.checkReloadVeto();if(veto.cancelled)return veto;resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousFlagValues=oldExtensionRunner.getFlagValues(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry=this._toolDefinitions.get(name);entry&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry.sourceInfo,name))}await emitSessionShutdownEvent(oldExtensionRunner,{type:"session_shutdown",reason:"reload"}),time("shutdown","reload"),await this.settingsManager.reload(),this._delegatedCompactionKey=void 0;let requestedActiveToolNamesBeforeRebuild=[...this._requestedActiveToolNames??this.getActiveToolNames()];this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this.syncQueueModesFromSettings(),resetApiProviders(),time("settings","reload"),await this._modelRuntime.reloadConfig();let refreshedModels=this._modelRuntime.hasFreshAvailabilitySnapshot()?{getAvailable:async()=>this._modelRuntime.getAvailableSnapshot()}:this._modelRuntime;this.setScopedModels(await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:this.settingsManager.getEnabledModels()}),refreshedModels)),this.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels()??[],refreshedModels)),time("models","reload"),await this._resourceLoader.reload({settingsAlreadyReloadedFor:this.settingsManager}),time("resources","reload");try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:previousFlagValues,includeAllExtensionTools:!0,previousActiveToolRegistrationIds})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}return(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener)&&(await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")),time("lifecycle","reload"),{cancelled:!1}}async checkReloadVeto(){if(!this._extensionRunner.hasHandlers("session_before_reload"))return{cancelled:!1};let result3=await this._extensionRunner.emit({type:"session_before_reload"});return result3?.cancel!==!0?{cancelled:!1}:result3.reason===void 0?{cancelled:!0}:{cancelled:!0,reason:result3.reason}}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||isContextOverflow(message,this.model?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isCursorPayloadOverflow(message){return isCursorPayloadResourceExhausted(message,0)}_truncateAgentMessagesToLastUserTurn(){let messages=this.agent?.state?.messages;if(!Array.isArray(messages)||messages.length===0)return!1;let lastUser=-1;for(let i=messages.length-1;i>=0;i--)if(messages[i]?.role==="user"){lastUser=i;break}return lastUser<=0?!1:(this.agent.state.messages=messages.slice(lastUser),!0)}_isClaudeSdkSessionLockError(message){return(message.errorMessage??"").includes("Lock file is already being held")}_isClaudeSdkInvalidRequestError(message){return message.errorMessage==="invalid_request"}_isClaudeSdkSameModelRemintError(message){return this.model?.provider!==CLAUDE_SDK_OAUTH_PROVIDER_ID?!1:this._isClaudeSdkSessionLockError(message)||this._isClaudeSdkInvalidRequestError(message)}_isClaudeSdkAuthMissError(message){return this.model?.provider===CLAUDE_SDK_OAUTH_PROVIDER_ID&&message.errorMessage===providerNotConfiguredMessage(CLAUDE_SDK_OAUTH_PROVIDER_ID)}_isHardErrorFallbackEligible(message){return!message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)&&!this._isClaudeSdkAuthMissError(message)&&!this._isClaudeSdkSameModelRemintError(message)&&message.stopReason==="error"&&!isContextOverflow(message,this.model?.contextWindow??0)&&!this._isCursorPayloadOverflow(message)&&!isCursorZeroTokenResourceExhausted(message)&&!isClassifierRefusal(message)&&!message.content.some(content=>content.type==="toolCall")&&this._retryFallback.canTryFallback()}_takeNativeToolSearchInjectionFailure(){try{return getToolSearchService().takeNativeInjectionFailure()}catch{return null}}_getProviderRetryDelayMs(errorMessage8){let markerMs=parseRetryAfterMsMarker(errorMessage8);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage8})}_summarizationRetryCallbacks(source){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage8)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage8})},onRetryAttemptStart:()=>{this._emit({type:"summarization_retry_attempt_start",...source})},onRetryFinished:()=>{this._emit({type:"summarization_retry_finished"})}}}_terminalFailureText(message,attempts){let model=this.model?`${this.model.provider}/${this.model.id}`:void 0;return describeProviderStallForUser(message.errorMessage,{attempts,model,recovery:this._retryFallback.hasConfiguredChain()?"chain-exhausted":"no-fallback-configured"})??message.errorMessage}_degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8){let settings=this.settingsManager.getRetrySettings(),turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,hintSettings=this.settingsManager.getHintPolicySettings(),finishTurn2=(attempt2,finalError)=>{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry()},degraded=degradeWithoutFallback(tier,hintMs,this._retryAttempt+1,settings.baseDelayMs,hintSettings.hintedWaitCapMs);if(degraded.kind==="fail"){let waitSeconds=Math.ceil(degraded.hintMs/1e3);finishTurn2(this._retryAttempt,`Provider requested a ${waitSeconds}s wait before retrying and no usable fallback model is available. ${message.errorMessage??""}`);return}if(this._retryAttempt++,this._retryAttempt>turnMaxRetries){finishTurn2(this._retryAttempt-1,message.errorMessage);return}return degraded.delayMs}async _handleRetryableError(message,options={}){let settings=this.settingsManager.getRetrySettings();if(!settings.enabled)return this._resolveRetry(),"not-handled";let retryProfile=this._resolveRetryProfile();this._retryPromise||(this._retryPromise=new Promise(resolve42=>{this._retryResolve=resolve42}));let errorMessage8=message.errorMessage||"Unknown error",isRefusal=isClassifierRefusal(message),hardErrorFallback=options.hardErrorFallback===!0,sameModelRemint=options.sameModelRemint===!0,switchedFallback=!1,sameModelNativeRecovery=!1,is429TierRouted=!1,hintTierDelayMs,tryFallback=async(reason,failure2)=>{try{return await this._retryFallback.tryFallback(reason,failure2)}catch(error2){if(error2 instanceof ModelUsabilityBudgetError)return this._resolveRetry(),!1;throw error2}};if(sameModelRemint){if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)return this._retryAttempt>1&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else if(hardErrorFallback)if(this._takeNativeToolSearchInjectionFailure()!==null)sameModelNativeRecovery=!0,this._retryAttempt=1;else{let reason=isBillingErrorMessage(errorMessage8)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage8}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._resolveRetry(),"not-handled"}this._retryAttempt=1}else if(isRefusal){if(this._retryAttempt+1>retryProfile.turn.maxRetries)return this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";if(switchedFallback=await tryFallback("refusal",{}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}this._retryAttempt++}else{let is429Class=!isProviderStreamStallError(message)&&/rate.?limit|(?:^429(?=\s+\{)|(?:\bHTTP\/1\.[01]\s+|\bHTTP\s+|\bstatus(?:\s+code)?\s+|\berror\s+|\bcode\s+)429\b)|too many requests|resource.?exhausted/i.test(errorMessage8);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else if(is429Class){let hintMs=this._getProviderRetryDelayMs(errorMessage8),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}else if(tier==="tier1-in-turn")if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else{let inTurnResult=nextInTurnDelayMs({probePhase:this._probePhase,hintDeadlineMs:this._hintDeadlineMs,attempt:this._retryAttempt,cumulativeHintedWaitMs:this._cumulativeHintedWaitMs},hintMs,settings.baseDelayMs,hintSettings.hintedWaitCapMs,Date.now());if(this._probePhase=inTurnResult.probePhase,this._hintDeadlineMs=inTurnResult.hintDeadlineMs,this._cumulativeHintedWaitMs=inTurnResult.cumulativeHintedWaitMs,inTurnResult.demoteToProbeBack){let remainingHintMs=Math.max(0,(this._hintDeadlineMs??Date.now())-Date.now());if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else hintTierDelayMs=inTurnResult.delayMs}else{let remainingHintMs=hintMs??0;if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback){if(this._retryAttempt=1,tier==="tier2-fallback-probe-back"){let selector=this._retryFallback.activeState?.originalSelector??"";this._armProbeBackForDemotedSelector(selector,remainingHintMs)}}else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}}}if(is429TierRouted||this._retryAttempt++,!is429TierRouted&&this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:this._terminalFailureText(message,this._retryAttempt-1)}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}let providerDelayMs=isRefusal||hardErrorFallback?void 0:this._getProviderRetryDelayMs(errorMessage8),maxRetryDelayMs=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs,effectiveMaxRetryDelayMs=(retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:maxRetryDelayMs)??Number.MAX_SAFE_INTEGER;if(!is429TierRouted&&providerDelayMs!==void 0&&providerDelayMs>effectiveMaxRetryDelayMs&&(switchedFallback||(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:providerDelayMs}),switchedFallback&&(this._retryAttempt=1)),!switchedFallback))return this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:`Provider requested retry delay ${providerDelayMs}ms, exceeding configured maximum ${maxRetryDelayMs}ms`}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";let nonTierProviderDelayMs=providerDelayMs===0?void 0:providerDelayMs,localExponentialMs=retryBackoffDelayMs(retryProfile.turn.backoff,this._retryAttempt,this._retryRandom()),plannedDelayMs=switchedFallback||sameModelNativeRecovery?0:is429TierRouted?hintTierDelayMs??providerDelayMs??localExponentialMs:nonTierProviderDelayMs??localExponentialMs,profileTurnCeilingMs=retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:void 0,agentCeilingMs=(this.settingsManager.isRetryMaxAgentDelayMsConfigured?.()??!1)||profileTurnCeilingMs===void 0?settings.maxAgentDelayMs:profileTurnCeilingMs,delayMs=Math.min(plannedDelayMs,agentCeilingMs??Number.MAX_SAFE_INTEGER);this._retryAbortController=new AbortController,this._emit({type:"auto_retry_start",attempt:this._retryAttempt,maxAttempts:retryProfile.turn.maxRetries,delayMs,errorMessage:errorMessage8});let messages=this.agent.state.messages;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision());try{await sleep(delayMs,this._retryAbortController.signal)}catch{let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._retryAbortController=void 0,await this._emitAgentSettled(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:"Retry cancelled"}),this._resolveRetry(),"cancelled"}this._retryAbortController=void 0,await this._maybeRestoreFallbackPrimary();let model=this.model,compactionSettings=this._getCompactionSettings(),contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(compactionSettings.enabled&&model&&shouldCompact2(contextTokens,model.contextWindow,compactionSettings)){if(!await this._runPrePromptCompaction(message,!0,"threshold",!0,!0)&&!this._isCompactionOnCooldown()&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:new RequiredCompactionError().message}),this._resolveRetry(),"blocked"}this._skipNextPostRetryCompactionCheck=!0}let continuation=createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs:this.settingsManager.getProviderStreamRetryTimeoutMs(),timeoutMs:this.agent.timeoutMs,streamStartTimeoutMs:this.agent.streamStartTimeoutMs});return continuation.options.deferQueuedMessages===!0?DEFERRED_RETRY_QUEUE_OWNERS.add(this):DEFERRED_RETRY_QUEUE_OWNERS.delete(this),this.agent.suppressQueuedMessageDrain(),this._scheduleContinuationAfterCurrentEvent(continuation.options,!0,continuation.watchdogTimeoutMs),"continued"}abortRetry(){this._retryAbortController?.abort(),this._resolveRetry()}async waitForRetry(){this._retryPromise&&(await this._retryPromise,await this.agent.waitForIdle())}get isRetrying(){return this._retryPromise!==void 0}get autoRetryEnabled(){return this.settingsManager.getRetryEnabled()}setAutoRetryEnabled(enabled){this.settingsManager.setRetryEnabled(enabled)}async executeBash(command,onChunk,options){let abortController=new AbortController;this._bashAbortControllers.add(abortController);let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
|
|
2337
2337
|
${command}`:command;try{let result3=await executeBashWithOperations(resolvedCommand,this.sessionManager.getCwd(),options?.operations??createLocalBashOperations({shellPath}),{onChunk:delta=>{let callbackResult=onChunk?.(delta);return this._emit({type:"bash_execution_update",id:options?.id,delta}),callbackResult},signal:abortController.signal});return this.recordBashResult(command,result3,options),result3}finally{this._bashAbortControllers.delete(abortController)}}recordBashResult(command,result3,options){let bashMessage={role:"bashExecution",command,output:result3.output,exitCode:result3.exitCode,cancelled:result3.cancelled,truncated:result3.truncated,fullOutputPath:result3.fullOutputPath,timestamp:Date.now(),excludeFromContext:options?.excludeFromContext};this.isStreaming?this._pendingBashMessages.push(bashMessage):(this.agent.state.messages.push(bashMessage),this.sessionManager.appendMessage(bashMessage),this._incrementMessageRevision())}abortBash(){for(let abortController of[...this._bashAbortControllers])abortController.abort()}async cleanupBashOutput(path13){await rm9(path13,{force:!0})}get isBashRunning(){return this._bashAbortControllers.size>0}get hasPendingBashMessages(){return this._pendingBashMessages.length>0}_flushPendingBashMessages(){if(this._pendingBashMessages.length!==0){for(let bashMessage of this._pendingBashMessages)this.agent.state.messages.push(bashMessage),this.sessionManager.appendMessage(bashMessage),this._incrementMessageRevision();this._pendingBashMessages=[]}}setSessionName(name){this.sessionManager.appendSessionInfo(name);let event={type:"session_info_changed",name:this.sessionManager.getSessionName()};this._emit(event),this._extensionRunner.emit(event)}async navigateTree(targetId,options={}){return this._navigateTree(targetId,options)}async editAssistantMessage(entryId,text2,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedLeaf(options.expectedLeafId,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="assistant")throw new AssistantEditError("not-assistant",`Entry ${entryId} is not an assistant message`);let replacement=buildEditedAssistantMessage(targetEntry.message,text2);return assistantTextEquals(targetEntry.message,text2)?{cancelled:!1,unchanged:!0}:this._navigateTree(entryId,options,replacement)}async _navigateTree(targetId,options,replacement){if(this.isStreaming)throw new SessionStreamingError;if(this.isCompacting)throw new Error("Wait for the current compaction or tree navigation to finish before navigating the session tree.");let oldLeafId=this.sessionManager.getLeafId();if(assertExpectedLeaf(options.expectedLeafId,oldLeafId),targetId===oldLeafId&&!replacement)return{cancelled:!1};if(options.summarize&&!this.model)throw new Error("No model available for summarization");let targetEntry=this.sessionManager.getEntry(targetId);if(!targetEntry)throw new Error(`Entry ${targetId} not found`);let{entries:entriesToSummarize,commonAncestorId}=collectEntriesForBranchSummary2(this.sessionManager,oldLeafId,targetId),customInstructions=options.customInstructions,replaceInstructions=options.replaceInstructions,label2=options.label,preparation={targetId,oldLeafId,commonAncestorId,entriesToSummarize,userWantsSummary:options.summarize??!1,customInstructions,replaceInstructions,label:label2};this._branchSummaryAbortController=new AbortController;try{let extensionSummary,fromExtension=!1;if(this._extensionRunner.hasHandlers("session_before_tree")){let result3=await this._extensionRunner.emit({type:"session_before_tree",preparation,signal:this._branchSummaryAbortController.signal});if(result3?.cancel)return{cancelled:!0};result3?.summary&&options.summarize&&(extensionSummary=result3.summary,fromExtension=!0),result3?.customInstructions!==void 0&&(customInstructions=result3.customInstructions),result3?.replaceInstructions!==void 0&&(replaceInstructions=result3.replaceInstructions),result3?.label!==void 0&&(label2=result3.label)}let summaryText,summaryDetails,summaryUsage;if(options.summarize&&entriesToSummarize.length>0&&!extensionSummary){let model=this.model,{model:requestModel,apiKey,headers,extraBody,env}=await this._getCompactionRequestAuth(model),branchSummarySettings=this.settingsManager.getBranchSummarySettings(),result3=await generateBranchSummary2(entriesToSummarize,{model:requestModel,apiKey,headers,extraBody,env,signal:this._branchSummaryAbortController.signal,customInstructions,replaceInstructions,reserveTokens:branchSummarySettings.reserveTokens,streamFn:this.agent.streamFunction,retry:this.settingsManager.getRetrySettings(),callbacks:this._summarizationRetryCallbacks({source:"branchSummary"})});if(result3.aborted)return{cancelled:!0,aborted:!0};if(result3.error)throw new Error(result3.error);summaryText=result3.summary,summaryUsage=result3.usage,summaryDetails={readFiles:result3.readFiles||[],modifiedFiles:result3.modifiedFiles||[]}}else extensionSummary&&(summaryText=extensionSummary.summary,summaryDetails=extensionSummary.details,summaryUsage=extensionSummary.usage);let newLeafId,editorText;replacement?newLeafId=targetEntry.parentId:targetEntry.type==="message"&&targetEntry.message.role==="user"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.message.content,"")):targetEntry.type==="custom_message"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.content,"")):newLeafId=targetId;let summaryEntry;if(summaryText){let summaryId=this.sessionManager.branchWithSummary(newLeafId,summaryText,summaryDetails,fromExtension,summaryUsage);summaryEntry=this.sessionManager.getEntry(summaryId),label2&&this.sessionManager.appendLabelChange(summaryId,label2)}else newLeafId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(newLeafId);let editedEntryId=replacement?this.sessionManager.appendMessage(replacement):void 0;return label2&&!summaryText&&this.sessionManager.appendLabelChange(editedEntryId??targetId,label2),this._restoreAgentMessagesFromSession(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision(),await this._extensionRunner.emit({type:"session_tree",newLeafId:this.sessionManager.getLeafId(),oldLeafId,summaryEntry,fromExtension:summaryText?fromExtension:void 0}),{editorText,cancelled:!1,summaryEntry,entryId:editedEntryId}}finally{this._branchSummaryAbortController=void 0}}getUserMessagesForForking(){let entries=this.sessionManager.getEntries(),result3=[];for(let entry of entries){if(entry.type!=="message"||entry.message.role!=="user")continue;let text2=contentText(entry.message.content,"");text2&&result3.push({entryId:entry.id,text:text2})}return result3}getSessionStats(){let userMessages=0,assistantMessages=0,toolResults=0,totalMessages=0,toolCalls=0,usageTotals=createUsageTotals();for(let entry of this.sessionManager.getEntries()){if((entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&addUsageToTotals(usageTotals,entry.usage),entry.type!=="message")continue;totalMessages++;let message=entry.message;if(message.role==="user")userMessages++;else if(message.role==="toolResult")toolResults++,message.usage&&addUsageToTotals(usageTotals,message.usage);else if(message.role==="assistant"){assistantMessages++;let assistantMsg=message;Array.isArray(assistantMsg.content)&&(toolCalls+=assistantMsg.content.filter(c=>c.type==="toolCall").length),addUsageToTotals(usageTotals,assistantMsg.usage)}}return{sessionFile:this.sessionFile,sessionId:this.sessionId,userMessages,assistantMessages,toolCalls,toolResults,totalMessages,tokens:{input:usageTotals.input,output:usageTotals.output,cacheRead:usageTotals.cacheRead,cacheWrite:usageTotals.cacheWrite,total:usageTotals.input+usageTotals.output+usageTotals.cacheRead+usageTotals.cacheWrite},cost:usageTotals.cost,contextUsage:this.getContextUsage()}}resolvePromptCacheSafeWaitSeconds(){let global=this.settingsManager.getGlobalSettings().promptCache,project=this.settingsManager.getProjectSettings().promptCache,merged=global||project?{...global,...project}:void 0;return resolvePromptCacheSafeWaitSeconds(this.model,merged,process.env)}syncPromptCacheSafeWaitEnv(){let budget=this.resolvePromptCacheSafeWaitSeconds();budget===void 0?delete process.env[PROMPT_CACHE_SAFE_WAIT_ENV]:process.env[PROMPT_CACHE_SAFE_WAIT_ENV]=String(budget)}getContextUsage(){let model=this.model;if(!model)return;let contextWindow=model.contextWindow??0;if(contextWindow<=0)return;let messages=this.messages,branchEntries=this.sessionManager.getBranch(),latestCompaction2=getLatestCompactionEntry(branchEntries);if(latestCompaction2){let compactionIndex=branchEntries.lastIndexOf(latestCompaction2),hasPostCompactionUsage=!1;for(let i=branchEntries.length-1;i>compactionIndex;i--){let entry=branchEntries[i];if(entry.type==="message"&&entry.message.role==="assistant"){let assistant=entry.message;if(assistant.stopReason!=="aborted"&&assistant.stopReason!=="error"&&calculateContextTokens2(assistant.usage)>0){hasPostCompactionUsage=!0;break}}}if(!hasPostCompactionUsage){let tokens=messages.reduce((sum,message)=>sum+estimateTokens2(message),0);return{tokens,contextWindow,percent:tokens/contextWindow*100}}}let estimate=estimateContextTokens3(messages),percent=estimate.tokens/contextWindow*100;return{tokens:estimate.tokens,contextWindow,percent}}async exportToHtml(outputPath,options={}){let themeName=[options.themeName,this.settingsManager.getTheme()].find(candidate=>candidate!==void 0&&getThemeByName(candidate)!==void 0),toolRenderer=createToolHtmlRenderer({getToolDefinition:name=>this.getToolDefinition(name),theme,cwd:this.sessionManager.getCwd()});return await exportSessionToHtml(this.sessionManager,this.state,{outputPath,themeName,toolRenderer})}exportToJsonl(outputPath){let filePath=resolvePath(outputPath??`session-${new Date().toISOString().replace(/[:.]/g,"-")}.jsonl`,process.cwd()),dir=dirname43(filePath);existsSync35(dir)||mkdirSync23(dir,{recursive:!0});let header2={type:"session",version:CURRENT_SESSION_VERSION,id:this.sessionManager.getSessionId(),timestamp:new Date().toISOString(),cwd:this.sessionManager.getCwd()},branchEntries=this.sessionManager.getBranch(),lines=[JSON.stringify(header2)],prevId=null;for(let entry of branchEntries){let linear={...entry,parentId:prevId};lines.push(JSON.stringify(linear)),prevId=entry.id}return writeFileSync19(filePath,`${lines.join(`
|
|
2338
2338
|
`)}
|
|
2339
2339
|
`),filePath}getLastAssistantText(){let lastAssistant=this.messages.slice().reverse().find(m=>{if(m.role!=="assistant")return!1;let msg=m;return!(msg.stopReason==="aborted"&&msg.content.length===0)});if(!lastAssistant)return;let text2="";for(let content of lastAssistant.content)content.type==="text"&&(text2+=content.text);return text2.trim()||void 0}createReplacedSessionContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this._extensionRunner.createCommandContext()));return context.sendMessage=(message,options)=>this.sendCustomMessage(message,options),context.sendUserMessage=(content,options)=>this.sendUserMessage(content,options),context}hasExtensionHandlers(eventType){return this._extensionRunner.hasHandlers(eventType)}get extensionRunner(){return this._extensionRunner}};function detectMiss(prev,message,models){let usage3=message.usage,promptTokens=usage3.input+usage3.cacheRead+usage3.cacheWrite;if(!prev||promptTokens<=0||usage3.cacheRead+usage3.cacheWrite===0&&!prev.reportedCache)return;let missedTokens=Math.min(prev.promptTokens,promptTokens)-usage3.cacheRead;if(missedTokens<=1024)return;let paidTokens=usage3.input+usage3.cacheWrite,paidPerToken=paidTokens>0?(usage3.cost.input+usage3.cost.cacheWrite)/paidTokens:0,readPerToken=usage3.cacheRead>0?usage3.cost.cacheRead/usage3.cacheRead:(models.getModel(message.provider,message.model)?.cost.cacheRead??0)/1e6;return{missedTokens,missedCost:missedTokens*Math.max(0,paidPerToken-readPerToken),idleMs:Math.max(0,message.timestamp-prev.timestamp),modelChanged:`${message.provider}/${message.model}`!==prev.modelKey}}function asPreviousRequest(message,reportedCache){let usage3=message.usage,promptTokens=usage3.input+usage3.cacheRead+usage3.cacheWrite;if(!(promptTokens<=0))return{promptTokens,modelKey:`${message.provider}/${message.model}`,timestamp:message.timestamp,reportedCache:reportedCache||usage3.cacheRead+usage3.cacheWrite>0}}function scan(entries,models){let prev,totals={missedTokens:0,missedCost:0,missCount:0},misses=new Map;for(let entry of entries){if(entry.type==="compaction"||entry.type==="branch_summary"){prev=void 0;continue}if(entry.type==="message"&&entry.message.role==="assistant"){let miss=detectMiss(prev,entry.message,models);miss&&(totals.missedTokens+=miss.missedTokens,totals.missedCost+=miss.missedCost,totals.missCount+=1,misses.set(entry.message,miss)),prev=asPreviousRequest(entry.message,prev?.reportedCache??!1)??prev}}return{prev,totals,misses}}function computeCacheWaste(entries,models){return scan(entries,models).totals}function collectCacheMisses(entries,models){return scan(entries,models).misses}function detectCacheMiss(entries,message,models){return detectMiss(scan(entries,models).prev,message,models)}function brandSource(brand){let configured=brand.changelog;return configured?{id:brand.name.toLowerCase(),path:configured.path,version:configured.version,rewriteLinks:!1}:{id:brand.name.toLowerCase(),path:getChangelogPath(),version:void 0,rewriteLinks:!1}}function resolveChangelogSource(){return BRAND?brandSource(BRAND):{id:"engine",path:getChangelogPath(),version:VERSION,rewriteLinks:!0}}function createAllToolRenderers(){return{read:readRenderers,bash:createShellRenderers("$"),powershell:createShellRenderers("PS>"),edit:editRenderers,write:writeRenderers,grep:grepRenderers,find:findRenderers,ls:lsRenderers}}function withBuiltInRenderers(toolName,definition){let builtIn=createAllToolRenderers()[toolName];return definition?builtIn?{...definition,renderCall:definition.renderCall??builtIn.renderCall,renderResult:definition.renderResult??builtIn.renderResult}:definition:builtIn}var import_semver=__toESM(require_semver(),1);import path10 from"node:path";import{existsSync as existsSync36,readFileSync as readFileSync36}from"fs";var GITHUB_REPO="earendil-works/pi",CHANGELOG_LINK_BASE_PATH="packages/coding-agent",LEGACY_REPO_RE=/^https:\/\/github\.com\/(?:badlogic|earendil-works)\/pi-mono(?=\/|$)/,URL_SCHEME_RE=/^[a-z][a-z0-9+.-]*:/i,INLINE_MARKDOWN_LINK_RE=/(!?\[[^\]\n]+\]\()([^\s)]+)((?:\s+[^)]*)?\))/g;function entryVersion(entry){return entry.version??`${entry.major}.${entry.minor}.${entry.patch}${entry.suffix?`-${entry.suffix}`:""}`}var VERSION_RE=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/,CALVER_RE=/^(\d{4})\.(\d{1,2})\.(\d{1,2})(?:-([2-9]\d*))?$/;function isValidDate(value2){let match=/^(\d{4})-(\d{2})-(\d{2})$/.exec(value2);if(!match)return!1;let year=Number(match[1]),month=Number(match[2]),day=Number(match[3]),date=new Date(Date.UTC(year,month-1,day));return date.getUTCFullYear()===year&&date.getUTCMonth()===month-1&&date.getUTCDate()===day}function isForeignVersion(version){return version.startsWith("0.0.0-omob.")||/^\d+\.\d+\.\d+-0\.beta\./.test(version)}function compareVersionStrings(left,right){let leftCalver=CALVER_RE.exec(left),rightCalver=CALVER_RE.exec(right);if(leftCalver&&rightCalver){let leftParts=[Number(leftCalver[1]),Number(leftCalver[2]),Number(leftCalver[3]),Number(leftCalver[4]??1)],rightParts=[Number(rightCalver[1]),Number(rightCalver[2]),Number(rightCalver[3]),Number(rightCalver[4]??1)];for(let index=0;index<leftParts.length;index+=1)if(leftParts[index]!==rightParts[index])return leftParts[index]<rightParts[index]?-1:1;return 0}let leftValid=(0,import_semver.valid)(left),rightValid=(0,import_semver.valid)(right);if(!(!leftValid||!rightValid||isForeignVersion(left)!==isForeignVersion(right)))return Math.sign((0,import_semver.compare)(leftValid,rightValid))}function normalizeTag(version){let versionString=typeof version=="string"?version:entryVersion(version);return versionString.startsWith("v")?versionString:`v${versionString}`}function splitLocalTarget(target){let hashIndex=target.indexOf("#"),beforeHash=hashIndex===-1?target:target.slice(0,hashIndex),fragment=hashIndex===-1?"":target.slice(hashIndex),queryIndex=beforeHash.indexOf("?");return queryIndex===-1?{fragment,pathPart:beforeHash,query:""}:{fragment,pathPart:beforeHash.slice(0,queryIndex),query:beforeHash.slice(queryIndex)}}function normalizePathPart(value2){return value2.replaceAll("\\","/")}function resolveRepositoryPath(targetPath){let normalizedTarget=normalizePathPart(targetPath),joined=normalizedTarget.startsWith("/")?path10.posix.normalize(normalizedTarget.replace(/^\/+/,"")):path10.posix.normalize(path10.posix.join(CHANGELOG_LINK_BASE_PATH,normalizedTarget));if(!(joined==="."||joined.startsWith("../")||joined===".."))return joined}function isDirectoryTarget(originalPath,repositoryPath){return originalPath.endsWith("/")?!0:!path10.posix.basename(repositoryPath).includes(".")}function normalizeChangelogLinkTarget(target,tag){let canonicalTarget=target.replace(LEGACY_REPO_RE,`https://github.com/${GITHUB_REPO}`),repoUrl=`https://github.com/${GITHUB_REPO}`;for(let route2 of["blob","tree"])for(let branch of["main","master"]){let floatingRefPrefix=`${repoUrl}/${route2}/${branch}/`;canonicalTarget.startsWith(floatingRefPrefix)&&(canonicalTarget=`${repoUrl}/${route2}/${tag}/${canonicalTarget.slice(floatingRefPrefix.length)}`)}if(canonicalTarget.startsWith("#")||canonicalTarget.startsWith("//")||URL_SCHEME_RE.test(canonicalTarget))return canonicalTarget;let{fragment,pathPart,query}=splitLocalTarget(canonicalTarget);if(!pathPart)return canonicalTarget;let repositoryPath=resolveRepositoryPath(pathPart);if(!repositoryPath)return canonicalTarget;let route=isDirectoryTarget(pathPart,repositoryPath)?"tree":"blob";return`https://github.com/${GITHUB_REPO}/${route}/${tag}/${encodeURI(repositoryPath)}${query}${fragment}`}function normalizeChangelogLinks(markdown,version){let tag=normalizeTag(version);return markdown.replace(INLINE_MARKDOWN_LINK_RE,(_match,prefix,target,suffix)=>`${prefix}${normalizeChangelogLinkTarget(target,tag)}${suffix}`)}function parseChangelog(changelogPath){if(!existsSync36(changelogPath))return[];try{let lines=readFileSync36(changelogPath,"utf-8").split(`
|