@code-yeongyu/senpi 2026.10.2 → 2026.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/bundle/chunks/{app-server-command-SZJAJX5J.js → app-server-command-VSOBULUS.js} +1 -1
  3. package/dist/bundle/chunks/{chunk-PA7DXEUM.js → chunk-2EYJJDES.js} +13 -30
  4. package/dist/bundle/chunks/{chunk-LACVPFMM.js → chunk-ATACOV2Q.js} +3 -3
  5. package/dist/bundle/chunks/{chunk-2NAN2JVY.js → chunk-E6TL3R3I.js} +1 -1
  6. package/dist/bundle/chunks/chunk-Q23IMPRD.js +6 -0
  7. package/dist/bundle/chunks/{chunk-GIK2N57G.js → chunk-WIBTUARS.js} +20 -2
  8. package/dist/bundle/chunks/chunk-XOUTBUAV.js +24 -0
  9. package/dist/bundle/chunks/{cli-main-B66BJ6WS.js → cli-main-RH4BAWCJ.js} +1 -1
  10. package/dist/bundle/chunks/{host-command-ESRPUXI2.js → host-command-2ZP7B3DA.js} +1 -1
  11. package/dist/bundle/chunks/{host-lifecycle-P65B4FWL.js → host-lifecycle-3ZZLFX55.js} +1 -1
  12. package/dist/bundle/chunks/host-lifecycle.js +2 -2
  13. package/dist/bundle/chunks/{interactive-mode-LBS4DGTM.js → interactive-mode-LBBIPYPZ.js} +1 -1
  14. package/dist/bundle/chunks/{multi-session-host-5C2TC4BN.js → multi-session-host-GFWO2JUC.js} +1 -1
  15. package/dist/bundle/chunks/{package-manager-cli-K3JGGB65.js → package-manager-cli-VHCS5NXO.js} +1 -1
  16. package/dist/bundle/chunks/{rpc-mode-FJGYYLVG.js → rpc-mode-KAZWRS2K.js} +1 -1
  17. package/dist/bundle/chunks/{schedule-command-BT36FE6F.js → schedule-command-OUALJDGD.js} +1 -1
  18. package/dist/bundle/chunks/{session-picker-MMTSHPR5.js → session-picker-UYF62GAF.js} +1 -1
  19. package/dist/bundle/chunks/session-worker.js +35 -34
  20. package/dist/bundle/cli.js +1 -1
  21. package/dist/bundle/index.js +1 -1
  22. package/dist/bundle/rpc-entry.js +1 -1
  23. package/dist/bundle/runtime-manifest.json +1 -1
  24. package/dist/core/agent-session.d.ts +4 -0
  25. package/dist/core/agent-session.js +60 -27
  26. package/dist/core/extensions/builtin/mcp/index.js +19 -10
  27. package/dist/core/extensions/builtin/mcp/service-register.d.ts +1 -0
  28. package/dist/core/extensions/builtin/mcp/service-register.js +2 -4
  29. package/dist/core/extensions/builtin/mcp/service-tools-changed.d.ts +11 -2
  30. package/dist/core/extensions/builtin/mcp/service-tools-changed.js +33 -6
  31. package/dist/core/extensions/builtin/mcp/service-types.d.ts +0 -2
  32. package/dist/core/extensions/builtin/mcp/service.d.ts +18 -8
  33. package/dist/core/extensions/builtin/mcp/service.js +231 -76
  34. package/dist/core/settings-manager.d.ts +2 -0
  35. package/dist/core/settings-manager.js +7 -0
  36. package/dist/core/skill-invocation.d.ts +10 -2
  37. package/dist/core/skill-invocation.js +13 -3
  38. package/dist/core/webview/native-webview.d.ts +1 -0
  39. package/dist/core/webview/webview-client.d.ts +5 -2
  40. package/dist/core/webview/webview-client.js +1 -1
  41. package/dist/core/webview/webview-readiness.d.ts +41 -0
  42. package/dist/core/webview/webview-readiness.js +48 -0
  43. package/dist/core/webview/webview-service.d.ts +8 -1
  44. package/dist/core/webview/webview-service.js +56 -16
  45. package/dist/modes/rpc/host-exec-argv.d.ts +7 -0
  46. package/dist/modes/rpc/host-exec-argv.js +45 -0
  47. package/dist/modes/rpc/host-launch.js +3 -2
  48. package/dist/modes/rpc/host-lifecycle.js +2 -1
  49. package/docs/rpc.md +2 -0
  50. package/docs/settings.md +1 -0
  51. package/docs/skills.md +4 -2
  52. package/package.json +6 -6
  53. package/dist/bundle/chunks/chunk-UB2RTUY7.js +0 -24
  54. package/dist/bundle/chunks/chunk-XOZFAFCS.js +0 -6
@@ -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{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,AssistantEditError,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,RPC_ERROR_UNKNOWN_COMMAND,SENTINEL_OAUTH_FIELDS,SessionStreamingError,UnknownCommandError,UserEditError,addAccount,all_exports,assertExpectedLeaf,assertExpectedUserLeaf,assertValidAccountName,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,builtinProviders,classifyReasoningCapability,commandShapedName,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findUnknownCommand,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels as getSupportedThinkingLevels2,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,serviceTierForProvider,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,ultrafastSelectionWarning,unknownCommandErrorFromWire,upsertAccount,userTextEquals}from"./chunk-XOZFAFCS.js";import{InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock}from"./chunk-QNAG7FYM.js";import{CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,InteractiveThemeController,SessionSelectorComponent,areExperimentalFeaturesEnabled,formatKeyText,keyDisplayText,keyHint,keyText,minimatch,parseGitUrl,rawKeyHint,readPiManifest,readSkillMarkdownSource,require_ignore,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector}from"./chunk-2NAN2JVY.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_TOOL_NAMES,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SYSTEM_THEME_NAME,SettingsManager,TERMINAL_MOUSE_MODES,Theme,acquireFallbackCircuits,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,applyHttpProxySettings,configureHttpDispatcher,createFallbackCircuitAccess,flushRawStdout,formatHttpIdleTimeoutMs,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getSettingsPath,getThemeByName,getThemeExportColors,highlightCode,initTheme,isTerminalMouseMode,loadThemeFromPath,monotonicNow,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,parseSettingsJson,redactSensitiveOutput,redactSensitiveTokenValues,require_undici,restoreStderr,restoreStdout,setRegisteredThemes,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-GIK2N57G.js";import{TIP_DEFINITIONS}from"./chunk-LYYI74CY.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-PPX4BWTM.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,claimFrameRow,currentRenderRevision,decodeKittyPrintable,detectCapabilities,dispatchMouseEvent,dist_exports,expandPasteMarkers,frameMode,frameScrollbackRows,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,getTerminalColorMode,hyperlink,imageFallback,isKeyRelease,isViewportTUI,isWarpWslSession,joinLineArrays,mainScreenHistoryLines,matchesKey,nextRenderRevision,outerKittyGraphicsMode,renderAtFrameRow,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-5N4ZSDFS.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,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,RESTORE_GRACE_MS,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-WIAXG52U.js";import{PROCESS_START_TOLERANCE_MS,ownProcessStartedAtMs,processBootAtMs,sameBoot,sameProcessStart}from"./chunk-U5KVIAHJ.js";import{clientMessageIdentity,createFsWatchEventSource,readClientMessageIdentity}from"./chunk-KL7ZUB7X.js";import{FS_WATCH_RETRY_DELAY_MS,canonicalWatchPath,closeWatcher,probeDirectoryOpenable,watchWithErrorHandler}from"./chunk-JABBHOD5.js";import{DEFAULT_HOST_LAUNCH_SPEC,GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,HostLaunchSpecError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,TUI_PROBE_TIMEOUT_MS,WakeSourceTracker,classifyEndpointLiveness,decideHostAction,endpointProbeTimeoutMs,ensureHost,handoffHost,isSessionBusySnapshot,loadHostLaunchSpec,parseHostLaunchSpec,parseHostProtocolInfo,probeHost,readAllHostStatus,readHostStatus,runHostCommand,runHostRequest,stopHost}from"./chunk-UB2RTUY7.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-LJWC5IVX.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{gcHostEndpoints,listHostEndpoints,socketNeedsHandshake}from"./chunk-6KIZRGOT.js";import{createRgEngine,ensureTool}from"./chunk-UWYQPA26.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,usageLimitResetMs}from"./chunk-U45BOWV5.js";import{activeModelBlockUntil,describeModelBlocks,discoverEnvSlots,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,withModelBlock}from"./chunk-F6EQ7EV3.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-JEZWV7JW.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-KUPQO7MC.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{recordProcessLifetime}from"./chunk-LACVPFMM.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,shardKey,shardSocketPath,shardSocketPathForKey,socketSecretPath}from"./chunk-22DAHAHO.js";import{attachJsonlLineReader,compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom,serializeJsonLine}from"./chunk-XYDZ3LIE.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-7Q3EY6HH.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-6SMU7ANE.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-MH2BFYGN.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,StringEnum,compile_exports,composeShellCommand,cursorOverflowCompactionSettings,dropFailedAssistantTurns,getApiProvider,getCursorVariantAlias,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-F4Y75Q3Q.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-KC5TT7DH.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,processBunRuntimeOptions}from"./chunk-KEMQXWPY.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.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,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getInteractiveAssetsDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,getThemesDir,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-463OK2Y4.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{installClaudeCodeVersionStore,resolveToolNameMatch}from"./chunk-JRGNL6WM.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-RKJNJ3GI.js";import{resolveRootObjectSchema}from"./chunk-CWLCGRUS.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-6WCOSBI7.js";import{hasRefusedForcedToolChoice}from"./chunk-LHYG7TK7.js";import{readProviderDiagnostic,sanitizeProviderDiagnostic}from"./chunk-YOPVJDSU.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{estimateContextTokens}from"./chunk-2WEI2XTZ.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-BPX6QWPD.js";import{DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,LEGACY_PROVIDER_IDS,ModelsError,TURN_RETRY_SUPPRESSION_PREFIX,accountLabel,appendLoginSlot,assertChatModel,assertClassifierModel,assertImageModel,calculateCost,clampThinkingLevel,classifierErrorResult,collapseSystemMessages,contentText,createInitialSystemMessage,createModels,describeProviderFailureForUser,getCurrentSystemMessage,getCurrentSystemPrompt,getCurrentTools,getInitialSystemMessage,getModelType,getSupportedThinkingLevels,getToolStateChanges,imageErrorResult,isModelType,isProviderStreamStallError,isProviderTimeoutError,isQuotaExhaustionMessage,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeContext,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,retryAssistantCall,retryDelayMs,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-XL5KIYQF.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.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 platform5=navigator.platform.toLowerCase();return platform5==="win32"||platform5==="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.tokens===!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){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===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){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){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 n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value3=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value3,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value3),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value2=input.slice(n);parts.push(value2),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(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 constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,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:constants11.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}},parse6=(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=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.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,open10=tokens[token.tokensIndex];open10.type="text",open10.value=literal,open10.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+open10.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=parse6(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 open10={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open10),push(open10);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)}let isEnd=eos()||state.parens>0&&rest===")".repeat(state.parens)&&!extglobs.some(extglob=>extglob.type==="negate");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&&isEnd){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};parse6.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}=constants11.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}).)*?)`,create2=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 source3=create2(match[1]);return source3?source3+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse6}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse6=require_parse(),utils=require_utils(),constants11=require_constants(),isObject5=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=isObject5(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,regex2=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex2.state;delete regex2.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,regex2,options,{glob,posix:posix5}),result3={glob,state,regex:regex2,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,regex2,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,regex2,options,posix5):match=regex2.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)):parse6(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?"":"$",source2=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state),regex2};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=parse6.fastpaths(input,options)),parsed.output||(parsed=parse6(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source2,options)=>{try{let opts=options||{};return new RegExp(source2,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants11;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 spawn12,spawnSync}from"child_process";import{randomUUID as randomUUID15}from"node:crypto";import{existsSync as existsSync51,mkdirSync as mkdirSync28,readFileSync as readFileSync49,writeFileSync as writeFileSync27}from"node:fs";import{rm as rm13}from"node:fs/promises";import{dirname as dirname52}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual4}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_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,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:()=>convertToLlm,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage,createCompactionSummaryMessage:()=>createCompactionSummaryMessage,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage,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:()=>formatSize,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,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,runToolCall:()=>runToolCall,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:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,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),providerDiagnostic=reason==="error"?readProviderDiagnostic(error2):void 0;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"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...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 prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}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 initialMessages=declareToolChanges(context,prompts,config.model),newMessages=[...initialMessages],currentContext={...context,messages:[...context.messages,...initialMessages]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let message of initialMessages)await emit({type:"message_start",message}),await emit({type:"message_end",message});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,explicitContinuation=!1,preparedMessages=[],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&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}for(let message2 of declareToolChanges(currentContext,[...preparedMessages,...pendingMessages],config.model))await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);preparedMessages=[],pendingMessages=[];let requestUpdate=await config.prepareRequest?.({context:currentContext,model:config.model,thinkingLevel:config.reasoning??"off"},signal);requestUpdate&&(currentContext=requestUpdate.context??currentContext,config=applyLoopUpdate(config,requestUpdate));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 config.finishTurn?.({message,toolResults,context:currentContext,newMessages},signal),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)}let nextTurnContext={message,toolResults,context:currentContext,newMessages},decision=await config.finishTurn?.(nextTurnContext,signal);if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}if(decision?.action==="end"){await emit({type:"agent_end",messages:newMessages});return}if(explicitContinuation=decision?.action==="continue",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&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}pendingMessages.length>0&&(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,preparedMessages=nextTurnSnapshot.messages??[],config=applyLoopUpdate(config,nextTurnSnapshot)),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[]),(hasMoreToolCalls||pendingMessages.length>0)&&(explicitContinuation=!1)}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){explicitContinuation=!1,pendingMessages=followUpMessages;continue}if(explicitContinuation){explicitContinuation=!1;continue}break}await emit({type:"agent_end",messages:newMessages})}function applyLoopUpdate(config,update){return{...config,model:update.model??config.model,reasoning:update.thinkingLevel===void 0?config.reasoning:update.thinkingLevel==="off"?void 0:update.thinkingLevel,thinkingSelection:update.thinkingSelection===void 0?config.thinkingSelection:update.thinkingSelection??void 0,abortServerSideFallback:update.abortServerSideFallback??config.abortServerSideFallback}}function declareToolChanges(context,pendingMessages,model){let systemIndex=-1;for(let i=pendingMessages.length-1;i>=0;i--)if(pendingMessages[i].role==="system"){systemIndex=i;break}let pending=pendingMessages[systemIndex],baseline=pending?pendingMessages.map((message,index2)=>index2===systemIndex?withToolChanges(pending,NO_CHANGES):message):pendingMessages,declared=(providerTools(context,model).tools??[]).map(toProviderToolDeclaration),shorthand=createInitialSystemMessage(context.systemPrompt,declared),committed=shorthand?[shorthand,...context.messages,...baseline]:[...context.messages,...baseline],delta=getToolStateChanges(getCurrentTools(committed),declared),declaredByName=new Map(declared.map(tool=>[tool.name,tool])),changes={toolsAdded:delta.toolsAdded.map(tool=>declaredByName.get(tool.name)??tool),toolsRemoved:delta.toolsRemoved},unchanged=changes.toolsAdded.length===0&&changes.toolsRemoved.length===0;if(pending)return unchanged&&!pending.toolsAdded?.length&&!pending.toolsRemoved?.length?pendingMessages:baseline.map((message,index2)=>index2===systemIndex?withToolChanges(pending,changes):message);if(unchanged)return pendingMessages;let update=withToolChanges({role:"system",content:"",timestamp:Date.now()},changes),insertIndex=pendingMessages.findIndex(message=>message.role!=="system"),index=insertIndex===-1?pendingMessages.length:insertIndex;return[...pendingMessages.slice(0,index),update,...pendingMessages.slice(index)]}var NO_CHANGES={toolsAdded:[],toolsRemoved:[]};function toProviderToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:tool.parameters,...tool.freeform===void 0?{}:{freeform:tool.freeform},...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function withToolChanges(message,{toolsAdded,toolsRemoved}){let{toolsAdded:_added,toolsRemoved:_removed,...rest}=message;return{...rest,...toolsAdded.length>0?{toolsAdded}:{},...toolsRemoved.length>0?{toolsRemoved}:{}}}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;config.transformContext&&(messages=await config.transformContext(messages,signal));let{tools,activeToolNames}=providerTools(context,config.model);return normalizeContext({systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...tools===void 0?{}:{tools:tools.map(toProviderToolDeclaration)},...activeToolNames===void 0?{}:{activeToolNames}})}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:result4=>{providerToolResults.push(result4)}}:{}}),result3=async()=>Object.assign(await response.result(),{thinkingLevel:config.reasoning??"off"}),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 result3(),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 result3();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(resolve46=>{let abortHandler=()=>resolve46(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((resolve46,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(()=>resolve46(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){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,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){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),isSequential=isSequentialToolCall(currentContext,preparation.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,emitToolExecutionUpdate(preparation.toolCall,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 prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};if(!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}}if(tool.name!==toolCall.name){let requestedName=toolCall.name,outcome=await prepareResolvedToolCall(currentContext,assistantMessage,{...toolCall,name:tool.name},tool,config,signal);return outcome.kind==="prepared"?{...outcome,requestedName}:{...outcome,result:withToolNameCorrection(outcome.result,requestedName,tool.name)}}return prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal)}async function prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){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(resolve46=>{signal.addEventListener("abort",()=>resolve46(ABORTED),{once:!0})})}function emitToolExecutionUpdate(toolCall,emit){return partialResult=>emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments,partialResult})}async function runToolCall(toolCall,options){let{assistantMessage,context,signal}=options,tool=options.tools.find(candidate=>candidate.name===toolCall.name),preparation=await prepareToolCall(context,assistantMessage,toolCall,tool,options,signal);if(preparation.kind==="immediate")return{toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,options.onUpdate??(()=>{}));return finalizeExecutedToolCall(context,assistantMessage,preparation,executed,options,signal)}async function executePreparedToolCall(prepared,signal,onUpdate){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(onUpdate(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);if(afterResult){let structuredContent=afterResult.structuredContent??(afterResult.content?void 0:result3.structuredContent);result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},structuredContent===void 0?delete result3.structuredContent:result3.structuredContent=structuredContent,isError=afterResult.isError??isError}}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return prepared.requestedName!==void 0&&(result3=withToolNameCorrection(result3,prepared.requestedName,prepared.toolCall.name)),{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==="system"||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()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic:void 0}}var LLM_ROLES=new Set(["user","assistant","toolResult","system"]);function isBackgroundNotice(message){return!LLM_ROLES.has(message.role)}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}peek(){if(this.mode==="all")return this.messages.slice();let first=this.messages[0];if(!first)return[];if(!isBackgroundNotice(first))return[first];let end=1;for(;end<this.messages.length&&isBackgroundNotice(this.messages[end]);)end++;return this.messages.slice(0,end)}drain(){let drained=this.peek();return this.messages=this.messages.slice(drained.length),drained}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,model:this._state.model},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.onProviderStreamEvent=runtimeOptions.onProviderStreamEvent,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.finishTurn=runtimeOptions.finishTurn,this.prepareRequest=runtimeOptions.prepareRequest,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()}peekQueuedMessages(){let steering=this.steeringQueue.peek();return steering.length>0?steering:this.followUpQueue.peek()}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._state.providerDiagnostic=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||this._state.messages.every(message=>message.role==="system"))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(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),finishTurn2=this.finishTurn,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,onProviderStreamEvent:this.onProviderStreamEvent,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,finishTurn:finishTurn2?async(turn,signal)=>{let decision=await finishTurn2(turn,signal)??void 0;return decision?.action==="end"&&this.suppressQueuedMessageDrain(),decision}:void 0,prepareRequest:this.prepareRequest,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(resolve46=>{resolvePromise=resolve46});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0,this._state.providerDiagnostic=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 providerDiagnostic=aborted?void 0:readProviderDiagnostic(error2),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),...providerDiagnostic===void 0?{}:{providerDiagnostic},...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,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));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((resolve46,reject)=>{resolveCompletion=resolve46,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{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,AssistantEditError,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,RPC_ERROR_UNKNOWN_COMMAND,SENTINEL_OAUTH_FIELDS,SessionStreamingError,UnknownCommandError,UserEditError,addAccount,all_exports,assertExpectedLeaf,assertExpectedUserLeaf,assertValidAccountName,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,builtinProviders,classifyReasoningCapability,commandShapedName,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findUnknownCommand,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels as getSupportedThinkingLevels2,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,serviceTierForProvider,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,ultrafastSelectionWarning,unknownCommandErrorFromWire,upsertAccount,userTextEquals}from"./chunk-Q23IMPRD.js";import{InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock}from"./chunk-QNAG7FYM.js";import{CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,InteractiveThemeController,SessionSelectorComponent,areExperimentalFeaturesEnabled,formatKeyText,keyDisplayText,keyHint,keyText,minimatch,parseGitUrl,rawKeyHint,readPiManifest,readSkillMarkdownSource,require_ignore,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector}from"./chunk-E6TL3R3I.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_TOOL_NAMES,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SYSTEM_THEME_NAME,SettingsManager,TERMINAL_MOUSE_MODES,Theme,acquireFallbackCircuits,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,applyHttpProxySettings,configureHttpDispatcher,createFallbackCircuitAccess,flushRawStdout,formatHttpIdleTimeoutMs,formatSkillInvocationPrompt,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getSettingsPath,getThemeByName,getThemeExportColors,highlightCode,initTheme,isTerminalMouseMode,loadThemeFromPath,monotonicNow,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,redactSensitiveOutput,redactSensitiveTokenValues,removeSkillInvocationTokens,require_undici,restoreStderr,restoreStdout,setRegisteredThemes,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-WIBTUARS.js";import{TIP_DEFINITIONS}from"./chunk-LYYI74CY.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-PPX4BWTM.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,claimFrameRow,currentRenderRevision,decodeKittyPrintable,detectCapabilities,dispatchMouseEvent,dist_exports,expandPasteMarkers,frameMode,frameScrollbackRows,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,getTerminalColorMode,hyperlink,imageFallback,isKeyRelease,isViewportTUI,isWarpWslSession,joinLineArrays,mainScreenHistoryLines,matchesKey,nextRenderRevision,outerKittyGraphicsMode,renderAtFrameRow,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-5N4ZSDFS.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,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,RESTORE_GRACE_MS,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-WIAXG52U.js";import{PROCESS_START_TOLERANCE_MS,ownProcessStartedAtMs,processBootAtMs,sameBoot,sameProcessStart}from"./chunk-U5KVIAHJ.js";import{clientMessageIdentity,createFsWatchEventSource,readClientMessageIdentity}from"./chunk-KL7ZUB7X.js";import{FS_WATCH_RETRY_DELAY_MS,canonicalWatchPath,closeWatcher,probeDirectoryOpenable,watchWithErrorHandler}from"./chunk-JABBHOD5.js";import{DEFAULT_HOST_LAUNCH_SPEC,GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,HostLaunchSpecError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,TUI_PROBE_TIMEOUT_MS,WakeSourceTracker,classifyEndpointLiveness,decideHostAction,endpointProbeTimeoutMs,ensureHost,handoffHost,isSessionBusySnapshot,loadHostLaunchSpec,parseHostLaunchSpec,parseHostProtocolInfo,probeHost,readAllHostStatus,readHostStatus,runHostCommand,runHostRequest,stopHost}from"./chunk-XOUTBUAV.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-LJWC5IVX.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{gcHostEndpoints,listHostEndpoints,socketNeedsHandshake}from"./chunk-6KIZRGOT.js";import{createRgEngine,ensureTool}from"./chunk-UWYQPA26.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,usageLimitResetMs}from"./chunk-U45BOWV5.js";import{activeModelBlockUntil,describeModelBlocks,discoverEnvSlots,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,withModelBlock}from"./chunk-F6EQ7EV3.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-JEZWV7JW.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-KUPQO7MC.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{recordProcessLifetime}from"./chunk-ATACOV2Q.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,shardKey,shardSocketPath,shardSocketPathForKey,socketSecretPath}from"./chunk-22DAHAHO.js";import{attachJsonlLineReader,compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom,serializeJsonLine}from"./chunk-XYDZ3LIE.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-7Q3EY6HH.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-6SMU7ANE.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-MH2BFYGN.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,StringEnum,compile_exports,composeShellCommand,cursorOverflowCompactionSettings,dropFailedAssistantTurns,getApiProvider,getCursorVariantAlias,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-F4Y75Q3Q.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-KC5TT7DH.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,processBunRuntimeOptions}from"./chunk-KEMQXWPY.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.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,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getInteractiveAssetsDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,getThemesDir,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-463OK2Y4.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{installClaudeCodeVersionStore,resolveToolNameMatch}from"./chunk-JRGNL6WM.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-RKJNJ3GI.js";import{resolveRootObjectSchema}from"./chunk-CWLCGRUS.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-6WCOSBI7.js";import{hasRefusedForcedToolChoice}from"./chunk-LHYG7TK7.js";import{readProviderDiagnostic,sanitizeProviderDiagnostic}from"./chunk-YOPVJDSU.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{estimateContextTokens}from"./chunk-2WEI2XTZ.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-BPX6QWPD.js";import{DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,LEGACY_PROVIDER_IDS,ModelsError,TURN_RETRY_SUPPRESSION_PREFIX,accountLabel,appendLoginSlot,assertChatModel,assertClassifierModel,assertImageModel,calculateCost,clampThinkingLevel,classifierErrorResult,collapseSystemMessages,contentText,createInitialSystemMessage,createModels,describeProviderFailureForUser,getCurrentSystemMessage,getCurrentSystemPrompt,getCurrentTools,getInitialSystemMessage,getModelType,getSupportedThinkingLevels,getToolStateChanges,imageErrorResult,isModelType,isProviderStreamStallError,isProviderTimeoutError,isQuotaExhaustionMessage,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeContext,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,retryAssistantCall,retryDelayMs,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-XL5KIYQF.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.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 platform5=navigator.platform.toLowerCase();return platform5==="win32"||platform5==="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.tokens===!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){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===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){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){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 n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value3=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value3,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value3),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value2=input.slice(n);parts.push(value2),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(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 constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,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:constants11.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}},parse6=(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=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.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,open10=tokens[token.tokensIndex];open10.type="text",open10.value=literal,open10.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+open10.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=parse6(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 open10={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open10),push(open10);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)}let isEnd=eos()||state.parens>0&&rest===")".repeat(state.parens)&&!extglobs.some(extglob=>extglob.type==="negate");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&&isEnd){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};parse6.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}=constants11.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}).)*?)`,create2=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 source3=create2(match[1]);return source3?source3+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse6}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse6=require_parse(),utils=require_utils(),constants11=require_constants(),isObject5=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=isObject5(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,regex2=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex2.state;delete regex2.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,regex2,options,{glob,posix:posix5}),result3={glob,state,regex:regex2,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,regex2,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,regex2,options,posix5):match=regex2.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)):parse6(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?"":"$",source2=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state),regex2};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=parse6.fastpaths(input,options)),parsed.output||(parsed=parse6(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source2,options)=>{try{let opts=options||{};return new RegExp(source2,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants11;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 spawn12,spawnSync}from"child_process";import{randomUUID as randomUUID15}from"node:crypto";import{existsSync as existsSync51,mkdirSync as mkdirSync28,readFileSync as readFileSync49,writeFileSync as writeFileSync27}from"node:fs";import{rm as rm13}from"node:fs/promises";import{dirname as dirname52}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual4}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_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,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:()=>convertToLlm,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage,createCompactionSummaryMessage:()=>createCompactionSummaryMessage,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage,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:()=>formatSize,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,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,runToolCall:()=>runToolCall,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:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,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),providerDiagnostic=reason==="error"?readProviderDiagnostic(error2):void 0;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"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...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 prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}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 initialMessages=declareToolChanges(context,prompts,config.model),newMessages=[...initialMessages],currentContext={...context,messages:[...context.messages,...initialMessages]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let message of initialMessages)await emit({type:"message_start",message}),await emit({type:"message_end",message});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,explicitContinuation=!1,preparedMessages=[],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&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}for(let message2 of declareToolChanges(currentContext,[...preparedMessages,...pendingMessages],config.model))await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);preparedMessages=[],pendingMessages=[];let requestUpdate=await config.prepareRequest?.({context:currentContext,model:config.model,thinkingLevel:config.reasoning??"off"},signal);requestUpdate&&(currentContext=requestUpdate.context??currentContext,config=applyLoopUpdate(config,requestUpdate));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 config.finishTurn?.({message,toolResults,context:currentContext,newMessages},signal),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)}let nextTurnContext={message,toolResults,context:currentContext,newMessages},decision=await config.finishTurn?.(nextTurnContext,signal);if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}if(decision?.action==="end"){await emit({type:"agent_end",messages:newMessages});return}if(explicitContinuation=decision?.action==="continue",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&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}pendingMessages.length>0&&(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,preparedMessages=nextTurnSnapshot.messages??[],config=applyLoopUpdate(config,nextTurnSnapshot)),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[]),(hasMoreToolCalls||pendingMessages.length>0)&&(explicitContinuation=!1)}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){explicitContinuation=!1,pendingMessages=followUpMessages;continue}if(explicitContinuation){explicitContinuation=!1;continue}break}await emit({type:"agent_end",messages:newMessages})}function applyLoopUpdate(config,update){return{...config,model:update.model??config.model,reasoning:update.thinkingLevel===void 0?config.reasoning:update.thinkingLevel==="off"?void 0:update.thinkingLevel,thinkingSelection:update.thinkingSelection===void 0?config.thinkingSelection:update.thinkingSelection??void 0,abortServerSideFallback:update.abortServerSideFallback??config.abortServerSideFallback}}function declareToolChanges(context,pendingMessages,model){let systemIndex=-1;for(let i=pendingMessages.length-1;i>=0;i--)if(pendingMessages[i].role==="system"){systemIndex=i;break}let pending=pendingMessages[systemIndex],baseline=pending?pendingMessages.map((message,index2)=>index2===systemIndex?withToolChanges(pending,NO_CHANGES):message):pendingMessages,declared=(providerTools(context,model).tools??[]).map(toProviderToolDeclaration),shorthand=createInitialSystemMessage(context.systemPrompt,declared),committed=shorthand?[shorthand,...context.messages,...baseline]:[...context.messages,...baseline],delta=getToolStateChanges(getCurrentTools(committed),declared),declaredByName=new Map(declared.map(tool=>[tool.name,tool])),changes={toolsAdded:delta.toolsAdded.map(tool=>declaredByName.get(tool.name)??tool),toolsRemoved:delta.toolsRemoved},unchanged=changes.toolsAdded.length===0&&changes.toolsRemoved.length===0;if(pending)return unchanged&&!pending.toolsAdded?.length&&!pending.toolsRemoved?.length?pendingMessages:baseline.map((message,index2)=>index2===systemIndex?withToolChanges(pending,changes):message);if(unchanged)return pendingMessages;let update=withToolChanges({role:"system",content:"",timestamp:Date.now()},changes),insertIndex=pendingMessages.findIndex(message=>message.role!=="system"),index=insertIndex===-1?pendingMessages.length:insertIndex;return[...pendingMessages.slice(0,index),update,...pendingMessages.slice(index)]}var NO_CHANGES={toolsAdded:[],toolsRemoved:[]};function toProviderToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:tool.parameters,...tool.freeform===void 0?{}:{freeform:tool.freeform},...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function withToolChanges(message,{toolsAdded,toolsRemoved}){let{toolsAdded:_added,toolsRemoved:_removed,...rest}=message;return{...rest,...toolsAdded.length>0?{toolsAdded}:{},...toolsRemoved.length>0?{toolsRemoved}:{}}}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;config.transformContext&&(messages=await config.transformContext(messages,signal));let{tools,activeToolNames}=providerTools(context,config.model);return normalizeContext({systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...tools===void 0?{}:{tools:tools.map(toProviderToolDeclaration)},...activeToolNames===void 0?{}:{activeToolNames}})}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:result4=>{providerToolResults.push(result4)}}:{}}),result3=async()=>Object.assign(await response.result(),{thinkingLevel:config.reasoning??"off"}),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 result3(),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 result3();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(resolve46=>{let abortHandler=()=>resolve46(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((resolve46,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(()=>resolve46(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){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,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){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),isSequential=isSequentialToolCall(currentContext,preparation.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,emitToolExecutionUpdate(preparation.toolCall,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 prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};if(!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}}if(tool.name!==toolCall.name){let requestedName=toolCall.name,outcome=await prepareResolvedToolCall(currentContext,assistantMessage,{...toolCall,name:tool.name},tool,config,signal);return outcome.kind==="prepared"?{...outcome,requestedName}:{...outcome,result:withToolNameCorrection(outcome.result,requestedName,tool.name)}}return prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal)}async function prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){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(resolve46=>{signal.addEventListener("abort",()=>resolve46(ABORTED),{once:!0})})}function emitToolExecutionUpdate(toolCall,emit){return partialResult=>emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments,partialResult})}async function runToolCall(toolCall,options){let{assistantMessage,context,signal}=options,tool=options.tools.find(candidate=>candidate.name===toolCall.name),preparation=await prepareToolCall(context,assistantMessage,toolCall,tool,options,signal);if(preparation.kind==="immediate")return{toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,options.onUpdate??(()=>{}));return finalizeExecutedToolCall(context,assistantMessage,preparation,executed,options,signal)}async function executePreparedToolCall(prepared,signal,onUpdate){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(onUpdate(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);if(afterResult){let structuredContent=afterResult.structuredContent??(afterResult.content?void 0:result3.structuredContent);result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},structuredContent===void 0?delete result3.structuredContent:result3.structuredContent=structuredContent,isError=afterResult.isError??isError}}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return prepared.requestedName!==void 0&&(result3=withToolNameCorrection(result3,prepared.requestedName,prepared.toolCall.name)),{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==="system"||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()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic:void 0}}var LLM_ROLES=new Set(["user","assistant","toolResult","system"]);function isBackgroundNotice(message){return!LLM_ROLES.has(message.role)}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}peek(){if(this.mode==="all")return this.messages.slice();let first=this.messages[0];if(!first)return[];if(!isBackgroundNotice(first))return[first];let end=1;for(;end<this.messages.length&&isBackgroundNotice(this.messages[end]);)end++;return this.messages.slice(0,end)}drain(){let drained=this.peek();return this.messages=this.messages.slice(drained.length),drained}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,model:this._state.model},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.onProviderStreamEvent=runtimeOptions.onProviderStreamEvent,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.finishTurn=runtimeOptions.finishTurn,this.prepareRequest=runtimeOptions.prepareRequest,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()}peekQueuedMessages(){let steering=this.steeringQueue.peek();return steering.length>0?steering:this.followUpQueue.peek()}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._state.providerDiagnostic=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||this._state.messages.every(message=>message.role==="system"))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(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),finishTurn2=this.finishTurn,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,onProviderStreamEvent:this.onProviderStreamEvent,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,finishTurn:finishTurn2?async(turn,signal)=>{let decision=await finishTurn2(turn,signal)??void 0;return decision?.action==="end"&&this.suppressQueuedMessageDrain(),decision}:void 0,prepareRequest:this.prepareRequest,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(resolve46=>{resolvePromise=resolve46});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0,this._state.providerDiagnostic=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 providerDiagnostic=aborted?void 0:readProviderDiagnostic(error2),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),...providerDiagnostic===void 0?{}:{providerDiagnostic},...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,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));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((resolve46,reject)=>{resolveCompletion=resolve46,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=`
@@ -1249,12 +1249,12 @@ ${escapedInstructions}
1249
1249
  ${body}`)}let entry=params.tool===void 0?void 0:byTool.get(params.tool);if(entry===void 0)return textResult(server,unknownToolText(server,params.tool,index));if(params.op==="describe")return textResult(server,`${entry.tool}: ${entry.description??"(no description)"}
1250
1250
  Input schema (JSON Schema):
1251
1251
  ${JSON.stringify(entry.schema??{},null,2)}`);let args;try{let parsed=JSON.parse(params.args??"{}");if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new Error("args must encode a JSON object");args=parsed}catch(error2){return textResult(server,`Invalid args for '${entry.tool}': ${error2 instanceof Error?error2.message:String(error2)}. Pass args as a JSON object STRING matching the schema from op:"describe", e.g. {"op":"call","tool":"${entry.tool}","args":"{\\"key\\": \\"value\\"}"}.`)}return await executeMcpCatalogEntry(entry,args,signal,onUpdate)},renderCall(args,theme2){let detail=args.op==="search"?args.query??"":args.tool??"";return new Text(theme2.fg("toolTitle",theme2.bold(`${name} ${args.op} ${detail}`.trim())),0,0)},renderResult(result3,options,theme2){let title=options.isPartial?`${name}: running`:`${name}: ${result3.details?.preview??"done"}`;return new Text(theme2.fg("toolOutput",title),0,0)}}}function textResult(server,text2){return{content:[{type:"text",text:text2}],details:{preview:firstLine(text2),server,tool:"proxy"}}}function unknownToolText(server,tool,index){let nearest=tool===void 0?[]:index.search(tool,3,{}),hint=nearest.length===0?"":` Nearest matches: ${nearest.map(match=>match.doc.label).join(", ")}.`;return`Unknown tool '${tool??"(missing)"}' on '${server}'.${hint} Use op:"search" to list tools.`}function firstLine(text2){return text2.split(`
1252
- `,1)[0].slice(0,80)}var managedNamesByRegistrar=new WeakMap,promotedNamesByRegistrar=new WeakMap;function registerMcpTierBTools(pi,input,toolSearchService,warn){let named=mapMcpCatalogNames(input.registeredEntries,warn),searchable=named.map(({entry,name})=>({name,toolName:entry.tool,description:entry.description,server:entry.server})),documents=named.map(({entry,name})=>({name,label:entry.tool,aliases:[entry.tool],description:entry.description,keywords:[],source:"mcp",group:entry.server,ownerLabel:entry.server,registrationId:deriveMcpRegistrationId(entry.server,entry.tool)})),fullDefs=buildMcpToolDefinitions(input.registeredEntries,warn),fullByName=new Map(fullDefs.map(def=>[def.name,def])),gatewayNames=[];for(let gateway of input.proxyGateways??[]){let tool=createMcpProxyTool(gateway.server,gateway.entries);pi.registerTool(tool),gatewayNames.push(tool.name)}for(let tool of input.utilityTools??[])pi.registerTool(tool),gatewayNames.push(tool.name);let activeMcpNames=[...mapMcpCatalogNames(input.activeEntries).map(({name})=>name),...gatewayNames],managedNames=new Set([...fullDefs.map(def=>def.name),...gatewayNames]),previousManagedNames=managedNamesByRegistrar.get(pi)??new Set;managedNamesByRegistrar.set(pi,managedNames);let stubSwap=input.searchMode&&input.settings.stubSwap===!0,stubbed=new Set,registeredNames=new Set(fullDefs.map(def=>def.name)),catalogNames=new Set(toolSearchService.getCatalog().map(doc=>doc.name)),activate=names=>{let known=[...new Set(names.filter(name=>registeredNames.has(name)))];if(known.length===0)return;stubSwap&&swapStubsToFull(pi,known,stubbed,fullByName);let current=pi.getActiveTools();pi.setActiveTools(orderActiveSet(unionStable(current,known),current,catalogNames))};toolSearchService.feed("mcp",input.searchMode?documents:[],{activate});for(let doc of toolSearchService.getCatalog())catalogNames.add(doc.name);let reference=pi.getActiveTools(),currentBase=reference.filter(name=>!isLegacyMcpRegistrationName(name)&&!previousManagedNames.has(name)&&!managedNames.has(name));if(!input.searchMode)return registerToolsPreservingActiveSet(pi,fullDefs,orderActiveSet([...currentBase,...activeMcpNames],reference,catalogNames)),{activate,searchable};if(!stubSwap){let active2=orderActiveSet([...currentBase,...activeMcpNames],reference,catalogNames);return registerToolsPreservingActiveSet(pi,fullDefs,active2),{activate,searchable}}let directActive=new Set(activeMcpNames),promoted=promotedNamesByRegistrar.get(pi)??new Set;promotedNamesByRegistrar.set(pi,promoted);let toRegister=fullDefs.map(def=>directActive.has(def.name)||promoted.has(def.name)?def:(stubbed.add(def.name),buildMcpStubDefinition(def.name,{full:def,promote:()=>activate([def.name])}))),active=orderActiveSet([...currentBase,...fullDefs.map(def=>def.name)],reference,catalogNames);return registerToolsPreservingActiveSet(pi,toRegister,active),{activate,searchable}}function swapStubsToFull(pi,names,stubbed,fullByName){for(let name of names){if(!stubbed.has(name))continue;let full=fullByName.get(name);full!==void 0&&(pi.registerTool(full),stubbed.delete(name),promotedNamesByRegistrar.get(pi)?.add(name))}}function orderActiveSet(names,reference,catalogNames){let unique3=[...new Set(names)],rank=new Map(reference.map((name,index)=>[name,index])),base=unique3.filter(name=>!catalogNames.has(name)).sort((a,b)=>(rank.get(a)??Number.MAX_SAFE_INTEGER)-(rank.get(b)??Number.MAX_SAFE_INTEGER)),catalog=unique3.filter(name=>catalogNames.has(name)).sort();return[...base,...catalog]}function unionStable(current,added){return[...new Set([...current,...added])]}function isLegacyMcpRegistrationName(name){return name.startsWith("mcp_")}function buildMcpStubDefinition(name,promotion){return{name,label:name,description:promotion===void 0?`Inactive MCP tool. Run tool_search to activate ${name}, then call it on your next turn.`:`Deferred MCP tool. Call ${name} with its real arguments; it activates and runs on this first call (tool_search lists its schema).`,parameters:typebox_exports.Object({},{additionalProperties:!0}),executionMode:"parallel",async execute(toolCallId,params,signal,onUpdate,ctx){return promotion===void 0?{content:[{type:"text",text:`${name} is not active. Use tool_search to activate it, then call it.`}],details:void 0}:(promotion.promote(),promotion.full.execute(toolCallId,params,signal,onUpdate,ctx))},renderCall(_args,theme2){return new Text(theme2.fg("toolOutput",`${name} (deferred stub)`),0,0)}}}async function registerDirectMcpTools(pi,config,entries,toolSearchService,options={}){let registeredEntries=[],activeEntries=[],searchMode=!1,proxyGateways=[],resourceServers=[],promptServers=[],recordRegisteredListings=[];for(let entry of entries){let server=config.servers[entry.name];if(server?.config===void 0)continue;let catalog=entry.cachedCatalog===void 0?entry.connection.state==="connected"&&entry.startupCatalogPending!==!0?await collectToolCatalog(entry.name,entry.connection,server.config,{agentDir:entry.agentDir,artifacts:entry.artifacts,ensureFresh:entry.ensureFresh,outputGuard:config.settings.outputGuard}):[]:cachedToolsToCatalogEntries(entry.name,entry.cachedCatalog,entry.connection,server.config.requestTimeoutMs,entry.ensureCachedToolConnected??(()=>entry.connection.connect().then(()=>{})),{agentDir:entry.agentDir,artifacts:entry.artifacts,ensureFresh:entry.ensureFresh,outputGuard:config.settings.outputGuard}),identity=mcpRegistrationIdentity(catalog,entry.cachedCatalog);recordRegisteredListings.push(()=>entry.onRegistered?.(identity));let cachedPrompts=entry.cachedCatalog?.prompts??[];cachedPrompts.length>0&&promptServers.push({connection:entry.connection,prompts:cachedPrompts,requestTimeoutMs:server.config.requestTimeoutMs,server:entry.name});let cachedResources=entry.cachedCatalog?.resources??[];cachedResources.length>0&&resourceServers.push({agentDir:entry.agentDir,artifacts:entry.artifacts,connection:entry.connection,outputGuard:config.settings.outputGuard,requestTimeoutMs:server.config.requestTimeoutMs,resources:cachedResources,server:entry.name});let policy=computeMcpExposurePolicy(catalog,server.config,config.settings);for(let warning of policy.warnings)entry.logger.warn(warning);policy.mode==="search"&&(searchMode=!0),policy.mode==="proxy"&&proxyGateways.push({entries:[...policy.filteredEntries],server:entry.name}),registeredEntries.push(...policy.registeredEntries),activeEntries.push(...policy.activeEntries)}if(registeredEntries.length===0&&activeEntries.length===0&&!searchMode&&proxyGateways.length===0&&options.refreshActiveSetWhenEmpty!==!0){for(let record7 of recordRegisteredListings)record7();return}let utilityTools=resourceServers.length>0?createMcpResourceTools(()=>resourceServers):[],registration=registerMcpTierBTools(pi,{activeEntries,proxyGateways,registeredEntries,searchMode,settings:config.settings,utilityTools},toolSearchService,message=>createMcpLogger("service").warn(message));for(let record7 of recordRegisteredListings)record7();return{...registration,promptServers,resourceServers}}async function registerMcpServiceDirectTools(pi,config,entries,toolSearchService,options={}){return await registerDirectMcpTools(pi,config,[...entries].map(entry=>{let serverConfig=config.servers[entry.name]?.config,claim=entry.startupCatalogClaim,startupCatalogPending=claim?.ownsRegistration()===!0;return{agentDir:entry.agentDir,artifacts:entry.artifacts,cachedCatalog:startupCatalogPending?claim?.cachedCatalog:entry.cachedCatalog,startupCatalogPending,onRegistered:identity=>{entry.registeredIdentity=identity},connection:entry.connection,ensureFresh:()=>entry.authPlan?.refresh?.ensureFresh().then(()=>{})??Promise.resolve(),ensureCachedToolConnected:()=>connectAndRefreshMcpCatalog(entry,serverConfig),logger:entry.logger,name:entry.name}}),toolSearchService,options)}function buildMcpServerSnapshot(name,server,connection,entry,now2=Date.now()){return{name,configState:server?.state??"removed",configHash:server?.configHash??null,source:server?.source??null,sourcePath:server?.sourcePath??null,lifecycleState:connection?.state==="idle"&&connection.generation===0&&entry?.cachedCatalog!==void 0?"cached":connection?.state??"not_spawned",generation:connection?.generation??null,pid:connection?.getRootPid()??null,lastError:connection?.lastError?.message??null,uptimeMs:entry===void 0?null:now2-entry.createdAtMs,counters:entry?.counters??{callCount:0,errorCount:0,totalLatencyMs:0,reconnectCount:0}}}function subscribeMcpToolsChanged(entry,refresh,sink){let changeReported=!1,coalescer=createMcpListChangeCoalescer({onRefresh:()=>{let connectOnly=!changeReported;return changeReported=!1,refresh(connectOnly)},scope:`mcp.list_changed.${entry.name}`,sink}),unsubscribe=entry.connection.onToolsChanged(event=>{event.cause!=="connect"&&(changeReported=!0),coalescer.notify()});return()=>{unsubscribe(),coalescer.dispose()}}async function refreshMcpToolsOnListChanged(entry,pi,config,registerDirectTools,connectOnly){let server=config.servers[entry.name];if(server?.config===void 0||entry.connection.state!=="connected"||connectOnly&&entry.startupCatalogClaim?.ownsRegistration()===!0)return;let registeredCatalog=entry.cachedCatalog;entry.connection instanceof SharedMcpLease&&(entry.cachedCatalog=await entry.connection.catalog());let catalog=await collectToolCatalog(entry.name,entry.connection,server.config,{agentDir:entry.agentDir,outputGuard:config.settings.outputGuard}),newNames=mapMcpCatalogNames(catalog).map(({name})=>name),knownNames=entry.knownToolNames??(registeredCatalog===void 0?newNames:mapMcpCatalogNames(cachedToolsToCatalogEntries(entry.name,registeredCatalog,entry.connection,server.config.requestTimeoutMs,async()=>{})).map(({name})=>name)),diff=diffMcpToolNames(knownNames,newNames);if(!connectOnly||mcpRegistrationIdentity(catalog,entry.cachedCatalog)!==entry.registeredIdentity){entry.connection instanceof SharedMcpLease||(entry.cachedCatalog=await collectServerCatalogForCache(entry.connection,server.config,entry.configHash),await writeMcpCachedServer(entry.agentDir,entry.name,entry.cachedCatalog));for(let removed of diff.removed)pi.registerTool(buildMcpTombstoneDefinition(removed,entry.name));await registerDirectTools(pi)}entry.knownToolNames=newNames,entry.lastListChangedDelta=formatMcpListChangedDelta(diff)}var ENV_REFERENCE=/\$\{([A-Za-z_][A-Za-z0-9_]*)/g,OWN_CONFIG_FIX="declare the server in your own mcp.json instead";function resolveSkillMcpServer(name,raw,sourcePath,source2){let label3=`Skill '${source2.skillName}' MCP server '${name}'`,declared=declareForTrust(name,raw,label3,source2);if(declared.declaration===void 0)return{warning:declared.warnings.join(" ")};let config={...normalizeServer(declared.declaration),directTools:[],exposure:"search"};inheritMcpSharingScope(raw,declared.declaration),inheritMcpSharingScope(declared.declaration,config);let server={config,configHash:hashConfig(config),name,source:"skill",sourcePath,state:config.enabled?"enabled":"disabled",transport:config.type};return declared.warnings.length===0?{server}:{server,warning:declared.warnings.join(" ")}}function declareForTrust(name,raw,label3,source2){if((raw.type??(raw.url?"http":"stdio"))!=="stdio")return declareRemote(raw,label3);if(!source2.trusted){let literal=[raw.command,raw.cwd,...raw.args??[],...Object.values(raw.env??{})],warning=literalWarning(label3,literal,"stays literal because the skill comes from an untrusted project; trust the project or move the server into your own mcp.json to expand it.");return{declaration:raw,warnings:warning===void 0?[]:[warning]}}try{return{declaration:interpolateValue(raw,`mcp.mcpServers.${name}`,source2.env??process.env),warnings:[]}}catch(error2){if(!(error2 instanceof McpConfigValidationError))throw error2;return{warnings:[`${label3} skipped: ${error2.message}`]}}}function declareRemote(raw,label3){let warnings=[],literal=literalWarning(label3,[raw.url,...Object.values(raw.headers??{})],`in url/headers stays literal: a skill-declared remote server never expands environment variables, because the skill chooses where they are sent; ${OWN_CONFIG_FIX}.`);if(literal!==void 0&&warnings.push(literal),!(raw.auth==="bearer"||raw.auth===void 0&&raw.bearerTokenEnv!==void 0)||raw.bearerTokenEnv===void 0)return{declaration:raw,warnings};warnings.push(`${label3}: bearerTokenEnv '${raw.bearerTokenEnv}' is ignored and no Authorization header is sent, because a skill-declared remote server must not send a parent environment variable to a server the skill chose; ${OWN_CONFIG_FIX}, where bearerTokenEnv keeps working.`);let{bearerTokenEnv:_dropped,...rest}=raw;return{declaration:{...rest,auth:!1},warnings}}function literalWarning(label3,values,reason){let names=new Set;for(let value2 of values)for(let match of value2?.matchAll(ENV_REFERENCE)??[])names.add(`\${${match[1]}}`);return names.size===0?void 0:`${label3}: ${[...names].join(", ")} ${reason}`}var McpService=class{#disposed=!1;#disposeCount=0;#lastDisposeReason=null;#sessionContext=null;#sessionStartCount=0;#lastSessionStartReason=null;#toolRefreshGeneration=0;#config=null;#authAgentDir;#authEnv;#elicitationUiProvider;#mcpInstructions="";#pendingAuth=new Map;#interactiveAuthServers=new Set;#promptCommandNames=new Set;#registrationListeners=new Set;#wireStatusListeners=new Set;#wireStatusRefreshQueue=Promise.resolve();#refreshActiveSetWhenNoTools=!1;#tierBRegistration;#toolSearchService;#sessionOptions={};#skillServerWarnings=new Set;#pi;#attachQueue=Promise.resolve();#deferredAttach=new McpDeferredAttach;#latestWireStatus={servers:[]};#wireStatusBySession=new Map;#connections=new Map;#connectionKeysByName=new Map;#outputArtifacts=new McpOutputArtifacts;#registry;#shareConnections;constructor(options={}){this.#registry=options.mcpRegistry??new HostMcpRegistry,this.#shareConnections=options.mcpRegistry!==void 0}async attachSession(event,ctx,_pi,options={}){let attach=this.#attachQueue.then(async()=>{this.#sessionContext=ctx,this.#skillServerWarnings.clear(),this.#sessionStartCount+=1,this.#lastSessionStartReason=event.reason;let sessionOptions=options.agentDir===void 0?{...options,agentDir:getAgentDir()}:options,config=loadMcpConfig({agentDir:sessionOptions.agentDir,cwd:ctx.cwd,env:sessionOptions.env,projectTrusted:sessionOptions.projectTrusted??ctx.isProjectTrusted()});if(mergeExtensionMcpServers(config,ctx.getRegisteredMcpServers?.()??[]),this.#config=config,this.#pi=_pi,_pi!==void 0){let activationRuntime={getActiveTools:()=>_pi.getActiveTools(),setActiveTools:names=>_pi.setActiveTools([...names])},sessionToolSearch=getToolSearchServiceForExtension(_pi);if(sessionToolSearch!==void 0)this.#toolSearchService=sessionToolSearch,sessionToolSearch.bindActivationRuntime(activationRuntime);else try{this.#toolSearchService=getToolSearchService(),this.#toolSearchService.bindActivationRuntime(activationRuntime)}catch{this.#toolSearchService=getToolSearchService({getAllTools:()=>[],...activationRuntime})}}this.#authAgentDir=sessionOptions.agentDir,this.#authEnv=sessionOptions.env,this.#sessionOptions=sessionOptions;let toolRefreshGeneration=this.#toolRefreshGeneration+1;this.#toolRefreshGeneration=toolRefreshGeneration,await this.#syncFromConfig(config,sessionOptions,event.reason!=="reload",_pi,toolRefreshGeneration),_pi!==void 0&&await this.#registerDirectTools(_pi),_pi!==void 0&&this.#rehydrateFromSessionHistory(ctx),shouldCaptureWireStatus(ctx)&&await this.refreshWireStatusSnapshot(ctx.sessionManager?.getSessionId?.())});this.#attachQueue=attach.then(()=>{},()=>{}),await attach}async attachSkillMcpServers(declared){let config=this.#config,pi=this.#pi;if(config===null||pi===void 0)return[];let warnings=[],projectTrusted=this.#sessionOptions.projectTrusted??this.#sessionContext?.isProjectTrusted()??!1,added=0;for(let[name,decl]of declared){let existing=config.servers[name];if(existing!==void 0&&existing.source!=="skill"){warnings.push(`MCP server '${name}' from skill ${decl.sourcePath} collides with the ${existing.source} config; system config wins.`);continue}let{server:resolved,warning}=resolveSkillMcpServer(name,decl.raw,decl.sourcePath,{env:this.#sessionOptions.env,skillName:decl.skillName,trusted:decl.scope==="project"||decl.scope===void 0?projectTrusted:!0});warning!==void 0&&!this.#skillServerWarnings.has(warning)&&(this.#skillServerWarnings.add(warning),warnings.push(warning)),resolved!==void 0&&(existing!==void 0&&existing.configHash===resolved.configHash||(config.servers[name]=resolved,added+=1))}if(added>0){let toolRefreshGeneration=this.#toolRefreshGeneration+1;this.#toolRefreshGeneration=toolRefreshGeneration,await this.#syncFromConfig(config,this.#sessionOptions,!1,pi,toolRefreshGeneration),await this.#registerDirectTools(pi),this.#sessionContext!==null&&shouldCaptureWireStatus(this.#sessionContext)&&await this.refreshWireStatusSnapshot(this.#sessionContext.sessionManager?.getSessionId?.())}return warnings}getTierBSearchable(){return this.#tierBRegistration?.searchable??[]}getMcpPromptServers(){return this.#tierBRegistration?.promptServers??[]}getMcpResourceServers(){return this.#tierBRegistration?.resourceServers??[]}onMcpRegistrationChanged(listener){return this.#registrationListeners.add(listener),()=>this.#registrationListeners.delete(listener)}whenAttachSettled(timeoutMs=MCP_ATTACH_SETTLE_TIMEOUT_MS){return this.#deferredAttach.wait(timeoutMs)}onWireStatusChanged(listener){return this.#wireStatusListeners.add(listener),()=>this.#wireStatusListeners.delete(listener)}async refreshWireStatusSnapshot(sessionId){let refresh=this.#wireStatusRefreshQueue.then(()=>this.#captureWireStatus(sessionId));return this.#wireStatusRefreshQueue=refresh.then(()=>{},()=>{}),await refresh,this.getWireStatusSnapshot(sessionId)}activateSkillMcpTools(names){this.#tierBRegistration?.activate(names)}#rehydrateFromSessionHistory(ctx){let entries=ctx.sessionManager?.getEntries()??[];entries.length!==0&&this.rehydrateActiveToolsFromHistory(entries)}async handleSessionShutdown(event){shouldDisposeMcpService(event.reason)&&await this.dispose(event.reason)}async dispose(reason){if(this.#disposed)return;this.#disposed=!0,this.#disposeCount+=1,this.#lastDisposeReason=reason,this.#sessionContext=null,this.#config=null,this.#elicitationUiProvider=void 0,this.#mcpInstructions="",this.#pendingAuth.clear(),this.#interactiveAuthServers.clear(),this.#promptCommandNames.clear(),this.#registrationListeners.clear(),this.#wireStatusListeners.clear(),this.#wireStatusBySession.clear(),this.#latestWireStatus={servers:[]},this.#deferredAttach.clear();let entries=[...this.#connections.values()];this.#connections.clear(),this.#connectionKeysByName.clear(),await Promise.all(entries.map(entry=>disposeEntryConnection(entry,this.#registry,this))),await cleanupMcpOutputArtifacts(this.#outputArtifacts)}getMcpOutputArtifacts(){return this.#outputArtifacts}isDisposed(){return this.#disposed}getConnection(name){let key=this.#connectionKeysByName.get(name);return key===void 0?void 0:this.#connections.get(key)?.connection}async reconnectServer(name){let entry=this.#entryForName(name);if(entry===void 0)throw new Error(`Unknown MCP server: ${name||"<missing>"}`);await reconnectMcpNow(entry.connection)}getServerSnapshots(){let names=new Set(Object.keys(this.#config?.servers??{}));for(let entry of this.#connections.values())names.add(entry.name);return[...names].sort().map(name=>this.#serverSnapshot(name))}getLogLines(name,maxLines){let key=this.#connectionKeysByName.get(name),lines=key===void 0?[]:this.#connections.get(key)?.logger.getRingBuffer()??[];return lines.slice(Math.max(0,lines.length-maxLines))}async getServerExposureStatus(name){return await getMcpServiceExposureStatus(name,this.#config,this.#entryForName(name))}recordCall(name,elapsedMs,failed){let key=this.#connectionKeysByName.get(name),entry=key===void 0?void 0:this.#connections.get(key);entry!==void 0&&(entry.counters.callCount+=1,entry.counters.totalLatencyMs+=elapsedMs,failed&&(entry.counters.errorCount+=1))}getSnapshot(){return{disposed:this.#disposed,disposeCount:this.#disposeCount,lastDisposeReason:this.#lastDisposeReason,sessionStartCount:this.#sessionStartCount,lastSessionStartReason:this.#lastSessionStartReason,hasSessionContext:this.#sessionContext!==null,connectionCount:this.#connections.size}}getWireStatusSnapshot(sessionId){return sessionId===void 0?this.#latestWireStatus:this.#wireStatusBySession.get(sessionId)??{servers:[]}}async#syncFromConfig(config,options,useCache,pi,toolRefreshGeneration){let cache2=await readMcpCatalogCache(options.agentDir),hadConnectionsBeforeSync=this.#connections.size>0;this.#refreshActiveSetWhenNoTools=Object.keys(config.servers).length>0||hadConnectionsBeforeSync;let wanted=new Map;visitSpawnableMcpServers(config,(name,server)=>{wanted.set(name,server)});let disposals=[];for(let entry of this.#connections.values()){let server=wanted.get(entry.name);(server?.configHash===void 0?void 0:`${entry.name}\0${server.configHash}`)!==entry.key&&(this.#connections.delete(entry.key),this.#connectionKeysByName.delete(entry.name),disposals.push(disposeEntryConnection(entry,this.#registry,this)))}await Promise.all(disposals);let connects=[];for(let[name,server]of wanted){if(server.config===void 0||server.configHash===void 0)continue;let key=`${name}\0${server.configHash}`;if(this.#connections.has(key))continue;let entry=createMcpSessionConnection({registry:this.#registry,share:this.#shareConnections,owner:this,key,name,configHash:server.configHash,config:server.config,session:options,cwd:this.#sessionContext?.cwd??process.cwd(),ui:()=>this.getMcpElicitationUi(),artifacts:this.#outputArtifacts,shouldReconnect:current=>!this.#disposed&&this.#entryForName(name)===current}),cachedCatalog=useCache?getValidCachedServer(cache2,name,server.configHash):void 0;entry.cachedCatalog=cachedCatalog,this.#connections.set(key,entry),this.#connectionKeysByName.set(name,key),this.#wireListChanged(entry),(shouldRaceMcpStartup(server.config.lifecycle)||cachedCatalog===void 0)&&connects.push(raceMcpStartupConnect({entry,pi,registerDirectTools:async targetPi=>{await this.#registerDirectTools(targetPi),this.#sessionContext!==null&&this.#rehydrateFromSessionHistory(this.#sessionContext),refreshMcpInstructionsForSession(this)},serverConfig:server.config,shouldRefreshTools:()=>!this.#disposed&&this.#toolRefreshGeneration===toolRefreshGeneration,deadlineMs:resolveMcpStartupTimeoutMs(server.config.startupTimeoutMs),onDeferred:settled=>this.#deferredAttach.track(settled)}))}await Promise.all(connects)}#wireListChanged(entry){let sink={logger:{error:(message,data)=>entry.logger.error(message,data)}};entry.disposeListChanged=subscribeMcpToolsChanged(entry,connectOnly=>this.#handleServerToolsChanged(entry,connectOnly),sink);let unsubscribeState=entry.connection.onStateChange(()=>{let ctx=this.#sessionContext;ctx?.mode==="rpc"&&this.refreshWireStatusSnapshot(ctx.sessionManager?.getSessionId?.()).catch(error2=>{entry.logger.error("Failed to refresh MCP control inventory",error2)})});entry.disposeWireStatus=unsubscribeState}async#handleServerToolsChanged(entry,connectOnly){let pi=this.#pi,config=this.#config;pi===void 0||config===null||await refreshMcpToolsOnListChanged(entry,pi,config,target=>this.#registerDirectTools(target),connectOnly)}async#registerDirectTools(pi){let config=this.#config;if(config===null)return;let toolSearchService=this.#toolSearchService;if(toolSearchService===void 0)return;this.#tierBRegistration=await registerMcpServiceDirectTools(pi,config,this.#connections.values(),toolSearchService,{refreshActiveSetWhenEmpty:this.#refreshActiveSetWhenNoTools});let ctx=this.#sessionContext;ctx?.mode==="rpc"&&await this.refreshWireStatusSnapshot(ctx.sessionManager?.getSessionId?.());for(let listener of this.#registrationListeners)listener()}rehydrateActiveToolsFromHistory(messages){return this.#toolSearchService?.maybeRehydrateFromHistory(messages)??[]}maybeRehydrateFromHistory(messages){return this.#toolSearchService?.maybeRehydrateFromHistory(messages)??[]}#serverSnapshot(name){let connection=this.getConnection(name);return connection?.refreshCapturedDiagnostics(),buildMcpServerSnapshot(name,this.#config?.servers[name],connection,this.#entryForName(name))}async#captureWireStatus(sessionId){let config=this.#config;if(config===null)return;let snapshot={servers:await Promise.all(Object.keys(config.servers).sort().map(name=>this.#captureWireStatusServer(name,config.servers[name])))},previous=this.getWireStatusSnapshot(sessionId);if(this.#latestWireStatus=snapshot,sessionId!==void 0&&this.#wireStatusBySession.set(sessionId,snapshot),JSON.stringify(previous)!==JSON.stringify(snapshot))for(let listener of this.#wireStatusListeners)listener(sessionId,snapshot)}async#captureWireStatusServer(name,server){let entry=this.#entryForName(name),connection=entry?.connection,connected=connection?.state==="connected",cached=entry?.cachedCatalog,tools=cached?.tools??[],resources=cached?.resources??[],resourceTemplates=[],serverInfo=null;if(connected&&connection!==void 0){let client=connection.client,version=client.getServerVersion();version!==void 0&&(serverInfo=mapWireServerInfo(version));try{tools=(await collectAllPages(cursor=>client.listTools(cursor===void 0?{}:{cursor}))).items}catch(error2){if(!(error2 instanceof Error))throw error2;tools=cached?.tools??[]}try{resources=(await collectAllPages(cursor=>client.listResources(cursor===void 0?{}:{cursor}))).items}catch(error2){if(!(error2 instanceof Error))throw error2;resources=cached?.resources??[]}try{resourceTemplates=(await collectAllPages(cursor=>client.listResourceTemplates(cursor===void 0?{}:{cursor}))).items}catch(error2){if(!(error2 instanceof Error))throw error2;resourceTemplates=[]}}return{name,serverInfo,tools:tools.map(mapWireTool),resources:resources.map(mapWireResource),resourceTemplates:resourceTemplates.map(mapWireResourceTemplate),authStatus:wireAuthStatus(entry,server),...connection?.state===void 0&&server?.state===void 0?{}:{status:connection?.state??server?.state}}}#entryForName(name){let key=this.#connectionKeysByName.get(name);return key===void 0?void 0:this.#connections.get(key)}setMcpInstructions(instructions){this.#mcpInstructions=instructions}getMcpInstructions(){return this.#mcpInstructions}setMcpElicitationUiProvider(provider){this.#elicitationUiProvider=provider}getMcpElicitationUi(){return this.#elicitationUiProvider?.()}isMcpPromptCommandRegistered(name){return this.#promptCommandNames.has(name)}markMcpPromptCommandRegistered(name){this.#promptCommandNames.add(name)}beginInteractiveAuth(serverName2){return this.#interactiveAuthServers.has(serverName2)?!1:(this.#interactiveAuthServers.add(serverName2),!0)}endInteractiveAuth(serverName2){this.#interactiveAuthServers.delete(serverName2)}getPendingAuth(){return this.#pendingAuth}getAuthTarget(name){let server=this.#config?.servers[name];if(server?.config!==void 0)return{config:server.config,agentDir:this.#authAgentDir,env:this.#authEnv,callbackUrl:this.#config?.settings.oauthCallbackUrl}}getCachedInstructions(name){return this.#entryForName(name)?.cachedCatalog?.instructions}getNativeToolSearchSetting(){return this.#config?.settings.nativeToolSearch}};function wireAuthStatus(entry,server){let mode=entry?.authPlan?.mode??(server?.config===void 0?"none":resolveAuthMode(server.config));switch(mode){case"none":return"unsupported";case"bearer":return entry?.connection.state==="needs_auth"?"notLoggedIn":"bearerToken";case"oauth":return entry?.authPlan?.provider?.tokens()===void 0?"notLoggedIn":"oAuth";default:return assertNever(mode)}}function shouldCaptureWireStatus(ctx){return ctx.mode==="app-server"||ctx.mode==="rpc"}function mapWireServerInfo(info){return{name:info.name,title:info.title??null,version:info.version,description:info.description??null,icons:info.icons?.map(toWireJsonValue)??null,websiteUrl:info.websiteUrl??null}}function mapWireTool(tool){return{name:tool.name,...tool.title===void 0?{}:{title:tool.title},...tool.description===void 0?{}:{description:tool.description},inputSchema:toWireJsonValue(tool.inputSchema),...tool.outputSchema===void 0?{}:{outputSchema:toWireJsonValue(tool.outputSchema)},...tool.annotations===void 0?{}:{annotations:toWireJsonValue(tool.annotations)},...tool.icons===void 0?{}:{icons:tool.icons.map(toWireJsonValue)},...tool._meta===void 0?{}:{_meta:toWireJsonValue(tool._meta)}}}function mapWireResource(resource){return{uri:resource.uri,name:resource.name,...resource.title===void 0?{}:{title:resource.title},...resource.description===void 0?{}:{description:resource.description},...resource.mimeType===void 0?{}:{mimeType:resource.mimeType},...resource.size===void 0?{}:{size:resource.size},...resource.annotations===void 0?{}:{annotations:toWireJsonValue(resource.annotations)},...resource.icons===void 0?{}:{icons:resource.icons.map(toWireJsonValue)},...resource._meta===void 0?{}:{_meta:toWireJsonValue(resource._meta)}}}function mapWireResourceTemplate(template){return{uriTemplate:template.uriTemplate,name:template.name,...template.title===void 0?{}:{title:template.title},...template.description===void 0?{}:{description:template.description},...template.mimeType===void 0?{}:{mimeType:template.mimeType},...template.annotations===void 0?{}:{annotations:toWireJsonValue(template.annotations)},...template.icons===void 0?{}:{icons:template.icons.map(toWireJsonValue)},...template._meta===void 0?{}:{_meta:toWireJsonValue(template._meta)}}}function toWireJsonValue(value2){if(value2===null||typeof value2=="boolean"||typeof value2=="number"||typeof value2=="string")return value2;if(Array.isArray(value2))return value2.map(toWireJsonValue);if(isRecord41(value2)){let object={};for(let[key,child]of Object.entries(value2))object[key]=toWireJsonValue(child);return object}return null}function isRecord41(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function assertNever(value2){throw new Error(`Unhandled MCP auth mode: ${JSON.stringify(value2)}`)}var service=null;function getMcpService(){return(service===null||service.isDisposed())&&(service=new McpService),service}function shouldDisposeMcpService(reason){return reason==="quit"||reason==="reload"}async function buildMcpStatusRows(snapshots2,getExposureStatus){return Promise.all(snapshots2.map(async snapshot=>({exposure:await getExposureStatus(snapshot.name),snapshot})))}function formatMcpStatus(title,rows){return[title,...rows.map(formatRow)].join(`
1252
+ `,1)[0].slice(0,80)}var managedNamesByRegistrar=new WeakMap,promotedNamesByRegistrar=new WeakMap;function registerMcpTierBTools(pi,input,toolSearchService,warn){let named=mapMcpCatalogNames(input.registeredEntries,warn),searchable=named.map(({entry,name})=>({name,toolName:entry.tool,description:entry.description,server:entry.server})),documents=named.map(({entry,name})=>({name,label:entry.tool,aliases:[entry.tool],description:entry.description,keywords:[],source:"mcp",group:entry.server,ownerLabel:entry.server,registrationId:deriveMcpRegistrationId(entry.server,entry.tool)})),fullDefs=buildMcpToolDefinitions(input.registeredEntries,warn),fullByName=new Map(fullDefs.map(def=>[def.name,def])),gatewayNames=[];for(let gateway of input.proxyGateways??[]){let tool=createMcpProxyTool(gateway.server,gateway.entries);pi.registerTool(tool),gatewayNames.push(tool.name)}for(let tool of input.utilityTools??[])pi.registerTool(tool),gatewayNames.push(tool.name);let activeMcpNames=[...mapMcpCatalogNames(input.activeEntries).map(({name})=>name),...gatewayNames],managedNames=new Set([...fullDefs.map(def=>def.name),...gatewayNames]),previousManagedNames=managedNamesByRegistrar.get(pi)??new Set;managedNamesByRegistrar.set(pi,managedNames);let stubSwap=input.searchMode&&input.settings.stubSwap===!0,stubbed=new Set,registeredNames=new Set(fullDefs.map(def=>def.name)),catalogNames=new Set(toolSearchService.getCatalog().map(doc=>doc.name)),activate=names=>{let known=[...new Set(names.filter(name=>registeredNames.has(name)))];if(known.length===0)return;stubSwap&&swapStubsToFull(pi,known,stubbed,fullByName);let current=pi.getActiveTools();pi.setActiveTools(orderActiveSet(unionStable(current,known),current,catalogNames))};toolSearchService.feed("mcp",input.searchMode?documents:[],{activate});for(let doc of toolSearchService.getCatalog())catalogNames.add(doc.name);let reference=pi.getActiveTools(),currentBase=reference.filter(name=>!isLegacyMcpRegistrationName(name)&&!previousManagedNames.has(name)&&!managedNames.has(name));if(!input.searchMode)return registerToolsPreservingActiveSet(pi,fullDefs,orderActiveSet([...currentBase,...activeMcpNames],reference,catalogNames)),{activate,searchable};if(!stubSwap){let active2=orderActiveSet([...currentBase,...activeMcpNames],reference,catalogNames);return registerToolsPreservingActiveSet(pi,fullDefs,active2),{activate,searchable}}let directActive=new Set(activeMcpNames),promoted=promotedNamesByRegistrar.get(pi)??new Set;promotedNamesByRegistrar.set(pi,promoted);let toRegister=fullDefs.map(def=>directActive.has(def.name)||promoted.has(def.name)?def:(stubbed.add(def.name),buildMcpStubDefinition(def.name,{full:def,promote:()=>activate([def.name])}))),active=orderActiveSet([...currentBase,...fullDefs.map(def=>def.name)],reference,catalogNames);return registerToolsPreservingActiveSet(pi,toRegister,active),{activate,searchable}}function swapStubsToFull(pi,names,stubbed,fullByName){for(let name of names){if(!stubbed.has(name))continue;let full=fullByName.get(name);full!==void 0&&(pi.registerTool(full),stubbed.delete(name),promotedNamesByRegistrar.get(pi)?.add(name))}}function orderActiveSet(names,reference,catalogNames){let unique3=[...new Set(names)],rank=new Map(reference.map((name,index)=>[name,index])),base=unique3.filter(name=>!catalogNames.has(name)).sort((a,b)=>(rank.get(a)??Number.MAX_SAFE_INTEGER)-(rank.get(b)??Number.MAX_SAFE_INTEGER)),catalog=unique3.filter(name=>catalogNames.has(name)).sort();return[...base,...catalog]}function unionStable(current,added){return[...new Set([...current,...added])]}function isLegacyMcpRegistrationName(name){return name.startsWith("mcp_")}function buildMcpStubDefinition(name,promotion){return{name,label:name,description:promotion===void 0?`Inactive MCP tool. Run tool_search to activate ${name}, then call it on your next turn.`:`Deferred MCP tool. Call ${name} with its real arguments; it activates and runs on this first call (tool_search lists its schema).`,parameters:typebox_exports.Object({},{additionalProperties:!0}),executionMode:"parallel",async execute(toolCallId,params,signal,onUpdate,ctx){return promotion===void 0?{content:[{type:"text",text:`${name} is not active. Use tool_search to activate it, then call it.`}],details:void 0}:(promotion.promote(),promotion.full.execute(toolCallId,params,signal,onUpdate,ctx))},renderCall(_args,theme2){return new Text(theme2.fg("toolOutput",`${name} (deferred stub)`),0,0)}}}async function registerDirectMcpTools(pi,config,entries,toolSearchService,options={}){let registeredEntries=[],activeEntries=[],searchMode=!1,proxyGateways=[],resourceServers=[],promptServers=[],recordRegisteredListings=[];for(let entry of entries){let server=config.servers[entry.name];if(server?.config===void 0)continue;let catalog=entry.cachedCatalog===void 0?entry.connection.state==="connected"&&entry.startupCatalogPending!==!0?await collectToolCatalog(entry.name,entry.connection,server.config,{agentDir:entry.agentDir,artifacts:entry.artifacts,ensureFresh:entry.ensureFresh,outputGuard:config.settings.outputGuard}):[]:cachedToolsToCatalogEntries(entry.name,entry.cachedCatalog,entry.connection,server.config.requestTimeoutMs,entry.ensureCachedToolConnected??(()=>entry.connection.connect().then(()=>{})),{agentDir:entry.agentDir,artifacts:entry.artifacts,ensureFresh:entry.ensureFresh,outputGuard:config.settings.outputGuard}),identity=mcpRegistrationIdentity(catalog,entry.cachedCatalog);recordRegisteredListings.push(()=>entry.onRegistered?.(identity));let cachedPrompts=entry.cachedCatalog?.prompts??[];cachedPrompts.length>0&&promptServers.push({connection:entry.connection,prompts:cachedPrompts,requestTimeoutMs:server.config.requestTimeoutMs,server:entry.name});let cachedResources=entry.cachedCatalog?.resources??[];cachedResources.length>0&&resourceServers.push({agentDir:entry.agentDir,artifacts:entry.artifacts,connection:entry.connection,outputGuard:config.settings.outputGuard,requestTimeoutMs:server.config.requestTimeoutMs,resources:cachedResources,server:entry.name});let policy=computeMcpExposurePolicy(catalog,server.config,config.settings);for(let warning of policy.warnings)entry.logger.warn(warning);policy.mode==="search"&&(searchMode=!0),policy.mode==="proxy"&&proxyGateways.push({entries:[...policy.filteredEntries],server:entry.name}),registeredEntries.push(...policy.registeredEntries),activeEntries.push(...policy.activeEntries)}if(registeredEntries.length===0&&activeEntries.length===0&&!searchMode&&proxyGateways.length===0&&options.refreshActiveSetWhenEmpty!==!0){for(let record7 of recordRegisteredListings)record7();return}let utilityTools=resourceServers.length>0?createMcpResourceTools(()=>resourceServers):[],registration=registerMcpTierBTools(pi,{activeEntries,proxyGateways,registeredEntries,searchMode,settings:config.settings,utilityTools},toolSearchService,message=>createMcpLogger("service").warn(message));for(let record7 of recordRegisteredListings)record7();return{...registration,promptServers,resourceServers}}async function registerMcpServiceDirectTools(pi,config,entries,toolSearchService,options={}){return await registerDirectMcpTools(pi,config,[...entries].map(entry=>{let serverConfig=config.servers[entry.name]?.config,claim=entry.startupCatalogClaim,startupCatalogPending=claim?.ownsRegistration()===!0;return{agentDir:entry.agentDir,artifacts:entry.artifacts,cachedCatalog:startupCatalogPending?claim?.cachedCatalog:entry.cachedCatalog,startupCatalogPending,onRegistered:identity=>options.onRegistered?.(entry,identity),connection:entry.connection,ensureFresh:()=>entry.authPlan?.refresh?.ensureFresh().then(()=>{})??Promise.resolve(),ensureCachedToolConnected:()=>connectAndRefreshMcpCatalog(entry,serverConfig),logger:entry.logger,name:entry.name}}),toolSearchService,{refreshActiveSetWhenEmpty:options.refreshActiveSetWhenEmpty})}function buildMcpServerSnapshot(name,server,connection,entry,now2=Date.now()){return{name,configState:server?.state??"removed",configHash:server?.configHash??null,source:server?.source??null,sourcePath:server?.sourcePath??null,lifecycleState:connection?.state==="idle"&&connection.generation===0&&entry?.cachedCatalog!==void 0?"cached":connection?.state??"not_spawned",generation:connection?.generation??null,pid:connection?.getRootPid()??null,lastError:connection?.lastError?.message??null,uptimeMs:entry===void 0?null:now2-entry.createdAtMs,counters:entry?.counters??{callCount:0,errorCount:0,totalLatencyMs:0,reconnectCount:0}}}function subscribeMcpToolsChanged(entry,refresh,sink){let changeReported=!1,coalescer=createMcpListChangeCoalescer({onRefresh:()=>{let connectOnly=!changeReported;return changeReported=!1,refresh(connectOnly)},scope:`mcp.list_changed.${entry.name}`,sink}),unsubscribe=entry.connection.onToolsChanged(event=>{event.cause!=="connect"&&(changeReported=!0),coalescer.notify()});return()=>{unsubscribe(),coalescer.dispose()}}async function refreshMcpToolsOnListChanged(entry,targets,config,connectOnly){let server=config.servers[entry.name];if(server?.config===void 0||entry.connection.state!=="connected"||connectOnly&&entry.startupCatalogClaim?.ownsRegistration()===!0)return;let registeredCatalog=entry.cachedCatalog;entry.connection instanceof SharedMcpLease&&(entry.cachedCatalog=await entry.connection.catalog());let catalog=await collectToolCatalog(entry.name,entry.connection,server.config,{agentDir:entry.agentDir,outputGuard:config.settings.outputGuard}),newNames=mapMcpCatalogNames(catalog).map(({name})=>name),knownNames=entry.knownToolNames??(registeredCatalog===void 0?newNames:mapMcpCatalogNames(cachedToolsToCatalogEntries(entry.name,registeredCatalog,entry.connection,server.config.requestTimeoutMs,async()=>{})).map(({name})=>name)),diff=diffMcpToolNames(knownNames,newNames),identity=mcpRegistrationIdentity(catalog,entry.cachedCatalog),initial=targets(),stale=connectOnly?initial.filter(target=>target.registeredIdentity()!==identity):initial;if(stale.length>0){entry.connection instanceof SharedMcpLease||(entry.cachedCatalog=await collectServerCatalogForCache(entry.connection,server.config,entry.configHash),await writeMcpCachedServer(entry.agentDir,entry.name,entry.cachedCatalog));let seen=new Set(initial.map(target=>target.pi)),failures=[],pending=stale;for(;pending.length>0;){for(let target of pending)try{for(let removed of diff.removed)target.pi.registerTool(buildMcpTombstoneDefinition(removed,entry.name));await target.register()}catch(error2){failures.push(error2)}pending=targets().filter(target=>!seen.has(target.pi));for(let target of pending)seen.add(target.pi)}if(failures.length>0)throw entry.knownToolNames=newNames,entry.lastListChangedDelta=formatMcpListChangedDelta(diff),new AggregateError(failures,`MCP ${entry.name} tool refresh failed in ${failures.length} of ${seen.size} session(s)`)}entry.knownToolNames=newNames,entry.lastListChangedDelta=formatMcpListChangedDelta(diff)}var ENV_REFERENCE=/\$\{([A-Za-z_][A-Za-z0-9_]*)/g,OWN_CONFIG_FIX="declare the server in your own mcp.json instead";function resolveSkillMcpServer(name,raw,sourcePath,source2){let label3=`Skill '${source2.skillName}' MCP server '${name}'`,declared=declareForTrust(name,raw,label3,source2);if(declared.declaration===void 0)return{warning:declared.warnings.join(" ")};let config={...normalizeServer(declared.declaration),directTools:[],exposure:"search"};inheritMcpSharingScope(raw,declared.declaration),inheritMcpSharingScope(declared.declaration,config);let server={config,configHash:hashConfig(config),name,source:"skill",sourcePath,state:config.enabled?"enabled":"disabled",transport:config.type};return declared.warnings.length===0?{server}:{server,warning:declared.warnings.join(" ")}}function declareForTrust(name,raw,label3,source2){if((raw.type??(raw.url?"http":"stdio"))!=="stdio")return declareRemote(raw,label3);if(!source2.trusted){let literal=[raw.command,raw.cwd,...raw.args??[],...Object.values(raw.env??{})],warning=literalWarning(label3,literal,"stays literal because the skill comes from an untrusted project; trust the project or move the server into your own mcp.json to expand it.");return{declaration:raw,warnings:warning===void 0?[]:[warning]}}try{return{declaration:interpolateValue(raw,`mcp.mcpServers.${name}`,source2.env??process.env),warnings:[]}}catch(error2){if(!(error2 instanceof McpConfigValidationError))throw error2;return{warnings:[`${label3} skipped: ${error2.message}`]}}}function declareRemote(raw,label3){let warnings=[],literal=literalWarning(label3,[raw.url,...Object.values(raw.headers??{})],`in url/headers stays literal: a skill-declared remote server never expands environment variables, because the skill chooses where they are sent; ${OWN_CONFIG_FIX}.`);if(literal!==void 0&&warnings.push(literal),!(raw.auth==="bearer"||raw.auth===void 0&&raw.bearerTokenEnv!==void 0)||raw.bearerTokenEnv===void 0)return{declaration:raw,warnings};warnings.push(`${label3}: bearerTokenEnv '${raw.bearerTokenEnv}' is ignored and no Authorization header is sent, because a skill-declared remote server must not send a parent environment variable to a server the skill chose; ${OWN_CONFIG_FIX}, where bearerTokenEnv keeps working.`);let{bearerTokenEnv:_dropped,...rest}=raw;return{declaration:{...rest,auth:!1},warnings}}function literalWarning(label3,values,reason){let names=new Set;for(let value2 of values)for(let match of value2?.matchAll(ENV_REFERENCE)??[])names.add(`\${${match[1]}}`);return names.size===0?void 0:`${label3}: ${[...names].join(", ")} ${reason}`}var McpService=class{#disposed=!1;#disposeCount=0;#lastDisposeReason=null;#sessionContext=null;#sessionStartCount=0;#lastSessionStartReason=null;#config=null;#authAgentDir;#authEnv;#elicitationUiProvider;#mcpInstructions="";#pendingAuth=new Map;#interactiveAuthServers=new Set;#promptCommandNames=new Set;#registrationListeners=new Set;#wireStatusListeners=new Set;#wireStatusRefreshQueue=Promise.resolve();#refreshActiveSetWhenNoTools=!1;#bindings=new Map;#pendingAttaches=0;#releasedSessions=new WeakSet;#deferredDisposeReason;#deferredDisposeWaiters=[];#sessionOptions={};#skillServerWarnings=new Set;#attachQueue=Promise.resolve();#deferredAttach=new McpDeferredAttach;#latestWireStatus={servers:[]};#wireStatusBySession=new Map;#connections=new Map;#connectionKeysByName=new Map;#outputArtifacts=new McpOutputArtifacts;#registry;#shareConnections;#servesManySessions;constructor(options={}){this.#registry=options.mcpRegistry??new HostMcpRegistry,this.#shareConnections=options.mcpRegistry!==void 0,this.#servesManySessions=options.servesManySessions===!0}async attachSession(event,ctx,_pi,options={}){this.#pendingAttaches+=1;let attach=this.#attachQueue.then(async()=>{if(this.#disposed)throw new Error("The MCP service is disposed; attach the session to a live service instead.");this.#sessionContext=ctx,this.#skillServerWarnings.clear(),this.#sessionStartCount+=1,this.#lastSessionStartReason=event.reason;let sessionOptions=options.agentDir===void 0?{...options,agentDir:getAgentDir()}:options,config=loadMcpConfig({agentDir:sessionOptions.agentDir,cwd:ctx.cwd,env:sessionOptions.env,projectTrusted:sessionOptions.projectTrusted??ctx.isProjectTrusted()});mergeExtensionMcpServers(config,ctx.getRegisteredMcpServers?.()??[]),this.#config=config;let binding=_pi===void 0||this.#releasedSessions.has(_pi)?void 0:this.#bind(_pi,ctx);this.#authAgentDir=sessionOptions.agentDir,this.#authEnv=sessionOptions.env,this.#sessionOptions=sessionOptions,await this.#syncFromConfig(config,sessionOptions,event.reason!=="reload",binding),binding!==void 0&&await this.#registerDirectTools(binding),binding!==void 0&&this.#rehydrateFromSessionHistory(binding),shouldCaptureWireStatus(ctx)&&await this.refreshWireStatusSnapshot(ctx.sessionManager?.getSessionId?.())});this.#attachQueue=attach.then(()=>{},()=>{});try{await attach}finally{this.#pendingAttaches-=1,await this.#disposeIfDeferredAndIdle()}}async#disposeIfDeferredAndIdle(){let reason=this.#deferredDisposeReason;if(!(reason===void 0||this.#pendingAttaches>0)){this.#deferredDisposeReason=void 0,this.#liveBindings().length===0&&await this.dispose(reason);for(let settle of this.#deferredDisposeWaiters.splice(0))settle()}}#bind(pi,ctx){let activationRuntime={getActiveTools:()=>pi.getActiveTools(),setActiveTools:names=>pi.setActiveTools([...names])},previous=this.#bindings.get(pi);this.#servesManySessions||this.#bindings.clear();let fallbackToolSearch,holdsProcessFallback=!1,sessionToolSearch=getToolSearchServiceForExtension(pi);if(sessionToolSearch!==void 0)sessionToolSearch.bindActivationRuntime(activationRuntime);else if(this.#liveBindings().some(other=>other.pi!==pi&&other.holdsProcessFallback))fallbackToolSearch=new ToolSearchService({getAllTools:()=>[],...activationRuntime});else{holdsProcessFallback=!0;try{fallbackToolSearch=getToolSearchService(),fallbackToolSearch.bindActivationRuntime(activationRuntime)}catch{fallbackToolSearch=getToolSearchService({getAllTools:()=>[],...activationRuntime})}}let binding={pi,fallbackToolSearch,holdsProcessFallback,context:ctx,registeredIdentities:previous?.registeredIdentities??new Map,registration:previous?.registration};return this.#bindings.delete(pi),this.#bindings.set(pi,binding),binding}#toolSearchFor(binding){return getToolSearchServiceForExtension(binding.pi)??binding.fallbackToolSearch}#liveBindings(){for(let[pi,binding]of this.#bindings)getToolSearchServiceForExtension(binding.pi)?.isDisposed===!0&&this.#bindings.delete(pi);return[...this.#bindings.values()]}#bindingFor(pi){return pi===void 0?this.#liveBindings().at(-1):this.#bindings.get(pi)}async releaseSession(pi,disposeReason){let released=this.#bindings.get(pi);this.#bindings.delete(pi),disposeReason!==void 0&&this.#releasedSessions.add(pi);let latest=this.#liveBindings().at(-1);if(latest!==void 0){released!==void 0&&this.#sessionContext===released.context&&(this.#sessionContext=latest.context);return}if(disposeReason===void 0)return;if(this.#pendingAttaches===0){await this.dispose(disposeReason);return}this.#deferredDisposeReason=disposeReason;let settled=new Promise(settle=>this.#deferredDisposeWaiters.push(()=>settle("settled"))),deadlineMs=resolveMcpDeferredDisposeTimeoutMs(),timer,outcome=await Promise.race([settled,new Promise(expire=>{timer=safeTimer("deferred-dispose",deadlineMs,()=>expire("timeout"),{logger:createMcpLogger("service")})})]);if(clearTimeout(timer),!(outcome==="settled"||this.#deferredDisposeReason===void 0)){this.#deferredDisposeReason=void 0,createMcpLogger("service").warn("MCP attach still pending at the dispose deadline; disposing anyway",{timeoutMs:deadlineMs,reason:disposeReason}),this.#liveBindings().length===0&&await this.dispose(disposeReason);for(let settle of this.#deferredDisposeWaiters.splice(0))settle()}}async attachSkillMcpServers(declared,pi){let config=this.#config,binding=this.#bindingFor(pi);if(config===null||binding===void 0)return[];let warnings=[],projectTrusted=this.#sessionOptions.projectTrusted??this.#sessionContext?.isProjectTrusted()??!1,added=0;for(let[name,decl]of declared){let existing=config.servers[name];if(existing!==void 0&&existing.source!=="skill"){warnings.push(`MCP server '${name}' from skill ${decl.sourcePath} collides with the ${existing.source} config; system config wins.`);continue}let{server:resolved,warning}=resolveSkillMcpServer(name,decl.raw,decl.sourcePath,{env:this.#sessionOptions.env,skillName:decl.skillName,trusted:decl.scope==="project"||decl.scope===void 0?projectTrusted:!0});warning!==void 0&&!this.#skillServerWarnings.has(warning)&&(this.#skillServerWarnings.add(warning),warnings.push(warning)),resolved!==void 0&&(existing!==void 0&&existing.configHash===resolved.configHash||(config.servers[name]=resolved,added+=1))}return added>0&&(await this.#syncFromConfig(config,this.#sessionOptions,!1,binding),await this.#registerDirectTools(binding),this.#sessionContext!==null&&shouldCaptureWireStatus(this.#sessionContext)&&await this.refreshWireStatusSnapshot(this.#sessionContext.sessionManager?.getSessionId?.())),warnings}getTierBSearchable(pi){return this.#bindingFor(pi)?.registration?.searchable??[]}getMcpPromptServers(pi){return this.#bindingFor(pi)?.registration?.promptServers??[]}getMcpResourceServers(pi){return this.#bindingFor(pi)?.registration?.resourceServers??[]}onMcpRegistrationChanged(listener){return this.#registrationListeners.add(listener),()=>this.#registrationListeners.delete(listener)}whenAttachSettled(timeoutMs=MCP_ATTACH_SETTLE_TIMEOUT_MS){return this.#deferredAttach.wait(timeoutMs)}onWireStatusChanged(listener){return this.#wireStatusListeners.add(listener),()=>this.#wireStatusListeners.delete(listener)}async refreshWireStatusSnapshot(sessionId){let refresh=this.#wireStatusRefreshQueue.then(()=>this.#captureWireStatus(sessionId));return this.#wireStatusRefreshQueue=refresh.then(()=>{},()=>{}),await refresh,this.getWireStatusSnapshot(sessionId)}activateSkillMcpTools(names,pi){this.#bindingFor(pi)?.registration?.activate(names)}#rehydrateFromSessionHistory(binding){let entries=binding.context.sessionManager?.getEntries()??[];entries.length!==0&&this.#toolSearchFor(binding)?.maybeRehydrateFromHistory(entries)}async handleSessionShutdown(event){shouldDisposeMcpService(event.reason)&&await this.dispose(event.reason)}async dispose(reason){if(this.#disposed)return;this.#disposed=!0,this.#disposeCount+=1,this.#lastDisposeReason=reason,this.#bindings.clear(),this.#sessionContext=null,this.#config=null,this.#elicitationUiProvider=void 0,this.#mcpInstructions="",this.#pendingAuth.clear(),this.#interactiveAuthServers.clear(),this.#promptCommandNames.clear(),this.#registrationListeners.clear(),this.#wireStatusListeners.clear(),this.#wireStatusBySession.clear(),this.#latestWireStatus={servers:[]},this.#deferredAttach.clear();let entries=[...this.#connections.values()];this.#connections.clear(),this.#connectionKeysByName.clear(),await Promise.all(entries.map(entry=>disposeEntryConnection(entry,this.#registry,this))),await cleanupMcpOutputArtifacts(this.#outputArtifacts)}getMcpOutputArtifacts(){return this.#outputArtifacts}isDisposed(){return this.#disposed}getConnection(name){let key=this.#connectionKeysByName.get(name);return key===void 0?void 0:this.#connections.get(key)?.connection}async reconnectServer(name){let entry=this.#entryForName(name);if(entry===void 0)throw new Error(`Unknown MCP server: ${name||"<missing>"}`);await reconnectMcpNow(entry.connection)}getServerSnapshots(){let names=new Set(Object.keys(this.#config?.servers??{}));for(let entry of this.#connections.values())names.add(entry.name);return[...names].sort().map(name=>this.#serverSnapshot(name))}getLogLines(name,maxLines){let key=this.#connectionKeysByName.get(name),lines=key===void 0?[]:this.#connections.get(key)?.logger.getRingBuffer()??[];return lines.slice(Math.max(0,lines.length-maxLines))}async getServerExposureStatus(name){return await getMcpServiceExposureStatus(name,this.#config,this.#entryForName(name))}recordCall(name,elapsedMs,failed){let key=this.#connectionKeysByName.get(name),entry=key===void 0?void 0:this.#connections.get(key);entry!==void 0&&(entry.counters.callCount+=1,entry.counters.totalLatencyMs+=elapsedMs,failed&&(entry.counters.errorCount+=1))}getSnapshot(){return{disposed:this.#disposed,disposeCount:this.#disposeCount,lastDisposeReason:this.#lastDisposeReason,sessionStartCount:this.#sessionStartCount,lastSessionStartReason:this.#lastSessionStartReason,hasSessionContext:this.#sessionContext!==null,connectionCount:this.#connections.size}}getWireStatusSnapshot(sessionId){return sessionId===void 0?this.#latestWireStatus:this.#wireStatusBySession.get(sessionId)??{servers:[]}}async#syncFromConfig(config,options,useCache,binding){let cache2=await readMcpCatalogCache(options.agentDir),hadConnectionsBeforeSync=this.#connections.size>0;this.#refreshActiveSetWhenNoTools=Object.keys(config.servers).length>0||hadConnectionsBeforeSync;let wanted=new Map;visitSpawnableMcpServers(config,(name,server)=>{wanted.set(name,server)});let disposals=[];for(let entry of this.#connections.values()){let server=wanted.get(entry.name);(server?.configHash===void 0?void 0:`${entry.name}\0${server.configHash}`)!==entry.key&&(this.#connections.delete(entry.key),this.#connectionKeysByName.delete(entry.name),disposals.push(disposeEntryConnection(entry,this.#registry,this)))}await Promise.all(disposals);let connects=[];for(let[name,server]of wanted){if(server.config===void 0||server.configHash===void 0)continue;let key=`${name}\0${server.configHash}`;if(this.#connections.has(key))continue;let entry=createMcpSessionConnection({registry:this.#registry,share:this.#shareConnections,owner:this,key,name,configHash:server.configHash,config:server.config,session:options,cwd:this.#sessionContext?.cwd??process.cwd(),ui:()=>this.getMcpElicitationUi(),artifacts:this.#outputArtifacts,shouldReconnect:current=>!this.#disposed&&this.#entryForName(name)===current}),cachedCatalog=useCache?getValidCachedServer(cache2,name,server.configHash):void 0;entry.cachedCatalog=cachedCatalog,this.#connections.set(key,entry),this.#connectionKeysByName.set(name,key),this.#wireListChanged(entry),(shouldRaceMcpStartup(server.config.lifecycle)||cachedCatalog===void 0)&&connects.push(raceMcpStartupConnect({entry,pi:binding?.pi,registerDirectTools:async()=>{let failures=[];for(let live of this.#liveBindings())try{await this.#registerDirectTools(live),this.#rehydrateFromSessionHistory(live)}catch(error2){failures.push(error2)}if(refreshMcpInstructionsForSession(this),failures.length>0)throw new AggregateError(failures,`MCP ${name} catalog failed to register in ${failures.length} session(s)`)},serverConfig:server.config,shouldRefreshTools:()=>!this.#disposed&&this.#entryForName(name)===entry,deadlineMs:resolveMcpStartupTimeoutMs(server.config.startupTimeoutMs),onDeferred:settled=>this.#deferredAttach.track(settled)}))}await Promise.all(connects)}#wireListChanged(entry){let sink={logger:{error:(message,data)=>entry.logger.error(message,data)}};entry.disposeListChanged=subscribeMcpToolsChanged(entry,connectOnly=>this.#handleServerToolsChanged(entry,connectOnly),sink);let unsubscribeState=entry.connection.onStateChange(()=>{let ctx=this.#sessionContext;ctx?.mode==="rpc"&&this.refreshWireStatusSnapshot(ctx.sessionManager?.getSessionId?.()).catch(error2=>{entry.logger.error("Failed to refresh MCP control inventory",error2)})});entry.disposeWireStatus=unsubscribeState}async#handleServerToolsChanged(entry,connectOnly){let config=this.#config;if(config===null||this.#liveBindings().length===0)return;await refreshMcpToolsOnListChanged(entry,()=>this.#liveBindings().map(binding=>({pi:binding.pi,registeredIdentity:()=>binding.registeredIdentities.get(entry.key),register:()=>this.#registerDirectTools(binding)})),config,connectOnly)}async#registerDirectTools(binding){let config=this.#config;if(config===null)return;let toolSearchService=this.#toolSearchFor(binding);if(toolSearchService===void 0)return;binding.registration=await registerMcpServiceDirectTools(binding.pi,config,this.#connections.values(),toolSearchService,{refreshActiveSetWhenEmpty:this.#refreshActiveSetWhenNoTools,onRegistered:(entry,identity)=>binding.registeredIdentities.set(entry.key,identity)});let ctx=binding.context;ctx.mode==="rpc"&&await this.refreshWireStatusSnapshot(ctx.sessionManager?.getSessionId?.());for(let listener of this.#registrationListeners)listener()}rehydrateActiveToolsFromHistory(messages,pi){return this.maybeRehydrateFromHistory(messages,pi)}maybeRehydrateFromHistory(messages,pi){let binding=this.#bindingFor(pi);return(binding===void 0?void 0:this.#toolSearchFor(binding)?.maybeRehydrateFromHistory(messages))??[]}#serverSnapshot(name){let connection=this.getConnection(name);return connection?.refreshCapturedDiagnostics(),buildMcpServerSnapshot(name,this.#config?.servers[name],connection,this.#entryForName(name))}async#captureWireStatus(sessionId){let config=this.#config;if(config===null)return;let snapshot={servers:await Promise.all(Object.keys(config.servers).sort().map(name=>this.#captureWireStatusServer(name,config.servers[name])))},previous=this.getWireStatusSnapshot(sessionId);if(this.#latestWireStatus=snapshot,sessionId!==void 0&&this.#wireStatusBySession.set(sessionId,snapshot),JSON.stringify(previous)!==JSON.stringify(snapshot))for(let listener of this.#wireStatusListeners)listener(sessionId,snapshot)}async#captureWireStatusServer(name,server){let entry=this.#entryForName(name),connection=entry?.connection,connected=connection?.state==="connected",cached=entry?.cachedCatalog,tools=cached?.tools??[],resources=cached?.resources??[],resourceTemplates=[],serverInfo=null;if(connected&&connection!==void 0){let client=connection.client,version=client.getServerVersion();version!==void 0&&(serverInfo=mapWireServerInfo(version));try{tools=(await collectAllPages(cursor=>client.listTools(cursor===void 0?{}:{cursor}))).items}catch(error2){if(!(error2 instanceof Error))throw error2;tools=cached?.tools??[]}try{resources=(await collectAllPages(cursor=>client.listResources(cursor===void 0?{}:{cursor}))).items}catch(error2){if(!(error2 instanceof Error))throw error2;resources=cached?.resources??[]}try{resourceTemplates=(await collectAllPages(cursor=>client.listResourceTemplates(cursor===void 0?{}:{cursor}))).items}catch(error2){if(!(error2 instanceof Error))throw error2;resourceTemplates=[]}}return{name,serverInfo,tools:tools.map(mapWireTool),resources:resources.map(mapWireResource),resourceTemplates:resourceTemplates.map(mapWireResourceTemplate),authStatus:wireAuthStatus(entry,server),...connection?.state===void 0&&server?.state===void 0?{}:{status:connection?.state??server?.state}}}#entryForName(name){let key=this.#connectionKeysByName.get(name);return key===void 0?void 0:this.#connections.get(key)}setMcpInstructions(instructions){this.#mcpInstructions=instructions}getMcpInstructions(){return this.#mcpInstructions}setMcpElicitationUiProvider(provider){this.#elicitationUiProvider=provider}getMcpElicitationUi(){return this.#elicitationUiProvider?.()}isMcpPromptCommandRegistered(name){return this.#promptCommandNames.has(name)}markMcpPromptCommandRegistered(name){this.#promptCommandNames.add(name)}beginInteractiveAuth(serverName2){return this.#interactiveAuthServers.has(serverName2)?!1:(this.#interactiveAuthServers.add(serverName2),!0)}endInteractiveAuth(serverName2){this.#interactiveAuthServers.delete(serverName2)}getPendingAuth(){return this.#pendingAuth}getAuthTarget(name){let server=this.#config?.servers[name];if(server?.config!==void 0)return{config:server.config,agentDir:this.#authAgentDir,env:this.#authEnv,callbackUrl:this.#config?.settings.oauthCallbackUrl}}getCachedInstructions(name){return this.#entryForName(name)?.cachedCatalog?.instructions}getNativeToolSearchSetting(){return this.#config?.settings.nativeToolSearch}};function wireAuthStatus(entry,server){let mode=entry?.authPlan?.mode??(server?.config===void 0?"none":resolveAuthMode(server.config));switch(mode){case"none":return"unsupported";case"bearer":return entry?.connection.state==="needs_auth"?"notLoggedIn":"bearerToken";case"oauth":return entry?.authPlan?.provider?.tokens()===void 0?"notLoggedIn":"oAuth";default:return assertNever(mode)}}function shouldCaptureWireStatus(ctx){return ctx.mode==="app-server"||ctx.mode==="rpc"}function mapWireServerInfo(info){return{name:info.name,title:info.title??null,version:info.version,description:info.description??null,icons:info.icons?.map(toWireJsonValue)??null,websiteUrl:info.websiteUrl??null}}function mapWireTool(tool){return{name:tool.name,...tool.title===void 0?{}:{title:tool.title},...tool.description===void 0?{}:{description:tool.description},inputSchema:toWireJsonValue(tool.inputSchema),...tool.outputSchema===void 0?{}:{outputSchema:toWireJsonValue(tool.outputSchema)},...tool.annotations===void 0?{}:{annotations:toWireJsonValue(tool.annotations)},...tool.icons===void 0?{}:{icons:tool.icons.map(toWireJsonValue)},...tool._meta===void 0?{}:{_meta:toWireJsonValue(tool._meta)}}}function mapWireResource(resource){return{uri:resource.uri,name:resource.name,...resource.title===void 0?{}:{title:resource.title},...resource.description===void 0?{}:{description:resource.description},...resource.mimeType===void 0?{}:{mimeType:resource.mimeType},...resource.size===void 0?{}:{size:resource.size},...resource.annotations===void 0?{}:{annotations:toWireJsonValue(resource.annotations)},...resource.icons===void 0?{}:{icons:resource.icons.map(toWireJsonValue)},...resource._meta===void 0?{}:{_meta:toWireJsonValue(resource._meta)}}}function mapWireResourceTemplate(template){return{uriTemplate:template.uriTemplate,name:template.name,...template.title===void 0?{}:{title:template.title},...template.description===void 0?{}:{description:template.description},...template.mimeType===void 0?{}:{mimeType:template.mimeType},...template.annotations===void 0?{}:{annotations:toWireJsonValue(template.annotations)},...template.icons===void 0?{}:{icons:template.icons.map(toWireJsonValue)},...template._meta===void 0?{}:{_meta:toWireJsonValue(template._meta)}}}function toWireJsonValue(value2){if(value2===null||typeof value2=="boolean"||typeof value2=="number"||typeof value2=="string")return value2;if(Array.isArray(value2))return value2.map(toWireJsonValue);if(isRecord41(value2)){let object={};for(let[key,child]of Object.entries(value2))object[key]=toWireJsonValue(child);return object}return null}function isRecord41(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function assertNever(value2){throw new Error(`Unhandled MCP auth mode: ${JSON.stringify(value2)}`)}var service=null;function getMcpService(){return(service===null||service.isDisposed())&&(service=new McpService({servesManySessions:!0})),service}function shouldDisposeMcpService(reason){return reason==="quit"||reason==="reload"}var MCP_DEFERRED_DISPOSE_TIMEOUT_ENV="SENPI_MCP_DEFERRED_DISPOSE_TIMEOUT_MS",MCP_DEFERRED_DISPOSE_TIMEOUT_MS=15e3;function resolveMcpDeferredDisposeTimeoutMs(){let raw=process.env[MCP_DEFERRED_DISPOSE_TIMEOUT_ENV]?.trim();if(raw!==void 0&&raw.length>0){let value2=Number(raw);if(Number.isFinite(value2)&&value2>=0)return value2}return MCP_DEFERRED_DISPOSE_TIMEOUT_MS}async function buildMcpStatusRows(snapshots2,getExposureStatus){return Promise.all(snapshots2.map(async snapshot=>({exposure:await getExposureStatus(snapshot.name),snapshot})))}function formatMcpStatus(title,rows){return[title,...rows.map(formatRow)].join(`
1253
1253
  `)}function formatRow(row){let snapshot=row.snapshot,averageLatencyMs=snapshot.counters.callCount===0?0:Math.round(snapshot.counters.totalLatencyMs/snapshot.counters.callCount);return[snapshot.name,snapshot.configState,`state=${snapshot.lifecycleState}`,`origin=${snapshot.source??"n/a"}`,`source=${snapshot.sourcePath??"n/a"}`,`tools=${row.exposure.toolCount??"?"}`,`uptime=${formatUptime(snapshot.uptimeMs)}`,`calls=${snapshot.counters.callCount}`,`errors=${snapshot.counters.errorCount}`,`latency=${averageLatencyMs}ms`,`reconnects=${snapshot.counters.reconnectCount}`,snapshot.lastError?`lastError=${snapshot.lastError}`:"",row.exposure.hint?`hint=${row.exposure.hint}`:""].filter(part=>part.length>0).join(" ")}function formatUptime(uptimeMs){return uptimeMs===null?"n/a":uptimeMs<1e3?"<1s":`${Math.round(uptimeMs/1e3)}s`}var SUBCOMMANDS=["status","add","enable","disable","test","logs","reconnect","auth","auth-start","auth-complete","logout"],AUTH_SUBCOMMANDS=new Set(["auth","auth-start","auth-complete","logout"]);function registerMcpCommands(pi,service2=getMcpService(),pendingAttach=()=>{}){pi.registerEntryRenderer("mcp-auth",noticeEntryRenderer(entry=>typeof entry.data=="string"?{title:"MCP authorization",why:entry.data}:void 0)),pi.registerCommand("mcp",{description:"Inspect and manage MCP servers.",getArgumentCompletions:prefix=>SUBCOMMANDS.filter(item=>item.startsWith(prefix)).map(value2=>({value:value2,label:value2})),handler:async(rawArgs,ctx)=>{try{await pendingAttach(),await handleMcpCommand(rawArgs,ctx,pi,service2)}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}})}async function handleMcpCommand(rawArgs,ctx,pi,service2){let args=splitCommandArgs(rawArgs),subcommand=args[0]??"";if(subcommand===""){await showPanel(ctx,service2);return}if(AUTH_SUBCOMMANDS.has(subcommand)){await handleMcpAuthCommand(subcommand,args.slice(1),ctx,pi,service2);return}if(subcommand==="status"){await notifyStatus(ctx,service2);return}if(subcommand==="add"){await addServer(args.slice(1),ctx,pi,service2);return}if(subcommand==="enable"||subcommand==="disable"){await setServerEnabled(ctx,pi,service2,args[1]??"",subcommand==="enable");return}if(subcommand==="test"){await testServer(args[1]??"",ctx,service2);return}if(subcommand==="logs"){showLogs(args[1]??"",ctx,service2);return}if(subcommand==="reconnect"){await reconnectServer(args[1]??"",ctx,pi,service2);return}ctx.ui.notify(`Unknown /mcp subcommand: ${subcommand}`,"error")}async function showPanel(ctx,service2){let text2=await renderStatus("MCP servers",service2);if(!ctx.hasUI){ctx.ui.notify(text2);return}await ctx.ui.select(text2,["status","logs <server>","test <server>"])===void 0&&ctx.ui.notify(text2)}async function notifyStatus(ctx,service2){ctx.ui.notify(await renderStatus("MCP status",service2))}async function renderStatus(title,service2){let rows=await buildMcpStatusRows(service2.getServerSnapshots(),name=>service2.getServerExposureStatus(name));return formatMcpStatus(title,rows)}async function addServer(args,ctx,pi,service2){let[name,...endpoint]=args;if(!name||endpoint.length===0){ctx.ui.notify("Usage: /mcp add <name> <command...|url>","error");return}if(!ctx.hasUI){ctx.ui.notify("Cannot add MCP server without UI confirmation.","error");return}let server=parseServerConfig(endpoint);if(!await ctx.ui.confirm("Add MCP server?",`${name}: ${endpoint.join(" ")}`)){ctx.ui.notify("MCP add cancelled","warning");return}addGlobalMcpServer(name,server),await service2.attachSession({type:"session_start",reason:"reload"},ctx,pi),ctx.ui.notify(`Added MCP server ${name}`)}async function setServerEnabled(ctx,pi,service2,name,enabled){if(ensureKnown(name,ctx,service2)){if(!setGlobalMcpServerEnabled(name,enabled)){ctx.ui.notify(`MCP server ${name} is not in the global config file`,"error");return}ctx.ui.notify(`MCP server ${name} connecting`),await service2.attachSession({type:"session_start",reason:"reload"},ctx,pi),ctx.ui.notify(`${enabled?"Enabled":"Disabled"} MCP server ${name}`)}}async function testServer(name,ctx,service2){if(!ensureKnown(name,ctx,service2))return;let connection=service2.getConnection(name);if(connection===void 0)return;let started=Date.now();try{await connection.connect();let result3=await connection.client.listTools({},{timeout:2e3}),elapsedMs=Date.now()-started;service2.recordCall(name,elapsedMs,!1),ctx.ui.notify(`MCP test ${name} ok (${elapsedMs}ms): ${result3.tools.length} tools`)}catch(error2){let elapsedMs=Date.now()-started;service2.recordCall(name,elapsedMs,!0);let message=error2 instanceof Error?error2.message:String(error2);ctx.ui.notify(`MCP test ${name} failed (${elapsedMs}ms): ${message}`,"error")}}function showLogs(name,ctx,service2){if(!ensureKnown(name,ctx,service2))return;let lines=service2.getLogLines(name,20);ctx.ui.notify(lines.length===0?`MCP logs for ${name}: (empty)`:lines.join(`
1254
1254
  `))}async function reconnectServer(name,ctx,pi,service2){if(ensureKnown(name,ctx,service2))try{await service2.reconnectServer(name),await service2.attachSession({type:"session_start",reason:"reload"},ctx,pi),ctx.ui.notify(`MCP reconnect ${name} connected`)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);ctx.ui.notify(`MCP reconnect ${name} failed: ${message}`,"error")}}function ensureKnown(name,ctx,service2){if(name.length>0&&service2.getServerSnapshots().some(snapshot=>snapshot.name===name))return!0;let known=service2.getServerSnapshots().map(snapshot=>snapshot.name).join(", ");return ctx.ui.notify(`Unknown MCP server: ${name||"<missing>"}
1255
1255
  Known MCP servers: ${known||"(none)"}`,"error"),!1}function parseServerConfig(endpoint){let first=endpoint[0]??"";return/^https?:\/\//.test(first)?baseServer({type:"http",url:first}):baseServer({type:"stdio",command:first,args:endpoint.slice(1)})}function baseServer(endpoint){return{args:[],connectTimeoutMs:15e3,enabled:!0,exposure:"auto",idleTimeoutMin:10,lifecycle:"lazy",logLevel:"info",requestTimeoutMs:3e4,startupTimeoutMs:MCP_STARTUP_RACE_MS,...endpoint}}function splitCommandArgs(raw){return(raw.match(/"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|[^\s]+/g)??[]).map(part=>part.replace(/^["']|["']$/g,"").replace(/\\(["'])/g,"$1"))}var registeredCommandNames=new Set;function registerMcpPromptCommands(serviceOrPi,piOrServers,serversArg){let service2=serversArg===void 0?void 0:serviceOrPi,pi=serversArg===void 0?serviceOrPi:piOrServers,servers=serversArg===void 0?piOrServers:serversArg,added=[];for(let server of servers)for(let prompt of server.prompts){let commandName=`mcp:${server.server}:${prompt.name}`;(service2?.isMcpPromptCommandRegistered(commandName)??registeredCommandNames.has(commandName))||(service2?service2.markMcpPromptCommandRegistered(commandName):registeredCommandNames.add(commandName),added.push(commandName),pi.registerCommand(commandName,{description:prompt.description??`MCP prompt ${prompt.name} from ${server.server}`,handler:async(_args,ctx)=>{try{let collected=await collectPromptArguments(prompt.arguments??[],ctx);if(collected===void 0)return;let result3=await server.connection.client.getPrompt({arguments:collected,name:prompt.name},{timeout:server.requestTimeoutMs});ctx.ui.setEditorText(flattenPromptMessages(result3.messages))}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);createMcpLogger(server.server).warn(`prompt ${prompt.name} failed: ${message}`),ctx.ui.notify(`MCP prompt ${prompt.name} failed: ${message}`,"error")}}}))}return added}async function collectPromptArguments(declared,ctx){let collected={};for(let argument of declared){let title=`${argument.name}${argument.required?"":" (optional)"}`,value2=await ctx.ui.input(title,argument.description);if(value2!==void 0&&value2.length>0){collected[argument.name]=value2;continue}if(argument.required){ctx.ui.notify(`MCP prompt cancelled: required argument '${argument.name}' not provided.`,"warning");return}}return collected}function flattenPromptMessages(messages){return messages.map(message=>{let content=message.content,text2=typeof content?.text=="string"?content.text:JSON.stringify(message.content);return messages.length>1?`${message.role}: ${text2}`:text2}).join(`
1256
1256
 
1257
- `)}import{existsSync as existsSync26,readFileSync as readFileSync32,statSync as statSync13}from"node:fs";import{join as join48}from"node:path";function parseSkillMcpDeclarations(skills){let servers=new Map,warnings=[];for(let skill of skills){let{declared,sourcePath,warning}=readSkillServers(skill);warning!==void 0&&warnings.push(warning);for(let[name,raw]of Object.entries(declared)){let globs=normalizeGlobs(raw.includeTools),existing=servers.get(name);if(existing===void 0){servers.set(name,{includeToolsBySkill:new Map([[skill.name,globs]]),raw,scope:skill.sourceInfo?.scope,skillName:skill.name,sourcePath});continue}existing.includeToolsBySkill.set(skill.name,globs)}}return{servers,warnings}}var skillServersCache=new Map;function fileStamp(path13){try{let stat14=statSync13(path13);return`${stat14.mtimeMs}:${stat14.ctimeMs}:${stat14.size}:${stat14.ino}`}catch{return"missing"}}function readSkillServers(skill){let sidecarPath=join48(skill.baseDir,"mcp.json"),key=`${fileStamp(sidecarPath)}|${fileStamp(skill.filePath)}`,cached=skillServersCache.get(skill.filePath);if(cached?.key===key)return cached.servers;let servers=readSkillServersFromDisk(skill);return skillServersCache.set(skill.filePath,{key,servers}),servers}function readSkillServersFromDisk(skill){let sidecarPath=join48(skill.baseDir,"mcp.json");if(existsSync26(sidecarPath))try{let parsed=JSON.parse(readFileSync32(sidecarPath,"utf8"));return{declared:unwrapServerMap(parsed),sourcePath:sidecarPath}}catch(error2){return{declared:{},sourcePath:sidecarPath,warning:`Skill '${skill.name}': invalid mcp.json sidecar skipped (${error2 instanceof Error?error2.message:String(error2)}); the skill itself still loads.`}}try{let{frontmatter}=parseFrontmatter3(readFileSync32(skill.filePath,"utf8"));return frontmatter.mcp===void 0?{declared:{},sourcePath:skill.filePath}:{declared:unwrapServerMap(frontmatter.mcp),sourcePath:skill.filePath}}catch(error2){return{declared:{},sourcePath:skill.filePath,warning:`Skill '${skill.name}': unreadable frontmatter mcp block skipped (${error2 instanceof Error?error2.message:String(error2)}); the skill itself still loads.`}}}function unwrapServerMap(value2){if(typeof value2!="object"||value2===null||Array.isArray(value2))return{};let record7=value2,map=typeof record7.mcpServers=="object"&&record7.mcpServers!==null?record7.mcpServers:record7,declared={};for(let[name,server]of Object.entries(map))typeof server!="object"||server===null||Array.isArray(server)||(declared[name]=server);return declared}function normalizeGlobs(includeTools){if(!Array.isArray(includeTools))return["*"];let globs=includeTools.filter(glob=>typeof glob=="string"&&glob.length>0);return globs.length>0?globs:["*"]}function matchIncludeTools(globs,toolName){return globs.some(glob=>{let pattern=`^${glob.split("*").map(escapeRegExp3).join(".*")}$`;return new RegExp(pattern).test(toolName)})}function escapeRegExp3(text2){return text2.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function skillActivationTargets(declarations,skillName,registered){let targets=new Set;for(let[serverName2,decl]of declarations.servers){let globs=decl.includeToolsBySkill.get(skillName);if(globs!==void 0)for(let tool of registered)tool.server===serverName2&&matchIncludeTools(globs,tool.toolName)&&targets.add(tool.name)}return[...targets].sort()}var MCP_BUILTIN_EXTENSION_PATH="<builtin:mcp>";function createMcpExtension(service2,sessionOwned=!0){return pi=>{let attachPromise,attachedSessionId,controlInventoryDisposed=!1,unsubscribeControlInventoryRequest=safeEventBusOn(pi.events,MCP_CONTROL_INVENTORY_REQUEST_EVENT,data=>{!isMcpControlInventoryRequest(data)||data.sessionId!==attachedSessionId||data.respond(service2.refreshWireStatusSnapshot(data.sessionId))}),unsubscribeWireStatus=service2.onWireStatusChanged((sessionId,snapshot)=>{sessionId===void 0||sessionId!==attachedSessionId||pi.events.emit(MCP_CONTROL_INVENTORY_CHANGED_EVENT,{sessionId,snapshot})}),disposeControlInventory=()=>{controlInventoryDisposed||(controlInventoryDisposed=!0,unsubscribeControlInventoryRequest(),unsubscribeWireStatus())},sink={logger:{error(message,data){createMcpLogger("service").error(message,data)}}};registerMcpCommands(pi,service2,()=>attachPromise),installMcpNativeToolSearchGate(()=>{let setting=service2.getNativeToolSearchSetting();return setting===!0||setting==="auto"});let skillDecls={servers:new Map,warnings:[]},skillsByName=new Map,loadedSkills=new Set,revealSkill=skillName=>{if(loadedSkills.has(skillName)||!skillsByName.has(skillName))return;loadedSkills.add(skillName);let registered=service2.getTierBSearchable(),targets=skillActivationTargets(skillDecls,skillName,registered);targets.length>0&&service2.activateSkillMcpTools(targets)};pi.on("input",async(event,ctx)=>{let match=/^\s*\/skill:([A-Za-z0-9._-]+)/.exec(event.text);if(match&&revealSkill(match[1]),event.text.includes("@mcp:")){let expansion=await expandMcpResourceMentions(event.text,()=>service2.getMcpResourceServers());for(let notice2 of expansion.notices)createMcpLogger("resources").warn(notice2),ctx.ui?.notify?.(notice2,"warning");if(expansion.changed)return{action:"transform",text:expansion.text}}}),pi.on("tool_call",event=>{if(event.toolName!=="read")return;let path13=event.input.path;if(path13!==void 0)for(let[name,skill]of skillsByName)(path13===skill.filePath||path13.endsWith(skill.filePath))&&revealSkill(name)});let attach=(event,ctx)=>(attachedSessionId=ctx.sessionManager?.getSessionId?.(),attachPromise=(async()=>{await service2.attachSession(event,ctx,pi),refreshMcpInstructionsForSession(service2),sessionOwned?registerMcpPromptCommands(service2,pi,service2.getMcpPromptServers()):registerMcpPromptCommands(pi,service2.getMcpPromptServers())})(),attachPromise),onSessionStart=wrapAsync("mcp.session_start",(event,ctx)=>attach(event,ctx),sink);pi.on("session_start",(event,ctx)=>{let work=onSessionStart(event,ctx)});let onBeforeAgentStart=async(event,ctx)=>{try{let preview=event.preview===!0;preview?await attachPromise:(service2.setMcpElicitationUiProvider(()=>ctx.ui),await(attachPromise??attach({type:"session_start",reason:"startup"},ctx)));let skills=preview?[]:event.systemPromptOptions.skills??[];if(skills.length>0){skillsByName=new Map(skills.map(skill=>[skill.name,skill])),skillDecls=parseSkillMcpDeclarations(skills);let warnings=[...skillDecls.warnings,...skillDecls.servers.size>0?await service2.attachSkillMcpServers(skillDecls.servers):[]];for(let warning of warnings)createMcpLogger("skills").warn(warning)}await service2.whenAttachSettled()==="timeout"&&createMcpLogger("service").warn("MCP attach still settling at prompt build",{timeoutMs:MCP_ATTACH_SETTLE_TIMEOUT_MS});let systemPrompt=injectMcpInstructions(service2,event.systemPrompt);return systemPrompt===void 0?void 0:{systemPrompt}}catch(error2){if(!(error2 instanceof Error))throw error2;await reportMcpAsyncError("mcp.before_agent_start",error2,sink);return}};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("session_shutdown",wrapAsync("mcp.session_shutdown",async event=>{event.reason==="reload"&&!sessionOwned||(disposeControlInventory(),await service2.handleSessionShutdown(event))},sink)),pi.on("session_extensions_removed",wrapAsync("mcp.session_extensions_removed",async event=>{event.removed.some(extension=>extension.path===MCP_BUILTIN_EXTENSION_PATH)&&(disposeControlInventory(),await service2.dispose("reload"))},sink))}}function hasProviderScope(){try{return bindToProviderScope(()=>{}),!0}catch{return!1}}function mcpExtension(pi){let sessionOwned=hasProviderScope();return createMcpExtension(sessionOwned?new McpService:getMcpService(),sessionOwned)(pi)}var BARE_EXPANSION_DENYLIST=new Set(["cursor","openrouter","openrouter-images"]),PROVIDER_PRECEDENCE=["anthropic-subscription","anthropic","kimi-coding"];function authTier(model,tiers){return tiers.isUsingOAuth(model)?0:tiers.hasConfiguredAuth?.(model)===!0?1:2}var MAX_PROVIDERS_PER_FAMILY=2;function parseBareSelector(raw){let trimmed=raw.trim();if(!trimmed||trimmed.includes("/")||trimmed.includes("*"))return;let lastColon=trimmed.lastIndexOf(":");if(lastColon===-1)return{family:trimmed.toLowerCase()};let suffix=trimmed.slice(lastColon+1).toLowerCase();if(!isValidThinkingLevel(suffix))return{family:trimmed.toLowerCase()};let family=trimmed.slice(0,lastColon).trim().toLowerCase();return family?{family,thinkingLevel:suffix}:void 0}function withoutNamespace(modelId){let cut=Math.max(modelId.lastIndexOf("."),modelId.lastIndexOf("/"));return cut===-1?modelId:modelId.slice(cut+1)}function matchesFamily(model,family){return[model.id.toLowerCase(),withoutNamespace(model.id.toLowerCase())].some(id=>id===family||id.startsWith(`${family}-`))}function pickVariant2(models,family){return[...models].sort((left,right)=>{let exact=+(withoutNamespace(right.id.toLowerCase())===family)-+(withoutNamespace(left.id.toLowerCase())===family);return exact!==0?exact:left.id.length!==right.id.length?left.id.length-right.id.length:left.id.localeCompare(right.id)})[0]}function precedenceIndex(provider){let index=PROVIDER_PRECEDENCE.indexOf(provider.toLowerCase());return index===-1?PROVIDER_PRECEDENCE.length:index}function rankFamilyModels(models,family,tiers,options={}){let byProvider=new Map;for(let model of models){if(BARE_EXPANSION_DENYLIST.has(model.provider.toLowerCase())||!matchesFamily(model,family)||tiers.isFallbackEligible?.(model)===!1)continue;let bucket=byProvider.get(model.provider);bucket?bucket.push(model):byProvider.set(model.provider,[model])}let ranked=[...byProvider.values()].flatMap(variants=>{let variant=pickVariant2(variants,family);return variant?[variant]:[]}).sort((left,right)=>{let tier=authTier(left,tiers)-authTier(right,tiers);if(tier!==0)return tier;let precedence=precedenceIndex(left.provider)-precedenceIndex(right.provider);return precedence!==0?precedence:left.provider.localeCompare(right.provider)}),limit=options.limit??ranked.length;return ranked.slice(0,limit)}function availableModels(lookup){return"getAll"in lookup?lookup.getAll():[...lookup]}function authTiers(lookup){if(Array.isArray(lookup))return{isUsingOAuth:()=>!1};let registry=lookup;return{isUsingOAuth:model=>registry.isUsingOAuth?.(model)===!0,hasConfiguredAuth:typeof registry.hasConfiguredAuth=="function"?model=>registry.hasConfiguredAuth?.(model)===!0:void 0,isFallbackEligible:typeof registry.isFallbackEligible=="function"?memoizedEligibility(registry):void 0}}function memoizedEligibility(registry){let known=new Map;return model=>{let cached=known.get(model.provider);if(cached!==void 0)return cached;let eligible=registry.isFallbackEligible?.(model)!==!1;return known.set(model.provider,eligible),eligible}}function isChainTombstone(entries){return Array.isArray(entries)&&entries.length===0}function selectorReference(raw){let trimmed=raw.trim();if(!trimmed.includes("/")||trimmed.includes("*"))return;let lastColon=trimmed.lastIndexOf(":");if(lastColon===-1)return{reference:trimmed};let prefix=trimmed.slice(0,lastColon),suffix=trimmed.slice(lastColon+1).toLowerCase();return isValidThinkingLevel(suffix)?{reference:prefix,thinkingLevel:suffix}:{reference:trimmed}}function parseFallbackSelector(raw,lookup){let models=availableModels(lookup),trimmed=raw.trim(),parsedReference=selectorReference(trimmed);if(!parsedReference)return;let fullMatch=findExactModelReferenceMatch(trimmed,models);if(fullMatch)return{raw:trimmed,provider:fullMatch.provider,id:fullMatch.id};let slashIndex=parsedReference.reference.indexOf("/"),provider=parsedReference.reference.slice(0,slashIndex).trim(),modelPattern=parsedReference.reference.slice(slashIndex+1).trim();if(!provider||!modelPattern)return;let providerModels=models.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()),parsed=parseModelPattern(parsedReference.thinkingLevel?`${modelPattern}:${parsedReference.thinkingLevel}`:modelPattern,providerModels,{allowInvalidThinkingLevelFallback:!1});if(!(!parsed.model||parsed.warning)&&!(parsedReference.thinkingLevel&&!parsed.thinkingLevel))return{raw:trimmed,provider:parsed.model.provider,id:parsed.model.id,thinkingLevel:parsed.thinkingLevel}}function formatSelector(model,thinkingLevel){let base=`${model.provider}/${model.id}`;return thinkingLevel?`${base}:${thinkingLevel}`:base}function baseSelector(selector){return`${selector.provider}/${selector.id}`}function canonicalizeFallbackChains(chains,lookup){let models=availableModels(lookup),tiers=authTiers(lookup),canonical={},explicitKeys=new Set,tombstones=new Set,expandEntries=(entries,keySelector)=>entries.flatMap(entry=>{let bare=parseBareSelector(entry);if(bare)return rankFamilyModels(models,bare.family,tiers,{limit:MAX_PROVIDERS_PER_FAMILY}).map(model=>bare.thinkingLevel?`${formatSelector(model)}:${bare.thinkingLevel}`:formatSelector(model)).filter(selector=>normalizedBase(selector)!==normalizedBase(keySelector));let parsedEntry=parseFallbackSelector(entry,models);return parsedEntry?[formatParsedSelector(parsedEntry)]:[]});for(let[key,entries]of Object.entries(chains)){let bareKey=parseBareSelector(key);if(!(!bareKey||!Array.isArray(entries))){if(isChainTombstone(entries)){for(let model of rankFamilyModels(models,bareKey.family,tiers))tombstones.add(formatSelector(model).toLowerCase());continue}for(let model of rankFamilyModels(models,bareKey.family,tiers)){let keySelector=bareKey.thinkingLevel?`${formatSelector(model)}:${bareKey.thinkingLevel}`:formatSelector(model),canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical[keySelector]=canonicalEntries)}}}for(let[key,entries]of Object.entries(chains)){if(parseBareSelector(key))continue;let parsedKey=parseFallbackSelector(key,models);if(!parsedKey||!Array.isArray(entries))continue;let keySelector=formatParsedSelector(parsedKey);if(isChainTombstone(entries)){tombstones.add(normalizedBase(keySelector));continue}explicitKeys.add(keySelector.toLowerCase());let canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical[keySelector]=canonicalEntries)}for(let key of Object.keys(canonical))explicitKeys.has(key.toLowerCase())||tombstones.has(normalizedBase(key))&&delete canonical[key];return canonical}function resolveChainKey(currentModel,currentThinking,chains,_options){let base=formatSelector(currentModel),exact=currentThinking?`${base}:${currentThinking}`:base;if(Object.hasOwn(chains,exact))return exact;if(Object.hasOwn(chains,base))return base}function formatParsedSelector(selector){let base=baseSelector(selector);return selector.thinkingLevel?`${base}:${selector.thinkingLevel}`:base}function normalizedBase(selector){if(typeof selector!="string")return baseSelector(selector).toLowerCase();let normalized2=selector.trim().toLowerCase(),lastColon=normalized2.lastIndexOf(":");return lastColon===-1||!isValidThinkingLevel(normalized2.slice(lastColon+1))?normalized2:normalized2.slice(0,lastColon)}function normalizedExact(selector){return typeof selector=="string"?selector.trim().toLowerCase():formatParsedSelector(selector).toLowerCase()}function candidatesAfter(chainEntries2,currentSelector){let exact=normalizedExact(currentSelector),exactIndex=chainEntries2.findIndex(entry=>entry.toLowerCase()===exact);if(exactIndex!==-1)return chainEntries2.slice(exactIndex+1);let base=normalizedBase(currentSelector),baseIndex=chainEntries2.findIndex(entry=>normalizedBase(entry)===base);return baseIndex===-1?chainEntries2:chainEntries2.slice(baseIndex+1)}function isPlainObject3(value2){if(value2===null||typeof value2!="object"||Array.isArray(value2))return!1;let prototype=Object.getPrototypeOf(value2);return prototype===Object.prototype||prototype===null}function invalidSelectorWarning(kind,selector,key){return`${kind==="key"?`Fallback chain key "${selector}"`:`Fallback chain entry "${selector}" for "${key}"`} is not a valid or known model selector.`}function validateThinkingLevel(selector,model,subject2,warnings){selector.thinkingLevel&&!getSupportedThinkingLevels2(model).includes(selector.thinkingLevel)&&warnings.push(`${subject2} uses thinking level "${selector.thinkingLevel}", which is unsupported by ${selector.provider}/${selector.id}.`)}function describeValue(value2){return value2===null?"null":Array.isArray(value2)?"an array":`a ${typeof value2}`}function validateFallbackChains(chains,registry){if(chains===void 0)return[];if(!isPlainObject3(chains))return[`Fallback chains must be a plain object, but got ${describeValue(chains)}.`];let warnings=[],models=registry.getAll();for(let[key,entries]of Object.entries(chains)){let hasProvider=key.includes("/"),hasWildcard=key.includes("*"),bareKey=hasWildcard?void 0:parseBareSelector(key),bareKeyMatches=bareKey?models.some(model=>matchesFamily(model,bareKey.family)):!1;!hasProvider&&!bareKeyMatches&&!hasWildcard&&warnings.push(`Fallback chain key "${key}" must use a provider/model selector; roles are unsupported.`),hasWildcard&&key!=="*"&&warnings.push(`Fallback chain key "${key}" cannot contain wildcards.`);let parsedKey=hasProvider&&!hasWildcard?parseFallbackSelector(key,models):void 0,keyModel=parsedKey?registry.find(parsedKey.provider,parsedKey.id):void 0;if(hasProvider&&!hasWildcard&&(!parsedKey||!keyModel)&&warnings.push(invalidSelectorWarning("key",key)),parsedKey&&keyModel&&validateThinkingLevel(parsedKey,keyModel,`Fallback chain key "${key}"`,warnings),!Array.isArray(entries)||entries.some(entry=>typeof entry!="string")){warnings.push(`Fallback chain "${key}" entries must be an array of strings.`);continue}if(entries.length!==0)for(let entry of entries){let bareEntry=parseBareSelector(entry);if(bareEntry){models.some(model=>matchesFamily(model,bareEntry.family))||warnings.push(invalidSelectorWarning("entry",entry,key));continue}let parsedEntry=parseFallbackSelector(entry,models),entryModel=parsedEntry?registry.find(parsedEntry.provider,parsedEntry.id):void 0;if(!parsedEntry||!entryModel){warnings.push(invalidSelectorWarning("entry",entry,key));continue}parsedKey&&baseSelector(parsedEntry)===baseSelector(parsedKey)&&warnings.push(`Fallback chain entry "${entry}" for "${key}" cannot reference the same model.`),validateThinkingLevel(parsedEntry,entryModel,`Fallback chain entry "${entry}"`,warnings)}}return warnings}function displayLookup(models){if(Array.isArray(models))return models;let registry=models;if(typeof registry.getAvailable!="function")return models;let available=registry.getAvailable();return{getAll:()=>available.length>0?available:registry.getAll(),isUsingOAuth:model=>registry.isUsingOAuth?.(model)===!0,hasConfiguredAuth:model=>registry.hasConfiguredAuth?.(model)===!0}}function withAvailableChains(settings,models){return{...settings,chains:canonicalizeFallbackChains(settings.chains,displayLookup(models))}}function loadFallbackSettings(settings,models){return withAvailableChains(settings.getRetryFallbackSettings(),models)}async function updateFallbackSettings(settings,models,update){return await update(settings),withAvailableChains(settings.getRetryFallbackSettings(),models)}var MENU2=["Show chains & live state","Add/edit chain","Remove chain","Toggle model fallback","Revert policy"];function formatModel(model){return`${model.provider}/${model.id}`}function renderFallbackState(ctx,settings){let rows=Object.entries(settings.chains).map(([target,entries])=>`${target} -> ${entries.join(", ")}`),chains=rows.length>0?rows.join(`
1257
+ `)}import{existsSync as existsSync26,readFileSync as readFileSync32,statSync as statSync13}from"node:fs";import{join as join48}from"node:path";function parseSkillMcpDeclarations(skills){let servers=new Map,warnings=[];for(let skill of skills){let{declared,sourcePath,warning}=readSkillServers(skill);warning!==void 0&&warnings.push(warning);for(let[name,raw]of Object.entries(declared)){let globs=normalizeGlobs(raw.includeTools),existing=servers.get(name);if(existing===void 0){servers.set(name,{includeToolsBySkill:new Map([[skill.name,globs]]),raw,scope:skill.sourceInfo?.scope,skillName:skill.name,sourcePath});continue}existing.includeToolsBySkill.set(skill.name,globs)}}return{servers,warnings}}var skillServersCache=new Map;function fileStamp(path13){try{let stat14=statSync13(path13);return`${stat14.mtimeMs}:${stat14.ctimeMs}:${stat14.size}:${stat14.ino}`}catch{return"missing"}}function readSkillServers(skill){let sidecarPath=join48(skill.baseDir,"mcp.json"),key=`${fileStamp(sidecarPath)}|${fileStamp(skill.filePath)}`,cached=skillServersCache.get(skill.filePath);if(cached?.key===key)return cached.servers;let servers=readSkillServersFromDisk(skill);return skillServersCache.set(skill.filePath,{key,servers}),servers}function readSkillServersFromDisk(skill){let sidecarPath=join48(skill.baseDir,"mcp.json");if(existsSync26(sidecarPath))try{let parsed=JSON.parse(readFileSync32(sidecarPath,"utf8"));return{declared:unwrapServerMap(parsed),sourcePath:sidecarPath}}catch(error2){return{declared:{},sourcePath:sidecarPath,warning:`Skill '${skill.name}': invalid mcp.json sidecar skipped (${error2 instanceof Error?error2.message:String(error2)}); the skill itself still loads.`}}try{let{frontmatter}=parseFrontmatter3(readFileSync32(skill.filePath,"utf8"));return frontmatter.mcp===void 0?{declared:{},sourcePath:skill.filePath}:{declared:unwrapServerMap(frontmatter.mcp),sourcePath:skill.filePath}}catch(error2){return{declared:{},sourcePath:skill.filePath,warning:`Skill '${skill.name}': unreadable frontmatter mcp block skipped (${error2 instanceof Error?error2.message:String(error2)}); the skill itself still loads.`}}}function unwrapServerMap(value2){if(typeof value2!="object"||value2===null||Array.isArray(value2))return{};let record7=value2,map=typeof record7.mcpServers=="object"&&record7.mcpServers!==null?record7.mcpServers:record7,declared={};for(let[name,server]of Object.entries(map))typeof server!="object"||server===null||Array.isArray(server)||(declared[name]=server);return declared}function normalizeGlobs(includeTools){if(!Array.isArray(includeTools))return["*"];let globs=includeTools.filter(glob=>typeof glob=="string"&&glob.length>0);return globs.length>0?globs:["*"]}function matchIncludeTools(globs,toolName){return globs.some(glob=>{let pattern=`^${glob.split("*").map(escapeRegExp3).join(".*")}$`;return new RegExp(pattern).test(toolName)})}function escapeRegExp3(text2){return text2.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function skillActivationTargets(declarations,skillName,registered){let targets=new Set;for(let[serverName2,decl]of declarations.servers){let globs=decl.includeToolsBySkill.get(skillName);if(globs!==void 0)for(let tool of registered)tool.server===serverName2&&matchIncludeTools(globs,tool.toolName)&&targets.add(tool.name)}return[...targets].sort()}var MCP_BUILTIN_EXTENSION_PATH="<builtin:mcp>";function createMcpExtension(service2,sessionOwned=!0){return pi=>{let attachPromise,attachedSessionId,controlInventoryDisposed=!1,unsubscribeControlInventoryRequest=safeEventBusOn(pi.events,MCP_CONTROL_INVENTORY_REQUEST_EVENT,data=>{!isMcpControlInventoryRequest(data)||data.sessionId!==attachedSessionId||data.respond(service2.refreshWireStatusSnapshot(data.sessionId))}),unsubscribeWireStatus=service2.onWireStatusChanged((sessionId,snapshot)=>{sessionId===void 0||sessionId!==attachedSessionId||pi.events.emit(MCP_CONTROL_INVENTORY_CHANGED_EVENT,{sessionId,snapshot})}),disposeControlInventory=()=>{controlInventoryDisposed||(controlInventoryDisposed=!0,unsubscribeControlInventoryRequest(),unsubscribeWireStatus())},sink={logger:{error(message,data){createMcpLogger("service").error(message,data)}}};registerMcpCommands(pi,service2,()=>attachPromise),installMcpNativeToolSearchGate(()=>{let setting=service2.getNativeToolSearchSetting();return setting===!0||setting==="auto"});let skillDecls={servers:new Map,warnings:[]},skillsByName=new Map,loadedSkills=new Set,revealSkill=skillName=>{if(loadedSkills.has(skillName)||!skillsByName.has(skillName))return;loadedSkills.add(skillName);let registered=service2.getTierBSearchable(pi),targets=skillActivationTargets(skillDecls,skillName,registered);targets.length>0&&service2.activateSkillMcpTools(targets,pi)};pi.on("input",async(event,ctx)=>{let match=/^\s*\/skill:([A-Za-z0-9._-]+)/.exec(event.text);if(match&&revealSkill(match[1]),event.text.includes("@mcp:")){let expansion=await expandMcpResourceMentions(event.text,()=>service2.getMcpResourceServers(pi));for(let notice2 of expansion.notices)createMcpLogger("resources").warn(notice2),ctx.ui?.notify?.(notice2,"warning");if(expansion.changed)return{action:"transform",text:expansion.text}}}),pi.on("tool_call",event=>{if(event.toolName!=="read")return;let path13=event.input.path;if(path13!==void 0)for(let[name,skill]of skillsByName)(path13===skill.filePath||path13.endsWith(skill.filePath))&&revealSkill(name)});let attach=(event,ctx)=>(attachedSessionId=ctx.sessionManager?.getSessionId?.(),attachPromise=(async()=>{await service2.attachSession(event,ctx,pi),refreshMcpInstructionsForSession(service2),sessionOwned?registerMcpPromptCommands(service2,pi,service2.getMcpPromptServers(pi)):registerMcpPromptCommands(pi,service2.getMcpPromptServers(pi))})(),attachPromise),onSessionStart=wrapAsync("mcp.session_start",(event,ctx)=>attach(event,ctx),sink);pi.on("session_start",(event,ctx)=>{let work=onSessionStart(event,ctx)});let onBeforeAgentStart=async(event,ctx)=>{try{let preview=event.preview===!0;preview?await attachPromise:(service2.setMcpElicitationUiProvider(()=>ctx.ui),await(attachPromise??attach({type:"session_start",reason:"startup"},ctx)));let skills=preview?[]:event.systemPromptOptions.skills??[];if(skills.length>0){skillsByName=new Map(skills.map(skill=>[skill.name,skill])),skillDecls=parseSkillMcpDeclarations(skills);let warnings=[...skillDecls.warnings,...skillDecls.servers.size>0?await service2.attachSkillMcpServers(skillDecls.servers,pi):[]];for(let warning of warnings)createMcpLogger("skills").warn(warning)}await service2.whenAttachSettled()==="timeout"&&createMcpLogger("service").warn("MCP attach still settling at prompt build",{timeoutMs:MCP_ATTACH_SETTLE_TIMEOUT_MS});let systemPrompt=injectMcpInstructions(service2,event.systemPrompt);return systemPrompt===void 0?void 0:{systemPrompt}}catch(error2){if(!(error2 instanceof Error))throw error2;await reportMcpAsyncError("mcp.before_agent_start",error2,sink);return}};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("session_shutdown",wrapAsync("mcp.session_shutdown",async event=>{if(sessionOwned){disposeControlInventory(),await service2.handleSessionShutdown(event);return}event.reason!=="reload"&&disposeControlInventory(),await service2.releaseSession(pi,event.reason==="quit"?"quit":void 0)},sink)),pi.on("session_extensions_removed",wrapAsync("mcp.session_extensions_removed",async event=>{event.removed.some(extension=>extension.path===MCP_BUILTIN_EXTENSION_PATH)&&(disposeControlInventory(),sessionOwned?await service2.dispose("reload"):await service2.releaseSession(pi,"reload"))},sink))}}function hasProviderScope(){try{return bindToProviderScope(()=>{}),!0}catch{return!1}}function mcpExtension(pi){let sessionOwned=hasProviderScope();return createMcpExtension(sessionOwned?new McpService:getMcpService(),sessionOwned)(pi)}var BARE_EXPANSION_DENYLIST=new Set(["cursor","openrouter","openrouter-images"]),PROVIDER_PRECEDENCE=["anthropic-subscription","anthropic","kimi-coding"];function authTier(model,tiers){return tiers.isUsingOAuth(model)?0:tiers.hasConfiguredAuth?.(model)===!0?1:2}var MAX_PROVIDERS_PER_FAMILY=2;function parseBareSelector(raw){let trimmed=raw.trim();if(!trimmed||trimmed.includes("/")||trimmed.includes("*"))return;let lastColon=trimmed.lastIndexOf(":");if(lastColon===-1)return{family:trimmed.toLowerCase()};let suffix=trimmed.slice(lastColon+1).toLowerCase();if(!isValidThinkingLevel(suffix))return{family:trimmed.toLowerCase()};let family=trimmed.slice(0,lastColon).trim().toLowerCase();return family?{family,thinkingLevel:suffix}:void 0}function withoutNamespace(modelId){let cut=Math.max(modelId.lastIndexOf("."),modelId.lastIndexOf("/"));return cut===-1?modelId:modelId.slice(cut+1)}function matchesFamily(model,family){return[model.id.toLowerCase(),withoutNamespace(model.id.toLowerCase())].some(id=>id===family||id.startsWith(`${family}-`))}function pickVariant2(models,family){return[...models].sort((left,right)=>{let exact=+(withoutNamespace(right.id.toLowerCase())===family)-+(withoutNamespace(left.id.toLowerCase())===family);return exact!==0?exact:left.id.length!==right.id.length?left.id.length-right.id.length:left.id.localeCompare(right.id)})[0]}function precedenceIndex(provider){let index=PROVIDER_PRECEDENCE.indexOf(provider.toLowerCase());return index===-1?PROVIDER_PRECEDENCE.length:index}function rankFamilyModels(models,family,tiers,options={}){let byProvider=new Map;for(let model of models){if(BARE_EXPANSION_DENYLIST.has(model.provider.toLowerCase())||!matchesFamily(model,family)||tiers.isFallbackEligible?.(model)===!1)continue;let bucket=byProvider.get(model.provider);bucket?bucket.push(model):byProvider.set(model.provider,[model])}let ranked=[...byProvider.values()].flatMap(variants=>{let variant=pickVariant2(variants,family);return variant?[variant]:[]}).sort((left,right)=>{let tier=authTier(left,tiers)-authTier(right,tiers);if(tier!==0)return tier;let precedence=precedenceIndex(left.provider)-precedenceIndex(right.provider);return precedence!==0?precedence:left.provider.localeCompare(right.provider)}),limit=options.limit??ranked.length;return ranked.slice(0,limit)}function availableModels(lookup){return"getAll"in lookup?lookup.getAll():[...lookup]}function authTiers(lookup){if(Array.isArray(lookup))return{isUsingOAuth:()=>!1};let registry=lookup;return{isUsingOAuth:model=>registry.isUsingOAuth?.(model)===!0,hasConfiguredAuth:typeof registry.hasConfiguredAuth=="function"?model=>registry.hasConfiguredAuth?.(model)===!0:void 0,isFallbackEligible:typeof registry.isFallbackEligible=="function"?memoizedEligibility(registry):void 0}}function memoizedEligibility(registry){let known=new Map;return model=>{let cached=known.get(model.provider);if(cached!==void 0)return cached;let eligible=registry.isFallbackEligible?.(model)!==!1;return known.set(model.provider,eligible),eligible}}function isChainTombstone(entries){return Array.isArray(entries)&&entries.length===0}function selectorReference(raw){let trimmed=raw.trim();if(!trimmed.includes("/")||trimmed.includes("*"))return;let lastColon=trimmed.lastIndexOf(":");if(lastColon===-1)return{reference:trimmed};let prefix=trimmed.slice(0,lastColon),suffix=trimmed.slice(lastColon+1).toLowerCase();return isValidThinkingLevel(suffix)?{reference:prefix,thinkingLevel:suffix}:{reference:trimmed}}function parseFallbackSelector(raw,lookup){let models=availableModels(lookup),trimmed=raw.trim(),parsedReference=selectorReference(trimmed);if(!parsedReference)return;let fullMatch=findExactModelReferenceMatch(trimmed,models);if(fullMatch)return{raw:trimmed,provider:fullMatch.provider,id:fullMatch.id};let slashIndex=parsedReference.reference.indexOf("/"),provider=parsedReference.reference.slice(0,slashIndex).trim(),modelPattern=parsedReference.reference.slice(slashIndex+1).trim();if(!provider||!modelPattern)return;let providerModels=models.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()),parsed=parseModelPattern(parsedReference.thinkingLevel?`${modelPattern}:${parsedReference.thinkingLevel}`:modelPattern,providerModels,{allowInvalidThinkingLevelFallback:!1});if(!(!parsed.model||parsed.warning)&&!(parsedReference.thinkingLevel&&!parsed.thinkingLevel))return{raw:trimmed,provider:parsed.model.provider,id:parsed.model.id,thinkingLevel:parsed.thinkingLevel}}function formatSelector(model,thinkingLevel){let base=`${model.provider}/${model.id}`;return thinkingLevel?`${base}:${thinkingLevel}`:base}function baseSelector(selector){return`${selector.provider}/${selector.id}`}function canonicalizeFallbackChains(chains,lookup){let models=availableModels(lookup),tiers=authTiers(lookup),canonical={},explicitKeys=new Set,tombstones=new Set,expandEntries=(entries,keySelector)=>entries.flatMap(entry=>{let bare=parseBareSelector(entry);if(bare)return rankFamilyModels(models,bare.family,tiers,{limit:MAX_PROVIDERS_PER_FAMILY}).map(model=>bare.thinkingLevel?`${formatSelector(model)}:${bare.thinkingLevel}`:formatSelector(model)).filter(selector=>normalizedBase(selector)!==normalizedBase(keySelector));let parsedEntry=parseFallbackSelector(entry,models);return parsedEntry?[formatParsedSelector(parsedEntry)]:[]});for(let[key,entries]of Object.entries(chains)){let bareKey=parseBareSelector(key);if(!(!bareKey||!Array.isArray(entries))){if(isChainTombstone(entries)){for(let model of rankFamilyModels(models,bareKey.family,tiers))tombstones.add(formatSelector(model).toLowerCase());continue}for(let model of rankFamilyModels(models,bareKey.family,tiers)){let keySelector=bareKey.thinkingLevel?`${formatSelector(model)}:${bareKey.thinkingLevel}`:formatSelector(model),canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical[keySelector]=canonicalEntries)}}}for(let[key,entries]of Object.entries(chains)){if(parseBareSelector(key))continue;let parsedKey=parseFallbackSelector(key,models);if(!parsedKey||!Array.isArray(entries))continue;let keySelector=formatParsedSelector(parsedKey);if(isChainTombstone(entries)){tombstones.add(normalizedBase(keySelector));continue}explicitKeys.add(keySelector.toLowerCase());let canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical[keySelector]=canonicalEntries)}for(let key of Object.keys(canonical))explicitKeys.has(key.toLowerCase())||tombstones.has(normalizedBase(key))&&delete canonical[key];return canonical}function resolveChainKey(currentModel,currentThinking,chains,_options){let base=formatSelector(currentModel),exact=currentThinking?`${base}:${currentThinking}`:base;if(Object.hasOwn(chains,exact))return exact;if(Object.hasOwn(chains,base))return base}function formatParsedSelector(selector){let base=baseSelector(selector);return selector.thinkingLevel?`${base}:${selector.thinkingLevel}`:base}function normalizedBase(selector){if(typeof selector!="string")return baseSelector(selector).toLowerCase();let normalized2=selector.trim().toLowerCase(),lastColon=normalized2.lastIndexOf(":");return lastColon===-1||!isValidThinkingLevel(normalized2.slice(lastColon+1))?normalized2:normalized2.slice(0,lastColon)}function normalizedExact(selector){return typeof selector=="string"?selector.trim().toLowerCase():formatParsedSelector(selector).toLowerCase()}function candidatesAfter(chainEntries2,currentSelector){let exact=normalizedExact(currentSelector),exactIndex=chainEntries2.findIndex(entry=>entry.toLowerCase()===exact);if(exactIndex!==-1)return chainEntries2.slice(exactIndex+1);let base=normalizedBase(currentSelector),baseIndex=chainEntries2.findIndex(entry=>normalizedBase(entry)===base);return baseIndex===-1?chainEntries2:chainEntries2.slice(baseIndex+1)}function isPlainObject3(value2){if(value2===null||typeof value2!="object"||Array.isArray(value2))return!1;let prototype=Object.getPrototypeOf(value2);return prototype===Object.prototype||prototype===null}function invalidSelectorWarning(kind,selector,key){return`${kind==="key"?`Fallback chain key "${selector}"`:`Fallback chain entry "${selector}" for "${key}"`} is not a valid or known model selector.`}function validateThinkingLevel(selector,model,subject2,warnings){selector.thinkingLevel&&!getSupportedThinkingLevels2(model).includes(selector.thinkingLevel)&&warnings.push(`${subject2} uses thinking level "${selector.thinkingLevel}", which is unsupported by ${selector.provider}/${selector.id}.`)}function describeValue(value2){return value2===null?"null":Array.isArray(value2)?"an array":`a ${typeof value2}`}function validateFallbackChains(chains,registry){if(chains===void 0)return[];if(!isPlainObject3(chains))return[`Fallback chains must be a plain object, but got ${describeValue(chains)}.`];let warnings=[],models=registry.getAll();for(let[key,entries]of Object.entries(chains)){let hasProvider=key.includes("/"),hasWildcard=key.includes("*"),bareKey=hasWildcard?void 0:parseBareSelector(key),bareKeyMatches=bareKey?models.some(model=>matchesFamily(model,bareKey.family)):!1;!hasProvider&&!bareKeyMatches&&!hasWildcard&&warnings.push(`Fallback chain key "${key}" must use a provider/model selector; roles are unsupported.`),hasWildcard&&key!=="*"&&warnings.push(`Fallback chain key "${key}" cannot contain wildcards.`);let parsedKey=hasProvider&&!hasWildcard?parseFallbackSelector(key,models):void 0,keyModel=parsedKey?registry.find(parsedKey.provider,parsedKey.id):void 0;if(hasProvider&&!hasWildcard&&(!parsedKey||!keyModel)&&warnings.push(invalidSelectorWarning("key",key)),parsedKey&&keyModel&&validateThinkingLevel(parsedKey,keyModel,`Fallback chain key "${key}"`,warnings),!Array.isArray(entries)||entries.some(entry=>typeof entry!="string")){warnings.push(`Fallback chain "${key}" entries must be an array of strings.`);continue}if(entries.length!==0)for(let entry of entries){let bareEntry=parseBareSelector(entry);if(bareEntry){models.some(model=>matchesFamily(model,bareEntry.family))||warnings.push(invalidSelectorWarning("entry",entry,key));continue}let parsedEntry=parseFallbackSelector(entry,models),entryModel=parsedEntry?registry.find(parsedEntry.provider,parsedEntry.id):void 0;if(!parsedEntry||!entryModel){warnings.push(invalidSelectorWarning("entry",entry,key));continue}parsedKey&&baseSelector(parsedEntry)===baseSelector(parsedKey)&&warnings.push(`Fallback chain entry "${entry}" for "${key}" cannot reference the same model.`),validateThinkingLevel(parsedEntry,entryModel,`Fallback chain entry "${entry}"`,warnings)}}return warnings}function displayLookup(models){if(Array.isArray(models))return models;let registry=models;if(typeof registry.getAvailable!="function")return models;let available=registry.getAvailable();return{getAll:()=>available.length>0?available:registry.getAll(),isUsingOAuth:model=>registry.isUsingOAuth?.(model)===!0,hasConfiguredAuth:model=>registry.hasConfiguredAuth?.(model)===!0}}function withAvailableChains(settings,models){return{...settings,chains:canonicalizeFallbackChains(settings.chains,displayLookup(models))}}function loadFallbackSettings(settings,models){return withAvailableChains(settings.getRetryFallbackSettings(),models)}async function updateFallbackSettings(settings,models,update){return await update(settings),withAvailableChains(settings.getRetryFallbackSettings(),models)}var MENU2=["Show chains & live state","Add/edit chain","Remove chain","Toggle model fallback","Revert policy"];function formatModel(model){return`${model.provider}/${model.id}`}function renderFallbackState(ctx,settings){let rows=Object.entries(settings.chains).map(([target,entries])=>`${target} -> ${entries.join(", ")}`),chains=rows.length>0?rows.join(`
1258
1258
  `):"No fallback chains configured.",status=ctx.sessionSettings.getFallbackStatus(),live=status?.active?`active on ${status.currentModel??"unknown"} from ${status.originalSelector??"unknown"}${status.pinned?" (pinned)":""}`:"inactive";return`${chains}
1259
1259
  Model fallback: ${settings.modelFallback?"enabled":"disabled"}
1260
1260
  Revert policy: ${settings.revertPolicy}
@@ -2453,12 +2453,13 @@ foreach ($p in $all) { if ($p.ParentProcessId -eq ${process.pid} -and $p.Process
2453
2453
  do { $grew = $false; foreach ($p in $all) { if ($tree.Contains([int]$p.ParentProcessId) -and $tree.Add([int]$p.ProcessId)) { $grew = $true } } } while ($grew)
2454
2454
  $tree`;async function windowsBunChromeTree(){let stdout=await run("powershell.exe",["-NoProfile","-NonInteractive","-Command",WINDOWS_CHROME_TREE]);return positivePids(stdout.split(/\r?\n/u).map(line=>line.trim()))}async function windowsListedPids(){let stdout=await run("tasklist",["/FO","CSV","/NH"]);return new Set(positivePids(stdout.split(/\r?\n/u).map(line=>line.split('","')[1]??"")))}async function waitForWindowsRemoval(pids){let deadline=Date.now()+EXIT_DEADLINE_MS;for(;;){let listed=await windowsListedPids();if(!pids.some(pid=>listed.has(pid))||Date.now()>=deadline)return;await new Promise(resolve46=>setTimeout(resolve46,EXIT_POLL_MS))}}async function bunChromePids(){let pids=[];for(let line of(await run("ps",["-axo","pid=,ppid=,command="])).split(`
2455
2455
  `)){let[pidText="",ppidText,...command]=line.trim().split(/\s+/u);Number(ppidText)===process.pid&&command.join(" ").includes(BUN_CHROME_FLAGS)&&pids.push(pidText)}return positivePids(pids)}function alive(pid){try{return process.kill(pid,0),!0}catch(error2){return error2 instanceof Error&&Reflect.get(error2,"code")==="EPERM"}}async function waitForExit(pids){let deadline=Date.now()+EXIT_DEADLINE_MS,remaining=pids.filter(alive);for(;remaining.length>0&&Date.now()<deadline;)await new Promise(resolve46=>setTimeout(resolve46,EXIT_POLL_MS)),remaining=remaining.filter(alive)}var BROWSER_NAME=/chrom|msedge|brave/iu;async function deadBrowserChildren(){if(process.platform==="win32")return[];let pids=[];for(let line of(await run("ps",["-axo","pid=,ppid=,stat=,comm="])).split(`
2456
- `)){let[pidText="",ppidText,stat14="",...command]=line.trim().split(/\s+/u);Number(ppidText)===process.pid&&stat14.startsWith("Z")&&BROWSER_NAME.test(command.join(" "))&&pids.push(pidText)}return positivePids(pids)}async function settleDeadBunChrome(){await waitForExit(await deadBrowserChildren())}async function retireBunChrome(webViewClass){if(process.platform==="win32"){let tree=await windowsBunChromeTree();webViewClass.closeAll();let running=tree.filter(alive);running.length>0&&await run("taskkill",["/F",...running.flatMap(pid=>["/PID",String(pid)])]),await waitForWindowsRemoval(tree);return}let pids=await bunChromePids();if(process.platform==="darwin")for(let pid of pids)try{process.kill(pid,"SIGKILL")}catch{}else webViewClass.closeAll();await waitForExit(pids)}import{isMainThread}from"node:worker_threads";function isNativeWebViewClass(value2){return typeof value2=="function"&&typeof Reflect.get(value2,"closeAll")=="function"}function mainThreadWebViewClass(){if(!isMainThread)return;let bun=Reflect.get(globalThis,"Bun");if(typeof bun!="object"||bun===null)return;let webView=Reflect.get(bun,"WebView");return isNativeWebViewClass(webView)?webView:void 0}var WEBVIEW_METHODS=["navigate","evaluate","screenshot","click","type","press","scroll","scrollTo","resize","back","forward","reload","cdp"];function isRecord49(value2){return typeof value2=="object"&&value2!==null}function isMethod(value2){return WEBVIEW_METHODS.some(method=>method===value2)}function parseClientMessage(value2){if(!isRecord49(value2))return;let{kind,id,viewId}=value2;if(kind==="close-all")return typeof id=="number"?{kind,id}:void 0;if(typeof viewId=="string"){if(kind==="close")return{kind,viewId};if(kind==="listen")return typeof value2.event=="string"?{kind,viewId,event:value2.event}:void 0;if(typeof id=="number"){if(kind==="create"){let options=isRecord49(value2.options)?value2.options:{};return{kind,id,viewId,options,captureConsole:value2.captureConsole===!0}}if(kind==="call"&&isMethod(value2.method)&&Array.isArray(value2.args))return{kind,id,viewId,method:value2.method,args:value2.args}}}}function wireError(error2){if(!(error2 instanceof Error))return{name:"Error",message:String(error2)};let code=Reflect.get(error2,"code");return{name:error2.name,message:error2.message,...typeof code=="string"?{code}:{}}}function stateOf(view){return{url:view.url,title:view.title,loading:view.loading}}function closeQuietly(view){try{view.close()}catch{}}var WebViewServiceClient=class{#port;#host;#views=new Map;#launches=new Set;#released=!1;constructor(id,owner,port,host){this.id=id,this.owner=owner,this.#port=port,this.#host=host,port.on("message",message=>{this.#handle(parseClientMessage(message))}),port.on("close",()=>this.#host.onClientClosed(this)),port.unref()}get viewCount(){return this.#views.size}async settled(){await Promise.allSettled([...this.#launches])}release(){if(!this.#released){this.#released=!0;for(let view of this.#views.values())closeQuietly(view);this.#views.clear(),this.#port.close()}}async#handle(message){if(!(!message||this.#released))switch(message.kind){case"create":await this.#reply(message.id,async()=>({value:void 0,view:await this.#create(message.viewId,message.options,message.captureConsole)}));return;case"call":await this.#reply(message.id,async()=>{let view=this.#view(message.viewId),method=Reflect.get(view,message.method);if(typeof method!="function")throw new TypeError(`WebView.${message.method} is not available`);return{value:await Reflect.apply(method,view,[...message.args]),view}});return;case"close":{let view=this.#views.get(message.viewId);this.#views.delete(message.viewId),view&&closeQuietly(view);return}case"listen":{this.#views.get(message.viewId)?.addEventListener(message.event,event=>{let data=Reflect.get(event,"data");this.#emit(message.viewId,{type:"dom",name:message.event,data})});return}case"close-all":for(let view of this.#views.values())closeQuietly(view);this.#views.clear(),this.#post({kind:"reply",id:message.id,ok:!0,value:void 0});return}}async#create(viewId,options,captureConsole){if(this.#views.has(viewId))throw new Error(`WebView ${viewId} already exists`);let onConsole=captureConsole?(...args)=>this.#emit(viewId,{type:"console",args}):void 0,launch=this.#host.createView(options,onConsole,view=>this.#adopt(viewId,view));this.#launches.add(launch);try{return await launch}finally{this.#launches.delete(launch)}}#adopt(viewId,view){return this.#released?!1:(view.onNavigated=(url,title)=>this.#emit(viewId,{type:"navigated",url,title}),view.onNavigationFailed=error2=>this.#emit(viewId,{type:"navigation-failed",error:wireError(error2)}),this.#views.set(viewId,view),!0)}#view(viewId){let view=this.#views.get(viewId);if(view)return view;let error2=new Error(`Unknown WebView ${viewId}: it was closed or belongs to another kernel`);throw Reflect.set(error2,"code","ERR_INVALID_STATE"),error2}async#reply(id,work){try{let{value:value2,view}=await work();this.#post({kind:"reply",id,ok:!0,value:value2,state:stateOf(view)})}catch(error2){this.#post({kind:"reply",id,ok:!1,error:wireError(error2)})}}#emit(viewId,event){this.#post({kind:"event",viewId,event})}#post(message){if(!this.#released)try{this.#port.postMessage(message)}catch(error2){if(message.kind!=="reply"||!message.ok)return;this.#port.postMessage({kind:"reply",id:message.id,ok:!1,error:wireError(error2)})}}};var WebViewService=class{#webViewClass;#clients=new Map;#retiring=Promise.resolve();#chromeInUse=!1;#launching=0;constructor(webViewClass){this.#webViewClass=webViewClass}get viewCount(){let count=0;for(let client of this.#clients.values())count+=client.viewCount;return count}connect(owner){let clientId=randomUUID13(),channel=new MessageChannel2,client=new WebViewServiceClient(clientId,owner,channel.port1,{createView:(options,onConsole,adopt)=>this.#createView(options,onConsole,adopt),onClientClosed:closed=>{this.#drop(closed)}});return this.#clients.set(clientId,client),{clientId,port:channel.port2}}async release(clientId,owner){let client=this.#clients.get(clientId);client?.owner===owner&&await this.#drop(client),await this.#retiring}async releaseOwner(owner){let owned=[...this.#clients.values()].filter(client=>client.owner===owner);await Promise.all(owned.map(client=>this.#drop(client))),await this.#retiring}async#createView(options,onConsole,adopt){this.#launching++;let view;try{view=await this.#launch(onConsole?{...options,console:onConsole}:options)}catch(error2){throw this.#launching--,await this.#retireIfIdle(),error2}if(this.#launching--,adopt(view))return view;throw closeQuietly(view),await this.#retireIfIdle(),new Error("WebView client released")}async#launch(viewOptions){await this.#retiring,await settleDeadBunChrome(),this.#chromeInUse=!0;for(let attempt2=1;;attempt2++)try{return new this.#webViewClass(viewOptions)}catch(error2){if(!isChromeRelaunchWindow(error2)||attempt2>=RELAUNCH_ATTEMPTS)throw error2;await new Promise(resolve46=>setTimeout(resolve46,RELAUNCH_RETRY_MS))}}async#drop(client){if(this.#clients.get(client.id)!==client)return await this.#retiring;this.#clients.delete(client.id),client.release(),await client.settled(),await this.#retireIfIdle()}#retireIfIdle(){return!this.#chromeInUse||this.#busy()?this.#retiring:(this.#chromeInUse=!1,this.#retiring=this.#retiring.then(()=>this.#busy()?void 0:retireBunChrome(this.#webViewClass)),this.#retiring)}#busy(){return this.viewCount>0||this.#launching>0}},RELAUNCH_ATTEMPTS=8,RELAUNCH_RETRY_MS=250;function isChromeRelaunchWindow(error2){return error2 instanceof Error&&Reflect.get(error2,"code")==="ERR_DLOPEN_FAILED"}var SERVICE_KEY=Symbol.for("senpi.webview.service");function isWebViewService(value2){return value2 instanceof WebViewService}function mainThreadWebViewService(){let existing=Reflect.get(globalThis,SERVICE_KEY);if(isWebViewService(existing))return existing;let webViewClass=mainThreadWebViewClass();if(!webViewClass)return;let service2=new WebViewService(webViewClass);return Reflect.set(globalThis,SERVICE_KEY,service2),service2}var BROKER_KEY=Symbol.for("senpi.webview.broker");function isRecord50(value2){return typeof value2=="object"&&value2!==null}function parseBrokerRequest(value2){if(!(!isRecord50(value2)||typeof value2.id!="number")){if(value2.kind==="connect")return{kind:"connect",id:value2.id};if(value2.kind==="release"&&typeof value2.clientId=="string")return{kind:"release",id:value2.id,clientId:value2.clientId}}}function createWebViewBroker(){let service2=mainThreadWebViewService();if(!service2)return;let owner={},channel=new MessageChannel3,local=channel.port1,reply=(message,transfer=[])=>local.postMessage(message,transfer);return local.on("message",async value2=>{let request2=parseBrokerRequest(value2);if(request2)try{if(request2.kind==="connect"){let grant=service2.connect(owner);reply({kind:"connected",id:request2.id,clientId:grant.clientId,port:grant.port},[grant.port])}else await service2.release(request2.clientId,owner),reply({kind:"released",id:request2.id})}catch(error2){reply({kind:"failed",id:request2.id,message:error2 instanceof Error?error2.message:String(error2)})}}),local.on("close",()=>{service2.releaseOwner(owner)}),local.unref(),{port:channel.port2,dispose:async()=>{local.close(),await service2.releaseOwner(owner)}}}var WorkerBrokerClient=class{#port;#pending=new Map;#nextId=1;constructor(port){this.#port=port,port.on("message",reply=>{let settle=this.#pending.get(reply.id);this.#pending.delete(reply.id),settle?.(reply)}),port.unref()}async connect(){let reply=await this.#request({kind:"connect",id:this.#nextId++});if(reply.kind!=="connected")throw new Error(reply.kind==="failed"?reply.message:"unexpected broker reply");let clientId=reply.clientId;return{clientId,port:reply.port,release:async()=>{await this.#request({kind:"release",id:this.#nextId++,clientId})}}}#request(request2){return new Promise(resolve46=>{this.#pending.set(request2.id,resolve46),this.#port.postMessage(request2)})}};function isBrokerClient(value2){return value2 instanceof WorkerBrokerClient}async function connectWebViewService(){if(isMainThread2){let service2=mainThreadWebViewService();if(!service2)throw new Error("Bun.WebView is not available in this runtime");let owner={},grant=service2.connect(owner);return{...grant,release:()=>service2.release(grant.clientId,owner)}}let broker=Reflect.get(globalThis,BROKER_KEY);if(!isBrokerClient(broker))throw new Error("no route from this worker thread to the main-thread WebView service");return await broker.connect()}import{existsSync as existsSync49}from"node:fs";import{join as join89}from"node:path";import{createInterface as createInterface2}from"node:readline";var AuthCommandError=class extends Error{},AUTH_COMMAND_USAGE={check:`${APP_NAME} auth check --provider <provider> [--json] [--credentials] [--no-refresh]`,api_key:`${APP_NAME} auth print-api-key --provider <provider> [--model <model>]`,bearer_token:`${APP_NAME} auth print-bearer-token --provider <provider> [--model <model>] [--min-expiry <duration>]`};function getAuthCommandName(kind){return kind==="check"?"auth check":kind==="api_key"?"auth print-api-key":"auth print-bearer-token"}function getAuthCommandUsage(kind){return AUTH_COMMAND_USAGE[kind]}function isAuthCommandHelp(args){return args[0]==="auth"&&(args[1]===void 0||args[1]==="help"||args.includes("--help")||args.includes("-h"))}function printAuthCommandHelp(){console.log(`Usage:
2456
+ `)){let[pidText="",ppidText,stat14="",...command]=line.trim().split(/\s+/u);Number(ppidText)===process.pid&&stat14.startsWith("Z")&&BROWSER_NAME.test(command.join(" "))&&pids.push(pidText)}return positivePids(pids)}async function settleDeadBunChrome(){await waitForExit(await deadBrowserChildren())}async function retireBunChrome(webViewClass){if(process.platform==="win32"){let tree=await windowsBunChromeTree();webViewClass.closeAll();let running=tree.filter(alive);running.length>0&&await run("taskkill",["/F",...running.flatMap(pid=>["/PID",String(pid)])]),await waitForWindowsRemoval(tree);return}let pids=await bunChromePids();if(process.platform==="darwin")for(let pid of pids)try{process.kill(pid,"SIGKILL")}catch{}else webViewClass.closeAll();await waitForExit(pids)}import{isMainThread}from"node:worker_threads";function isNativeWebViewClass(value2){return typeof value2=="function"&&typeof Reflect.get(value2,"closeAll")=="function"}function mainThreadWebViewClass(){if(!isMainThread)return;let bun=Reflect.get(globalThis,"Bun");if(typeof bun!="object"||bun===null)return;let webView=Reflect.get(bun,"WebView");return isNativeWebViewClass(webView)?webView:void 0}var WEBVIEW_METHODS=["navigate","evaluate","screenshot","click","type","press","scroll","scrollTo","resize","back","forward","reload","cdp"];function isRecord49(value2){return typeof value2=="object"&&value2!==null}function isMethod(value2){return WEBVIEW_METHODS.some(method=>method===value2)}function parseClientMessage(value2){if(!isRecord49(value2))return;let{kind,id,viewId}=value2;if(kind==="close-all")return typeof id=="number"?{kind,id}:void 0;if(typeof viewId=="string"){if(kind==="close")return{kind,viewId};if(kind==="listen")return typeof value2.event=="string"?{kind,viewId,event:value2.event}:void 0;if(typeof id=="number"){if(kind==="create"){let options=isRecord49(value2.options)?value2.options:{};return{kind,id,viewId,options,captureConsole:value2.captureConsole===!0}}if(kind==="call"&&isMethod(value2.method)&&Array.isArray(value2.args))return{kind,id,viewId,method:value2.method,args:value2.args}}}}function wireError(error2){if(!(error2 instanceof Error))return{name:"Error",message:String(error2)};let code=Reflect.get(error2,"code");return{name:error2.name,message:error2.message,...typeof code=="string"?{code}:{}}}function stateOf(view){return{url:view.url,title:view.title,loading:view.loading}}function closeQuietly(view){try{view.close()}catch{}}var WebViewServiceClient=class{#port;#host;#views=new Map;#launches=new Set;#released=!1;constructor(id,owner,port,host){this.id=id,this.owner=owner,this.#port=port,this.#host=host,port.on("message",message=>{this.#handle(parseClientMessage(message))}),port.on("close",()=>this.#host.onClientClosed(this)),port.unref()}get viewCount(){return this.#views.size}async settled(){await Promise.allSettled([...this.#launches])}release(){if(!this.#released){this.#released=!0;for(let view of this.#views.values())closeQuietly(view);this.#views.clear(),this.#port.close()}}async#handle(message){if(!(!message||this.#released))switch(message.kind){case"create":await this.#reply(message.id,async()=>({value:void 0,view:await this.#create(message.viewId,message.options,message.captureConsole)}));return;case"call":await this.#reply(message.id,async()=>{let view=this.#view(message.viewId),method=Reflect.get(view,message.method);if(typeof method!="function")throw new TypeError(`WebView.${message.method} is not available`);return{value:await Reflect.apply(method,view,[...message.args]),view}});return;case"close":{let view=this.#views.get(message.viewId);this.#views.delete(message.viewId),view&&closeQuietly(view);return}case"listen":{this.#views.get(message.viewId)?.addEventListener(message.event,event=>{let data=Reflect.get(event,"data");this.#emit(message.viewId,{type:"dom",name:message.event,data})});return}case"close-all":for(let view of this.#views.values())closeQuietly(view);this.#views.clear(),this.#post({kind:"reply",id:message.id,ok:!0,value:void 0});return}}async#create(viewId,options,captureConsole){if(this.#views.has(viewId))throw new Error(`WebView ${viewId} already exists`);let onConsole=captureConsole?(...args)=>this.#emit(viewId,{type:"console",args}):void 0,launch=this.#host.createView(options,onConsole,view=>this.#adopt(viewId,view),()=>!this.#released);this.#launches.add(launch);try{return await launch}finally{this.#launches.delete(launch)}}#adopt(viewId,view){return this.#released?!1:(view.onNavigated=(url,title)=>this.#emit(viewId,{type:"navigated",url,title}),view.onNavigationFailed=error2=>this.#emit(viewId,{type:"navigation-failed",error:wireError(error2)}),this.#views.set(viewId,view),!0)}#view(viewId){let view=this.#views.get(viewId);if(view)return view;let error2=new Error(`Unknown WebView ${viewId}: it was closed or belongs to another kernel`);throw Reflect.set(error2,"code","ERR_INVALID_STATE"),error2}async#reply(id,work){try{let{value:value2,view}=await work();this.#post({kind:"reply",id,ok:!0,value:value2,state:stateOf(view)})}catch(error2){this.#post({kind:"reply",id,ok:!1,error:wireError(error2)})}}#emit(viewId,event){this.#post({kind:"event",viewId,event})}#post(message){if(!this.#released)try{this.#port.postMessage(message)}catch(error2){if(message.kind!=="reply"||!message.ok)return;this.#port.postMessage({kind:"reply",id:message.id,ok:!1,error:wireError(error2)})}}};import{appendFileSync as appendFileSync4}from"node:fs";var DEFAULT_READINESS={attachBoundMs:2e4,launchAttempts:2},READINESS_URL="about:blank";function readinessLogFromEnvironment(){let path13=process.env.SENPI_WEBVIEW_READINESS_LOG;if(path13)return event=>{let outcome=event.type==="ready"?`ready launch=${event.launch} attachMs=${event.attachMs}`:`stalled phase=${event.phase} launch=${event.launch} (Chrome retired)`;appendFileSync4(path13,`${new Date().toISOString()} pid=${process.pid} webview ${outcome}
2457
+ `)}}var WebViewNotReadyError=class extends Error{constructor(launches,policy){super(`Chrome-backed WebView never became ready: phase cdp-target-attach (Chrome did not attach a CDP session to the new view within ${policy.attachBoundMs} ms) on ${launches} launch(es); each stalled Chrome was retired`),this.code="ERR_WEBVIEW_NOT_READY",this.phase="cdp-target-attach",this.name="WebViewNotReadyError"}};function timedDeadline(boundMs){let timer;return{reached:new Promise(resolve46=>{timer=setTimeout(resolve46,boundMs)}),cancel:()=>clearTimeout(timer)}}async function attachedWithin(view,deadline){let startedAt=performance.now(),bound=deadline.reached.then(()=>{}),navigation=(async()=>await view.navigate(READINESS_URL))().then(()=>Math.round(performance.now()-startedAt));try{return await Promise.race([navigation,bound])}finally{deadline.cancel(),navigation.catch(()=>{})}}var WebViewService=class{#webViewClass;#readiness;#onReadiness;#attachDeadline;#clients=new Map;#retiring=Promise.resolve();#chromeInUse=!1;#launching=0;constructor(webViewClass,options={}){this.#webViewClass=webViewClass,this.#readiness={...DEFAULT_READINESS,...options.readiness},this.#onReadiness=options.onReadiness??(()=>{});let boundMs=this.#readiness.attachBoundMs;this.#attachDeadline=options.attachDeadline??(()=>timedDeadline(boundMs))}get viewCount(){let count=0;for(let client of this.#clients.values())count+=client.viewCount;return count}connect(owner){let clientId=randomUUID13(),channel=new MessageChannel2,client=new WebViewServiceClient(clientId,owner,channel.port1,{createView:(options,onConsole,adopt,wanted)=>this.#createView(options,onConsole,adopt,wanted),onClientClosed:closed=>{this.#drop(closed)}});return this.#clients.set(clientId,client),{clientId,port:channel.port2}}async release(clientId,owner){let client=this.#clients.get(clientId);client?.owner===owner&&await this.#drop(client),await this.#retiring}async releaseOwner(owner){let owned=[...this.#clients.values()].filter(client=>client.owner===owner);await Promise.all(owned.map(client=>this.#drop(client))),await this.#retiring}async#createView(options,onConsole,adopt,wanted){let viewOptions=onConsole?{...options,console:onConsole}:options;for(let launch=1;;launch++){this.#launching++;let view;try{view=await this.#launchReady(viewOptions,launch)}catch(error2){throw this.#launching--,await this.#retireIfIdle(),error2}if(this.#launching--,view){if(adopt(view))return view;throw closeQuietly(view),await this.#retireIfIdle(),new Error("WebView client released")}if(await this.#retireIfIdle(),!wanted())throw new Error("WebView client released");if(launch>=this.#readiness.launchAttempts)throw new WebViewNotReadyError(launch,this.#readiness)}}async#launchReady(viewOptions,launch){let view=await this.#launch(viewOptions),attachMs;try{attachMs=await attachedWithin(view,this.#attachDeadline(launch))}catch(error2){throw closeQuietly(view),error2}if(attachMs!==void 0)return this.#onReadiness({type:"ready",launch,attachMs}),view;closeQuietly(view),this.#onReadiness({type:"stalled",phase:"cdp-target-attach",launch})}async#launch(viewOptions){await this.#retiring,await settleDeadBunChrome(),this.#chromeInUse=!0;for(let attempt2=1;;attempt2++)try{return new this.#webViewClass(viewOptions)}catch(error2){if(!isChromeRelaunchWindow(error2)||attempt2>=RELAUNCH_ATTEMPTS)throw error2;await new Promise(resolve46=>setTimeout(resolve46,RELAUNCH_RETRY_MS))}}async#drop(client){if(this.#clients.get(client.id)!==client)return await this.#retiring;this.#clients.delete(client.id),client.release(),await client.settled(),await this.#retireIfIdle()}#retireIfIdle(){return!this.#chromeInUse||this.#busy()?this.#retiring:(this.#chromeInUse=!1,this.#retiring=this.#retiring.then(()=>this.#busy()?void 0:retireBunChrome(this.#webViewClass)),this.#retiring)}#busy(){return this.viewCount>0||this.#launching>0}},RELAUNCH_ATTEMPTS=8,RELAUNCH_RETRY_MS=250;function isChromeRelaunchWindow(error2){return error2 instanceof Error&&Reflect.get(error2,"code")==="ERR_DLOPEN_FAILED"}var SERVICE_KEY=Symbol.for("senpi.webview.service");function isWebViewService(value2){return value2 instanceof WebViewService}function mainThreadWebViewService(){let existing=Reflect.get(globalThis,SERVICE_KEY);if(isWebViewService(existing))return existing;let webViewClass=mainThreadWebViewClass();if(!webViewClass)return;let onReadiness=readinessLogFromEnvironment(),service2=new WebViewService(webViewClass,onReadiness?{onReadiness}:{});return Reflect.set(globalThis,SERVICE_KEY,service2),service2}var BROKER_KEY=Symbol.for("senpi.webview.broker");function isRecord50(value2){return typeof value2=="object"&&value2!==null}function parseBrokerRequest(value2){if(!(!isRecord50(value2)||typeof value2.id!="number")){if(value2.kind==="connect")return{kind:"connect",id:value2.id};if(value2.kind==="release"&&typeof value2.clientId=="string")return{kind:"release",id:value2.id,clientId:value2.clientId}}}function createWebViewBroker(){let service2=mainThreadWebViewService();if(!service2)return;let owner={},channel=new MessageChannel3,local=channel.port1,reply=(message,transfer=[])=>local.postMessage(message,transfer);return local.on("message",async value2=>{let request2=parseBrokerRequest(value2);if(request2)try{if(request2.kind==="connect"){let grant=service2.connect(owner);reply({kind:"connected",id:request2.id,clientId:grant.clientId,port:grant.port},[grant.port])}else await service2.release(request2.clientId,owner),reply({kind:"released",id:request2.id})}catch(error2){reply({kind:"failed",id:request2.id,message:error2 instanceof Error?error2.message:String(error2)})}}),local.on("close",()=>{service2.releaseOwner(owner)}),local.unref(),{port:channel.port2,dispose:async()=>{local.close(),await service2.releaseOwner(owner)}}}var WorkerBrokerClient=class{#port;#pending=new Map;#nextId=1;constructor(port){this.#port=port,port.on("message",reply=>{let settle=this.#pending.get(reply.id);this.#pending.delete(reply.id),settle?.(reply)}),port.unref()}async connect(){let reply=await this.#request({kind:"connect",id:this.#nextId++});if(reply.kind!=="connected")throw new Error(reply.kind==="failed"?reply.message:"unexpected broker reply");let clientId=reply.clientId;return{clientId,port:reply.port,release:async()=>{await this.#request({kind:"release",id:this.#nextId++,clientId})}}}#request(request2){return new Promise(resolve46=>{this.#pending.set(request2.id,resolve46),this.#port.postMessage(request2)})}};function isBrokerClient(value2){return value2 instanceof WorkerBrokerClient}async function connectWebViewService(){if(isMainThread2){let service2=mainThreadWebViewService();if(!service2)throw new Error("Bun.WebView is not available in this runtime");let owner={},grant=service2.connect(owner);return{...grant,release:()=>service2.release(grant.clientId,owner)}}let broker=Reflect.get(globalThis,BROKER_KEY);if(!isBrokerClient(broker))throw new Error("no route from this worker thread to the main-thread WebView service");return await broker.connect()}import{existsSync as existsSync49}from"node:fs";import{join as join89}from"node:path";import{createInterface as createInterface2}from"node:readline";var AuthCommandError=class extends Error{},AUTH_COMMAND_USAGE={check:`${APP_NAME} auth check --provider <provider> [--json] [--credentials] [--no-refresh]`,api_key:`${APP_NAME} auth print-api-key --provider <provider> [--model <model>]`,bearer_token:`${APP_NAME} auth print-bearer-token --provider <provider> [--model <model>] [--min-expiry <duration>]`};function getAuthCommandName(kind){return kind==="check"?"auth check":kind==="api_key"?"auth print-api-key":"auth print-bearer-token"}function getAuthCommandUsage(kind){return AUTH_COMMAND_USAGE[kind]}function isAuthCommandHelp(args){return args[0]==="auth"&&(args[1]===void 0||args[1]==="help"||args.includes("--help")||args.includes("-h"))}function printAuthCommandHelp(){console.log(`Usage:
2457
2458
  pi auth print-api-key [--provider <provider>] [--model <model>]
2458
2459
  pi auth print-bearer-token [--provider <provider>] [--model <model>] [--min-expiry <duration>]
2459
2460
  pi auth check [--provider <provider>] [--model <model>] [--json] [--credentials] [--no-refresh]
2460
2461
 
2461
- 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})}import{existsSync as existsSync39}from"node:fs";import{readdir as readdir5}from"node:fs/promises";import{join as join76}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync39(session.cwd)?!1:compareRepositoryIdentities(session.repositoryIdentity,current)==="same"}function newestFirst(a,b){return b.modified.getTime()-a.modified.getTime()}async function recordedCwd(dir){let names=(await readdir5(dir)).filter(name=>name.endsWith(".jsonl"));for(let name of names){let firstLine2;try{await readFileLines(join76(dir,name),line=>(firstLine2=line,!1));let header2=JSON.parse(firstLine2??"");if(typeof header2=="object"&&header2!==null&&"cwd"in header2&&typeof header2.cwd=="string")return header2.cwd}catch(error2){if(!(error2 instanceof Error))throw error2}}}async function sessionsAtVanishedPaths(cwd){let root=getSessionsDir();if(!existsSync39(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir5(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join76(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync39(recorded)||sessions2.push(...await listSessionsFromDir(dir))}return sessions2}async function listMovedSessions(cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[]:(options.sessionDir?await listSessionsFromDir(normalizePath(options.sessionDir)):await sessionsAtVanishedPaths(here)).filter(session=>isMoved(session,here,current)).map(session=>({...session,moved:!0})).sort(newestFirst)}async function markMovedSessions(sessions2,cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[...sessions2]:sessions2.map(session=>isMoved(session,here,current)?{...session,moved:!0}:session)}async function withMovedSessions(local,cwd,options={}){let[own,moved]=await Promise.all([local,listMovedSessions(cwd,options)]);return[...own,...moved].sort(newestFirst)}var FORK_PROMPT="Fork this session into current directory?",REBIND_PROMPT="Move this session here and continue it?";async function chooseCrossProjectAction(choice){let{sessionArg,sessionCwd,cwd,match}=choice,rebindHint=`If this directory is the same repository moved from ${sessionCwd}, use --rebind '${sessionArg}' to move the session here.`;return choice.interactive?(choice.out(source_default.yellow(`Session found in different project: ${sessionCwd}`)),match==="same"?await confirmSameRepositoryRebind(choice)?"rebind":"abort":(match==="unknown"&&choice.out(source_default.dim(rebindHint)),await choice.confirm(FORK_PROMPT)?"fork":"abort")):(choice.err(source_default.red(`Session found in different project: ${sessionCwd}`)),match==="same"?(choice.err(source_default.red(`${cwd} is the same git repository. Cannot confirm without an interactive session. Use --rebind '${sessionArg}' to move the session here, or --fork '${sessionArg}' to copy it into a new session.`)),"fail"):(choice.err(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${sessionArg}' to fork it into the current directory, or re-run interactively from ${sessionCwd}.`)),match==="unknown"&&choice.err(source_default.red(rebindHint)),"fail"))}async function confirmSameRepositoryRebind(choice){return choice.out(source_default.yellow(`This directory is the same git repository: ${choice.cwd}`)),choice.out(source_default.dim(`To copy it into a new session instead, use --fork '${choice.sessionArg}'.`)),choice.confirm(REBIND_PROMPT)}async function movedSessionToContinue(choice){let[newest]=await listMovedSessions(choice.cwd,choice);if(newest===void 0)return;if(!choice.interactive){choice.err(source_default.yellow(`A session of this repository was recorded at ${newest.cwd} before it moved. Use --rebind '${newest.id}' to continue it here.`));return}return choice.out(source_default.yellow(`Session found in different project: ${newest.cwd}`)),await confirmSameRepositoryRebind({sessionArg:newest.id,cwd:choice.cwd,confirm:choice.confirm,out:choice.out})?newest.path:void 0}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",SCHEDULE_COMMAND_ARGV="schedule";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-K3JGGB65.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-K3JGGB65.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-SZJAJX5J.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-ESRPUXI2.js");return await runHostCommand2(args.slice(1))}async function dispatchScheduleCommand(args){if(args[0]!==SCHEDULE_COMMAND_ARGV)return;let{runScheduleCommand}=await import("./schedule-command-BT36FE6F.js");return await runScheduleCommand(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat13}from"node:fs/promises";import{resolve as resolve40}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve40(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat13(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>
2462
+ 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})}import{existsSync as existsSync39}from"node:fs";import{readdir as readdir5}from"node:fs/promises";import{join as join76}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync39(session.cwd)?!1:compareRepositoryIdentities(session.repositoryIdentity,current)==="same"}function newestFirst(a,b){return b.modified.getTime()-a.modified.getTime()}async function recordedCwd(dir){let names=(await readdir5(dir)).filter(name=>name.endsWith(".jsonl"));for(let name of names){let firstLine2;try{await readFileLines(join76(dir,name),line=>(firstLine2=line,!1));let header2=JSON.parse(firstLine2??"");if(typeof header2=="object"&&header2!==null&&"cwd"in header2&&typeof header2.cwd=="string")return header2.cwd}catch(error2){if(!(error2 instanceof Error))throw error2}}}async function sessionsAtVanishedPaths(cwd){let root=getSessionsDir();if(!existsSync39(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir5(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join76(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync39(recorded)||sessions2.push(...await listSessionsFromDir(dir))}return sessions2}async function listMovedSessions(cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[]:(options.sessionDir?await listSessionsFromDir(normalizePath(options.sessionDir)):await sessionsAtVanishedPaths(here)).filter(session=>isMoved(session,here,current)).map(session=>({...session,moved:!0})).sort(newestFirst)}async function markMovedSessions(sessions2,cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[...sessions2]:sessions2.map(session=>isMoved(session,here,current)?{...session,moved:!0}:session)}async function withMovedSessions(local,cwd,options={}){let[own,moved]=await Promise.all([local,listMovedSessions(cwd,options)]);return[...own,...moved].sort(newestFirst)}var FORK_PROMPT="Fork this session into current directory?",REBIND_PROMPT="Move this session here and continue it?";async function chooseCrossProjectAction(choice){let{sessionArg,sessionCwd,cwd,match}=choice,rebindHint=`If this directory is the same repository moved from ${sessionCwd}, use --rebind '${sessionArg}' to move the session here.`;return choice.interactive?(choice.out(source_default.yellow(`Session found in different project: ${sessionCwd}`)),match==="same"?await confirmSameRepositoryRebind(choice)?"rebind":"abort":(match==="unknown"&&choice.out(source_default.dim(rebindHint)),await choice.confirm(FORK_PROMPT)?"fork":"abort")):(choice.err(source_default.red(`Session found in different project: ${sessionCwd}`)),match==="same"?(choice.err(source_default.red(`${cwd} is the same git repository. Cannot confirm without an interactive session. Use --rebind '${sessionArg}' to move the session here, or --fork '${sessionArg}' to copy it into a new session.`)),"fail"):(choice.err(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${sessionArg}' to fork it into the current directory, or re-run interactively from ${sessionCwd}.`)),match==="unknown"&&choice.err(source_default.red(rebindHint)),"fail"))}async function confirmSameRepositoryRebind(choice){return choice.out(source_default.yellow(`This directory is the same git repository: ${choice.cwd}`)),choice.out(source_default.dim(`To copy it into a new session instead, use --fork '${choice.sessionArg}'.`)),choice.confirm(REBIND_PROMPT)}async function movedSessionToContinue(choice){let[newest]=await listMovedSessions(choice.cwd,choice);if(newest===void 0)return;if(!choice.interactive){choice.err(source_default.yellow(`A session of this repository was recorded at ${newest.cwd} before it moved. Use --rebind '${newest.id}' to continue it here.`));return}return choice.out(source_default.yellow(`Session found in different project: ${newest.cwd}`)),await confirmSameRepositoryRebind({sessionArg:newest.id,cwd:choice.cwd,confirm:choice.confirm,out:choice.out})?newest.path:void 0}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",SCHEDULE_COMMAND_ARGV="schedule";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-VHCS5NXO.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-VHCS5NXO.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-VSOBULUS.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-2ZP7B3DA.js");return await runHostCommand2(args.slice(1))}async function dispatchScheduleCommand(args){if(args[0]!==SCHEDULE_COMMAND_ARGV)return;let{runScheduleCommand}=await import("./schedule-command-OUALJDGD.js");return await runScheduleCommand(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat13}from"node:fs/promises";import{resolve as resolve40}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve40(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat13(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>
2462
2463
  `;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(`
2463
2464
  `)}</file>
2464
2465
  `:text2+=`<file name="${absolutePath}"></file>
@@ -2517,11 +2518,11 @@ Press any key to continue...`)),await new Promise(resolve46=>{process.stdin.setR
2517
2518
  `)}await rebindSession(),initialMessage&&await session.prompt(initialMessage,{images:initialImages,sessionTitlePrompt:!1});for(let message of messages)await session.prompt(message,{sessionTitlePrompt:!1});if(await session.waitForSettledSessionWork(),mode==="text"){let lastMessage=session.state.messages.findLast(message=>message.role==="assistant");if(lastMessage?.role==="assistant"){let assistantMsg=lastMessage;if(assistantMsg.stopReason==="error"||assistantMsg.stopReason==="aborted"){let described=describeProviderFailureForUser(assistantMsg.errorMessage);console.error(described??(stripTurnRetrySuppressionPrefix(assistantMsg.errorMessage??"")||`Request ${assistantMsg.stopReason}`)),exitCode=1}else for(let content of assistantMsg.content)content.type==="text"?writeRawStdout(`${content.text}
2518
2519
  `):content.type==="providerNative"&&(writeRawStdout(`${formatProviderNativeSummary(assistantMsg,content,!1)}
2519
2520
  `),writeRawStdout(`${formatProviderNativeBody(content,!1)}
2520
- `))}}return 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()}}import{readdirSync as readdirSync17,readFileSync as readFileSync47}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform5){return platform5==="darwin"||platform5==="linux"?platform5:void 0}async function loadChildReaperSyscalls(platform5=process.platform){let supported=supportedPlatform(platform5);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry of readdirSync17("/proc")){let pid=Number(entry);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync47(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat14=linuxStat(pid),tail=stat14?.slice(stat14.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat14=linuxStat(pid),open10=stat14?.indexOf("(")??-1,close=stat14?.lastIndexOf(")")??-1;return stat14===void 0||open10===-1||close<=open10?"":stat14.slice(open10+1,close)}var CHILD_REAPER_ENV="SENPI_RPC_HOST_REAPER",CHILD_REAPER_MIN_WAITABLE_MS_ENV="SENPI_RPC_HOST_REAPER_MIN_WAITABLE_MS",MIN_WAITABLE_FLOOR_MS=5e3,DEFAULT_MIN_WAITABLE_MS=3e4,TICK_MS=1e3,WARN_INTERVAL_MS=5*6e4,WARN_AT_WAITING=10,TOP_NAMES=3;function resolveChildReaperConfig(env){let override=Number(env[CHILD_REAPER_MIN_WAITABLE_MS_ENV]);return{enabled:env[CHILD_REAPER_ENV]!=="0",tickMs:TICK_MS,minWaitableMs:Number.isFinite(override)&&override>0?clampWindow(override):DEFAULT_MIN_WAITABLE_MS}}function clampWindow(milliseconds){return Math.max(MIN_WAITABLE_FLOOR_MS,milliseconds)}function createChildReaper(options){let now2=options.now??Date.now,minWaitableMs=clampWindow(options.minWaitableMs??DEFAULT_MIN_WAITABLE_MS),tracked=new Map,lastWarnAt,report=(waiting,reaped)=>{options.log===void 0||reaped.length===0&&waiting.length<WARN_AT_WAITING||lastWarnAt!==void 0&&now2()-lastWarnAt<WARN_INTERVAL_MS||(lastWarnAt=now2(),options.log(`child reaper: reaped=${reaped.length} waiting=${waiting.length} top=${topNames(waiting,reaped)}`))};return{tick(){let children=options.syscalls.listDirectChildren(),present=new Set(children);for(let pid of[...tracked.keys()])present.has(pid)||tracked.delete(pid);let reaped=[];for(let pid of children){let child=tracked.get(pid)??{name:options.syscalls.describe(pid)||"unknown",waitableSince:void 0};if(tracked.set(pid,child),!options.syscalls.isWaitable(pid)){child.waitableSince=void 0;continue}if(child.waitableSince===void 0){child.waitableSince=now2();continue}now2()-child.waitableSince<minWaitableMs||options.syscalls.reapExited(pid)&&(tracked.delete(pid),reaped.push(child.name))}report(waitingNames(tracked),reaped)},get waitingPids(){return[...tracked].filter(([,child])=>child.waitableSince!==void 0).map(([pid])=>pid)}}}function waitingNames(tracked){return[...tracked.values()].filter(child=>child.waitableSince!==void 0).map(child=>child.name)}function topNames(waiting,reaped){let counts=new Map;for(let name of[...waiting,...reaped])counts.set(name,(counts.get(name)??0)+1);return[...counts].sort(([,left],[,right])=>right-left).slice(0,TOP_NAMES).map(([name,count])=>`${name} x${count}`).join(", ")}async function startHostChildReaper(log){let config=resolveChildReaperConfig(process.env);if(!config.enabled)return()=>{};let syscalls=await loadChildReaperSyscalls();if(syscalls===void 0)return log(`child reaper unavailable under ${runtimeName()}: children orphaned by a terminated worker thread stay as zombies until this host exits`),()=>{};let reaper=createChildReaper({syscalls,minWaitableMs:config.minWaitableMs,log}),timer=setInterval(()=>reaper.tick(),config.tickMs);return timer.unref(),()=>clearInterval(timer)}var orphanSyscalls;async function collectOrphanedChildren(pids){if(pids.length===0)return[];orphanSyscalls??=loadChildReaperSyscalls();let syscalls=await orphanSyscalls;return syscalls===void 0?[]:pids.filter(pid=>Number.isInteger(pid)&&pid>0&&syscalls.isWaitable(pid)&&syscalls.reapExited(pid))}function runtimeName(){return typeof globalThis.Bun>"u"?"Node":`Bun on ${process.platform}`}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-P65B4FWL.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 randomUUID14}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync48,mkdirSync as mkdirSync26,renameSync as renameSync20,rmSync as rmSync18}from"node:fs";import{basename as basename29,dirname as dirname49,join as join88,relative as relative19,resolve as resolve42,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path13){return toNamespacedPath(resolve42(path13))}function getQuarantineRoot(packageDir){let current=resolve42(packageDir);for(;;){if(basename29(current).toLowerCase()==="node_modules")return join88(current,QUARANTINE_DIR_NAME);let parent=dirname49(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{rmSync18(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=join88(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID14()}`);for(let loadedFile of loadedFiles){if(!existsSync48(loadedFile))continue;let quarantinePath=join88(quarantineRunDir,relative19(resolvedPackageDir,loadedFile));mkdirSync26(dirname49(quarantinePath),{recursive:!0}),renameSync20(loadedFile,quarantinePath),copyFileSync3(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(resolve46=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve46(data.trim()||void 0)}),process.stdin.resume()})}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(`
2521
+ `))}}return 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()}}import{readdirSync as readdirSync17,readFileSync as readFileSync47}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform5){return platform5==="darwin"||platform5==="linux"?platform5:void 0}async function loadChildReaperSyscalls(platform5=process.platform){let supported=supportedPlatform(platform5);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry of readdirSync17("/proc")){let pid=Number(entry);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync47(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat14=linuxStat(pid),tail=stat14?.slice(stat14.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat14=linuxStat(pid),open10=stat14?.indexOf("(")??-1,close=stat14?.lastIndexOf(")")??-1;return stat14===void 0||open10===-1||close<=open10?"":stat14.slice(open10+1,close)}var CHILD_REAPER_ENV="SENPI_RPC_HOST_REAPER",CHILD_REAPER_MIN_WAITABLE_MS_ENV="SENPI_RPC_HOST_REAPER_MIN_WAITABLE_MS",MIN_WAITABLE_FLOOR_MS=5e3,DEFAULT_MIN_WAITABLE_MS=3e4,TICK_MS=1e3,WARN_INTERVAL_MS=5*6e4,WARN_AT_WAITING=10,TOP_NAMES=3;function resolveChildReaperConfig(env){let override=Number(env[CHILD_REAPER_MIN_WAITABLE_MS_ENV]);return{enabled:env[CHILD_REAPER_ENV]!=="0",tickMs:TICK_MS,minWaitableMs:Number.isFinite(override)&&override>0?clampWindow(override):DEFAULT_MIN_WAITABLE_MS}}function clampWindow(milliseconds){return Math.max(MIN_WAITABLE_FLOOR_MS,milliseconds)}function createChildReaper(options){let now2=options.now??Date.now,minWaitableMs=clampWindow(options.minWaitableMs??DEFAULT_MIN_WAITABLE_MS),tracked=new Map,lastWarnAt,report=(waiting,reaped)=>{options.log===void 0||reaped.length===0&&waiting.length<WARN_AT_WAITING||lastWarnAt!==void 0&&now2()-lastWarnAt<WARN_INTERVAL_MS||(lastWarnAt=now2(),options.log(`child reaper: reaped=${reaped.length} waiting=${waiting.length} top=${topNames(waiting,reaped)}`))};return{tick(){let children=options.syscalls.listDirectChildren(),present=new Set(children);for(let pid of[...tracked.keys()])present.has(pid)||tracked.delete(pid);let reaped=[];for(let pid of children){let child=tracked.get(pid)??{name:options.syscalls.describe(pid)||"unknown",waitableSince:void 0};if(tracked.set(pid,child),!options.syscalls.isWaitable(pid)){child.waitableSince=void 0;continue}if(child.waitableSince===void 0){child.waitableSince=now2();continue}now2()-child.waitableSince<minWaitableMs||options.syscalls.reapExited(pid)&&(tracked.delete(pid),reaped.push(child.name))}report(waitingNames(tracked),reaped)},get waitingPids(){return[...tracked].filter(([,child])=>child.waitableSince!==void 0).map(([pid])=>pid)}}}function waitingNames(tracked){return[...tracked.values()].filter(child=>child.waitableSince!==void 0).map(child=>child.name)}function topNames(waiting,reaped){let counts=new Map;for(let name of[...waiting,...reaped])counts.set(name,(counts.get(name)??0)+1);return[...counts].sort(([,left],[,right])=>right-left).slice(0,TOP_NAMES).map(([name,count])=>`${name} x${count}`).join(", ")}async function startHostChildReaper(log){let config=resolveChildReaperConfig(process.env);if(!config.enabled)return()=>{};let syscalls=await loadChildReaperSyscalls();if(syscalls===void 0)return log(`child reaper unavailable under ${runtimeName()}: children orphaned by a terminated worker thread stay as zombies until this host exits`),()=>{};let reaper=createChildReaper({syscalls,minWaitableMs:config.minWaitableMs,log}),timer=setInterval(()=>reaper.tick(),config.tickMs);return timer.unref(),()=>clearInterval(timer)}var orphanSyscalls;async function collectOrphanedChildren(pids){if(pids.length===0)return[];orphanSyscalls??=loadChildReaperSyscalls();let syscalls=await orphanSyscalls;return syscalls===void 0?[]:pids.filter(pid=>Number.isInteger(pid)&&pid>0&&syscalls.isWaitable(pid)&&syscalls.reapExited(pid))}function runtimeName(){return typeof globalThis.Bun>"u"?"Node":`Bun on ${process.platform}`}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-3ZZLFX55.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 randomUUID14}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync48,mkdirSync as mkdirSync26,renameSync as renameSync20,rmSync as rmSync18}from"node:fs";import{basename as basename29,dirname as dirname49,join as join88,relative as relative19,resolve as resolve42,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path13){return toNamespacedPath(resolve42(path13))}function getQuarantineRoot(packageDir){let current=resolve42(packageDir);for(;;){if(basename29(current).toLowerCase()==="node_modules")return join88(current,QUARANTINE_DIR_NAME);let parent=dirname49(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{rmSync18(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=join88(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID14()}`);for(let loadedFile of loadedFiles){if(!existsSync48(loadedFile))continue;let quarantinePath=join88(quarantineRunDir,relative19(resolvedPackageDir,loadedFile));mkdirSync26(dirname49(quarantinePath),{recursive:!0}),renameSync20(loadedFile,quarantinePath),copyFileSync3(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(resolve46=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve46(data.trim()||void 0)}),process.stdin.resume()})}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(`
2521
2522
  `));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}
2522
2523
  `),!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}
2523
- `),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(resolve46=>{let rl=createInterface2({input:process.stdin,output:process.stdout}),settled=!1,settle=result3=>{settled||(settled=!0,resolve46(result3))};rl.question(`${message} [y/N] `,answer=>{let normalized2=answer.trim().toLowerCase();settle(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle(!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 validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind 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 rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}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.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}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":{let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}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-MMTSHPR5.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync49(recentFile))return recent;let moved=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return moved===void 0?recent:rebindSessionOrExit(moved,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.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),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.serviceTier=resolved.serviceTier,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,serviceTier:sm.serviceTier}))),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),setTheme=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme(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),createServices=async({cwd:cwd2,agentDir:agentDir2,projectTrustContext,launchProfile,mcpRegistry,isInitialRuntime})=>{let 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});return{services:await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:sessionExtensionFlagValues(parsed.unknownFlags,launchProfile),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:{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}}),projectTrustDiagnostics}};return Object.assign(async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},{services,projectTrustDiagnostics}=await createServices({cwd:cwd2,agentDir:agentDir2,...projectTrustContext!==void 0?{projectTrustContext}:{},...launchProfile!==void 0?{launchProfile}:{},...mcpRegistry!==void 0?{mcpRegistry}:{},isInitialRuntime});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors),...(resourceLoader.getExtensions().warnings??[]).map(({path:path13,warning})=>({type:"warning",message:`Extension package "${path13}": ${warning}`}))],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"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,initialModelProvenance:sessionOptions.initialModelProvenance,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,serviceTier:sessionOptions.serviceTier,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),promptSurface:launchProfile?.promptSurface});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}},{prepare:async options=>{await createServices({...options,isInitialRuntime:!0})}})}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))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());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 scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&process.exit(scheduleExitCode);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),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(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-HRBHYKR3.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,...collectSettingsDiagnosticsWithContext(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-5C2TC4BN.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join89(agentDir,"auth.json")),authPath:join89(agentDir,"auth.json"),agentDir,modelsPath:join89(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...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{services,session,modelFallbackMessage}=runtime,{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)),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");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))}let stopChildReaper=await startHostChildReaper(appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
2524
- `)});if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-FJGYYLVG.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-LBS4DGTM.js"),interactiveMode=new InteractiveMode2(runtime,{migratedProviders,legacyPiEditNotice:legacyPiEditStartupNotice(),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(resolve46=>setTimeout(resolve46,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve46=>process.stdout.once("drain",resolve46)),process.stderr.writableLength>0&&await new Promise(resolve46=>process.stderr.once("drain",resolve46)),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")),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import{spawn as spawn9}from"node:child_process";import{createConnection as createConnection3}from"node:net";var REQUEST_DEADLINE_MS=3e4,PROMPT_COMPACTION_DEADLINE_MS=SUMMARIZATION_TOTAL_BUDGET_MS+SUMMARIZATION_MAX_DURATION_CAP_MS+REQUEST_DEADLINE_MS,PROMPT_ACK_MAX_WAIT_MS=PROMPT_COMPACTION_DEADLINE_MS+REQUEST_DEADLINE_MS,OPEN_AFTER_QUEUED_DEADLINE_MS=10*6e4;function openStalledMessage(position){let queued=typeof position=="number"?` at queue position ${position}`:"",minutes=OPEN_AFTER_QUEUED_DEADLINE_MS/6e4;return`open_session was accepted by the host${queued} but not answered within ${minutes} minutes`}function armRequestDeadline(ms,message,expire){let timer=setTimeout(()=>expire(new Error(message())),ms);return{extend(nextMs,nextMessage){clearTimeout(timer),timer=setTimeout(()=>expire(new Error(nextMessage())),nextMs)},clear(){clearTimeout(timer)}}}var RpcCommandError=class extends Error{constructor(message,errorCode4,errorData){super(message),this.name="RpcCommandError",this.errorCode=errorCode4,this.errorData=errorData}};function isProviderAccountEvent(event){return event.type==="auth_accounts_changed"||event.type==="account_failover"}var RpcTransportGoneError=class extends Error{constructor(message="Shared RPC host is unavailable"){super(message),this.code="rpc_transport_gone",this.name="RpcTransportGoneError"}};function isTransportGoneError(error2){return error2 instanceof RpcTransportGoneError||error2 instanceof Error&&(error2.message==="Client not started"||error2.message.startsWith("RPC transport is not writable.")||error2.message==="RPC socket closed")}var RpcClientOpenInFlightError=class extends Error{constructor(){super("An open_session request is already in flight"),this.code="open_session_in_flight",this.name="RpcClientOpenInFlightError"}},MAX_PENDING_SESSION_EVENTS=512,MAX_PENDING_SESSION_EVENT_BYTES=1024*1024,RpcClient=class{constructor(options={}){this.process=null,this.socket=null,this.stopReadingStdout=null,this.eventListeners=[],this.pendingRequests=new Map,this.requestId=0,this.compactions=new Map,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.stderr="",this.exitError=null,this.disconnectNotified=!1,this.stopping=!1,this.options=options,this.onEvent(event=>{switch(event.type){case"compaction_start":{let key=event.requestId??"";if(this.compactions.has(key))return;this.compactions.set(key,Date.now());break}case"compaction_end":if(!this.compactions.delete(event.requestId??""))return;break;case"session_replaced":this.compactions.clear();break;default:return}for(let pending of this.pendingRequests.values())pending.sessionId===this.sessionId&&pending.onCompaction?.(this.isCompacting())})}async start(){if(this.process||this.socket)throw new Error("Client already started");if(this.exitError=null,this.compactions.clear(),this.stopping=!1,this.disconnectNotified=!1,this.options.socketPath){await this.startSocket(this.options.socketPath);return}let cliPath=this.options.cliPath??"dist/cli.js",args=["--mode","rpc"];this.options.provider&&this.options.model&&args.push("--provider",this.options.provider),this.options.model&&args.push("--model",this.options.model),this.options.args&&args.push(...this.options.args);let childProcess=spawn9("node",[cliPath,...args],{cwd:this.options.cwd,env:{...process.env,SENPI_RUNTIME:"node",...this.options.env},stdio:["pipe","pipe","pipe"],windowsHide:!0});if(this.process=childProcess,childProcess.stderr?.on("data",data=>{this.stderr+=data.toString(),process.stderr.write(data)}),childProcess.once("exit",(code,signal)=>{if(this.process!==childProcess)return;let error2=this.createProcessExitError(code,signal);this.exitError=error2,this.rejectPendingRequests(error2)}),childProcess.once("error",error2=>{if(this.process!==childProcess)return;let processError=new Error(`Agent process error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=processError,this.rejectPendingRequests(processError)}),childProcess.stdin?.on("error",error2=>{if(this.process!==childProcess)return;let stdinError=this.exitError??new Error(`Agent process stdin error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=stdinError,this.rejectPendingRequests(stdinError)}),this.stopReadingStdout=attachJsonlLineReader(childProcess.stdout,line=>{this.handleLine(line)}),await new Promise(resolve46=>setTimeout(resolve46,100)),this.process.exitCode!==null){let error2=this.exitError??this.createProcessExitError(this.process.exitCode,this.process.signalCode);throw this.exitError=error2,error2}}isCompacting(){let now2=Date.now();for(let[key,startedAt]of this.compactions)now2-startedAt>=PROMPT_COMPACTION_DEADLINE_MS&&this.compactions.delete(key);return this.compactions.size>0}async stop(){if(this.compactions.clear(),this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.socket){this.stopping=!0,this.stopReadingStdout?.(),this.stopReadingStdout=null,this.socket.destroy(),this.socket=null,this.sessionId=void 0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.notifyDisconnect(new RpcTransportGoneError);return}this.process&&(this.stopReadingStdout?.(),this.stopReadingStdout=null,this.process.kill("SIGTERM"),await new Promise(resolve46=>{let timeout=setTimeout(()=>{this.process?.kill("SIGKILL"),resolve46()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve46()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path13){let secret=socketNeedsHandshake(path13)?await readSocketSecret(socketSecretPath(path13)):void 0,socket=createConnection3(resolveSocketTransportAddress(path13,process.platform,secret));this.socket=socket,await new Promise((resolve46,reject)=>{let onConnect=()=>{cleanup(),resolve46()},onError=error2=>{cleanup(),this.socket=null,reject(error2)},cleanup=()=>{socket.off("connect",onConnect),socket.off("error",onError)};socket.once("connect",onConnect),socket.once("error",onError)}),secret&&sendSocketHandshake(socket,secret),this.stopReadingStdout=attachJsonlLineReader(socket,line=>this.handleLine(line)),socket.once("close",()=>{this.socket===socket&&(this.socket=null,this.notifyDisconnect(new RpcTransportGoneError))}),socket.once("error",error2=>{this.socket===socket&&this.notifyDisconnect(new RpcTransportGoneError)})}onEvent(listener){return this.eventListeners.push(listener),()=>{let index=this.eventListeners.indexOf(listener);index!==-1&&this.eventListeners.splice(index,1)}}getStderr(){return this.stderr}async setClientInfo(width,capabilities){await this.send({type:"set_client_info",width,capabilities},this.sessionId!==void 0)}async openSession(options){if(this.pendingOpenSession)throw new RpcClientOpenInFlightError;this.pendingOpenSession=!0;try{let response=await this.send({type:"open_session",...options},!1),opened=this.getData(response);return this.sessionId=opened.sessionId,this.compactions.clear(),this.pendingOpenSession=!1,this.flushPendingSessionEvents(),opened}catch(error2){throw this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,error2}}async sendExtensionUIResponse(response){await this.send(response,!0,void 0,!1)}async sendExtensionUIProgress(progress){await this.send(progress,!0,void 0,!1)}async closeSession(sessionId=this.sessionId){if(sessionId){try{await this.send({type:"close_session",sessionId},!1)}catch(error2){if(!isTransportGoneError(error2))throw error2}this.sessionId===sessionId&&(this.sessionId=void 0,this.compactions.clear())}}async listSessions(){let response=await this.send({type:"list_sessions"},!1);return this.getData(response).sessions}async prompt(message,optionsOrImages){let options=Array.isArray(optionsOrImages)?{images:optionsOrImages}:optionsOrImages??{},response=await this.send({type:"prompt",message,...clientMessageIdentity(options),...options.images?{images:options.images}:{},...options.streamingBehavior?{streamingBehavior:options.streamingBehavior}:{},...options.thinkingLevel?{thinkingLevel:options.thinkingLevel}:{},...options.sessionTitlePrompt!==void 0?{sessionTitlePrompt:options.sessionTitlePrompt}:{},...options.expandPromptTemplates!==void 0?{expandPromptTemplates:options.expandPromptTemplates}:{},...options.unknownCommandAsText?{unknownCommandAsText:!0}:{}},!0,{onResponse:wireResponse=>{if(!wireResponse.success){options?.preflightResult?.(!1);return}let data=wireResponse.data;options?.promptDisposition?.(data?.disposition??"handled"),options?.preflightResult?.(!0)},onReject:()=>{options?.preflightResult?.(!1)}});if(!response.success){let failure2=response;throw(failure2.errorCode===RPC_ERROR_UNKNOWN_COMMAND?unknownCommandErrorFromWire(failure2.errorData):void 0)??new RpcCommandError(failure2.error,failure2.errorCode,failure2.errorData)}return response.data?.disposition??"handled"}async appendUserMessage(content){await this.send({type:"append_user_message",content})}async appendSessionEntry(entry){await this.send({type:"append_session_entry",entry})}async sendCustomMessage(message,options){await this.send({type:"send_custom_message",...message,...options})}async steer(message,images,recovery){let response=await this.send({type:"steer",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async followUp(message,images,recovery){let response=await this.send({type:"follow_up",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async abort(){try{await this.send({type:"abort"})}catch(error2){if(!isTransportGoneError(error2))throw error2}}async abortCompaction(){await this.send({type:"abort_compaction"})}async reload(){let response=await this.send({type:"reload"});return this.getData(response)}async checkReloadVeto(){let response=await this.send({type:"check_reload_veto"});return this.getData(response)}async clearQueue(options){let response=await this.send({type:"clear_queue",abortWillFollow:options?.abortWillFollow});return this.getData(response)}async getSteeringMessages(){let response=await this.send({type:"get_steering_messages"});return this.getData(response).messages}async getFollowUpMessages(){let response=await this.send({type:"get_follow_up_messages"});return this.getData(response).messages}async abortBranchSummary(){await this.send({type:"abort_branch_summary"})}async recordBashResult(command,result3,excludeFromContext){await this.send({type:"record_bash_result",command,result:result3,excludeFromContext})}async setLabel(entryId,label3){await this.send({type:"set_label",entryId,label:label3})}async newSession(parentSession){let response=await this.send({type:"new_session",parentSession});return this.getData(response)}async getState(){let response=await this.send({type:"get_state"});return this.getData(response)}async setModel(provider,modelId){let response=await this.send({type:"set_model",provider,modelId});return this.getData(response)}async setFavoriteModels(models){await this.send({type:"set_favorite_models",models})}async setScopedModels(models){await this.send({type:"set_scoped_models",models})}async cycleModel(direction="forward"){let response=await this.send({type:"cycle_model",direction});return this.getData(response)}async getAvailableModels(){let response=await this.send({type:"get_available_models"});return this.getData(response).models}async setThinkingLevel(level,options){let response=await this.send({type:"set_thinking_level",level,scope:options?.scope});if(!response.success)throw new Error(response.error)}async cycleThinkingLevel(){let response=await this.send({type:"cycle_thinking_level"});return this.getData(response)}async getAvailableThinkingLevels(){let response=await this.send({type:"get_available_thinking_levels"});return this.getData(response).levels}async setFastMode(enabled){let response=await this.send({type:"set_fast_mode",enabled});return this.getData(response)}async getFastMode(){let response=await this.send({type:"get_fast_mode"});return this.getData(response)}async setSteeringMode(mode){await this.send({type:"set_steering_mode",mode})}async setFollowUpMode(mode){await this.send({type:"set_follow_up_mode",mode})}async compact(customInstructions){let response=await this.send({type:"compact",customInstructions});return this.getData(response)}async setAutoCompaction(enabled){await this.send({type:"set_auto_compaction",enabled})}async setAutoRetry(enabled){await this.send({type:"set_auto_retry",enabled})}async abortRetry(){await this.send({type:"abort_retry"})}async bash(command,options){let response=await this.send({type:"bash",command,excludeFromContext:options?.excludeFromContext,executionId:options?.executionId,operations:options?.operations});return this.getData(response)}async navigateTree(targetId,options){let response=await this.send({type:"navigate_tree",targetId,...options});return this.getData(response)}async abortBash(){await this.send({type:"abort_bash"})}async cleanupBashOutput(path13){await this.send({type:"cleanup_bash_output",path:path13})}async getSessionStats(){let response=await this.send({type:"get_session_stats"});return this.getData(response)}async exportHtml(outputPath,themeName){let response=await this.send({type:"export_html",outputPath,themeName});return this.getData(response)}async exportJsonl(outputPath){let response=await this.send({type:"export_jsonl",outputPath});return this.getData(response)}async switchSession(sessionPath,options){let response=await this.send({type:"switch_session",sessionPath,cwdOverride:options?.cwdOverride});return this.getData(response)}async fork(entryId,options){let response=await this.send({type:"fork",entryId,position:options?.position});return this.getData(response)}async clone(){let response=await this.send({type:"clone"});return this.getData(response)}async getForkMessages(){let response=await this.send({type:"get_fork_messages"});return this.getData(response).messages}async getEntries(since){let response=await this.send({type:"get_entries",since});return this.getData(response)}async getTree(){let response=await this.send({type:"get_tree"});return this.getData(response)}async editAssistantMessage(entryId,text2,options={}){let response=await this.send({type:"edit_assistant_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async editUserMessage(entryId,text2,options={}){let response=await this.send({type:"edit_user_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async getLastAssistantText(){let response=await this.send({type:"get_last_assistant_text"});return this.getData(response).text}async setSessionName(name){await this.send({type:"set_session_name",name})}async importJsonl(inputPath,cwdOverride){let response=await this.send({type:"import_jsonl",inputPath,cwdOverride});return this.getData(response)}async getMessages(){let response=await this.send({type:"get_messages"});return this.getData(response).messages}async getMedia(toolCallId,contentIndex){let response=await this.send({type:"get_media",toolCallId,contentIndex});return this.getData(response).content}async getCommands(){let response=await this.send({type:"get_commands"});return this.getData(response).commands}async requestExtension(name,data){let response=await this.send({type:"extension_request",name,...data===void 0?{}:{data}});return this.getData(response)}async getProviderAccounts(provider){let response=await this.send({type:"get_provider_accounts",provider});return this.getData(response).accounts}async pinProviderAccount(provider,name){await this.send({type:"account_pin",provider,name})}async removeProviderAccount(provider,name){await this.send({type:"account_remove",provider,name})}waitForIdle(timeout=6e4){return new Promise((resolve46,reject)=>{let timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve46())})})}collectEvents(timeout=6e4){return new Promise((resolve46,reject)=>{let events=[],timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{isProviderAccountEvent(event)||event.type==="extension_event"||event.type==="bash_start"||event.type==="bash_end"||event.type==="extension_ui_request"||event.type==="session_replaced"||event.type==="session_parked"||event.type==="queued"||(events.push(event),event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve46(events)))})})}async promptAndWait(message,images,timeout=6e4){let eventsPromise=this.collectEvents(timeout);return await this.prompt(message,images?{images}:void 0),eventsPromise}handleLine(line){try{let data=JSON.parse(line);if(data.type==="response"&&data.id&&this.pendingRequests.has(data.id)){let pending=this.pendingRequests.get(data.id);this.pendingRequests.delete(data.id),pending.onResponse?.(data),pending.resolve(data);return}if(data.type==="queued"&&typeof data.for_request=="string"&&this.pendingRequests.get(data.for_request)?.onQueued?.(data.position),typeof data.sessionId=="string"&&data.sessionId!==this.sessionId){if(this.pendingOpenSession){let bytes=Buffer.byteLength(line);for(this.pendingSessionEvents.push({sessionId:data.sessionId,event:data,bytes}),this.pendingSessionEventBytes+=bytes;this.pendingSessionEvents.length>MAX_PENDING_SESSION_EVENTS||this.pendingSessionEventBytes>MAX_PENDING_SESSION_EVENT_BYTES;){let oldest=this.pendingSessionEvents.shift();if(!oldest)break;this.pendingSessionEventBytes-=oldest.bytes}}return}for(let listener of[...this.eventListeners])listener(data)}catch{}}flushPendingSessionEvents(){let pending=this.pendingSessionEvents;this.pendingSessionEvents=[],this.pendingSessionEventBytes=0;for(let{sessionId,event}of pending)if(sessionId===this.sessionId)for(let listener of[...this.eventListeners])listener(event)}createProcessExitError(code,signal){return new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`)}notifyDisconnect(error2){this.rejectPendingRequests(error2),!this.disconnectNotified&&!this.stopping&&(this.disconnectNotified=!0,this.options.onDisconnect?.(error2))}rejectPendingRequests(error2){for(let pending of this.pendingRequests.values())pending.onReject?.(error2),pending.reject(error2);this.pendingRequests.clear()}async send(command,route=!0,hooks,expectResponse=!0){let childProcess=this.process,stream2=this.socket??childProcess?.stdin;if(!stream2)throw new RpcTransportGoneError;if(this.exitError)throw this.exitError;if(childProcess?.exitCode!==null&&childProcess?.exitCode!==void 0){let error2=this.createProcessExitError(childProcess.exitCode,childProcess.signalCode);throw this.exitError=error2,error2}if(stream2.destroyed||!stream2.writable){let error2=new RpcTransportGoneError;throw this.notifyDisconnect(error2),error2}let ownId=command.type==="extension_ui_response"||command.type==="extension_ui_progress"?command.id:void 0,id=ownId??`req_${++this.requestId}`,fullCommand={...command,...route&&this.sessionId&&!("sessionId"in command)?{sessionId:this.sessionId}:{},...ownId===void 0?{id}:{}};if(!expectResponse)return stream2.write(serializeJsonLine(fullCommand)),Promise.resolve({type:"response",command:command.type,success:!0});let sessionId="sessionId"in fullCommand?fullCommand.sessionId:void 0;return new Promise((resolve46,reject)=>{let timeoutMessage=()=>`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`,promptCap,expire=timeoutError=>{clearTimeout(promptCap);let pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(timeoutError),reject(timeoutError)},deadline=armRequestDeadline(command.type==="prompt"&&sessionId===this.sessionId&&this.isCompacting()?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage,expire);command.type==="prompt"&&(promptCap=setTimeout(()=>{deadline.clear(),expire(new Error(timeoutMessage()))},PROMPT_ACK_MAX_WAIT_MS)),this.pendingRequests.set(id,{sessionId,resolve:response=>{deadline.clear(),clearTimeout(promptCap),resolve46(response)},reject:error2=>{deadline.clear(),clearTimeout(promptCap),reject(error2)},...command.type==="prompt"?{onCompaction:compacting=>deadline.extend(compacting?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage)}:{},...command.type==="open_session"?{onQueued:position=>deadline.extend(OPEN_AFTER_QUEUED_DEADLINE_MS,()=>openStalledMessage(position))}:{},...hooks?.onResponse?{onResponse:hooks.onResponse}:{},...hooks?.onReject?{onReject:hooks.onReject}:{}});try{stream2.write(serializeJsonLine(fullCommand))}catch(error2){let writeError=error2 instanceof Error?error2:new Error(String(error2)),pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(writeError),pending?.reject(writeError)}})}getData(response){if(!response.success){let errorResponse=response;throw errorResponse.errorCode==="missing_session_cwd"&&errorResponse.errorData?new MissingSessionCwdError(errorResponse.errorData):new RpcCommandError(errorResponse.error,errorResponse.errorCode,errorResponse.errorData)}return response.data}};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 label3=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:label3,thinkingRun}):descriptors.push({kind:"thinking-label",text:label3,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
2524
+ `),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(resolve46=>{let rl=createInterface2({input:process.stdin,output:process.stdout}),settled=!1,settle=result3=>{settled||(settled=!0,resolve46(result3))};rl.question(`${message} [y/N] `,answer=>{let normalized2=answer.trim().toLowerCase();settle(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle(!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 validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind 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 rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}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.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}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":{let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}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-UYF62GAF.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync49(recentFile))return recent;let moved=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return moved===void 0?recent:rebindSessionOrExit(moved,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.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),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.serviceTier=resolved.serviceTier,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,serviceTier:sm.serviceTier}))),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),setTheme=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme(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),createServices=async({cwd:cwd2,agentDir:agentDir2,projectTrustContext,launchProfile,mcpRegistry,isInitialRuntime})=>{let 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});return{services:await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:sessionExtensionFlagValues(parsed.unknownFlags,launchProfile),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:{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}}),projectTrustDiagnostics}};return Object.assign(async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},{services,projectTrustDiagnostics}=await createServices({cwd:cwd2,agentDir:agentDir2,...projectTrustContext!==void 0?{projectTrustContext}:{},...launchProfile!==void 0?{launchProfile}:{},...mcpRegistry!==void 0?{mcpRegistry}:{},isInitialRuntime});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors),...(resourceLoader.getExtensions().warnings??[]).map(({path:path13,warning})=>({type:"warning",message:`Extension package "${path13}": ${warning}`}))],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"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,initialModelProvenance:sessionOptions.initialModelProvenance,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,serviceTier:sessionOptions.serviceTier,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),promptSurface:launchProfile?.promptSurface});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}},{prepare:async options=>{await createServices({...options,isInitialRuntime:!0})}})}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))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());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 scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&process.exit(scheduleExitCode);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),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(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-HRBHYKR3.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,...collectSettingsDiagnosticsWithContext(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-GFWO2JUC.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join89(agentDir,"auth.json")),authPath:join89(agentDir,"auth.json"),agentDir,modelsPath:join89(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...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{services,session,modelFallbackMessage}=runtime,{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)),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");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))}let stopChildReaper=await startHostChildReaper(appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
2525
+ `)});if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-KAZWRS2K.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-LBBIPYPZ.js"),interactiveMode=new InteractiveMode2(runtime,{migratedProviders,legacyPiEditNotice:legacyPiEditStartupNotice(),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(resolve46=>setTimeout(resolve46,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve46=>process.stdout.once("drain",resolve46)),process.stderr.writableLength>0&&await new Promise(resolve46=>process.stderr.once("drain",resolve46)),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")),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import{spawn as spawn9}from"node:child_process";import{createConnection as createConnection3}from"node:net";var REQUEST_DEADLINE_MS=3e4,PROMPT_COMPACTION_DEADLINE_MS=SUMMARIZATION_TOTAL_BUDGET_MS+SUMMARIZATION_MAX_DURATION_CAP_MS+REQUEST_DEADLINE_MS,PROMPT_ACK_MAX_WAIT_MS=PROMPT_COMPACTION_DEADLINE_MS+REQUEST_DEADLINE_MS,OPEN_AFTER_QUEUED_DEADLINE_MS=10*6e4;function openStalledMessage(position){let queued=typeof position=="number"?` at queue position ${position}`:"",minutes=OPEN_AFTER_QUEUED_DEADLINE_MS/6e4;return`open_session was accepted by the host${queued} but not answered within ${minutes} minutes`}function armRequestDeadline(ms,message,expire){let timer=setTimeout(()=>expire(new Error(message())),ms);return{extend(nextMs,nextMessage){clearTimeout(timer),timer=setTimeout(()=>expire(new Error(nextMessage())),nextMs)},clear(){clearTimeout(timer)}}}var RpcCommandError=class extends Error{constructor(message,errorCode4,errorData){super(message),this.name="RpcCommandError",this.errorCode=errorCode4,this.errorData=errorData}};function isProviderAccountEvent(event){return event.type==="auth_accounts_changed"||event.type==="account_failover"}var RpcTransportGoneError=class extends Error{constructor(message="Shared RPC host is unavailable"){super(message),this.code="rpc_transport_gone",this.name="RpcTransportGoneError"}};function isTransportGoneError(error2){return error2 instanceof RpcTransportGoneError||error2 instanceof Error&&(error2.message==="Client not started"||error2.message.startsWith("RPC transport is not writable.")||error2.message==="RPC socket closed")}var RpcClientOpenInFlightError=class extends Error{constructor(){super("An open_session request is already in flight"),this.code="open_session_in_flight",this.name="RpcClientOpenInFlightError"}},MAX_PENDING_SESSION_EVENTS=512,MAX_PENDING_SESSION_EVENT_BYTES=1024*1024,RpcClient=class{constructor(options={}){this.process=null,this.socket=null,this.stopReadingStdout=null,this.eventListeners=[],this.pendingRequests=new Map,this.requestId=0,this.compactions=new Map,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.stderr="",this.exitError=null,this.disconnectNotified=!1,this.stopping=!1,this.options=options,this.onEvent(event=>{switch(event.type){case"compaction_start":{let key=event.requestId??"";if(this.compactions.has(key))return;this.compactions.set(key,Date.now());break}case"compaction_end":if(!this.compactions.delete(event.requestId??""))return;break;case"session_replaced":this.compactions.clear();break;default:return}for(let pending of this.pendingRequests.values())pending.sessionId===this.sessionId&&pending.onCompaction?.(this.isCompacting())})}async start(){if(this.process||this.socket)throw new Error("Client already started");if(this.exitError=null,this.compactions.clear(),this.stopping=!1,this.disconnectNotified=!1,this.options.socketPath){await this.startSocket(this.options.socketPath);return}let cliPath=this.options.cliPath??"dist/cli.js",args=["--mode","rpc"];this.options.provider&&this.options.model&&args.push("--provider",this.options.provider),this.options.model&&args.push("--model",this.options.model),this.options.args&&args.push(...this.options.args);let childProcess=spawn9("node",[cliPath,...args],{cwd:this.options.cwd,env:{...process.env,SENPI_RUNTIME:"node",...this.options.env},stdio:["pipe","pipe","pipe"],windowsHide:!0});if(this.process=childProcess,childProcess.stderr?.on("data",data=>{this.stderr+=data.toString(),process.stderr.write(data)}),childProcess.once("exit",(code,signal)=>{if(this.process!==childProcess)return;let error2=this.createProcessExitError(code,signal);this.exitError=error2,this.rejectPendingRequests(error2)}),childProcess.once("error",error2=>{if(this.process!==childProcess)return;let processError=new Error(`Agent process error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=processError,this.rejectPendingRequests(processError)}),childProcess.stdin?.on("error",error2=>{if(this.process!==childProcess)return;let stdinError=this.exitError??new Error(`Agent process stdin error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=stdinError,this.rejectPendingRequests(stdinError)}),this.stopReadingStdout=attachJsonlLineReader(childProcess.stdout,line=>{this.handleLine(line)}),await new Promise(resolve46=>setTimeout(resolve46,100)),this.process.exitCode!==null){let error2=this.exitError??this.createProcessExitError(this.process.exitCode,this.process.signalCode);throw this.exitError=error2,error2}}isCompacting(){let now2=Date.now();for(let[key,startedAt]of this.compactions)now2-startedAt>=PROMPT_COMPACTION_DEADLINE_MS&&this.compactions.delete(key);return this.compactions.size>0}async stop(){if(this.compactions.clear(),this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.socket){this.stopping=!0,this.stopReadingStdout?.(),this.stopReadingStdout=null,this.socket.destroy(),this.socket=null,this.sessionId=void 0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.notifyDisconnect(new RpcTransportGoneError);return}this.process&&(this.stopReadingStdout?.(),this.stopReadingStdout=null,this.process.kill("SIGTERM"),await new Promise(resolve46=>{let timeout=setTimeout(()=>{this.process?.kill("SIGKILL"),resolve46()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve46()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path13){let secret=socketNeedsHandshake(path13)?await readSocketSecret(socketSecretPath(path13)):void 0,socket=createConnection3(resolveSocketTransportAddress(path13,process.platform,secret));this.socket=socket,await new Promise((resolve46,reject)=>{let onConnect=()=>{cleanup(),resolve46()},onError=error2=>{cleanup(),this.socket=null,reject(error2)},cleanup=()=>{socket.off("connect",onConnect),socket.off("error",onError)};socket.once("connect",onConnect),socket.once("error",onError)}),secret&&sendSocketHandshake(socket,secret),this.stopReadingStdout=attachJsonlLineReader(socket,line=>this.handleLine(line)),socket.once("close",()=>{this.socket===socket&&(this.socket=null,this.notifyDisconnect(new RpcTransportGoneError))}),socket.once("error",error2=>{this.socket===socket&&this.notifyDisconnect(new RpcTransportGoneError)})}onEvent(listener){return this.eventListeners.push(listener),()=>{let index=this.eventListeners.indexOf(listener);index!==-1&&this.eventListeners.splice(index,1)}}getStderr(){return this.stderr}async setClientInfo(width,capabilities){await this.send({type:"set_client_info",width,capabilities},this.sessionId!==void 0)}async openSession(options){if(this.pendingOpenSession)throw new RpcClientOpenInFlightError;this.pendingOpenSession=!0;try{let response=await this.send({type:"open_session",...options},!1),opened=this.getData(response);return this.sessionId=opened.sessionId,this.compactions.clear(),this.pendingOpenSession=!1,this.flushPendingSessionEvents(),opened}catch(error2){throw this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,error2}}async sendExtensionUIResponse(response){await this.send(response,!0,void 0,!1)}async sendExtensionUIProgress(progress){await this.send(progress,!0,void 0,!1)}async closeSession(sessionId=this.sessionId){if(sessionId){try{await this.send({type:"close_session",sessionId},!1)}catch(error2){if(!isTransportGoneError(error2))throw error2}this.sessionId===sessionId&&(this.sessionId=void 0,this.compactions.clear())}}async listSessions(){let response=await this.send({type:"list_sessions"},!1);return this.getData(response).sessions}async prompt(message,optionsOrImages){let options=Array.isArray(optionsOrImages)?{images:optionsOrImages}:optionsOrImages??{},response=await this.send({type:"prompt",message,...clientMessageIdentity(options),...options.images?{images:options.images}:{},...options.streamingBehavior?{streamingBehavior:options.streamingBehavior}:{},...options.thinkingLevel?{thinkingLevel:options.thinkingLevel}:{},...options.sessionTitlePrompt!==void 0?{sessionTitlePrompt:options.sessionTitlePrompt}:{},...options.expandPromptTemplates!==void 0?{expandPromptTemplates:options.expandPromptTemplates}:{},...options.unknownCommandAsText?{unknownCommandAsText:!0}:{}},!0,{onResponse:wireResponse=>{if(!wireResponse.success){options?.preflightResult?.(!1);return}let data=wireResponse.data;options?.promptDisposition?.(data?.disposition??"handled"),options?.preflightResult?.(!0)},onReject:()=>{options?.preflightResult?.(!1)}});if(!response.success){let failure2=response;throw(failure2.errorCode===RPC_ERROR_UNKNOWN_COMMAND?unknownCommandErrorFromWire(failure2.errorData):void 0)??new RpcCommandError(failure2.error,failure2.errorCode,failure2.errorData)}return response.data?.disposition??"handled"}async appendUserMessage(content){await this.send({type:"append_user_message",content})}async appendSessionEntry(entry){await this.send({type:"append_session_entry",entry})}async sendCustomMessage(message,options){await this.send({type:"send_custom_message",...message,...options})}async steer(message,images,recovery){let response=await this.send({type:"steer",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async followUp(message,images,recovery){let response=await this.send({type:"follow_up",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async abort(){try{await this.send({type:"abort"})}catch(error2){if(!isTransportGoneError(error2))throw error2}}async abortCompaction(){await this.send({type:"abort_compaction"})}async reload(){let response=await this.send({type:"reload"});return this.getData(response)}async checkReloadVeto(){let response=await this.send({type:"check_reload_veto"});return this.getData(response)}async clearQueue(options){let response=await this.send({type:"clear_queue",abortWillFollow:options?.abortWillFollow});return this.getData(response)}async getSteeringMessages(){let response=await this.send({type:"get_steering_messages"});return this.getData(response).messages}async getFollowUpMessages(){let response=await this.send({type:"get_follow_up_messages"});return this.getData(response).messages}async abortBranchSummary(){await this.send({type:"abort_branch_summary"})}async recordBashResult(command,result3,excludeFromContext){await this.send({type:"record_bash_result",command,result:result3,excludeFromContext})}async setLabel(entryId,label3){await this.send({type:"set_label",entryId,label:label3})}async newSession(parentSession){let response=await this.send({type:"new_session",parentSession});return this.getData(response)}async getState(){let response=await this.send({type:"get_state"});return this.getData(response)}async setModel(provider,modelId){let response=await this.send({type:"set_model",provider,modelId});return this.getData(response)}async setFavoriteModels(models){await this.send({type:"set_favorite_models",models})}async setScopedModels(models){await this.send({type:"set_scoped_models",models})}async cycleModel(direction="forward"){let response=await this.send({type:"cycle_model",direction});return this.getData(response)}async getAvailableModels(){let response=await this.send({type:"get_available_models"});return this.getData(response).models}async setThinkingLevel(level,options){let response=await this.send({type:"set_thinking_level",level,scope:options?.scope});if(!response.success)throw new Error(response.error)}async cycleThinkingLevel(){let response=await this.send({type:"cycle_thinking_level"});return this.getData(response)}async getAvailableThinkingLevels(){let response=await this.send({type:"get_available_thinking_levels"});return this.getData(response).levels}async setFastMode(enabled){let response=await this.send({type:"set_fast_mode",enabled});return this.getData(response)}async getFastMode(){let response=await this.send({type:"get_fast_mode"});return this.getData(response)}async setSteeringMode(mode){await this.send({type:"set_steering_mode",mode})}async setFollowUpMode(mode){await this.send({type:"set_follow_up_mode",mode})}async compact(customInstructions){let response=await this.send({type:"compact",customInstructions});return this.getData(response)}async setAutoCompaction(enabled){await this.send({type:"set_auto_compaction",enabled})}async setAutoRetry(enabled){await this.send({type:"set_auto_retry",enabled})}async abortRetry(){await this.send({type:"abort_retry"})}async bash(command,options){let response=await this.send({type:"bash",command,excludeFromContext:options?.excludeFromContext,executionId:options?.executionId,operations:options?.operations});return this.getData(response)}async navigateTree(targetId,options){let response=await this.send({type:"navigate_tree",targetId,...options});return this.getData(response)}async abortBash(){await this.send({type:"abort_bash"})}async cleanupBashOutput(path13){await this.send({type:"cleanup_bash_output",path:path13})}async getSessionStats(){let response=await this.send({type:"get_session_stats"});return this.getData(response)}async exportHtml(outputPath,themeName){let response=await this.send({type:"export_html",outputPath,themeName});return this.getData(response)}async exportJsonl(outputPath){let response=await this.send({type:"export_jsonl",outputPath});return this.getData(response)}async switchSession(sessionPath,options){let response=await this.send({type:"switch_session",sessionPath,cwdOverride:options?.cwdOverride});return this.getData(response)}async fork(entryId,options){let response=await this.send({type:"fork",entryId,position:options?.position});return this.getData(response)}async clone(){let response=await this.send({type:"clone"});return this.getData(response)}async getForkMessages(){let response=await this.send({type:"get_fork_messages"});return this.getData(response).messages}async getEntries(since){let response=await this.send({type:"get_entries",since});return this.getData(response)}async getTree(){let response=await this.send({type:"get_tree"});return this.getData(response)}async editAssistantMessage(entryId,text2,options={}){let response=await this.send({type:"edit_assistant_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async editUserMessage(entryId,text2,options={}){let response=await this.send({type:"edit_user_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async getLastAssistantText(){let response=await this.send({type:"get_last_assistant_text"});return this.getData(response).text}async setSessionName(name){await this.send({type:"set_session_name",name})}async importJsonl(inputPath,cwdOverride){let response=await this.send({type:"import_jsonl",inputPath,cwdOverride});return this.getData(response)}async getMessages(){let response=await this.send({type:"get_messages"});return this.getData(response).messages}async getMedia(toolCallId,contentIndex){let response=await this.send({type:"get_media",toolCallId,contentIndex});return this.getData(response).content}async getCommands(){let response=await this.send({type:"get_commands"});return this.getData(response).commands}async requestExtension(name,data){let response=await this.send({type:"extension_request",name,...data===void 0?{}:{data}});return this.getData(response)}async getProviderAccounts(provider){let response=await this.send({type:"get_provider_accounts",provider});return this.getData(response).accounts}async pinProviderAccount(provider,name){await this.send({type:"account_pin",provider,name})}async removeProviderAccount(provider,name){await this.send({type:"account_remove",provider,name})}waitForIdle(timeout=6e4){return new Promise((resolve46,reject)=>{let timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve46())})})}collectEvents(timeout=6e4){return new Promise((resolve46,reject)=>{let events=[],timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{isProviderAccountEvent(event)||event.type==="extension_event"||event.type==="bash_start"||event.type==="bash_end"||event.type==="extension_ui_request"||event.type==="session_replaced"||event.type==="session_parked"||event.type==="queued"||(events.push(event),event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve46(events)))})})}async promptAndWait(message,images,timeout=6e4){let eventsPromise=this.collectEvents(timeout);return await this.prompt(message,images?{images}:void 0),eventsPromise}handleLine(line){try{let data=JSON.parse(line);if(data.type==="response"&&data.id&&this.pendingRequests.has(data.id)){let pending=this.pendingRequests.get(data.id);this.pendingRequests.delete(data.id),pending.onResponse?.(data),pending.resolve(data);return}if(data.type==="queued"&&typeof data.for_request=="string"&&this.pendingRequests.get(data.for_request)?.onQueued?.(data.position),typeof data.sessionId=="string"&&data.sessionId!==this.sessionId){if(this.pendingOpenSession){let bytes=Buffer.byteLength(line);for(this.pendingSessionEvents.push({sessionId:data.sessionId,event:data,bytes}),this.pendingSessionEventBytes+=bytes;this.pendingSessionEvents.length>MAX_PENDING_SESSION_EVENTS||this.pendingSessionEventBytes>MAX_PENDING_SESSION_EVENT_BYTES;){let oldest=this.pendingSessionEvents.shift();if(!oldest)break;this.pendingSessionEventBytes-=oldest.bytes}}return}for(let listener of[...this.eventListeners])listener(data)}catch{}}flushPendingSessionEvents(){let pending=this.pendingSessionEvents;this.pendingSessionEvents=[],this.pendingSessionEventBytes=0;for(let{sessionId,event}of pending)if(sessionId===this.sessionId)for(let listener of[...this.eventListeners])listener(event)}createProcessExitError(code,signal){return new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`)}notifyDisconnect(error2){this.rejectPendingRequests(error2),!this.disconnectNotified&&!this.stopping&&(this.disconnectNotified=!0,this.options.onDisconnect?.(error2))}rejectPendingRequests(error2){for(let pending of this.pendingRequests.values())pending.onReject?.(error2),pending.reject(error2);this.pendingRequests.clear()}async send(command,route=!0,hooks,expectResponse=!0){let childProcess=this.process,stream2=this.socket??childProcess?.stdin;if(!stream2)throw new RpcTransportGoneError;if(this.exitError)throw this.exitError;if(childProcess?.exitCode!==null&&childProcess?.exitCode!==void 0){let error2=this.createProcessExitError(childProcess.exitCode,childProcess.signalCode);throw this.exitError=error2,error2}if(stream2.destroyed||!stream2.writable){let error2=new RpcTransportGoneError;throw this.notifyDisconnect(error2),error2}let ownId=command.type==="extension_ui_response"||command.type==="extension_ui_progress"?command.id:void 0,id=ownId??`req_${++this.requestId}`,fullCommand={...command,...route&&this.sessionId&&!("sessionId"in command)?{sessionId:this.sessionId}:{},...ownId===void 0?{id}:{}};if(!expectResponse)return stream2.write(serializeJsonLine(fullCommand)),Promise.resolve({type:"response",command:command.type,success:!0});let sessionId="sessionId"in fullCommand?fullCommand.sessionId:void 0;return new Promise((resolve46,reject)=>{let timeoutMessage=()=>`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`,promptCap,expire=timeoutError=>{clearTimeout(promptCap);let pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(timeoutError),reject(timeoutError)},deadline=armRequestDeadline(command.type==="prompt"&&sessionId===this.sessionId&&this.isCompacting()?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage,expire);command.type==="prompt"&&(promptCap=setTimeout(()=>{deadline.clear(),expire(new Error(timeoutMessage()))},PROMPT_ACK_MAX_WAIT_MS)),this.pendingRequests.set(id,{sessionId,resolve:response=>{deadline.clear(),clearTimeout(promptCap),resolve46(response)},reject:error2=>{deadline.clear(),clearTimeout(promptCap),reject(error2)},...command.type==="prompt"?{onCompaction:compacting=>deadline.extend(compacting?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage)}:{},...command.type==="open_session"?{onQueued:position=>deadline.extend(OPEN_AFTER_QUEUED_DEADLINE_MS,()=>openStalledMessage(position))}:{},...hooks?.onResponse?{onResponse:hooks.onResponse}:{},...hooks?.onReject?{onReject:hooks.onReject}:{}});try{stream2.write(serializeJsonLine(fullCommand))}catch(error2){let writeError=error2 instanceof Error?error2:new Error(String(error2)),pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(writeError),pending?.reject(writeError)}})}getData(response){if(!response.success){let errorResponse=response;throw errorResponse.errorCode==="missing_session_cwd"&&errorResponse.errorData?new MissingSessionCwdError(errorResponse.errorData):new RpcCommandError(errorResponse.error,errorResponse.errorCode,errorResponse.errorData)}return response.data}};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 label3=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:label3,thinkingRun}):descriptors.push({kind:"thinking-label",text:label3,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
2525
2526
 
2526
2527
  `),thinkingRun})}else{let text2=hidden?theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel)):thinkingBlocks.join(`
2527
2528
 
@@ -2575,25 +2576,7 @@ Rules:
2575
2576
  - Prefer concrete nouns and verbs from the user's task.
2576
2577
  - Do not include quotes, punctuation at the end, markdown, or explanations.
2577
2578
  - If the input is only a greeting, acknowledgement, or too vague to title, return <title>none</title>.
2578
- - Respond only as <title>Session Title</title>.`,LOW_SIGNAL_PROMPTS=new Set(["hi","hello","hey","yo","thanks","thank you","ok","okay","k","yes","no","yep","nope"]),TITLE_MAX_TOKENS=64,REASONING_TITLE_MAX_TOKENS=1024,MAX_TITLE_RETRIES=1,MAX_TITLE_RETRY_DELAY_MS=2e3;function sessionTitleRetryPolicy(settings){return{enabled:settings.enabled,maxRetries:Math.min(settings.maxRetries,MAX_TITLE_RETRIES),baseDelayMs:Math.min(settings.baseDelayMs,MAX_TITLE_RETRY_DELAY_MS)}}function shouldSkipSessionTitle(text2){let normalized2=text2.replace(/\s+/g," ").trim().toLowerCase();return normalized2.length===0||normalized2.startsWith("/")?!0:LOW_SIGNAL_PROMPTS.has(normalized2)}async function generateSessionTitle(options){if(shouldSkipSessionTitle(options.firstPrompt))return;let reasoning=initialTitleReasoning(options.model),response=await requestTitle(options,reasoning),retryReasoning=response.stopReason==="error"?mandatoryReasoningRetryLevel(options.model,reasoning,response.errorMessage):void 0;if(retryReasoning!==void 0&&(response=await requestTitle(options,retryReasoning)),response.stopReason==="error")throw new Error(humanizeProviderError(response.errorMessage??"Session title generation failed"));return parseSessionTitle(response)}function requestTitle(options,reasoning){return retryAssistantCall(()=>completeTitle(options.model,buildTitleContext(options.firstPrompt),buildTitleOptions(options,reasoning),options.streamFn),options.retry,options.signal)}function buildTitleContext(firstPrompt){return{systemPrompt:TITLE_SYSTEM_PROMPT,messages:[{role:"user",content:[{type:"text",text:firstPrompt}],timestamp:Date.now()}]}}function buildTitleOptions(options,reasoning){let titleOptions={...options.baseOptions,sessionId:options.sessionId,cacheRetention:options.model.cacheRetention==="none"?"none":"short",maxTokens:reasoning===void 0?TITLE_MAX_TOKENS:REASONING_TITLE_MAX_TOKENS};return reasoning!==void 0&&(titleOptions.reasoning=reasoning),options.auth.apiKey!==void 0&&(titleOptions.apiKey=options.auth.apiKey),options.auth.headers!==void 0&&(titleOptions.headers=options.auth.headers),options.auth.extraBody!==void 0&&(titleOptions.extraBody=options.auth.extraBody),options.auth.env!==void 0&&(titleOptions.env=options.auth.env),options.signal!==void 0&&(titleOptions.signal=options.signal),titleOptions}async function completeTitle(model,context,options,streamFn){return streamFn===void 0?completeSimple(model,context,options):(await streamFn(model,normalizeContext(context),options)).result()}function parseSessionTitle(message){let rawTitle=message.content.filter(part=>part.type==="text").map(part=>part.text).join("").trim().match(/<title>\s*([\s\S]*?)\s*<\/title>/i)?.[1];if(rawTitle===void 0)return;let title=sanitizeTitle(rawTitle);if(!(!title||title.toLowerCase()==="none"))return title}function humanizeProviderError(raw){let statusPrefix=raw.trim().match(/^(?:.*?\((\d{3})\)|(\d{3}))\s*:\s*(?=\{)/),status=statusPrefix?.[1]??statusPrefix?.[2],bodyText=statusPrefix?raw.trim().slice(statusPrefix[0].length):raw.trim();if(!bodyText.startsWith("{"))return raw;let parsed;try{parsed=JSON.parse(bodyText)}catch{return raw}let body=asRecord3(parsed);if(!body)return raw;let nested=asRecord3(body.error),message=asNonEmptyString(nested?.message)??asNonEmptyString(body.message)??asNonEmptyString(body.error);if(message===void 0)return raw;let details=[],errorType=asNonEmptyString(nested?.type)??asNonEmptyString(body.type);errorType&&errorType!=="error"&&details.push(errorType),status&&details.push(`HTTP ${status}`);let requestId=asNonEmptyString(body.request_id);return requestId&&details.push(`request ${requestId}`),details.length>0?`${message} (${details.join(", ")})`:message}function asRecord3(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)?value2:void 0}function asNonEmptyString(value2){return typeof value2=="string"&&value2.length>0?value2:void 0}function sanitizeTitle(text2){return text2.replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g,"").replace(/\u001b\[[0-?]*[ -/]*[@-~]/g,"").replace(/\u001b[\u0020-\u002f]*[\u0030-\u007e]/g,"").replace(/[\r\n]+/g," ").replace(/[\u0000-\u001f\u007f-\u009f]+/g," ").replace(/\s+/g," ").replace(/^["'`]+|["'`.!?]+$/g,"").trim().slice(0,80).trim()}function yieldToEventLoop(){return new Promise(resolve46=>{let channel=new MessageChannel;channel.port1.onmessage=()=>{channel.port1.close(),channel.port2.close(),resolve46()},channel.port2.postMessage(void 0)})}var SessionWorkBarrier=class{constructor(){this.activeWork=void 0,this.activeWorkResolve=void 0,this.activeWorkDepth=0}get hasActiveWork(){return this.activeWork!==void 0}begin(){if(!this.activeWork){let resolveWork;if(this.activeWork=new Promise(resolve46=>{resolveWork=resolve46}),!resolveWork)throw new Error("Session work resolver was not initialized");this.activeWorkResolve=resolveWork}this.activeWorkDepth++;let finished=!1;return()=>{if(finished||(finished=!0,this.activeWorkDepth=Math.max(0,this.activeWorkDepth-1),this.activeWorkDepth>0))return;let resolveWork=this.activeWorkResolve;this.activeWork=void 0,this.activeWorkResolve=void 0,resolveWork?.()}}async waitForSettled(getEventQueue){for(let round=0;;round++){let eventQueue=getEventQueue(),work=this.activeWork;if(await eventQueue,work&&await work,getEventQueue()===eventQueue&&!this.activeWork)return;round>=16&&await yieldToEventLoop()}}};function formatSkillInvocationPrompt(skills,userRequest){let expandedSkills=skills.map(skill=>`The user explicitly invoked the "${skill.name}" skill. Follow the instructions in <skill-instruction> as binding for this request, while respecting higher-priority instructions.
2579
-
2580
- <skill-instruction name="${skill.name}" location="${skill.filePath}">
2581
- References are relative to ${skill.baseDir}.
2582
-
2583
- ${skill.body}
2584
- </skill-instruction>`).join(`
2585
-
2586
- `);return userRequest&&/\S/.test(userRequest)?`${expandedSkills}
2587
-
2588
- <user-request>
2589
- ${userRequest}
2590
- </user-request>`:expandedSkills}var SKILL_INSTRUCTION_PATTERN=/^The user explicitly invoked the "([^"]+)" skill\. Follow the instructions in <skill-instruction> as binding for this request, while respecting higher-priority instructions\.\n\n<skill-instruction name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill-instruction>/;function matchSkillInstruction(text2){let match=text2.match(SKILL_INSTRUCTION_PATTERN);return!match||match[1]!==match[2]?null:{skill:{name:match[1],location:match[3],content:match[4]},length:match[0].length}}function toParsedSkillBlock(skills,userMessage2){let first=skills[0];return first?{...first,skills,userMessage:userMessage2}:null}function parseSkillBlock(text2){let first=matchSkillInstruction(text2);if(first){let skills=[first.skill],remainder=text2.slice(first.length);for(;remainder.startsWith(`
2591
-
2592
- The user explicitly invoked the `);){let chained=matchSkillInstruction(remainder.slice(2));if(!chained)return null;skills.push(chained.skill),remainder=remainder.slice(chained.length+2)}let requestMatch=remainder.match(/^\n\n<user-request>\n([\s\S]*?)\n<\/user-request>$/);return remainder&&!requestMatch?null:toParsedSkillBlock(skills,requestMatch?.[1].trim()||void 0)}let legacyMatch=text2.match(/^<skill name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill>(?:\n\n([\s\S]+))?$/);return legacyMatch?toParsedSkillBlock([{name:legacyMatch[1],location:legacyMatch[2],content:legacyMatch[3]}],legacyMatch[4]?.trim()||void 0):null}var MAX_SKILL_INVOCATION_TOKENS_PER_PROMPT=64,SKILL_NAMESPACE="skill:",LEADING_SKILL_INVOCATION_PATTERN=/^(?:\/skill:([a-zA-Z][a-zA-Z0-9:_-]*)|\$([a-zA-Z][a-zA-Z0-9:_-]*))(?=\s|$)/,INLINE_DOLLAR_SKILL_INVOCATION_PATTERN=/(^|\s)\$([a-zA-Z][a-zA-Z0-9:_-]*)(?=\s|$)/g;function inlineSkillName(token,knownSkillNames){return token.startsWith(SKILL_NAMESPACE)?token.slice(SKILL_NAMESPACE.length)||null:knownSkillNames?.has(token)?token:null}function parseSkillInvocationTokens(text2,options={}){let tokens=[],cursor=0;for(;cursor<text2.length;){for(;cursor<text2.length&&/\s/.test(text2[cursor]);)cursor++;let match=text2.slice(cursor).match(LEADING_SKILL_INVOCATION_PATTERN);if(!match)break;let syntax=match[1]?"slash":"dollar",dollarName=match[2],name=match[1]??(dollarName?.startsWith("skill:")?dollarName.slice(6):dollarName);if(!name)break;if(tokens.push({name,syntax,start:cursor,end:cursor+match[0].length,position:"leading"}),tokens.length>=MAX_SKILL_INVOCATION_TOKENS_PER_PROMPT)return tokens;cursor+=match[0].length}INLINE_DOLLAR_SKILL_INVOCATION_PATTERN.lastIndex=cursor;for(let match of text2.matchAll(INLINE_DOLLAR_SKILL_INVOCATION_PATTERN)){let token=match[2]??"",name=inlineSkillName(token,options.knownSkillNames);if(name===null)continue;let start=(match.index??0)+(match[1]??"").length;if(tokens.push({name,syntax:"dollar",start,end:start+token.length+1,position:"inline"}),tokens.length>=MAX_SKILL_INVOCATION_TOKENS_PER_PROMPT)break}return tokens}function stripLeadingInvocationSeparators(text2){let cursor=0;for(;text2[cursor]===" "||text2[cursor]===" ";)cursor++;for(;text2[cursor]===`
2593
- `||text2[cursor]==="\r"&&text2[cursor+1]===`
2594
- `;){cursor+=text2[cursor]==="\r"?2:1;let lineStart=cursor;for(;text2[cursor]===" "||text2[cursor]===" ";)cursor++;if(text2[cursor]!==`
2595
- `&&!(text2[cursor]==="\r"&&text2[cursor+1]===`
2596
- `))return text2.slice(lineStart)}return text2.slice(cursor)}function removeSkillInvocationTokens(text2,tokens){let cursor=0,result3="";for(let token of tokens)result3+=text2.slice(cursor,token.start),token.position==="inline"&&(result3+=`[skill: ${token.name}]`),cursor=token.end,token.position==="inline"&&(result3.endsWith(" ")||result3.endsWith(" "))&&(text2[cursor]===" "||text2[cursor]===" ")&&cursor++;return result3+=text2.slice(cursor),tokens.some(token=>token.position==="leading")?stripLeadingInvocationSeparators(result3):result3}var MAX_SKILL_EXPANSIONS_PER_PROMPT=5;function streamedToolCallName(event){let update=event.assistantMessageEvent;if(update.type==="toolcall_end")return update.toolCall.name;if(update.type!=="toolcall_start")return;let block=update.partial.content[update.contentIndex];return block?.type==="toolCall"&&block.name.length>0?block.name:void 0}function withResolvedToolName(event,resolve46){let requested=streamedToolCallName(event);return requested===void 0?event:{...event,resolvedToolName:resolve46(requested)}}var TranscriptWriteFailures=class{constructor(){this.reported=!1,this.refused=new Set}startRun(){this.runFailure=void 0,this.reported=!1}record(message,error2){this.refused.add(message),this.runFailure??={error:error2}}takeReport(){if(!(this.reported||!this.runFailure))return this.reported=!0,this.runFailure}takeRefusedOut(messages){if(this.refused.size===0)return;let refused=this.refused,kept=messages.filter(message=>!refused.has(message));return refused.clear(),kept.length===messages.length?void 0:kept}};var EVAL_ONLY_TOOL_NAMES=new Set(["workflow","monitor"]);function evalHelperCall(name){return name==="bash"||name==="powershell"?`tool.${name}({ command: "..." })`:name==="grep"?'tool.grep({ pattern: "...", path: "..." })':name==="workflow"?`tool.${name}({ action: "..." })`:name==="monitor"?'tool.monitor({ description: "...", command: "...", filter: "..." })':`tool.${name}({ ... })`}var TURN_RETRY_SUPPRESSION_PREFIX3="senpi:no-turn-retry:",OVERFLOW_RECOVERY_RUNGS=2,OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE="Context overflow recovery failed after two compact-and-retry attempts. Try reducing context or switching to a larger-context model.",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet;function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var RequiredCompactionError=class extends Error{constructor(){super("Context remains above the compaction threshold because compaction did not complete"),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens2(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms`+(streamStartTimeoutMs===void 0?" (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)":` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._messageEndPersistence=new WeakMap,this._isAgentRunActive=!1,this._toolExecutionDepth=0,this._toolContextDisposers=new Set,this._promptStartPending=!1,this._nextInputId=0,this._settlementEpoch=0,this._runtimeMessagesTokenized=!1,this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._nextQueuedInputOrder=0,this._supersededCompactionLogAttemptIds=new Set,this._pendingNextTurnMessages=[],this._pendingCustomMessages=[],this.externalAdmission=new ExternalAdmission({isBusy:()=>this._isAgentRunActive||this._promptStartPending,enqueue:(message,lane)=>lane==="steer"?this.agent.steer(message):this.agent.followUp(message),start:message=>this.sendCustomMessage(message,{triggerTurn:!0}).catch(error2=>{this._sessionLogger.warn("external_delivery_start_failed",{error:error2 instanceof Error?error2.message:String(error2)})})}),this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._compactionAbortController=void 0,this._autoCompactionAbortController=void 0,this._pendingCompactionAdmission=void 0,this._compactionLifecycle=new CompactionLifecycleCoordinator,this._sessionWorkBarrier=new SessionWorkBarrier,this._wakeSources=new WakeSourceTracker,this._overflowRecoveryRungs=0,this._compactionSkippedTooSmall=!1,this._transcriptWriteFailures=new TranscriptWriteFailures,this._promptOwnsRun=!1,this._skipNextPostRetryCompactionCheck=!1,this._skipNextPostCompactionAssistantCheck=!1,this._scheduledContinuationRecompacted=!1,this._assistantsPendingAtCompaction=new WeakSet,this._postCompactionUsageExemptAssistants=new WeakSet,this._messageRevision=0,this._branchSummaryAbortController=void 0,this._sessionTitleAbortController=void 0,this._sessionTitlePromise=void 0,this._retryAbortController=void 0,this._retryAttempt=0,this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0,this._retryPromise=void 0,this._retryResolve=void 0,this._userAbortPromise=void 0,this._abortProvenance=new AgentAbortProvenance,this._agentSettledDelivery=new AgentSettledDelivery,this._suppressQueuedContinuationAfterUserAbort=!1,this._userAbortGeneration=0,this._hadClearedQueuedMessages=!1,this._extensionEventSignal=void 0,this._bashAbortControllers=new Set,this._pendingBashMessages=[],this._turnIndex=0,this._entryIdsByMessage=new WeakMap,this._boundaryDispatchedMessages=new WeakSet,this._boundaryRefreshedTurns=new WeakSet,this._lastActivityOutcome="completed",this._isBeforeSettle=!1,this._abortDuringBeforeSettle=!1,this._baseToolDefinitions=new Map,this._usesDefaultTools=!1,this._withheldEvalOnlyToolNames=new Set,this._publishedEvalOnlyHintNames=new Set,this._declaredToolNames=[],this._promptToolNames=[],this._promptDeclaresSessionTools=!1,this._sessionStartSettled=Promise.resolve(),this._promptCachePrefixBuilds=new PromptCachePrefixBuilds,this._extensionMode="print",this._probeBackLaneSeq=0,this._toolRegistry=new Map,this._lazyToolActivation=new LazyToolActivation({getToolDefinition:name=>this.getToolDefinition(name),getActiveTools:()=>this.getActiveToolNames(),setActiveTools:names=>this.setActiveToolsByName(names)}),this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(this._nestedToolCalls)if(event.type==="message_start"&&event.message.role==="toolResult"){let message=event.message,summary=this._nestedToolCalls.takeRecord(message.toolCallId);summary?.calls&&(message.nestedCalls=summary.calls),summary?.usage&&(message.usage=message.usage?combineUsage(message.usage,summary.usage):summary.usage)}else event.type==="agent_end"&&this._nestedToolCalls.clear();if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);(lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)||this._willRetryAfterAgentEnd(event.messages))&&this.agent.suppressQueuedMessageDrain(),this._extensionRunner.hasHandlers("agent_before_settle")&&this.agent.suppressQueuedMessageDrain()}this._createRetryPromiseForAgentEnd(event),event.type==="message_end"&&event.message.role==="assistant"&&this._emitServerFallbackAborted(event.message);let pendingMessage=event.type==="message_end"?event.message:void 0;pendingMessage!==void 0&&this._messageEndsAwaitingPersistence.add(pendingMessage);let processing=this._agentEventQueue.then(()=>this._processAgentEvent(event,signal),()=>this._processAgentEvent(event,signal));this._agentEventQueue=pendingMessage!==void 0?processing.finally(()=>{this._messageEndsAwaitingPersistence.delete(pendingMessage)}):processing;let settled=this._agentEventQueue.catch(()=>{});pendingMessage!==void 0&&this._messageEndPersistence.set(pendingMessage,settled)},this._promptSurface=config.promptSurface,this.agent=config.agent,this.sessionManager=config.sessionManager,this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source2=>{this._emit({type:"settings_source_selected",...source2})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._fallbackNow=config.fallbackNow??monotonicNow,this._selectorCooldowns=new SelectorCooldowns(this._fallbackNow);let lease=()=>this._fallbackCircuitsLease;this._fallbackCircuits=createFallbackCircuitAccess({get breaker(){return lease().breaker},owner:()=>this.sessionId,now:this._fallbackNow,settings:()=>this.settingsManager.getFallbackCircuitSettings(),logger:fallbackLogger}),this._retryRandom=config.retryRandom??Math.random,this._environmentContextEnabled=config.environmentContext??!0,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,circuits:this._fallbackCircuits,logger:fallbackLogger,switchModel:async(model,thinking,reason)=>{await this._switchActiveModel(model,{persistDefault:!1,appendSessionEntry:!0,entryReason:reason,emitModelSelect:!0,modelSelectSource:reason,invalidateCompaction:!0,ephemeralThinkingLevel:thinking,allowDeferral:!1,repairWithSlice:!0})},emit:event=>this._emit(event),getCurrentSelector:()=>this.model?{model:this.model,thinkingLevel:this.thinkingLevel}:void 0,isAuthAvailable:provider=>this._modelRuntime.hasConfiguredAuth(provider)}),this._probeBackScheduler=new ProbeBackScheduler({now:this._fallbackNow}),this._extensionRunnerRef=config.extensionRunnerRef,this._initialActiveToolNames=config.initialActiveToolNames,this._defaultToolNames=config.defaultToolNames?new Set(config.defaultToolNames):void 0,this._usesDefaultTools=config.usesDefaultTools??!1,this._evalOnlyToolNamesOverride=config.evalOnlyToolNames?new Set(config.evalOnlyToolNames):void 0,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._sessionStartEvent=config.sessionStartEvent??{type:"session_start",reason:"startup"},this._autoTitleSessions=config.autoTitleSessions??!1;let initialModel=this.agent.state.model;if(initialModel){let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,initialModel));this._currentServiceTier=this._resolveServiceTier(initialModel,config.serviceTier??scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._installAgentRequestProjection(),this._installAgentBoundaryHooks();try{this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0}),this._fallbackCircuitsLease=acquireFallbackCircuits(this._agentDir)}catch(error2){throw this._releaseToolSearchService("session construction failed"),error2}}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model,signal){let result3;try{result3=await this._modelRuntime.getAuth(model,{signal})}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result3&&(result3.auth.apiKey||result3.auth.headers))return{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,env:result3.env};throw this._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async _getSummarizationRequestAuth(selectedModel,signal){let{model,thinkingLevel}=isVirtualModel(selectedModel)?await this._modelRuntime.resolveModel(selectedModel,convertToLlm2(this.messages),{reason:"direct",thinkingLevel:this.thinkingLevel,signal}):{model:selectedModel,thinkingLevel:this.thinkingLevel};if(this.agent.streamFunction===streamSimple)return{...await this._getRequiredRequestAuth(model,signal),thinkingLevel};try{let storedResult=await this._modelRuntime.getAuth(model,{signal}),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey,signal}):storedResult;return result3?{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),env:result3.env,thinkingLevel}:{model,thinkingLevel}}catch(error2){if(signal?.aborted)throw error2;return{model,thinkingLevel}}}_resolveCompactionModel(sessionModel){let override=this._getCompactionSettings().model;if(!override)return sessionModel;let slash=override.indexOf("/");if(slash<=0||slash===override.length-1)return sessionModel;let provider=override.slice(0,slash),modelId=override.slice(slash+1);return this._modelRuntime.getModel(provider,modelId)??sessionModel}async _getCompactionRequestAuth(model){return{...await this._getSummarizationRequestAuth(model),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody}}_modelForMessage(message){let model=this.model;return model&&isVirtualModel(model)?this._modelRuntime.getPhysicalModel(message.provider,message.model):model?.provider===message.provider&&model.id===message.model?model:void 0}_recordSelection(){let model=this.model;if(!model)return;let getModel=(provider,modelId)=>this._modelRuntime.getModel(provider,modelId),recorded=getBranchSelection(this.sessionManager.getBranch(),getModel);if(!recorded||recorded.provider===model.provider&&recorded.modelId===model.id)return;let recordedModel=getModel(recorded.provider,recorded.modelId);!isVirtualModel(model)&&!(recordedModel&&isVirtualModel(recordedModel))||this.sessionManager.appendModelChange(model.provider,model.id)}_limitsModel(){return this.routedModel?.model??this.model}_emitServerFallbackAborted(message){let details=message.diagnostics?.find(entry=>entry.type===SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;details!==void 0&&this._emit({type:"server_fallback_aborted",from:typeof details.from=="string"?details.from:message.model,to:typeof details.to=="string"?details.to:message.model,chainConfigured:this._retryFallback.hasConfiguredChain()})}_adoptToolSearchService(extensionLoad){let next=adoptToolSearchServiceForSession(extensionLoad);this._toolSearchService!==next&&this._toolSearchService?.dispose(this.sessionId,"replaced by a reload"),this._toolSearchService=next}_releaseToolSearchService(reason){this._toolSearchService?.dispose(this.sessionId,reason),this._toolSearchService=void 0}_bindToolSearchRemovedHints(){this._toolSearchService?.bindRemovedToolHints(()=>this.agent.removedToolHints)}_installAgentToolHooks(){this.agent.resolveUnknownToolCall=toolName=>{let resolvedName=resolveToolNameAlias(toolName,this._callableToolNames());if(!(resolvedName===void 0||!this._activateLazyTool(resolvedName)))return this.agent.state.tools.find(tool=>tool.name===resolvedName)},this._bindToolSearchRemovedHints(),this.agent.beforeToolCall=async({toolCall,args})=>{this._toolExecutionDepth++;try{let result3=await this.preflightToolCall(toolCall,args);return result3?.block&&this._toolExecutionDepth--,result3}catch(err2){throw this._toolExecutionDepth--,err2}},this.agent.afterToolCall=async({toolCall,args,result:result3,isError})=>{try{return await this._emitAfterToolCallHooks(toolCall,args,result3,isError)}finally{this._toolExecutionDepth--}}}async preflightToolCall(toolCall,args,options={}){options.waitForEventQueue!==!1&&await this._agentEventQueue;let runner=this._extensionRunner;if(runner.hasHandlers("tool_call"))try{return await runner.emitToolCall({type:"tool_call",toolName:toolCall.name,toolCallId:toolCall.id,...options.parentToolCallId?{parentToolCallId:options.parentToolCallId}:{},input:args})}catch(err2){throw err2 instanceof Error?err2:new Error(`Extension failed, blocking execution: ${String(err2)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError,parentToolCallId){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,...parentToolCallId?{parentToolCallId}:{},input:args,content:result3.content,details:result3.details,...result3.structuredContent===void 0?{}:{structuredContent:result3.structuredContent},isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],resizeOptions=this._limitsModel()?.inputLimits?.images?.resize,normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize(),...resizeOptions?{resizeOptions}:{}});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,structuredContent:hookResult?hookResult.structuredContent:result3.structuredContent,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_getCallableTools(active=new Set(this.getActiveToolNames())){return[...this._toolRegistry.values()].filter(tool=>{let exposure=this._getToolExposure(tool.name);return exposure==="search"||exposure==="eval"||exposure==="direct"&&active.has(tool.name)})}async _executeNestedToolCall(parentToolCallId,name,args,options){return this._nestedToolCalls??=new NestedToolCallRunner({getTools:()=>this._getCallableTools(),isSequential:()=>this.agent.toolExecution==="sequential",runToolCall:(toolCall,parentId,signal,onUpdate)=>{let assistantMessage=this._findLastAssistantMessage();return assistantMessage?runToolCall(toolCall,{tools:this._getCallableTools(),assistantMessage,context:{messages:this.agent.state.messages,tools:this.agent.state.tools},beforeToolCall:({toolCall:call,args:callArgs})=>this.preflightToolCall(call,callArgs,{waitForEventQueue:!1,parentToolCallId:parentId}),afterToolCall:({toolCall:call,args:callArgs,result:result3,isError})=>this._emitAfterToolCallHooks(call,callArgs,result3,isError,parentId),signal,onUpdate}):Promise.resolve({toolCall,result:{content:[{type:"text",text:"No assistant message issued this call"}],details:{}},isError:!0})},emit:async event=>{await this._extensionRunner.emit(event),this._emit(event)}}),this._nestedToolCalls.execute(parentToolCallId,name,args,options)}_installAgentRequestProjection(){let previousPrepareRequest=this.agent.prepareRequest;this.agent.prepareRequest=async(request2,signal)=>{let failed=this._failedResponse;this._failedResponse=void 0;let previous=await previousPrepareRequest?.(request2,signal)??void 0,model=previous?.model??this.agent.state.model,thinkingLevel=previous?.thinkingLevel??this.agent.state.thinkingLevel;if(!isVirtualModel(model))return request2.model===model?previous:{...previous,model,thinkingLevel};let context=previous?.context??request2.context,lastResponse=context.messages.findLastIndex(message=>message.role==="assistant"),userTurn=context.messages.slice(lastResponse+1).some(message=>message.role==="user"),state=getVirtualModelState(this.sessionManager.getBranch(),model.provider,model.id),route=await this._modelRuntime.resolveModel(model,convertToLlm2(context.messages),{reason:failed?"retry":userTurn?"user":"continuation",thinkingLevel,signal,failed,state});if(route.state!==void 0&&route.state!==state){let data={provider:model.provider,modelId:model.id,state:route.state};this._emitEntryAppended(this.sessionManager.appendCustomEntry(VIRTUAL_MODEL_STATE_ENTRY,data))}return{...previous,context,model:route.model,thinkingLevel:route.thinkingLevel}}}async _dispatchTurnEndBoundary(message,toolResults){this._lastActivityOutcome=message.stopReason==="aborted"?"aborted":message.stopReason==="error"?"error":"completed";let messageEntryId=this._findPersistedMessageEntryId(message);if(!this._extensionRunner.hasHandlers("turn_end"))return!1;if(!messageEntryId)return this._extensionRunner.emitError({extensionPath:"<boundary>",event:"turn_end",error:"turn_end could not resolve the persisted assistant entry ID"}),!1;let toolResultEntryIds=toolResults.flatMap(result3=>{let entryId=this._findPersistedMessageEntryId(result3);return entryId?[entryId]:[]}),boundary=await this._extensionRunner.emitBoundary({type:"turn_end",turnIndex:this._turnIndex,message,toolResults,messageEntryId,toolResultEntryIds,outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"turn_end"));return this._commitBoundaryDrafts(boundary.entries),boundary.entries.length>0&&this._boundaryRefreshedTurns.add(message),boundary.continue&&!this._buildBoundaryContext([],"turn_end").canContinue?(this._reportInvalidBoundaryContinuation("turn_end"),!1):boundary.continue}_installAgentBoundaryHooks(){let previousFinishTurn=this.agent.finishTurn;this.agent.finishTurn=async(turn,signal)=>{this._boundaryDispatchedMessages.add(turn.message),await Promise.all([turn.message,...turn.toolResults].map(message=>this._messageEndPersistence.get(message)));let extensionContinue=await this._dispatchTurnEndBoundary(turn.message,turn.toolResults),previousDecision=await previousFinishTurn?.(turn,signal);if(previousDecision?.action==="end")return previousDecision;if(extensionContinue||previousDecision?.action==="continue")return{action:"continue"}}}_applyObservedCursorContextWindow(model){let observed=getCursorContextLimit2(model.id);if(observed===void 0||observed<=0||observed===model.contextWindow)return;let previous=model.contextWindow;model.contextWindow=observed,this._sessionLogger.info("cursor_context_window_observed",{modelId:model.id,previous,observed})}_installAgentNextTurnRefresh(){let previousPrepareNextTurnWithContext=this.agent.prepareNextTurnWithContext??(this.agent.prepareNextTurn?async(_turn,signal)=>await this.agent.prepareNextTurn?.(signal):void 0),previousTransformContext=this.agent.transformContext;this.agent.transformContext=async(messages,signal)=>{this.sessionManager.getResidentStore().materializeInPlace(messages);let transformed=previousTransformContext?await previousTransformContext(messages,signal):messages,model=this.model;if(model?.provider!=="cursor"&&model?.provider!=="cursor-cli-oauth")return transformed;this._applyObservedCursorContextWindow(model);let budgetBytes=cursorAdmissionBudgetBytes(model.contextWindow),admission=admitCursorHistory({messages:transformed,budgetBytes,convert:candidate=>this.agent.convertToLlm(candidate)});return admission.blankedToolResults>0&&this._sessionLogger.info("cursor_admission_truncated",{blankedToolResults:admission.blankedToolResults,bytesBefore:admission.bytesBefore,bytesAfter:admission.bytesAfter,budgetBytes}),admission.overBudget&&this._sessionLogger.warn("cursor_admission_over_budget",{bytes:admission.bytesAfter,budgetBytes}),admission.messages??transformed},this.agent.prepareNextTurnWithContext=async(turn,signal)=>{this._runtimeMessages();let compactBeforeNextAdmission=async()=>{let provider=this.model?.provider;if(provider==="cursor"||provider==="cursor-cli-oauth"||turn.toolResults.length===0&&!this.agent.hasQueuedMessages()||(await this._agentEventQueue,turn.toolResults.length===0&&!this.agent.hasQueuedMessages()))return!1;try{return await this._enforceCompactionBeforeProvider(turn.message,!0,"threshold")}catch(error2){throw error2 instanceof RequiredCompactionError&&(this._requiredCompactionTurnError=error2,this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=error2)),error2}},compactedBeforeCallback=await compactBeforeNextAdmission(),boundaryRefreshed=this._boundaryRefreshedTurns.delete(turn.message),messages=compactedBeforeCallback||boundaryRefreshed?this.agent.state.messages.slice():turn.context.messages,postCompactionTurn={...turn,context:{...turn.context,messages}},previousSnapshot=await previousPrepareNextTurnWithContext?.(postCompactionTurn,signal),previousContext=previousSnapshot?.context??postCompactionTurn.context,compactedAfterCallback=!1;if(compactedBeforeCallback||(compactedAfterCallback=await compactBeforeNextAdmission()),compactedAfterCallback){let postLateCompactionTurn={...turn,context:{...turn.context,messages:this.agent.state.messages.slice()}},postLateCompactionSnapshot=await previousPrepareNextTurnWithContext?.(postLateCompactionTurn,signal);previousSnapshot={...previousSnapshot,...postLateCompactionSnapshot,context:postLateCompactionSnapshot?.context??postLateCompactionTurn.context},previousContext=previousSnapshot.context??postLateCompactionTurn.context}return this._refreshToolDeclarationsForModel(),{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice(),declaredTools:this.agent.state.declaredTools?.slice()},model:this.agent.state.model,thinkingLevel:this.agent.state.thinkingLevel,thinkingSelection:this.agent.state.thinkingSelection??null,abortServerSideFallback:this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain()}}}_refreshFinalizedContext(){let projection=this.sessionManager.buildSessionProjection();for(let entry of projection.entries)for(let message of entry.messages)this._entryIdsByMessage.set(message,entry.sourceEntry.id);this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()}_applyBoundaryDrafts(manager,drafts){let appended=[];for(let draft of drafts){let entryId;switch(draft.type){case"custom":entryId=manager.appendCustomEntry(draft.customType,draft.data);break;case"custom_message":entryId=manager.appendCustomMessageEntry(draft.customType,draft.content,draft.display,draft.details);break;case"context_edit":entryId=manager.appendContextEdit(draft.targetId,draft.replacement);break;case"compaction":{let tokensBefore=estimateProjectedContextTokens(manager.buildSessionProjection(),manager.getBranch()).tokens;entryId=manager.appendCompaction(draft.summary,draft.firstKeptEntryId,tokensBefore,draft.details,!0,draft.usage);break}}let entry=manager.getEntry(entryId);entry&&appended.push(entry)}return appended}_createBoundaryPreviewManager(drafts){let header2=this.sessionManager.getHeader();if(!header2)throw new Error("Session header is missing");let manager=SessionManager.inMemory(this._cwd,void 0,[header2,...this.sessionManager.getBranch()]);return this._applyBoundaryDrafts(manager,drafts),manager}_getPendingBoundaryMessages(){return[...this.agent.peekQueuedMessages(),...this._pendingCustomMessages]}_buildBoundaryContext(drafts,boundary){let projection=drafts.length===0?this.sessionManager.buildSessionProjection():this._createBoundaryPreviewManager(drafts).buildSessionProjection(),pendingMessages=this._getPendingBoundaryMessages(),llmMessages=convertToLlm2(projection.messages),finalRole=llmMessages[llmMessages.length-1]?.role,contextCanContinue=llmMessages.some(message=>message.role!=="system")&&finalRole!=="assistant",pendingCustomContext=this._pendingCustomMessages.length>0;return{contextEntries:projection.entries,contextMessages:projection.messages,llmMessages,pendingMessages,canContinue:contextCanContinue||pendingCustomContext||(boundary==="turn_end"?this.agent.hasQueuedMessages():finalRole==="assistant"&&this.agent.hasQueuedMessages())}}_commitBoundaryDrafts(drafts){if(drafts.length===0)return;let appended=this._applyBoundaryDrafts(this.sessionManager,drafts);this._refreshFinalizedContext();for(let entry of appended)this._emitEntryAppended(entry.id)}async _runBeforeSettleBoundary(heldQueue=!1){if(!this._extensionRunner.hasHandlers("agent_before_settle"))return!heldQueue&&this.agent.hasQueuedMessages();this._isBeforeSettle=!0,this._abortDuringBeforeSettle=!1;try{let result3=await this._extensionRunner.emitBoundary({type:"agent_before_settle",outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"agent_before_settle"));this._commitBoundaryDrafts(result3.entries),this._flushPendingCustomMessages();let finalContext=this._buildBoundaryContext([],"agent_before_settle");if(this._abortDuringBeforeSettle)return!1;let shouldContinue=result3.continue||!heldQueue&&this.agent.hasQueuedMessages();return shouldContinue&&!finalContext.canContinue?(result3.continue&&this._reportInvalidBoundaryContinuation("agent_before_settle"),!1):shouldContinue}finally{this._isBeforeSettle=!1}}_reportInvalidBoundaryContinuation(event){this._extensionRunner.emitError({extensionPath:"<boundary>",event,error:`${event} requested continuation without runnable model context`})}_emitEntryAppended(entryId){if(this._extensionMode!=="rpc")return;let entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})}appendSessionEntry(entry){this.sessionManager.appendEntry(entry),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._emitEntryAppended(entry.id)}_emit(event){this._logSessionEvent(event);for(let l of[...this._eventListeners])l(event)}async _emitSessionCompactFailed(event){this._extensionRunner.hasHandlers("session_compact_failed")&&await this._extensionRunner.emit({type:"session_compact_failed",...event})}_logSessionEvent(event){if(event.type==="compaction_start"){let previousAttempt=this._activeCompactionLogAttempt;if(previousAttempt){let tokensAfter=this._estimateCompactionLogTokens("persisted");this._sessionLogger.info("compaction_decision",{attemptId:previousAttempt.id,reason:previousAttempt.reason,mode:previousAttempt.reason==="manual"?"manual":"auto",action:"compact",disposition:"superseded",accepted:!1,skipped:!0,aborted:!0,willRetry:!1,tokensBefore:previousAttempt.tokensBefore,tokensAfter}),this._supersededCompactionLogAttemptIds.add(previousAttempt.id)}let attempt2={id:event.requestId??randomUUID15(),reason:event.reason,tokensBefore:this._estimateCompactionLogTokens("persisted")};this._activeCompactionLogAttempt=attempt2,this._sessionLogger.info("compaction_start",{attemptId:attempt2.id,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:"compact",tokensBefore:attempt2.tokensBefore});return}if(event.type==="compaction_end"){if(event.requestId&&this._supersededCompactionLogAttemptIds.delete(event.requestId))return;let activeAttempt=this._activeCompactionLogAttempt,attempt2=event.requestId!==void 0&&activeAttempt?.id===event.requestId?activeAttempt:void 0,accepted=event.accepted??event.result!==void 0,rejected=event.rejectionCause!==void 0,skipped2=!accepted&&(attempt2===void 0||!rejected&&!event.aborted&&!event.errorMessage),disposition=accepted?"committed":attempt2===void 0?"skipped":rejected?"rejected":event.aborted?"aborted":event.errorMessage?"failed":"skipped",tokensAfter=this._estimateCompactionLogTokens(accepted?"active":"persisted");this._sessionLogger.info("compaction_decision",{attemptId:attempt2?.id??event.requestId,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:accepted||attempt2?"compact":"none",disposition,accepted,skipped:skipped2,aborted:event.aborted,willRetry:event.willRetry,rejectionCause:event.rejectionCause,error:event.errorMessage,tokensBefore:attempt2?.tokensBefore??tokensAfter,tokensAfter}),attempt2&&(this._activeCompactionLogAttempt=void 0);return}if(event.type==="message_end"&&event.message.role==="assistant"){let message=event.message;if(message.stopReason!=="error")return;let kind=isProviderStreamStallError(message)?"stall":isProviderTimeoutError(message)?"timeout":"error";this._sessionLogger.warn("provider_error",{kind,error:message.errorMessage})}}_estimateCompactionLogTokens(source2){try{let messages=source2==="active"?this._runtimeMessages():this.sessionManager.buildSessionContext().messages;return estimateMessagesTokens2(messages)}catch{return}}_createToolContext(signal){let context=this._extensionRunner.createContext(),controller=new AbortController,cancellation=signal??context.signal,unsubscribe=this.subscribe(event=>{event.type==="queue_update"&&event.steering.length>0&&controller.abort()}),dispose=()=>{unsubscribe(),cancellation?.removeEventListener("abort",dispose),this._toolContextDisposers.delete(dispose)};return this._toolContextDisposers.add(dispose),cancellation?.addEventListener("abort",dispose,{once:!0}),cancellation?.aborted?dispose():this._steeringMessages.length>0&&controller.abort(),Object.defineProperty(context,"steeringSignal",{value:controller.signal,enumerable:!0}),{context,dispose}}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages],ordered:[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder)})}_incrementMessageRevision(){this._messageRevision++,this._releaseBlockedPostCompactionAdmissionIfReduced()}_runtimeMessages(){return this._runtimeMessagesTokenized&&(this._runtimeMessagesTokenized=!1,this.sessionManager.getResidentStore().materializeInPlace(this.agent.state.messages)),this.agent.state.messages}_blockedAdmissionContentTokens(){return estimateMessagesTokens2(this._runtimeMessages())}_releaseBlockedPostCompactionAdmissionIfReduced(){let blocked=this._blockedPostCompactionAssistant;blocked!==void 0&&this._blockedAdmissionContentTokens()<blocked.contentTokens&&(this._blockedPostCompactionAssistant=void 0)}_releaseBlockedPostCompactionAdmission(){this._blockedPostCompactionAssistant=void 0}getMessageRevision(){return this._messageRevision}get agentDir(){return this._agentDir}get cwd(){return this._cwd}async _waitForSettledSessionWork(){await this._sessionWorkBarrier.waitForSettled(()=>this._agentEventQueue)}async waitForSettledSessionWork(){await this._waitForSettledSessionWork();let titlePromise=this._sessionTitlePromise;titlePromise!==void 0&&await titlePromise,await this._waitForSettledSessionWork()}_modelSelectionChangesContext(previousModel,nextModel){return!modelsAreEqual(previousModel,nextModel)||previousModel?.contextWindow!==nextModel.contextWindow?!0:previousModel?.api!==nextModel.api}_invalidateCompactionForModelSelection(){this.abortCompaction(),this.abortBranchSummary(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision()}_modelChangeWouldExhaustContext(model){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings(),projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:this._getDownswitchLiveContextTokens(model),compaction,includeSpeculationLead:!1,admission:this._modelSwitchAdmission()});if(!projection.usable&&!(compaction.enabled&&projection.verdict==="fits-after-compaction"))return projection}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve46=>{this._resolveIdleWait=resolve46})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve46=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve46()}async _emitAgentSettled(){if(this.agent.state.isStreaming&&await this.agent.waitForIdle(),!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1,this.externalAdmission.observeRunSettled();let deferredActions=[],deferredTurnClaims=[];this._agentSettledDelivery.begin(this._userAbortGeneration);let settlementEpoch=++this._settlementEpoch;try{await this._extensionRunner.emit({type:"agent_settled"}),this._emit({type:"agent_settled"}),this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),{actions:deferredActions,turnClaims:deferredTurnClaims}=this._agentSettledDelivery.finish(this._userAbortGeneration)}finally{this._agentSettledDelivery.cancel(),this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle()}for(let action of deferredActions)action();queueMicrotask(()=>{this._emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims)})}releaseSettledSessionMemory(){this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.sessionManager.holdsMaterializedHistory()&&this.sessionManager.dropMaterializedCaches(),(this.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0))}async _emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims){let dispositions=await Promise.all(deferredTurnClaims.map(claim=>claim.disposition));dispositions.includes("started")||((dispositions.includes("delegated")||this._sessionWorkBarrier.hasActiveWork)&&await this._waitForSettledSessionWork(),settlementEpoch===this._settlementEpoch&&(this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.releaseSettledSessionMemory(),this._emit({type:"agent_idle"}))))}async _promptAgent(messages,deferredTurnClaim,onQueuedInput){if(deferredTurnClaim?.resolve("started"),this._isAgentRunActive||this.externalAdmission.beginTurn(),this._isAgentRunActive=!0,this._failedResponse=void 0,this._recordSelection(),this._requiredCompactionAdmissionError=void 0,this._transcriptWriteFailures.startRun(),this._promptOwnsRun=!0,!this.agent.state.isStreaming){let withoutRefused=this._transcriptWriteFailures.takeRefusedOut(this.agent.state.messages);withoutRefused&&(this.agent.state.messages=withoutRefused,this._incrementMessageRevision())}this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue,this._promptOwnsRun=!1;let requiredCompactionError=this._requiredCompactionAdmissionError;this._requiredCompactionAdmissionError=void 0;let transcriptWriteFailure=this._transcriptWriteFailures.takeReport();if(requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError;if(transcriptWriteFailure)throw transcriptWriteFailure.error}catch(error2){if(this._promptOwnsRun=!1,error2 instanceof Error&&error2.message==="Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion."){let queuedMessages=Array.isArray(messages)?messages:[messages],userMessage2=queuedMessages.find(message=>message.role==="user"),prepared=userMessage2?.role==="user"?{...readClientMessageIdentity(userMessage2),text:this._extractUserMessageText(userMessage2.content),images:typeof userMessage2.content=="string"?void 0:userMessage2.content.filter(part=>part.type==="image"),mode:"steer",enqueueOrder:this.reserveQueuedInputOrder()}:void 0;prepared&&onQueuedInput?.(prepared);for(let message of queuedMessages)this.agent.steer(message);prepared&&(this._steeringMessages.push(prepared.text),this._recordQueuedInput(prepared.text,"steer",prepared),this._emitQueueUpdate());return}throw await this._emitAgentSettled(),error2}}_extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text").map(part=>part.text).join("")}_createRetryPromiseForAgentEnd(event){if(event.type!=="agent_end"||this._retryPromise||!this.settingsManager.getRetrySettings().enabled)return;let lastAssistant=this._findLastAssistantInMessages(event.messages);!lastAssistant||!this._isRetryableError(lastAssistant)&&!this._isHardErrorFallbackEligible(lastAssistant)&&!isCursorZeroTokenResourceExhausted(lastAssistant)&&!isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0)||(this._retryPromise=new Promise(resolve46=>{this._retryResolve=resolve46}),this.agent.suppressQueuedMessageDrain())}_findLastAssistantInMessages(messages){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.role==="assistant")return message}}_getRequiredAutoCompactionReason(message){let reason=this._getAutoCompactionReason(message);if(reason==="overflow"&&message.stopReason==="stop"&&this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(reason==="overflow")return reason;if(this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(!(reason==="threshold"&&(this._skipNextPostRetryCompactionCheck||this._postCompactionUsageExemptAssistants.has(message))))return reason}_resolveThresholdContextTokens(directContextTokens){let messages=this._runtimeMessages();return resolveThresholdContextTokens(directContextTokens,estimateMessagesTokens2(messages))}_getAutoCompactionReason(message){let settings=this._getCompactionSettings();if(message.stopReason==="aborted")return;let model=this.model;if(!model||this._isAssistantFromBeforeLatestCompaction(message)&&!this._exceedsPolicyByContentEstimate())return;let sameModel=isSameOverflowSource(message,model,this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId),contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings);if(isContextOverflow(message,model.contextWindow)&&(sameModel||currentContextNeedsCompaction)||this._isCursorPayloadOverflow(message))return settings.enabled||isTurnStuckOnContextOverflow(message,model.contextWindow)?"overflow":void 0;if(!settings.enabled)return;let contextTokens,directContextTokens=message.usage?calculateContextTokens2(message.usage):0;if(message.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this._runtimeMessages(),estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex===null){if(!this._isRequiredCompactionError(message))return}else{let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch()),usageMessage=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)){let contentTokens=estimateMessagesTokens2(messages);return shouldCompact2(contentTokens,model.contextWindow,settings)?"threshold":void 0}}contextTokens=estimate.tokens}return shouldCompact2(contextTokens,model.contextWindow,settings)?"threshold":void 0}_exceedsPolicyByContentEstimate(){let model=this.model;if(!model)return!1;let settings=this._getCompactionSettings(),contextTokens=estimateMessagesTokens2(this._runtimeMessages());return shouldCompact2(contextTokens,model.contextWindow,settings)}_hasPendingPostCompactionUsageExemption(message){return this._skipNextPostCompactionAssistantCheck&&!this._assistantsPendingAtCompaction.has(message)&&this._overflowRecoveryRungs===0}_isPostCompactionUsageExempt(message){return this._postCompactionUsageExemptAssistants.has(message)||this._hasPendingPostCompactionUsageExemption(message)}_consumePostCompactionUsageExemption(message){return this._postCompactionUsageExemptAssistants.has(message)?!0:this._isPostCompactionUsageExempt(message)?(this._skipNextPostCompactionAssistantCheck=!1,this._postCompactionUsageExemptAssistants.add(message),!0):!1}_agentEndAllowsQueuedContinuation(messages){let lastAssistantIndex=-1;for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant"){lastAssistantIndex=index;break}if(lastAssistantIndex===-1)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||lastAssistant.stopReason==="aborted"||lastAssistant.stopReason==="error"||this._getRequiredAutoCompactionReason(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&message.isError&&message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)))return!1}return!0}_willRetryAfterAgentEnd(messages){if(this._suppressQueuedContinuationAfterUserAbort)return!1;let lastAssistant=this._lastAssistantMessage??this._findLastAssistantInMessages(messages);if(!lastAssistant)return!1;if(this._isRequiredCompactionError(lastAssistant)&&this._getRequiredAutoCompactionReason(lastAssistant)!==void 0)return!0;if(!this.settingsManager.getRetrySettings().enabled)return!1;let turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,retryableError=this._isRetryableError(lastAssistant);if(isCursorZeroTokenResourceExhausted(lastAssistant))return!0;if(isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0))return this._retryFallback.canTryFallback();if(!retryableError&&this._isHardErrorFallbackEligible(lastAssistant))return!0;if(!retryableError)return!1;if(isClassifierRefusal(lastAssistant))return this._retryAttempt+1<=turnMaxRetries&&this._retryFallback.canTryFallback();if(this._retryAttempt+1>turnMaxRetries)return this._retryFallback.canTryFallback();let errorMessage8=lastAssistant.errorMessage||"Unknown error",providerDelayMs=this._getProviderRetryDelayMs(errorMessage8);return providerDelayMs===void 0||providerDelayMs<=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs?!0:this._retryFallback.canTryFallback()}_isRequiredCompactionError(message){return this._requiredCompactionTurnError!==void 0&&message.stopReason==="error"&&message.errorMessage===this._requiredCompactionTurnError.message}async _processAgentEvent(event,signal){if(event.type==="agent_start"&&(this._requiredCompactionTurnError=void 0,this._armCircuitProbeWatchdog()),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryRungs=0,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let{clientMessageId}=readClientMessageIdentity(event.message),queued=clientMessageId===void 0?void 0:this._queuedInputOrder.find(input=>input.clientMessageId===clientMessageId),steeringIndex=clientMessageId===void 0||queued?.mode==="steer"?this._steeringMessages.indexOf(messageText):-1;if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer",clientMessageId),this._emitQueueUpdate();else{let followUpIndex=clientMessageId===void 0||queued?.mode==="followUp"?this._followUpMessages.indexOf(messageText):-1;followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp",clientMessageId),this._emitQueueUpdate())}}}let agentEndWillRetry=event.type==="agent_end"&&this._willRetryAfterAgentEnd(event.messages);this._extensionEventSignal=signal;try{await this._emitExtensionEvent(event,agentEndWillRetry)}finally{this._extensionEventSignal=void 0}if(event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),this._emit(event.type==="agent_end"?{...event,willRetry:agentEndWillRetry}:event.type==="message_update"?withResolvedToolName(event,name=>this.resolveToolCallName(name)):event),event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),event.type==="message_update"&&event.message.role==="assistant"&&this._acceptCircuitProbeOnProgress(event.message,event.assistantMessageEvent),event.type==="message_end"){let entryId;try{event.message.role==="custom"?(entryId=this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message)):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(entryId=this.sessionManager.appendMessage(event.message),this._emitEntryAppended(entryId),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message))}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:String(error2);this.externalAdmission.observeRefused(event.message,errorMessage8),this._sessionLogger.warn("transcript_write_failed",{role:event.message.role,error:errorMessage8}),this._transcriptWriteFailures.record(event.message,error2),this._emit({type:"transcript_write_failed",role:event.message.role,errorMessage:errorMessage8}),this._promptOwnsRun||this._reportContinuationTranscriptFailure()}if(entryId&&this._entryIdsByMessage.set(event.message,entryId),event.message.role==="assistant"){this._lastAssistantMessage=event.message;let assistantMsg=event.message,succeeded=!assistantMsg.errorMessage&&assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="aborted"&&!isClassifierRefusal(assistantMsg);if(succeeded&&this._retryFallback.probes.accept(`${assistantMsg.provider}/${assistantMsg.model}`),succeeded&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryRungs=0),succeeded&&this._retryAttempt>0){let fallback=this._retryFallback.activeState;fallback&&this._emit({type:"retry_fallback_succeeded",model:this.model?`${this.model.provider}/${this.model.id}`:"",chainKey:fallback.chainKey}),this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0,this._resetHintTierState()}}}let launchedContinuation=!1,retryContinuationBlocked=!1,retryExhaustionAllowsQueuedContinuation=!1,allowsPostCompactionUsageExemptContinuation=!1,userAbortSuppressedQueuedContinuation=event.type==="agent_end"&&this._suppressQueuedContinuationAfterUserAbort;userAbortSuppressedQueuedContinuation&&(this._suppressQueuedContinuationAfterUserAbort=!1);let allowsQueuedContinuation=event.type==="agent_end"&&!userAbortSuppressedQueuedContinuation?this._agentEndAllowsQueuedContinuation(event.messages):!1;if(event.type==="agent_end"&&this._lastAssistantMessage){let msg=this._lastAssistantMessage;this._lastAssistantMessage=void 0,this._skipNextPostRetryCompactionCheck=!1,this._clearCircuitProbeWatchdog(),msg.stopReason==="error"&&isHealthExhaustionFailure(msg.errorMessage)&&this.model&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage});let requiredAutoCompaction=this._getRequiredAutoCompactionReason(msg),retryAfterRequiredCompaction=requiredAutoCompaction!==void 0&&this._isRequiredCompactionError(msg),retryableError=this._isRetryableError(msg),hardErrorFallbackEligible=this._isHardErrorFallbackEligible(msg),cursorZeroTokenRe=isCursorZeroTokenResourceExhausted(msg),cursorQuotaRe=isCursorQuotaResourceExhausted(msg,this.model?.contextWindow??0),claudeSdkSameModelRemint=this._isClaudeSdkSameModelRemintError(msg),retryCanAdmitProvider=!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled&&(retryableError||hardErrorFallbackEligible||cursorZeroTokenRe||cursorQuotaRe||claudeSdkSameModelRemint),compactedBeforeRetry=!1;retryCanAdmitProvider&&requiredAutoCompaction&&!(requiredAutoCompaction==="threshold"&&this._hasPendingPostCompactionUsageExemption(msg))&&(this._retireFailedRetryAssistant(msg),compactedBeforeRetry=await this._runPrePromptCompaction(msg,!0,requiredAutoCompaction,!0),retryContinuationBlocked=!compactedBeforeRetry&&!this._isCompactionDelegated()&&!cursorQuotaRe&&!hardErrorFallbackEligible);let retryOutcome="not-handled",retryOwnedDeferredQueue=DEFERRED_RETRY_QUEUE_OWNERS.has(this);if(DEFERRED_RETRY_QUEUE_OWNERS.delete(this),!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(cursorZeroTokenRe?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):cursorQuotaRe?(this._retireFailedRetryAssistant(msg),retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0})):claudeSdkSameModelRemint?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):retryableError?retryOutcome=await this._handleRetryableError(msg):hardErrorFallbackEligible&&(retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0}))),retryOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}if(msg.stopReason==="error"&&this.model&&this._isRetryableError(msg)&&this._isCircuitProbeOnCurrentModel()&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage}),this._retryFallback.probes.release(),retryExhaustionAllowsQueuedContinuation=!userAbortSuppressedQueuedContinuation&&retryOwnedDeferredQueue&&retryOutcome==="not-handled"&&(msg.stopReason==="error"||msg.stopReason==="aborted"),retryOutcome==="not-handled"&&cursorQuotaRe&&msg.errorMessage&&(msg.errorMessage=`${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`),retryOutcome==="not-handled"&&msg.stopReason==="error"&&msg.errorMessage){let rejectedImages=rejectedImageSources(this.agent.state.messages,msg);rejectedImages.length>0&&(msg.errorMessage=`${msg.errorMessage} (the rejected image from ${rejectedImages.join(", ")} is left out of later requests; send your next message to continue)`)}if(retryOutcome==="not-handled"&&this._retryAttempt>0&&msg.errorMessage){let attempt2=this._retryAttempt;this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:userAbortSuppressedQueuedContinuation?"Retry cancelled":msg.errorMessage})}this._resolveRetry(),retryContinuationBlocked||=retryOutcome==="blocked",!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(compactedBeforeRetry&&this.agent.hasQueuedMessages()?(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0):(launchedContinuation=await this._checkCompaction(msg,!0,void 0,retryAfterRequiredCompaction),launchedContinuation&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0),allowsPostCompactionUsageExemptContinuation=this._postCompactionUsageExemptAssistants.has(msg),allowsPostCompactionUsageExemptContinuation&&this._flushPostCompactionDeferredMessages(),requiredAutoCompaction&&!launchedContinuation&&this.agent.hasQueuedMessages()&&this._getRequiredAutoCompactionReason(msg)!==void 0&&(this._requiredCompactionAdmissionError=new RequiredCompactionError)))}event.type==="agent_end"&&(this._flushPendingBashMessages(),!launchedContinuation&&!retryContinuationBlocked&&(allowsQueuedContinuation||allowsPostCompactionUsageExemptContinuation||retryExhaustionAllowsQueuedContinuation)&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),!launchedContinuation&&!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&this._extensionRunner.hasHandlers("agent_before_settle")&&await this._runBeforeSettleBoundary(this.agent.hasQueuedMessages())&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),launchedContinuation?this._abortProvenance.closeAgentEndBoundary():await this._emitAgentSettled())}_resolveRetry(){this._retryResolve&&(this._retryResolve(),this._retryResolve=void 0,this._retryPromise=void 0)}_resetHintTierState(){this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0}_isCircuitProbeOnCurrentModel(){let model=this.model;return model!==void 0&&this._retryFallback.probes.holds(formatSelector(model))}_acceptCircuitProbeOnProgress(message,event){let probing=this._retryFallback.probes.probing;probing===void 0||`${message.provider}/${message.model}`!==probing||!((event.type==="text_delta"||event.type==="thinking_delta"||event.type==="toolcall_delta")&&event.delta.length>0)||(this._retryFallback.probes.accept(probing),this._clearCircuitProbeWatchdog())}_armCircuitProbeWatchdog(){this._clearCircuitProbeWatchdog();let probing=this._retryFallback.probes.probing;if(probing===void 0||this.agent.streamStartTimeoutMs!==void 0)return;let timeoutMs=DEFAULT_STREAM_START_TIMEOUT_MS;this._circuitProbeWatchdog=setTimeout(()=>{this._circuitProbeWatchdog=void 0,this._retryFallback.probes.probing===probing&&this.agent.abort(new ProviderRetryWatchdogAbortError(`Circuit probe of ${probing} sent no response within ${timeoutMs}ms`))},timeoutMs)}_clearCircuitProbeWatchdog(){this._circuitProbeWatchdog!==void 0&&(clearTimeout(this._circuitProbeWatchdog),this._circuitProbeWatchdog=void 0)}async _emitSessionAbort(){await this._extensionRunner.emit({type:"session_abort"}),this._emit({type:"session_abort"})}_armProbeBackForDemotedSelector(selector,hintMs){if(!selector)return;let currentModel=this.model;if(currentModel&&formatSelector(currentModel)===selector)return;let parts=selector.split("/");if(parts.length<2)return;let provider=parts[0];if(!this._modelRuntime.hasConfiguredAuth(provider))return;let now2=this._fallbackNow(),schedule=probeBackSchedule(hintMs,now2),modelId=parts.slice(1).join("/"),demotedModel=this._modelRuntime.getModel(provider,modelId);demotedModel&&this._probeBackScheduler.arm({selector,firstAtMs:schedule.firstAtMs,deadlineMs:schedule.deadlineMs,authAvailable:()=>this._modelRuntime.hasConfiguredAuth(provider),runProbe:async signal=>{let admission=this._fallbackCircuits.admit(selector,`probe-back:${++this._probeBackLaneSeq}`);if(admission.kind==="open")return!1;try{let result3=await this._modelRuntime.completeSimple(demotedModel,{systemPrompt:"Reply with OK.",messages:[{role:"user",content:[{type:"text",text:"OK"}],timestamp:now2}]},{maxTokens:1,signal}),ok2=result3.stopReason!=="error"&&result3.stopReason!=="aborted";return!ok2&&result3.stopReason==="error"&&admission.kind==="probe"&&this._fallbackCircuits.noteFailure(selector,{errorMessage:result3.errorMessage}),ok2}catch{return!1}finally{admission.kind==="probe"&&this._fallbackCircuits.release(admission.token)}},onCleared:sel=>{this._selectorCooldowns.clear(sel),this._fallbackCircuits.close(sel)},emit:event=>{event.type==="retry_probe_scheduled"?this._emit({type:"retry_probe_scheduled",selector:event.selector,atMs:event.atMs,probeIndex:event.probeIndex}):this._emit({type:"retry_probe_result",selector:event.selector,ok:event.ok,errorMessage:event.errorMessage})}})}_findPersistedMessageEntryId(message){let mapped=this._entryIdsByMessage.get(message);if(mapped)return mapped;for(let entry of[...this.sessionManager.getBranch()].reverse())if(entry.type==="message"&&entry.message===message)return entry.id;let messageIndex=this.agent.state.messages.indexOf(message);if(messageIndex<0)return;let projection=this.sessionManager.buildSessionProjection(),projectedIndex=0;for(let entry of projection.entries)for(let i=0;i<entry.messages.length;i++){if(projectedIndex===messageIndex)return this._entryIdsByMessage.set(message,entry.sourceEntry.id),entry.sourceEntry.id;projectedIndex++}}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}_retireFailedRetryAssistant(message){let position=this.sessionManager.getMessageEntryPosition(message);if(!position||this.sessionManager.getLeafId()!==position.entryId)return;let entry=this.sessionManager.getEntry(position.entryId);if(entry?.type!=="message")return;entry.parentId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(entry.parentId);let messageIndex=this.agent.state.messages.lastIndexOf(message);messageIndex!==-1&&(this.agent.state.messages=this.agent.state.messages.slice(0,messageIndex)),this._incrementMessageRevision()}_isAssistantFromBeforeLatestCompaction(assistantMessage){let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(compactionEntry===null||this._messageEndsAwaitingPersistence.has(assistantMessage))return!1;let messagePosition=this.sessionManager.getMessageEntryPosition(assistantMessage),compactionOrder=this.sessionManager.getEntryOrder(compactionEntry.id);return messagePosition!==void 0&&compactionOrder!==void 0?messagePosition.order<=compactionOrder:assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime()}_replaceMessageInPlace(target,replacement){if(target!==replacement){for(let key of Object.keys(target))Reflect.deleteProperty(target,key);Object.assign(target,replacement)}}async _emitExtensionEvent(event,agentEndWillRetry=!1){if(event.type==="agent_start")this._turnIndex=0,await this._extensionRunner.emit({type:"agent_start"});else if(event.type==="agent_end"){let extensionEvent=this._abortProvenance.beginAgentEnd(event.messages,agentEndWillRetry,this._findLastAssistantInMessages(event.messages)?.stopReason==="aborted");try{await this._extensionRunner.emit(extensionEvent)}finally{this._abortProvenance.endAgentEnd(extensionEvent)}}else if(event.type==="turn_start"){let extensionEvent={type:"turn_start",turnIndex:this._turnIndex,timestamp:Date.now()};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="turn_end")event.message.role==="assistant"&&!this._boundaryDispatchedMessages.delete(event.message)&&await this._dispatchTurnEndBoundary(event.message,event.toolResults),this._turnIndex++,this._flushPendingCustomMessages();else if(event.type==="message_start"){let extensionEvent={type:"message_start",message:event.message};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_update"){let extensionEvent={type:"message_update",message:event.message,assistantMessageEvent:event.assistantMessageEvent};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_end"){let extensionEvent={type:"message_end",message:event.message},replacement=await this._extensionRunner.emitMessageEnd(extensionEvent);if(replacement){let normalized2=(replacement.role==="user"||replacement.role==="assistant"||replacement.role==="toolResult"||replacement.role==="custom")&&replacement.content==null?{...replacement,content:[]}:replacement;this._replaceMessageInPlace(event.message,normalized2)}}else if(event.type==="tool_execution_start"){let extensionEvent={type:"tool_execution_start",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_update"){let extensionEvent={type:"tool_execution_update",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,partialResult:event.partialResult};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_end"){let extensionEvent={type:"tool_execution_end",toolCallId:event.toolCallId,toolName:event.toolName,result:event.result,isError:event.isError};await this._extensionRunner.emit(extensionEvent)}}subscribe(listener){this._eventListeners.push(listener),this._resumeCompactionRequirement!==void 0&&listener({type:"resume_compaction_required",projection:this._resumeCompactionRequirement.projection,notice:this._resumeCompactionRequirement.notice}),this._resumeSlice!==void 0&&listener(this._resumeSliceEvent(this._resumeSlice));for(let source2 of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source2});return()=>{let index=this._eventListeners.indexOf(listener);index!==-1&&this._eventListeners.splice(index,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}_reconnectToAgent(){this._unsubscribeAgent||(this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent))}dispose(){for(let dispose of this._toolContextDisposers)dispose();try{this._probeBackScheduler.cancel("dispose"),this._clearCircuitProbeWatchdog(),this._retryFallback.probes.releaseAll(),this._fallbackCircuitsLease.release(),this.abortRetry(),this.abortCompaction(),this.abortBranchSummary(),this.abortSessionTitleGeneration(),this.abortBash(),this.agent.abort()}catch{}this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."),this._releaseToolSearchService("session disposed"),this._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=void 0,this._eventListeners=[],cleanupSessionResources(this.sessionId),this.sessionManager.dispose()}get activitySnapshot(){return{isStreaming:this._isAgentRunActive,isBashRunning:this.isBashRunning,isCompacting:this.isCompacting,hasSessionWork:this._sessionWorkBarrier.hasActiveWork,hasActiveWakeSource:this._wakeSources.hasActive}}get isSessionBusy(){return isSessionBusySnapshot(this.activitySnapshot)}refreshContext(){this._refreshFinalizedContext()}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get thinkingSelection(){return this.agent.state.thinkingSelection}get serviceTier(){return this._currentServiceTier}isFastModeActive(){return this._currentServiceTier!=="ultrafast"&&(this._sessionFastMode||this._currentServiceTier==="priority")}get effectiveServiceTier(){return this.isFastModeActive()?"priority":this._currentServiceTier}setSessionFastMode(enabled){let previousFastMode=this.isFastModeActive(),previousTier=this._currentServiceTier;this._sessionFastMode=enabled,!enabled&&this._currentServiceTier==="priority"&&this.model?.api===CODEX_RESPONSES_API&&this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier==="priority"&&(this._currentServiceTier=void 0),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode)}_emitServiceTierChangeIfNeeded(previousTier,previousFastMode){let fastMode=this.isFastModeActive();previousTier===this._currentServiceTier&&previousFastMode===fastMode||this._emit({type:"service_tier_changed",tier:this.effectiveServiceTier,fastMode})}_resolveServiceTier(model,explicit){if(explicit)return explicit;if(model)return this._modelRuntime.getCompatibilityRequestConfig(model).serviceTier}get routedModel(){if(!this.model||!isVirtualModel(this.model))return;let latest=findLatestResponse(this.agent.state.messages),model=latest&&this._modelRuntime.getPhysicalModel(latest.provider,latest.model);return model&&{model,thinkingLevel:latest?.thinkingLevel}}get isStreaming(){return this._isAgentRunActive}get isIdle(){return!this._isAgentRunActive}setPromptSurface(surface){let current=this._baseSystemPromptOptions.surface;this._promptSurface=surface,current!==surface&&(this._systemPromptOverride=void 0,this._applyToolDeclarations(this.getActiveToolNames()))}get systemPrompt(){return this.agent.state.systemPrompt}get retryAttempt(){return this._retryAttempt}get currentAbortSource(){return this._abortProvenance.currentSource}getActiveToolNames(){return this.agent.state.tools.map(t=>t.name)}getCallableToolNames(){return this._getCallableTools().map(t=>t.name)}getAllTools(){return Array.from(this._toolDefinitions.values()).map(({definition,sourceInfo})=>({name:definition.name,label:definition.label,description:definition.description,parameters:definition.parameters,promptGuidelines:definition.promptGuidelines,kernelPrelude:projectKernelPrelude(definition.name,definition.kernelPrelude),permissionParser:definition.permissionParser,...definition.namespace?{namespace:definition.namespace}:{},...definition.annotations?{annotations:{...definition.annotations}}:{},sourceInfo,...normalizeToolExposure(definition)}))}getToolDefinition(name){return this._toolDefinitions.get(name)?.definition}resolveToolCallName(requested){return resolveToolNameAlias(requested,this._callableToolNames())??requested}async executeTool(toolName,params,options){let activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName);if(!tool&&this._isEvalOnlyPolicyArmed()&&this._evalOnlyToolNames?.has(toolName)&&(tool=this._toolRegistry.get(toolName)),!tool&&options?.activateInactiveTool===!0&&this._toolDefinitions.has(toolName)&&this._activateLazyTool(toolName)&&(activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName)),!tool){let code=new Set(this._toolDefinitions.keys()).has(toolName)?"inactive_tool":"unknown_tool",activeList=activeTools.length>0?activeTools.join(", "):"(none)";throw new ExecuteToolError(code,toolName,code==="inactive_tool"?`Tool ${toolName} is registered but inactive. Active tools: ${activeList}`:`Unknown tool ${toolName}. Active tools: ${activeList}`,activeTools)}let toolCall={type:"toolCall",id:`codemode-${randomUUID15()}`,name:toolName,arguments:params},prepared;try{prepared=prepareAgentToolCall(tool,toolCall)}catch(err2){throw new ExecuteToolError("invalid_params",toolName,err2 instanceof Error?err2.message:String(err2),activeTools)}let beforeResult=await this.preflightToolCall(prepared.toolCall,prepared.args,{waitForEventQueue:this._toolExecutionDepth===0});if(beforeResult?.block)throw new ExecuteToolError("blocked",toolName,beforeResult.reason||"Tool execution was blocked",activeTools);let result3,isError=!1;try{result3=await prepared.tool.execute(prepared.toolCall.id,prepared.args,options?.signal,options?.onUpdate),isError=result3.isError===!0}catch(err2){result3={content:[{type:"text",text:err2 instanceof Error?err2.message:String(err2)}],details:{isError:!0}},isError=!0}let hookResult=await this._emitAfterToolCallHooks(prepared.toolCall,prepared.args,result3,isError);return hookResult?{content:hookResult.content??result3.content,details:hookResult.details??result3.details,terminate:result3.terminate}:result3}_callableToolNames(){let names=this.agent.state.tools.map(tool=>tool.name);for(let[name,{definition}]of this._toolDefinitions){let exposure=normalizeToolExposure(definition);exposure.exposure==="search"&&exposure.allowLazyActivation&&names.push(name)}return[...names,...this._toolSearchCatalogNames()]}_toolSearchCatalogNames(){return this._toolSearchService?.getCatalog().map(doc=>doc.name)??[]}_activateLazyTool(toolName){return this._lazyToolActivation.activate(toolName)}_isEvalOnlyPolicyArmed(){return this._evalOnlyToolNames!==void 0&&this._toolRegistry.has("eval")}_resolveEvalOnlyToolNames(){let declaredEvalNames=[...this._toolDefinitions.values()].filter(({definition})=>normalizeToolExposure(definition).exposure==="eval").map(({definition})=>definition.name);return this._evalOnlyToolNamesOverride??new Set([...EVAL_ONLY_TOOL_NAMES,...declaredEvalNames])}_publishEvalOnlyToolHints(){let armed=this._isEvalOnlyPolicyArmed()?this._evalOnlyToolNames??new Set:void 0,registered=armed?new Set([...armed].filter(name=>this._toolRegistry.has(name))):void 0;for(let name of this._publishedEvalOnlyHintNames)registered?.has(name)||delete this.agent.removedToolHints[name];if(this._publishedEvalOnlyHintNames.clear(),!!registered)for(let name of registered)this.agent.removedToolHints[name]=`Run ${name} inside an eval cell via ${evalHelperCall(name)}; hooks and permissions still apply.`,this._publishedEvalOnlyHintNames.add(name)}getRegisteredTool(name){return this._toolRegistry.get(name)}async emitExecBridgeToolResult(toolName,toolCallId,args,result3,isError){await this._emitAfterToolCallHooks({type:"toolCall",id:toolCallId,name:toolName,arguments:args&&typeof args=="object"&&!Array.isArray(args)?args:{}},args,result3,isError)}setActiveToolsByName(toolNames){let tools=[],validToolNames=[],policyArmed=this._isEvalOnlyPolicyArmed();this._publishEvalOnlyToolHints();let policyNames=this._evalOnlyToolNames,filteredToolNames=toolNames;if(policyArmed&&policyNames){for(let name of toolNames)policyNames.has(name)&&this._withheldEvalOnlyToolNames.add(name);filteredToolNames=toolNames.filter(name=>!policyNames.has(name))}else this._withheldEvalOnlyToolNames.clear();this._requestedActiveToolNames=[...new Set([...toolNames,...this._withheldEvalOnlyToolNames])];for(let name of filteredToolNames){let tool=this._toolRegistry.get(name);tool&&this._getToolExposure(name)!=="hidden"&&(tools.push(tool),validToolNames.push(name))}let activeToolNamesChanged=validToolNames.length!==this.agent.state.tools.length||validToolNames.some((name,index)=>name!==this.agent.state.tools[index]?.name),previousToolNames=new Set(this.agent.state.tools.map(tool=>tool.name));this.agent.state.tools=tools;for(let name of validToolNames)this._declaredToolNames.includes(name)||this._declaredToolNames.push(name);this._applyToolDeclarations(validToolNames),activeToolNamesChanged&&this._extensionBindingPromptReadiness===void 0&&(this.abortCompaction(),this._incrementMessageRevision());let activatedToolNames=validToolNames.filter(name=>!previousToolNames.has(name));activatedToolNames.length>0&&this._extensionRunner?.hasHandlers("tool_activated")&&this._extensionRunner.emit({type:"tool_activated",toolNames:activatedToolNames})}_declaresSessionTools(){let model=this.model;return model!==void 0&&supportsAllowedToolChoice(model)}_toolDeclarationNames(activeToolNames){return this._declaresSessionTools()?this._declaredToolNames.filter(name=>this._toolRegistry.has(name)):[...activeToolNames]}_applyToolDeclarations(activeToolNames){this._promptDeclaresSessionTools=this._declaresSessionTools();let declaredNames=this._toolDeclarationNames(activeToolNames),declaresInactiveTools=declaredNames.length!==activeToolNames.length||declaredNames.some((name,index)=>name!==activeToolNames[index]);this.agent.state.declaredTools=declaresInactiveTools?declaredNames.flatMap(name=>this._toolRegistry.get(name)??[]):void 0,this._baseSystemPrompt=this._rebuildSystemPrompt(declaredNames),this.agent.state.systemPrompt=this._systemPromptOverride??this._baseSystemPrompt}_refreshToolDeclarationsForModel(){if(!this._declaresSessionTools()&&!this._promptDeclaresSessionTools)return;let declaredNames=this._toolDeclarationNames(this.getActiveToolNames());declaredNames.length===this._promptToolNames.length&&declaredNames.every((name,index)=>name===this._promptToolNames[index])||this._applyToolDeclarations(this.getActiveToolNames())}get isCompacting(){return this._compactionLifecycle.state.status==="running"||this._autoCompactionAbortController!==void 0||this._compactionAbortController!==void 0||this._branchSummaryAbortController!==void 0}get compactionState(){return this._compactionLifecycle.state}get messages(){return this._runtimeMessages()}get steeringMode(){return this.agent.steeringMode}get followUpMode(){return this.agent.followUpMode}get sessionFile(){return this.sessionManager.getSessionFile()}get sessionId(){return this.sessionManager.getSessionId()}onExtensionEvent(channel,handler){return this._resourceLoader.onExtensionEvent?.(channel,handler)??(()=>{})}emitExtensionEvent(channel,data){this._resourceLoader.emitExtensionEvent?.(channel,data)}setControlEndpointHost(host){this._controlEndpointHost=host}get sessionName(){return this.sessionManager.getSessionName()}get scopedModels(){return this._scopedModels}setScopedModels(scopedModels){this._scopedModels=scopedModels}get favoriteModels(){return this._getCurrentFavoriteModels()}setFavoriteModels(favoriteModels2){this._favoriteModels=favoriteModels2}_getCurrentFavoriteModels(){let availableById=new Map(this._modelRuntime.getAvailableSnapshot().map(model=>[`${model.provider}/${model.id}`,model])),narrowedModelIds=this._scopedModels.length>0?new Set(this._scopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`)):void 0,seenModelIds=new Set,favoriteModels2=[];for(let favorite of this._favoriteModels){let modelId=`${favorite.model.provider}/${favorite.model.id}`;if(seenModelIds.has(modelId))continue;let model=availableById.get(modelId);model&&(narrowedModelIds&&!narrowedModelIds.has(modelId)||(seenModelIds.add(modelId),favoriteModels2.push({model,thinkingLevel:favorite.thinkingLevel,thinkingSelection:favorite.thinkingSelection,serviceTier:favorite.serviceTier})))}return favoriteModels2}get promptTemplates(){return this._resourceLoader.getPrompts().prompts}_normalizePromptSnippet(text2){if(!text2)return;let oneLine3=text2.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim();return oneLine3.length>0?oneLine3:void 0}_normalizePromptGuidelines(guidelines){if(!guidelines||guidelines.length===0)return[];let unique3=new Set;for(let guideline of guidelines){let normalized2=guideline.trim();normalized2.length>0&&unique3.add(normalized2)}return Array.from(unique3)}_rebuildSystemPrompt(toolNames){let validToolNames=toolNames.filter(name=>this._toolRegistry.has(name));this._promptToolNames=validToolNames;let withheld=this._withheldEvalOnlyToolNames??new Set,contributingToolNames=[...validToolNames,...[...withheld].filter(name=>this._toolRegistry.has(name)&&!validToolNames.includes(name))],toolSnippets={},promptGuidelines=[];for(let name of contributingToolNames){let snippet=this._toolPromptSnippets.get(name);snippet&&(toolSnippets[name]=snippet);let toolGuidelines=this._toolPromptGuidelines.get(name);toolGuidelines&&promptGuidelines.push(...toolGuidelines)}let loadedSkills=this._resourceLoader.getSkills().skills,loadedContextFiles=this._resourceLoader.getAgentsFiles().agentsFiles,loaderSystemPrompt=this._resourceLoader.getSystemPrompt(),loaderAppendSystemPrompt=this._resourceLoader.getAppendSystemPrompt();this._baseSystemPromptOptions={cwd:this._cwd,skills:loadedSkills,contextFiles:loadedContextFiles,selectedTools:validToolNames,toolSnippets,promptGuidelines,surface:this._promptSurface??resolvePromptSurface(process.env),customPrompt:loaderSystemPrompt,appendSystemPrompt:loaderAppendSystemPrompt.length>0?loaderAppendSystemPrompt.join(`
2579
+ - Respond only as <title>Session Title</title>.`,LOW_SIGNAL_PROMPTS=new Set(["hi","hello","hey","yo","thanks","thank you","ok","okay","k","yes","no","yep","nope"]),TITLE_MAX_TOKENS=64,REASONING_TITLE_MAX_TOKENS=1024,MAX_TITLE_RETRIES=1,MAX_TITLE_RETRY_DELAY_MS=2e3;function sessionTitleRetryPolicy(settings){return{enabled:settings.enabled,maxRetries:Math.min(settings.maxRetries,MAX_TITLE_RETRIES),baseDelayMs:Math.min(settings.baseDelayMs,MAX_TITLE_RETRY_DELAY_MS)}}function shouldSkipSessionTitle(text2){let normalized2=text2.replace(/\s+/g," ").trim().toLowerCase();return normalized2.length===0||normalized2.startsWith("/")?!0:LOW_SIGNAL_PROMPTS.has(normalized2)}async function generateSessionTitle(options){if(shouldSkipSessionTitle(options.firstPrompt))return;let reasoning=initialTitleReasoning(options.model),response=await requestTitle(options,reasoning),retryReasoning=response.stopReason==="error"?mandatoryReasoningRetryLevel(options.model,reasoning,response.errorMessage):void 0;if(retryReasoning!==void 0&&(response=await requestTitle(options,retryReasoning)),response.stopReason==="error")throw new Error(humanizeProviderError(response.errorMessage??"Session title generation failed"));return parseSessionTitle(response)}function requestTitle(options,reasoning){return retryAssistantCall(()=>completeTitle(options.model,buildTitleContext(options.firstPrompt),buildTitleOptions(options,reasoning),options.streamFn),options.retry,options.signal)}function buildTitleContext(firstPrompt){return{systemPrompt:TITLE_SYSTEM_PROMPT,messages:[{role:"user",content:[{type:"text",text:firstPrompt}],timestamp:Date.now()}]}}function buildTitleOptions(options,reasoning){let titleOptions={...options.baseOptions,sessionId:options.sessionId,cacheRetention:options.model.cacheRetention==="none"?"none":"short",maxTokens:reasoning===void 0?TITLE_MAX_TOKENS:REASONING_TITLE_MAX_TOKENS};return reasoning!==void 0&&(titleOptions.reasoning=reasoning),options.auth.apiKey!==void 0&&(titleOptions.apiKey=options.auth.apiKey),options.auth.headers!==void 0&&(titleOptions.headers=options.auth.headers),options.auth.extraBody!==void 0&&(titleOptions.extraBody=options.auth.extraBody),options.auth.env!==void 0&&(titleOptions.env=options.auth.env),options.signal!==void 0&&(titleOptions.signal=options.signal),titleOptions}async function completeTitle(model,context,options,streamFn){return streamFn===void 0?completeSimple(model,context,options):(await streamFn(model,normalizeContext(context),options)).result()}function parseSessionTitle(message){let rawTitle=message.content.filter(part=>part.type==="text").map(part=>part.text).join("").trim().match(/<title>\s*([\s\S]*?)\s*<\/title>/i)?.[1];if(rawTitle===void 0)return;let title=sanitizeTitle(rawTitle);if(!(!title||title.toLowerCase()==="none"))return title}function humanizeProviderError(raw){let statusPrefix=raw.trim().match(/^(?:.*?\((\d{3})\)|(\d{3}))\s*:\s*(?=\{)/),status=statusPrefix?.[1]??statusPrefix?.[2],bodyText=statusPrefix?raw.trim().slice(statusPrefix[0].length):raw.trim();if(!bodyText.startsWith("{"))return raw;let parsed;try{parsed=JSON.parse(bodyText)}catch{return raw}let body=asRecord3(parsed);if(!body)return raw;let nested=asRecord3(body.error),message=asNonEmptyString(nested?.message)??asNonEmptyString(body.message)??asNonEmptyString(body.error);if(message===void 0)return raw;let details=[],errorType=asNonEmptyString(nested?.type)??asNonEmptyString(body.type);errorType&&errorType!=="error"&&details.push(errorType),status&&details.push(`HTTP ${status}`);let requestId=asNonEmptyString(body.request_id);return requestId&&details.push(`request ${requestId}`),details.length>0?`${message} (${details.join(", ")})`:message}function asRecord3(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)?value2:void 0}function asNonEmptyString(value2){return typeof value2=="string"&&value2.length>0?value2:void 0}function sanitizeTitle(text2){return text2.replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g,"").replace(/\u001b\[[0-?]*[ -/]*[@-~]/g,"").replace(/\u001b[\u0020-\u002f]*[\u0030-\u007e]/g,"").replace(/[\r\n]+/g," ").replace(/[\u0000-\u001f\u007f-\u009f]+/g," ").replace(/\s+/g," ").replace(/^["'`]+|["'`.!?]+$/g,"").trim().slice(0,80).trim()}function yieldToEventLoop(){return new Promise(resolve46=>{let channel=new MessageChannel;channel.port1.onmessage=()=>{channel.port1.close(),channel.port2.close(),resolve46()},channel.port2.postMessage(void 0)})}var SessionWorkBarrier=class{constructor(){this.activeWork=void 0,this.activeWorkResolve=void 0,this.activeWorkDepth=0}get hasActiveWork(){return this.activeWork!==void 0}begin(){if(!this.activeWork){let resolveWork;if(this.activeWork=new Promise(resolve46=>{resolveWork=resolve46}),!resolveWork)throw new Error("Session work resolver was not initialized");this.activeWorkResolve=resolveWork}this.activeWorkDepth++;let finished=!1;return()=>{if(finished||(finished=!0,this.activeWorkDepth=Math.max(0,this.activeWorkDepth-1),this.activeWorkDepth>0))return;let resolveWork=this.activeWorkResolve;this.activeWork=void 0,this.activeWorkResolve=void 0,resolveWork?.()}}async waitForSettled(getEventQueue){for(let round=0;;round++){let eventQueue=getEventQueue(),work=this.activeWork;if(await eventQueue,work&&await work,getEventQueue()===eventQueue&&!this.activeWork)return;round>=16&&await yieldToEventLoop()}}};function streamedToolCallName(event){let update=event.assistantMessageEvent;if(update.type==="toolcall_end")return update.toolCall.name;if(update.type!=="toolcall_start")return;let block=update.partial.content[update.contentIndex];return block?.type==="toolCall"&&block.name.length>0?block.name:void 0}function withResolvedToolName(event,resolve46){let requested=streamedToolCallName(event);return requested===void 0?event:{...event,resolvedToolName:resolve46(requested)}}var TranscriptWriteFailures=class{constructor(){this.reported=!1,this.refused=new Set}startRun(){this.runFailure=void 0,this.reported=!1}record(message,error2){this.refused.add(message),this.runFailure??={error:error2}}takeReport(){if(!(this.reported||!this.runFailure))return this.reported=!0,this.runFailure}takeRefusedOut(messages){if(this.refused.size===0)return;let refused=this.refused,kept=messages.filter(message=>!refused.has(message));return refused.clear(),kept.length===messages.length?void 0:kept}};var EVAL_ONLY_TOOL_NAMES=new Set(["workflow","monitor"]);function evalHelperCall(name){return name==="bash"||name==="powershell"?`tool.${name}({ command: "..." })`:name==="grep"?'tool.grep({ pattern: "...", path: "..." })':name==="workflow"?`tool.${name}({ action: "..." })`:name==="monitor"?'tool.monitor({ description: "...", command: "...", filter: "..." })':`tool.${name}({ ... })`}var TURN_RETRY_SUPPRESSION_PREFIX3="senpi:no-turn-retry:",OVERFLOW_RECOVERY_RUNGS=2,OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE="Context overflow recovery failed after two compact-and-retry attempts. Try reducing context or switching to a larger-context model.",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet;function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var RequiredCompactionError=class extends Error{constructor(){super("Context remains above the compaction threshold because compaction did not complete"),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens2(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms`+(streamStartTimeoutMs===void 0?" (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)":` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._messageEndPersistence=new WeakMap,this._isAgentRunActive=!1,this._toolExecutionDepth=0,this._toolContextDisposers=new Set,this._promptStartPending=!1,this._nextInputId=0,this._settlementEpoch=0,this._runtimeMessagesTokenized=!1,this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._nextQueuedInputOrder=0,this._supersededCompactionLogAttemptIds=new Set,this._pendingNextTurnMessages=[],this._pendingCustomMessages=[],this.externalAdmission=new ExternalAdmission({isBusy:()=>this._isAgentRunActive||this._promptStartPending,enqueue:(message,lane)=>lane==="steer"?this.agent.steer(message):this.agent.followUp(message),start:message=>this.sendCustomMessage(message,{triggerTurn:!0}).catch(error2=>{this._sessionLogger.warn("external_delivery_start_failed",{error:error2 instanceof Error?error2.message:String(error2)})})}),this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._compactionAbortController=void 0,this._autoCompactionAbortController=void 0,this._pendingCompactionAdmission=void 0,this._compactionLifecycle=new CompactionLifecycleCoordinator,this._sessionWorkBarrier=new SessionWorkBarrier,this._wakeSources=new WakeSourceTracker,this._overflowRecoveryRungs=0,this._compactionSkippedTooSmall=!1,this._transcriptWriteFailures=new TranscriptWriteFailures,this._promptOwnsRun=!1,this._skipNextPostRetryCompactionCheck=!1,this._skipNextPostCompactionAssistantCheck=!1,this._scheduledContinuationRecompacted=!1,this._assistantsPendingAtCompaction=new WeakSet,this._postCompactionUsageExemptAssistants=new WeakSet,this._messageRevision=0,this._branchSummaryAbortController=void 0,this._sessionTitleAbortController=void 0,this._sessionTitlePromise=void 0,this._retryAbortController=void 0,this._retryAttempt=0,this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0,this._retryPromise=void 0,this._retryResolve=void 0,this._userAbortPromise=void 0,this._abortProvenance=new AgentAbortProvenance,this._agentSettledDelivery=new AgentSettledDelivery,this._suppressQueuedContinuationAfterUserAbort=!1,this._userAbortGeneration=0,this._hadClearedQueuedMessages=!1,this._extensionEventSignal=void 0,this._bashAbortControllers=new Set,this._pendingBashMessages=[],this._turnIndex=0,this._entryIdsByMessage=new WeakMap,this._boundaryDispatchedMessages=new WeakSet,this._boundaryRefreshedTurns=new WeakSet,this._lastActivityOutcome="completed",this._isBeforeSettle=!1,this._abortDuringBeforeSettle=!1,this._baseToolDefinitions=new Map,this._usesDefaultTools=!1,this._withheldEvalOnlyToolNames=new Set,this._publishedEvalOnlyHintNames=new Set,this._declaredToolNames=[],this._promptToolNames=[],this._promptDeclaresSessionTools=!1,this._sessionStartSettled=Promise.resolve(),this._promptCachePrefixBuilds=new PromptCachePrefixBuilds,this._extensionMode="print",this._probeBackLaneSeq=0,this._toolRegistry=new Map,this._lazyToolActivation=new LazyToolActivation({getToolDefinition:name=>this.getToolDefinition(name),getActiveTools:()=>this.getActiveToolNames(),setActiveTools:names=>this.setActiveToolsByName(names)}),this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(this._nestedToolCalls)if(event.type==="message_start"&&event.message.role==="toolResult"){let message=event.message,summary=this._nestedToolCalls.takeRecord(message.toolCallId);summary?.calls&&(message.nestedCalls=summary.calls),summary?.usage&&(message.usage=message.usage?combineUsage(message.usage,summary.usage):summary.usage)}else event.type==="agent_end"&&this._nestedToolCalls.clear();if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);(lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)||this._willRetryAfterAgentEnd(event.messages))&&this.agent.suppressQueuedMessageDrain(),this._extensionRunner.hasHandlers("agent_before_settle")&&this.agent.suppressQueuedMessageDrain()}this._createRetryPromiseForAgentEnd(event),event.type==="message_end"&&event.message.role==="assistant"&&this._emitServerFallbackAborted(event.message);let pendingMessage=event.type==="message_end"?event.message:void 0;pendingMessage!==void 0&&this._messageEndsAwaitingPersistence.add(pendingMessage);let processing=this._agentEventQueue.then(()=>this._processAgentEvent(event,signal),()=>this._processAgentEvent(event,signal));this._agentEventQueue=pendingMessage!==void 0?processing.finally(()=>{this._messageEndsAwaitingPersistence.delete(pendingMessage)}):processing;let settled=this._agentEventQueue.catch(()=>{});pendingMessage!==void 0&&this._messageEndPersistence.set(pendingMessage,settled)},this._promptSurface=config.promptSurface,this.agent=config.agent,this.sessionManager=config.sessionManager,this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source2=>{this._emit({type:"settings_source_selected",...source2})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._fallbackNow=config.fallbackNow??monotonicNow,this._selectorCooldowns=new SelectorCooldowns(this._fallbackNow);let lease=()=>this._fallbackCircuitsLease;this._fallbackCircuits=createFallbackCircuitAccess({get breaker(){return lease().breaker},owner:()=>this.sessionId,now:this._fallbackNow,settings:()=>this.settingsManager.getFallbackCircuitSettings(),logger:fallbackLogger}),this._retryRandom=config.retryRandom??Math.random,this._environmentContextEnabled=config.environmentContext??!0,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,circuits:this._fallbackCircuits,logger:fallbackLogger,switchModel:async(model,thinking,reason)=>{await this._switchActiveModel(model,{persistDefault:!1,appendSessionEntry:!0,entryReason:reason,emitModelSelect:!0,modelSelectSource:reason,invalidateCompaction:!0,ephemeralThinkingLevel:thinking,allowDeferral:!1,repairWithSlice:!0})},emit:event=>this._emit(event),getCurrentSelector:()=>this.model?{model:this.model,thinkingLevel:this.thinkingLevel}:void 0,isAuthAvailable:provider=>this._modelRuntime.hasConfiguredAuth(provider)}),this._probeBackScheduler=new ProbeBackScheduler({now:this._fallbackNow}),this._extensionRunnerRef=config.extensionRunnerRef,this._initialActiveToolNames=config.initialActiveToolNames,this._defaultToolNames=config.defaultToolNames?new Set(config.defaultToolNames):void 0,this._usesDefaultTools=config.usesDefaultTools??!1,this._evalOnlyToolNamesOverride=config.evalOnlyToolNames?new Set(config.evalOnlyToolNames):void 0,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._sessionStartEvent=config.sessionStartEvent??{type:"session_start",reason:"startup"},this._autoTitleSessions=config.autoTitleSessions??!1;let initialModel=this.agent.state.model;if(initialModel){let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,initialModel));this._currentServiceTier=this._resolveServiceTier(initialModel,config.serviceTier??scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._installAgentRequestProjection(),this._installAgentBoundaryHooks();try{this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0}),this._fallbackCircuitsLease=acquireFallbackCircuits(this._agentDir)}catch(error2){throw this._releaseToolSearchService("session construction failed"),error2}}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model,signal){let result3;try{result3=await this._modelRuntime.getAuth(model,{signal})}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result3&&(result3.auth.apiKey||result3.auth.headers))return{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,env:result3.env};throw this._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async _getSummarizationRequestAuth(selectedModel,signal){let{model,thinkingLevel}=isVirtualModel(selectedModel)?await this._modelRuntime.resolveModel(selectedModel,convertToLlm2(this.messages),{reason:"direct",thinkingLevel:this.thinkingLevel,signal}):{model:selectedModel,thinkingLevel:this.thinkingLevel};if(this.agent.streamFunction===streamSimple)return{...await this._getRequiredRequestAuth(model,signal),thinkingLevel};try{let storedResult=await this._modelRuntime.getAuth(model,{signal}),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey,signal}):storedResult;return result3?{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),env:result3.env,thinkingLevel}:{model,thinkingLevel}}catch(error2){if(signal?.aborted)throw error2;return{model,thinkingLevel}}}_resolveCompactionModel(sessionModel){let override=this._getCompactionSettings().model;if(!override)return sessionModel;let slash=override.indexOf("/");if(slash<=0||slash===override.length-1)return sessionModel;let provider=override.slice(0,slash),modelId=override.slice(slash+1);return this._modelRuntime.getModel(provider,modelId)??sessionModel}async _getCompactionRequestAuth(model){return{...await this._getSummarizationRequestAuth(model),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody}}_modelForMessage(message){let model=this.model;return model&&isVirtualModel(model)?this._modelRuntime.getPhysicalModel(message.provider,message.model):model?.provider===message.provider&&model.id===message.model?model:void 0}_recordSelection(){let model=this.model;if(!model)return;let getModel=(provider,modelId)=>this._modelRuntime.getModel(provider,modelId),recorded=getBranchSelection(this.sessionManager.getBranch(),getModel);if(!recorded||recorded.provider===model.provider&&recorded.modelId===model.id)return;let recordedModel=getModel(recorded.provider,recorded.modelId);!isVirtualModel(model)&&!(recordedModel&&isVirtualModel(recordedModel))||this.sessionManager.appendModelChange(model.provider,model.id)}_limitsModel(){return this.routedModel?.model??this.model}_emitServerFallbackAborted(message){let details=message.diagnostics?.find(entry=>entry.type===SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;details!==void 0&&this._emit({type:"server_fallback_aborted",from:typeof details.from=="string"?details.from:message.model,to:typeof details.to=="string"?details.to:message.model,chainConfigured:this._retryFallback.hasConfiguredChain()})}_adoptToolSearchService(extensionLoad){let next=adoptToolSearchServiceForSession(extensionLoad);this._toolSearchService!==next&&this._toolSearchService?.dispose(this.sessionId,"replaced by a reload"),this._toolSearchService=next}_releaseToolSearchService(reason){this._toolSearchService?.dispose(this.sessionId,reason),this._toolSearchService=void 0}_bindToolSearchRemovedHints(){this._toolSearchService?.bindRemovedToolHints(()=>this.agent.removedToolHints)}_installAgentToolHooks(){this.agent.resolveUnknownToolCall=toolName=>{let resolvedName=resolveToolNameAlias(toolName,this._callableToolNames());if(!(resolvedName===void 0||!this._activateLazyTool(resolvedName)))return this.agent.state.tools.find(tool=>tool.name===resolvedName)},this._bindToolSearchRemovedHints(),this.agent.beforeToolCall=async({toolCall,args})=>{this._toolExecutionDepth++;try{let result3=await this.preflightToolCall(toolCall,args);return result3?.block&&this._toolExecutionDepth--,result3}catch(err2){throw this._toolExecutionDepth--,err2}},this.agent.afterToolCall=async({toolCall,args,result:result3,isError})=>{try{return await this._emitAfterToolCallHooks(toolCall,args,result3,isError)}finally{this._toolExecutionDepth--}}}async preflightToolCall(toolCall,args,options={}){options.waitForEventQueue!==!1&&await this._agentEventQueue;let runner=this._extensionRunner;if(runner.hasHandlers("tool_call"))try{return await runner.emitToolCall({type:"tool_call",toolName:toolCall.name,toolCallId:toolCall.id,...options.parentToolCallId?{parentToolCallId:options.parentToolCallId}:{},input:args})}catch(err2){throw err2 instanceof Error?err2:new Error(`Extension failed, blocking execution: ${String(err2)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError,parentToolCallId){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,...parentToolCallId?{parentToolCallId}:{},input:args,content:result3.content,details:result3.details,...result3.structuredContent===void 0?{}:{structuredContent:result3.structuredContent},isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],resizeOptions=this._limitsModel()?.inputLimits?.images?.resize,normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize(),...resizeOptions?{resizeOptions}:{}});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,structuredContent:hookResult?hookResult.structuredContent:result3.structuredContent,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_getCallableTools(active=new Set(this.getActiveToolNames())){return[...this._toolRegistry.values()].filter(tool=>{let exposure=this._getToolExposure(tool.name);return exposure==="search"||exposure==="eval"||exposure==="direct"&&active.has(tool.name)})}async _executeNestedToolCall(parentToolCallId,name,args,options){return this._nestedToolCalls??=new NestedToolCallRunner({getTools:()=>this._getCallableTools(),isSequential:()=>this.agent.toolExecution==="sequential",runToolCall:(toolCall,parentId,signal,onUpdate)=>{let assistantMessage=this._findLastAssistantMessage();return assistantMessage?runToolCall(toolCall,{tools:this._getCallableTools(),assistantMessage,context:{messages:this.agent.state.messages,tools:this.agent.state.tools},beforeToolCall:({toolCall:call,args:callArgs})=>this.preflightToolCall(call,callArgs,{waitForEventQueue:!1,parentToolCallId:parentId}),afterToolCall:({toolCall:call,args:callArgs,result:result3,isError})=>this._emitAfterToolCallHooks(call,callArgs,result3,isError,parentId),signal,onUpdate}):Promise.resolve({toolCall,result:{content:[{type:"text",text:"No assistant message issued this call"}],details:{}},isError:!0})},emit:async event=>{await this._extensionRunner.emit(event),this._emit(event)}}),this._nestedToolCalls.execute(parentToolCallId,name,args,options)}_installAgentRequestProjection(){let previousPrepareRequest=this.agent.prepareRequest;this.agent.prepareRequest=async(request2,signal)=>{let failed=this._failedResponse;this._failedResponse=void 0;let previous=await previousPrepareRequest?.(request2,signal)??void 0,model=previous?.model??this.agent.state.model,thinkingLevel=previous?.thinkingLevel??this.agent.state.thinkingLevel;if(!isVirtualModel(model))return request2.model===model?previous:{...previous,model,thinkingLevel};let context=previous?.context??request2.context,lastResponse=context.messages.findLastIndex(message=>message.role==="assistant"),userTurn=context.messages.slice(lastResponse+1).some(message=>message.role==="user"),state=getVirtualModelState(this.sessionManager.getBranch(),model.provider,model.id),route=await this._modelRuntime.resolveModel(model,convertToLlm2(context.messages),{reason:failed?"retry":userTurn?"user":"continuation",thinkingLevel,signal,failed,state});if(route.state!==void 0&&route.state!==state){let data={provider:model.provider,modelId:model.id,state:route.state};this._emitEntryAppended(this.sessionManager.appendCustomEntry(VIRTUAL_MODEL_STATE_ENTRY,data))}return{...previous,context,model:route.model,thinkingLevel:route.thinkingLevel}}}async _dispatchTurnEndBoundary(message,toolResults){this._lastActivityOutcome=message.stopReason==="aborted"?"aborted":message.stopReason==="error"?"error":"completed";let messageEntryId=this._findPersistedMessageEntryId(message);if(!this._extensionRunner.hasHandlers("turn_end"))return!1;if(!messageEntryId)return this._extensionRunner.emitError({extensionPath:"<boundary>",event:"turn_end",error:"turn_end could not resolve the persisted assistant entry ID"}),!1;let toolResultEntryIds=toolResults.flatMap(result3=>{let entryId=this._findPersistedMessageEntryId(result3);return entryId?[entryId]:[]}),boundary=await this._extensionRunner.emitBoundary({type:"turn_end",turnIndex:this._turnIndex,message,toolResults,messageEntryId,toolResultEntryIds,outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"turn_end"));return this._commitBoundaryDrafts(boundary.entries),boundary.entries.length>0&&this._boundaryRefreshedTurns.add(message),boundary.continue&&!this._buildBoundaryContext([],"turn_end").canContinue?(this._reportInvalidBoundaryContinuation("turn_end"),!1):boundary.continue}_installAgentBoundaryHooks(){let previousFinishTurn=this.agent.finishTurn;this.agent.finishTurn=async(turn,signal)=>{this._boundaryDispatchedMessages.add(turn.message),await Promise.all([turn.message,...turn.toolResults].map(message=>this._messageEndPersistence.get(message)));let extensionContinue=await this._dispatchTurnEndBoundary(turn.message,turn.toolResults),previousDecision=await previousFinishTurn?.(turn,signal);if(previousDecision?.action==="end")return previousDecision;if(extensionContinue||previousDecision?.action==="continue")return{action:"continue"}}}_applyObservedCursorContextWindow(model){let observed=getCursorContextLimit2(model.id);if(observed===void 0||observed<=0||observed===model.contextWindow)return;let previous=model.contextWindow;model.contextWindow=observed,this._sessionLogger.info("cursor_context_window_observed",{modelId:model.id,previous,observed})}_installAgentNextTurnRefresh(){let previousPrepareNextTurnWithContext=this.agent.prepareNextTurnWithContext??(this.agent.prepareNextTurn?async(_turn,signal)=>await this.agent.prepareNextTurn?.(signal):void 0),previousTransformContext=this.agent.transformContext;this.agent.transformContext=async(messages,signal)=>{this.sessionManager.getResidentStore().materializeInPlace(messages);let transformed=previousTransformContext?await previousTransformContext(messages,signal):messages,model=this.model;if(model?.provider!=="cursor"&&model?.provider!=="cursor-cli-oauth")return transformed;this._applyObservedCursorContextWindow(model);let budgetBytes=cursorAdmissionBudgetBytes(model.contextWindow),admission=admitCursorHistory({messages:transformed,budgetBytes,convert:candidate=>this.agent.convertToLlm(candidate)});return admission.blankedToolResults>0&&this._sessionLogger.info("cursor_admission_truncated",{blankedToolResults:admission.blankedToolResults,bytesBefore:admission.bytesBefore,bytesAfter:admission.bytesAfter,budgetBytes}),admission.overBudget&&this._sessionLogger.warn("cursor_admission_over_budget",{bytes:admission.bytesAfter,budgetBytes}),admission.messages??transformed},this.agent.prepareNextTurnWithContext=async(turn,signal)=>{this._runtimeMessages();let compactBeforeNextAdmission=async()=>{let provider=this.model?.provider;if(provider==="cursor"||provider==="cursor-cli-oauth"||turn.toolResults.length===0&&!this.agent.hasQueuedMessages()||(await this._agentEventQueue,turn.toolResults.length===0&&!this.agent.hasQueuedMessages()))return!1;try{return await this._enforceCompactionBeforeProvider(turn.message,!0,"threshold")}catch(error2){throw error2 instanceof RequiredCompactionError&&(this._requiredCompactionTurnError=error2,this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=error2)),error2}},compactedBeforeCallback=await compactBeforeNextAdmission(),boundaryRefreshed=this._boundaryRefreshedTurns.delete(turn.message),messages=compactedBeforeCallback||boundaryRefreshed?this.agent.state.messages.slice():turn.context.messages,postCompactionTurn={...turn,context:{...turn.context,messages}},previousSnapshot=await previousPrepareNextTurnWithContext?.(postCompactionTurn,signal),previousContext=previousSnapshot?.context??postCompactionTurn.context,compactedAfterCallback=!1;if(compactedBeforeCallback||(compactedAfterCallback=await compactBeforeNextAdmission()),compactedAfterCallback){let postLateCompactionTurn={...turn,context:{...turn.context,messages:this.agent.state.messages.slice()}},postLateCompactionSnapshot=await previousPrepareNextTurnWithContext?.(postLateCompactionTurn,signal);previousSnapshot={...previousSnapshot,...postLateCompactionSnapshot,context:postLateCompactionSnapshot?.context??postLateCompactionTurn.context},previousContext=previousSnapshot.context??postLateCompactionTurn.context}return this._refreshToolDeclarationsForModel(),{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice(),declaredTools:this.agent.state.declaredTools?.slice()},model:this.agent.state.model,thinkingLevel:this.agent.state.thinkingLevel,thinkingSelection:this.agent.state.thinkingSelection??null,abortServerSideFallback:this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain()}}}_refreshFinalizedContext(){let projection=this.sessionManager.buildSessionProjection();for(let entry of projection.entries)for(let message of entry.messages)this._entryIdsByMessage.set(message,entry.sourceEntry.id);this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()}_applyBoundaryDrafts(manager,drafts){let appended=[];for(let draft of drafts){let entryId;switch(draft.type){case"custom":entryId=manager.appendCustomEntry(draft.customType,draft.data);break;case"custom_message":entryId=manager.appendCustomMessageEntry(draft.customType,draft.content,draft.display,draft.details);break;case"context_edit":entryId=manager.appendContextEdit(draft.targetId,draft.replacement);break;case"compaction":{let tokensBefore=estimateProjectedContextTokens(manager.buildSessionProjection(),manager.getBranch()).tokens;entryId=manager.appendCompaction(draft.summary,draft.firstKeptEntryId,tokensBefore,draft.details,!0,draft.usage);break}}let entry=manager.getEntry(entryId);entry&&appended.push(entry)}return appended}_createBoundaryPreviewManager(drafts){let header2=this.sessionManager.getHeader();if(!header2)throw new Error("Session header is missing");let manager=SessionManager.inMemory(this._cwd,void 0,[header2,...this.sessionManager.getBranch()]);return this._applyBoundaryDrafts(manager,drafts),manager}_getPendingBoundaryMessages(){return[...this.agent.peekQueuedMessages(),...this._pendingCustomMessages]}_buildBoundaryContext(drafts,boundary){let projection=drafts.length===0?this.sessionManager.buildSessionProjection():this._createBoundaryPreviewManager(drafts).buildSessionProjection(),pendingMessages=this._getPendingBoundaryMessages(),llmMessages=convertToLlm2(projection.messages),finalRole=llmMessages[llmMessages.length-1]?.role,contextCanContinue=llmMessages.some(message=>message.role!=="system")&&finalRole!=="assistant",pendingCustomContext=this._pendingCustomMessages.length>0;return{contextEntries:projection.entries,contextMessages:projection.messages,llmMessages,pendingMessages,canContinue:contextCanContinue||pendingCustomContext||(boundary==="turn_end"?this.agent.hasQueuedMessages():finalRole==="assistant"&&this.agent.hasQueuedMessages())}}_commitBoundaryDrafts(drafts){if(drafts.length===0)return;let appended=this._applyBoundaryDrafts(this.sessionManager,drafts);this._refreshFinalizedContext();for(let entry of appended)this._emitEntryAppended(entry.id)}async _runBeforeSettleBoundary(heldQueue=!1){if(!this._extensionRunner.hasHandlers("agent_before_settle"))return!heldQueue&&this.agent.hasQueuedMessages();this._isBeforeSettle=!0,this._abortDuringBeforeSettle=!1;try{let result3=await this._extensionRunner.emitBoundary({type:"agent_before_settle",outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"agent_before_settle"));this._commitBoundaryDrafts(result3.entries),this._flushPendingCustomMessages();let finalContext=this._buildBoundaryContext([],"agent_before_settle");if(this._abortDuringBeforeSettle)return!1;let shouldContinue=result3.continue||!heldQueue&&this.agent.hasQueuedMessages();return shouldContinue&&!finalContext.canContinue?(result3.continue&&this._reportInvalidBoundaryContinuation("agent_before_settle"),!1):shouldContinue}finally{this._isBeforeSettle=!1}}_reportInvalidBoundaryContinuation(event){this._extensionRunner.emitError({extensionPath:"<boundary>",event,error:`${event} requested continuation without runnable model context`})}_emitEntryAppended(entryId){if(this._extensionMode!=="rpc")return;let entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})}appendSessionEntry(entry){this.sessionManager.appendEntry(entry),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._emitEntryAppended(entry.id)}_emit(event){this._logSessionEvent(event);for(let l of[...this._eventListeners])l(event)}async _emitSessionCompactFailed(event){this._extensionRunner.hasHandlers("session_compact_failed")&&await this._extensionRunner.emit({type:"session_compact_failed",...event})}_logSessionEvent(event){if(event.type==="compaction_start"){let previousAttempt=this._activeCompactionLogAttempt;if(previousAttempt){let tokensAfter=this._estimateCompactionLogTokens("persisted");this._sessionLogger.info("compaction_decision",{attemptId:previousAttempt.id,reason:previousAttempt.reason,mode:previousAttempt.reason==="manual"?"manual":"auto",action:"compact",disposition:"superseded",accepted:!1,skipped:!0,aborted:!0,willRetry:!1,tokensBefore:previousAttempt.tokensBefore,tokensAfter}),this._supersededCompactionLogAttemptIds.add(previousAttempt.id)}let attempt2={id:event.requestId??randomUUID15(),reason:event.reason,tokensBefore:this._estimateCompactionLogTokens("persisted")};this._activeCompactionLogAttempt=attempt2,this._sessionLogger.info("compaction_start",{attemptId:attempt2.id,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:"compact",tokensBefore:attempt2.tokensBefore});return}if(event.type==="compaction_end"){if(event.requestId&&this._supersededCompactionLogAttemptIds.delete(event.requestId))return;let activeAttempt=this._activeCompactionLogAttempt,attempt2=event.requestId!==void 0&&activeAttempt?.id===event.requestId?activeAttempt:void 0,accepted=event.accepted??event.result!==void 0,rejected=event.rejectionCause!==void 0,skipped2=!accepted&&(attempt2===void 0||!rejected&&!event.aborted&&!event.errorMessage),disposition=accepted?"committed":attempt2===void 0?"skipped":rejected?"rejected":event.aborted?"aborted":event.errorMessage?"failed":"skipped",tokensAfter=this._estimateCompactionLogTokens(accepted?"active":"persisted");this._sessionLogger.info("compaction_decision",{attemptId:attempt2?.id??event.requestId,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:accepted||attempt2?"compact":"none",disposition,accepted,skipped:skipped2,aborted:event.aborted,willRetry:event.willRetry,rejectionCause:event.rejectionCause,error:event.errorMessage,tokensBefore:attempt2?.tokensBefore??tokensAfter,tokensAfter}),attempt2&&(this._activeCompactionLogAttempt=void 0);return}if(event.type==="message_end"&&event.message.role==="assistant"){let message=event.message;if(message.stopReason!=="error")return;let kind=isProviderStreamStallError(message)?"stall":isProviderTimeoutError(message)?"timeout":"error";this._sessionLogger.warn("provider_error",{kind,error:message.errorMessage})}}_estimateCompactionLogTokens(source2){try{let messages=source2==="active"?this._runtimeMessages():this.sessionManager.buildSessionContext().messages;return estimateMessagesTokens2(messages)}catch{return}}_createToolContext(signal){let context=this._extensionRunner.createContext(),controller=new AbortController,cancellation=signal??context.signal,unsubscribe=this.subscribe(event=>{event.type==="queue_update"&&event.steering.length>0&&controller.abort()}),dispose=()=>{unsubscribe(),cancellation?.removeEventListener("abort",dispose),this._toolContextDisposers.delete(dispose)};return this._toolContextDisposers.add(dispose),cancellation?.addEventListener("abort",dispose,{once:!0}),cancellation?.aborted?dispose():this._steeringMessages.length>0&&controller.abort(),Object.defineProperty(context,"steeringSignal",{value:controller.signal,enumerable:!0}),{context,dispose}}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages],ordered:[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder)})}_incrementMessageRevision(){this._messageRevision++,this._releaseBlockedPostCompactionAdmissionIfReduced()}_runtimeMessages(){return this._runtimeMessagesTokenized&&(this._runtimeMessagesTokenized=!1,this.sessionManager.getResidentStore().materializeInPlace(this.agent.state.messages)),this.agent.state.messages}_blockedAdmissionContentTokens(){return estimateMessagesTokens2(this._runtimeMessages())}_releaseBlockedPostCompactionAdmissionIfReduced(){let blocked=this._blockedPostCompactionAssistant;blocked!==void 0&&this._blockedAdmissionContentTokens()<blocked.contentTokens&&(this._blockedPostCompactionAssistant=void 0)}_releaseBlockedPostCompactionAdmission(){this._blockedPostCompactionAssistant=void 0}getMessageRevision(){return this._messageRevision}get agentDir(){return this._agentDir}get cwd(){return this._cwd}async _waitForSettledSessionWork(){await this._sessionWorkBarrier.waitForSettled(()=>this._agentEventQueue)}async waitForSettledSessionWork(){await this._waitForSettledSessionWork();let titlePromise=this._sessionTitlePromise;titlePromise!==void 0&&await titlePromise,await this._waitForSettledSessionWork()}_modelSelectionChangesContext(previousModel,nextModel){return!modelsAreEqual(previousModel,nextModel)||previousModel?.contextWindow!==nextModel.contextWindow?!0:previousModel?.api!==nextModel.api}_invalidateCompactionForModelSelection(){this.abortCompaction(),this.abortBranchSummary(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision()}_modelChangeWouldExhaustContext(model){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings(),projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:this._getDownswitchLiveContextTokens(model),compaction,includeSpeculationLead:!1,admission:this._modelSwitchAdmission()});if(!projection.usable&&!(compaction.enabled&&projection.verdict==="fits-after-compaction"))return projection}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve46=>{this._resolveIdleWait=resolve46})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve46=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve46()}async _emitAgentSettled(){if(this.agent.state.isStreaming&&await this.agent.waitForIdle(),!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1,this.externalAdmission.observeRunSettled();let deferredActions=[],deferredTurnClaims=[];this._agentSettledDelivery.begin(this._userAbortGeneration);let settlementEpoch=++this._settlementEpoch;try{await this._extensionRunner.emit({type:"agent_settled"}),this._emit({type:"agent_settled"}),this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),{actions:deferredActions,turnClaims:deferredTurnClaims}=this._agentSettledDelivery.finish(this._userAbortGeneration)}finally{this._agentSettledDelivery.cancel(),this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle()}for(let action of deferredActions)action();queueMicrotask(()=>{this._emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims)})}releaseSettledSessionMemory(){this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.sessionManager.holdsMaterializedHistory()&&this.sessionManager.dropMaterializedCaches(),(this.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0))}async _emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims){let dispositions=await Promise.all(deferredTurnClaims.map(claim=>claim.disposition));dispositions.includes("started")||((dispositions.includes("delegated")||this._sessionWorkBarrier.hasActiveWork)&&await this._waitForSettledSessionWork(),settlementEpoch===this._settlementEpoch&&(this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.releaseSettledSessionMemory(),this._emit({type:"agent_idle"}))))}async _promptAgent(messages,deferredTurnClaim,onQueuedInput){if(deferredTurnClaim?.resolve("started"),this._isAgentRunActive||this.externalAdmission.beginTurn(),this._isAgentRunActive=!0,this._failedResponse=void 0,this._recordSelection(),this._requiredCompactionAdmissionError=void 0,this._transcriptWriteFailures.startRun(),this._promptOwnsRun=!0,!this.agent.state.isStreaming){let withoutRefused=this._transcriptWriteFailures.takeRefusedOut(this.agent.state.messages);withoutRefused&&(this.agent.state.messages=withoutRefused,this._incrementMessageRevision())}this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue,this._promptOwnsRun=!1;let requiredCompactionError=this._requiredCompactionAdmissionError;this._requiredCompactionAdmissionError=void 0;let transcriptWriteFailure=this._transcriptWriteFailures.takeReport();if(requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError;if(transcriptWriteFailure)throw transcriptWriteFailure.error}catch(error2){if(this._promptOwnsRun=!1,error2 instanceof Error&&error2.message==="Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion."){let queuedMessages=Array.isArray(messages)?messages:[messages],userMessage2=queuedMessages.find(message=>message.role==="user"),prepared=userMessage2?.role==="user"?{...readClientMessageIdentity(userMessage2),text:this._extractUserMessageText(userMessage2.content),images:typeof userMessage2.content=="string"?void 0:userMessage2.content.filter(part=>part.type==="image"),mode:"steer",enqueueOrder:this.reserveQueuedInputOrder()}:void 0;prepared&&onQueuedInput?.(prepared);for(let message of queuedMessages)this.agent.steer(message);prepared&&(this._steeringMessages.push(prepared.text),this._recordQueuedInput(prepared.text,"steer",prepared),this._emitQueueUpdate());return}throw await this._emitAgentSettled(),error2}}_extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text").map(part=>part.text).join("")}_createRetryPromiseForAgentEnd(event){if(event.type!=="agent_end"||this._retryPromise||!this.settingsManager.getRetrySettings().enabled)return;let lastAssistant=this._findLastAssistantInMessages(event.messages);!lastAssistant||!this._isRetryableError(lastAssistant)&&!this._isHardErrorFallbackEligible(lastAssistant)&&!isCursorZeroTokenResourceExhausted(lastAssistant)&&!isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0)||(this._retryPromise=new Promise(resolve46=>{this._retryResolve=resolve46}),this.agent.suppressQueuedMessageDrain())}_findLastAssistantInMessages(messages){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.role==="assistant")return message}}_getRequiredAutoCompactionReason(message){let reason=this._getAutoCompactionReason(message);if(reason==="overflow"&&message.stopReason==="stop"&&this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(reason==="overflow")return reason;if(this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(!(reason==="threshold"&&(this._skipNextPostRetryCompactionCheck||this._postCompactionUsageExemptAssistants.has(message))))return reason}_resolveThresholdContextTokens(directContextTokens){let messages=this._runtimeMessages();return resolveThresholdContextTokens(directContextTokens,estimateMessagesTokens2(messages))}_getAutoCompactionReason(message){let settings=this._getCompactionSettings();if(message.stopReason==="aborted")return;let model=this.model;if(!model||this._isAssistantFromBeforeLatestCompaction(message)&&!this._exceedsPolicyByContentEstimate())return;let sameModel=isSameOverflowSource(message,model,this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId),contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings);if(isContextOverflow(message,model.contextWindow)&&(sameModel||currentContextNeedsCompaction)||this._isCursorPayloadOverflow(message))return settings.enabled||isTurnStuckOnContextOverflow(message,model.contextWindow)?"overflow":void 0;if(!settings.enabled)return;let contextTokens,directContextTokens=message.usage?calculateContextTokens2(message.usage):0;if(message.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this._runtimeMessages(),estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex===null){if(!this._isRequiredCompactionError(message))return}else{let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch()),usageMessage=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)){let contentTokens=estimateMessagesTokens2(messages);return shouldCompact2(contentTokens,model.contextWindow,settings)?"threshold":void 0}}contextTokens=estimate.tokens}return shouldCompact2(contextTokens,model.contextWindow,settings)?"threshold":void 0}_exceedsPolicyByContentEstimate(){let model=this.model;if(!model)return!1;let settings=this._getCompactionSettings(),contextTokens=estimateMessagesTokens2(this._runtimeMessages());return shouldCompact2(contextTokens,model.contextWindow,settings)}_hasPendingPostCompactionUsageExemption(message){return this._skipNextPostCompactionAssistantCheck&&!this._assistantsPendingAtCompaction.has(message)&&this._overflowRecoveryRungs===0}_isPostCompactionUsageExempt(message){return this._postCompactionUsageExemptAssistants.has(message)||this._hasPendingPostCompactionUsageExemption(message)}_consumePostCompactionUsageExemption(message){return this._postCompactionUsageExemptAssistants.has(message)?!0:this._isPostCompactionUsageExempt(message)?(this._skipNextPostCompactionAssistantCheck=!1,this._postCompactionUsageExemptAssistants.add(message),!0):!1}_agentEndAllowsQueuedContinuation(messages){let lastAssistantIndex=-1;for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant"){lastAssistantIndex=index;break}if(lastAssistantIndex===-1)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||lastAssistant.stopReason==="aborted"||lastAssistant.stopReason==="error"||this._getRequiredAutoCompactionReason(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&message.isError&&message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)))return!1}return!0}_willRetryAfterAgentEnd(messages){if(this._suppressQueuedContinuationAfterUserAbort)return!1;let lastAssistant=this._lastAssistantMessage??this._findLastAssistantInMessages(messages);if(!lastAssistant)return!1;if(this._isRequiredCompactionError(lastAssistant)&&this._getRequiredAutoCompactionReason(lastAssistant)!==void 0)return!0;if(!this.settingsManager.getRetrySettings().enabled)return!1;let turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,retryableError=this._isRetryableError(lastAssistant);if(isCursorZeroTokenResourceExhausted(lastAssistant))return!0;if(isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0))return this._retryFallback.canTryFallback();if(!retryableError&&this._isHardErrorFallbackEligible(lastAssistant))return!0;if(!retryableError)return!1;if(isClassifierRefusal(lastAssistant))return this._retryAttempt+1<=turnMaxRetries&&this._retryFallback.canTryFallback();if(this._retryAttempt+1>turnMaxRetries)return this._retryFallback.canTryFallback();let errorMessage8=lastAssistant.errorMessage||"Unknown error",providerDelayMs=this._getProviderRetryDelayMs(errorMessage8);return providerDelayMs===void 0||providerDelayMs<=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs?!0:this._retryFallback.canTryFallback()}_isRequiredCompactionError(message){return this._requiredCompactionTurnError!==void 0&&message.stopReason==="error"&&message.errorMessage===this._requiredCompactionTurnError.message}async _processAgentEvent(event,signal){if(event.type==="agent_start"&&(this._requiredCompactionTurnError=void 0,this._armCircuitProbeWatchdog()),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryRungs=0,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let{clientMessageId}=readClientMessageIdentity(event.message),queued=clientMessageId===void 0?void 0:this._queuedInputOrder.find(input=>input.clientMessageId===clientMessageId),steeringIndex=clientMessageId===void 0||queued?.mode==="steer"?this._steeringMessages.indexOf(messageText):-1;if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer",clientMessageId),this._emitQueueUpdate();else{let followUpIndex=clientMessageId===void 0||queued?.mode==="followUp"?this._followUpMessages.indexOf(messageText):-1;followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp",clientMessageId),this._emitQueueUpdate())}}}let agentEndWillRetry=event.type==="agent_end"&&this._willRetryAfterAgentEnd(event.messages);this._extensionEventSignal=signal;try{await this._emitExtensionEvent(event,agentEndWillRetry)}finally{this._extensionEventSignal=void 0}if(event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),this._emit(event.type==="agent_end"?{...event,willRetry:agentEndWillRetry}:event.type==="message_update"?withResolvedToolName(event,name=>this.resolveToolCallName(name)):event),event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),event.type==="message_update"&&event.message.role==="assistant"&&this._acceptCircuitProbeOnProgress(event.message,event.assistantMessageEvent),event.type==="message_end"){let entryId;try{event.message.role==="custom"?(entryId=this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message)):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(entryId=this.sessionManager.appendMessage(event.message),this._emitEntryAppended(entryId),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message))}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:String(error2);this.externalAdmission.observeRefused(event.message,errorMessage8),this._sessionLogger.warn("transcript_write_failed",{role:event.message.role,error:errorMessage8}),this._transcriptWriteFailures.record(event.message,error2),this._emit({type:"transcript_write_failed",role:event.message.role,errorMessage:errorMessage8}),this._promptOwnsRun||this._reportContinuationTranscriptFailure()}if(entryId&&this._entryIdsByMessage.set(event.message,entryId),event.message.role==="assistant"){this._lastAssistantMessage=event.message;let assistantMsg=event.message,succeeded=!assistantMsg.errorMessage&&assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="aborted"&&!isClassifierRefusal(assistantMsg);if(succeeded&&this._retryFallback.probes.accept(`${assistantMsg.provider}/${assistantMsg.model}`),succeeded&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryRungs=0),succeeded&&this._retryAttempt>0){let fallback=this._retryFallback.activeState;fallback&&this._emit({type:"retry_fallback_succeeded",model:this.model?`${this.model.provider}/${this.model.id}`:"",chainKey:fallback.chainKey}),this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0,this._resetHintTierState()}}}let launchedContinuation=!1,retryContinuationBlocked=!1,retryExhaustionAllowsQueuedContinuation=!1,allowsPostCompactionUsageExemptContinuation=!1,userAbortSuppressedQueuedContinuation=event.type==="agent_end"&&this._suppressQueuedContinuationAfterUserAbort;userAbortSuppressedQueuedContinuation&&(this._suppressQueuedContinuationAfterUserAbort=!1);let allowsQueuedContinuation=event.type==="agent_end"&&!userAbortSuppressedQueuedContinuation?this._agentEndAllowsQueuedContinuation(event.messages):!1;if(event.type==="agent_end"&&this._lastAssistantMessage){let msg=this._lastAssistantMessage;this._lastAssistantMessage=void 0,this._skipNextPostRetryCompactionCheck=!1,this._clearCircuitProbeWatchdog(),msg.stopReason==="error"&&isHealthExhaustionFailure(msg.errorMessage)&&this.model&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage});let requiredAutoCompaction=this._getRequiredAutoCompactionReason(msg),retryAfterRequiredCompaction=requiredAutoCompaction!==void 0&&this._isRequiredCompactionError(msg),retryableError=this._isRetryableError(msg),hardErrorFallbackEligible=this._isHardErrorFallbackEligible(msg),cursorZeroTokenRe=isCursorZeroTokenResourceExhausted(msg),cursorQuotaRe=isCursorQuotaResourceExhausted(msg,this.model?.contextWindow??0),claudeSdkSameModelRemint=this._isClaudeSdkSameModelRemintError(msg),retryCanAdmitProvider=!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled&&(retryableError||hardErrorFallbackEligible||cursorZeroTokenRe||cursorQuotaRe||claudeSdkSameModelRemint),compactedBeforeRetry=!1;retryCanAdmitProvider&&requiredAutoCompaction&&!(requiredAutoCompaction==="threshold"&&this._hasPendingPostCompactionUsageExemption(msg))&&(this._retireFailedRetryAssistant(msg),compactedBeforeRetry=await this._runPrePromptCompaction(msg,!0,requiredAutoCompaction,!0),retryContinuationBlocked=!compactedBeforeRetry&&!this._isCompactionDelegated()&&!cursorQuotaRe&&!hardErrorFallbackEligible);let retryOutcome="not-handled",retryOwnedDeferredQueue=DEFERRED_RETRY_QUEUE_OWNERS.has(this);if(DEFERRED_RETRY_QUEUE_OWNERS.delete(this),!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(cursorZeroTokenRe?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):cursorQuotaRe?(this._retireFailedRetryAssistant(msg),retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0})):claudeSdkSameModelRemint?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):retryableError?retryOutcome=await this._handleRetryableError(msg):hardErrorFallbackEligible&&(retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0}))),retryOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}if(msg.stopReason==="error"&&this.model&&this._isRetryableError(msg)&&this._isCircuitProbeOnCurrentModel()&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage}),this._retryFallback.probes.release(),retryExhaustionAllowsQueuedContinuation=!userAbortSuppressedQueuedContinuation&&retryOwnedDeferredQueue&&retryOutcome==="not-handled"&&(msg.stopReason==="error"||msg.stopReason==="aborted"),retryOutcome==="not-handled"&&cursorQuotaRe&&msg.errorMessage&&(msg.errorMessage=`${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`),retryOutcome==="not-handled"&&msg.stopReason==="error"&&msg.errorMessage){let rejectedImages=rejectedImageSources(this.agent.state.messages,msg);rejectedImages.length>0&&(msg.errorMessage=`${msg.errorMessage} (the rejected image from ${rejectedImages.join(", ")} is left out of later requests; send your next message to continue)`)}if(retryOutcome==="not-handled"&&this._retryAttempt>0&&msg.errorMessage){let attempt2=this._retryAttempt;this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:userAbortSuppressedQueuedContinuation?"Retry cancelled":msg.errorMessage})}this._resolveRetry(),retryContinuationBlocked||=retryOutcome==="blocked",!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(compactedBeforeRetry&&this.agent.hasQueuedMessages()?(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0):(launchedContinuation=await this._checkCompaction(msg,!0,void 0,retryAfterRequiredCompaction),launchedContinuation&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0),allowsPostCompactionUsageExemptContinuation=this._postCompactionUsageExemptAssistants.has(msg),allowsPostCompactionUsageExemptContinuation&&this._flushPostCompactionDeferredMessages(),requiredAutoCompaction&&!launchedContinuation&&this.agent.hasQueuedMessages()&&this._getRequiredAutoCompactionReason(msg)!==void 0&&(this._requiredCompactionAdmissionError=new RequiredCompactionError)))}event.type==="agent_end"&&(this._flushPendingBashMessages(),!launchedContinuation&&!retryContinuationBlocked&&(allowsQueuedContinuation||allowsPostCompactionUsageExemptContinuation||retryExhaustionAllowsQueuedContinuation)&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),!launchedContinuation&&!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&this._extensionRunner.hasHandlers("agent_before_settle")&&await this._runBeforeSettleBoundary(this.agent.hasQueuedMessages())&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),launchedContinuation?this._abortProvenance.closeAgentEndBoundary():await this._emitAgentSettled())}_resolveRetry(){this._retryResolve&&(this._retryResolve(),this._retryResolve=void 0,this._retryPromise=void 0)}_resetHintTierState(){this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0}_isCircuitProbeOnCurrentModel(){let model=this.model;return model!==void 0&&this._retryFallback.probes.holds(formatSelector(model))}_acceptCircuitProbeOnProgress(message,event){let probing=this._retryFallback.probes.probing;probing===void 0||`${message.provider}/${message.model}`!==probing||!((event.type==="text_delta"||event.type==="thinking_delta"||event.type==="toolcall_delta")&&event.delta.length>0)||(this._retryFallback.probes.accept(probing),this._clearCircuitProbeWatchdog())}_armCircuitProbeWatchdog(){this._clearCircuitProbeWatchdog();let probing=this._retryFallback.probes.probing;if(probing===void 0||this.agent.streamStartTimeoutMs!==void 0)return;let timeoutMs=DEFAULT_STREAM_START_TIMEOUT_MS;this._circuitProbeWatchdog=setTimeout(()=>{this._circuitProbeWatchdog=void 0,this._retryFallback.probes.probing===probing&&this.agent.abort(new ProviderRetryWatchdogAbortError(`Circuit probe of ${probing} sent no response within ${timeoutMs}ms`))},timeoutMs)}_clearCircuitProbeWatchdog(){this._circuitProbeWatchdog!==void 0&&(clearTimeout(this._circuitProbeWatchdog),this._circuitProbeWatchdog=void 0)}async _emitSessionAbort(){await this._extensionRunner.emit({type:"session_abort"}),this._emit({type:"session_abort"})}_armProbeBackForDemotedSelector(selector,hintMs){if(!selector)return;let currentModel=this.model;if(currentModel&&formatSelector(currentModel)===selector)return;let parts=selector.split("/");if(parts.length<2)return;let provider=parts[0];if(!this._modelRuntime.hasConfiguredAuth(provider))return;let now2=this._fallbackNow(),schedule=probeBackSchedule(hintMs,now2),modelId=parts.slice(1).join("/"),demotedModel=this._modelRuntime.getModel(provider,modelId);demotedModel&&this._probeBackScheduler.arm({selector,firstAtMs:schedule.firstAtMs,deadlineMs:schedule.deadlineMs,authAvailable:()=>this._modelRuntime.hasConfiguredAuth(provider),runProbe:async signal=>{let admission=this._fallbackCircuits.admit(selector,`probe-back:${++this._probeBackLaneSeq}`);if(admission.kind==="open")return!1;try{let result3=await this._modelRuntime.completeSimple(demotedModel,{systemPrompt:"Reply with OK.",messages:[{role:"user",content:[{type:"text",text:"OK"}],timestamp:now2}]},{maxTokens:1,signal}),ok2=result3.stopReason!=="error"&&result3.stopReason!=="aborted";return!ok2&&result3.stopReason==="error"&&admission.kind==="probe"&&this._fallbackCircuits.noteFailure(selector,{errorMessage:result3.errorMessage}),ok2}catch{return!1}finally{admission.kind==="probe"&&this._fallbackCircuits.release(admission.token)}},onCleared:sel=>{this._selectorCooldowns.clear(sel),this._fallbackCircuits.close(sel)},emit:event=>{event.type==="retry_probe_scheduled"?this._emit({type:"retry_probe_scheduled",selector:event.selector,atMs:event.atMs,probeIndex:event.probeIndex}):this._emit({type:"retry_probe_result",selector:event.selector,ok:event.ok,errorMessage:event.errorMessage})}})}_findPersistedMessageEntryId(message){let mapped=this._entryIdsByMessage.get(message);if(mapped)return mapped;for(let entry of[...this.sessionManager.getBranch()].reverse())if(entry.type==="message"&&entry.message===message)return entry.id;let messageIndex=this.agent.state.messages.indexOf(message);if(messageIndex<0)return;let projection=this.sessionManager.buildSessionProjection(),projectedIndex=0;for(let entry of projection.entries)for(let i=0;i<entry.messages.length;i++){if(projectedIndex===messageIndex)return this._entryIdsByMessage.set(message,entry.sourceEntry.id),entry.sourceEntry.id;projectedIndex++}}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}_retireFailedRetryAssistant(message){let position=this.sessionManager.getMessageEntryPosition(message);if(!position||this.sessionManager.getLeafId()!==position.entryId)return;let entry=this.sessionManager.getEntry(position.entryId);if(entry?.type!=="message")return;entry.parentId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(entry.parentId);let messageIndex=this.agent.state.messages.lastIndexOf(message);messageIndex!==-1&&(this.agent.state.messages=this.agent.state.messages.slice(0,messageIndex)),this._incrementMessageRevision()}_isAssistantFromBeforeLatestCompaction(assistantMessage){let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(compactionEntry===null||this._messageEndsAwaitingPersistence.has(assistantMessage))return!1;let messagePosition=this.sessionManager.getMessageEntryPosition(assistantMessage),compactionOrder=this.sessionManager.getEntryOrder(compactionEntry.id);return messagePosition!==void 0&&compactionOrder!==void 0?messagePosition.order<=compactionOrder:assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime()}_replaceMessageInPlace(target,replacement){if(target!==replacement){for(let key of Object.keys(target))Reflect.deleteProperty(target,key);Object.assign(target,replacement)}}async _emitExtensionEvent(event,agentEndWillRetry=!1){if(event.type==="agent_start")this._turnIndex=0,await this._extensionRunner.emit({type:"agent_start"});else if(event.type==="agent_end"){let extensionEvent=this._abortProvenance.beginAgentEnd(event.messages,agentEndWillRetry,this._findLastAssistantInMessages(event.messages)?.stopReason==="aborted");try{await this._extensionRunner.emit(extensionEvent)}finally{this._abortProvenance.endAgentEnd(extensionEvent)}}else if(event.type==="turn_start"){let extensionEvent={type:"turn_start",turnIndex:this._turnIndex,timestamp:Date.now()};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="turn_end")event.message.role==="assistant"&&!this._boundaryDispatchedMessages.delete(event.message)&&await this._dispatchTurnEndBoundary(event.message,event.toolResults),this._turnIndex++,this._flushPendingCustomMessages();else if(event.type==="message_start"){let extensionEvent={type:"message_start",message:event.message};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_update"){let extensionEvent={type:"message_update",message:event.message,assistantMessageEvent:event.assistantMessageEvent};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_end"){let extensionEvent={type:"message_end",message:event.message},replacement=await this._extensionRunner.emitMessageEnd(extensionEvent);if(replacement){let normalized2=(replacement.role==="user"||replacement.role==="assistant"||replacement.role==="toolResult"||replacement.role==="custom")&&replacement.content==null?{...replacement,content:[]}:replacement;this._replaceMessageInPlace(event.message,normalized2)}}else if(event.type==="tool_execution_start"){let extensionEvent={type:"tool_execution_start",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_update"){let extensionEvent={type:"tool_execution_update",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,partialResult:event.partialResult};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_end"){let extensionEvent={type:"tool_execution_end",toolCallId:event.toolCallId,toolName:event.toolName,result:event.result,isError:event.isError};await this._extensionRunner.emit(extensionEvent)}}subscribe(listener){this._eventListeners.push(listener),this._resumeCompactionRequirement!==void 0&&listener({type:"resume_compaction_required",projection:this._resumeCompactionRequirement.projection,notice:this._resumeCompactionRequirement.notice}),this._resumeSlice!==void 0&&listener(this._resumeSliceEvent(this._resumeSlice));for(let source2 of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source2});return()=>{let index=this._eventListeners.indexOf(listener);index!==-1&&this._eventListeners.splice(index,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}_reconnectToAgent(){this._unsubscribeAgent||(this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent))}dispose(){for(let dispose of this._toolContextDisposers)dispose();try{this._probeBackScheduler.cancel("dispose"),this._clearCircuitProbeWatchdog(),this._retryFallback.probes.releaseAll(),this._fallbackCircuitsLease.release(),this.abortRetry(),this.abortCompaction(),this.abortBranchSummary(),this.abortSessionTitleGeneration(),this.abortBash(),this.agent.abort()}catch{}this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."),this._releaseToolSearchService("session disposed"),this._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=void 0,this._eventListeners=[],cleanupSessionResources(this.sessionId),this.sessionManager.dispose()}get activitySnapshot(){return{isStreaming:this._isAgentRunActive,isBashRunning:this.isBashRunning,isCompacting:this.isCompacting,hasSessionWork:this._sessionWorkBarrier.hasActiveWork,hasActiveWakeSource:this._wakeSources.hasActive}}get isSessionBusy(){return isSessionBusySnapshot(this.activitySnapshot)}refreshContext(){this._refreshFinalizedContext()}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get thinkingSelection(){return this.agent.state.thinkingSelection}get serviceTier(){return this._currentServiceTier}isFastModeActive(){return this._currentServiceTier!=="ultrafast"&&(this._sessionFastMode||this._currentServiceTier==="priority")}get effectiveServiceTier(){return this.isFastModeActive()?"priority":this._currentServiceTier}setSessionFastMode(enabled){let previousFastMode=this.isFastModeActive(),previousTier=this._currentServiceTier;this._sessionFastMode=enabled,!enabled&&this._currentServiceTier==="priority"&&this.model?.api===CODEX_RESPONSES_API&&this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier==="priority"&&(this._currentServiceTier=void 0),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode)}_emitServiceTierChangeIfNeeded(previousTier,previousFastMode){let fastMode=this.isFastModeActive();previousTier===this._currentServiceTier&&previousFastMode===fastMode||this._emit({type:"service_tier_changed",tier:this.effectiveServiceTier,fastMode})}_resolveServiceTier(model,explicit){if(explicit)return explicit;if(model)return this._modelRuntime.getCompatibilityRequestConfig(model).serviceTier}get routedModel(){if(!this.model||!isVirtualModel(this.model))return;let latest=findLatestResponse(this.agent.state.messages),model=latest&&this._modelRuntime.getPhysicalModel(latest.provider,latest.model);return model&&{model,thinkingLevel:latest?.thinkingLevel}}get isStreaming(){return this._isAgentRunActive}get isIdle(){return!this._isAgentRunActive}setPromptSurface(surface){let current=this._baseSystemPromptOptions.surface;this._promptSurface=surface,current!==surface&&(this._systemPromptOverride=void 0,this._applyToolDeclarations(this.getActiveToolNames()))}get systemPrompt(){return this.agent.state.systemPrompt}get retryAttempt(){return this._retryAttempt}get currentAbortSource(){return this._abortProvenance.currentSource}getActiveToolNames(){return this.agent.state.tools.map(t=>t.name)}getCallableToolNames(){return this._getCallableTools().map(t=>t.name)}getAllTools(){return Array.from(this._toolDefinitions.values()).map(({definition,sourceInfo})=>({name:definition.name,label:definition.label,description:definition.description,parameters:definition.parameters,promptGuidelines:definition.promptGuidelines,kernelPrelude:projectKernelPrelude(definition.name,definition.kernelPrelude),permissionParser:definition.permissionParser,...definition.namespace?{namespace:definition.namespace}:{},...definition.annotations?{annotations:{...definition.annotations}}:{},sourceInfo,...normalizeToolExposure(definition)}))}getToolDefinition(name){return this._toolDefinitions.get(name)?.definition}resolveToolCallName(requested){return resolveToolNameAlias(requested,this._callableToolNames())??requested}async executeTool(toolName,params,options){let activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName);if(!tool&&this._isEvalOnlyPolicyArmed()&&this._evalOnlyToolNames?.has(toolName)&&(tool=this._toolRegistry.get(toolName)),!tool&&options?.activateInactiveTool===!0&&this._toolDefinitions.has(toolName)&&this._activateLazyTool(toolName)&&(activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName)),!tool){let code=new Set(this._toolDefinitions.keys()).has(toolName)?"inactive_tool":"unknown_tool",activeList=activeTools.length>0?activeTools.join(", "):"(none)";throw new ExecuteToolError(code,toolName,code==="inactive_tool"?`Tool ${toolName} is registered but inactive. Active tools: ${activeList}`:`Unknown tool ${toolName}. Active tools: ${activeList}`,activeTools)}let toolCall={type:"toolCall",id:`codemode-${randomUUID15()}`,name:toolName,arguments:params},prepared;try{prepared=prepareAgentToolCall(tool,toolCall)}catch(err2){throw new ExecuteToolError("invalid_params",toolName,err2 instanceof Error?err2.message:String(err2),activeTools)}let beforeResult=await this.preflightToolCall(prepared.toolCall,prepared.args,{waitForEventQueue:this._toolExecutionDepth===0});if(beforeResult?.block)throw new ExecuteToolError("blocked",toolName,beforeResult.reason||"Tool execution was blocked",activeTools);let result3,isError=!1;try{result3=await prepared.tool.execute(prepared.toolCall.id,prepared.args,options?.signal,options?.onUpdate),isError=result3.isError===!0}catch(err2){result3={content:[{type:"text",text:err2 instanceof Error?err2.message:String(err2)}],details:{isError:!0}},isError=!0}let hookResult=await this._emitAfterToolCallHooks(prepared.toolCall,prepared.args,result3,isError);return hookResult?{content:hookResult.content??result3.content,details:hookResult.details??result3.details,terminate:result3.terminate}:result3}_callableToolNames(){let names=this.agent.state.tools.map(tool=>tool.name);for(let[name,{definition}]of this._toolDefinitions){let exposure=normalizeToolExposure(definition);exposure.exposure==="search"&&exposure.allowLazyActivation&&names.push(name)}return[...names,...this._toolSearchCatalogNames()]}_toolSearchCatalogNames(){return this._toolSearchService?.getCatalog().map(doc=>doc.name)??[]}_activateLazyTool(toolName){return this._lazyToolActivation.activate(toolName)}_isEvalOnlyPolicyArmed(){return this._evalOnlyToolNames!==void 0&&this._toolRegistry.has("eval")}_resolveEvalOnlyToolNames(){let declaredEvalNames=[...this._toolDefinitions.values()].filter(({definition})=>normalizeToolExposure(definition).exposure==="eval").map(({definition})=>definition.name);return this._evalOnlyToolNamesOverride??new Set([...EVAL_ONLY_TOOL_NAMES,...declaredEvalNames])}_publishEvalOnlyToolHints(){let armed=this._isEvalOnlyPolicyArmed()?this._evalOnlyToolNames??new Set:void 0,registered=armed?new Set([...armed].filter(name=>this._toolRegistry.has(name))):void 0;for(let name of this._publishedEvalOnlyHintNames)registered?.has(name)||delete this.agent.removedToolHints[name];if(this._publishedEvalOnlyHintNames.clear(),!!registered)for(let name of registered)this.agent.removedToolHints[name]=`Run ${name} inside an eval cell via ${evalHelperCall(name)}; hooks and permissions still apply.`,this._publishedEvalOnlyHintNames.add(name)}getRegisteredTool(name){return this._toolRegistry.get(name)}async emitExecBridgeToolResult(toolName,toolCallId,args,result3,isError){await this._emitAfterToolCallHooks({type:"toolCall",id:toolCallId,name:toolName,arguments:args&&typeof args=="object"&&!Array.isArray(args)?args:{}},args,result3,isError)}setActiveToolsByName(toolNames){let tools=[],validToolNames=[],policyArmed=this._isEvalOnlyPolicyArmed();this._publishEvalOnlyToolHints();let policyNames=this._evalOnlyToolNames,filteredToolNames=toolNames;if(policyArmed&&policyNames){for(let name of toolNames)policyNames.has(name)&&this._withheldEvalOnlyToolNames.add(name);filteredToolNames=toolNames.filter(name=>!policyNames.has(name))}else this._withheldEvalOnlyToolNames.clear();this._requestedActiveToolNames=[...new Set([...toolNames,...this._withheldEvalOnlyToolNames])];for(let name of filteredToolNames){let tool=this._toolRegistry.get(name);tool&&this._getToolExposure(name)!=="hidden"&&(tools.push(tool),validToolNames.push(name))}let activeToolNamesChanged=validToolNames.length!==this.agent.state.tools.length||validToolNames.some((name,index)=>name!==this.agent.state.tools[index]?.name),previousToolNames=new Set(this.agent.state.tools.map(tool=>tool.name));this.agent.state.tools=tools;for(let name of validToolNames)this._declaredToolNames.includes(name)||this._declaredToolNames.push(name);this._applyToolDeclarations(validToolNames),activeToolNamesChanged&&this._extensionBindingPromptReadiness===void 0&&(this.abortCompaction(),this._incrementMessageRevision());let activatedToolNames=validToolNames.filter(name=>!previousToolNames.has(name));activatedToolNames.length>0&&this._extensionRunner?.hasHandlers("tool_activated")&&this._extensionRunner.emit({type:"tool_activated",toolNames:activatedToolNames})}_declaresSessionTools(){let model=this.model;return model!==void 0&&supportsAllowedToolChoice(model)}_toolDeclarationNames(activeToolNames){return this._declaresSessionTools()?this._declaredToolNames.filter(name=>this._toolRegistry.has(name)):[...activeToolNames]}_applyToolDeclarations(activeToolNames){this._promptDeclaresSessionTools=this._declaresSessionTools();let declaredNames=this._toolDeclarationNames(activeToolNames),declaresInactiveTools=declaredNames.length!==activeToolNames.length||declaredNames.some((name,index)=>name!==activeToolNames[index]);this.agent.state.declaredTools=declaresInactiveTools?declaredNames.flatMap(name=>this._toolRegistry.get(name)??[]):void 0,this._baseSystemPrompt=this._rebuildSystemPrompt(declaredNames),this.agent.state.systemPrompt=this._systemPromptOverride??this._baseSystemPrompt}_refreshToolDeclarationsForModel(){if(!this._declaresSessionTools()&&!this._promptDeclaresSessionTools)return;let declaredNames=this._toolDeclarationNames(this.getActiveToolNames());declaredNames.length===this._promptToolNames.length&&declaredNames.every((name,index)=>name===this._promptToolNames[index])||this._applyToolDeclarations(this.getActiveToolNames())}get isCompacting(){return this._compactionLifecycle.state.status==="running"||this._autoCompactionAbortController!==void 0||this._compactionAbortController!==void 0||this._branchSummaryAbortController!==void 0}get compactionState(){return this._compactionLifecycle.state}get messages(){return this._runtimeMessages()}get steeringMode(){return this.agent.steeringMode}get followUpMode(){return this.agent.followUpMode}get sessionFile(){return this.sessionManager.getSessionFile()}get sessionId(){return this.sessionManager.getSessionId()}onExtensionEvent(channel,handler){return this._resourceLoader.onExtensionEvent?.(channel,handler)??(()=>{})}emitExtensionEvent(channel,data){this._resourceLoader.emitExtensionEvent?.(channel,data)}setControlEndpointHost(host){this._controlEndpointHost=host}get sessionName(){return this.sessionManager.getSessionName()}get scopedModels(){return this._scopedModels}setScopedModels(scopedModels){this._scopedModels=scopedModels}get favoriteModels(){return this._getCurrentFavoriteModels()}setFavoriteModels(favoriteModels2){this._favoriteModels=favoriteModels2}_getCurrentFavoriteModels(){let availableById=new Map(this._modelRuntime.getAvailableSnapshot().map(model=>[`${model.provider}/${model.id}`,model])),narrowedModelIds=this._scopedModels.length>0?new Set(this._scopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`)):void 0,seenModelIds=new Set,favoriteModels2=[];for(let favorite of this._favoriteModels){let modelId=`${favorite.model.provider}/${favorite.model.id}`;if(seenModelIds.has(modelId))continue;let model=availableById.get(modelId);model&&(narrowedModelIds&&!narrowedModelIds.has(modelId)||(seenModelIds.add(modelId),favoriteModels2.push({model,thinkingLevel:favorite.thinkingLevel,thinkingSelection:favorite.thinkingSelection,serviceTier:favorite.serviceTier})))}return favoriteModels2}get promptTemplates(){return this._resourceLoader.getPrompts().prompts}_normalizePromptSnippet(text2){if(!text2)return;let oneLine3=text2.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim();return oneLine3.length>0?oneLine3:void 0}_normalizePromptGuidelines(guidelines){if(!guidelines||guidelines.length===0)return[];let unique3=new Set;for(let guideline of guidelines){let normalized2=guideline.trim();normalized2.length>0&&unique3.add(normalized2)}return Array.from(unique3)}_rebuildSystemPrompt(toolNames){let validToolNames=toolNames.filter(name=>this._toolRegistry.has(name));this._promptToolNames=validToolNames;let withheld=this._withheldEvalOnlyToolNames??new Set,contributingToolNames=[...validToolNames,...[...withheld].filter(name=>this._toolRegistry.has(name)&&!validToolNames.includes(name))],toolSnippets={},promptGuidelines=[];for(let name of contributingToolNames){let snippet=this._toolPromptSnippets.get(name);snippet&&(toolSnippets[name]=snippet);let toolGuidelines=this._toolPromptGuidelines.get(name);toolGuidelines&&promptGuidelines.push(...toolGuidelines)}let loadedSkills=this._resourceLoader.getSkills().skills,loadedContextFiles=this._resourceLoader.getAgentsFiles().agentsFiles,loaderSystemPrompt=this._resourceLoader.getSystemPrompt(),loaderAppendSystemPrompt=this._resourceLoader.getAppendSystemPrompt();this._baseSystemPromptOptions={cwd:this._cwd,skills:loadedSkills,contextFiles:loadedContextFiles,selectedTools:validToolNames,toolSnippets,promptGuidelines,surface:this._promptSurface??resolvePromptSurface(process.env),customPrompt:loaderSystemPrompt,appendSystemPrompt:loaderAppendSystemPrompt.length>0?loaderAppendSystemPrompt.join(`
2597
2580
 
2598
2581
  `):void 0};let basePrompt=loaderSystemPrompt??buildDynamicSystemPrompt(this._baseSystemPromptOptions),prompt=loaderAppendSystemPrompt.length>0?`${basePrompt}
2599
2582
 
@@ -2603,8 +2586,8 @@ ${loaderAppendSystemPrompt.join(`
2603
2586
 
2604
2587
  ${sentences.join(`
2605
2588
 
2606
- `)}`:prompt}async _runInputHandlers(text2,images,source2,streamingBehavior){if(!this._extensionRunner.hasHandlers("input"))return{text:text2,images};let inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`,inputResult=await this._extensionRunner.emitInput(text2,images,source2,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 hold=this.externalAdmission.beginInput({command:this._isExtensionCommandText(text2,options),submittedByCommand:options?.source==="extension"});try{await this._prompt(text2,{...options,promptDisposition:disposition=>{hold.accepted(),options?.promptDisposition?.(disposition)}})}finally{hold.end()}}_isExtensionCommandText(text2,options){if(!(options?.expandPromptTemplates??!0)||!text2.startsWith("/"))return!1;let spaceIndex=text2.indexOf(" ");return this._extensionRunner.getCommand(spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex))!==void 0}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})){let accepted=!1,reportAccepted=()=>{accepted||(accepted=!0,promptDisposition?.("handled"),preflightResult?.(!0))},turnStarted=!1,turnClaim=new DeferredTurnClaim;turnClaim.disposition.then(disposition=>{disposition==="delegated"?reportAccepted():disposition==="started"&&(turnStarted=!0)});let unsubscribe=this.subscribe(event=>{event.type==="agent_start"&&turnStarted&&reportAccepted()});try{await this.sendCustomMessage({customType:MANUAL_CONTINUE_CUSTOM_TYPE,content:MANUAL_CONTINUE_DIRECTIVE,display:!1},{triggerTurn:!0,deliverAs:options?.streamingBehavior==="followUp"?"followUp":"steer"},turnClaim)}finally{unsubscribe()}reportAccepted();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,expandedText===currentText&&options?.source!=="extension"&&options?.unknownCommandAsText!==!0&&!/^\s/.test(text2)&&this._rejectUnknownCommand(currentText),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,options):await this._queueSteer(expandedText,currentImages,options),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,options):await this._queueSteer(expandedText,currentImages,options),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,options):await this._queueSteer(expandedText,currentImages,options),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,options):await this._queueSteer(expandedText,currentImages,options),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,options):await this._queueSteer(expandedText,currentImages,options),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 environmentContext=this._pendingEnvironmentContextMessage();environmentContext&&messages.push(environmentContext);let userContent=[{type:"text",text:expandedText}];currentImages&&userContent.push(...currentImages),messages.push({role:"user",content:userContent,timestamp:Date.now(),...clientMessageIdentity(options)}),consumedNextTurnMessages=this._pendingNextTurnMessages,this._pendingNextTurnMessages=[];for(let msg of consumedNextTurnMessages)messages.push(msg);this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();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,void 0,options?.onQueuedInput),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}}_rejectUnknownCommand(text2){if(commandShapedName(text2)===void 0)return;let promptCommands=new Set([...this._extensionRunner.getRegisteredCommands().map(command=>command.invocationName),...this.promptTemplates.map(template=>template.name),...this.resourceLoader.getSkills().skills.map(skill=>`skill:${skill.name}`)]),interactiveCommands=new Set(BUILTIN_SLASH_COMMANDS.map(command=>command.name)),rejection=findUnknownCommand(text2,{promptCommands,interactiveCommands});if(rejection)throw rejection}_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=readFileSync49(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"handled";let expandedText=this._expandSkillCommand(processedInput.text),templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);return expandedText=templateExpansion.text,behavior==="steer"?await this._queueSteer(expandedText,processedInput.images,options):await this._queueFollowUp(expandedText,processedInput.images,options),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"}}),"queued"}async steer(text2,images,options){return this._queueUserInput(text2,images,"steer",options)}async followUp(text2,images,options){return 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;this._sessionLogger.debug("session_title_failed",{error:error2 instanceof Error?error2.message:String(error2)})}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,options){this._enqueuePreparedInput({...options,text:text2,images,mode:"steer"})}async _queueFollowUp(text2,images,options){this._enqueuePreparedInput({...options,text:text2,images,mode:"followUp"})}async restoreQueuedInput(input){this._enqueuePreparedInput(input)}_enqueuePreparedInput(input){let enqueueOrder=input.enqueueOrder??this.reserveQueuedInputOrder(),prepared={...clientMessageIdentity(input),text:input.text,images:input.images,mode:input.mode,enqueueOrder};input.onQueuedInput?.(prepared);let queue=input.mode==="steer"?this._steeringMessages:this._followUpMessages;queue.push(input.text),this._recordQueuedInput(input.text,input.mode,prepared),this._sessionLogger.debug("queue_enqueue",{mode:input.mode,count:queue.length}),this._emitQueueUpdate();let message={role:"user",content:[{type:"text",text:input.text},...input.images??[]],timestamp:Date.now(),...clientMessageIdentity(input)};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){(input.mode==="steer"?this._postCompactionDeferredSteeringMessages:this._postCompactionDeferredFollowUpMessages).push(message);return}switch(input.mode){case"steer":this.agent.steer(message);break;case"followUp":this.agent.followUp(message);break}}_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 environmentContext=this._pendingEnvironmentContextMessage(),messages=environmentContext?[environmentContext,appMessage]:[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"),this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(contentText(appMessage.content,""),void 0,this._baseSystemPrompt,this._baseSystemPromptOptions,{trigger:deliveryIdOf(appMessage)===void 0?"extension":"delivery"});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?.()}}_pendingEnvironmentContextMessage(){if(this._environmentContextEnabled)return environmentContextMessageIfChanged(this.agent.state.messages,resolveEnvironmentContext(this._cwd))}_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(resolve46=>{resolveBindingPromptReadiness=resolve46});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(`
2607
- `),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,options){let order=options?.enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order),this._queuedInputOrder.push({text:text2,mode,enqueueOrder:order,...clientMessageIdentity(options)})}_removeQueuedInput(text2,mode,clientMessageId){let index=this._queuedInputOrder.findIndex(message=>clientMessageId===void 0?message.mode===mode&&message.text===text2:message.clientMessageId===clientMessageId);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.externalAdmission.dropQueued(),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}getQueuedInputs(){return[...this._queuedInputOrder].sort((left,right)=>left.enqueueOrder-right.enqueueOrder)}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(),this._isBeforeSettle&&(this._abortDuringBeforeSettle=!0),await this._abortActiveAgentAndRetry("user"),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source2){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source:source2,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)}get pendingModelSwitch(){return this._pendingModelSwitch}_projectSwitchDeferral(model,liveContextTokens){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings();if(!compaction.enabled||this._modelSwitchAdmission()!=="switch")return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction,includeSpeculationLead:!1,admission:"switch"});return projection.verdict==="fits-after-compaction"?projection:void 0}_admitSwitchCompactionRequired(model,projection,persistDefault){let pending=createPendingModelSwitch({model,projection,persistDefault});this._pendingModelSwitch=pending,this._emit({type:"model_change_pending",model,contextWindow:projection.contextWindow,liveContextTokens:projection.liveContextTokens,requiredTokens:projection.requiredTokens,shortfallTokens:projection.shortfallTokens,notice:pending.notice})}_reduceForSwitchTarget(model,liveContextTokens){if(!this._getCompactionSettings().enabled)return liveContextTokens;let projection=this._projectSwitchFit(model);if(projection.usable||projection.verdict!=="fits-after-compaction")return liveContextTokens;let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});return plan?(this.applyResumeSlice(plan),this._projectSwitchFit(model).liveContextTokens):liveContextTokens}_projectSwitchFit(model){let liveContextTokens=this.sessionManager.buildSessionContext().messages.reduce((total,message)=>total+estimateTokens2(message),0);return projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:!1,admission:"switch"})}async _applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason){let pending=this._pendingModelSwitch;if(pending===void 0)return!1;if(!this.model)throw new RequiredCompactionError;await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,!1,!1,pendingSwitchKeepRecentTokens(pending.projection));let projection=this._projectSwitchFit(pending.model);if(!projection.usable){let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});plan&&(this.applyResumeSlice(plan),projection=this._projectSwitchFit(pending.model))}if(this._pendingModelSwitch=void 0,!projection.usable){let error2=new ModelUsabilityBudgetError(projection);throw this._recordRejectedModelChange(pending.model,error2),error2}return await this._switchActiveModel(pending.model,{persistDefault:pending.persistDefault,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0,allowDeferral:!1}),!0}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){let admission=this._modelSwitchAdmission();try{this.assertModelUsable(model,liveContextTokens,{admission,includeSpeculationLead:admission==="start"})}catch(error2){throw this._recordRejectedModelChange(model,error2),error2}}async _setModel(model,updateGlobalDefaults){let liveContextTokens=this._getDownswitchLiveContextTokens(model),deferral=this._projectSwitchDeferral(model,liveContextTokens);if(deferral===void 0&&this._assertModelUsableForSwitch(model,liveContextTokens),!await this._modelRuntime.checkAuth(model.provider)){let error2=new Error(`No API key for ${model.provider}/${model.id}`);throw this._recordRejectedModelChange(model,error2),error2}if(deferral!==void 0){this._admitSwitchCompactionRequired(model,deferral,updateGlobalDefaults);return}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),await this._retryFallback.rerouteAroundOpenCircuit()}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),previousReasoningBaseline=this.agent.state.reasoningBaseline,previousAbortServerSideFallback=this.agent.abortServerSideFallback;this.agent.state.model=model,supportsConfigurationUpdate(model)||(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;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,deferral=opts.allowDeferral===!1?void 0:this._projectSwitchDeferral(model,liveContextTokens);if(deferral!==void 0){previousModel&&(this.agent.state.model=previousModel),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,this._admitSwitchCompactionRequired(model,deferral,opts.persistDefault);return}let admittedLiveContextTokens=opts.repairWithSlice?this._reduceForSwitchTarget(model,liveContextTokens):liveContextTokens;return this._assertModelUsableForSwitch(model,admittedLiveContextTokens),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._pendingModelSwitch=void 0,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;if(onlyAlternative){let onlyLiveContextTokens=this._getDownswitchLiveContextTokens(onlyAlternative.model),onlyDeferral=this._projectSwitchDeferral(onlyAlternative.model,onlyLiveContextTokens);onlyDeferral!==void 0?this._admitSwitchCompactionRequired(onlyAlternative.model,onlyDeferral,!0):this._assertModelUsableForSwitch(onlyAlternative.model,onlyLiveContextTokens)}return{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model),cycleDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(cycleDeferral!==void 0)return this._admitSwitchCompactionRequired(next.model,cycleDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};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"),postHookDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(postHookDeferral!==void 0)return currentModel&&(this.agent.state.model=currentModel),this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(next.model,postHookDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),this.sessionManager.appendModelChange(next.model.provider,next.model.id),this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._pendingModelSwitch=void 0,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!==void 0&&supportsConfigurationUpdate(model)&&(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?getSupportedThinkingLevels2(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??=model.defaultThinkingLevel,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,getSupportedThinkingLevels2(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(source2){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source2);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source2,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source2)&&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,thinkingLevel){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&&isDeepStrictEqual4(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&&isDeepStrictEqual4(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,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=randomUUID15(),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=randomUUID15(),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:randomUUID15();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=randomUUID15();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??randomUUID15(),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(),resolvedSettings=this._getCompactionSettings(),settings=cursorOverflowCompactionSettings(request2.keepRecentTokensOverride===void 0?resolvedSettings:{...resolvedSettings,keepRecentTokens:request2.keepRecentTokensOverride},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,thinkingLevel}=await this._getCompactionRequestAuth(compactionModel);compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason,thinkingLevel)}}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)&&currentMessagesAtCheck.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!==void 0&&supportsConfigurationUpdate(modelAfterCompaction)&&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-${randomUUID15()}`,parentId:currentLeaf.id,timestamp:new Date().toISOString(),summary:compactionResult.summary,firstKeptEntryId:compactionResult.firstKeptEntryId,tokensBefore:compactionResult.tokensBefore,details:compactionResult.details,fromHook:fromExtension},simulatedMessages=buildSessionContext2([...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}_stripTrailingFailedAssistants(){let messages=this.agent.state.messages,end=messages.length;for(;end>0;){let candidate=messages[end-1];if(candidate?.role!=="assistant")break;let stopReason=candidate.stopReason;if(stopReason!=="error"&&stopReason!=="length")break;end-=1}let stripped=messages.length-end;return stripped>0&&(this.agent.state.messages=messages.slice(0,end),this._incrementMessageRevision()),stripped}_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._pendingModelSwitch!==void 0)return await this._applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason);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;let limitsModel=this._limitsModel();if(!settings.enabled||!limitsModel||isVirtualModel(limitsModel)&&limitsModel.contextWindow<=0||!shouldCompact2(contextTokens,limitsModel.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._limitsModel();if(!model||isVirtualModel(model)&&model.contextWindow<=0)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 limitsModel=this.model&&isVirtualModel(this.model)?this._modelRuntime.getPhysicalModel(assistantMessage.provider,assistantMessage.model):this.model,sameModel=limitsModel&&isSameOverflowSource(assistantMessage,limitsModel,this._modelRuntime.getCompatibilityRequestConfig(limitsModel).upstreamModelId),contextWindow=(limitsModel??this.model)?.contextWindow??0,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),branch=this.sessionManager.getBranch(),projection,buildProjection=()=>projection??=this.sessionManager.buildSessionProjection(),usageScope=resolveAssistantUsageScope(branch,buildProjection,this._findPersistedMessageEntryId(assistantMessage)),overflowEvidenceApplies=assistantMessage.stopReason==="error"?usageScope.retainedForExplicitRecovery:usageScope.usageMatchesProjection,recoverableLength=inlineReason!=="threshold"&&sameModel&&usageScope.projected&&isRecoverableLength(assistantMessage,limitsModel?.maxTokens??0),isOverflow=overflowEvidenceApplies&&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(inlineReason==="pre_prompt"&&(this._overflowRecoveryRungs=0),this._overflowRecoveryRungs>=OVERFLOW_RECOVERY_RUNGS){let errorMessage8=OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE;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._overflowRecoveryRungs+=1;let keepRecentTokensOverride=this._overflowRecoveryRungs>=2?0:void 0,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,!1,keepRecentTokensOverride):keepRecentTokensOverride===void 0?await this._runAutoCompaction("overflow",willRetry):await this._runAutoCompaction("overflow",willRetry,{keepRecentTokensOverride});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&&willRetry&&(this._failedResponse=assistantMessage),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(!usageScope.usageMatchesProjection)contextTokens=estimateProjectedContextTokens(buildProjection(),branch).tokens;else 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,keepRecentTokensOverride){if(!(reason==="overflow"&&willRetry)&&this._isCompactionDelegated())return!1;let controller=new AbortController,requestId=randomUUID15();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,keepRecentTokensOverride});return!execution.accepted&&lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryRungs=0),execution.accepted}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryRungs=0);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":(this._promptOwnsRun||this._transcriptWriteFailures.startRun(),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()}_reportContinuationTranscriptFailure(){let failure2=this._transcriptWriteFailures.takeReport();if(!failure2)return;let message=failure2.error instanceof Error?failure2.error.message:String(failure2.error);this._emit({type:"continuation_error",errorMessage:`The session file did not save this run: ${message}`})}_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,options={}){if(!(reason==="overflow"&&willRetry)&&this._isCompactionDelegated())return!1;let{keepRecentTokensOverride}=options,model=this.model,finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=this.agent.state.messages.slice(),autoCompactionController=new AbortController,requestId=randomUUID15();this._claimCompactionController(autoCompactionController,"auto");let endBeforeExecution=()=>(this._emit({type:"compaction_start",reason,requestId}),endStarted()),endStarted=()=>(reason==="overflow"&&this._autoCompactionAbortController===autoCompactionController&&(this._overflowRecoveryRungs=0),this._autoCompactionAbortController!==autoCompactionController||this._emit({type:"compaction_end",reason,result:void 0,aborted:autoCompactionController.signal.aborted,willRetry:!1,requestId}),!1),isSuperseded=()=>this._autoCompactionAbortController!==autoCompactionController;try{if(!this.model)return endBeforeExecution();try{await this._modelRuntime.getAuth(this.model,{signal:autoCompactionController.signal})}catch(error2){if(isSuperseded())return!1;if(autoCompactionController.signal.aborted)return endBeforeExecution();if(this._emit({type:"compaction_start",reason,requestId}),isSuperseded())return!1;throw new CompactionExecutionError(error2,!0,!1)}if(isSuperseded())return!1;if(autoCompactionController.signal.aborted)return endBeforeExecution();let resolvedSettings=this._getCompactionSettings(model);return prepareCompaction2(this.sessionManager.getBranch(),cursorOverflowCompactionSettings(keepRecentTokensOverride===void 0?resolvedSettings:{...resolvedSettings,keepRecentTokens:keepRecentTokensOverride},model?.provider,reason),reason==="overflow")?(this._emit({type:"compaction_start",reason,requestId}),isSuperseded()?!1:autoCompactionController.signal.aborted?endStarted():(await this._executeCompaction({controller:autoCompactionController,owner:"auto",reason,requestId,willRetry,agentMessagesAtStart,keepRecentTokensOverride})).accepted?(this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),willRetry?(this._stripTrailingFailedAssistants(),this._scheduleContinuationAfterCurrentEvent(),!0):this.pendingMessageCount>0?(this._scheduleContinuationAfterCurrentEvent(),!0):this.agent.hasQueuedMessages()?(this._scheduleContinuationAfterCurrentEvent(),!0):!1):(reason==="overflow"&&(this._overflowRecoveryRungs=0),!1)):endBeforeExecution()}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;reason==="overflow"&&(this._overflowRecoveryRungs=0);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(),settleSessionStart=this._beginSessionStartSettlement(),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(),Promise.allSettled(bindingPromptReadiness).then(settleSessionStart)}await Promise.all(bindingPromptReadiness)}_beginSessionStartSettlement(){let settle;return this._sessionStartSettled=new Promise(resolve46=>{settle=resolve46}),settle}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._toolDeclarationNames(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,label3)=>{this.sessionManager.appendLabelChange(entryId,label3)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),getSettings:()=>this.settingsManager.getSettings(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivation.register(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),sessionControl:createSessionControlActions({admission:this.externalAdmission,sessionManager:this.sessionManager,host:()=>this._controlEndpointHost})},{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:(source2="user")=>{if(source2==="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=randomUUID15();(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,getPromptCachePrefixRequest:options=>this._promptCachePrefixBuilds.build({agent:this.agent,runner:this._extensionRunner,modelRuntime:this._modelRuntime,ready:this._sessionStartSettled,getServiceTier:()=>this.effectiveServiceTier,getBaseSystemPrompt:()=>this._baseSystemPrompt,getBaseSystemPromptOptions:()=>this._baseSystemPromptOptions},options),executeTool:(callerId,name,args,options)=>this._executeNestedToolCall(callerId,name,args,options),getCallableTools:()=>this._getCallableTools()},{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()},registerVirtualModel:definition=>{this._modelRuntime.registerVirtualModel(definition),this._refreshCurrentModelFromRegistry()},unregisterVirtualModel:(provider,id)=>{this._modelRuntime.unregisterVirtualModel(provider,id),this._refreshCurrentModelFromRegistry()}}),this._bindToolSearchRemovedHints()}get fallbackValidationWarnings(){return this._fallbackValidationWarnings}_isBuiltinExtensionPath(path13){return path13.startsWith("<builtin:")||path13.startsWith(BUILTIN_PATH_PREFIX)||/[\\/]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_PATH_PREFIX}${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_PATH_PREFIX}${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=>this._isActivatedOnRegistration(name),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)});for(let name of options?.addedToolNames??[])isAllowedTool(name)&&nextActiveToolNames.push(name);if(allowedToolNames)for(let toolName of this._toolRegistry.keys())allowedToolNames.has(toolName)&&this._getToolExposure(toolName)!=="hidden"&&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)])}_getToolExposure(name){let entry=this._toolDefinitions.get(name);return entry?normalizeToolExposure(entry.definition).exposure:"direct"}_isActivatedOnRegistration(name){let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return(exposure==="direct"||exposure==="eval"||exposure==="model-only")&&entry.definition.defaultActive!==!1}_buildRuntime(options){this._delegatedCompactionKey=void 0,this._lazyToolActivation.reset();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._adoptToolSearchService(extensionsResult.runtime),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,addedToolNames:options.addedToolNames})}async reload(options){let veto=await this.checkReloadVeto();if(veto.cancelled)return veto;if(this._promptStartPending)return this.checkReloadVeto();let finishReloadWork=this._sessionWorkBarrier.begin();try{return await this._rebuildRuntimeForReload(options)}finally{finishReloadWork()}}async _rebuildRuntimeForReload(options){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");let previousDefaultTools=new Set(this._usesDefaultTools?this.settingsManager.getDefaultTools()??DEFAULT_TOOL_NAMES:[]);await this.settingsManager.reload(),this._delegatedCompactionKey=void 0;let addedDefaultTools=(this._usesDefaultTools?this.settingsManager.getDefaultTools()??DEFAULT_TOOL_NAMES:[]).filter(name=>!previousDefaultTools.has(name));this._defaultToolNames&&addedDefaultTools.length>0&&(this._defaultToolNames=new Set([...this._defaultToolNames,...addedDefaultTools]));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,addedToolNames:addedDefaultTools})}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")}if(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener){let settleSessionStart=this._beginSessionStartSettlement();try{await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")}finally{settleSessionStart()}}return time("lifecycle","reload"),{cancelled:!1}}async checkReloadVeto(){return checkSessionReloadVeto(this._extensionRunner,()=>this._promptStartPending)}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||isContextOverflow(message,(this._modelForMessage(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!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID?!1:this._isClaudeSdkSessionLockError(message)||this._isClaudeSdkInvalidRequestError(message)}_isClaudeSdkAuthMissError(message){return this.model?.provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&message.errorMessage===providerNotConfiguredMessage(ANTHROPIC_SUBSCRIPTION_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(){return this._toolSearchService?.takeNativeInjectionFailure()??null}_getProviderRetryDelayMs(errorMessage8){let markerMs=parseRetryAfterMsMarker(errorMessage8);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage8})}_summarizationRetryCallbacks(source2){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",...source2})},onRetryFinished:()=>{this._emit({type:"summarization_retry_finished"})}}}_terminalFailureText(message,attempts){let model=this.model?`${this.model.provider}/${this.model.id}`:void 0;return describeProviderFailureForUser(message.errorMessage,{attempts,model,recovery:this._retryFallback.hasConfiguredChain()?"chain-exhausted":"no-fallback-configured"})??(message.errorMessage===void 0?void 0:stripTurnRetrySuppressionPrefix(message.errorMessage))}_degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8){let settings=this.settingsManager.getRetrySettings(),turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,hintSettings=this.settingsManager.getHintPolicySettings(),finishRetryAttempt=(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);finishRetryAttempt(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){finishRetryAttempt(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(resolve46=>{this._retryResolve=resolve46}));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 if(this._isCircuitProbeOnCurrentModel()&&this._retryFallback.canTryFallback()){if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),!switchedFallback)return this._resolveRetry(),"not-handled";this._retryAttempt=1}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._failedResponse=message,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}
2589
+ `)}`:prompt}async _runInputHandlers(text2,images,source2,streamingBehavior){if(!this._extensionRunner.hasHandlers("input"))return{text:text2,images};let inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`,inputResult=await this._extensionRunner.emitInput(text2,images,source2,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 hold=this.externalAdmission.beginInput({command:this._isExtensionCommandText(text2,options),submittedByCommand:options?.source==="extension"});try{await this._prompt(text2,{...options,promptDisposition:disposition=>{hold.accepted(),options?.promptDisposition?.(disposition)}})}finally{hold.end()}}_isExtensionCommandText(text2,options){if(!(options?.expandPromptTemplates??!0)||!text2.startsWith("/"))return!1;let spaceIndex=text2.indexOf(" ");return this._extensionRunner.getCommand(spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex))!==void 0}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})){let accepted=!1,reportAccepted=()=>{accepted||(accepted=!0,promptDisposition?.("handled"),preflightResult?.(!0))},turnStarted=!1,turnClaim=new DeferredTurnClaim;turnClaim.disposition.then(disposition=>{disposition==="delegated"?reportAccepted():disposition==="started"&&(turnStarted=!0)});let unsubscribe=this.subscribe(event=>{event.type==="agent_start"&&turnStarted&&reportAccepted()});try{await this.sendCustomMessage({customType:MANUAL_CONTINUE_CUSTOM_TYPE,content:MANUAL_CONTINUE_DIRECTIVE,display:!1},{triggerTurn:!0,deliverAs:options?.streamingBehavior==="followUp"?"followUp":"steer"},turnClaim)}finally{unsubscribe()}reportAccepted();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,expandedText===currentText&&options?.source!=="extension"&&options?.unknownCommandAsText!==!0&&!/^\s/.test(text2)&&this._rejectUnknownCommand(currentText),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,options):await this._queueSteer(expandedText,currentImages,options),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,options):await this._queueSteer(expandedText,currentImages,options),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,options):await this._queueSteer(expandedText,currentImages,options),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,options):await this._queueSteer(expandedText,currentImages,options),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,options):await this._queueSteer(expandedText,currentImages,options),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 environmentContext=this._pendingEnvironmentContextMessage();environmentContext&&messages.push(environmentContext);let userContent=[{type:"text",text:expandedText}];currentImages&&userContent.push(...currentImages),messages.push({role:"user",content:userContent,timestamp:Date.now(),...clientMessageIdentity(options)}),consumedNextTurnMessages=this._pendingNextTurnMessages,this._pendingNextTurnMessages=[];for(let msg of consumedNextTurnMessages)messages.push(msg);this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();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,void 0,options?.onQueuedInput),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}}_rejectUnknownCommand(text2){if(commandShapedName(text2)===void 0)return;let promptCommands=new Set([...this._extensionRunner.getRegisteredCommands().map(command=>command.invocationName),...this.promptTemplates.map(template=>template.name),...this.resourceLoader.getSkills().skills.map(skill=>`skill:${skill.name}`)]),interactiveCommands=new Set(BUILTIN_SLASH_COMMANDS.map(command=>command.name)),rejection=findUnknownCommand(text2,{promptCommands,interactiveCommands});if(rejection)throw rejection}_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 maxExpansions=this.settingsManager.getMaxSkillExpansionsPerPrompt(),expandedSkillNames=new Set,skillBlocks=[],invocationMetadata=[],removedTokens=[],unloadedTokens=new Set,skippedSkillNames=[];for(let token of invocationTokens){let skill=skills.find(candidate=>candidate.name===token.name);if(!skill){if(token.position==="leading")break;continue}if(expandedSkillNames.has(skill.name)){removedTokens.push(token),this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:`Skipped duplicate skill invocation: ${skill.name}`});continue}if(skillBlocks.length>=maxExpansions){removedTokens.push(token),unloadedTokens.add(token),skippedSkillNames.includes(skill.name)||skippedSkillNames.push(skill.name);continue}removedTokens.push(token);try{let content=readFileSync49(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(skippedSkillNames.length>0){let count=skippedSkillNames.length;this._extensionRunner.emitError({extensionPath:"skill:expansion",event:"skill_expansion",error:`Skipped ${count} skill${count===1?"":"s"} (${skippedSkillNames.join(", ")}): at most ${maxExpansions} skills load per prompt. Raise maxSkillExpansionsPerPrompt to load more.`})}if(skillBlocks.length===0)return text2;let userRequest=removeSkillInvocationTokens(text2,removedTokens,unloadedTokens);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"handled";let expandedText=this._expandSkillCommand(processedInput.text),templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);return expandedText=templateExpansion.text,behavior==="steer"?await this._queueSteer(expandedText,processedInput.images,options):await this._queueFollowUp(expandedText,processedInput.images,options),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"}}),"queued"}async steer(text2,images,options){return this._queueUserInput(text2,images,"steer",options)}async followUp(text2,images,options){return 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;this._sessionLogger.debug("session_title_failed",{error:error2 instanceof Error?error2.message:String(error2)})}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,options){this._enqueuePreparedInput({...options,text:text2,images,mode:"steer"})}async _queueFollowUp(text2,images,options){this._enqueuePreparedInput({...options,text:text2,images,mode:"followUp"})}async restoreQueuedInput(input){this._enqueuePreparedInput(input)}_enqueuePreparedInput(input){let enqueueOrder=input.enqueueOrder??this.reserveQueuedInputOrder(),prepared={...clientMessageIdentity(input),text:input.text,images:input.images,mode:input.mode,enqueueOrder};input.onQueuedInput?.(prepared);let queue=input.mode==="steer"?this._steeringMessages:this._followUpMessages;queue.push(input.text),this._recordQueuedInput(input.text,input.mode,prepared),this._sessionLogger.debug("queue_enqueue",{mode:input.mode,count:queue.length}),this._emitQueueUpdate();let message={role:"user",content:[{type:"text",text:input.text},...input.images??[]],timestamp:Date.now(),...clientMessageIdentity(input)};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){(input.mode==="steer"?this._postCompactionDeferredSteeringMessages:this._postCompactionDeferredFollowUpMessages).push(message);return}switch(input.mode){case"steer":this.agent.steer(message);break;case"followUp":this.agent.followUp(message);break}}_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 environmentContext=this._pendingEnvironmentContextMessage(),messages=environmentContext?[environmentContext,appMessage]:[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"),this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(contentText(appMessage.content,""),void 0,this._baseSystemPrompt,this._baseSystemPromptOptions,{trigger:deliveryIdOf(appMessage)===void 0?"extension":"delivery"});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?.()}}_pendingEnvironmentContextMessage(){if(this._environmentContextEnabled)return environmentContextMessageIfChanged(this.agent.state.messages,resolveEnvironmentContext(this._cwd))}_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(resolve46=>{resolveBindingPromptReadiness=resolve46});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(`
2590
+ `),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,options){let order=options?.enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order),this._queuedInputOrder.push({text:text2,mode,enqueueOrder:order,...clientMessageIdentity(options)})}_removeQueuedInput(text2,mode,clientMessageId){let index=this._queuedInputOrder.findIndex(message=>clientMessageId===void 0?message.mode===mode&&message.text===text2:message.clientMessageId===clientMessageId);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.externalAdmission.dropQueued(),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}getQueuedInputs(){return[...this._queuedInputOrder].sort((left,right)=>left.enqueueOrder-right.enqueueOrder)}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(),this._isBeforeSettle&&(this._abortDuringBeforeSettle=!0),await this._abortActiveAgentAndRetry("user"),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source2){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source:source2,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)}get pendingModelSwitch(){return this._pendingModelSwitch}_projectSwitchDeferral(model,liveContextTokens){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings();if(!compaction.enabled||this._modelSwitchAdmission()!=="switch")return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction,includeSpeculationLead:!1,admission:"switch"});return projection.verdict==="fits-after-compaction"?projection:void 0}_admitSwitchCompactionRequired(model,projection,persistDefault){let pending=createPendingModelSwitch({model,projection,persistDefault});this._pendingModelSwitch=pending,this._emit({type:"model_change_pending",model,contextWindow:projection.contextWindow,liveContextTokens:projection.liveContextTokens,requiredTokens:projection.requiredTokens,shortfallTokens:projection.shortfallTokens,notice:pending.notice})}_reduceForSwitchTarget(model,liveContextTokens){if(!this._getCompactionSettings().enabled)return liveContextTokens;let projection=this._projectSwitchFit(model);if(projection.usable||projection.verdict!=="fits-after-compaction")return liveContextTokens;let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});return plan?(this.applyResumeSlice(plan),this._projectSwitchFit(model).liveContextTokens):liveContextTokens}_projectSwitchFit(model){let liveContextTokens=this.sessionManager.buildSessionContext().messages.reduce((total,message)=>total+estimateTokens2(message),0);return projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:!1,admission:"switch"})}async _applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason){let pending=this._pendingModelSwitch;if(pending===void 0)return!1;if(!this.model)throw new RequiredCompactionError;await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,!1,!1,pendingSwitchKeepRecentTokens(pending.projection));let projection=this._projectSwitchFit(pending.model);if(!projection.usable){let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});plan&&(this.applyResumeSlice(plan),projection=this._projectSwitchFit(pending.model))}if(this._pendingModelSwitch=void 0,!projection.usable){let error2=new ModelUsabilityBudgetError(projection);throw this._recordRejectedModelChange(pending.model,error2),error2}return await this._switchActiveModel(pending.model,{persistDefault:pending.persistDefault,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0,allowDeferral:!1}),!0}_resumeRequirementStillBlocks(model,settings){let currentContext=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;return!projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:currentContext,compaction:settings,includeSpeculationLead:!1,admission:"resume"}).usable}_clearResumeCompactionRequirementIfFits(){let model=this.model;this._resumeCompactionRequirement===void 0||!model||this._resumeRequirementStillBlocks(model,this._getCompactionSettings(model))||(this._resumeCompactionRequirement=void 0)}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){let admission=this._modelSwitchAdmission();try{this.assertModelUsable(model,liveContextTokens,{admission,includeSpeculationLead:admission==="start"})}catch(error2){throw this._recordRejectedModelChange(model,error2),error2}}async _setModel(model,updateGlobalDefaults){let liveContextTokens=this._getDownswitchLiveContextTokens(model),deferral=this._projectSwitchDeferral(model,liveContextTokens);if(deferral===void 0&&this._assertModelUsableForSwitch(model,liveContextTokens),!await this._modelRuntime.checkAuth(model.provider)){let error2=new Error(`No API key for ${model.provider}/${model.id}`);throw this._recordRejectedModelChange(model,error2),error2}if(deferral!==void 0){this._admitSwitchCompactionRequired(model,deferral,updateGlobalDefaults);return}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),await this._retryFallback.rerouteAroundOpenCircuit()}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),previousReasoningBaseline=this.agent.state.reasoningBaseline,previousAbortServerSideFallback=this.agent.abortServerSideFallback;this.agent.state.model=model,supportsConfigurationUpdate(model)||(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;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,deferral=opts.allowDeferral===!1?void 0:this._projectSwitchDeferral(model,liveContextTokens);if(deferral!==void 0){previousModel&&(this.agent.state.model=previousModel),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,this._admitSwitchCompactionRequired(model,deferral,opts.persistDefault);return}let admittedLiveContextTokens=opts.repairWithSlice?this._reduceForSwitchTarget(model,liveContextTokens):liveContextTokens;return this._assertModelUsableForSwitch(model,admittedLiveContextTokens),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._pendingModelSwitch=void 0,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;if(onlyAlternative){let onlyLiveContextTokens=this._getDownswitchLiveContextTokens(onlyAlternative.model),onlyDeferral=this._projectSwitchDeferral(onlyAlternative.model,onlyLiveContextTokens);onlyDeferral!==void 0?this._admitSwitchCompactionRequired(onlyAlternative.model,onlyDeferral,!0):this._assertModelUsableForSwitch(onlyAlternative.model,onlyLiveContextTokens)}return{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model),cycleDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(cycleDeferral!==void 0)return this._admitSwitchCompactionRequired(next.model,cycleDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};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"),postHookDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(postHookDeferral!==void 0)return currentModel&&(this.agent.state.model=currentModel),this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(next.model,postHookDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),this.sessionManager.appendModelChange(next.model.provider,next.model.id),this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._pendingModelSwitch=void 0,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!==void 0&&supportsConfigurationUpdate(model)&&(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?getSupportedThinkingLevels2(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??=model.defaultThinkingLevel,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,getSupportedThinkingLevels2(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(source2){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source2);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source2,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source2)&&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,thinkingLevel){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&&isDeepStrictEqual4(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&&isDeepStrictEqual4(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,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=randomUUID15(),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=randomUUID15(),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",this._clearResumeCompactionRequirementIfFits(),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:randomUUID15();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._clearResumeCompactionRequirementIfFits(),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=randomUUID15();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??randomUUID15(),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(),resolvedSettings=this._getCompactionSettings(),settings=cursorOverflowCompactionSettings(request2.keepRecentTokensOverride===void 0?resolvedSettings:{...resolvedSettings,keepRecentTokens:request2.keepRecentTokensOverride},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,thinkingLevel}=await this._getCompactionRequestAuth(compactionModel);compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason,thinkingLevel)}}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)&&currentMessagesAtCheck.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!==void 0&&supportsConfigurationUpdate(modelAfterCompaction)&&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-${randomUUID15()}`,parentId:currentLeaf.id,timestamp:new Date().toISOString(),summary:compactionResult.summary,firstKeptEntryId:compactionResult.firstKeptEntryId,tokensBefore:compactionResult.tokensBefore,details:compactionResult.details,fromHook:fromExtension},simulatedMessages=buildSessionContext2([...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}_stripTrailingFailedAssistants(){let messages=this.agent.state.messages,end=messages.length;for(;end>0;){let candidate=messages[end-1];if(candidate?.role!=="assistant")break;let stopReason=candidate.stopReason;if(stopReason!=="error"&&stopReason!=="length")break;end-=1}let stripped=messages.length-end;return stripped>0&&(this.agent.state.messages=messages.slice(0,end),this._incrementMessageRevision()),stripped}_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._pendingModelSwitch!==void 0)return await this._applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason);if(this._resumeCompactionRequirement!==void 0){if(!model)throw new RequiredCompactionError;if(this._resumeRequirementStillBlocks(model,settings)){if(!await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))throw new RequiredCompactionError;if(this._resumeRequirementStillBlocks(model,settings))throw new RequiredCompactionError;return this._resumeCompactionRequirement=void 0,!0}this._resumeCompactionRequirement=void 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;let limitsModel=this._limitsModel();if(!settings.enabled||!limitsModel||isVirtualModel(limitsModel)&&limitsModel.contextWindow<=0||!shouldCompact2(contextTokens,limitsModel.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._limitsModel();if(!model||isVirtualModel(model)&&model.contextWindow<=0)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 limitsModel=this.model&&isVirtualModel(this.model)?this._modelRuntime.getPhysicalModel(assistantMessage.provider,assistantMessage.model):this.model,sameModel=limitsModel&&isSameOverflowSource(assistantMessage,limitsModel,this._modelRuntime.getCompatibilityRequestConfig(limitsModel).upstreamModelId),contextWindow=(limitsModel??this.model)?.contextWindow??0,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),branch=this.sessionManager.getBranch(),projection,buildProjection=()=>projection??=this.sessionManager.buildSessionProjection(),usageScope=resolveAssistantUsageScope(branch,buildProjection,this._findPersistedMessageEntryId(assistantMessage)),overflowEvidenceApplies=assistantMessage.stopReason==="error"?usageScope.retainedForExplicitRecovery:usageScope.usageMatchesProjection,recoverableLength=inlineReason!=="threshold"&&sameModel&&usageScope.projected&&isRecoverableLength(assistantMessage,limitsModel?.maxTokens??0),isOverflow=overflowEvidenceApplies&&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(inlineReason==="pre_prompt"&&(this._overflowRecoveryRungs=0),this._overflowRecoveryRungs>=OVERFLOW_RECOVERY_RUNGS){let errorMessage8=OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE;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._overflowRecoveryRungs+=1;let keepRecentTokensOverride=this._overflowRecoveryRungs>=2?0:void 0,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,!1,keepRecentTokensOverride):keepRecentTokensOverride===void 0?await this._runAutoCompaction("overflow",willRetry):await this._runAutoCompaction("overflow",willRetry,{keepRecentTokensOverride});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&&willRetry&&(this._failedResponse=assistantMessage),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(!usageScope.usageMatchesProjection)contextTokens=estimateProjectedContextTokens(buildProjection(),branch).tokens;else 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,keepRecentTokensOverride){if(!(reason==="overflow"&&willRetry)&&this._isCompactionDelegated())return!1;let controller=new AbortController,requestId=randomUUID15();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,keepRecentTokensOverride});return!execution.accepted&&lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryRungs=0),execution.accepted}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryRungs=0);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":(this._promptOwnsRun||this._transcriptWriteFailures.startRun(),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()}_reportContinuationTranscriptFailure(){let failure2=this._transcriptWriteFailures.takeReport();if(!failure2)return;let message=failure2.error instanceof Error?failure2.error.message:String(failure2.error);this._emit({type:"continuation_error",errorMessage:`The session file did not save this run: ${message}`})}_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,options={}){if(!(reason==="overflow"&&willRetry)&&this._isCompactionDelegated())return!1;let{keepRecentTokensOverride}=options,model=this.model,finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=this.agent.state.messages.slice(),autoCompactionController=new AbortController,requestId=randomUUID15();this._claimCompactionController(autoCompactionController,"auto");let endBeforeExecution=()=>(this._emit({type:"compaction_start",reason,requestId}),endStarted()),endStarted=()=>(reason==="overflow"&&this._autoCompactionAbortController===autoCompactionController&&(this._overflowRecoveryRungs=0),this._autoCompactionAbortController!==autoCompactionController||this._emit({type:"compaction_end",reason,result:void 0,aborted:autoCompactionController.signal.aborted,willRetry:!1,requestId}),!1),isSuperseded=()=>this._autoCompactionAbortController!==autoCompactionController;try{if(!this.model)return endBeforeExecution();try{await this._modelRuntime.getAuth(this.model,{signal:autoCompactionController.signal})}catch(error2){if(isSuperseded())return!1;if(autoCompactionController.signal.aborted)return endBeforeExecution();if(this._emit({type:"compaction_start",reason,requestId}),isSuperseded())return!1;throw new CompactionExecutionError(error2,!0,!1)}if(isSuperseded())return!1;if(autoCompactionController.signal.aborted)return endBeforeExecution();let resolvedSettings=this._getCompactionSettings(model);return prepareCompaction2(this.sessionManager.getBranch(),cursorOverflowCompactionSettings(keepRecentTokensOverride===void 0?resolvedSettings:{...resolvedSettings,keepRecentTokens:keepRecentTokensOverride},model?.provider,reason),reason==="overflow")?(this._emit({type:"compaction_start",reason,requestId}),isSuperseded()?!1:autoCompactionController.signal.aborted?endStarted():(await this._executeCompaction({controller:autoCompactionController,owner:"auto",reason,requestId,willRetry,agentMessagesAtStart,keepRecentTokensOverride})).accepted?(this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),willRetry?(this._stripTrailingFailedAssistants(),this._scheduleContinuationAfterCurrentEvent(),!0):this.pendingMessageCount>0?(this._scheduleContinuationAfterCurrentEvent(),!0):this.agent.hasQueuedMessages()?(this._scheduleContinuationAfterCurrentEvent(),!0):!1):(reason==="overflow"&&(this._overflowRecoveryRungs=0),!1)):endBeforeExecution()}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;reason==="overflow"&&(this._overflowRecoveryRungs=0);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(),settleSessionStart=this._beginSessionStartSettlement(),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(),Promise.allSettled(bindingPromptReadiness).then(settleSessionStart)}await Promise.all(bindingPromptReadiness)}_beginSessionStartSettlement(){let settle;return this._sessionStartSettled=new Promise(resolve46=>{settle=resolve46}),settle}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._toolDeclarationNames(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,label3)=>{this.sessionManager.appendLabelChange(entryId,label3)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),getSettings:()=>this.settingsManager.getSettings(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivation.register(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),sessionControl:createSessionControlActions({admission:this.externalAdmission,sessionManager:this.sessionManager,host:()=>this._controlEndpointHost})},{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:(source2="user")=>{if(source2==="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=randomUUID15();(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,getPromptCachePrefixRequest:options=>this._promptCachePrefixBuilds.build({agent:this.agent,runner:this._extensionRunner,modelRuntime:this._modelRuntime,ready:this._sessionStartSettled,getServiceTier:()=>this.effectiveServiceTier,getBaseSystemPrompt:()=>this._baseSystemPrompt,getBaseSystemPromptOptions:()=>this._baseSystemPromptOptions},options),executeTool:(callerId,name,args,options)=>this._executeNestedToolCall(callerId,name,args,options),getCallableTools:()=>this._getCallableTools()},{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()},registerVirtualModel:definition=>{this._modelRuntime.registerVirtualModel(definition),this._refreshCurrentModelFromRegistry()},unregisterVirtualModel:(provider,id)=>{this._modelRuntime.unregisterVirtualModel(provider,id),this._refreshCurrentModelFromRegistry()}}),this._bindToolSearchRemovedHints()}get fallbackValidationWarnings(){return this._fallbackValidationWarnings}_isBuiltinExtensionPath(path13){return path13.startsWith("<builtin:")||path13.startsWith(BUILTIN_PATH_PREFIX)||/[\\/]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_PATH_PREFIX}${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_PATH_PREFIX}${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=>this._isActivatedOnRegistration(name),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)});for(let name of options?.addedToolNames??[])isAllowedTool(name)&&nextActiveToolNames.push(name);if(allowedToolNames)for(let toolName of this._toolRegistry.keys())allowedToolNames.has(toolName)&&this._getToolExposure(toolName)!=="hidden"&&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)])}_getToolExposure(name){let entry=this._toolDefinitions.get(name);return entry?normalizeToolExposure(entry.definition).exposure:"direct"}_isActivatedOnRegistration(name){let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return(exposure==="direct"||exposure==="eval"||exposure==="model-only")&&entry.definition.defaultActive!==!1}_buildRuntime(options){this._delegatedCompactionKey=void 0,this._lazyToolActivation.reset();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._adoptToolSearchService(extensionsResult.runtime),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,addedToolNames:options.addedToolNames})}async reload(options){let veto=await this.checkReloadVeto();if(veto.cancelled)return veto;if(this._promptStartPending)return this.checkReloadVeto();let finishReloadWork=this._sessionWorkBarrier.begin();try{return await this._rebuildRuntimeForReload(options)}finally{finishReloadWork()}}async _rebuildRuntimeForReload(options){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");let previousDefaultTools=new Set(this._usesDefaultTools?this.settingsManager.getDefaultTools()??DEFAULT_TOOL_NAMES:[]);await this.settingsManager.reload(),this._delegatedCompactionKey=void 0;let addedDefaultTools=(this._usesDefaultTools?this.settingsManager.getDefaultTools()??DEFAULT_TOOL_NAMES:[]).filter(name=>!previousDefaultTools.has(name));this._defaultToolNames&&addedDefaultTools.length>0&&(this._defaultToolNames=new Set([...this._defaultToolNames,...addedDefaultTools]));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,addedToolNames:addedDefaultTools})}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")}if(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener){let settleSessionStart=this._beginSessionStartSettlement();try{await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")}finally{settleSessionStart()}}return time("lifecycle","reload"),{cancelled:!1}}async checkReloadVeto(){return checkSessionReloadVeto(this._extensionRunner,()=>this._promptStartPending)}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||isContextOverflow(message,(this._modelForMessage(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!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID?!1:this._isClaudeSdkSessionLockError(message)||this._isClaudeSdkInvalidRequestError(message)}_isClaudeSdkAuthMissError(message){return this.model?.provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&message.errorMessage===providerNotConfiguredMessage(ANTHROPIC_SUBSCRIPTION_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(){return this._toolSearchService?.takeNativeInjectionFailure()??null}_getProviderRetryDelayMs(errorMessage8){let markerMs=parseRetryAfterMsMarker(errorMessage8);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage8})}_summarizationRetryCallbacks(source2){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",...source2})},onRetryFinished:()=>{this._emit({type:"summarization_retry_finished"})}}}_terminalFailureText(message,attempts){let model=this.model?`${this.model.provider}/${this.model.id}`:void 0;return describeProviderFailureForUser(message.errorMessage,{attempts,model,recovery:this._retryFallback.hasConfiguredChain()?"chain-exhausted":"no-fallback-configured"})??(message.errorMessage===void 0?void 0:stripTurnRetrySuppressionPrefix(message.errorMessage))}_degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8){let settings=this.settingsManager.getRetrySettings(),turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,hintSettings=this.settingsManager.getHintPolicySettings(),finishRetryAttempt=(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);finishRetryAttempt(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){finishRetryAttempt(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(resolve46=>{this._retryResolve=resolve46}));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 if(this._isCircuitProbeOnCurrentModel()&&this._retryFallback.canTryFallback()){if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),!switchedFallback)return this._resolveRetry(),"not-handled";this._retryAttempt=1}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._failedResponse=message,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}
2608
2591
  ${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 rm13(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 editUserMessage(entryId,text2,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedUserLeaf(options.expectedLeafId,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new UserEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="user")throw new UserEditError("not-user",`Entry ${entryId} is not a user message`);let replacement=buildEditedUserMessage(targetEntry.message,text2);return userTextEquals(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),options.summarize&&!this.model)throw new Error("No model available for summarization");let targetEntry=this.sessionManager.getEntry(targetId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${targetId} not found`);let{entries:entriesToSummarize,commonAncestorId}=collectEntriesForBranchSummary2(this.sessionManager,oldLeafId,targetId),customInstructions=options.customInstructions,replaceInstructions=options.replaceInstructions,label3=options.label,preparation={targetId,oldLeafId,commonAncestorId,entriesToSummarize,userWantsSummary:options.summarize??!1,customInstructions,replaceInstructions,label:label3};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&&(label3=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 resume=options.intent==="resume"&&!replacement,newLeafId,editorText;replacement?newLeafId=targetEntry.parentId:resume?newLeafId=targetId: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),label3&&this.sessionManager.appendLabelChange(summaryId,label3)}else newLeafId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(newLeafId);let editedEntryId=replacement?this.sessionManager.appendMessage(replacement):void 0;return label3&&!summaryText&&this.sessionManager.appendLabelChange(editedEntryId??targetId,label3),resume&&(summaryText||label3)&&this.sessionManager.branch(targetId),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}),resume&&this.sessionManager.getLeafId()!==targetId&&(this.sessionManager.branch(targetId),this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),{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()){entry.type==="usage"?addUsageToTotals(usageTotals,entry.usage):(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&addUsageToTotals(usageTotals,entry.usage);let prewarmUsage=getPromptCachePrewarmUsage(entry);if(prewarmUsage&&addUsageToTotals(usageTotals,prewarmUsage),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(),failures:computeSessionFailureReport(this.sessionManager.getEntries())}}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._limitsModel(),runtimeMessages=this.messages,key={messages:runtimeMessages,length:runtimeMessages.length,last:runtimeMessages.at(-1),lastFingerprint:messageFingerprint(runtimeMessages.at(-1)),leafId:this.sessionManager.getLeafId(),contextWindow:model?.contextWindow},cached=this._contextUsageCache;if(cached!==void 0&&cached.key.messages===key.messages&&cached.key.length===key.length&&cached.key.last===key.last&&cached.key.lastFingerprint===key.lastFingerprint&&cached.key.leafId===key.leafId&&cached.key.contextWindow===key.contextWindow)return cached.usage;let usage3=this._computeContextUsage(model);return this._contextUsageCache={key,usage:usage3},usage3}_computeContextUsage(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=branchEntries.some(entry=>entry.type==="context_edit")?estimateProjectedContextTokens(this.sessionManager.buildSessionProjection(),branchEntries):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=dirname52(filePath);existsSync51(dir)||mkdirSync28(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 writeFileSync27(filePath,`${lines.join(`
2609
2592
  `)}
2610
2593
  `),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 messageFingerprint(message){if(message===void 0)return"";let content=message.content,size=0;if(typeof content=="string")size=content.length;else if(Array.isArray(content))for(let part of content)size+=1,typeof part.text=="string"&&(size+=part.text.length),typeof part.thinking=="string"&&(size+=part.thinking.length);let usage3=message.usage;return`${size}:${usage3?.input??""}:${usage3?.output??""}:${usage3?.totalTokens??""}`}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==="usage"&&entry.kind==="cache_warm"){let promptTokens=entry.usage.input+entry.usage.cacheRead+entry.usage.cacheWrite;promptTokens>0&&(prev={promptTokens,modelKey:`${entry.provider}/${entry.model}`,timestamp:Date.parse(entry.timestamp),reportedCache:!0})}else 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}}var MAX_AGE=10080*60*1e3;function normalizeStackPath(value2){return value2.replace(/\\/g,"/").replace(/\/+$/u,"")}function stackContainsPath(stack,targetPath,includeDescendants){let target=normalizeStackPath(targetPath);if(!target||isSyntheticPath(target))return!1;let caseInsensitive=/^[a-z]:\//iu.test(target),haystack=caseInsensitive?stack.toLowerCase():stack,needle=caseInsensitive?target.toLowerCase():target;if(includeDescendants)return haystack.includes(`${needle}/`);let index=haystack.indexOf(needle);for(;index!==-1;){let next=haystack[index+needle.length];if(next===void 0||next===":"||next===")"||/\s/u.test(next))return!0;index=haystack.indexOf(needle,index+needle.length)}return!1}function findExtensionStackMatches(stack,extensions){if(!stack)return[];let normalizedStack=stack.split(`
@@ -2753,4 +2736,4 @@ ${theme.fg("dim","Cache Re-billed:")} ${detail}`}}return info+=formatSessionFail
2753
2736
  |-----|--------|
2754
2737
  `;for(let[key,shortcut]of shortcuts){let description=shortcut.description??shortcut.extensionPath,keyDisplay=formatKeyText(key,{capitalize:!0});hotkeys+=`| \`${keyDisplay}\` | ${description} |
2755
2738
  `}}this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DynamicBorder),this.chatContainer.addChild(new ThemedText(()=>theme.bold(theme.fg("accent","Keyboard Shortcuts")),1,0)),this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Markdown(hotkeys.trim(),1,1,this.getMarkdownThemeWithSettings())),this.chatContainer.addChild(new DynamicBorder),this.ui.requestRender()}async handleClearCommand(){this.clearStatusIndicator();try{if((await this.runtimeHost.newSession()).cancelled)return;this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("accent","\u2713 New session started"),1,1)),this.ui.requestRender()}catch(error2){await this.handleFatalRuntimeError("Failed to create session",error2)}}handleDebugCommand(){let width=this.ui.terminal.columns,height=this.ui.terminal.rows,allLines=this.ui.render(width),debugLogPath=getDebugLogPath(),debugData=[`Debug output at ${new Date().toISOString()}`,`Terminal: ${width}x${height}`,`Total lines: ${allLines.length}`,"","=== All rendered lines with visible widths ===",...allLines.map((line,idx)=>{let vw=visibleWidth(line),escaped=JSON.stringify(line);return`[${idx}] (w=${vw}) ${escaped}`}),"","=== Agent messages (JSONL) ===",...this.session.messages.map(msg=>JSON.stringify(msg)),""].join(`
2756
- `);fs6.mkdirSync(path12.dirname(debugLogPath),{recursive:!0}),fs6.writeFileSync(debugLogPath,debugData),this.showNoticeBox({title:"\u2713 Debug log written",tone:"success",why:debugLogPath})}handleArminSaysHi(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ArminComponent(this.ui)),this.ui.requestRender()}handleDementedDelves(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new EarendilAnnouncementComponent),this.ui.requestRender()}handleDaxnuts(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DaxnutsComponent(this.ui)),this.ui.requestRender()}checkDaxnutsEasterEgg(model){model.provider==="opencode"&&model.id.toLowerCase().includes("kimi-k2.5")&&this.handleDaxnuts()}async handleBashCommand(command,excludeFromContext=!1){let extensionRunner=this.session.extensionRunner,eventResult;try{eventResult=await extensionRunner.emitUserBash({type:"user_bash",command,excludeFromContext,cwd:this.sessionManager.getCwd()})}catch{return}if(eventResult?.result){let result3=eventResult.result;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),this.session.isStreaming?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),result3.output&&this.bashComponent.appendOutput(result3.output),this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath),this.session.recordBashResult(command,result3,{excludeFromContext}),this.bashComponent=void 0,this.ui.requestRender();return}let isDeferred=this.session.isStreaming;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),isDeferred?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),this.ui.requestRender();try{let result3=await this.session.executeBash(command,chunk=>{this.bashComponent&&(this.bashComponent.appendOutput(chunk),this.ui.requestRender())},{excludeFromContext,operations:eventResult?.operations});this.bashComponent&&this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath)}catch(error2){this.bashComponent&&this.bashComponent.setComplete(void 0,!1),this.showError(`Bash command failed: ${error2 instanceof Error?error2.message:"Unknown error"}`)}this.bashComponent=void 0,this.ui.requestRender()}async handleCompactCommand(customInstructions){if(this.sessionManager.getEntries().filter(e=>e.type==="message").length<2){this.showWarning("Nothing to compact (no messages yet)");return}this.clearStatusIndicator();try{await this.session.compact(customInstructions)}catch{}}stop(options){let fullscreenExitOutput=typeof options=="string"?options:void 0,restoreStderr2=typeof options=="string"||options?.restoreStderr!==!1;if(_InteractiveMode.restoreCompactionEscapeOverride(this),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.disposeActiveSelector(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!1),this.clearStatusIndicator(),this.clearPendingTools(),this.stopChatToolAnimations(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.themeController.disableAutoSync(),this.clearExtensionTerminalInputListeners(),this.footer.dispose(),this.footerDataProvider.dispose(),this.unsubscribe&&this.unsubscribe(),this.isInitialized)try{this.stopInteractiveTui(fullscreenExitOutput??this.settingsManager.getFullscreenExitOutput())}finally{this.isInitialized=!1,restoreStderr2&&restoreInteractiveStderr()}else restoreStderr2&&restoreInteractiveStderr();this.unregisterSignalHandlers()}};export{defaultModelPerProvider,resolveModelScopeWithDiagnostics,resolveCliModel,AuthStorage,readStoredCredential,VIRTUAL_MODEL_STATE_ENTRY,CredentialSynchronizationError,ModelRuntime,convertToLlm2 as convertToLlm,CURRENT_SESSION_VERSION,assertValidSessionId,migrateSessionEntries,parseSessionEntries,getLatestCompactionEntry,sessionEntryToContextMessages2 as sessionEntryToContextMessages,buildContextEntries2 as buildContextEntries,buildSessionProjection,buildSessionContext2 as buildSessionContext,loadEntriesFromFile,SessionManager,LEGACY_PI_CONFIG_FILES,importLegacyPiConfig,createProjectTrustContext,ProviderScope,runWithProviderScope,bindToProviderScope,createEventBus,goalStoreRef,kernelToolsStorage,parseFrontmatter3 as parseFrontmatter,stripFrontmatter,convertToPng,resizeImage,formatDimensionNote,DEFAULT_MAX_LINES2 as DEFAULT_MAX_LINES,DEFAULT_MAX_BYTES3 as DEFAULT_MAX_BYTES,formatSize2 as formatSize,truncateHead2 as truncateHead,truncateTail2 as truncateTail,truncateLine2 as truncateLine,DEFAULT_COMPACTION_SETTINGS2 as DEFAULT_COMPACTION_SETTINGS,withFileMutationQueue2 as withFileMutationQueue,SESSION_CONTROL_DELIVERY_TYPE,isSessionControlDeliveryDetails,defineTool,isBashToolResult,isPowerShellToolResult,isReadToolResult,isEditToolResult,isWriteToolResult,isGrepToolResult,isFindToolResult,isLsToolResult,isToolCallEventType,EMPTY_SESSION_CONTEXT,serializeConversation2 as serializeConversation,compact2 as compact,calculateContextTokens2 as calculateContextTokens,getLastAssistantUsage2 as getLastAssistantUsage,shouldCompact2 as shouldCompact,estimateTokens2 as estimateTokens,findTurnStartIndex2 as findTurnStartIndex,findCutPoint2 as findCutPoint,generateSummary2 as generateSummary,generateSummaryWithUsage2 as generateSummaryWithUsage,collectEntriesForBranchSummary2 as collectEntriesForBranchSummary,prepareBranchEntries2 as prepareBranchEntries,generateBranchSummary2 as generateBranchSummary,loadSkillsFromDir,formatSkillsForPrompt,loadSkills2 as loadSkills,wrapRegisteredTool,wrapRegisteredTools,ModelRegistry,parseSkillBlock,truncateToVisualLines,createLocalBashOperations,createBashToolDefinition,createBashTool2 as createBashTool,generateUnifiedPatch2 as generateUnifiedPatch,generateDiffString2 as generateDiffString,createEditToolDefinition,createEditTool2 as createEditTool,createFindToolDefinition,createFindTool,createGrepToolDefinition,createGrepTool,createLsToolDefinition,createLsTool,createPowerShellTool,detectSupportedImageMimeTypeFromFile,registerReadClassifier,classifyRead,createReadToolDefinition,createReadTool2 as createReadTool,createWriteToolDefinition,createWriteTool2 as createWriteTool,createCodingTools,createReadOnlyTools,AgentSession,buildNoticeBox,noticeMessageRenderer,noticeEntryRenderer,readOwnFootprint,readProcessFootprint,createPendingQuestion,readGoal,createGoal,updateGoal,clearGoal,GOAL_STORE_CHANGED_EVENT,resolveAuthMode,loadMcpConfig,HostMcpRegistry,getMcpService,ACCEPT_EDITS_PERMISSION_PRESET_CAPABILITY,copyToClipboard,isBuiltinExtension,loadProjectContextFiles,DefaultResourceLoader,createAgentSessionServices,createAgentSessionFromServices,AgentSessionRuntime,createAgentSessionRuntime,createAgentSession,createWebViewBroker,connectWebViewService,ArminComponent,formatProviderNativeSummary,formatProviderNativeBody,AssistantMessageComponent,BashExecutionComponent,BorderedLoader,BranchSummaryMessageComponent,CompactionSummaryMessageComponent,CustomEditor,CustomMessageComponent,ToolExecutionComponent,ExtensionEditorComponent,FooterComponent,LoginDialogComponent,ModelSelectorComponent,OAuthSelectorComponent,SettingsSelectorComponent,SkillInvocationMessageComponent,ThinkingSelectorComponent,TreeSelectorComponent,UserMessageComponent,UserMessageSelectorComponent,createInteractiveTui,createInteractiveTuiReference,shouldShowRetryIndicator,formatCrashExtensionHint,formatResumeCommand,showsStartupHeader,showsStartupDetails,OptimisticUserEchoController,InteractiveMode,runPrintMode,RpcTransportGoneError,isTransportGoneError,RpcClientOpenInFlightError,RpcClient,renderDiff,ShowImagesSelectorComponent,ThemeSelectorComponent,startHostChildReaper,collectOrphanedChildren,createExtensionRuntime,discoverAndLoadExtensions,ExtensionRunner,resolveProjectTrusted,cleanupWindowsSelfUpdateQuarantine,quarantineWindowsNativeDependencies,main};
2739
+ `);fs6.mkdirSync(path12.dirname(debugLogPath),{recursive:!0}),fs6.writeFileSync(debugLogPath,debugData),this.showNoticeBox({title:"\u2713 Debug log written",tone:"success",why:debugLogPath})}handleArminSaysHi(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ArminComponent(this.ui)),this.ui.requestRender()}handleDementedDelves(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new EarendilAnnouncementComponent),this.ui.requestRender()}handleDaxnuts(){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new DaxnutsComponent(this.ui)),this.ui.requestRender()}checkDaxnutsEasterEgg(model){model.provider==="opencode"&&model.id.toLowerCase().includes("kimi-k2.5")&&this.handleDaxnuts()}async handleBashCommand(command,excludeFromContext=!1){let extensionRunner=this.session.extensionRunner,eventResult;try{eventResult=await extensionRunner.emitUserBash({type:"user_bash",command,excludeFromContext,cwd:this.sessionManager.getCwd()})}catch{return}if(eventResult?.result){let result3=eventResult.result;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),this.session.isStreaming?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),result3.output&&this.bashComponent.appendOutput(result3.output),this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath),this.session.recordBashResult(command,result3,{excludeFromContext}),this.bashComponent=void 0,this.ui.requestRender();return}let isDeferred=this.session.isStreaming;this.bashComponent=new BashExecutionComponent(command,this.ui,excludeFromContext),isDeferred?(this.pendingMessagesContainer.addChild(this.bashComponent),this.pendingBashComponents.push(this.bashComponent)):this.chatContainer.addChild(this.bashComponent),this.ui.requestRender();try{let result3=await this.session.executeBash(command,chunk=>{this.bashComponent&&(this.bashComponent.appendOutput(chunk),this.ui.requestRender())},{excludeFromContext,operations:eventResult?.operations});this.bashComponent&&this.bashComponent.setComplete(result3.exitCode,result3.cancelled,result3.truncated?{truncated:!0,content:result3.output}:void 0,result3.fullOutputPath)}catch(error2){this.bashComponent&&this.bashComponent.setComplete(void 0,!1),this.showError(`Bash command failed: ${error2 instanceof Error?error2.message:"Unknown error"}`)}this.bashComponent=void 0,this.ui.requestRender()}async handleCompactCommand(customInstructions){if(this.sessionManager.getEntries().filter(e=>e.type==="message").length<2){this.showWarning("Nothing to compact (no messages yet)");return}this.clearStatusIndicator();try{await this.session.compact(customInstructions)}catch{}}stop(options){let fullscreenExitOutput=typeof options=="string"?options:void 0,restoreStderr2=typeof options=="string"||options?.restoreStderr!==!1;if(_InteractiveMode.restoreCompactionEscapeOverride(this),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.disposeActiveSelector(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!1),this.clearStatusIndicator(),this.clearPendingTools(),this.stopChatToolAnimations(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.themeController.disableAutoSync(),this.clearExtensionTerminalInputListeners(),this.footer.dispose(),this.footerDataProvider.dispose(),this.unsubscribe&&this.unsubscribe(),this.isInitialized)try{this.stopInteractiveTui(fullscreenExitOutput??this.settingsManager.getFullscreenExitOutput())}finally{this.isInitialized=!1,restoreStderr2&&restoreInteractiveStderr()}else restoreStderr2&&restoreInteractiveStderr();this.unregisterSignalHandlers()}};export{defaultModelPerProvider,resolveModelScopeWithDiagnostics,resolveCliModel,AuthStorage,readStoredCredential,VIRTUAL_MODEL_STATE_ENTRY,CredentialSynchronizationError,ModelRuntime,convertToLlm2 as convertToLlm,CURRENT_SESSION_VERSION,assertValidSessionId,migrateSessionEntries,parseSessionEntries,getLatestCompactionEntry,sessionEntryToContextMessages2 as sessionEntryToContextMessages,buildContextEntries2 as buildContextEntries,buildSessionProjection,buildSessionContext2 as buildSessionContext,loadEntriesFromFile,SessionManager,LEGACY_PI_CONFIG_FILES,importLegacyPiConfig,createProjectTrustContext,ProviderScope,runWithProviderScope,bindToProviderScope,createEventBus,goalStoreRef,kernelToolsStorage,parseFrontmatter3 as parseFrontmatter,stripFrontmatter,convertToPng,resizeImage,formatDimensionNote,DEFAULT_MAX_LINES2 as DEFAULT_MAX_LINES,DEFAULT_MAX_BYTES3 as DEFAULT_MAX_BYTES,formatSize2 as formatSize,truncateHead2 as truncateHead,truncateTail2 as truncateTail,truncateLine2 as truncateLine,DEFAULT_COMPACTION_SETTINGS2 as DEFAULT_COMPACTION_SETTINGS,withFileMutationQueue2 as withFileMutationQueue,SESSION_CONTROL_DELIVERY_TYPE,isSessionControlDeliveryDetails,defineTool,isBashToolResult,isPowerShellToolResult,isReadToolResult,isEditToolResult,isWriteToolResult,isGrepToolResult,isFindToolResult,isLsToolResult,isToolCallEventType,EMPTY_SESSION_CONTEXT,serializeConversation2 as serializeConversation,compact2 as compact,calculateContextTokens2 as calculateContextTokens,getLastAssistantUsage2 as getLastAssistantUsage,shouldCompact2 as shouldCompact,estimateTokens2 as estimateTokens,findTurnStartIndex2 as findTurnStartIndex,findCutPoint2 as findCutPoint,generateSummary2 as generateSummary,generateSummaryWithUsage2 as generateSummaryWithUsage,collectEntriesForBranchSummary2 as collectEntriesForBranchSummary,prepareBranchEntries2 as prepareBranchEntries,generateBranchSummary2 as generateBranchSummary,loadSkillsFromDir,formatSkillsForPrompt,loadSkills2 as loadSkills,wrapRegisteredTool,wrapRegisteredTools,ModelRegistry,truncateToVisualLines,createLocalBashOperations,createBashToolDefinition,createBashTool2 as createBashTool,generateUnifiedPatch2 as generateUnifiedPatch,generateDiffString2 as generateDiffString,createEditToolDefinition,createEditTool2 as createEditTool,createFindToolDefinition,createFindTool,createGrepToolDefinition,createGrepTool,createLsToolDefinition,createLsTool,createPowerShellTool,detectSupportedImageMimeTypeFromFile,registerReadClassifier,classifyRead,createReadToolDefinition,createReadTool2 as createReadTool,createWriteToolDefinition,createWriteTool2 as createWriteTool,createCodingTools,createReadOnlyTools,AgentSession,buildNoticeBox,noticeMessageRenderer,noticeEntryRenderer,readOwnFootprint,readProcessFootprint,createPendingQuestion,readGoal,createGoal,updateGoal,clearGoal,GOAL_STORE_CHANGED_EVENT,resolveAuthMode,loadMcpConfig,HostMcpRegistry,getMcpService,ACCEPT_EDITS_PERMISSION_PRESET_CAPABILITY,copyToClipboard,isBuiltinExtension,loadProjectContextFiles,DefaultResourceLoader,createAgentSessionServices,createAgentSessionFromServices,AgentSessionRuntime,createAgentSessionRuntime,createAgentSession,createWebViewBroker,connectWebViewService,ArminComponent,formatProviderNativeSummary,formatProviderNativeBody,AssistantMessageComponent,BashExecutionComponent,BorderedLoader,BranchSummaryMessageComponent,CompactionSummaryMessageComponent,CustomEditor,CustomMessageComponent,ToolExecutionComponent,ExtensionEditorComponent,FooterComponent,LoginDialogComponent,ModelSelectorComponent,OAuthSelectorComponent,SettingsSelectorComponent,SkillInvocationMessageComponent,ThinkingSelectorComponent,TreeSelectorComponent,UserMessageComponent,UserMessageSelectorComponent,createInteractiveTui,createInteractiveTuiReference,shouldShowRetryIndicator,formatCrashExtensionHint,formatResumeCommand,showsStartupHeader,showsStartupDetails,OptimisticUserEchoController,InteractiveMode,runPrintMode,RpcTransportGoneError,isTransportGoneError,RpcClientOpenInFlightError,RpcClient,renderDiff,ShowImagesSelectorComponent,ThemeSelectorComponent,startHostChildReaper,collectOrphanedChildren,createExtensionRuntime,discoverAndLoadExtensions,ExtensionRunner,resolveProjectTrusted,cleanupWindowsSelfUpdateQuarantine,quarantineWindowsNativeDependencies,main};