@code-yeongyu/senpi 2026.10.10-2 → 2026.10.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.
- package/CHANGELOG.md +20 -0
- package/dist/bundle/chunks/{anthropic-messages-CVXI6CLT.js → anthropic-messages-OE3QBX4P.js} +1 -1
- package/dist/bundle/chunks/{app-server-command-WZG7WYMD.js → app-server-command-DVWM37GF.js} +1 -1
- package/dist/bundle/chunks/{chunk-Q2ZTPMWD.js → chunk-4TK7VCZZ.js} +1 -1
- package/dist/bundle/chunks/{chunk-SB22X6ZR.js → chunk-H4UIUFU5.js} +1 -1
- package/dist/bundle/chunks/chunk-I5HLTDT4.js +2 -0
- package/dist/bundle/chunks/{chunk-W6B7SEAK.js → chunk-MT2C4I5R.js} +17 -16
- package/dist/bundle/chunks/{chunk-LSE7KE2C.js → chunk-ODYQK5XJ.js} +1 -1
- package/dist/bundle/chunks/{chunk-ULYOMGXX.js → chunk-PDSG6VER.js} +1 -1
- package/dist/bundle/chunks/{chunk-3YXB7Z7O.js → chunk-Z7MMKKIY.js} +1 -1
- package/dist/bundle/chunks/{cli-main-T4T5UNRJ.js → cli-main-B4S4DGBX.js} +1 -1
- package/dist/bundle/chunks/{help-fast-path-44VUGB7H.js → help-fast-path-EHRZEBRO.js} +1 -1
- package/dist/bundle/chunks/{host-command-X64D7PT3.js → host-command-VATE7HRG.js} +1 -1
- package/dist/bundle/chunks/{interactive-mode-ULFSI46Z.js → interactive-mode-QOFA64JL.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-VM7WJBC5.js → multi-session-host-E5RDPWQN.js} +1 -1
- package/dist/bundle/chunks/{openai-completions-6HU7GIGD.js → openai-completions-Q2LEWXEC.js} +1 -1
- package/dist/bundle/chunks/{openai-responses-S4QYZXF3.js → openai-responses-DHGWSTZM.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-OAFUQY7E.js → package-manager-cli-YGTWXRG5.js} +1 -1
- package/dist/bundle/chunks/{rotation-stream-ZJQ6I2RZ.js → rotation-stream-C5BM7TMM.js} +1 -1
- package/dist/bundle/chunks/{rpc-mode-XVRJJG3K.js → rpc-mode-HDAGQ4X3.js} +1 -1
- package/dist/bundle/chunks/{session-control-endpoint-FEGOYWHN.js → session-control-endpoint-NABTZHCZ.js} +1 -1
- package/dist/bundle/chunks/{session-picker-R5N2EKUS.js → session-picker-O7OESJWU.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +17 -16
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/bundle/runtime-manifest.json +1 -1
- package/dist/core/agent-session.d.ts +2 -0
- package/dist/core/agent-session.js +18 -4
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +3 -1
- package/dist/core/extensions/builtin/goal/prompt.d.ts +6 -1
- package/dist/core/extensions/builtin/goal/prompt.js +32 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.js +2 -0
- package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/providers/keenable.d.ts +3 -0
- package/dist/core/extensions/builtin/websearch/websearch/providers/keenable.js +55 -0
- package/dist/core/extensions/builtin/websearch/websearch/providers.js +2 -0
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +1 -1
- package/dist/core/model-config-schema.d.ts +5 -0
- package/dist/core/model-config-schema.js +1 -0
- package/dist/core/provider-composer.js +5 -1
- package/dist/core/provider-timeout-retry.d.ts +7 -1
- package/dist/core/provider-timeout-retry.js +23 -12
- package/dist/core/reload-veto.d.ts +1 -1
- package/dist/core/reload-veto.js +7 -1
- package/docs/models.md +34 -0
- package/docs/web-search.md +3 -1
- package/package.json +6 -6
- package/dist/bundle/chunks/chunk-YSPHACIN.js +0 -2
|
@@ -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,CONTINUE_FROM_LEAF_CUSTOM_TYPE,CONTINUE_FROM_LEAF_DIRECTIVE,ContinueFromLeafError,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,RESERVED_MEMORY_REPORT_KEYS,RPC_ERROR_UNKNOWN_COMMAND,SENTINEL_OAUTH_FIELDS,SessionStreamingError,UnknownCommandError,UserEditError,addAccount,all_exports,assertExpectedLeaf,assertExpectedUserLeaf,assertValidAccountName,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,builtinProviders,clampThinkingSelection,classifyReasoningCapability,commandShapedName,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findUnknownCommand,formatThinkingClampWarning,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels as getSupportedThinkingLevels2,getThinkingClampNotice,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,installMemoryReportSignal,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,readOwnFootprint,readProcessFootprint,refreshSlot,registerBundledOAuthFlowLoaders,registerMemoryReportSession,registerTuiRenderCacheSource,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,serviceTierForProvider,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,trackTurnAdmission,ultrafastSelectionWarning,unknownCommandErrorFromWire,upsertAccount,userTextEquals}from"./chunk-ULYOMGXX.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{CURRENT_SESSION_VERSION,CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,GOAL_CONTINUATION_MESSAGE_TYPE,InteractiveThemeController,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,SessionManager,SessionSelectorComponent,TRANSPORT_IMAGE_BUDGET_BYTES,VIRTUAL_MODEL_STATE_ENTRY,areExperimentalFeaturesEnabled,assertValidSessionId,buildContextEntries,buildSessionContext,buildSessionProjection,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,createVirtualModel,environmentContextMessageIfChanged,findLatestResponse,formatKeyText,getBranchSelection,getDefaultSessionDir,getLatestCompactionEntry,getSessionContextEntryId,getVirtualModelState,isContextExcludedCustomMessage,isVirtualModel,keyDisplayText,keyHint,keyText,listSessionsFromDir,loadEntriesFromFile,migrateSessionEntries,minimatch,parseGitUrl,parseRepositoryIdentity,parseSessionEntries,rawKeyHint,readFileLines,readPiManifest,readRepositoryIdentity,readSkillMarkdownSource,rejectedImageSources,require_ignore,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionEntryToContextMessages,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,unregisterSessionWriter,withVirtualModels}from"./chunk-3YXB7Z7O.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-SB22X6ZR.js";import{TIP_DEFINITIONS}from"./chunk-LYYI74CY.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-M2IHGL3M.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-J5MUMVWB.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-CTERKXVZ.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-7GVD54RM.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-IZOTKUWG.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{gcHostEndpoints,listHostEndpoints,socketNeedsHandshake}from"./chunk-H67EVDWG.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-ZJHRDQCH.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-Q2ZTPMWD.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-3A3C5VVO.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,shardKey,shardSocketPath,shardSocketPathForKey,socketSecretPath}from"./chunk-RADHRQ4K.js";import{attachJsonlLineReader,serializeJsonLine}from"./chunk-YI7SPFDN.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-UMJL74VN.js";import{ProjectTrustStore,bundledBuiltinExtensions,getBundledResourceRoots,getProjectTrustOptions,hasTrustRequiringProjectResources,imagegenSkillPath}from"./chunk-RRU5LXMS.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-LSE7KE2C.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,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,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-YSPHACIN.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-PELNNWGO.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=(path15,{windows}={})=>{let segs=path15.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}},parse7=(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,open8=tokens[token.tokensIndex];open8.type="text",open8.value=literal,open8.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+open8.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=parse7(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 open8={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open8),push(open8);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};parse7.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=parse7}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse7=require_parse(),utils=require_utils(),constants11=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,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)):parse7(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=parse7.fastpaths(input,options)),parsed.output||(parsed=parse7(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 os7 from"node:os";import*as path14 from"node:path";import{spawn as spawn12,spawnSync}from"child_process";import{randomUUID as randomUUID13}from"node:crypto";import{existsSync as existsSync47,mkdirSync as mkdirSync26,readFileSync as readFileSync46,writeFileSync as writeFileSync24}from"node:fs";import{rm as rm10}from"node:fs/promises";import{dirname as dirname49}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:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>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(resolve45=>{let abortHandler=()=>resolve45(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((resolve45,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(()=>resolve45(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(resolve45=>{signal.addEventListener("abort",()=>resolve45(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(resolve45=>{resolvePromise=resolve45});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((resolve45,reject)=>{resolveCompletion=resolve45,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,CONTINUE_FROM_LEAF_CUSTOM_TYPE,CONTINUE_FROM_LEAF_DIRECTIVE,ContinueFromLeafError,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,RESERVED_MEMORY_REPORT_KEYS,RPC_ERROR_UNKNOWN_COMMAND,SENTINEL_OAUTH_FIELDS,SessionStreamingError,UnknownCommandError,UserEditError,addAccount,all_exports,assertExpectedLeaf,assertExpectedUserLeaf,assertValidAccountName,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,builtinProviders,clampThinkingSelection,classifyReasoningCapability,commandShapedName,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findUnknownCommand,formatThinkingClampWarning,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels as getSupportedThinkingLevels2,getThinkingClampNotice,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,installMemoryReportSignal,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,readOwnFootprint,readProcessFootprint,refreshSlot,registerBundledOAuthFlowLoaders,registerMemoryReportSession,registerTuiRenderCacheSource,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,serviceTierForProvider,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,trackTurnAdmission,ultrafastSelectionWarning,unknownCommandErrorFromWire,upsertAccount,userTextEquals}from"./chunk-PDSG6VER.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{CURRENT_SESSION_VERSION,CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,GOAL_CONTINUATION_MESSAGE_TYPE,InteractiveThemeController,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,SessionManager,SessionSelectorComponent,TRANSPORT_IMAGE_BUDGET_BYTES,VIRTUAL_MODEL_STATE_ENTRY,areExperimentalFeaturesEnabled,assertValidSessionId,buildContextEntries,buildSessionContext,buildSessionProjection,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,createVirtualModel,environmentContextMessageIfChanged,findLatestResponse,formatKeyText,getBranchSelection,getDefaultSessionDir,getLatestCompactionEntry,getSessionContextEntryId,getVirtualModelState,isContextExcludedCustomMessage,isVirtualModel,keyDisplayText,keyHint,keyText,listSessionsFromDir,loadEntriesFromFile,migrateSessionEntries,minimatch,parseGitUrl,parseRepositoryIdentity,parseSessionEntries,rawKeyHint,readFileLines,readPiManifest,readRepositoryIdentity,readSkillMarkdownSource,rejectedImageSources,require_ignore,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionEntryToContextMessages,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,unregisterSessionWriter,withVirtualModels}from"./chunk-Z7MMKKIY.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-H4UIUFU5.js";import{TIP_DEFINITIONS}from"./chunk-LYYI74CY.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-M2IHGL3M.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-J5MUMVWB.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-CTERKXVZ.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-7GVD54RM.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-IZOTKUWG.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{gcHostEndpoints,listHostEndpoints,socketNeedsHandshake}from"./chunk-H67EVDWG.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-ZJHRDQCH.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-4TK7VCZZ.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-3A3C5VVO.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,shardKey,shardSocketPath,shardSocketPathForKey,socketSecretPath}from"./chunk-RADHRQ4K.js";import{attachJsonlLineReader,serializeJsonLine}from"./chunk-YI7SPFDN.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-UMJL74VN.js";import{ProjectTrustStore,bundledBuiltinExtensions,getBundledResourceRoots,getProjectTrustOptions,hasTrustRequiringProjectResources,imagegenSkillPath}from"./chunk-RRU5LXMS.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-ODYQK5XJ.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,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,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-I5HLTDT4.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-PELNNWGO.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=(path15,{windows}={})=>{let segs=path15.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}},parse7=(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,open8=tokens[token.tokensIndex];open8.type="text",open8.value=literal,open8.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+open8.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=parse7(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 open8={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open8),push(open8);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};parse7.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=parse7}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse7=require_parse(),utils=require_utils(),constants11=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,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)):parse7(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=parse7.fastpaths(input,options)),parsed.output||(parsed=parse7(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 os7 from"node:os";import*as path14 from"node:path";import{spawn as spawn12,spawnSync}from"child_process";import{randomUUID as randomUUID13}from"node:crypto";import{existsSync as existsSync47,mkdirSync as mkdirSync26,readFileSync as readFileSync46,writeFileSync as writeFileSync24}from"node:fs";import{rm as rm10}from"node:fs/promises";import{dirname as dirname49}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:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>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(resolve45=>{let abortHandler=()=>resolve45(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((resolve45,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(()=>resolve45(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(resolve45=>{signal.addEventListener("abort",()=>resolve45(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(resolve45=>{resolvePromise=resolve45});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((resolve45,reject)=>{resolveCompletion=resolve45,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=`
|
|
@@ -707,7 +707,7 @@ ${bounded}`}function measureSlicedContext(entries,firstKeptEntryId,summary,token
|
|
|
707
707
|
parameters: ${parameters}`}),lines=[`Found ${matches.length} tool(s) matching "${query}"${scopeText}. Nothing was activated; call one by name and it activates on that first call:`,"",...bullets];return hintLines.length>0&&lines.push("","The query also names a tool that is hidden in this session:",...hintLines),lines.join(`
|
|
708
708
|
`)}function isRecord4(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function oneLine(text2){if(text2===void 0)return;let collapsed=text2.replace(/\s+/g," ").trim();if(collapsed.length!==0)return collapsed.length<=160?collapsed:`${collapsed.slice(0,157)}...`}function compactParameters(parameters){if(isRecord4(parameters))try{return JSON.stringify(parameters)}catch(error2){if(error2 instanceof TypeError)return;throw error2}}var ToolSearchService=class{#runtime;#feeds=new Map;#extensionDocs=[];#extensionFingerprint="";#registryGeneration=0;#historyScannedGeneration=-1;#registerToolSearch;#removedToolHints=()=>({});#disposed;constructor(runtime){this.#runtime=runtime,this.#feeds.set("extension",{docs:[],hooks:{activate:names=>this.#promoteExtensionTools(names)}})}#nativeInjectionFailure=null;get isDisposed(){return this.#disposed!==void 0}dispose(sessionId,reason){this.#disposed??={sessionId,reason},sessionServices.delete(this)}#assertLive(){if(this.#disposed===void 0)return;let{sessionId,reason}=this.#disposed;throw new Error(`The tool-search service of session ${sessionId} is disposed (${reason}). Resolve the live session's own tool-search service instead of a retained one.`)}noteNativeInjectionFailure(reason){this.#assertLive(),this.#nativeInjectionFailure=reason}takeNativeInjectionFailure(){this.#assertLive();let reason=this.#nativeInjectionFailure;return this.#nativeInjectionFailure=null,reason}bindRuntime(runtime){this.#runtime=runtime}bindActivationRuntime(runtime){this.#runtime={...this.#runtime,...runtime}}bindToolRegistrar(register){this.#registerToolSearch=register}bindRemovedToolHints(provider){this.#removedToolHints=provider}hiddenToolHints(query){this.#assertLive();let hints=this.#removedToolHints(),byNormalizedName=new Map(Object.entries(hints).map(([name,hint])=>[normalizeToolName(name),{hint,name}]));if(byNormalizedName.size===0)return[];let seen=new Set,matched=[];for(let candidate of[normalizeToolName(query),...tokenizeToolText(query)]){let entry=byNormalizedName.get(candidate);entry===void 0||seen.has(entry.name)||(seen.add(entry.name),matched.push(entry))}return matched}getToolParameters(name){return this.#assertLive(),this.#runtime.getAllTools().find(tool=>tool.name===name)?.parameters}beginSession(){this.#assertLive(),this.#feeds.delete("mcp"),this.#registryGeneration+=1,this.#historyScannedGeneration=-1,this.#refreshExtensionDocs(),this.#syncToolSearchLifecycle()}feed(source2,docs,hooks){this.#assertLive();let validDocs=docs.filter(doc=>isValidDocument(doc,source2));this.#feeds.set(source2,{docs:validDocs,hooks}),this.#registryGeneration+=1,this.#syncToolSearchLifecycle()}getCatalog(){return this.#assertLive(),this.#refreshExtensionDocs(),[...this.#feeds.get("mcp")?.docs??[],...this.#extensionDocs]}search(query,limit=10,options={}){return buildBm25Index(this.getCatalog()).search(query,limit,{precision:DEFAULT_BM25_PRECISION,...options})}activate(matches){this.#assertLive();let namesBySource=new Map;for(let match of matches){let names=namesBySource.get(match.doc.source)??[];names.push(match.name),namesBySource.set(match.doc.source,names)}for(let[source2,names]of namesBySource)this.#feeds.get(source2)?.hooks.activate(names);let active=new Set(this.#runtime.getActiveTools());return matches.map(({name})=>name).filter(name=>active.has(name))}activateTool(name){let doc=this.getCatalog().find(candidate=>candidate.name===name);return doc===void 0?!1:(this.#feeds.get(doc.source)?.hooks.activate([name]),this.#runtime.getActiveTools().includes(name))}maybeRehydrateFromHistory(messages){let catalog=this.getCatalog();if(this.#historyScannedGeneration===this.#registryGeneration)return[];this.#historyScannedGeneration=this.#registryGeneration;let docsByName=new Map(catalog.map(doc=>[doc.name,{name:doc.name,registrationId:doc.registrationId,source:doc.source,allowLazyActivation:!0}])),restored=rehydrate(messages,docsByName);return restored.length>0&&this.#activateNames(restored,catalog),restored}#refreshExtensionDocs(){let docs=this.#runtime.getAllTools().filter(tool=>tool.exposure==="search"&&tool.allowLazyActivation).map(extensionDocument).filter(doc=>doc!==void 0).sort((left,right)=>left.name.localeCompare(right.name)),fingerprint=JSON.stringify(docs);fingerprint!==this.#extensionFingerprint&&(this.#extensionDocs=docs,this.#extensionFingerprint=fingerprint,this.#feeds.set("extension",{docs,hooks:{activate:names=>this.#promoteExtensionTools(names)}}),this.#registryGeneration+=1,this.#syncToolSearchLifecycle())}#activateNames(names,catalog=this.getCatalog()){let sourceByName=new Map(catalog.map(doc=>[doc.name,doc.source])),namesBySource=new Map;for(let name of names){let source2=sourceByName.get(name);if(source2===void 0)continue;let sourceNames=namesBySource.get(source2)??[];sourceNames.push(name),namesBySource.set(source2,sourceNames)}for(let[source2,sourceNames]of namesBySource)this.#feeds.get(source2)?.hooks.activate(sourceNames)}#syncToolSearchLifecycle(){let hasDocuments=this.#extensionDocs.length>0||(this.#feeds.get("mcp")?.docs.length??0)>0;hasDocuments&&this.#registerToolSearch?.();let current=this.#runtime.getActiveTools(),isActive2=current.includes(TOOL_SEARCH_TOOL_NAME);hasDocuments!==isActive2&&this.#runtime.setActiveTools(hasDocuments?[...current,TOOL_SEARCH_TOOL_NAME]:current.filter(name=>name!==TOOL_SEARCH_TOOL_NAME))}#promoteExtensionTools(names){if(names.length===0)return;let current=this.#runtime.getActiveTools(),active=new Set(current),added=[...new Set(names.filter(name=>!active.has(name)))].sort();this.#runtime.setActiveTools([...current,...added])}};function extensionDocument(tool){if(tool.name.length===0)return;let ownerLabel=extensionOwnerLabel(tool),registrationId=deriveExtensionRegistrationId(tool.sourceInfo,tool.name);if(registrationId.length!==0)return{name:tool.name,label:tool.label,aliases:[],description:tool.description,searchText:tool.searchText,keywords:tool.searchKeywords,source:"extension",group:tool.searchGroup??ownerLabel,ownerLabel,registrationId}}function extensionOwnerLabel(tool){let fileName=basename4(tool.sourceInfo.path),extension=extname(fileName);return extension.length===0?fileName:fileName.slice(0,-extension.length)}function isValidDocument(doc,source2){return doc.source===source2&&doc.name.length>0&&doc.registrationId.length>0}var scopedService=new AsyncLocalStorage,servicesByExtensionLoad=new WeakMap,sessionServices=new Set,sessionlessService=null;function installScopedToolSearchService(value2){scopedService.enterWith(value2)}function registerToolSearchServiceForExtensionLoad(pi,value2){let load=extensionLoadKey(pi);load!==void 0&&servicesByExtensionLoad.set(load,value2)}function getToolSearchServiceForExtension(pi){let load=extensionLoadKey(pi);return load===void 0?void 0:servicesByExtensionLoad.get(load)}function adoptToolSearchServiceForSession(extensionLoad){let value2=servicesByExtensionLoad.get(extensionLoad);return value2!==void 0&&sessionServices.add(value2),value2}function getToolSearchService(runtime){let scoped=scopedService.getStore();if(scoped!==void 0)return runtime!==void 0&&scoped.bindRuntime(runtime),scoped;if(sessionServices.size===1)return[...sessionServices][0];if(sessionServices.size>1)throw new Error(`getToolSearchService() cannot choose between ${sessionServices.size} live sessions; resolve the service through the session that owns it`);if(sessionlessService===null){if(runtime===void 0)throw new Error("ToolSearchService runtime is not bound");sessionlessService=new ToolSearchService(runtime)}else runtime!==void 0&&sessionlessService.bindRuntime(runtime);return sessionlessService}import*as fs3 from"node:fs";import{createRequire as createRequire3}from"node:module";import*as path11 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";var oauth_exports={};__export(oauth_exports,{loadAnthropicOAuth:()=>loadAnthropicOAuth,registerBundledOAuthFlowLoaders:()=>registerBundledOAuthFlowLoaders});var dist_exports3={};__export(dist_exports3,{AgentSession:()=>AgentSession,AgentSessionRuntime:()=>AgentSessionRuntime,ArminComponent:()=>ArminComponent,AssistantMessageComponent:()=>AssistantMessageComponent,BashExecutionComponent:()=>BashExecutionComponent,BorderedLoader:()=>BorderedLoader,BranchSummaryMessageComponent:()=>BranchSummaryMessageComponent,CONFIG_DIR_NAME:()=>CONFIG_DIR_NAME,CURRENT_SESSION_VERSION:()=>CURRENT_SESSION_VERSION,CompactionSummaryMessageComponent:()=>CompactionSummaryMessageComponent,CredentialSynchronizationError:()=>CredentialSynchronizationError,CustomEditor:()=>CustomEditor,CustomMessageComponent:()=>CustomMessageComponent,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS2,DEFAULT_HOST_LAUNCH_SPEC:()=>DEFAULT_HOST_LAUNCH_SPEC,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES3,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES2,DefaultPackageManager:()=>DefaultPackageManager,DefaultResourceLoader:()=>DefaultResourceLoader,DynamicBorder:()=>DynamicBorder,ENDPOINT_REGISTRY_VERSION:()=>ENDPOINT_REGISTRY_VERSION,EVAL_HANDLE_ERROR_CODES:()=>EVAL_HANDLE_ERROR_CODES,EvalHandleError:()=>EvalHandleError,ExtensionEditorComponent:()=>ExtensionEditorComponent,ExtensionInputComponent:()=>ExtensionInputComponent,ExtensionRunner:()=>ExtensionRunner,ExtensionSelectorComponent:()=>ExtensionSelectorComponent,FooterComponent:()=>FooterComponent,GENERATION_HANDOFF_CAPABILITY:()=>GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR:()=>HOST_EXIT_ERROR,HOST_EXIT_FALLBACK:()=>HOST_EXIT_FALLBACK,HOST_EXIT_OK:()=>HOST_EXIT_OK,HOST_EXIT_REFUSED:()=>HOST_EXIT_REFUSED,HOST_EXIT_USAGE:()=>HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION:()=>HOST_PROTOCOL_VERSION,HostEnsureRefusedError:()=>HostEnsureRefusedError,HostLaunchSpecError:()=>HostLaunchSpecError,InteractiveMode:()=>InteractiveMode,LoginDialogComponent:()=>LoginDialogComponent,ModelRegistry:()=>ModelRegistry,ModelRuntime:()=>ModelRuntime,ModelSelectorComponent:()=>ModelSelectorComponent,OAuthSelectorComponent:()=>OAuthSelectorComponent,PINNED_HOST_CLIENT_CAPABILITIES:()=>PINNED_HOST_CLIENT_CAPABILITIES,ProjectTrustStore:()=>ProjectTrustStore,REQUIRED_HOST_CAPABILITIES:()=>REQUIRED_HOST_CAPABILITIES,RpcClient:()=>RpcClient,RpcClientOpenInFlightError:()=>RpcClientOpenInFlightError,RpcTransportGoneError:()=>RpcTransportGoneError,SESSION_CONTROL_DELIVERY_TYPE:()=>SESSION_CONTROL_DELIVERY_TYPE,SessionManager:()=>SessionManager,SessionSelectorComponent:()=>SessionSelectorComponent,SettingsManager:()=>SettingsManager,SettingsSelectorComponent:()=>SettingsSelectorComponent,ShowImagesSelectorComponent:()=>ShowImagesSelectorComponent,SkillInvocationMessageComponent:()=>SkillInvocationMessageComponent,TUI_PROBE_TIMEOUT_MS:()=>TUI_PROBE_TIMEOUT_MS,Theme:()=>Theme,ThemeSelectorComponent:()=>ThemeSelectorComponent,ThinkingSelectorComponent:()=>ThinkingSelectorComponent,ToolExecutionComponent:()=>ToolExecutionComponent,TreeSelectorComponent:()=>TreeSelectorComponent,UnknownCommandError:()=>UnknownCommandError,UserMessageComponent:()=>UserMessageComponent,UserMessageSelectorComponent:()=>UserMessageSelectorComponent,VERSION:()=>VERSION,VIRTUAL_MODEL_STATE_ENTRY:()=>VIRTUAL_MODEL_STATE_ENTRY,buildContextEntries:()=>buildContextEntries,buildNoticeBox:()=>buildNoticeBox,buildSessionContext:()=>buildSessionContext,buildSessionProjection:()=>buildSessionProjection,calculateContextTokens:()=>calculateContextTokens2,classifyEndpointLiveness:()=>classifyEndpointLiveness,classifyRead:()=>classifyRead,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary2,collectOrphanedChildren:()=>collectOrphanedChildren,compact:()=>compact2,compareEngineOrdinal:()=>compareEngineOrdinal,connectWebViewService:()=>connectWebViewService,convertToLlm:()=>convertToLlm,convertToPng:()=>convertToPng,copyToClipboard:()=>copyToClipboard,createAgentSession:()=>createAgentSession,createAgentSessionFromServices:()=>createAgentSessionFromServices,createAgentSessionRuntime:()=>createAgentSessionRuntime,createAgentSessionServices:()=>createAgentSessionServices,createBashTool:()=>createBashTool2,createBashToolDefinition:()=>createBashToolDefinition,createCodingTools:()=>createCodingTools,createEditTool:()=>createEditTool2,createEditToolDefinition:()=>createEditToolDefinition,createEventBus:()=>createEventBus,createExtensionRuntime:()=>createExtensionRuntime,createFindTool:()=>createFindTool,createFindToolDefinition:()=>createFindToolDefinition,createGrepTool:()=>createGrepTool,createGrepToolDefinition:()=>createGrepToolDefinition,createHostDaemonPaths:()=>createHostDaemonPaths,createLocalBashOperations:()=>createLocalBashOperations,createLsTool:()=>createLsTool,createLsToolDefinition:()=>createLsToolDefinition,createPowerShellTool:()=>createPowerShellTool,createReadOnlyTools:()=>createReadOnlyTools,createReadTool:()=>createReadTool2,createReadToolDefinition:()=>createReadToolDefinition,createSyntheticSourceInfo:()=>createSyntheticSourceInfo,createWriteTool:()=>createWriteTool2,createWriteToolDefinition:()=>createWriteToolDefinition,daemonDirectoryName:()=>daemonDirectoryName,decideHostAction:()=>decideHostAction,defineTool:()=>defineTool,detectSupportedImageMimeTypeFromFile:()=>detectSupportedImageMimeTypeFromFile,discoverAndLoadExtensions:()=>discoverAndLoadExtensions,endpointProbeTimeoutMs:()=>endpointProbeTimeoutMs,engineBuildIdentity:()=>engineBuildIdentity,engineBuildIdentityFrom:()=>engineBuildIdentityFrom,ensureHost:()=>ensureHost,estimateTokens:()=>estimateTokens2,findCutPoint:()=>findCutPoint2,findTurnStartIndex:()=>findTurnStartIndex2,formatDimensionNote:()=>formatDimensionNote,formatSize:()=>formatSize2,formatSkillsForPrompt:()=>formatSkillsForPrompt,gcHostEndpoints:()=>gcHostEndpoints,generateBranchSummary:()=>generateBranchSummary2,generateDiffString:()=>generateDiffString2,generateSummary:()=>generateSummary2,generateSummaryWithUsage:()=>generateSummaryWithUsage2,generateUnifiedPatch:()=>generateUnifiedPatch2,getAgentDir:()=>getAgentDir,getDocsPath:()=>getDocsPath,getExamplesPath:()=>getExamplesPath,getLanguageFromPath:()=>getLanguageFromPath,getLastAssistantUsage:()=>getLastAssistantUsage2,getLatestCompactionEntry:()=>getLatestCompactionEntry,getMarkdownTheme:()=>getMarkdownTheme,getPackageDir:()=>getPackageDir,getPowerShellConfig:()=>getPowerShellConfig,getReadmePath:()=>getReadmePath,getSelectListTheme:()=>getSelectListTheme,getSettingsListTheme:()=>getSettingsListTheme,getShellConfig:()=>getShellConfig,handoffHost:()=>handoffHost,hasTrustRequiringProjectResources:()=>hasTrustRequiringProjectResources,highlightCode:()=>highlightCode,initTheme:()=>initTheme,isBashToolResult:()=>isBashToolResult,isEditToolResult:()=>isEditToolResult,isFindToolResult:()=>isFindToolResult,isGrepToolResult:()=>isGrepToolResult,isLsToolResult:()=>isLsToolResult,isPowerShellToolResult:()=>isPowerShellToolResult,isReadToolResult:()=>isReadToolResult,isSessionControlDeliveryDetails:()=>isSessionControlDeliveryDetails,isToolCallEventType:()=>isToolCallEventType,isTransportGoneError:()=>isTransportGoneError,isWriteToolResult:()=>isWriteToolResult,kernelToolsStorage:()=>kernelToolsStorage,keyHint:()=>keyHint,keyText:()=>keyText,listHostEndpoints:()=>listHostEndpoints,loadHostLaunchSpec:()=>loadHostLaunchSpec,loadProjectContextFiles:()=>loadProjectContextFiles,loadSkills:()=>loadSkills2,loadSkillsFromDir:()=>loadSkillsFromDir,main:()=>main,migrateSessionEntries:()=>migrateSessionEntries,noticeEntryRenderer:()=>noticeEntryRenderer,noticeMessageRenderer:()=>noticeMessageRenderer,parseArgs:()=>parseArgs,parseFrontmatter:()=>parseFrontmatter3,parseHostLaunchSpec:()=>parseHostLaunchSpec,parseHostProtocolInfo:()=>parseHostProtocolInfo,parseSessionEntries:()=>parseSessionEntries,parseSkillBlock:()=>parseSkillBlock,prepareBranchEntries:()=>prepareBranchEntries2,probeHost:()=>probeHost,rawKeyHint:()=>rawKeyHint,readAllHostStatus:()=>readAllHostStatus,readHostStatus:()=>readHostStatus,readOwnFootprint:()=>readOwnFootprint,readProcessFootprint:()=>readProcessFootprint,readStoredCredential:()=>readStoredCredential,registerReadClassifier:()=>registerReadClassifier,renderDiff:()=>renderDiff,resizeImage:()=>resizeImage,resolveCliModel:()=>resolveCliModel,resolveModelScopeWithDiagnostics:()=>resolveModelScopeWithDiagnostics,runHostCommand:()=>runHostCommand,runHostRequest:()=>runHostRequest,runPrintMode:()=>runPrintMode,runRpcMode:()=>runRpcMode,sanitizeTerminalLabel:()=>sanitizeTerminalLabel,serializeConversation:()=>serializeConversation2,sessionEntryToContextMessages:()=>sessionEntryToContextMessages,shardKey:()=>shardKey,shardSocketPath:()=>shardSocketPath,shardSocketPathForKey:()=>shardSocketPathForKey,shouldCompact:()=>shouldCompact2,stopHost:()=>stopHost,stripFrontmatter:()=>stripFrontmatter,truncateHead:()=>truncateHead2,truncateLine:()=>truncateLine2,truncateTail:()=>truncateTail2,truncateToVisualLines:()=>truncateToVisualLines,withBundledBunCommands:()=>withBundledBunCommands,withFileMutationQueue:()=>withFileMutationQueue2,wrapRegisteredTool:()=>wrapRegisteredTool,wrapRegisteredTools:()=>wrapRegisteredTools});var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{chmodSync,existsSync as existsSync3,mkdirSync as mkdirSync2,readFileSync as readFileSync5,renameSync as renameSync2,rmSync,statSync as statSync2,writeFileSync as writeFileSync3}from"fs";import{dirname as dirname5,join as join6}from"path";function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error2=new Error("The operation was aborted");return error2.name="AbortError",error2}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal?signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve45,reject)=>{let settled=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled||(settled=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value2=>{settled||(settled=!0,cleanup(),resolve45(value2))},error2=>{settled||(settled=!0,cleanup(),reject(error2))}),signal.aborted&&onAbort()}):operation}function isPlainObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function migrateLegacyProviderKeys(data){let next;for(let[legacyId,canonicalId]of Object.entries(LEGACY_PROVIDER_IDS)){let legacy=data[legacyId];isPlainObject(legacy)&&(next??={...data},delete next[legacyId],next[canonicalId]===void 0&&(next[canonicalId]=legacy))}return next?{data:next,migrated:!0}:{data,migrated:!1}}function repairPoisonedPoolSlots(data){let repaired;for(let[providerId,credential]of Object.entries(data)){if(typeof credential!="object"||credential===null)continue;let healed=repairManagedSentinelSlots(providerId,credential);healed&&(repaired??={...data},repaired[providerId]=healed)}return repaired?{data:repaired,repaired:!0}:{data,repaired:!1}}var AUTH_FILE_WRITE_OPTIONS={encoding:"utf-8",mode:384},sharedAuthFileReadState,FileAuthStorageBackend=class{constructor(authPath=join6(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}ensureParentDir(){let dir=dirname5(this.authPath);existsSync3(dir)||mkdirSync2(dir,{recursive:!0,mode:448})}ensureFileExists(){existsSync3(this.authPath)||writeFileSync3(this.authPath,"{}",AUTH_FILE_WRITE_OPTIONS)}writeAuthFile(content){let temporary=`${this.authPath}.${process.pid}.tmp`;try{writeFileSync3(temporary,content,AUTH_FILE_WRITE_OPTIONS),existsSync3(this.authPath)&&chmodSync(temporary,statSync2(this.authPath).mode&511),renameSync2(temporary,this.authPath)}catch(error2){try{rmSync(temporary,{force:!0})}catch{}throw error2}}acquireLockSyncWithRetry(path15){let startedAt=Date.now(),attempt2=0;for(;;)try{return import_proper_lockfile.default.lockSync(path15,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error2){if(!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_SYNC_LOCK_BUDGET_MS)throw new CredentialStoreBusyError(path15,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS-waitedMs);attempt2++;let sleeper=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(sleeper,0,0,delayMs)}}withLock(fn){this.ensureParentDir(),this.ensureFileExists();let release4;try{release4=this.acquireLockSyncWithRetry(this.authPath);let current=existsSync3(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=fn(current);return next!==void 0&&this.writeAuthFile(next),result3}finally{release4&&release4()}}async acquireLockAsync(signal,onCompromised){signal?.throwIfAborted();let startedAt=Date.now(),attempt2=0;for(;;)try{let release4=await import_proper_lockfile.default.lock(this.authPath,{...FILE_STORAGE_LOCK_OPTIONS,retries:0,onCompromised});return signal?.aborted&&(await release4(),signal.throwIfAborted()),release4}catch(error2){if(signal?.throwIfAborted(),!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_LOCK_RETRY_BUDGET_MS)throw new CredentialStoreBusyError(this.authPath,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS-waitedMs);attempt2++,await raceWithAbortSignal(new Promise(resolve45=>setTimeout(resolve45,delayMs)),signal)}}async withLockAsync(fn,options){options?.signal?.throwIfAborted(),this.ensureParentDir(),this.ensureFileExists();let release4,lockCompromised=!1,lockCompromisedError,throwIfCompromised=()=>{if(lockCompromised)throw lockCompromisedError??new Error("Auth storage lock was compromised")};try{release4=await this.acquireLockAsync(options?.signal,error2=>{lockCompromised=!0,lockCompromisedError=error2}),throwIfCompromised(),options?.signal?.throwIfAborted();let current=existsSync3(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=await fn(current);return throwIfCompromised(),options?.signal?.throwIfAborted(),next!==void 0&&this.writeAuthFile(next),throwIfCompromised(),result3}finally{if(release4)try{await release4()}catch{}}}},ReadOnlyAuthStorage=class{constructor(authPath=join6(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}load(){if(this.data)return this.data;let parsed;try{parsed=JSON.parse(stripBom(readFileSync5(this.authPath,"utf-8")))}catch(error2){if(error2.code==="ENOENT")return this.data={},this.data;throw new Error(`Failed to read auth.json: ${error2 instanceof Error?error2.message:String(error2)}`)}if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new Error("Invalid auth.json: expected an object");for(let[providerId,credential]of Object.entries(parsed)){if(typeof credential!="object"||credential===null||Array.isArray(credential))throw new Error(`Invalid auth.json credential for provider "${providerId}"`);let value2=credential;if(value2.type==="api_key"){let validKey=value2.key===void 0||typeof value2.key=="string",validEnv=value2.env===void 0||typeof value2.env=="object"&&value2.env!==null&&!Array.isArray(value2.env)&&Object.values(value2.env).every(entry=>typeof entry=="string");if(validKey&&validEnv)continue}else if(value2.type==="oauth"&&typeof value2.access=="string"&&typeof value2.refresh=="string"&&typeof value2.expires=="number"&&Number.isFinite(value2.expires))continue;throw new Error(`Invalid auth.json credential for provider "${providerId}"`)}return this.data=repairPoisonedPoolSlots(parsed).data,this.data}async read(providerId,options){options?.signal?.throwIfAborted();let credential=readByProviderId(this.load(),providerId);if(options?.signal?.throwIfAborted(),!!credential)return credential.type!=="api_key"||!credential.key||isCommandConfigValue(credential.key)?structuredClone(credential):{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async list(options){options?.signal?.throwIfAborted();let credentials=Object.entries(this.load()).map(([providerId,credential])=>({providerId,type:credential.type}));return options?.signal?.throwIfAborted(),credentials}async modify(_providerId,_fn,_options){throw new Error("Read-only credential storage cannot modify auth.json")}async delete(_providerId,_options){throw new Error("Read-only credential storage cannot modify auth.json")}},InMemoryAuthStorageBackend=class{constructor(){this.asyncChain=Promise.resolve()}withLock(fn){let{result:result3,next}=fn(this.value);return next!==void 0&&(this.value=next),result3}withLockAsync(fn,options){let previous=this.asyncChain,operation=(async()=>{await previous.catch(()=>{}),options?.signal?.throwIfAborted();let{result:result3,next}=await fn(this.value);return options?.signal?.throwIfAborted(),next!==void 0&&(this.value=next),result3})();return this.asyncChain=operation.catch(()=>{}),raceWithAbortSignal(operation,options?.signal)}},AuthStorage=class _AuthStorage{constructor(storage,authPath){if(this.data={},this.runtimeOverrides=new Map,this.extensionOAuthProviders=new Map,this.errors=[],this.busyReads=0,this.dataLoaded=!1,this.dataFromBusyRead=!1,this.storage=storage,this.authPath=authPath,this.readState=authPath&&sharedAuthFileReadState?.authPath===authPath?sharedAuthFileReadState.readState:{data:{}},authPath&&!sharedAuthFileReadState&&(sharedAuthFileReadState={authPath,readState:this.readState}),authPath&&this.readState.loaded){this.data=this.readState.data,this.dataLoaded=!0;let revision=getFileContentRevision(authPath);if(revision!==void 0&&revision===this.readState.revision)return}this.reload()}static create(authPath=join6(getAgentDir(),"auth.json")){let normalizedAuthPath=normalizePath(authPath);return new _AuthStorage(new FileAuthStorageBackend(normalizedAuthPath),normalizedAuthPath)}getStoragePath(){return this.authPath}static fromStorage(storage){return new _AuthStorage(storage)}static inMemory(data={}){let storage=new InMemoryAuthStorageBackend;return storage.withLock(()=>({result:void 0,next:JSON.stringify(data,null,2)})),_AuthStorage.fromStorage(storage)}parseStorageData(content){return content?repairPoisonedPoolSlots(JSON.parse(stripBom(content))).data:{}}parseStorageContent(content){if(!content)return{data:{},repaired:!1,migrated:!1};let repaired=repairPoisonedPoolSlots(JSON.parse(stripBom(content))),migrated=migrateLegacyProviderKeys(repaired.data);return{data:migrated.data,repaired:repaired.repaired,migrated:migrated.migrated}}recordError(error2){this.errors.push(error2 instanceof Error?error2:new Error(String(error2)))}backupAuthFile(content){if(!this.authPath||content===void 0)return;let stamp=new Date().toISOString().replace(/[:.]/g,"-"),backupPath=`${this.authPath}.backup-${stamp}`;for(let attempt2=1;existsSync3(backupPath);attempt2++)backupPath=`${this.authPath}.backup-${stamp}-${attempt2}`;writeFileSync3(backupPath,content,AUTH_FILE_WRITE_OPTIONS)}updateReadState(data,revision){this.data=data,this.dataLoaded=!0,this.dataFromBusyRead=!1,this.readState.data=data,this.readState.loaded=!0,this.readState.revision=revision}reload(){let data={},revision;try{return this.storage.withLock(current=>{let parsed=this.parseStorageContent(current);return data=parsed.data,revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath),parsed.migrated&&this.backupAuthFile(current),parsed.repaired||parsed.migrated?{result:void 0,next:JSON.stringify(parsed.data,null,2)}:{result:void 0}}),this.updateReadState(data,revision),"loaded"}catch(error2){return this.recordError(error2 instanceof Error?error2:new Error(String(error2))),error2 instanceof CredentialStoreBusyError?(this.dataLoaded||(this.busyReads++,this.dataFromBusyRead=!0),"busy"):"failed"}}isCredentialStoreBusy(){return this.dataFromBusyRead}getBusyReadCount(){return this.busyReads}noteBusyFallback(error2){error2 instanceof CredentialStoreBusyError&&!this.readState.loaded&&this.busyReads++}setRuntimeApiKey(provider,apiKey){this.runtimeOverrides.set(provider,apiKey)}removeRuntimeApiKey(provider){this.runtimeOverrides.delete(provider)}get(provider){return readByProviderId(this.data,provider)}getProviderEnv(provider){let credential=readByProviderId(this.data,provider);return credential?.type==="api_key"&&credential.env?{...credential.env}:void 0}set(provider,credential){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=appendLoginSlot(currentData[provider],credential),nextData={...currentData,[provider]:next};return this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}remove(provider){this.storage.withLock(content=>{let nextData={...this.parseStorageData(content)};return delete nextData[provider],this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}listSlots(provider){return listSlots(readByProviderId(this.data,provider))}setSlot(provider,slot){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=upsertSlot(currentData[provider],slot),nextData={...currentData,[provider]:next};return this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}removeSlot(provider,name){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=removeSlot(currentData[provider],name),nextData={...currentData};return next===void 0?delete nextData[provider]:nextData[provider]=next,this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}has(provider){return provider in this.data}hasAuth(provider){return this.runtimeOverrides.has(provider)||this.has(provider)||getEnvApiKey(provider)!==void 0}getAuthStatus(provider){if(this.has(provider))return{configured:!0,source:"stored"};if(this.runtimeOverrides.has(provider))return{configured:!0,source:"runtime",label:"--api-key"};let envName=findEnvKeys(provider)?.[0];return envName&&process.env[envName]?{configured:!0,source:"environment",label:envName}:{configured:!1}}getAll(){return{...this.data}}drainErrors(){let errors=this.errors;return this.errors=[],errors}async reloadFromStorageAsync(options){return this.storage.withLockAsync(async content=>{let parsed=this.parseStorageContent(content),revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath);return this.updateReadState(parsed.data,revision),parsed.migrated&&this.backupAuthFile(content),parsed.repaired||parsed.migrated?{result:parsed.data,next:JSON.stringify(parsed.data,null,2)}:{result:parsed.data}},options)}async readLatestData(options){if(options?.signal?.throwIfAborted(),!this.authPath)try{return await this.reloadFromStorageAsync(options)}catch(error2){return options?.signal?.throwIfAborted(),this.recordError(error2),this.noteBusyFallback(error2),this.readState.data}let revision=getFileContentRevision(this.authPath);if(revision!==void 0&&revision===this.readState.revision)return this.readState.data;if(!this.readState.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorageAsync({signal:controller.signal}),readers:0};this.readState.reload=reload2,reload2.promise.then(()=>{this.readState.reload===reload2&&(this.readState.reload=void 0)},error2=>{controller.signal.aborted||this.recordError(error2),this.readState.reload===reload2&&(this.readState.reload=void 0)})}let reload=this.readState.reload;reload.readers++;try{try{return await raceWithAbortSignal(reload.promise,options?.signal)}catch(error2){return options?.signal?.throwIfAborted(),this.noteBusyFallback(error2),this.readState.data}}finally{reload.readers--,reload.readers===0&&this.readState.reload===reload&&(this.readState.reload=void 0,reload.controller.abort())}}async read(provider,options){options?.signal?.throwIfAborted();let runtimeKey=this.runtimeOverrides.get(provider);if(runtimeKey)return{type:"api_key",key:runtimeKey};let credential=(await this.readLatestData(options))[provider];return options?.signal?.throwIfAborted(),credential?.type!=="api_key"||credential.key===void 0?credential:{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async modify(provider,fn,options){let latestData=this.readState.data,revision,result3=await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content),next=await fn(currentData[provider]);if(next===void 0)return latestData=currentData,revision=this.authPath?getFileContentRevision(this.authPath):void 0,{result:currentData[provider]};let merged={...currentData,[provider]:next};return latestData=merged,{result:next,next:JSON.stringify(merged,null,2)}},options);return this.updateReadState(latestData,revision),result3}async delete(provider,options){options?.signal?.throwIfAborted(),this.runtimeOverrides.delete(provider);let latestData=this.readState.data;await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content);return delete currentData[provider],latestData=currentData,{result:void 0,next:JSON.stringify(currentData,null,2)}},options),this.updateReadState(latestData)}async list(options){let entries=new Map(Object.entries(await this.readLatestData(options)).map(([providerId,credential])=>[providerId,{providerId,type:credential.type}]));options?.signal?.throwIfAborted();for(let providerId of this.runtimeOverrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}async getApiKey(providerId,options={}){let runtimeKey=this.runtimeOverrides.get(providerId);if(runtimeKey)return runtimeKey;let credential=await this.read(providerId);if(credential?.type==="api_key")return credential.key;if(credential?.type==="oauth"){let oauth=builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)return;let current=credential;if(Date.now()>=current.expires){let refreshed=await this.modify(providerId,async stored=>stored?.type!=="oauth"||Date.now()<stored.expires?stored:oauth.refresh(stored,new AbortController().signal));if(refreshed?.type!=="oauth")return;current=refreshed}return(await oauth.toAuth(current)).apiKey}if(options.includeFallback!==!1)return getEnvApiKey(providerId)}registerOAuthProvider(providerId,oauth){this.extensionOAuthProviders.set(providerId,oauth)}unregisterOAuthProvider(providerId){this.extensionOAuthProviders.delete(providerId)}getOAuthProviders(){let dynamic=[...this.extensionOAuthProviders.entries()].map(([id,oauth])=>({id,name:oauth.name})),builtin=builtinProviders().flatMap(provider=>provider.auth.oauth&&!this.extensionOAuthProviders.has(provider.id)?[{id:provider.id,name:provider.auth.oauth.name}]:[]);return[...dynamic,...builtin]}async login(providerId,callbacks){let oauth=this.extensionOAuthProviders.get(providerId)??builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)throw new Error(`Unknown OAuth provider: ${providerId}`);let interaction={signal:callbacks.signal??new AbortController().signal,prompt:prompt=>this.handleLegacyPrompt(prompt,callbacks),notify:event=>this.handleLegacyEvent(event,callbacks)},credential=await oauth.login(interaction);this.set(providerId,credential)}logout(provider){this.removeRuntimeApiKey(provider),this.remove(provider)}handleLegacyPrompt(prompt,callbacks){switch(prompt.type){case"manual_code":return callbacks.onManualCodeInput?.()??callbacks.onPrompt(prompt);case"select":return callbacks.onSelect(prompt).then(value2=>{if(value2===void 0)throw new Error("Login cancelled");return value2});case"secret":case"text":return callbacks.onPrompt(prompt)}}handleLegacyEvent(event,callbacks){switch(event.type){case"auth_url":callbacks.onAuth(event);break;case"device_code":callbacks.onDeviceCode(event);break;case"info":callbacks.onProgress?.(event.message);break;case"progress":callbacks.onProgress?.(event.message);break}}};function readStoredCredential(providerId,authPath=join6(getAgentDir(),"auth.json")){try{let data=JSON.parse(stripBom(readFileSync5(normalizePath(authPath),"utf-8")));return readByProviderId(data,providerId)}catch{return}}import{EventEmitter}from"node:events";import{AsyncLocalStorage as AsyncLocalStorage2}from"node:async_hooks";var providerScopeStorage=new AsyncLocalStorage2,ProviderScope=class{constructor(){this.overlay=new Map,this.imagesOverlay=new Map,this.state="active"}close(){this.state="closed",this.overlay.clear(),this.imagesOverlay.clear()}};installProviderScopeAccessor(()=>providerScopeStorage.getStore());installImagesProviderScopeAccessor(()=>providerScopeStorage.getStore());function activeProviderScope(){return providerScopeStorage.getStore()}function runWithProviderScope(scope,fn){if(scope.state==="closed")throw new Error("Provider scope is closed");return providerScopeStorage.run(scope,fn)}function bindToProviderScope(fn){let scope=providerScopeStorage.getStore();if(!scope)throw new Error("No active provider scope to bind");return(...args)=>runWithProviderScope(scope,()=>fn(...args))}var EXTENSION_RPC_EVENT_CHANNEL="senpi:extension-rpc-event";function createEventBus(){let emitter=new EventEmitter;return{emit:(channel,data)=>{emitter.emit(channel,data)},on:(channel,handler)=>{let scopedHandler=bindHandler(handler),safeHandler=async data=>{try{await scopedHandler(data)}catch(err2){console.error(`Event handler error (${channel}):`,err2)}};return emitter.on(channel,safeHandler),()=>emitter.off(channel,safeHandler)},clear:()=>{emitter.removeAllListeners()}}}function bindHandler(handler){try{return bindToProviderScope(handler)}catch{return handler}}var EVAL_HANDLE_ERROR_CODES=["eval_handle_stale","eval_handle_forbidden","eval_handle_not_found","eval_handle_pending","eval_handle_operation_unsupported","eval_wait_unavailable","eval_wait_timeout","eval_wait_empty","eval_pool_open","eval_workpool_failed"],EvalHandleError=class extends Error{constructor(code,message,details){super(`${code}: ${message}`),this.name="EvalHandleError",this.code=code,details!==void 0&&(this.details=details)}};import{AsyncLocalStorage as AsyncLocalStorage3}from"node:async_hooks";var kernelToolsStorage=new AsyncLocalStorage3;var BOLD="\x1B[1m",BOLD_OFF="\x1B[22m";function noticeText(text2){return{render(width){return wrapTextWithAnsi(text2,Math.max(1,width))},invalidate(){}}}function buildNoticeBox(spec2,options,theme2){let box2=new Box(1,1,text2=>theme2.bg("customMessageBg",text2));box2.addChild(noticeText(theme2.fg(spec2.tone??"accent",`${BOLD}${spec2.title}${BOLD_OFF}`))),box2.addChild(noticeText(theme2.fg("dim",spec2.why)));for(let line of spec2.extra??[])box2.addChild(noticeText(theme2.fg(line.tone??"dim",line.text)));return options.expanded&&spec2.expandedLine!==void 0&&box2.addChild(noticeText(theme2.fg("dim",spec2.expandedLine))),box2}function noticeMessageRenderer(map){return(message,options,theme2)=>{let spec2=map(message);return spec2===void 0?void 0:buildNoticeBox(spec2,options,theme2)}}function noticeEntryRenderer(map){return(entry,options,theme2)=>{let spec2=map(entry);return spec2===void 0?void 0:buildNoticeBox(spec2,options,theme2)}}import{join as join9}from"node:path";import{dirname as dirname7,join as join8}from"node:path";import{mkdirSync as mkdirSync3,readFileSync as readFileSync6,renameSync as renameSync3,writeFileSync as writeFileSync4}from"node:fs";import{dirname as dirname6}from"node:path";var CACHE_FILE="claude-code-version.json";function resolveClaudeCodeVersionCachePath(env=process.env){return`${(env.SENPI_CODING_AGENT_DIR??env.CODING_AGENT_DIR??`${(env.HOME??".").replace(/\/$/,"")}/.senpi/agent`).replace(/\/$/,"")}/${CACHE_FILE}`}function isCachedVersion(value2){return typeof value2=="object"&&value2!==null&&typeof value2.version=="string"&&typeof value2.checkedAt=="number"}function createClaudeCodeVersionFileStore(path15){let savingEnabled=!0;return{load:()=>{let parsed;try{parsed=JSON.parse(readFileSync6(path15,"utf8"))}catch{return}return isCachedVersion(parsed)?parsed:void 0},save:record7=>{if(savingEnabled)try{mkdirSync3(dirname6(path15),{recursive:!0});let temporaryPath=`${path15}.${process.pid}.tmp`;writeFileSync4(temporaryPath,`${JSON.stringify(record7)}
|
|
709
709
|
`),renameSync3(temporaryPath,path15)}catch{savingEnabled=!1}}}}function installClaudeCodeVersionFileStore(options={}){let env=process.env,offline=options.offline??(env.PI_OFFLINE!==void 0&&env.PI_OFFLINE!==""&&env.PI_OFFLINE!=="0");installClaudeCodeVersionStore(createClaudeCodeVersionFileStore(options.path??resolveClaudeCodeVersionCachePath(env)),{offline})}var REFUSED_AFTER_REEXCHANGE="A freshly re-exchanged token for this account was refused as well; log in to this account again or switch accounts.";function refusesToken(event,statuses){if(event.type!=="error"||event.reason!=="error")return!1;let status=event.error.providerDiagnostic?.httpStatus;return status!==void 0&&statuses.includes(status)}async function*markRefusalAfterReexchange(stream2,statuses){let committed=!1;for await(let event of stream2)!committed&&event.type==="error"&&refusesToken(event,statuses)&&(event.error.errorMessage=`${event.error.errorMessage??"provider stream error"}
|
|
710
|
-
${REFUSED_AFTER_REEXCHANGE}`),committed||=isCommittedRotationOutput(event),yield event}async function retryOnceOnRejectedToken(attempt2){let first=await attempt2(void 0),statuses=first.rejectedTokenStatuses??[],rejectedAccess=first.rejectableAccess;if(rejectedAccess===void 0||statuses.length===0)return first.stream;let final=first.stream;async function*events(){let iterator=first.stream[Symbol.asyncIterator](),held=[];try{for(;;){let next=await iterator.next();if(next.done){yield*held;return}let event=next.value;if(refusesToken(event,statuses)){await iterator.return?.(void 0);let retried=await attempt2(rejectedAccess);final=retried.stream,yield*markRefusalAfterReexchange(retried.stream,statuses);return}if(isCommittedRotationOutput(event)){yield*held,yield event;break}held.push(event)}yield*{[Symbol.asyncIterator]:()=>iterator}}finally{await iterator.return?.(void 0)}}let source2=events();return typeof first.stream.result=="function"&&(source2.result=()=>final.result?.()??Promise.reject(new Error("provider stream has no result"))),source2}import{readFileSync as readFileSync8}from"node:fs";import{readFile as readFile2}from"node:fs/promises";function stripJsonComments(input){return input.replace(/"(?:\\.|[^"\\])*"|\/\/[^\n]*/g,m=>m[0]==='"'?m:"").replace(/"(?:\\.|[^"\\])*"|,(\s*[}\]])/g,(m,tail)=>tail??(m[0]==='"'?m:""))}var ThinkingLevelMapValueSchema=typebox_exports.Union([typebox_exports.String(),typebox_exports.Null()]),ThinkingLevelMapSchema=typebox_exports.Object({off:typebox_exports.Optional(ThinkingLevelMapValueSchema),minimal:typebox_exports.Optional(ThinkingLevelMapValueSchema),low:typebox_exports.Optional(ThinkingLevelMapValueSchema),medium:typebox_exports.Optional(ThinkingLevelMapValueSchema),high:typebox_exports.Optional(ThinkingLevelMapValueSchema),xhigh:typebox_exports.Optional(ThinkingLevelMapValueSchema),max:typebox_exports.Optional(ThinkingLevelMapValueSchema)}),ThinkingLevelSchema=typebox_exports.Union([typebox_exports.Literal("off"),typebox_exports.Literal("minimal"),typebox_exports.Literal("low"),typebox_exports.Literal("medium"),typebox_exports.Literal("high"),typebox_exports.Literal("xhigh"),typebox_exports.Literal("max")]);var CredentialSlotRefSchema=typebox_exports.Object({env:typebox_exports.Optional(typebox_exports.String({minLength:1})),value:typebox_exports.Optional(typebox_exports.String({minLength:1}))},{additionalProperties:!1}),CredentialPolicySchema=typebox_exports.Object({rotation:typebox_exports.Optional(typebox_exports.Boolean()),affinity:typebox_exports.Optional(typebox_exports.Boolean()),cooldownBaseMs:typebox_exports.Optional(typebox_exports.Number({minimum:0})),cooldownCapMs:typebox_exports.Optional(typebox_exports.Number({minimum:0})),slots:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String({minLength:1}),CredentialSlotRefSchema))},{additionalProperties:!1}),PercentileCutoffsSchema=typebox_exports.Object({p50:typebox_exports.Optional(typebox_exports.Number()),p75:typebox_exports.Optional(typebox_exports.Number()),p90:typebox_exports.Optional(typebox_exports.Number()),p99:typebox_exports.Optional(typebox_exports.Number())}),OpenRouterRoutingSchema=typebox_exports.Object({allow_fallbacks:typebox_exports.Optional(typebox_exports.Boolean()),require_parameters:typebox_exports.Optional(typebox_exports.Boolean()),data_collection:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("deny"),typebox_exports.Literal("allow")])),zdr:typebox_exports.Optional(typebox_exports.Boolean()),enforce_distillable_text:typebox_exports.Optional(typebox_exports.Boolean()),order:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),only:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),ignore:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),quantizations:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),sort:typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Object({by:typebox_exports.Optional(typebox_exports.String()),partition:typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Null()]))})])),max_price:typebox_exports.Optional(typebox_exports.Object({prompt:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),completion:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),image:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),audio:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),request:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()]))})),preferred_min_throughput:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),PercentileCutoffsSchema])),preferred_max_latency:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),PercentileCutoffsSchema]))}),VercelGatewayRoutingSchema=typebox_exports.Object({only:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),order:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String()))}),ChatTemplateKwargScalarSchema=typebox_exports.Union([typebox_exports.String(),typebox_exports.Number(),typebox_exports.Boolean(),typebox_exports.Null()]),ChatTemplateKwargVariableSchema=typebox_exports.Object({$var:typebox_exports.Union([typebox_exports.Literal("thinking.enabled"),typebox_exports.Literal("thinking.effort")]),omitWhenOff:typebox_exports.Optional(typebox_exports.Boolean())}),ChatTemplateKwargSchema=typebox_exports.Union([ChatTemplateKwargScalarSchema,ChatTemplateKwargVariableSchema]),ModelCostRatesSchema={input:typebox_exports.Number(),output:typebox_exports.Number(),cacheRead:typebox_exports.Number(),cacheWrite:typebox_exports.Number()},ModelCostTierSchema=typebox_exports.Object({inputTokensAbove:typebox_exports.Number(),...ModelCostRatesSchema}),ModelCostSchema=typebox_exports.Object({...ModelCostRatesSchema,tiers:typebox_exports.Optional(typebox_exports.Array(ModelCostTierSchema))}),ModelPromptCacheSchema=typebox_exports.Object({short:typebox_exports.Optional(typebox_exports.Number({exclusiveMinimum:0})),long:typebox_exports.Optional(typebox_exports.Number({exclusiveMinimum:0}))}),ImageResizeSchema=typebox_exports.Object({maxWidth:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),maxHeight:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),maxBytes:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),jpegQuality:typebox_exports.Optional(typebox_exports.Integer({minimum:1,maximum:100}))}),ModelInputLimitsSchema=typebox_exports.Object({maxRequestBytes:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),images:typebox_exports.Optional(typebox_exports.Object({resize:typebox_exports.Optional(ImageResizeSchema),maxPerMessage:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),maxPerRequest:typebox_exports.Optional(typebox_exports.Integer({minimum:1}))}))}),OpenAICompletionsCompatSchema=typebox_exports.Object({supportsStore:typebox_exports.Optional(typebox_exports.Boolean()),supportsDeveloperRole:typebox_exports.Optional(typebox_exports.Boolean()),supportsReasoningEffort:typebox_exports.Optional(typebox_exports.Boolean()),supportsUsageInStreaming:typebox_exports.Optional(typebox_exports.Boolean()),supportsFinishReason:typebox_exports.Optional(typebox_exports.Boolean()),maxTokensField:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("max_completion_tokens"),typebox_exports.Literal("max_tokens")])),requiresToolResultName:typebox_exports.Optional(typebox_exports.Boolean()),requiresAssistantAfterToolResult:typebox_exports.Optional(typebox_exports.Boolean()),requiresThinkingAsText:typebox_exports.Optional(typebox_exports.Boolean()),requiresReasoningContentOnAssistantMessages:typebox_exports.Optional(typebox_exports.Boolean()),supportsDisabledThinking:typebox_exports.Optional(typebox_exports.Boolean()),thinkingFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openrouter"),typebox_exports.Literal("together"),typebox_exports.Literal("deepseek"),typebox_exports.Literal("zai"),typebox_exports.Literal("qwen"),typebox_exports.Literal("chat-template"),typebox_exports.Literal("qwen-chat-template"),typebox_exports.Literal("string-thinking"),typebox_exports.Literal("ant-ling")])),chatTemplateKwargs:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ChatTemplateKwargSchema)),cacheControlFormat:typebox_exports.Optional(typebox_exports.Literal("anthropic")),openRouterRouting:typebox_exports.Optional(OpenRouterRoutingSchema),vercelGatewayRouting:typebox_exports.Optional(VercelGatewayRoutingSchema),zaiToolStream:typebox_exports.Optional(typebox_exports.Boolean()),supportsStrictMode:typebox_exports.Optional(typebox_exports.Boolean()),toolCallFormat:typebox_exports.Optional(typebox_exports.String()),sendSessionAffinityHeaders:typebox_exports.Optional(typebox_exports.Boolean()),deferredToolsMode:typebox_exports.Optional(typebox_exports.Literal("kimi")),sessionAffinityFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openai-nosession"),typebox_exports.Literal("openrouter")])),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean())}),OpenAIResponsesCompatSchema=typebox_exports.Object({supportsDeveloperRole:typebox_exports.Optional(typebox_exports.Boolean()),sessionAffinityFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openai-nosession"),typebox_exports.Literal("openrouter")])),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSocket:typebox_exports.Optional(typebox_exports.Boolean()),supportsRemoteCompactionV2:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSearchPreview:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolSearch:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean())}),AnthropicMessagesCompatSchema=typebox_exports.Object({supportsEagerToolInputStreaming:typebox_exports.Optional(typebox_exports.Boolean()),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),sendSessionAffinityHeaders:typebox_exports.Optional(typebox_exports.Boolean()),supportsCacheControlOnTools:typebox_exports.Optional(typebox_exports.Boolean()),supportsDisabledThinking:typebox_exports.Optional(typebox_exports.Boolean()),supportsTemperature:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolChoice:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean()),forceAdaptiveThinking:typebox_exports.Optional(typebox_exports.Boolean()),allowEmptySignature:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolReferences:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSearch:typebox_exports.Optional(typebox_exports.Boolean()),allowedFallbackModels:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Object({provider:typebox_exports.String({minLength:1}),model:typebox_exports.String({minLength:1}),cost:ModelCostSchema}),{maxItems:3}))}),ProviderCompatSchema=typebox_exports.Union([OpenAICompletionsCompatSchema,OpenAIResponsesCompatSchema,AnthropicMessagesCompatSchema]),ExtraBodySchema=typebox_exports.Record(typebox_exports.String(),typebox_exports.Unknown()),ModelDefinitionSchema=typebox_exports.Object({id:typebox_exports.String({minLength:1}),name:typebox_exports.Optional(typebox_exports.String({minLength:1})),upstreamModelId:typebox_exports.Optional(typebox_exports.String({minLength:1})),serviceTier:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("flex"),typebox_exports.Literal("priority"),typebox_exports.Literal("ultrafast")])),promptPreset:typebox_exports.Optional(typebox_exports.String({minLength:1})),recoverTextToolCalls:typebox_exports.Optional(typebox_exports.Boolean()),api:typebox_exports.Optional(typebox_exports.String({minLength:1})),baseUrl:typebox_exports.Optional(typebox_exports.String({minLength:1})),reasoning:typebox_exports.Optional(typebox_exports.Boolean()),thinkingLevelMap:typebox_exports.Optional(ThinkingLevelMapSchema),defaultThinkingLevel:typebox_exports.Optional(ThinkingLevelSchema),input:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Union([typebox_exports.Literal("text"),typebox_exports.Literal("image"),typebox_exports.Literal("video")]))),inputLimits:typebox_exports.Optional(ModelInputLimitsSchema),cost:typebox_exports.Optional(ModelCostSchema),promptCache:typebox_exports.Optional(ModelPromptCacheSchema),contextWindow:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema)}),ModelOverrideSchema=typebox_exports.Object({name:typebox_exports.Optional(typebox_exports.String({minLength:1})),promptPreset:typebox_exports.Optional(typebox_exports.String({minLength:1})),recoverTextToolCalls:typebox_exports.Optional(typebox_exports.Boolean()),reasoning:typebox_exports.Optional(typebox_exports.Boolean()),thinkingLevelMap:typebox_exports.Optional(ThinkingLevelMapSchema),thinkingLevelMapMode:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("merge"),typebox_exports.Literal("replace")])),input:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Union([typebox_exports.Literal("text"),typebox_exports.Literal("image"),typebox_exports.Literal("video")]))),inputLimits:typebox_exports.Optional(ModelInputLimitsSchema),cost:typebox_exports.Optional(typebox_exports.Object({input:typebox_exports.Optional(typebox_exports.Number()),output:typebox_exports.Optional(typebox_exports.Number()),cacheRead:typebox_exports.Optional(typebox_exports.Number()),cacheWrite:typebox_exports.Optional(typebox_exports.Number()),tiers:typebox_exports.Optional(typebox_exports.Array(ModelCostTierSchema))})),promptCache:typebox_exports.Optional(ModelPromptCacheSchema),contextWindow:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema)}),ProviderConfigSchema=typebox_exports.Object({name:typebox_exports.Optional(typebox_exports.String({minLength:1})),disabled:typebox_exports.Optional(typebox_exports.Boolean()),baseUrl:typebox_exports.Optional(typebox_exports.String({minLength:1})),apiKey:typebox_exports.Optional(typebox_exports.String({minLength:1})),api:typebox_exports.Optional(typebox_exports.String({minLength:1})),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema),authHeader:typebox_exports.Optional(typebox_exports.Boolean()),whitelist:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),blacklist:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),models:typebox_exports.Optional(typebox_exports.Array(ModelDefinitionSchema)),modelOverrides:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ModelOverrideSchema)),credentials:typebox_exports.Optional(CredentialPolicySchema)}),ModelsConfigSchema=typebox_exports.Object({disabledProviders:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),providers:typebox_exports.Record(typebox_exports.String(),ProviderConfigSchema)}),validateModelsConfig=Compile(ModelsConfigSchema);import{chmodSync as chmodSync2,existsSync as existsSync4,readFileSync as readFileSync7,renameSync as renameSync4,rmSync as rmSync2,statSync as statSync3,writeFileSync as writeFileSync5}from"node:fs";import{isDeepStrictEqual}from"node:util";var isRecord5=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2),JsoncSpanScanner=class{constructor(text2){this.text=text2}skipTrivia(from){let i=from;for(;i<this.text.length;){let c=this.text[i];if(c===" "||c===" "||c===`
|
|
710
|
+
${REFUSED_AFTER_REEXCHANGE}`),committed||=isCommittedRotationOutput(event),yield event}async function retryOnceOnRejectedToken(attempt2){let first=await attempt2(void 0),statuses=first.rejectedTokenStatuses??[],rejectedAccess=first.rejectableAccess;if(rejectedAccess===void 0||statuses.length===0)return first.stream;let final=first.stream;async function*events(){let iterator=first.stream[Symbol.asyncIterator](),held=[];try{for(;;){let next=await iterator.next();if(next.done){yield*held;return}let event=next.value;if(refusesToken(event,statuses)){await iterator.return?.(void 0);let retried=await attempt2(rejectedAccess);final=retried.stream,yield*markRefusalAfterReexchange(retried.stream,statuses);return}if(isCommittedRotationOutput(event)){yield*held,yield event;break}held.push(event)}yield*{[Symbol.asyncIterator]:()=>iterator}}finally{await iterator.return?.(void 0)}}let source2=events();return typeof first.stream.result=="function"&&(source2.result=()=>final.result?.()??Promise.reject(new Error("provider stream has no result"))),source2}import{readFileSync as readFileSync8}from"node:fs";import{readFile as readFile2}from"node:fs/promises";function stripJsonComments(input){return input.replace(/"(?:\\.|[^"\\])*"|\/\/[^\n]*/g,m=>m[0]==='"'?m:"").replace(/"(?:\\.|[^"\\])*"|,(\s*[}\]])/g,(m,tail)=>tail??(m[0]==='"'?m:""))}var ThinkingLevelMapValueSchema=typebox_exports.Union([typebox_exports.String(),typebox_exports.Null()]),ThinkingLevelMapSchema=typebox_exports.Object({off:typebox_exports.Optional(ThinkingLevelMapValueSchema),minimal:typebox_exports.Optional(ThinkingLevelMapValueSchema),low:typebox_exports.Optional(ThinkingLevelMapValueSchema),medium:typebox_exports.Optional(ThinkingLevelMapValueSchema),high:typebox_exports.Optional(ThinkingLevelMapValueSchema),xhigh:typebox_exports.Optional(ThinkingLevelMapValueSchema),max:typebox_exports.Optional(ThinkingLevelMapValueSchema)}),ThinkingLevelSchema=typebox_exports.Union([typebox_exports.Literal("off"),typebox_exports.Literal("minimal"),typebox_exports.Literal("low"),typebox_exports.Literal("medium"),typebox_exports.Literal("high"),typebox_exports.Literal("xhigh"),typebox_exports.Literal("max")]);var CredentialSlotRefSchema=typebox_exports.Object({env:typebox_exports.Optional(typebox_exports.String({minLength:1})),value:typebox_exports.Optional(typebox_exports.String({minLength:1}))},{additionalProperties:!1}),CredentialPolicySchema=typebox_exports.Object({rotation:typebox_exports.Optional(typebox_exports.Boolean()),affinity:typebox_exports.Optional(typebox_exports.Boolean()),cooldownBaseMs:typebox_exports.Optional(typebox_exports.Number({minimum:0})),cooldownCapMs:typebox_exports.Optional(typebox_exports.Number({minimum:0})),slots:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String({minLength:1}),CredentialSlotRefSchema))},{additionalProperties:!1}),PercentileCutoffsSchema=typebox_exports.Object({p50:typebox_exports.Optional(typebox_exports.Number()),p75:typebox_exports.Optional(typebox_exports.Number()),p90:typebox_exports.Optional(typebox_exports.Number()),p99:typebox_exports.Optional(typebox_exports.Number())}),OpenRouterRoutingSchema=typebox_exports.Object({allow_fallbacks:typebox_exports.Optional(typebox_exports.Boolean()),require_parameters:typebox_exports.Optional(typebox_exports.Boolean()),data_collection:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("deny"),typebox_exports.Literal("allow")])),zdr:typebox_exports.Optional(typebox_exports.Boolean()),enforce_distillable_text:typebox_exports.Optional(typebox_exports.Boolean()),order:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),only:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),ignore:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),quantizations:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),sort:typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Object({by:typebox_exports.Optional(typebox_exports.String()),partition:typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Null()]))})])),max_price:typebox_exports.Optional(typebox_exports.Object({prompt:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),completion:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),image:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),audio:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),request:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()]))})),preferred_min_throughput:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),PercentileCutoffsSchema])),preferred_max_latency:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),PercentileCutoffsSchema]))}),VercelGatewayRoutingSchema=typebox_exports.Object({only:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),order:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String()))}),ChatTemplateKwargScalarSchema=typebox_exports.Union([typebox_exports.String(),typebox_exports.Number(),typebox_exports.Boolean(),typebox_exports.Null()]),ChatTemplateKwargVariableSchema=typebox_exports.Object({$var:typebox_exports.Union([typebox_exports.Literal("thinking.enabled"),typebox_exports.Literal("thinking.effort")]),omitWhenOff:typebox_exports.Optional(typebox_exports.Boolean())}),ChatTemplateKwargSchema=typebox_exports.Union([ChatTemplateKwargScalarSchema,ChatTemplateKwargVariableSchema]),ModelCostRatesSchema={input:typebox_exports.Number(),output:typebox_exports.Number(),cacheRead:typebox_exports.Number(),cacheWrite:typebox_exports.Number()},ModelCostTierSchema=typebox_exports.Object({inputTokensAbove:typebox_exports.Number(),...ModelCostRatesSchema}),ModelCostSchema=typebox_exports.Object({...ModelCostRatesSchema,tiers:typebox_exports.Optional(typebox_exports.Array(ModelCostTierSchema))}),ModelPromptCacheSchema=typebox_exports.Object({short:typebox_exports.Optional(typebox_exports.Number({exclusiveMinimum:0})),long:typebox_exports.Optional(typebox_exports.Number({exclusiveMinimum:0}))}),ImageResizeSchema=typebox_exports.Object({maxWidth:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),maxHeight:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),maxBytes:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),jpegQuality:typebox_exports.Optional(typebox_exports.Integer({minimum:1,maximum:100}))}),ModelInputLimitsSchema=typebox_exports.Object({maxRequestBytes:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),images:typebox_exports.Optional(typebox_exports.Object({resize:typebox_exports.Optional(ImageResizeSchema),maxPerMessage:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),maxPerRequest:typebox_exports.Optional(typebox_exports.Integer({minimum:1}))}))}),OpenAICompletionsCompatSchema=typebox_exports.Object({supportsStore:typebox_exports.Optional(typebox_exports.Boolean()),supportsDeveloperRole:typebox_exports.Optional(typebox_exports.Boolean()),supportsReasoningEffort:typebox_exports.Optional(typebox_exports.Boolean()),supportsUsageInStreaming:typebox_exports.Optional(typebox_exports.Boolean()),supportsFinishReason:typebox_exports.Optional(typebox_exports.Boolean()),maxTokensField:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("max_completion_tokens"),typebox_exports.Literal("max_tokens")])),requiresToolResultName:typebox_exports.Optional(typebox_exports.Boolean()),requiresAssistantAfterToolResult:typebox_exports.Optional(typebox_exports.Boolean()),requiresThinkingAsText:typebox_exports.Optional(typebox_exports.Boolean()),requiresReasoningContentOnAssistantMessages:typebox_exports.Optional(typebox_exports.Boolean()),supportsDisabledThinking:typebox_exports.Optional(typebox_exports.Boolean()),thinkingFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openrouter"),typebox_exports.Literal("together"),typebox_exports.Literal("deepseek"),typebox_exports.Literal("zai"),typebox_exports.Literal("qwen"),typebox_exports.Literal("chat-template"),typebox_exports.Literal("qwen-chat-template"),typebox_exports.Literal("string-thinking"),typebox_exports.Literal("ant-ling")])),chatTemplateKwargs:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ChatTemplateKwargSchema)),cacheControlFormat:typebox_exports.Optional(typebox_exports.Literal("anthropic")),openRouterRouting:typebox_exports.Optional(OpenRouterRoutingSchema),vercelGatewayRouting:typebox_exports.Optional(VercelGatewayRoutingSchema),zaiToolStream:typebox_exports.Optional(typebox_exports.Boolean()),supportsStrictMode:typebox_exports.Optional(typebox_exports.Boolean()),toolCallFormat:typebox_exports.Optional(typebox_exports.String()),sendSessionAffinityHeaders:typebox_exports.Optional(typebox_exports.Boolean()),deferredToolsMode:typebox_exports.Optional(typebox_exports.Literal("kimi")),sessionAffinityFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openai-nosession"),typebox_exports.Literal("openrouter")])),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean())}),OpenAIResponsesCompatSchema=typebox_exports.Object({supportsDeveloperRole:typebox_exports.Optional(typebox_exports.Boolean()),sessionAffinityFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openai-nosession"),typebox_exports.Literal("openrouter")])),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSocket:typebox_exports.Optional(typebox_exports.Boolean()),supportsRemoteCompactionV2:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSearchPreview:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolSearch:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean())}),AnthropicMessagesCompatSchema=typebox_exports.Object({supportsEagerToolInputStreaming:typebox_exports.Optional(typebox_exports.Boolean()),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),sendSessionAffinityHeaders:typebox_exports.Optional(typebox_exports.Boolean()),supportsCacheControlOnTools:typebox_exports.Optional(typebox_exports.Boolean()),supportsDisabledThinking:typebox_exports.Optional(typebox_exports.Boolean()),supportsTemperature:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolChoice:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean()),forceAdaptiveThinking:typebox_exports.Optional(typebox_exports.Boolean()),allowEmptySignature:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolReferences:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSearch:typebox_exports.Optional(typebox_exports.Boolean()),allowedFallbackModels:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Object({provider:typebox_exports.String({minLength:1}),model:typebox_exports.String({minLength:1}),cost:ModelCostSchema}),{maxItems:3}))}),ProviderCompatSchema=typebox_exports.Union([OpenAICompletionsCompatSchema,OpenAIResponsesCompatSchema,AnthropicMessagesCompatSchema]),ExtraBodySchema=typebox_exports.Record(typebox_exports.String(),typebox_exports.Unknown()),ModelDefinitionSchema=typebox_exports.Object({id:typebox_exports.String({minLength:1}),name:typebox_exports.Optional(typebox_exports.String({minLength:1})),upstreamModelId:typebox_exports.Optional(typebox_exports.String({minLength:1})),serviceTier:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("flex"),typebox_exports.Literal("priority"),typebox_exports.Literal("ultrafast")])),promptPreset:typebox_exports.Optional(typebox_exports.String({minLength:1})),recoverTextToolCalls:typebox_exports.Optional(typebox_exports.Boolean()),api:typebox_exports.Optional(typebox_exports.String({minLength:1})),baseUrl:typebox_exports.Optional(typebox_exports.String({minLength:1})),reasoning:typebox_exports.Optional(typebox_exports.Boolean()),thinkingLevelMap:typebox_exports.Optional(ThinkingLevelMapSchema),defaultThinkingLevel:typebox_exports.Optional(ThinkingLevelSchema),input:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Union([typebox_exports.Literal("text"),typebox_exports.Literal("image"),typebox_exports.Literal("video")]))),inputLimits:typebox_exports.Optional(ModelInputLimitsSchema),cost:typebox_exports.Optional(ModelCostSchema),promptCache:typebox_exports.Optional(ModelPromptCacheSchema),contextWindow:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema)}),ModelOverrideSchema=typebox_exports.Object({name:typebox_exports.Optional(typebox_exports.String({minLength:1})),promptPreset:typebox_exports.Optional(typebox_exports.String({minLength:1})),recoverTextToolCalls:typebox_exports.Optional(typebox_exports.Boolean()),reasoning:typebox_exports.Optional(typebox_exports.Boolean()),thinkingLevelMap:typebox_exports.Optional(ThinkingLevelMapSchema),thinkingLevelMapMode:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("merge"),typebox_exports.Literal("replace")])),input:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Union([typebox_exports.Literal("text"),typebox_exports.Literal("image"),typebox_exports.Literal("video")]))),inputLimits:typebox_exports.Optional(ModelInputLimitsSchema),cost:typebox_exports.Optional(typebox_exports.Object({input:typebox_exports.Optional(typebox_exports.Number()),output:typebox_exports.Optional(typebox_exports.Number()),cacheRead:typebox_exports.Optional(typebox_exports.Number()),cacheWrite:typebox_exports.Optional(typebox_exports.Number()),tiers:typebox_exports.Optional(typebox_exports.Array(ModelCostTierSchema))})),promptCache:typebox_exports.Optional(ModelPromptCacheSchema),contextWindow:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema)}),ProviderConfigSchema=typebox_exports.Object({name:typebox_exports.Optional(typebox_exports.String({minLength:1})),disabled:typebox_exports.Optional(typebox_exports.Boolean()),baseUrl:typebox_exports.Optional(typebox_exports.String({minLength:1})),apiKey:typebox_exports.Optional(typebox_exports.String({minLength:1})),api:typebox_exports.Optional(typebox_exports.String({minLength:1})),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),typebox_exports.String())),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema),authHeader:typebox_exports.Optional(typebox_exports.Boolean()),whitelist:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),blacklist:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),hideFreeModels:typebox_exports.Optional(typebox_exports.Boolean()),models:typebox_exports.Optional(typebox_exports.Array(ModelDefinitionSchema)),modelOverrides:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ModelOverrideSchema)),credentials:typebox_exports.Optional(CredentialPolicySchema)}),ModelsConfigSchema=typebox_exports.Object({disabledProviders:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),providers:typebox_exports.Record(typebox_exports.String(),ProviderConfigSchema)}),validateModelsConfig=Compile(ModelsConfigSchema);import{chmodSync as chmodSync2,existsSync as existsSync4,readFileSync as readFileSync7,renameSync as renameSync4,rmSync as rmSync2,statSync as statSync3,writeFileSync as writeFileSync5}from"node:fs";import{isDeepStrictEqual}from"node:util";var isRecord5=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2),JsoncSpanScanner=class{constructor(text2){this.text=text2}skipTrivia(from){let i=from;for(;i<this.text.length;){let c=this.text[i];if(c===" "||c===" "||c===`
|
|
711
711
|
`||c==="\r"||c==="\uFEFF")i++;else if(this.text.startsWith("//",i))i=this.lineEnd(i);else if(this.text.startsWith("/*",i))i=this.blockCommentEnd(i);else break}return i}value(from){let start=this.skipTrivia(from),c=this.text[start];if(c==="{")return this.object(start);if(c==="[")return this.array(start);if(c==='"')return{start,end:this.stringEnd(start)};let end=start;for(;end<this.text.length&&!/[\s,\]}/]/.test(this.text[end]??"");)end++;if(end===start)throw new Error(`unexpected character at offset ${start}`);return{start,end}}object(start){let members=[],i=start+1;for(;;){i=this.skipTrivia(i);let c=this.text[i];if(c==="}")return{start,end:i+1,members};if(c===","){i++;continue}if(c!=='"')throw new Error(`expected a key at offset ${i}`);let keySpan={start:i,end:this.stringEnd(i)},colon=this.skipTrivia(keySpan.end);if(this.text[colon]!==":")throw new Error(`expected ':' at offset ${colon}`);let value2=this.value(colon+1);members.push({key:JSON.parse(this.text.slice(keySpan.start,keySpan.end)),keySpan,value:value2}),i=value2.end}}array(start){let elements=[],i=start+1;for(;;){i=this.skipTrivia(i);let c=this.text[i];if(c==="]")return{start,end:i+1,elements};if(c===","){i++;continue}let element=this.value(i);elements.push(element),i=element.end}}stringEnd(start){for(let i=start+1;i<this.text.length;i++)if(this.text[i]==="\\")i++;else if(this.text[i]==='"')return i+1;throw new Error("unterminated string")}blockCommentEnd(from){let close=this.text.indexOf("*/",from+2);if(close<0)throw new Error("unterminated comment");return close+2}lineEnd(from){let newline=this.text.indexOf(`
|
|
712
712
|
`,from);return newline<0?this.text.length:newline}},parseJsonc=content=>JSON.parse(stripJsonComments(stripBom(content)));function migratedDocument(document){let renamed=[],next={...document};if(isRecord5(document.providers)){let providers={};for(let[id,provider]of Object.entries(document.providers)){let canonical=normalizeProviderId(id);canonical!==id&&renamed.push(`${id} -> ${canonical}`),!(canonical!==id&&canonical in document.providers)&&(providers[canonical]=provider)}next.providers=providers}return Array.isArray(document.disabledProviders)&&(next.disabledProviders=document.disabledProviders.map(id=>typeof id!="string"||normalizeProviderId(id)===id?id:(renamed.push(`${id} -> ${normalizeProviderId(id)}`),normalizeProviderId(id)))),{next,renamed:[...new Set(renamed)]}}function memberRemovalSpan(text2,scanner,member){let after=scanner.skipTrivia(member.value.end);if(text2[after]===","){let start=member.keySpan.start;for(;start>0&&(text2[start-1]===" "||text2[start-1]===" ");)start--;let ownsLine=start===0||text2[start-1]===`
|
|
713
713
|
`,end=after+1;for(;end<text2.length&&(text2[end]===" "||text2[end]===" ");)end++;return ownsLine&&text2[end]==="\r"&&end++,ownsLine&&text2[end]===`
|
|
@@ -722,9 +722,9 @@ File: ${path15}`)}let config=parsed,providers=new Map;for(let[providerId,provide
|
|
|
722
722
|
|
|
723
723
|
File: ${path15}`)}return _ModelConfig.parseAndMigrate(content,path15)}static loadSync(modelsJsonPath){if(!modelsJsonPath)return new _ModelConfig(new Map);let path15=normalizePath(modelsJsonPath);try{return _ModelConfig.parseAndMigrate(readFileSync8(path15,"utf-8"),path15)}catch(error2){return error2.code==="ENOENT"?new _ModelConfig(new Map):new _ModelConfig(new Map,new Set,`Failed to load models.json: ${error2 instanceof Error?error2.message:error2}
|
|
724
724
|
|
|
725
|
-
File: ${path15}`)}}getProvider(providerId){return this.providers.get(providerId)}getProviderIds(){return[...this.providers.keys()]}isProviderDisabled(providerId){return this.disabledProviders.has(providerId)||this.providers.get(providerId)?.disabled===!0}getError(){return this.error}getWarnings(){return this.warnings}};import{join as join7}from"node:path";var sharedModelsFileReadState,InMemoryCodingAgentModelsStore=class{constructor(){this.entries=new Map}async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}},FileModelsStore=class{constructor(path15=join7(getAgentDir(),"models-store.json")){this.path=normalizePath(path15),this.storage=new FileAuthStorageBackend(this.path),this.readState=sharedModelsFileReadState?.path===this.path?sharedModelsFileReadState.readState:{data:{}},sharedModelsFileReadState||(sharedModelsFileReadState={path:this.path,readState:this.readState})}parse(content){return content?JSON.parse(stripBom(content)):{}}updateReadState(readState2,data,revision){readState2.data=data,readState2.revision=revision}reloadFromStorage(readState2,options){return this.storage.withLockAsync(async content=>{let data=this.parse(content);return this.updateReadState(readState2,data,getFileRevision(this.path)),{result:data}},options)}async readLatest(readState2,options){options?.signal?.throwIfAborted();let revision=getFileRevision(this.path);if(revision!==void 0&&revision===readState2.revision)return readState2.data;if(!readState2.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorage(readState2,{signal:controller.signal}),readers:0};readState2.reload=reload2,reload2.promise.then(()=>{readState2.reload===reload2&&(readState2.reload=void 0)},()=>{readState2.reload===reload2&&(readState2.reload=void 0)})}let reload=readState2.reload;reload.readers++;try{return await raceWithAbortSignal(reload.promise,options?.signal)}finally{reload.readers--,reload.readers===0&&readState2.reload===reload&&(readState2.reload=void 0,reload.controller.abort())}}async read(providerId,options){let entry=(await this.readLatest(this.readState,options))[providerId];return options?.signal?.throwIfAborted(),entry?structuredClone(entry):void 0}async write(providerId,entry,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return current[providerId]=structuredClone(entry),latest=current,{result:void 0,next:JSON.stringify(current,null,2)}},options),latest&&this.updateReadState(this.readState,latest)}async delete(providerId,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return delete current[providerId],latest=current,{result:void 0,next:JSON.stringify(current,null,2)}},options),latest&&this.updateReadState(this.readState,latest)}};function configuredHeaderAuthStatus(configHeaders,extensionHeaders){let sawCredentialHeader=!1;for(let header2 of effectiveHeaders(configHeaders,extensionHeaders).values()){if(!isCredentialHeaderName(header2.name))continue;if(sawCredentialHeader=!0,isCommandConfigValue(header2.value))return{configured:!0,source:"models_json_command"};let envNames=getConfigValueEnvVarNames(header2.value);if(envNames.length>0){if(isConfigValueConfigured(header2.value))return{configured:!0,source:"environment",label:envNames.join(", ")};continue}if(hasCredentialHeaders({[header2.name]:header2.value}))return{configured:!0,source:header2.source}}return sawCredentialHeader?{configured:!1}:void 0}function headerAuthResolutionSource(configHeaders,extensionHeaders){let headers=effectiveHeaders(configHeaders,extensionHeaders),values=Object.fromEntries([...headers.values()].map(header2=>[header2.name,header2.value]));if(hasCredentialHeaders(values)){for(let header2 of headers.values())if(hasCredentialHeaders({[header2.name]:header2.value}))return header2.source==="extension_headers"?"provider extension headers":"models.json headers"}}async function checkConfiguredHeaderAuth(headers,ctx,source2){if(headers)for(let header2 of effectiveHeaders(headers,void 0).values()){if(!isCredentialHeaderName(header2.name))continue;if(isCommandConfigValue(header2.value))return{type:"api_key",source:source2};let envNames=getConfigValueEnvVarNames(header2.value),configured=!0;for(let envName of envNames)if(await ctx.env(envName)===void 0){configured=!1;break}if(configured&&hasCredentialHeaders({[header2.name]:header2.value}))return{type:"api_key",source:source2}}}function effectiveHeaders(configHeaders,extensionHeaders){let effective=new Map;return addHeaders(effective,configHeaders,"models_json_headers"),addHeaders(effective,extensionHeaders,"extension_headers"),effective}function addHeaders(target,headers,source2){for(let[name,value2]of Object.entries(headers??{}))typeof value2=="string"&&target.set(name.toLowerCase(),{name,value:value2,source:source2})}function composeApiKeyAuth(providerId,base,config,extension){let inherited=base?.auth.apiKey,rawKey=configuredApiKey(config,extension),oauth=extension?.oauth??base?.auth.oauth,rawHeaders=configuredHeaders(config,extension),headerSource=headerAuthResolutionSource(config?.headers,extension?.headers),authHeader=extension?.authHeader??config?.authHeader??!1;return!inherited&&rawKey===void 0&&!headerSource&&oauth?ambientOnlyAuth(providerId,oauth,rawHeaders,headerSource,authHeader):{name:inherited?.name??"API key",login:inherited?.login??(headerSource&&rawKey===void 0?void 0:async interaction=>({type:"api_key",key:await interaction.prompt({type:"secret",message:"Enter API key"})})),check:async input=>{if(input.credential?.key){let inheritedCheck2=await inherited?.check?.(input);return inheritedCheck2||{type:"api_key",source:"stored credential"}}if(rawKey!==void 0){if(isCommandConfigValue(rawKey))return{type:"api_key",source:"configured API key"};for(let name of getConfigValueEnvVarNames(rawKey))if(await input.ctx.env(name)===void 0)return;return{type:"api_key",source:"configured API key"}}let inheritedCheck=await inherited?.check?.(input);if(inheritedCheck)return inheritedCheck;let resolved=await inherited?.resolve(input);return resolved?{type:"api_key",source:resolved.source}:checkConfiguredHeaderAuth(rawHeaders,input.ctx,headerSource)},resolve:async input=>{let result3=await resolveBaseAuth(providerId,inherited,rawKey,input),explicitEnv={...input.credential?.env??{},...result3?.env??{}},headerEnv=await configContextEnv(Object.values(rawHeaders??{}),input.ctx,explicitEnv),headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,headerEnv);if(!(!result3&&!hasCredentialHeaders(headers)))return{...result3,auth:withConfiguredAuth(result3?.auth??{},headers,authHeader),source:result3?.source??headerSource}}}}function ambientResolverOf(oauth){let candidate=oauth?.resolveAmbient;return typeof candidate=="function"?candidate:void 0}function ambientOnlyAuth(providerId,oauth,rawHeaders,headerSource,authHeader){let resolveAmbient=ambientResolverOf(oauth);if(!resolveAmbient)return;let resolve45=async input=>{let result3=await resolveAmbient({ctx:input.ctx,env:input.credential?.env,signal:input.signal});if(!result3||input.credential?.key&&input.credential.key!==result3.auth.apiKey)return;let explicitEnv={...input.credential?.env??{},...result3.env??{}},headerEnv=await configContextEnv(Object.values(rawHeaders??{}),input.ctx,explicitEnv),headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,headerEnv);return{...result3,auth:withConfiguredAuth(result3.auth,headers,authHeader),source:result3.source??headerSource}};return{name:oauth.name??"Ambient credentials",ambientOnly:!0,check:async input=>{let resolved=await resolve45(input);return resolved?{type:"oauth",source:resolved.source}:void 0},resolve:resolve45}}function configuredApiKey(config,extension){return extension?.apiKey??config?.apiKey}function configuredHeaders(config,extension){if(!(!config?.headers&&!extension?.headers))return{...config?.headers,...extension?.headers}}function withConfiguredAuth(auth,headers,authHeader){let mergedHeaders=auth.headers||headers?{...auth.headers,...headers}:void 0;if(authHeader){if(!auth.apiKey)throw new Error("authHeader requires a resolved API key");mergedHeaders={...mergedHeaders,Authorization:`Bearer ${auth.apiKey}`}}return{...auth,headers:mergedHeaders}}async function resolveBaseAuth(providerId,inherited,rawKey,input){if(input.credential?.key)return inherited?inherited.resolve(input):{auth:{apiKey:input.credential.key},env:input.credential.env,source:"stored credential"};if(rawKey===void 0)return inherited?.resolve(input);let env=await configContextEnv([rawKey],input.ctx,input.credential?.env),key=await resolveConfigValueOrThrow(rawKey,`API key for provider "${providerId}"`,env);return inherited?inherited.resolve({...input,credential:{type:"api_key",key}}):{auth:{apiKey:key},source:"configured API key"}}async function configContextEnv(values,ctx,explicit){let env={...explicit};for(let name of new Set(values.flatMap(getConfigValueEnvVarNames))){if(env[name]!==void 0)continue;let value2=await ctx.env(name);value2!==void 0&&(env[name]=value2)}return Object.keys(env).length>0?env:void 0}function getAllProviderModels(provider){return provider?provider.getAllModels?.()??provider.getModels():[]}function isChatModelConfig(definition){return(definition.type??"chat")==="chat"}function findExtensionChatModel(extension,modelId){return extension?.models?.filter(isChatModelConfig).find(entry=>entry.id===modelId)}function mergeCompat(base,override){if(!override)return base;let merged={...base,...override},baseNested=base,overrideNested=override,mergedNested=merged;for(let key of["openRouterRouting","vercelGatewayRouting","chatTemplateKwargs","chatTemplateArgs"]){let baseValue=baseNested?.[key],overrideValue=overrideNested[key];(typeof baseValue=="object"&&baseValue!==null||typeof overrideValue=="object"&&overrideValue!==null)&&(mergedNested[key]={...baseValue,...overrideValue})}return merged}function mergeInputLimits(base,override){return override?{...base,...override,images:override.images?{...base?.images,...override.images,resize:override.images.resize?{...base?.images?.resize,...override.images.resize}:base?.images?.resize}:base?.images}:base}function applyModelOverride(model,override){return{...model,name:override.name??model.name,promptPreset:override.promptPreset??model.promptPreset,recoverTextToolCalls:override.recoverTextToolCalls??model.recoverTextToolCalls,reasoning:override.reasoning??model.reasoning,thinkingLevelMap:override.thinkingLevelMap?override.thinkingLevelMapMode==="replace"?override.thinkingLevelMap:{...model.thinkingLevelMap,...override.thinkingLevelMap}:model.thinkingLevelMap,input:override.input??model.input,inputLimits:mergeInputLimits(model.inputLimits,override.inputLimits),cost:override.cost?{input:override.cost.input??model.cost.input,output:override.cost.output??model.cost.output,cacheRead:override.cost.cacheRead??model.cost.cacheRead,cacheWrite:override.cost.cacheWrite??model.cost.cacheWrite,tiers:override.cost.tiers??model.cost.tiers}:model.cost,promptCache:override.promptCache?{...model.promptCache,...override.promptCache}:model.promptCache,contextWindow:override.contextWindow??model.contextWindow,maxTokens:override.maxTokens??model.maxTokens,cacheRetention:override.cacheRetention??model.cacheRetention,samplingParams:override.samplingParams?{...model.samplingParams,...override.samplingParams}:model.samplingParams,compat:mergeCompat(model.compat,override.compat)}}function modelFromJson(providerId,definition,providerConfig,defaults){let api=definition.api??providerConfig.api??defaults?.api;if(!api)throw new Error(`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`);let baseUrl=definition.baseUrl??providerConfig.baseUrl??defaults?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);if(definition.contextWindow!==void 0&&definition.contextWindow<=0)throw new Error(`Provider ${providerId}, model ${definition.id}: invalid contextWindow`);if(definition.maxTokens!==void 0&&definition.maxTokens<=0)throw new Error(`Provider ${providerId}, model ${definition.id}: invalid maxTokens`);return{id:definition.id,name:definition.name??definition.id,promptPreset:definition.promptPreset,recoverTextToolCalls:definition.recoverTextToolCalls,api,provider:providerId,baseUrl,reasoning:definition.reasoning??!1,thinkingLevelMap:definition.thinkingLevelMap,defaultThinkingLevel:definition.defaultThinkingLevel,input:definition.input??["text"],inputLimits:definition.inputLimits,cost:definition.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},promptCache:definition.promptCache,contextWindow:definition.contextWindow??128e3,maxTokens:definition.maxTokens??16384,samplingParams:definition.samplingParams,headers:void 0,cacheRetention:definition.cacheRetention??providerConfig.cacheRetention,compat:mergeCompat(providerConfig.compat,definition.compat)}}function findModelDefaults(models,modelId,api){let chatModels2=models.filter(model=>isModelType(model,"chat"));return chatModels2.find(model=>model.id===modelId)??(api?chatModels2.find(model=>model.api===api):void 0)??chatModels2.find(model=>model.api==="openai-completions")??chatModels2[0]}function findExtensionModelDefaults(models,definition){let type2=definition.type??"chat",candidates=models.filter(model=>isModelType(model,type2));return candidates.find(model=>model.id===definition.id)??(definition.api?candidates.find(model=>model.api===definition.api):void 0)??(type2==="chat"?candidates.find(model=>model.api==="openai-completions"):void 0)??candidates[0]}function extensionModelFromDefinition(providerId,models,config,definition){let type2=definition.type??"chat",defaults=findExtensionModelDefaults(models,definition),api=definition.api??(type2==="chat"?config.api:void 0)??defaults?.api;if(!api)throw new Error(type2==="chat"?`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`:`Provider ${providerId}, model ${definition.id}: no "api" specified. Set it at model level.`);let baseUrl=definition.baseUrl??config.baseUrl??defaults?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);return definition.type==="image"?{...definition,api,provider:providerId,baseUrl,headers:void 0}:definition.type==="classifier"?{...definition,api,provider:providerId,baseUrl,headers:void 0}:{...definition,api,provider:providerId,baseUrl,headers:void 0}}function applyModelsJson(providerId,baseModels,config,extension){if(!config)return[...baseModels];let hasOverrides=config.modelOverrides&&Object.keys(config.modelOverrides).length>0;if(!config.models?.length&&!config.baseUrl&&!config.headers&&!config.extraBody&&!config.compat&&!hasOverrides&&!config.whitelist&&!config.blacklist&&!config.apiKey&&config.authHeader===void 0)throw new Error(`Provider ${providerId}: must specify "baseUrl", "headers", "extraBody", "compat", "modelOverrides", or "models".`);let models=(providerId==="ollama"&&config.models?.length?[]:baseModels).map(model=>{let baseUrl=config.baseUrl??model.baseUrl;return isModelType(model,"chat")?{...model,baseUrl,compat:mergeCompat(model.compat,config.compat)}:{...model,baseUrl}});for(let definition of config.models??[]){let existingIndex=models.findIndex(model2=>isModelType(model2,"chat")&&model2.id===definition.id),defaults=existingIndex>=0?models[existingIndex]:findModelDefaults(models,definition.id,definition.api??extension?.api??config.api),model=modelFromJson(providerId,definition,config,{...defaults,api:extension?.api??defaults?.api,baseUrl:extension?.baseUrl??defaults?.baseUrl});existingIndex>=0?models[existingIndex]=model:models.push(model)}let whitelist=config.whitelist?new Set(config.whitelist):void 0,blacklist=config.blacklist?new Set(config.blacklist):void 0;return models.filter(model=>(whitelist===void 0||whitelist.has(model.id))&&(blacklist===void 0||!blacklist.has(model.id)))}function applyExtension(providerId,models,config,customModelIds){if(!config)return[...models];if(!config.models)return config.baseUrl?models.map(model=>({...model,baseUrl:config.baseUrl})):[...models];let declaredModels=config.models;return[...declaredModels.map(definition=>extensionModelFromDefinition(providerId,models,config,definition)),...models.filter(model=>isModelType(model,"chat")&&customModelIds.has(model.id)&&!declaredModels.some(definition=>isChatModelConfig(definition)&&definition.id===model.id))]}function adaptOAuth(config){return{name:config.name,isSubscription:config.isSubscription,login:async callbacks=>({...await config.login({onAuth:info=>callbacks.notify({type:"auth_url",...info}),onDeviceCode:info=>callbacks.notify({type:"device_code",...info}),onPrompt:prompt=>callbacks.prompt({type:"text",...prompt}),onProgress:message=>callbacks.notify({type:"progress",message}),onManualCodeInput:()=>callbacks.prompt({type:"manual_code",message:"Paste the authorization code"}),onSelect:prompt=>callbacks.prompt({type:"select",...prompt}),signal:callbacks.signal}),type:"oauth"}),refresh:async(credential,signal)=>({...await config.refreshToken(credential,signal),type:"oauth"}),toAuth:async credential=>({apiKey:config.getApiKey(credential)}),...config.check?{check:config.check}:{}}}function composeOAuthAuth(providerId,base,config,extension){let oauth=extension?.oauth?adaptOAuth(extension.oauth):base?.auth.oauth;if(!oauth)return;let rawHeaders=configuredHeaders(config,extension),authHeader=extension?.authHeader??config?.authHeader??!1;return{...oauth,toAuth:async credential=>{let auth=await oauth.toAuth(credential),env=credential.env,headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,typeof env=="object"&&env!==null?env:void 0);return withConfiguredAuth(auth,headers,authHeader)}}}function rawModelHeaders(model,config,extension){let chatDefinition=isModelType(model,"chat")?config?.models?.find(entry=>entry.id===model.id):void 0,extensionModel=extension?.models?.find(entry=>(entry.type??"chat")===(model.type??"chat")&&entry.id===model.id),headers={...isModelType(model,"chat")?config?.modelOverrides?.[model.id]?.headers:void 0,...chatDefinition?.headers,...extensionModel?.headers};return Object.keys(headers).length>0?headers:void 0}function rawModelExtraBody(model,config,extension){let definition=config?.models?.find(entry=>entry.id===model.id),extensionModel=findExtensionChatModel(extension,model.id),extraBody={...config?.modelOverrides?.[model.id]?.extraBody,...definition?.extraBody,...extensionModel?.extraBody};return Object.keys(extraBody).length>0?extraBody:void 0}function validateExtensionProvider(providerId,base,modelsConfig,extension){if(extension.streamSimple&&!extension.api)throw new Error(`Provider ${providerId}: "api" is required when registering streamSimple.`);applyExtension(providerId,applyModelsJson(providerId,getAllProviderModels(base),modelsConfig,extension),extension,new Set((modelsConfig?.models??[]).map(definition=>definition.id)))}function composeModelProvider(providerId,base,modelConfig,extension){let config=modelConfig.getProvider(providerId),extensionOAuthCredential,refreshedExtensionModels,currentExtension=()=>extension&&refreshedExtensionModels?{...extension,models:refreshedExtensionModels}:extension,getAllModels=()=>{let models=applyExtension(providerId,applyModelsJson(providerId,getAllProviderModels(base),config,currentExtension()),currentExtension(),new Set((config?.models??[]).map(definition=>definition.id)));return extensionOAuthCredential&&extension?.oauth?.modifyModels&&(models=[...extension.oauth.modifyModels(models.filter(model=>isModelType(model,"chat")),extensionOAuthCredential),...models.filter(model=>!isModelType(model,"chat"))]),models.map(model=>{let override=config?.modelOverrides?.[model.id];return override&&isModelType(model,"chat")?applyModelOverride(model,override):model})};getAllModels();let apiKey=composeApiKeyAuth(providerId,base,config,extension),oauth=composeOAuthAuth(providerId,base,config,extension);if(!apiKey&&!oauth)throw new Error(`Provider ${providerId}: no authentication method configured.`);let refreshBase=providerId==="ollama"&&config?.models?.length?void 0:base?.refreshModels?.bind(base),supportsBaseApi=model=>base?.getModels().some(entry=>entry.api===model.api)??!1,streamWith=(model,context,options,simple)=>lazyStream(model,async()=>{let format2=getToolCallFormat(model),tools=format2?getCurrentTools(context.messages):[];if(format2&&tools.length>0){let protocol=getProtocol(format2),transformedContext=transformContext(context,protocol),innerStream=streamWith(model,transformedContext,options,simple);return wrapStreamWithToolCallMiddleware(innerStream,protocol,tools)}if(extension?.streamSimple&&model.api===extension.api)return extension.streamSimple(model,context,options);if(base&&supportsBaseApi(model))return simple?base.streamSimple(model,context,options):base.stream(model,context,options);let api=getApiProvider(model.api);if(!api)throw new Error(`No API provider registered for api: ${model.api} (model "${model.provider}/${model.id}"). Load the extension that implements this api, or fix the "api" value for provider "${providerId}" in models.json.`);return simple?api.streamSimple(model,context,options):api.stream(model,context,options)}),provider={id:providerId,name:extension?.name??config?.name??base?.name??extension?.oauth?.name??providerId,baseUrl:extension?.baseUrl??config?.baseUrl??base?.baseUrl,headers:base?.headers,retryPolicy:extension?.retryPolicy??base?.retryPolicy,auth:{...apiKey?{apiKey}:{},...oauth?{oauth}:{}},getModels:()=>getAllModels().filter(model=>isModelType(model,"chat")),getAllModels,refreshModels:refreshBase||extension?.refreshModels||extension?.oauth?.modifyModels?async context=>{await refreshBase?.(context);let refreshed;if(extension?.refreshModels&&(refreshed=await extension.refreshModels(context)),context.signal.aborted)return;let oauthCredential=context.credential?.type==="oauth"?context.credential:void 0;await context.publish({update:()=>{refreshed&&(applyExtension(providerId,applyModelsJson(providerId,getAllProviderModels(base),config,extension),{...extension,models:refreshed},new Set((config?.models??[]).map(definition=>definition.id))),refreshedExtensionModels=refreshed),extensionOAuthCredential=oauthCredential}})}:void 0,filterModels:base?.filterModels?(models,credential)=>base.filterModels(models,credential):void 0,filterAllModels:base?.filterAllModels?(models,credential)=>base.filterAllModels(models,credential):void 0,stream:(model,context,options)=>streamWith(model,context,options,!1),streamSimple:(model,context,options)=>streamWith(model,context,options,!0)},fetchDeferred=base?.fetchDeferred;fetchDeferred&&(provider.fetchDeferred=(model,handle,options)=>fetchDeferred(model,handle,options));let cancelDeferred=base?.cancelDeferred;cancelDeferred&&(provider.cancelDeferred=(model,handle,options)=>cancelDeferred(model,handle,options));let extensionImages=extension?.images,generateImages2=base?.generateImages;(generateImages2||Object.keys(extensionImages??{}).length>0)&&(provider.generateImages=(model,context,options)=>{let implementation=extensionImages?.[model.api];return implementation?implementation.generateImages(model,context,options):generateImages2?generateImages2(model,context,options):Promise.resolve(imageErrorResult(model,new Error(`Provider ${providerId} has no image implementation for "${model.api}"`)))});let extensionClassifiers=extension?.classifiers,classify=base?.classify;return(classify||Object.keys(extensionClassifiers??{}).length>0)&&(provider.classify=(model,context,options)=>{let implementation=extensionClassifiers?.[model.api];return implementation?implementation.classify(model,context,options):classify?classify(model,context,options):Promise.resolve(classifierErrorResult(model,new Error(`Provider ${providerId} has no classifier implementation for "${model.api}"`)))}),provider}function resolveConfiguredModelHeaders(model,config,extension,env){return resolveHeadersOrThrow(rawModelHeaders(model,config,extension),`model "${model.provider}/${model.id}"`,env)}async function resolveCompatibilityRequestHeaders(model,config,extension,env){let configured=await resolveHeadersOrThrow({...configuredHeaders(config,extension),...rawModelHeaders(model,config,extension)},`model "${model.provider}/${model.id}"`,env);return model.headers||configured?{...model.headers,...configured}:void 0}function resolveCompatibilityRequestConfig(model,config,extension){let modelDefinition=config?.models?.find(entry=>entry.id===model.id),extensionModel=findExtensionChatModel(extension,model.id),configuredExtraBody={...config?.extraBody,...extension?.extraBody,...rawModelExtraBody(model,config,extension)};return{extraBody:Object.keys(configuredExtraBody).length>0?configuredExtraBody:void 0,upstreamModelId:extensionModel?.upstreamModelId??modelDefinition?.upstreamModelId??model.upstreamModelId,serviceTier:extensionModel?.serviceTier??modelDefinition?.serviceTier??model.serviceTier,authHeader:extension?.authHeader??config?.authHeader??!1}}function configuredRequestAuthStatus(config,extension){let value2=configuredApiKey(config,extension);if(value2===void 0)return configuredHeaderAuthStatus(config?.headers,extension?.headers);if(isCommandConfigValue(value2))return{configured:!0,source:"models_json_command"};let names=getConfigValueEnvVarNames(value2);return names.length>0?isConfigValueConfigured(value2)?{configured:!0,source:"environment",label:names.join(", ")}:{configured:!1}:{configured:!0,source:extension?.apiKey!==void 0?"fallback":"models_json_key"}}function createProviderSemaphores(getLimit){let providers=new Map;function drain(semaphore){for(;semaphore.active<semaphore.limit&&semaphore.waiters.length>0;)semaphore.waiters.shift()?.grant()}function resize(providerId,limit){let semaphore=providers.get(providerId);semaphore&&(semaphore.limit=limit>0?limit:1/0,drain(semaphore))}function acquire(semaphore,signal){return signal?.aborted?Promise.reject(signal.reason):new Promise((resolve45,reject)=>{let abort=()=>{let index=semaphore.waiters.indexOf(waiter);index!==-1&&semaphore.waiters.splice(index,1),reject(signal?.reason)},waiter={grant(){signal?.removeEventListener("abort",abort),semaphore.active++;let released=!1;resolve45(()=>{released||(released=!0,semaphore.active--,drain(semaphore))})}};semaphore.waiters.push(waiter),signal?.addEventListener("abort",abort,{once:!0}),drain(semaphore)})}async function runAcquired(semaphore,signal,run2){let release4=await acquire(semaphore,signal);try{signal?.throwIfAborted();let stream2=run2();return stream2.result().then(release4,release4),stream2}catch(error2){throw release4(),error2}}return{resize,bracket(providerId,signal,run2){let configured=getLimit(providerId),limit=configured>0?configured:1/0;if(resize(providerId,limit),limit===1/0)return run2();let semaphore=providers.get(providerId);return semaphore||(semaphore={limit,active:0,waiters:[]},providers.set(providerId,semaphore)),runAcquired(semaphore,signal,run2)}}}import{isDeepStrictEqual as isDeepStrictEqual2}from"node:util";var MODEL_CAPABILITY_FIELDS=["contextWindow","maxTokens","input","reasoning","thinkingLevelMap","upstreamModelId","serviceTier","recoverTextToolCalls","compat"];function mergeRemoteCatalogModels(providerId,baseline,dynamic){let merged=[...baseline],conflicts=[];for(let model of dynamic){let index=merged.findIndex(entry=>entry.id===model.id);if(index<0){merged.push(model);continue}let staticModel=merged[index],fields=MODEL_CAPABILITY_FIELDS.filter(field2=>!isDeepStrictEqual2(staticModel[field2],model[field2]));fields.length>0&&conflicts.push({providerId,modelId:model.id,fields}),merged[index]={...staticModel,name:model.name,cost:model.cost}}return{models:merged,conflicts}}function parseRemoteCatalog(providerId,value2){let entries=Array.isArray(value2)?value2:typeof value2=="object"&&value2!==null&&"models"in value2&&Array.isArray(value2.models)?value2.models:typeof value2=="object"&&value2!==null?Object.values(value2):void 0;if(!entries?.every(isModelCatalogEntry))throw new Error(`Invalid model catalog for provider "${providerId}"`);return entries.map(model=>({...model,provider:providerId}))}function isModelCatalogEntry(value2){return isRecord6(value2)?typeof value2.id=="string"&&typeof value2.name=="string"&&typeof value2.api=="string"&&typeof value2.provider=="string"&&typeof value2.baseUrl=="string"&&typeof value2.reasoning=="boolean"&&isInputArray(value2.input)&&isModelCost(value2.cost)&&isFiniteNumber2(value2.contextWindow)&&isFiniteNumber2(value2.maxTokens):!1}function isInputArray(value2){return Array.isArray(value2)&&value2.every(modality=>modality==="text"||modality==="image"||modality==="video")}function isModelCost(value2){return isRecord6(value2)?isFiniteNumber2(value2.input)&&isFiniteNumber2(value2.output)&&isFiniteNumber2(value2.cacheRead)&&isFiniteNumber2(value2.cacheWrite):!1}function isFiniteNumber2(value2){return typeof value2=="number"&&Number.isFinite(value2)}function isRecord6(value2){return typeof value2=="object"&&value2!==null}var DEFAULT_CATALOG_BASE_URL="https://pi.dev",REMOTE_CATALOG_ATTEMPT_TIMEOUT_MS=4e3,REMOTE_CATALOG_REFRESH_INTERVAL_MS=14400*1e3,REMOTE_CATALOG_MODEL_TYPES=["chat","image","classifier"],NON_CHAT_MODEL_TYPES=REMOTE_CATALOG_MODEL_TYPES.filter(type2=>type2!=="chat"),FORK_ONLY_BUILTIN_PROVIDERS=new Set(["alibaba-token-plan","opengateway"]);function remoteCatalogServesProvider(providerId,catalogBaseUrl){return catalogBaseUrl!==void 0||!FORK_ONLY_BUILTIN_PROVIDERS.has(providerId)}function isSupportedModelType(model){return model.type===void 0||typeof model.type=="string"&&REMOTE_CATALOG_MODEL_TYPES.includes(model.type)}function mergeModels(baseline,dynamic){let merged=new Map;for(let model of[...baseline,...dynamic])merged.set(`${getModelType(model)}\0${model.id}`,model);return[...merged.values()]}var remoteCatalogConflicts=new WeakMap;function chatModels(models){return models.filter(model=>isModelType(model,"chat"))}function nonChatModels(models){return models.filter(model=>!isModelType(model,"chat"))}function parseCatalog(providerId,value2){let entries=Array.isArray(value2)?value2:typeof value2=="object"&&value2!==null&&"models"in value2&&Array.isArray(value2.models)?value2.models:typeof value2=="object"&&value2!==null?Object.values(value2):void 0;if(!entries)throw new Error(`Invalid model catalog for provider "${providerId}"`);let supported=entries.filter(entry=>typeof entry=="object"&&entry!==null).filter(isSupportedModelType),isNonChat=entry=>NON_CHAT_MODEL_TYPES.includes(entry.type),chat=supported.filter(entry=>!isNonChat(entry)),other=supported.filter(entry=>isNonChat(entry)&&"id"in entry).map(model=>({...model,provider:providerId}));return[...parseRemoteCatalog(providerId,chat),...other]}function remoteModels(entry,localGeneratedAt){return entry?localGeneratedAt!==void 0&&(entry.lastModified===void 0||entry.lastModified<=localGeneratedAt)?[]:entry.models:[]}function withRemoteCatalog(provider,catalogBaseUrl=DEFAULT_CATALOG_BASE_URL,localGeneratedAt){let dynamicModels=[],currentChatModels=()=>mergeRemoteCatalogModels(provider.id,provider.getModels(),chatModels(dynamicModels)).models,conflictsFor=models=>mergeRemoteCatalogModels(provider.id,provider.getModels(),chatModels(models)).conflicts,wrappedProvider={...provider,getModels:currentChatModels,getAllModels:()=>[...currentChatModels(),...mergeModels(nonChatModels(provider.getAllModels?.()??[]),nonChatModels(dynamicModels))],refreshModels:async context=>{let stored=context.stored,restored=remoteModels(stored,localGeneratedAt).filter(model=>model.provider===provider.id);if(!await context.publish({update:()=>{dynamicModels=restored,remoteCatalogConflicts.set(wrappedProvider,conflictsFor(restored))}})||!context.allowNetwork||context.signal.aborted||!context.force&&stored?.checkedAt!==void 0&&stored.lastModified!==void 0&&Date.now()-stored.checkedAt<REMOTE_CATALOG_REFRESH_INTERVAL_MS)return;let validator=stored&&stored.models.length>0?stored.etag:void 0,url=new URL(`/api/models/providers/${encodeURIComponent(provider.id)}`,catalogBaseUrl);url.searchParams.set("types",REMOTE_CATALOG_MODEL_TYPES.join(","));let response=await fetchWithRetry(url,{headers:{accept:"application/json","User-Agent":getPiUserAgent(VERSION),...validator?{"if-none-match":validator}:{}},signal:context.signal},{attemptTimeoutMs:REMOTE_CATALOG_ATTEMPT_TIMEOUT_MS});if(context.signal.aborted)return;let checkedAt=Date.now();if(response.status===304&&stored){await context.publish({persist:{...stored,checkedAt}});return}if(response.status===404||response.status===501){await context.publish({persist:{...stored??{models:[]},checkedAt,lastModified:0,etag:void 0}});return}if(!response.ok)throw await context.publish({persist:{...stored??{models:[]},checkedAt}}),new Error(`Model catalog request failed for ${provider.id}: ${response.status}`);let refreshed=parseCatalog(provider.id,await response.json()),lastModified=Date.parse(response.headers.get("last-modified")??"");if(context.signal.aborted)return;let entry={models:refreshed,checkedAt,lastModified:Number.isNaN(lastModified)?0:lastModified,etag:response.headers.get("etag")??void 0},published=remoteModels(entry,localGeneratedAt);await context.publish({persist:entry,update:()=>{dynamicModels=published,remoteCatalogConflicts.set(wrappedProvider,conflictsFor(published))}})}};return remoteCatalogConflicts.set(wrappedProvider,[]),wrappedProvider}function asExtensionOAuthRegistry(store){let candidate=store;return typeof candidate.registerOAuthProvider=="function"&&typeof candidate.unregisterOAuthProvider=="function"?candidate:void 0}var RuntimeCredentials=class{constructor(store){this.overrides=new Map,this.store=store}registerOAuthProvider(providerId,oauth){asExtensionOAuthRegistry(this.store)?.registerOAuthProvider(providerId,oauth)}unregisterOAuthProvider(providerId){asExtensionOAuthRegistry(this.store)?.unregisterOAuthProvider(providerId)}setRuntimeApiKey(providerId,apiKey){this.overrides.set(providerId,apiKey)}removeRuntimeApiKey(providerId){this.overrides.delete(providerId)}hasRuntimeApiKey(providerId){return this.overrides.has(providerId)}busyReadCount(){let store=this.store;return typeof store.getBusyReadCount=="function"?store.getBusyReadCount():0}async read(providerId,options){options?.signal?.throwIfAborted();let override=this.overrides.get(providerId);return override?{type:"api_key",key:override}:this.store.read(providerId,options)}async list(options){let entries=new Map((await this.store.list(options)).map(entry=>[entry.providerId,entry]));options?.signal?.throwIfAborted();for(let providerId of this.overrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}modify(providerId,fn,options){return this.store.modify(providerId,fn,options)}async delete(providerId,options){options?.signal?.throwIfAborted(),await this.store.delete(providerId,options),this.overrides.delete(providerId)}};setWireIdentity(BRAND?.userAgent??APP_NAME);function installClaudeCodeVersionCache(modelsPath){modelsPath!==void 0&&installClaudeCodeVersionFileStore({path:join8(dirname7(modelsPath),"claude-code-version.json"),offline:envValue("OFFLINE")!==void 0})}function mightHoldCredentialPool(providerId,credential,env,policySlots){if(credential){let accounts=Object.entries(credential).find(([key])=>key==="accounts")?.[1];return Array.isArray(accounts)&&accounts.length>1||Object.keys(policySlots??{}).length>0}return discoverEnvSlots(providerId,env).length+Object.keys(policySlots??{}).length>1}var CredentialSynchronizationError=class extends Error{constructor(providerId,operation,credential,options){super(`Credential ${operation} committed for ${providerId}, but local synchronization failed`,options),this.name="CredentialSynchronizationError",this.providerId=providerId,this.operation=operation,this.credential=credential}};function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value2]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value2}return merged}function withPayloadRequestMetadata(options,model){if(!options.onPayload)return options;let onPayload=options.onPayload;return{...options,onPayload:async(payload,providerModel)=>await onPayload(payload,providerModel,{model,headers:options.headers??{}})}}var ModelRuntime=class _ModelRuntime{setSettingsManager(settingsManager){if(this.settingsManager===settingsManager)return;this.unsubscribeProviderSettings?.(),this.settingsManager=settingsManager;let resize=()=>{for(let provider of this.getProviders())this.providerSemaphores.resize(provider.id,settingsManager.getProviderConcurrencyLimit(provider.id))};this.unsubscribeProviderSettings=settingsManager.subscribeToProviderSettings(resize),resize()}constructor(credentials,config,modelsPath,modelsStore,providers,modelNetworkEnabled,modelRefreshTimeoutMs,poolStatePath){this.providerSemaphores=createProviderSemaphores(providerId=>this.settingsManager?.getProviderConcurrencyLimit(providerId)??1/0),this.builtins=new Map,this.nativeExtensionProviders=new Map,this.extensionProviders=new Map,this.virtualModels=new Map,this.compositionErrors=new Map,this.snapshot={all:[],available:[],configuredProviders:new Set,storedProviders:new Set,auth:new Map},this.availabilityInitialized=!1,this.availabilityRefreshSeq=0,this.availabilityErrorSeq=0,this.providerAvailabilitySeq=new Map,this.credentialOperations=new Map,this.credentials=credentials,this.poolStatePath=poolStatePath,this.config=config,this.modelsPath=modelsPath,this.modelNetworkEnabled=modelNetworkEnabled,this.modelRefreshTimeoutMs=modelRefreshTimeoutMs,this.defaultBuiltins=new Map(providers.map(provider=>[provider.id,provider]));for(let[providerId,provider]of this.defaultBuiltins)this.builtins.set(providerId,provider);this.models=createModels({credentials,modelsStore}),this.rebuildProviders()}static async create(options={}){let credentials=new RuntimeCredentials(options.credentials??AuthStorage.create(options.authPath)),modelsPath=options.modelsPath===null?void 0:options.modelsPath??join8(getAgentDir(),"models.json");installClaudeCodeVersionCache(modelsPath);let config=await ModelConfig.load(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join8(dirname7(modelsPath),"models-store.json")):new InMemoryCodingAgentModelsStore),builtinModelDataGeneratedAt=getBuiltinModelDataGeneratedAt(),providers=builtinProviders().map(provider=>provider.refreshModels||!remoteCatalogServesProvider(provider.id,options.catalogBaseUrl)?provider:withRemoteCatalog(provider,options.catalogBaseUrl,builtinModelDataGeneratedAt)),runtime=new _ModelRuntime(credentials,config,modelsPath,modelsStore,providers,envValue("OFFLINE")===void 0&&options.allowModelNetwork===!0,options.modelRefreshTimeoutMs??15e3,options.agentDir?join8(options.agentDir,"credential-pool-state.json"):options.authPath?join8(dirname7(options.authPath),"credential-pool-state.json"):void 0);runtime.rebuildProviders(),options.settingsManager&&runtime.setSettingsManager(options.settingsManager);let refreshFromNetwork=runtime.modelNetworkEnabled&&options.allowModelNetwork===!0,controller=refreshFromNetwork&&options.modelRefreshTimeoutMs!==void 0?new AbortController:void 0,timeout=controller?setTimeout(()=>controller.abort(),options.modelRefreshTimeoutMs):void 0,signal=controller?options.signal?AbortSignal.any([options.signal,controller.signal]):controller.signal:options.signal;try{options.refreshOnCreate!==!1&&await runtime.refresh({allowNetwork:refreshFromNetwork,signal})}finally{timeout&&clearTimeout(timeout)}return runtime}static createSync(options={}){let credentials=new RuntimeCredentials(options.credentials??AuthStorage.create(options.authPath)),modelsPath=options.modelsPath===null?void 0:options.modelsPath??join8(getAgentDir(),"models.json");installClaudeCodeVersionCache(modelsPath);let config=ModelConfig.loadSync(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join8(dirname7(modelsPath),"models-store.json")):new InMemoryCodingAgentModelsStore),providers=builtinProviders().map(provider=>provider.refreshModels||!remoteCatalogServesProvider(provider.id,options.catalogBaseUrl)?provider:withRemoteCatalog(provider,options.catalogBaseUrl)),runtime=new _ModelRuntime(credentials,config,modelsPath,modelsStore,providers,options.allowModelNetwork??!1,options.modelRefreshTimeoutMs??15e3,options.agentDir?join8(options.agentDir,"credential-pool-state.json"):options.authPath?join8(dirname7(options.authPath),"credential-pool-state.json"):void 0);return runtime.rebuildProviders(),options.settingsManager&&runtime.setSettingsManager(options.settingsManager),runtime}providerIds(){return new Set([...this.builtins.keys(),...this.nativeExtensionProviders.keys(),...this.config.getProviderIds(),...this.extensionProviders.keys(),...this.virtualModels.keys()])}recomposeProvider(rawProviderId){let providerId=normalizeProviderId(rawProviderId);if(this.config.isProviderDisabled(providerId)){this.models.deleteProvider(providerId),this.compositionErrors.delete(providerId);return}let provider=this.composeProvider(providerId),virtualModels=[...this.virtualModels.get(providerId)?.values()??[]].map(entry=>entry.model);return virtualModels.length>0?this.models.setProvider(withVirtualModels(providerId,provider,virtualModels)):provider?this.models.setProvider(provider):this.models.deleteProvider(providerId),provider}composeProvider(providerId){let base=this.nativeExtensionProviders.get(providerId)??this.builtins.get(providerId),extension=this.extensionProviders.get(providerId);if(!this.config.getProvider(providerId)&&!extension)return this.compositionErrors.delete(providerId),base;try{let provider=composeModelProvider(providerId,base,this.config,extension);return this.compositionErrors.delete(providerId),provider}catch(error2){return this.compositionErrors.set(providerId,error2 instanceof Error?error2.message:String(error2)),base}}rebuildProviders(){this.models.clearProviders(),this.compositionErrors.clear();for(let providerId of this.providerIds())this.recomposeProvider(providerId);this.updateModelSnapshot()}updateModelSnapshot(){let all2=[...this.models.getModels()];this.snapshot={...this.snapshot,all:all2,available:all2.filter(model=>this.snapshot.configuredProviders.has(model.provider))}}async runAvailabilityRefresh(seq,errorSeq,signal){let busyReadsBefore=this.credentials.busyReadCount(),providers=this.models.getProviders(),[available,checks,credentials]=await Promise.all([this.models.getAvailable(void 0,{signal}),Promise.all(providers.map(async provider=>[provider.id,await this.models.checkAuth(provider.id,{signal})])),this.credentials.list({signal})]);if(seq!==this.availabilityRefreshSeq||this.answeredFromBusyStore(busyReadsBefore,errorSeq))return;let auth=new Map(checks),configuredProviders=new Set(checks.filter(entry=>entry[1]!==void 0).map(([providerId])=>providerId));this.snapshot={all:[...this.models.getModels()],available:[...available],configuredProviders,storedProviders:new Set(credentials.map(entry=>entry.providerId)),auth},this.availabilityInitialized=!0,errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0)}queueAvailabilityRefresh(signal){let seq=++this.availabilityRefreshSeq;for(let[providerId,providerSeq]of this.providerAvailabilitySeq)this.providerAvailabilitySeq.set(providerId,providerSeq+1);let errorSeq=++this.availabilityErrorSeq,effectiveSignal=operationSignal(signal);return this.runAvailabilityRefresh(seq,errorSeq,effectiveSignal).catch(error2=>{throw errorSeq===this.availabilityErrorSeq&&!effectiveSignal.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2})}async refreshProviderAvailability(providerId,signal){++this.availabilityRefreshSeq;let providerSeq=(this.providerAvailabilitySeq.get(providerId)??0)+1;this.providerAvailabilitySeq.set(providerId,providerSeq);let errorSeq=++this.availabilityErrorSeq,busyReadsBefore=this.credentials.busyReadCount();try{let[available,auth,credential]=await Promise.all([this.models.getAvailable(providerId,{signal}),this.models.checkAuth(providerId,{signal}),this.credentials.read(providerId,{signal})]);if(signal.throwIfAborted(),this.providerAvailabilitySeq.get(providerId)!==providerSeq||this.answeredFromBusyStore(busyReadsBefore,errorSeq))return;let configuredProviders=new Set(this.snapshot.configuredProviders),storedProviders=new Set(this.snapshot.storedProviders),authByProvider=new Map(this.snapshot.auth);auth?(configuredProviders.add(providerId),authByProvider.set(providerId,auth)):(configuredProviders.delete(providerId),authByProvider.delete(providerId)),credential?storedProviders.add(providerId):storedProviders.delete(providerId);let all2=[...this.models.getModels()],availableById=new Map([...this.snapshot.available.filter(model=>model.provider!==providerId),...available].map(model=>[`${model.provider}\0${model.id}`,model]));this.snapshot={all:all2,available:all2.flatMap(model=>availableById.get(`${model.provider}\0${model.id}`)??[]),configuredProviders,storedProviders,auth:authByProvider},errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0)}catch(error2){throw this.providerAvailabilitySeq.get(providerId)===providerSeq&&errorSeq===this.availabilityErrorSeq&&!signal.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2}}answeredFromBusyStore(busyReadsBefore,errorSeq){return this.credentials.busyReadCount()===busyReadsBefore?!1:(errorSeq===this.availabilityErrorSeq&&(this.availabilityError="Credential store was busy; availability will be re-read on the next refresh"),!0)}getProviders(){return this.models.getProviders()}getProvider(providerId){return this.models.getProvider(providerId)}getModels(providerId){return this.models.getModels(providerId)}getModel(providerId,modelId){return this.models.getModel(providerId,modelId)}getModelsOfType(type2,providerId){return this.models.getModelsOfType(type2,providerId)}getModelOfType(type2,providerId,modelId){return this.models.getModelOfType(type2,providerId,modelId)}getAllModels(providerId){return this.models.getAllModels(providerId)}getAvailableOfType(type2,providerId,options){return this.models.getAvailableOfType(type2,providerId,options)}getAllAvailable(providerId,options){return this.models.getAllAvailable(providerId,options)}async checkAuth(providerId,options){return this.models.checkAuth(providerId,options)}async getAvailable(providerId,options){if(providerId){let errorSeq=++this.availabilityErrorSeq;try{let available=await this.models.getAvailable(providerId,options);return errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0),available}catch(error2){throw errorSeq===this.availabilityErrorSeq&&!options?.signal?.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2}}return await this.queueAvailabilityRefresh(options?.signal),this.snapshot.available}getAvailableSnapshot(){return this.snapshot.available}hasFreshAvailabilitySnapshot(){return this.availabilityInitialized&&this.availabilityError===void 0}hasAvailabilitySnapshot(){return this.availabilityInitialized}getWarnings(){return this.config.getWarnings()}getError(){let errors=[],configError=this.config.getError();configError&&errors.push(configError);for(let[providerId,error2]of this.compositionErrors)errors.push(`Provider "${providerId}": ${error2}`);return this.availabilityError&&errors.push(`Availability refresh: ${this.availabilityError}`),errors.length>0?errors.join(`
|
|
725
|
+
File: ${path15}`)}}getProvider(providerId){return this.providers.get(providerId)}getProviderIds(){return[...this.providers.keys()]}isProviderDisabled(providerId){return this.disabledProviders.has(providerId)||this.providers.get(providerId)?.disabled===!0}getError(){return this.error}getWarnings(){return this.warnings}};import{join as join7}from"node:path";var sharedModelsFileReadState,InMemoryCodingAgentModelsStore=class{constructor(){this.entries=new Map}async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}},FileModelsStore=class{constructor(path15=join7(getAgentDir(),"models-store.json")){this.path=normalizePath(path15),this.storage=new FileAuthStorageBackend(this.path),this.readState=sharedModelsFileReadState?.path===this.path?sharedModelsFileReadState.readState:{data:{}},sharedModelsFileReadState||(sharedModelsFileReadState={path:this.path,readState:this.readState})}parse(content){return content?JSON.parse(stripBom(content)):{}}updateReadState(readState2,data,revision){readState2.data=data,readState2.revision=revision}reloadFromStorage(readState2,options){return this.storage.withLockAsync(async content=>{let data=this.parse(content);return this.updateReadState(readState2,data,getFileRevision(this.path)),{result:data}},options)}async readLatest(readState2,options){options?.signal?.throwIfAborted();let revision=getFileRevision(this.path);if(revision!==void 0&&revision===readState2.revision)return readState2.data;if(!readState2.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorage(readState2,{signal:controller.signal}),readers:0};readState2.reload=reload2,reload2.promise.then(()=>{readState2.reload===reload2&&(readState2.reload=void 0)},()=>{readState2.reload===reload2&&(readState2.reload=void 0)})}let reload=readState2.reload;reload.readers++;try{return await raceWithAbortSignal(reload.promise,options?.signal)}finally{reload.readers--,reload.readers===0&&readState2.reload===reload&&(readState2.reload=void 0,reload.controller.abort())}}async read(providerId,options){let entry=(await this.readLatest(this.readState,options))[providerId];return options?.signal?.throwIfAborted(),entry?structuredClone(entry):void 0}async write(providerId,entry,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return current[providerId]=structuredClone(entry),latest=current,{result:void 0,next:JSON.stringify(current,null,2)}},options),latest&&this.updateReadState(this.readState,latest)}async delete(providerId,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return delete current[providerId],latest=current,{result:void 0,next:JSON.stringify(current,null,2)}},options),latest&&this.updateReadState(this.readState,latest)}};function configuredHeaderAuthStatus(configHeaders,extensionHeaders){let sawCredentialHeader=!1;for(let header2 of effectiveHeaders(configHeaders,extensionHeaders).values()){if(!isCredentialHeaderName(header2.name))continue;if(sawCredentialHeader=!0,isCommandConfigValue(header2.value))return{configured:!0,source:"models_json_command"};let envNames=getConfigValueEnvVarNames(header2.value);if(envNames.length>0){if(isConfigValueConfigured(header2.value))return{configured:!0,source:"environment",label:envNames.join(", ")};continue}if(hasCredentialHeaders({[header2.name]:header2.value}))return{configured:!0,source:header2.source}}return sawCredentialHeader?{configured:!1}:void 0}function headerAuthResolutionSource(configHeaders,extensionHeaders){let headers=effectiveHeaders(configHeaders,extensionHeaders),values=Object.fromEntries([...headers.values()].map(header2=>[header2.name,header2.value]));if(hasCredentialHeaders(values)){for(let header2 of headers.values())if(hasCredentialHeaders({[header2.name]:header2.value}))return header2.source==="extension_headers"?"provider extension headers":"models.json headers"}}async function checkConfiguredHeaderAuth(headers,ctx,source2){if(headers)for(let header2 of effectiveHeaders(headers,void 0).values()){if(!isCredentialHeaderName(header2.name))continue;if(isCommandConfigValue(header2.value))return{type:"api_key",source:source2};let envNames=getConfigValueEnvVarNames(header2.value),configured=!0;for(let envName of envNames)if(await ctx.env(envName)===void 0){configured=!1;break}if(configured&&hasCredentialHeaders({[header2.name]:header2.value}))return{type:"api_key",source:source2}}}function effectiveHeaders(configHeaders,extensionHeaders){let effective=new Map;return addHeaders(effective,configHeaders,"models_json_headers"),addHeaders(effective,extensionHeaders,"extension_headers"),effective}function addHeaders(target,headers,source2){for(let[name,value2]of Object.entries(headers??{}))typeof value2=="string"&&target.set(name.toLowerCase(),{name,value:value2,source:source2})}function composeApiKeyAuth(providerId,base,config,extension){let inherited=base?.auth.apiKey,rawKey=configuredApiKey(config,extension),oauth=extension?.oauth??base?.auth.oauth,rawHeaders=configuredHeaders(config,extension),headerSource=headerAuthResolutionSource(config?.headers,extension?.headers),authHeader=extension?.authHeader??config?.authHeader??!1;return!inherited&&rawKey===void 0&&!headerSource&&oauth?ambientOnlyAuth(providerId,oauth,rawHeaders,headerSource,authHeader):{name:inherited?.name??"API key",login:inherited?.login??(headerSource&&rawKey===void 0?void 0:async interaction=>({type:"api_key",key:await interaction.prompt({type:"secret",message:"Enter API key"})})),check:async input=>{if(input.credential?.key){let inheritedCheck2=await inherited?.check?.(input);return inheritedCheck2||{type:"api_key",source:"stored credential"}}if(rawKey!==void 0){if(isCommandConfigValue(rawKey))return{type:"api_key",source:"configured API key"};for(let name of getConfigValueEnvVarNames(rawKey))if(await input.ctx.env(name)===void 0)return;return{type:"api_key",source:"configured API key"}}let inheritedCheck=await inherited?.check?.(input);if(inheritedCheck)return inheritedCheck;let resolved=await inherited?.resolve(input);return resolved?{type:"api_key",source:resolved.source}:checkConfiguredHeaderAuth(rawHeaders,input.ctx,headerSource)},resolve:async input=>{let result3=await resolveBaseAuth(providerId,inherited,rawKey,input),explicitEnv={...input.credential?.env??{},...result3?.env??{}},headerEnv=await configContextEnv(Object.values(rawHeaders??{}),input.ctx,explicitEnv),headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,headerEnv);if(!(!result3&&!hasCredentialHeaders(headers)))return{...result3,auth:withConfiguredAuth(result3?.auth??{},headers,authHeader),source:result3?.source??headerSource}}}}function ambientResolverOf(oauth){let candidate=oauth?.resolveAmbient;return typeof candidate=="function"?candidate:void 0}function ambientOnlyAuth(providerId,oauth,rawHeaders,headerSource,authHeader){let resolveAmbient=ambientResolverOf(oauth);if(!resolveAmbient)return;let resolve45=async input=>{let result3=await resolveAmbient({ctx:input.ctx,env:input.credential?.env,signal:input.signal});if(!result3||input.credential?.key&&input.credential.key!==result3.auth.apiKey)return;let explicitEnv={...input.credential?.env??{},...result3.env??{}},headerEnv=await configContextEnv(Object.values(rawHeaders??{}),input.ctx,explicitEnv),headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,headerEnv);return{...result3,auth:withConfiguredAuth(result3.auth,headers,authHeader),source:result3.source??headerSource}};return{name:oauth.name??"Ambient credentials",ambientOnly:!0,check:async input=>{let resolved=await resolve45(input);return resolved?{type:"oauth",source:resolved.source}:void 0},resolve:resolve45}}function configuredApiKey(config,extension){return extension?.apiKey??config?.apiKey}function configuredHeaders(config,extension){if(!(!config?.headers&&!extension?.headers))return{...config?.headers,...extension?.headers}}function withConfiguredAuth(auth,headers,authHeader){let mergedHeaders=auth.headers||headers?{...auth.headers,...headers}:void 0;if(authHeader){if(!auth.apiKey)throw new Error("authHeader requires a resolved API key");mergedHeaders={...mergedHeaders,Authorization:`Bearer ${auth.apiKey}`}}return{...auth,headers:mergedHeaders}}async function resolveBaseAuth(providerId,inherited,rawKey,input){if(input.credential?.key)return inherited?inherited.resolve(input):{auth:{apiKey:input.credential.key},env:input.credential.env,source:"stored credential"};if(rawKey===void 0)return inherited?.resolve(input);let env=await configContextEnv([rawKey],input.ctx,input.credential?.env),key=await resolveConfigValueOrThrow(rawKey,`API key for provider "${providerId}"`,env);return inherited?inherited.resolve({...input,credential:{type:"api_key",key}}):{auth:{apiKey:key},source:"configured API key"}}async function configContextEnv(values,ctx,explicit){let env={...explicit};for(let name of new Set(values.flatMap(getConfigValueEnvVarNames))){if(env[name]!==void 0)continue;let value2=await ctx.env(name);value2!==void 0&&(env[name]=value2)}return Object.keys(env).length>0?env:void 0}function getAllProviderModels(provider){return provider?provider.getAllModels?.()??provider.getModels():[]}function isChatModelConfig(definition){return(definition.type??"chat")==="chat"}function findExtensionChatModel(extension,modelId){return extension?.models?.filter(isChatModelConfig).find(entry=>entry.id===modelId)}function mergeCompat(base,override){if(!override)return base;let merged={...base,...override},baseNested=base,overrideNested=override,mergedNested=merged;for(let key of["openRouterRouting","vercelGatewayRouting","chatTemplateKwargs","chatTemplateArgs"]){let baseValue=baseNested?.[key],overrideValue=overrideNested[key];(typeof baseValue=="object"&&baseValue!==null||typeof overrideValue=="object"&&overrideValue!==null)&&(mergedNested[key]={...baseValue,...overrideValue})}return merged}function mergeInputLimits(base,override){return override?{...base,...override,images:override.images?{...base?.images,...override.images,resize:override.images.resize?{...base?.images?.resize,...override.images.resize}:base?.images?.resize}:base?.images}:base}function applyModelOverride(model,override){return{...model,name:override.name??model.name,promptPreset:override.promptPreset??model.promptPreset,recoverTextToolCalls:override.recoverTextToolCalls??model.recoverTextToolCalls,reasoning:override.reasoning??model.reasoning,thinkingLevelMap:override.thinkingLevelMap?override.thinkingLevelMapMode==="replace"?override.thinkingLevelMap:{...model.thinkingLevelMap,...override.thinkingLevelMap}:model.thinkingLevelMap,input:override.input??model.input,inputLimits:mergeInputLimits(model.inputLimits,override.inputLimits),cost:override.cost?{input:override.cost.input??model.cost.input,output:override.cost.output??model.cost.output,cacheRead:override.cost.cacheRead??model.cost.cacheRead,cacheWrite:override.cost.cacheWrite??model.cost.cacheWrite,tiers:override.cost.tiers??model.cost.tiers}:model.cost,promptCache:override.promptCache?{...model.promptCache,...override.promptCache}:model.promptCache,contextWindow:override.contextWindow??model.contextWindow,maxTokens:override.maxTokens??model.maxTokens,cacheRetention:override.cacheRetention??model.cacheRetention,samplingParams:override.samplingParams?{...model.samplingParams,...override.samplingParams}:model.samplingParams,compat:mergeCompat(model.compat,override.compat)}}function modelFromJson(providerId,definition,providerConfig,defaults){let api=definition.api??providerConfig.api??defaults?.api;if(!api)throw new Error(`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`);let baseUrl=definition.baseUrl??providerConfig.baseUrl??defaults?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);if(definition.contextWindow!==void 0&&definition.contextWindow<=0)throw new Error(`Provider ${providerId}, model ${definition.id}: invalid contextWindow`);if(definition.maxTokens!==void 0&&definition.maxTokens<=0)throw new Error(`Provider ${providerId}, model ${definition.id}: invalid maxTokens`);return{id:definition.id,name:definition.name??definition.id,promptPreset:definition.promptPreset,recoverTextToolCalls:definition.recoverTextToolCalls,api,provider:providerId,baseUrl,reasoning:definition.reasoning??!1,thinkingLevelMap:definition.thinkingLevelMap,defaultThinkingLevel:definition.defaultThinkingLevel,input:definition.input??["text"],inputLimits:definition.inputLimits,cost:definition.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},promptCache:definition.promptCache,contextWindow:definition.contextWindow??128e3,maxTokens:definition.maxTokens??16384,samplingParams:definition.samplingParams,headers:void 0,cacheRetention:definition.cacheRetention??providerConfig.cacheRetention,compat:mergeCompat(providerConfig.compat,definition.compat)}}function findModelDefaults(models,modelId,api){let chatModels2=models.filter(model=>isModelType(model,"chat"));return chatModels2.find(model=>model.id===modelId)??(api?chatModels2.find(model=>model.api===api):void 0)??chatModels2.find(model=>model.api==="openai-completions")??chatModels2[0]}function findExtensionModelDefaults(models,definition){let type2=definition.type??"chat",candidates=models.filter(model=>isModelType(model,type2));return candidates.find(model=>model.id===definition.id)??(definition.api?candidates.find(model=>model.api===definition.api):void 0)??(type2==="chat"?candidates.find(model=>model.api==="openai-completions"):void 0)??candidates[0]}function extensionModelFromDefinition(providerId,models,config,definition){let type2=definition.type??"chat",defaults=findExtensionModelDefaults(models,definition),api=definition.api??(type2==="chat"?config.api:void 0)??defaults?.api;if(!api)throw new Error(type2==="chat"?`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`:`Provider ${providerId}, model ${definition.id}: no "api" specified. Set it at model level.`);let baseUrl=definition.baseUrl??config.baseUrl??defaults?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);return definition.type==="image"?{...definition,api,provider:providerId,baseUrl,headers:void 0}:definition.type==="classifier"?{...definition,api,provider:providerId,baseUrl,headers:void 0}:{...definition,api,provider:providerId,baseUrl,headers:void 0}}function applyModelsJson(providerId,baseModels,config,extension){if(!config)return[...baseModels];let hasOverrides=config.modelOverrides&&Object.keys(config.modelOverrides).length>0;if(!config.models?.length&&!config.baseUrl&&!config.headers&&!config.extraBody&&!config.compat&&!hasOverrides&&!config.whitelist&&!config.blacklist&&config.hideFreeModels===void 0&&!config.apiKey&&config.authHeader===void 0)throw new Error(`Provider ${providerId}: must specify "baseUrl", "headers", "extraBody", "compat", "modelOverrides", or "models".`);let models=(providerId==="ollama"&&config.models?.length?[]:baseModels).map(model=>{let baseUrl=config.baseUrl??model.baseUrl;return isModelType(model,"chat")?{...model,baseUrl,compat:mergeCompat(model.compat,config.compat)}:{...model,baseUrl}});for(let definition of config.models??[]){let existingIndex=models.findIndex(model2=>isModelType(model2,"chat")&&model2.id===definition.id),defaults=existingIndex>=0?models[existingIndex]:findModelDefaults(models,definition.id,definition.api??extension?.api??config.api),model=modelFromJson(providerId,definition,config,{...defaults,api:extension?.api??defaults?.api,baseUrl:extension?.baseUrl??defaults?.baseUrl});existingIndex>=0?models[existingIndex]=model:models.push(model)}let whitelist=config.whitelist?new Set(config.whitelist):void 0,blacklist=config.blacklist?new Set(config.blacklist):void 0,hideFree=config.hideFreeModels===!0;return models.filter(model=>(whitelist===void 0||whitelist.has(model.id))&&(blacklist===void 0||!blacklist.has(model.id))&&!(hideFree&&model.cost.input===0&&model.cost.output===0))}function applyExtension(providerId,models,config,customModelIds){if(!config)return[...models];if(!config.models)return config.baseUrl?models.map(model=>({...model,baseUrl:config.baseUrl})):[...models];let declaredModels=config.models;return[...declaredModels.map(definition=>extensionModelFromDefinition(providerId,models,config,definition)),...models.filter(model=>isModelType(model,"chat")&&customModelIds.has(model.id)&&!declaredModels.some(definition=>isChatModelConfig(definition)&&definition.id===model.id))]}function adaptOAuth(config){return{name:config.name,isSubscription:config.isSubscription,login:async callbacks=>({...await config.login({onAuth:info=>callbacks.notify({type:"auth_url",...info}),onDeviceCode:info=>callbacks.notify({type:"device_code",...info}),onPrompt:prompt=>callbacks.prompt({type:"text",...prompt}),onProgress:message=>callbacks.notify({type:"progress",message}),onManualCodeInput:()=>callbacks.prompt({type:"manual_code",message:"Paste the authorization code"}),onSelect:prompt=>callbacks.prompt({type:"select",...prompt}),signal:callbacks.signal}),type:"oauth"}),refresh:async(credential,signal)=>({...await config.refreshToken(credential,signal),type:"oauth"}),toAuth:async credential=>({apiKey:config.getApiKey(credential)}),...config.check?{check:config.check}:{}}}function composeOAuthAuth(providerId,base,config,extension){let oauth=extension?.oauth?adaptOAuth(extension.oauth):base?.auth.oauth;if(!oauth)return;let rawHeaders=configuredHeaders(config,extension),authHeader=extension?.authHeader??config?.authHeader??!1;return{...oauth,toAuth:async credential=>{let auth=await oauth.toAuth(credential),env=credential.env,headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,typeof env=="object"&&env!==null?env:void 0);return withConfiguredAuth(auth,headers,authHeader)}}}function rawModelHeaders(model,config,extension){let chatDefinition=isModelType(model,"chat")?config?.models?.find(entry=>entry.id===model.id):void 0,extensionModel=extension?.models?.find(entry=>(entry.type??"chat")===(model.type??"chat")&&entry.id===model.id),headers={...isModelType(model,"chat")?config?.modelOverrides?.[model.id]?.headers:void 0,...chatDefinition?.headers,...extensionModel?.headers};return Object.keys(headers).length>0?headers:void 0}function rawModelExtraBody(model,config,extension){let definition=config?.models?.find(entry=>entry.id===model.id),extensionModel=findExtensionChatModel(extension,model.id),extraBody={...config?.modelOverrides?.[model.id]?.extraBody,...definition?.extraBody,...extensionModel?.extraBody};return Object.keys(extraBody).length>0?extraBody:void 0}function validateExtensionProvider(providerId,base,modelsConfig,extension){if(extension.streamSimple&&!extension.api)throw new Error(`Provider ${providerId}: "api" is required when registering streamSimple.`);applyExtension(providerId,applyModelsJson(providerId,getAllProviderModels(base),modelsConfig,extension),extension,new Set((modelsConfig?.models??[]).map(definition=>definition.id)))}function composeModelProvider(providerId,base,modelConfig,extension){let config=modelConfig.getProvider(providerId),extensionOAuthCredential,refreshedExtensionModels,currentExtension=()=>extension&&refreshedExtensionModels?{...extension,models:refreshedExtensionModels}:extension,getAllModels=()=>{let models=applyExtension(providerId,applyModelsJson(providerId,getAllProviderModels(base),config,currentExtension()),currentExtension(),new Set((config?.models??[]).map(definition=>definition.id)));return extensionOAuthCredential&&extension?.oauth?.modifyModels&&(models=[...extension.oauth.modifyModels(models.filter(model=>isModelType(model,"chat")),extensionOAuthCredential),...models.filter(model=>!isModelType(model,"chat"))]),models.map(model=>{let override=config?.modelOverrides?.[model.id];return override&&isModelType(model,"chat")?applyModelOverride(model,override):model})};getAllModels();let apiKey=composeApiKeyAuth(providerId,base,config,extension),oauth=composeOAuthAuth(providerId,base,config,extension);if(!apiKey&&!oauth)throw new Error(`Provider ${providerId}: no authentication method configured.`);let refreshBase=providerId==="ollama"&&config?.models?.length?void 0:base?.refreshModels?.bind(base),supportsBaseApi=model=>base?.getModels().some(entry=>entry.api===model.api)??!1,streamWith=(model,context,options,simple)=>lazyStream(model,async()=>{let format2=getToolCallFormat(model),tools=format2?getCurrentTools(context.messages):[];if(format2&&tools.length>0){let protocol=getProtocol(format2),transformedContext=transformContext(context,protocol),innerStream=streamWith(model,transformedContext,options,simple);return wrapStreamWithToolCallMiddleware(innerStream,protocol,tools)}if(extension?.streamSimple&&model.api===extension.api)return extension.streamSimple(model,context,options);if(base&&supportsBaseApi(model))return simple?base.streamSimple(model,context,options):base.stream(model,context,options);let api=getApiProvider(model.api);if(!api)throw new Error(`No API provider registered for api: ${model.api} (model "${model.provider}/${model.id}"). Load the extension that implements this api, or fix the "api" value for provider "${providerId}" in models.json.`);return simple?api.streamSimple(model,context,options):api.stream(model,context,options)}),provider={id:providerId,name:extension?.name??config?.name??base?.name??extension?.oauth?.name??providerId,baseUrl:extension?.baseUrl??config?.baseUrl??base?.baseUrl,headers:base?.headers,retryPolicy:extension?.retryPolicy??base?.retryPolicy,auth:{...apiKey?{apiKey}:{},...oauth?{oauth}:{}},getModels:()=>getAllModels().filter(model=>isModelType(model,"chat")),getAllModels,refreshModels:refreshBase||extension?.refreshModels||extension?.oauth?.modifyModels?async context=>{await refreshBase?.(context);let refreshed;if(extension?.refreshModels&&(refreshed=await extension.refreshModels(context)),context.signal.aborted)return;let oauthCredential=context.credential?.type==="oauth"?context.credential:void 0;await context.publish({update:()=>{refreshed&&(applyExtension(providerId,applyModelsJson(providerId,getAllProviderModels(base),config,extension),{...extension,models:refreshed},new Set((config?.models??[]).map(definition=>definition.id))),refreshedExtensionModels=refreshed),extensionOAuthCredential=oauthCredential}})}:void 0,filterModels:base?.filterModels?(models,credential)=>base.filterModels(models,credential):void 0,filterAllModels:base?.filterAllModels?(models,credential)=>base.filterAllModels(models,credential):void 0,stream:(model,context,options)=>streamWith(model,context,options,!1),streamSimple:(model,context,options)=>streamWith(model,context,options,!0)},fetchDeferred=base?.fetchDeferred;fetchDeferred&&(provider.fetchDeferred=(model,handle,options)=>fetchDeferred(model,handle,options));let cancelDeferred=base?.cancelDeferred;cancelDeferred&&(provider.cancelDeferred=(model,handle,options)=>cancelDeferred(model,handle,options));let extensionImages=extension?.images,generateImages2=base?.generateImages;(generateImages2||Object.keys(extensionImages??{}).length>0)&&(provider.generateImages=(model,context,options)=>{let implementation=extensionImages?.[model.api];return implementation?implementation.generateImages(model,context,options):generateImages2?generateImages2(model,context,options):Promise.resolve(imageErrorResult(model,new Error(`Provider ${providerId} has no image implementation for "${model.api}"`)))});let extensionClassifiers=extension?.classifiers,classify=base?.classify;return(classify||Object.keys(extensionClassifiers??{}).length>0)&&(provider.classify=(model,context,options)=>{let implementation=extensionClassifiers?.[model.api];return implementation?implementation.classify(model,context,options):classify?classify(model,context,options):Promise.resolve(classifierErrorResult(model,new Error(`Provider ${providerId} has no classifier implementation for "${model.api}"`)))}),provider}function resolveConfiguredModelHeaders(model,config,extension,env){return resolveHeadersOrThrow(rawModelHeaders(model,config,extension),`model "${model.provider}/${model.id}"`,env)}async function resolveCompatibilityRequestHeaders(model,config,extension,env){let configured=await resolveHeadersOrThrow({...configuredHeaders(config,extension),...rawModelHeaders(model,config,extension)},`model "${model.provider}/${model.id}"`,env);return model.headers||configured?{...model.headers,...configured}:void 0}function resolveCompatibilityRequestConfig(model,config,extension){let modelDefinition=config?.models?.find(entry=>entry.id===model.id),extensionModel=findExtensionChatModel(extension,model.id),configuredExtraBody={...config?.extraBody,...extension?.extraBody,...rawModelExtraBody(model,config,extension)};return{extraBody:Object.keys(configuredExtraBody).length>0?configuredExtraBody:void 0,upstreamModelId:extensionModel?.upstreamModelId??modelDefinition?.upstreamModelId??model.upstreamModelId,serviceTier:extensionModel?.serviceTier??modelDefinition?.serviceTier??model.serviceTier,authHeader:extension?.authHeader??config?.authHeader??!1}}function configuredRequestAuthStatus(config,extension){let value2=configuredApiKey(config,extension);if(value2===void 0)return configuredHeaderAuthStatus(config?.headers,extension?.headers);if(isCommandConfigValue(value2))return{configured:!0,source:"models_json_command"};let names=getConfigValueEnvVarNames(value2);return names.length>0?isConfigValueConfigured(value2)?{configured:!0,source:"environment",label:names.join(", ")}:{configured:!1}:{configured:!0,source:extension?.apiKey!==void 0?"fallback":"models_json_key"}}function createProviderSemaphores(getLimit){let providers=new Map;function drain(semaphore){for(;semaphore.active<semaphore.limit&&semaphore.waiters.length>0;)semaphore.waiters.shift()?.grant()}function resize(providerId,limit){let semaphore=providers.get(providerId);semaphore&&(semaphore.limit=limit>0?limit:1/0,drain(semaphore))}function acquire(semaphore,signal){return signal?.aborted?Promise.reject(signal.reason):new Promise((resolve45,reject)=>{let abort=()=>{let index=semaphore.waiters.indexOf(waiter);index!==-1&&semaphore.waiters.splice(index,1),reject(signal?.reason)},waiter={grant(){signal?.removeEventListener("abort",abort),semaphore.active++;let released=!1;resolve45(()=>{released||(released=!0,semaphore.active--,drain(semaphore))})}};semaphore.waiters.push(waiter),signal?.addEventListener("abort",abort,{once:!0}),drain(semaphore)})}async function runAcquired(semaphore,signal,run2){let release4=await acquire(semaphore,signal);try{signal?.throwIfAborted();let stream2=run2();return stream2.result().then(release4,release4),stream2}catch(error2){throw release4(),error2}}return{resize,bracket(providerId,signal,run2){let configured=getLimit(providerId),limit=configured>0?configured:1/0;if(resize(providerId,limit),limit===1/0)return run2();let semaphore=providers.get(providerId);return semaphore||(semaphore={limit,active:0,waiters:[]},providers.set(providerId,semaphore)),runAcquired(semaphore,signal,run2)}}}import{isDeepStrictEqual as isDeepStrictEqual2}from"node:util";var MODEL_CAPABILITY_FIELDS=["contextWindow","maxTokens","input","reasoning","thinkingLevelMap","upstreamModelId","serviceTier","recoverTextToolCalls","compat"];function mergeRemoteCatalogModels(providerId,baseline,dynamic){let merged=[...baseline],conflicts=[];for(let model of dynamic){let index=merged.findIndex(entry=>entry.id===model.id);if(index<0){merged.push(model);continue}let staticModel=merged[index],fields=MODEL_CAPABILITY_FIELDS.filter(field2=>!isDeepStrictEqual2(staticModel[field2],model[field2]));fields.length>0&&conflicts.push({providerId,modelId:model.id,fields}),merged[index]={...staticModel,name:model.name,cost:model.cost}}return{models:merged,conflicts}}function parseRemoteCatalog(providerId,value2){let entries=Array.isArray(value2)?value2:typeof value2=="object"&&value2!==null&&"models"in value2&&Array.isArray(value2.models)?value2.models:typeof value2=="object"&&value2!==null?Object.values(value2):void 0;if(!entries?.every(isModelCatalogEntry))throw new Error(`Invalid model catalog for provider "${providerId}"`);return entries.map(model=>({...model,provider:providerId}))}function isModelCatalogEntry(value2){return isRecord6(value2)?typeof value2.id=="string"&&typeof value2.name=="string"&&typeof value2.api=="string"&&typeof value2.provider=="string"&&typeof value2.baseUrl=="string"&&typeof value2.reasoning=="boolean"&&isInputArray(value2.input)&&isModelCost(value2.cost)&&isFiniteNumber2(value2.contextWindow)&&isFiniteNumber2(value2.maxTokens):!1}function isInputArray(value2){return Array.isArray(value2)&&value2.every(modality=>modality==="text"||modality==="image"||modality==="video")}function isModelCost(value2){return isRecord6(value2)?isFiniteNumber2(value2.input)&&isFiniteNumber2(value2.output)&&isFiniteNumber2(value2.cacheRead)&&isFiniteNumber2(value2.cacheWrite):!1}function isFiniteNumber2(value2){return typeof value2=="number"&&Number.isFinite(value2)}function isRecord6(value2){return typeof value2=="object"&&value2!==null}var DEFAULT_CATALOG_BASE_URL="https://pi.dev",REMOTE_CATALOG_ATTEMPT_TIMEOUT_MS=4e3,REMOTE_CATALOG_REFRESH_INTERVAL_MS=14400*1e3,REMOTE_CATALOG_MODEL_TYPES=["chat","image","classifier"],NON_CHAT_MODEL_TYPES=REMOTE_CATALOG_MODEL_TYPES.filter(type2=>type2!=="chat"),FORK_ONLY_BUILTIN_PROVIDERS=new Set(["alibaba-token-plan","opengateway"]);function remoteCatalogServesProvider(providerId,catalogBaseUrl){return catalogBaseUrl!==void 0||!FORK_ONLY_BUILTIN_PROVIDERS.has(providerId)}function isSupportedModelType(model){return model.type===void 0||typeof model.type=="string"&&REMOTE_CATALOG_MODEL_TYPES.includes(model.type)}function mergeModels(baseline,dynamic){let merged=new Map;for(let model of[...baseline,...dynamic])merged.set(`${getModelType(model)}\0${model.id}`,model);return[...merged.values()]}var remoteCatalogConflicts=new WeakMap;function chatModels(models){return models.filter(model=>isModelType(model,"chat"))}function nonChatModels(models){return models.filter(model=>!isModelType(model,"chat"))}function parseCatalog(providerId,value2){let entries=Array.isArray(value2)?value2:typeof value2=="object"&&value2!==null&&"models"in value2&&Array.isArray(value2.models)?value2.models:typeof value2=="object"&&value2!==null?Object.values(value2):void 0;if(!entries)throw new Error(`Invalid model catalog for provider "${providerId}"`);let supported=entries.filter(entry=>typeof entry=="object"&&entry!==null).filter(isSupportedModelType),isNonChat=entry=>NON_CHAT_MODEL_TYPES.includes(entry.type),chat=supported.filter(entry=>!isNonChat(entry)),other=supported.filter(entry=>isNonChat(entry)&&"id"in entry).map(model=>({...model,provider:providerId}));return[...parseRemoteCatalog(providerId,chat),...other]}function remoteModels(entry,localGeneratedAt){return entry?localGeneratedAt!==void 0&&(entry.lastModified===void 0||entry.lastModified<=localGeneratedAt)?[]:entry.models:[]}function withRemoteCatalog(provider,catalogBaseUrl=DEFAULT_CATALOG_BASE_URL,localGeneratedAt){let dynamicModels=[],currentChatModels=()=>mergeRemoteCatalogModels(provider.id,provider.getModels(),chatModels(dynamicModels)).models,conflictsFor=models=>mergeRemoteCatalogModels(provider.id,provider.getModels(),chatModels(models)).conflicts,wrappedProvider={...provider,getModels:currentChatModels,getAllModels:()=>[...currentChatModels(),...mergeModels(nonChatModels(provider.getAllModels?.()??[]),nonChatModels(dynamicModels))],refreshModels:async context=>{let stored=context.stored,restored=remoteModels(stored,localGeneratedAt).filter(model=>model.provider===provider.id);if(!await context.publish({update:()=>{dynamicModels=restored,remoteCatalogConflicts.set(wrappedProvider,conflictsFor(restored))}})||!context.allowNetwork||context.signal.aborted||!context.force&&stored?.checkedAt!==void 0&&stored.lastModified!==void 0&&Date.now()-stored.checkedAt<REMOTE_CATALOG_REFRESH_INTERVAL_MS)return;let validator=stored&&stored.models.length>0?stored.etag:void 0,url=new URL(`/api/models/providers/${encodeURIComponent(provider.id)}`,catalogBaseUrl);url.searchParams.set("types",REMOTE_CATALOG_MODEL_TYPES.join(","));let response=await fetchWithRetry(url,{headers:{accept:"application/json","User-Agent":getPiUserAgent(VERSION),...validator?{"if-none-match":validator}:{}},signal:context.signal},{attemptTimeoutMs:REMOTE_CATALOG_ATTEMPT_TIMEOUT_MS});if(context.signal.aborted)return;let checkedAt=Date.now();if(response.status===304&&stored){await context.publish({persist:{...stored,checkedAt}});return}if(response.status===404||response.status===501){await context.publish({persist:{...stored??{models:[]},checkedAt,lastModified:0,etag:void 0}});return}if(!response.ok)throw await context.publish({persist:{...stored??{models:[]},checkedAt}}),new Error(`Model catalog request failed for ${provider.id}: ${response.status}`);let refreshed=parseCatalog(provider.id,await response.json()),lastModified=Date.parse(response.headers.get("last-modified")??"");if(context.signal.aborted)return;let entry={models:refreshed,checkedAt,lastModified:Number.isNaN(lastModified)?0:lastModified,etag:response.headers.get("etag")??void 0},published=remoteModels(entry,localGeneratedAt);await context.publish({persist:entry,update:()=>{dynamicModels=published,remoteCatalogConflicts.set(wrappedProvider,conflictsFor(published))}})}};return remoteCatalogConflicts.set(wrappedProvider,[]),wrappedProvider}function asExtensionOAuthRegistry(store){let candidate=store;return typeof candidate.registerOAuthProvider=="function"&&typeof candidate.unregisterOAuthProvider=="function"?candidate:void 0}var RuntimeCredentials=class{constructor(store){this.overrides=new Map,this.store=store}registerOAuthProvider(providerId,oauth){asExtensionOAuthRegistry(this.store)?.registerOAuthProvider(providerId,oauth)}unregisterOAuthProvider(providerId){asExtensionOAuthRegistry(this.store)?.unregisterOAuthProvider(providerId)}setRuntimeApiKey(providerId,apiKey){this.overrides.set(providerId,apiKey)}removeRuntimeApiKey(providerId){this.overrides.delete(providerId)}hasRuntimeApiKey(providerId){return this.overrides.has(providerId)}busyReadCount(){let store=this.store;return typeof store.getBusyReadCount=="function"?store.getBusyReadCount():0}async read(providerId,options){options?.signal?.throwIfAborted();let override=this.overrides.get(providerId);return override?{type:"api_key",key:override}:this.store.read(providerId,options)}async list(options){let entries=new Map((await this.store.list(options)).map(entry=>[entry.providerId,entry]));options?.signal?.throwIfAborted();for(let providerId of this.overrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}modify(providerId,fn,options){return this.store.modify(providerId,fn,options)}async delete(providerId,options){options?.signal?.throwIfAborted(),await this.store.delete(providerId,options),this.overrides.delete(providerId)}};setWireIdentity(BRAND?.userAgent??APP_NAME);function installClaudeCodeVersionCache(modelsPath){modelsPath!==void 0&&installClaudeCodeVersionFileStore({path:join8(dirname7(modelsPath),"claude-code-version.json"),offline:envValue("OFFLINE")!==void 0})}function mightHoldCredentialPool(providerId,credential,env,policySlots){if(credential){let accounts=Object.entries(credential).find(([key])=>key==="accounts")?.[1];return Array.isArray(accounts)&&accounts.length>1||Object.keys(policySlots??{}).length>0}return discoverEnvSlots(providerId,env).length+Object.keys(policySlots??{}).length>1}var CredentialSynchronizationError=class extends Error{constructor(providerId,operation,credential,options){super(`Credential ${operation} committed for ${providerId}, but local synchronization failed`,options),this.name="CredentialSynchronizationError",this.providerId=providerId,this.operation=operation,this.credential=credential}};function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value2]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value2}return merged}function withPayloadRequestMetadata(options,model){if(!options.onPayload)return options;let onPayload=options.onPayload;return{...options,onPayload:async(payload,providerModel)=>await onPayload(payload,providerModel,{model,headers:options.headers??{}})}}var ModelRuntime=class _ModelRuntime{setSettingsManager(settingsManager){if(this.settingsManager===settingsManager)return;this.unsubscribeProviderSettings?.(),this.settingsManager=settingsManager;let resize=()=>{for(let provider of this.getProviders())this.providerSemaphores.resize(provider.id,settingsManager.getProviderConcurrencyLimit(provider.id))};this.unsubscribeProviderSettings=settingsManager.subscribeToProviderSettings(resize),resize()}constructor(credentials,config,modelsPath,modelsStore,providers,modelNetworkEnabled,modelRefreshTimeoutMs,poolStatePath){this.providerSemaphores=createProviderSemaphores(providerId=>this.settingsManager?.getProviderConcurrencyLimit(providerId)??1/0),this.builtins=new Map,this.nativeExtensionProviders=new Map,this.extensionProviders=new Map,this.virtualModels=new Map,this.compositionErrors=new Map,this.snapshot={all:[],available:[],configuredProviders:new Set,storedProviders:new Set,auth:new Map},this.availabilityInitialized=!1,this.availabilityRefreshSeq=0,this.availabilityErrorSeq=0,this.providerAvailabilitySeq=new Map,this.credentialOperations=new Map,this.credentials=credentials,this.poolStatePath=poolStatePath,this.config=config,this.modelsPath=modelsPath,this.modelNetworkEnabled=modelNetworkEnabled,this.modelRefreshTimeoutMs=modelRefreshTimeoutMs,this.defaultBuiltins=new Map(providers.map(provider=>[provider.id,provider]));for(let[providerId,provider]of this.defaultBuiltins)this.builtins.set(providerId,provider);this.models=createModels({credentials,modelsStore}),this.rebuildProviders()}static async create(options={}){let credentials=new RuntimeCredentials(options.credentials??AuthStorage.create(options.authPath)),modelsPath=options.modelsPath===null?void 0:options.modelsPath??join8(getAgentDir(),"models.json");installClaudeCodeVersionCache(modelsPath);let config=await ModelConfig.load(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join8(dirname7(modelsPath),"models-store.json")):new InMemoryCodingAgentModelsStore),builtinModelDataGeneratedAt=getBuiltinModelDataGeneratedAt(),providers=builtinProviders().map(provider=>provider.refreshModels||!remoteCatalogServesProvider(provider.id,options.catalogBaseUrl)?provider:withRemoteCatalog(provider,options.catalogBaseUrl,builtinModelDataGeneratedAt)),runtime=new _ModelRuntime(credentials,config,modelsPath,modelsStore,providers,envValue("OFFLINE")===void 0&&options.allowModelNetwork===!0,options.modelRefreshTimeoutMs??15e3,options.agentDir?join8(options.agentDir,"credential-pool-state.json"):options.authPath?join8(dirname7(options.authPath),"credential-pool-state.json"):void 0);runtime.rebuildProviders(),options.settingsManager&&runtime.setSettingsManager(options.settingsManager);let refreshFromNetwork=runtime.modelNetworkEnabled&&options.allowModelNetwork===!0,controller=refreshFromNetwork&&options.modelRefreshTimeoutMs!==void 0?new AbortController:void 0,timeout=controller?setTimeout(()=>controller.abort(),options.modelRefreshTimeoutMs):void 0,signal=controller?options.signal?AbortSignal.any([options.signal,controller.signal]):controller.signal:options.signal;try{options.refreshOnCreate!==!1&&await runtime.refresh({allowNetwork:refreshFromNetwork,signal})}finally{timeout&&clearTimeout(timeout)}return runtime}static createSync(options={}){let credentials=new RuntimeCredentials(options.credentials??AuthStorage.create(options.authPath)),modelsPath=options.modelsPath===null?void 0:options.modelsPath??join8(getAgentDir(),"models.json");installClaudeCodeVersionCache(modelsPath);let config=ModelConfig.loadSync(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join8(dirname7(modelsPath),"models-store.json")):new InMemoryCodingAgentModelsStore),providers=builtinProviders().map(provider=>provider.refreshModels||!remoteCatalogServesProvider(provider.id,options.catalogBaseUrl)?provider:withRemoteCatalog(provider,options.catalogBaseUrl)),runtime=new _ModelRuntime(credentials,config,modelsPath,modelsStore,providers,options.allowModelNetwork??!1,options.modelRefreshTimeoutMs??15e3,options.agentDir?join8(options.agentDir,"credential-pool-state.json"):options.authPath?join8(dirname7(options.authPath),"credential-pool-state.json"):void 0);return runtime.rebuildProviders(),options.settingsManager&&runtime.setSettingsManager(options.settingsManager),runtime}providerIds(){return new Set([...this.builtins.keys(),...this.nativeExtensionProviders.keys(),...this.config.getProviderIds(),...this.extensionProviders.keys(),...this.virtualModels.keys()])}recomposeProvider(rawProviderId){let providerId=normalizeProviderId(rawProviderId);if(this.config.isProviderDisabled(providerId)){this.models.deleteProvider(providerId),this.compositionErrors.delete(providerId);return}let provider=this.composeProvider(providerId),virtualModels=[...this.virtualModels.get(providerId)?.values()??[]].map(entry=>entry.model);return virtualModels.length>0?this.models.setProvider(withVirtualModels(providerId,provider,virtualModels)):provider?this.models.setProvider(provider):this.models.deleteProvider(providerId),provider}composeProvider(providerId){let base=this.nativeExtensionProviders.get(providerId)??this.builtins.get(providerId),extension=this.extensionProviders.get(providerId);if(!this.config.getProvider(providerId)&&!extension)return this.compositionErrors.delete(providerId),base;try{let provider=composeModelProvider(providerId,base,this.config,extension);return this.compositionErrors.delete(providerId),provider}catch(error2){return this.compositionErrors.set(providerId,error2 instanceof Error?error2.message:String(error2)),base}}rebuildProviders(){this.models.clearProviders(),this.compositionErrors.clear();for(let providerId of this.providerIds())this.recomposeProvider(providerId);this.updateModelSnapshot()}updateModelSnapshot(){let all2=[...this.models.getModels()];this.snapshot={...this.snapshot,all:all2,available:all2.filter(model=>this.snapshot.configuredProviders.has(model.provider))}}async runAvailabilityRefresh(seq,errorSeq,signal){let busyReadsBefore=this.credentials.busyReadCount(),providers=this.models.getProviders(),[available,checks,credentials]=await Promise.all([this.models.getAvailable(void 0,{signal}),Promise.all(providers.map(async provider=>[provider.id,await this.models.checkAuth(provider.id,{signal})])),this.credentials.list({signal})]);if(seq!==this.availabilityRefreshSeq||this.answeredFromBusyStore(busyReadsBefore,errorSeq))return;let auth=new Map(checks),configuredProviders=new Set(checks.filter(entry=>entry[1]!==void 0).map(([providerId])=>providerId));this.snapshot={all:[...this.models.getModels()],available:[...available],configuredProviders,storedProviders:new Set(credentials.map(entry=>entry.providerId)),auth},this.availabilityInitialized=!0,errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0)}queueAvailabilityRefresh(signal){let seq=++this.availabilityRefreshSeq;for(let[providerId,providerSeq]of this.providerAvailabilitySeq)this.providerAvailabilitySeq.set(providerId,providerSeq+1);let errorSeq=++this.availabilityErrorSeq,effectiveSignal=operationSignal(signal);return this.runAvailabilityRefresh(seq,errorSeq,effectiveSignal).catch(error2=>{throw errorSeq===this.availabilityErrorSeq&&!effectiveSignal.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2})}async refreshProviderAvailability(providerId,signal){++this.availabilityRefreshSeq;let providerSeq=(this.providerAvailabilitySeq.get(providerId)??0)+1;this.providerAvailabilitySeq.set(providerId,providerSeq);let errorSeq=++this.availabilityErrorSeq,busyReadsBefore=this.credentials.busyReadCount();try{let[available,auth,credential]=await Promise.all([this.models.getAvailable(providerId,{signal}),this.models.checkAuth(providerId,{signal}),this.credentials.read(providerId,{signal})]);if(signal.throwIfAborted(),this.providerAvailabilitySeq.get(providerId)!==providerSeq||this.answeredFromBusyStore(busyReadsBefore,errorSeq))return;let configuredProviders=new Set(this.snapshot.configuredProviders),storedProviders=new Set(this.snapshot.storedProviders),authByProvider=new Map(this.snapshot.auth);auth?(configuredProviders.add(providerId),authByProvider.set(providerId,auth)):(configuredProviders.delete(providerId),authByProvider.delete(providerId)),credential?storedProviders.add(providerId):storedProviders.delete(providerId);let all2=[...this.models.getModels()],availableById=new Map([...this.snapshot.available.filter(model=>model.provider!==providerId),...available].map(model=>[`${model.provider}\0${model.id}`,model]));this.snapshot={all:all2,available:all2.flatMap(model=>availableById.get(`${model.provider}\0${model.id}`)??[]),configuredProviders,storedProviders,auth:authByProvider},errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0)}catch(error2){throw this.providerAvailabilitySeq.get(providerId)===providerSeq&&errorSeq===this.availabilityErrorSeq&&!signal.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2}}answeredFromBusyStore(busyReadsBefore,errorSeq){return this.credentials.busyReadCount()===busyReadsBefore?!1:(errorSeq===this.availabilityErrorSeq&&(this.availabilityError="Credential store was busy; availability will be re-read on the next refresh"),!0)}getProviders(){return this.models.getProviders()}getProvider(providerId){return this.models.getProvider(providerId)}getModels(providerId){return this.models.getModels(providerId)}getModel(providerId,modelId){return this.models.getModel(providerId,modelId)}getModelsOfType(type2,providerId){return this.models.getModelsOfType(type2,providerId)}getModelOfType(type2,providerId,modelId){return this.models.getModelOfType(type2,providerId,modelId)}getAllModels(providerId){return this.models.getAllModels(providerId)}getAvailableOfType(type2,providerId,options){return this.models.getAvailableOfType(type2,providerId,options)}getAllAvailable(providerId,options){return this.models.getAllAvailable(providerId,options)}async checkAuth(providerId,options){return this.models.checkAuth(providerId,options)}async getAvailable(providerId,options){if(providerId){let errorSeq=++this.availabilityErrorSeq;try{let available=await this.models.getAvailable(providerId,options);return errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0),available}catch(error2){throw errorSeq===this.availabilityErrorSeq&&!options?.signal?.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2}}return await this.queueAvailabilityRefresh(options?.signal),this.snapshot.available}getAvailableSnapshot(){return this.snapshot.available}hasFreshAvailabilitySnapshot(){return this.availabilityInitialized&&this.availabilityError===void 0}hasAvailabilitySnapshot(){return this.availabilityInitialized}getWarnings(){return this.config.getWarnings()}getError(){let errors=[],configError=this.config.getError();configError&&errors.push(configError);for(let[providerId,error2]of this.compositionErrors)errors.push(`Provider "${providerId}": ${error2}`);return this.availabilityError&&errors.push(`Availability refresh: ${this.availabilityError}`),errors.length>0?errors.join(`
|
|
726
726
|
|
|
727
|
-
`):void 0}getRegisteredProviderConfig(providerId){return this.extensionProviders.get(providerId)}getRegisteredProviderIds(){return[...new Set([...this.extensionProviders.keys(),...this.nativeExtensionProviders.keys()])]}getRegisteredNativeProvider(providerId){return this.nativeExtensionProviders.get(providerId)}getCompatibilityRequestConfig(model){return resolveCompatibilityRequestConfig(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider))}getCompatibilityRequestHeaders(model,env){return resolveCompatibilityRequestHeaders(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider),env)}isUsingOAuth(providerId){return this.snapshot.auth.get(providerId)?.type==="oauth"}isUsingSubscription(providerId){return this.isUsingOAuth(providerId)&&this.models.getProvider(providerId)?.auth.oauth?.isSubscription===!0}hasConfiguredAuth(providerId){return this.snapshot.configuredProviders.has(providerId)}isFallbackEligible(providerId){let hook=this.extensionProviders.get(providerId)?.fallbackEligible;if(typeof hook!="function")return!0;try{return hook()!==!1}catch{return!0}}async getAuth(providerOrModel,overrides={}){if(typeof providerOrModel=="string")return this.models.getAuth(providerOrModel,overrides);let resolution=await this.models.getAuth(providerOrModel,overrides);if(!resolution)return;let configuredHeaders2=await resolveConfiguredModelHeaders(providerOrModel,this.config.getProvider(providerOrModel.provider),this.extensionProviders.get(providerOrModel.provider),{...resolution.env??{},...overrides.env??{}});return{...resolution,auth:{...resolution.auth,headers:mergeHeaders(resolution.auth.headers,configuredHeaders2)}}}enqueueCredentialOperation(providerId,signal,task){let previous=this.credentialOperations.get(providerId)??Promise.resolve(),markStarted,started=new Promise(resolve45=>{markStarted=resolve45}),operation=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),markStarted?.(),task()))(),tail=operation.catch(()=>{});return this.credentialOperations.set(providerId,tail),tail.then(()=>{this.credentialOperations.get(providerId)===tail&&this.credentialOperations.delete(providerId)}),raceWithAbortSignal(started,signal).then(()=>operation)}async synchronizeCredentialState(providerId,operation,credential,signal){try{signal.throwIfAborted(),this.recomposeProvider(providerId);let compositionError=this.compositionErrors.get(providerId);if(compositionError)throw new Error(compositionError);let result3=await this.models.refresh({allowNetwork:!1,providers:[providerId],signal});result3.aborted&&signal.throwIfAborted();let refreshError=result3.errors.get(providerId);if(refreshError)throw refreshError;this.updateModelSnapshot(),await this.refreshProviderAvailability(providerId,signal)}catch(cause){throw new CredentialSynchronizationError(providerId,operation,credential,{cause})}}setRuntimeApiKey(providerId,apiKey,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.setRuntimeApiKey(providerId,apiKey),await this.synchronizeCredentialState(providerId,"setRuntimeApiKey",{type:"api_key",key:apiKey},signal)})}removeRuntimeApiKey(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.removeRuntimeApiKey(providerId),await this.synchronizeCredentialState(providerId,"removeRuntimeApiKey",void 0,signal)})}listCredentials(options){return this.credentials.list(options)}getProviderAuthStatus(providerId){if(this.credentials.hasRuntimeApiKey(providerId))return{configured:!0,source:"runtime"};if(this.snapshot.storedProviders.has(providerId))return{configured:!0,source:"stored"};let configured=configuredRequestAuthStatus(this.config.getProvider(providerId),this.extensionProviders.get(providerId));if(configured)return configured;let check=this.snapshot.auth.get(providerId);return check?{configured:!0,source:"environment",label:check.source,...check.ambient?{ambient:!0}:{}}:{configured:!1}}async prepareRequest(model,options,slotAuth){let provider=this.models.getProvider(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);let resolution=await this.getAuth(model,{apiKey:slotAuth?.apiKey??options?.apiKey,env:options?.env,signal:options?.signal,...slotAuth?.slotName===void 0?{}:{slotName:slotAuth.slotName},...slotAuth?.rejectedAccess===void 0?{}:{rejectedAccess:slotAuth.rejectedAccess}});if(!resolution)throw new ModelsError("auth",providerNotConfiguredMessage(model.provider));let{transformHeaders,...rawProviderOptions}=options??{},providerOptions=rawProviderOptions,headers=mergeHeaders(resolution.auth.headers,providerOptions.headers);transformHeaders&&(headers=await transformHeaders(headers??{}));let compatibility=isModelType(model,"chat")?this.getCompatibilityRequestConfig(model):{},extraBody=compatibility.extraBody||providerOptions.extraBody?{...compatibility.extraBody,...providerOptions.extraBody}:void 0,env=resolution.env||providerOptions.env?{...resolution.env??{},...providerOptions.env??{}}:void 0,upstreamModelId=compatibility.upstreamModelId,requestModel=resolution.auth.baseUrl||upstreamModelId?{...model,...upstreamModelId?{id:upstreamModelId}:{},...resolution.auth.baseUrl?{baseUrl:resolution.auth.baseUrl}:{}}:model,rejectedTokenStatuses=provider.auth.oauth?.rejectedTokenStatuses,storedOAuthAccess=resolution.source==="OAuth"&&(slotAuth?.apiKey??providerOptions.apiKey)===void 0?resolution.auth.apiKey:void 0;return{...rejectedTokenStatuses!==void 0&&storedOAuthAccess!==void 0?{rejectableAccess:storedOAuthAccess,rejectedTokenStatuses}:{},provider,model:requestModel,options:{...providerOptions,apiKey:slotAuth?.apiKey??providerOptions.apiKey??resolution.auth.apiKey,headers,extraBody,env}}}loadCredentialPool(){return this.credentialPoolModules??=(async()=>{let[rotation,stateStore]=await Promise.all([import("./rotation-stream-ZJQ6I2RZ.js"),import("./state-store-SCMTDYE2.js")]);return{rotation,repository:new stateStore.CredentialSlotRepository(this.poolStatePath)}})(),this.credentialPoolModules}couldRotateCredentials(model,options){if(options?.apiKey!==void 0||this.credentials.hasRuntimeApiKey(model.provider)||this.config.getProvider(model.provider)?.credentials?.rotation===!1)return!1;let env=name=>options?.env?.[name]??process.env[name];if(this.snapshot.storedProviders.has(model.provider))return!0;let policySlots=this.config.getProvider(model.provider)?.credentials?.slots;return discoverEnvSlots(model.provider,env).length+Object.keys(policySlots??{}).length>1}async credentialRotationSources(model,options){let env=name=>options?.env?.[name]??process.env[name],credential=await this.credentials.read(model.provider,{signal:options?.signal}),policy=this.config.getProvider(model.provider)?.credentials;if(!mightHoldCredentialPool(model.provider,credential,env,policy?.slots))return;let pool=await this.loadCredentialPool(),sources={providerId:model.provider,credential,env,repository:pool.repository,policy};return(await pool.rotation.listRotationSlots(sources,{acquireLeases:!1})).length>1?sources:void 0}stream(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{assertChatModel(model);let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,modelId:this.getCompatibilityRequestConfig(model).upstreamModelId??model.id,...streamOptions?.affinityKey!==void 0?{affinityKey:streamOptions.affinityKey}:streamOptions?.sessionId!==void 0?{affinityKey:streamOptions.sessionId}:{},runAttempt:slot=>this.attemptWithTokenRecovery(model,streamOptions,slot.lane==="env"?{...slot.envKey===void 0?{}:{apiKey:slot.envKey}}:{slotName:slot.name},prepared=>prepared.provider.stream(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}return this.attemptWithTokenRecovery(model,streamOptions,void 0,prepared=>prepared.provider.stream(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}attemptWithTokenRecovery(model,options,slotAuth,send,transcript){return retryOnceOnRejectedToken(async rejectedAccess=>{let prepared=await this.prepareRequest(model,options,rejectedAccess===void 0?slotAuth:{...slotAuth,rejectedAccess}),inner=await this.providerSemaphores.bracket(prepared.model.provider,prepared.options.signal,()=>send(prepared));return{stream:wrapStreamWithModelRecovery(inner,model,getCurrentTools(transcript.messages)),...prepared.rejectableAccess===void 0?{}:{rejectableAccess:prepared.rejectableAccess},...prepared.rejectedTokenStatuses===void 0?{}:{rejectedTokenStatuses:prepared.rejectedTokenStatuses}}})}complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){let transcript=normalizeContext(context);return isVirtualModel(model)?lazyStream(model,async()=>{let route=await this.resolveModel(model,transcript.messages,{reason:"direct",thinkingLevel:options?.reasoning??"off",signal:options?.signal}),{maxTokens:limit}=route.model,maxTokens=options?.maxTokens&&limit>0?Math.min(options.maxTokens,limit):options?.maxTokens,reasoning=route.thinkingLevel==="off"?void 0:route.thinkingLevel,{apiKey,headers,env,...rest}=options??{},auth=route.model.provider===model.provider?{apiKey,headers,env}:{};return this.streamSimple(route.model,context,{...rest,...auth,maxTokens,reasoning})}):lazyStream(model,async()=>{assertChatModel(model);let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,modelId:this.getCompatibilityRequestConfig(model).upstreamModelId??model.id,...streamOptions?.sessionId===void 0?{}:{affinityKey:streamOptions.sessionId},runAttempt:slot=>this.attemptWithTokenRecovery(model,streamOptions,slot.lane==="env"?{apiKey:slot.envKey}:{slotName:slot.name},prepared=>prepared.provider.streamSimple(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}return this.attemptWithTokenRecovery(model,options,void 0,prepared=>prepared.provider.streamSimple(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}async prepareSimpleRequest(model,options){let prepared=await this.prepareRequest(model,options);return{model:prepared.model,options:withPayloadRequestMetadata(prepared.options,prepared.model)}}completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{assertChatModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);return prepared.provider.fetchDeferred(prepared.model,handle,prepared.options)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){assertChatModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);await prepared.provider.cancelDeferred(prepared.model,handle,prepared.options)}async generateImages(model,context,options){try{assertImageModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.generateImages)throw new ModelsError("provider",`Provider ${model.provider} does not support image generation`);return await prepared.provider.generateImages(prepared.model,context,prepared.options)}catch(error2){return imageErrorResult(model,error2,options?.signal?.aborted)}}async classify(model,context,options){try{assertClassifierModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.classify)throw new ModelsError("provider",`Provider ${model.provider} does not support classification`);return await prepared.provider.classify(prepared.model,context,prepared.options)}catch(error2){return classifierErrorResult(model,error2,options?.signal?.aborted)}}login(providerId,type2,interaction,options){let signal=operationSignal(interaction.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{let credential=await this.models.login(providerId,type2,{...interaction,signal},options);return await this.synchronizeCredentialState(providerId,"login",credential,signal),credential})}logout(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{await this.models.logout(providerId,{signal}),await this.synchronizeCredentialState(providerId,"logout",void 0,signal)})}async reloadConfig(){await this.refresh({allowNetwork:this.modelNetworkEnabled})}async refresh(options={}){if(this.config=await ModelConfig.load(this.modelsPath),options.providers){for(let providerId of new Set(options.providers))this.recomposeProvider(providerId);this.updateModelSnapshot()}else this.rebuildProviders();let refreshOptions={...options,allowNetwork:options.allowNetwork??this.modelNetworkEnabled},result3=await this.models.refresh(refreshOptions)??{aborted:refreshOptions.signal?.aborted??!1,errors:new Map},errors=new Map(result3.errors);if(this.updateModelSnapshot(),options.providers)await Promise.all([...new Set(options.providers)].map(async providerId=>{try{await this.refreshProviderAvailability(providerId,operationSignal(options.signal))}catch(error2){options.signal?.aborted||errors.set(providerId,error2 instanceof Error?error2:new Error(String(error2)))}}));else try{await this.queueAvailabilityRefresh(options.signal)}catch{}return{aborted:result3.aborted||(options.signal?.aborted??!1),errors}}shouldSkipRegistrationRefresh(providerId){return this.hasFreshAvailabilitySnapshot()&&(this.nativeExtensionProviders.has(providerId)||this.extensionProviders.has(providerId))}refreshAfterRegistration(){if(!this.modelNetworkEnabled)return this.refresh({allowNetwork:!1});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),this.modelRefreshTimeoutMs);return this.refresh({allowNetwork:!0,signal:controller.signal}).finally(()=>clearTimeout(timeout))}registerNativeProvider(provider,options){if(!provider.id.trim())throw new Error("Provider id must not be empty.");let alreadyFresh=this.shouldSkipRegistrationRefresh(provider.id);this.extensionProviders.delete(provider.id),this.nativeExtensionProviders.set(provider.id,provider),this.recomposeProvider(provider.id);let composedOAuth=this.models.getProvider(provider.id)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(provider.id,composedOAuth):this.credentials.unregisterOAuthProvider(provider.id),this.updateModelSnapshot(),this.markProvisionallyConfigured(provider.id,configuredRequestAuthStatus(this.config.getProvider(provider.id),void 0),provider.auth.oauth&&!provider.auth.apiKey?"oauth":"api_key"),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}markProvisionallyConfigured(providerId,configuredStatus,type2){if(!this.snapshot.storedProviders.has(providerId)&&!configuredStatus?.configured)return;let configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId),auth=new Map(this.snapshot.auth);auth.get(providerId)||auth.set(providerId,{type:type2,source:"configured provider"}),this.snapshot={...this.snapshot,auth,configuredProviders,available:this.snapshot.all.filter(model=>configuredProviders.has(model.provider))}}registerProvider(providerId,config,options){validateExtensionProvider(providerId,this.builtins.get(providerId),this.config.getProvider(providerId),config);let alreadyFresh=this.shouldSkipRegistrationRefresh(providerId);this.nativeExtensionProviders.delete(providerId);let effective={...this.extensionProviders.get(providerId)};for(let[key,value2]of Object.entries(config))value2!==void 0&&(effective[key]=value2);this.extensionProviders.set(providerId,effective),this.recomposeProvider(providerId);let composedOAuth=this.models.getProvider(providerId)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(providerId,composedOAuth):this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.markProvisionallyConfigured(providerId,configuredRequestAuthStatus(this.config.getProvider(providerId),effective),effective.oauth&&!effective.apiKey?"oauth":"api_key"),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}unregisterProvider(providerId){this.extensionProviders.delete(providerId),this.nativeExtensionProviders.delete(providerId),this.recomposeProvider(providerId),this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}registerVirtualModel(definition){let{provider:providerId,id}=definition;if(!providerId.trim()||!id.trim())throw new Error("Virtual model provider and id must not be empty.");let existing=this.models.getModel(providerId,id);if(existing&&!isVirtualModel(existing))throw new Error(`Virtual model ${providerId}/${id} conflicts with a physical model.`);let models=this.virtualModels.get(providerId)??new Map;if(models.set(id,{model:createVirtualModel(definition),route:request2=>definition.route(request2)}),this.virtualModels.set(providerId,models),!this.recomposeProvider(providerId)&&!this.snapshot.configuredProviders.has(providerId)){let auth=new Map(this.snapshot.auth).set(providerId,{type:"api_key",source:"virtual"}),configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId);this.snapshot={...this.snapshot,auth,configuredProviders}}this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}unregisterVirtualModel(providerId,id){let models=this.virtualModels.get(providerId);models?.delete(id)&&(models.size===0&&this.virtualModels.delete(providerId),this.recomposeProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1}))}async resolveModel(model,messages,options){let name=`Virtual model ${model.provider}/${model.id}`,virtual=this.virtualModels.get(model.provider)?.get(model.id);if(!virtual)throw new Error(`${name} is not registered.`);let{failed,...request2}=options,latest=findLatestResponse(messages),previousModel=latest&&this.getPhysicalModel(latest.provider,latest.model),failedModel=failed&&this.getPhysicalModel(failed.provider,failed.model),route=await virtual.route({...request2,model,previous:previousModel&&{model:previousModel,thinkingLevel:latest?.thinkingLevel},failed:failedModel&&failed&&{model:failedModel,thinkingLevel:failed.thinkingLevel,message:failed},messages}),target=this.getPhysicalModel(route.model.provider,route.model.id),routed=`${name} routed to ${route.model.provider}/${route.model.id}`;if(!target)throw new Error(`${routed}, which is not a physical model.`);if(!this.hasConfiguredAuth(target.provider))throw new Error(`${routed}, which has no credentials.`);return{model:target,thinkingLevel:clampThinkingLevel(target,route.thinkingLevel),state:route.state}}getPhysicalModel(providerId,modelId){let model=this.models.getModel(providerId,modelId);return model&&!isVirtualModel(model)?model:void 0}};var ModelRegistry=class _ModelRegistry{constructor(runtime,authStorage=AuthStorage.inMemory()){this.runtime=runtime,this.authStorage=authStorage}static create(authStorage,modelsJsonPath=join9(getAgentDir(),"models.json")){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:modelsJsonPath}),authStorage)}static inMemory(authStorage){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:null}),authStorage)}get modelRuntime(){return this.runtime}refresh(options){return this.runtime.refresh(options)}getError(){return this.runtime.getError()}getAll(){return[...this.runtime.getModels()]}getAvailable(){return this.runtime.hasAvailabilitySnapshot()?[...this.runtime.getAvailableSnapshot()]:(this.retryBusyCredentialRead(),this.runtime.getProviders().flatMap(provider=>{if(!this.authStorage.hasAuth(provider.id)&&!this.runtime.getProviderAuthStatus(provider.id).configured)return[];let models=this.runtime.getModels(provider.id);return[...provider.filterModels?.(models,this.authStorage.get(provider.id))??models]}))}find(provider,modelId){return this.runtime.getModel(provider,modelId)}findOfType(type2,provider,modelId){return this.runtime.getModelOfType(type2,provider,modelId)}hasConfiguredAuth(model){return this.retryBusyCredentialRead(),this.authStorage.hasAuth(model.provider)||this.runtime.getProviderAuthStatus(model.provider).configured}retryBusyCredentialRead(){this.authStorage.isCredentialStoreBusy()&&this.authStorage.reload()}getUpstreamModelId(model){return this.runtime.getCompatibilityRequestConfig(model).upstreamModelId}getServiceTier(model){return this.runtime.getCompatibilityRequestConfig(model).serviceTier}async getApiKeyAndHeaders(model){try{let resolution=await this.runtime.getAuth(model),compatibility=this.runtime.getCompatibilityRequestConfig(model);return resolution?{ok:!0,apiKey:resolution.auth.apiKey,headers:resolution.auth.headers,extraBody:compatibility.extraBody,baseUrl:resolution.auth.baseUrl,upstreamModelId:compatibility.upstreamModelId,serviceTier:compatibility.serviceTier,env:resolution.env,...resolution.ambient?{ambient:!0}:{}}:compatibility.authHeader?{ok:!1,error:`No API key found for "${model.provider}"`}:{ok:!0,headers:await this.runtime.getCompatibilityRequestHeaders(model),extraBody:compatibility.extraBody}}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0,message=cause instanceof Error?cause.message:error2 instanceof Error?error2.message:String(error2);return{ok:!1,error:message==="authHeader requires a resolved API key"?`No API key found for "${model.provider}"`:message}}}getProviderAuthStatus(provider){return this.runtime.getProviderAuthStatus(provider)}getProvider(provider){return this.runtime.getProvider(provider)}stream(model,context,options){return this.runtime.stream(model,context,options)}streamSimple(model,context,options){return this.runtime.streamSimple(model,context,options)}complete(model,context,options){return this.runtime.complete(model,context,options)}getModelsOfType(type2,provider){return this.runtime.getModelsOfType(type2,provider)}getAvailableOfType(type2,provider,options){return this.runtime.getAvailableOfType(type2,provider,options)}getModelOfType(type2,provider,modelId){return this.runtime.getModelOfType(type2,provider,modelId)}classify(model,context,options){return this.runtime.classify(model,context,options)}getProviderDisplayName(provider){return this.runtime.getProvider(provider)?.name??BUILT_IN_PROVIDER_DISPLAY_NAMES[provider]??provider}getProviderAuth(provider){return this.runtime.getAuth(provider)}async getApiKeyForProvider(provider){try{return(await this.runtime.getAuth(provider))?.auth.apiKey}catch{return}}isUsingOAuth(model){return this.authStorage.get(model.provider)?.type==="oauth"||this.runtime.isUsingOAuth(model.provider)}isFallbackEligible(model){return this.runtime.isFallbackEligible(model.provider)}registerProvider(providerOrName,config){if(typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");this.runtime.registerProvider(providerOrName,config);return}this.runtime.registerNativeProvider(providerOrName)}unregisterProvider(providerName){this.runtime.unregisterProvider(providerName)}registerVirtualModel(definition){this.runtime.registerVirtualModel(definition)}unregisterVirtualModel(providerName,id){this.runtime.unregisterVirtualModel(providerName,id)}getRegisteredProviderConfig(providerName){return this.runtime.getRegisteredProviderConfig(providerName)}getRegisteredNativeProvider(providerName){return this.runtime.getRegisteredNativeProvider(providerName)}getRegisteredProviderIds(){return this.runtime.getRegisteredProviderIds()}};function isAmbientOnlyProvider(source2,providerId){return source2.getProviderAuthStatus?.(providerId).ambient===!0}function createAmbientProviderCheck(source2){let cache=new Map;return providerId=>{let ambient=cache.get(providerId);return ambient===void 0&&(ambient=isAmbientOnlyProvider(source2,providerId),cache.set(providerId,ambient)),ambient}}function selectProviderDefault(availableModels2,providerDefaults,source2){let isAmbient=createAmbientProviderCheck(source2),configured=availableModels2.filter(model=>!isAmbient(model.provider)),group=configured.length>0?configured:availableModels2;for(let[provider,modelId]of Object.entries(providerDefaults)){let match=group.find(model=>model.provider===provider&&model.id===modelId);if(match)return{model:match,provenance:"provider-default"}}let first=group[0];return first?{model:first,provenance:"first-available"}:void 0}var defaultModelPerProvider={"alibaba-token-plan":"qwen3.7-max","amazon-bedrock":"us.anthropic.claude-opus-4-6-v1","ant-ling":"Ring-2.6-1T","anthropic-subscription":"claude-opus-4-8",anthropic:"claude-opus-4-8",bai:"gpt-5.6-sol",openai:"gpt-6.1-sol","azure-openai-responses":"gpt-5.4","chatgpt-subscription":"gpt-6.1-sol",ollama:"qwen3.5:397b",cursor:"auto",radius:"balanced",nvidia:"nvidia/nemotron-3-ultra-550b-a55b",deepseek:"deepseek-v4-pro",google:"gemini-3.1-pro-preview","google-vertex":"gemini-3.1-pro-preview","github-copilot":"gpt-5.4",openrouter:"moonshotai/kimi-k2.6","vercel-ai-gateway":"zai/glm-5.1",opengateway:"moonshotai/kimi-k3",xai:"grok-4.7",groq:"openai/gpt-oss-120b",cerebras:"gpt-oss-120b",zai:"glm-5.3","zai-coding-cn":"glm-5.3",mistral:"devstral-medium-latest",minimax:"MiniMax-M2.7","minimax-cn":"MiniMax-M2.7",moonshotai:"kimi-k2.6","moonshotai-cn":"kimi-k2.6",huggingface:"moonshotai/Kimi-K2.6",fireworks:"accounts/fireworks/models/kimi-k3",together:"moonshotai/Kimi-K3",venice:"z-ai-glm-5-3",baseten:"zai-org/GLM-5.2",opencode:"kimi-k2.6","opencode-go":"kimi-k3","kimi-coding":"kimi-for-coding",meta:"muse-spark-1.3","cloudflare-workers-ai":"@cf/moonshotai/kimi-k2.6","cloudflare-ai-gateway":"workers-ai/@cf/moonshotai/kimi-k2.6","qwen-token-plan":"qwen3.7-max","qwen-token-plan-cn":"qwen3.7-max","qwen-token-plan-individual":"qwen3.8-max",xiaomi:"mimo-v2.5-pro","xiaomi-token-plan-cn":"mimo-v2.5-pro","xiaomi-token-plan-ams":"mimo-v2.5-pro","xiaomi-token-plan-sgp":"mimo-v2.5-pro"};function getModelNarrowingPatterns(options){return options.cliPatterns??options.legacyEnabledPatterns??[]}function isAlias(id){return id.endsWith("-latest")?!0:!/-\d{8}$/.test(id)}function findExactModelReferenceMatch(modelReference,availableModels2){let trimmedReference=modelReference.trim();if(!trimmedReference)return;let normalizedReference=trimmedReference.toLowerCase(),canonicalMatches=availableModels2.filter(model=>`${model.provider}/${model.id}`.toLowerCase()===normalizedReference);if(canonicalMatches.length===1)return canonicalMatches[0];if(canonicalMatches.length>1)return;let slashIndex=trimmedReference.indexOf("/");if(slashIndex!==-1){let provider=trimmedReference.substring(0,slashIndex).trim(),modelId=trimmedReference.substring(slashIndex+1).trim();if(provider&&modelId){let providerMatches=availableModels2.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()&&model.id.toLowerCase()===modelId.toLowerCase());if(providerMatches.length===1)return providerMatches[0];if(providerMatches.length>1)return}}let idMatches=availableModels2.filter(model=>model.id.toLowerCase()===normalizedReference);return idMatches.length===1?idMatches[0]:void 0}var CURSOR_PROVIDER_IDS=new Set(["cursor","cursor-cli-oauth"]),CURSOR_ALIAS_LEVEL_TOKENS=["minimal","low","medium","high","extra-high","xhigh","max","none"];function legacySelection(legacyVariantId){let alias=getCursorVariantAlias(legacyVariantId);if(alias?.level)return{level:alias.level,source:"legacy-variant",legacyVariantId}}function derivedCursorVariantIds(model){if(!((model.provider!=="cursor"||model.api!=="cursor-agent")&&(model.provider!=="cursor-cli-oauth"||model.api!=="cursor-cli-oauth")))return model.compat?.cursorReasoning?.variantIds}function derivedCursorVariantMatch(model,reference){let variantIds=derivedCursorVariantIds(model);if(variantIds===void 0)return;let normalized2=reference.toLowerCase();for(let[level,id]of Object.entries(variantIds))if(id?.toLowerCase()===normalized2)return{level,variantId:id}}function derivedResolution(model,match){return{model,thinkingLevel:match.level,thinkingSelection:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}}function cursorLegacySelection(model,variantId){let alias=legacySelection(variantId);if(alias)return alias;let match=derivedCursorVariantMatch(model,variantId);return match===void 0?void 0:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}function resolveLegacyCursorReference(modelReference,availableModels2){let trimmed=modelReference.trim();if(!trimmed)return;let slashIndex=trimmed.indexOf("/"),explicitProvider=slashIndex===-1?void 0:trimmed.slice(0,slashIndex),legacyVariantId=slashIndex===-1?trimmed:trimmed.slice(slashIndex+1),alias=getCursorVariantAlias(legacyVariantId),providerMatches=model=>CURSOR_PROVIDER_IDS.has(model.provider)&&(!explicitProvider||model.provider.toLowerCase()===explicitProvider.toLowerCase());if(alias){let candidates=availableModels2.filter(model=>providerMatches(model)&&model.id===alias.targetId);if(candidates.length!==1)return;let thinkingSelection=legacySelection(legacyVariantId);return{model:candidates[0],thinkingLevel:thinkingSelection?.level,thinkingSelection}}let exactCandidates=explicitProvider?availableModels2.filter(providerMatches):availableModels2;if(findExactModelReferenceMatch(trimmed,[...exactCandidates]))return;let derivedCandidates=availableModels2.flatMap(model=>{let match=providerMatches(model)?derivedCursorVariantMatch(model,legacyVariantId):void 0;return match===void 0?[]:[{model,match}]});if(derivedCandidates.length===1)return derivedResolution(derivedCandidates[0].model,derivedCandidates[0].match)}function cursorLegacyAliasesForModel(model){if(!CURSOR_PROVIDER_IDS.has(model.provider))return[];let targetId=model.id,baseId=targetId.endsWith("-thinking")?targetId.slice(0,-9):targetId,candidates=new Set([targetId,`${baseId}-thinking`,`${baseId}-fast`]);for(let level of CURSOR_ALIAS_LEVEL_TOKENS)candidates.add(`${baseId}-${level}`),candidates.add(`${baseId}-thinking-${level}`),candidates.add(`${baseId}-${level}-thinking`),candidates.add(`${targetId}-${level}`);let aliases=[...candidates].filter(candidate=>getCursorVariantAlias(candidate)?.targetId===targetId);for(let derivedId of Object.values(derivedCursorVariantIds(model)??{}))aliases.push(derivedId);return aliases}function resolveDerivedCursorVariant(provider,modelId,modelSource){let parsed=parseCursorVariantId(modelId);if(parsed.fast||parsed.level===void 0||parsed.baseId==="")return;let targetId=parsed.thinking===!0?`${parsed.baseId}-thinking`:parsed.baseId,model=modelSource.getModel(provider,targetId),match=model===void 0?void 0:derivedCursorVariantMatch(model,modelId);if(!(model===void 0||match===void 0))return derivedResolution(model,match)}function resolveStoredModelReference(provider,modelId,modelSource){if(CURSOR_PROVIDER_IDS.has(provider)){let alias=getCursorVariantAlias(modelId);if(alias){let model=modelSource.getModel(provider,alias.targetId);if(model){let thinkingSelection=legacySelection(modelId);return{model,thinkingLevel:thinkingSelection?.level,thinkingSelection}}}else{let direct2=modelSource.getModel(provider,modelId);if(direct2)return{model:direct2};let derived=resolveDerivedCursorVariant(provider,modelId,modelSource);if(derived)return derived}}let direct=modelSource.getModel(provider,modelId);return direct?{model:direct}:void 0}function tryMatchModel(modelPattern,availableModels2){let exactMatch=findExactModelReferenceMatch(modelPattern,availableModels2);if(exactMatch)return exactMatch;let matches=availableModels2.filter(m=>m.id.toLowerCase().includes(modelPattern.toLowerCase())||m.name?.toLowerCase().includes(modelPattern.toLowerCase()));if(matches.length===0)return;let aliases=matches.filter(m=>isAlias(m.id)),datedVersions=matches.filter(m=>!isAlias(m.id));return aliases.length>0?(aliases.sort((a,b)=>b.id.localeCompare(a.id)),aliases[0]):(datedVersions.sort((a,b)=>b.id.localeCompare(a.id)),datedVersions[0])}function buildFallbackModel(provider,modelId,availableModels2){let providerModels=availableModels2.filter(m=>m.provider===provider);if(providerModels.length===0)return;let defaultId=defaultModelPerProvider[provider];return{...defaultId?providerModels.find(m=>m.id===defaultId)??providerModels[0]:providerModels[0],id:modelId,name:modelId}}var SERVICE_TIER_VALUES=["auto","flex","priority","ultrafast"];function isServiceTier(value2){return SERVICE_TIER_VALUES.includes(value2)}function dropsParsedDecorators(warning){return warning?.startsWith("Invalid thinking level")??!1}function pushUltrafastAdvisory(diagnostics,pattern,model,serviceTier){let message=ultrafastSelectionWarning(model,serviceTier);message&&diagnostics.push({type:"warning",code:"ultrafast-undocumented",message,pattern})}function parseModelPattern(pattern,availableModels2,options){let legacyMatch=resolveLegacyCursorReference(pattern,availableModels2);if(legacyMatch)return{...legacyMatch,serviceTier:void 0,warning:void 0};let fullMatch=tryMatchModel(pattern,availableModels2);if(fullMatch)return{model:fullMatch,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:void 0,warning:void 0};let lastColonIndex=pattern.lastIndexOf(":");if(lastColonIndex===-1)return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let prefix=pattern.substring(0,lastColonIndex),suffix=pattern.substring(lastColonIndex+1);if(isValidThinkingLevel(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let thinkingLevel=dropsParsedDecorators(result3.warning)?void 0:result3.thinkingLevel??suffix;return{model:result3.model,thinkingLevel,thinkingSelection:thinkingLevel?{level:thinkingLevel,source:"explicit"}:void 0,serviceTier:result3.serviceTier,warning:result3.warning}}return result3}else if(isServiceTier(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let serviceTier=dropsParsedDecorators(result3.warning)?void 0:result3.serviceTier??suffix;return{model:result3.model,thinkingLevel:result3.thinkingLevel,thinkingSelection:result3.thinkingSelection,serviceTier,warning:result3.warning??ultrafastSelectionWarning(result3.model,serviceTier)}}return result3}else{if(!(options?.allowInvalidThinkingLevelFallback??!0))return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let result3=parseModelPattern(prefix,availableModels2,options);return result3.model?{model:result3.model,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:result3.serviceTier,warning:`Invalid thinking level "${suffix}" in pattern "${pattern}". Using default instead.`}:result3}}function resolveModelScopeFromModels(patterns,models){let availableModels2=[...models],scopedModels=[],diagnostics=[],patternResolutions=[],claimedIds=new Set,canonicalId=model=>`${model.provider}/${model.id}`,addScoped=entry=>{let id=canonicalId(entry.model);if(!claimedIds.has(id))return claimedIds.add(id),scopedModels.push(entry),id};for(let pattern of patterns){if(pattern.includes("*")||pattern.includes("?")||pattern.includes("[")){let globPattern=pattern,thinkingLevel2,serviceTier2;for(;;){let colonIdx=globPattern.lastIndexOf(":");if(colonIdx===-1)break;let suffix=globPattern.substring(colonIdx+1);if(thinkingLevel2===void 0&&isValidThinkingLevel(suffix))thinkingLevel2=suffix;else if(serviceTier2===void 0&&isServiceTier(suffix))serviceTier2=suffix;else break;globPattern=globPattern.substring(0,colonIdx)}let exactMatch=findExactModelReferenceMatch(globPattern,availableModels2);if(exactMatch){let owned2=addScoped({model:exactMatch,thinkingLevel:thinkingLevel2,thinkingSelection:thinkingLevel2?{level:thinkingLevel2,source:"explicit"}:void 0,serviceTier:serviceTier2});pushUltrafastAdvisory(diagnostics,pattern,exactMatch,serviceTier2),patternResolutions.push({pattern,ownedIds:owned2?[owned2]:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let canonicalPattern=globPattern.includes("/"),matches=(provider,id)=>minimatch(`${provider}/${id}`,globPattern,{nocase:!0})||!canonicalPattern&&minimatch(id,globPattern,{nocase:!0}),projections=new Map;for(let model2 of availableModels2){let id=canonicalId(model2);matches(model2.provider,model2.id)&&projections.set(id,{model:model2,aliases:[]});for(let aliasId of cursorLegacyAliasesForModel(model2)){if(!matches(model2.provider,aliasId))continue;let projection=projections.get(id)??{model:model2,aliases:[]};projection.aliases.push({id:aliasId,selection:cursorLegacySelection(model2,aliasId)}),projections.set(id,projection)}}if(projections.size===0){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!0,isGlob:!0});continue}let ownedIds=[];for(let{model:model2,aliases}of projections.values()){let thinkingSelection2,projectedLevel=thinkingLevel2;if(thinkingLevel2!==void 0)thinkingSelection2={level:thinkingLevel2,source:"explicit"};else{let selections=aliases.flatMap(alias=>alias.selection?[alias.selection]:[]);new Set(selections.map(selection=>selection.level)).size===1&&selections.length>0&&(thinkingSelection2=[...selections].sort((a,b)=>(a.legacyVariantId??"").localeCompare(b.legacyVariantId??""))[0],projectedLevel=thinkingSelection2.level)}let owned2=addScoped({model:model2,thinkingLevel:projectedLevel,thinkingSelection:thinkingSelection2,serviceTier:serviceTier2});pushUltrafastAdvisory(diagnostics,pattern,model2,serviceTier2),owned2&&ownedIds.push(owned2)}patternResolutions.push({pattern,ownedIds,thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,availableModels2);if(warning&&diagnostics.push({type:"warning",code:model&&warning===ultrafastSelectionWarning(model,serviceTier)?"ultrafast-undocumented":"invalid-thinking-level",message:warning,pattern}),!model){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel,serviceTier,unresolved:!0,isGlob:!1});continue}let owned=addScoped({model,thinkingLevel,thinkingSelection,serviceTier});patternResolutions.push({pattern,ownedIds:owned?[owned]:[],thinkingLevel,serviceTier,unresolved:!1,isGlob:!1})}return{scopedModels,diagnostics,patternResolutions}}async function resolveModelScopeWithDiagnostics(patterns,modelRuntime,options){return resolveModelScopeFromModels(patterns,await modelRuntime.getAvailable(void 0,options))}async function resolveModelScope(patterns,modelRuntime,options){let{scopedModels,diagnostics}=await resolveModelScopeWithDiagnostics(patterns,modelRuntime,options);for(let diagnostic2 of diagnostics){if(options?.onWarning){options.onWarning(diagnostic2.message);continue}console.warn(source_default.yellow(`Warning: ${diagnostic2.message}`))}return scopedModels}function resolveCliModel(options){let{cliProvider,cliModel,cliThinking,modelRuntime}=options;if(!cliModel)return{model:void 0,warning:void 0,error:void 0};let availableModels2=[...modelRuntime.getModels()];if(availableModels2.length===0)return{model:void 0,warning:void 0,error:"No models available. Check your installation or add models to models.json."};let providerMap=new Map;for(let m of availableModels2)providerMap.set(m.provider.toLowerCase(),m.provider);let provider=cliProvider?providerMap.get(cliProvider.toLowerCase()):void 0;if(cliProvider&&!provider)return{model:void 0,warning:void 0,error:`Unknown provider "${cliProvider}". Use --list-models to see available providers/models.`};let pattern=cliModel,inferredProvider=!1;if(!provider){let slashIndex=cliModel.indexOf("/");if(slashIndex!==-1){let maybeProvider=cliModel.substring(0,slashIndex),canonical=providerMap.get(maybeProvider.toLowerCase());canonical&&(provider=canonical,pattern=cliModel.substring(slashIndex+1),inferredProvider=!0)}}if(!provider){let lower=cliModel.toLowerCase(),exactMatches=availableModels2.filter(m=>m.id.toLowerCase()===lower||`${m.provider}/${m.id}`.toLowerCase()===lower);if(exactMatches.length===1)return{model:exactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};if(exactMatches.length>1){let authenticatedExactMatches=exactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedExactMatches.length===1)return{model:authenticatedExactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};let matches=exactMatches.map(m=>`${m.provider}/${m.id}`).sort((a,b)=>a.localeCompare(b)).join(", "),authHint=authenticatedExactMatches.length===0?"No matching provider is authenticated.":"More than one matching provider is authenticated.";return{model:void 0,warning:void 0,thinkingLevel:void 0,error:`Model "${cliModel}" is ambiguous across providers: ${matches}. ${authHint} Use --provider or provider/model.`}}}if(cliProvider&&provider){let prefix=`${provider}/`;cliModel.toLowerCase().startsWith(prefix.toLowerCase())&&(pattern=cliModel.substring(prefix.length))}let candidates=provider?availableModels2.filter(m=>m.provider===provider):availableModels2,{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,candidates,{allowInvalidThinkingLevelFallback:!1});if(model){if(inferredProvider){let rawExactMatches=availableModels2.filter(m=>m.id.toLowerCase()===cliModel.toLowerCase()&&!modelsAreEqual(m,model));if(rawExactMatches.length>0&&!modelRuntime.hasConfiguredAuth(model.provider)){let authenticatedRawMatches=rawExactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedRawMatches.length===1)return{model:authenticatedRawMatches[0],thinkingLevel:void 0,serviceTier,warning:void 0,error:void 0}}}return{model,thinkingLevel,thinkingSelection,serviceTier,warning,error:void 0}}if(inferredProvider){let lower=cliModel.toLowerCase(),exact=availableModels2.find(m=>m.id.toLowerCase()===lower||`${m.provider}/${m.id}`.toLowerCase()===lower);if(exact)return{model:exact,warning:void 0,thinkingLevel:void 0,serviceTier,error:void 0};let fallback=parseModelPattern(cliModel,availableModels2,{allowInvalidThinkingLevelFallback:!1});if(fallback.model)return{model:fallback.model,thinkingLevel:fallback.thinkingLevel,serviceTier:fallback.serviceTier,warning:fallback.warning,error:void 0}}if(provider){let fallbackPattern=pattern,fallbackThinking;if(!cliThinking){let lastColon=pattern.lastIndexOf(":");if(lastColon!==-1){let suffix=pattern.substring(lastColon+1);isValidThinkingLevel(suffix)&&(fallbackPattern=pattern.substring(0,lastColon),fallbackThinking=suffix)}}let fallbackModel=buildFallbackModel(provider,fallbackPattern,availableModels2);if(fallbackModel){let requestedThinking=cliThinking??fallbackThinking,model2=requestedThinking&&requestedThinking!=="off"?{...fallbackModel,reasoning:!0}:fallbackModel,fallbackWarning=warning?`${warning} Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`:`Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`;return{model:model2,thinkingLevel:fallbackThinking,serviceTier,warning:fallbackWarning,error:void 0}}}let display=provider?`${provider}/${pattern}`:cliModel;return{model:void 0,thinkingLevel:void 0,serviceTier,warning,error:`Model "${display}" not found. Use --list-models to see available models.`}}async function findInitialModel(options){let{cliProvider,cliModel,scopedModels,isContinuing,defaultProvider,defaultModelId,modelRuntime}=options,model;if(cliProvider&&cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error&&(console.error(source_default.red(resolved.error)),process.exit(1)),resolved.model)return{model:resolved.model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"cli"}}if(scopedModels.length>0&&!isContinuing){let scopedModel=scopedModels[0],perModel=options.modelThinkingLevels?.[`${scopedModel.model.provider}/${scopedModel.model.id}`];return{model:scopedModels[0].model,thinkingLevel:perModel??scopedModels[0].thinkingLevel,thinkingSelection:scopedModels[0].thinkingSelection,fallbackMessage:void 0,provenance:"scoped"}}if(defaultProvider&&defaultModelId){let resolved=resolveStoredModelReference(defaultProvider,defaultModelId,modelRuntime);if(resolved&&modelRuntime.hasConfiguredAuth(resolved.model.provider))return model=resolved.model,{model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"settings"}}let availableModels2=[...typeof modelRuntime.getAvailableSnapshot=="function"?modelRuntime.getAvailableSnapshot():await modelRuntime.getAvailable()],selected=selectProviderDefault(availableModels2,defaultModelPerProvider,modelRuntime);return selected?{model:selected.model,thinkingLevel:void 0,fallbackMessage:void 0,provenance:selected.provenance}:{model:void 0,thinkingLevel:void 0,fallbackMessage:void 0,provenance:"first-available"}}import{existsSync as existsSync31,mkdirSync as mkdirSync15,readdirSync as readdirSync8,readFileSync as readFileSync37,realpathSync as realpathSync8,statSync as statSync19,writeFileSync as writeFileSync17}from"node:fs";import{basename as basename19,dirname as dirname37,join as join63,resolve as resolve35,sep as sep13}from"node:path";import{fileURLToPath as fileURLToPath4,pathToFileURL}from"node:url";var GENERATED_SHIM_BANNER=`// Generated by ${APP_NAME}. Delete this file to stop loading the default global extension.
|
|
727
|
+
`):void 0}getRegisteredProviderConfig(providerId){return this.extensionProviders.get(providerId)}getRegisteredProviderIds(){return[...new Set([...this.extensionProviders.keys(),...this.nativeExtensionProviders.keys()])]}getRegisteredNativeProvider(providerId){return this.nativeExtensionProviders.get(providerId)}getCompatibilityRequestConfig(model){return resolveCompatibilityRequestConfig(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider))}getCompatibilityRequestHeaders(model,env){return resolveCompatibilityRequestHeaders(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider),env)}isUsingOAuth(providerId){return this.snapshot.auth.get(providerId)?.type==="oauth"}isUsingSubscription(providerId){return this.isUsingOAuth(providerId)&&this.models.getProvider(providerId)?.auth.oauth?.isSubscription===!0}hasConfiguredAuth(providerId){return this.snapshot.configuredProviders.has(providerId)}isFallbackEligible(providerId){let hook=this.extensionProviders.get(providerId)?.fallbackEligible;if(typeof hook!="function")return!0;try{return hook()!==!1}catch{return!0}}async getAuth(providerOrModel,overrides={}){if(typeof providerOrModel=="string")return this.models.getAuth(providerOrModel,overrides);let resolution=await this.models.getAuth(providerOrModel,overrides);if(!resolution)return;let configuredHeaders2=await resolveConfiguredModelHeaders(providerOrModel,this.config.getProvider(providerOrModel.provider),this.extensionProviders.get(providerOrModel.provider),{...resolution.env??{},...overrides.env??{}});return{...resolution,auth:{...resolution.auth,headers:mergeHeaders(resolution.auth.headers,configuredHeaders2)}}}enqueueCredentialOperation(providerId,signal,task){let previous=this.credentialOperations.get(providerId)??Promise.resolve(),markStarted,started=new Promise(resolve45=>{markStarted=resolve45}),operation=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),markStarted?.(),task()))(),tail=operation.catch(()=>{});return this.credentialOperations.set(providerId,tail),tail.then(()=>{this.credentialOperations.get(providerId)===tail&&this.credentialOperations.delete(providerId)}),raceWithAbortSignal(started,signal).then(()=>operation)}async synchronizeCredentialState(providerId,operation,credential,signal){try{signal.throwIfAborted(),this.recomposeProvider(providerId);let compositionError=this.compositionErrors.get(providerId);if(compositionError)throw new Error(compositionError);let result3=await this.models.refresh({allowNetwork:!1,providers:[providerId],signal});result3.aborted&&signal.throwIfAborted();let refreshError=result3.errors.get(providerId);if(refreshError)throw refreshError;this.updateModelSnapshot(),await this.refreshProviderAvailability(providerId,signal)}catch(cause){throw new CredentialSynchronizationError(providerId,operation,credential,{cause})}}setRuntimeApiKey(providerId,apiKey,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.setRuntimeApiKey(providerId,apiKey),await this.synchronizeCredentialState(providerId,"setRuntimeApiKey",{type:"api_key",key:apiKey},signal)})}removeRuntimeApiKey(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.removeRuntimeApiKey(providerId),await this.synchronizeCredentialState(providerId,"removeRuntimeApiKey",void 0,signal)})}listCredentials(options){return this.credentials.list(options)}getProviderAuthStatus(providerId){if(this.credentials.hasRuntimeApiKey(providerId))return{configured:!0,source:"runtime"};if(this.snapshot.storedProviders.has(providerId))return{configured:!0,source:"stored"};let configured=configuredRequestAuthStatus(this.config.getProvider(providerId),this.extensionProviders.get(providerId));if(configured)return configured;let check=this.snapshot.auth.get(providerId);return check?{configured:!0,source:"environment",label:check.source,...check.ambient?{ambient:!0}:{}}:{configured:!1}}async prepareRequest(model,options,slotAuth){let provider=this.models.getProvider(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);let resolution=await this.getAuth(model,{apiKey:slotAuth?.apiKey??options?.apiKey,env:options?.env,signal:options?.signal,...slotAuth?.slotName===void 0?{}:{slotName:slotAuth.slotName},...slotAuth?.rejectedAccess===void 0?{}:{rejectedAccess:slotAuth.rejectedAccess}});if(!resolution)throw new ModelsError("auth",providerNotConfiguredMessage(model.provider));let{transformHeaders,...rawProviderOptions}=options??{},providerOptions=rawProviderOptions,headers=mergeHeaders(resolution.auth.headers,providerOptions.headers);transformHeaders&&(headers=await transformHeaders(headers??{}));let compatibility=isModelType(model,"chat")?this.getCompatibilityRequestConfig(model):{},extraBody=compatibility.extraBody||providerOptions.extraBody?{...compatibility.extraBody,...providerOptions.extraBody}:void 0,env=resolution.env||providerOptions.env?{...resolution.env??{},...providerOptions.env??{}}:void 0,upstreamModelId=compatibility.upstreamModelId,requestModel=resolution.auth.baseUrl||upstreamModelId?{...model,...upstreamModelId?{id:upstreamModelId}:{},...resolution.auth.baseUrl?{baseUrl:resolution.auth.baseUrl}:{}}:model,rejectedTokenStatuses=provider.auth.oauth?.rejectedTokenStatuses,storedOAuthAccess=resolution.source==="OAuth"&&(slotAuth?.apiKey??providerOptions.apiKey)===void 0?resolution.auth.apiKey:void 0;return{...rejectedTokenStatuses!==void 0&&storedOAuthAccess!==void 0?{rejectableAccess:storedOAuthAccess,rejectedTokenStatuses}:{},provider,model:requestModel,options:{...providerOptions,apiKey:slotAuth?.apiKey??providerOptions.apiKey??resolution.auth.apiKey,headers,extraBody,env}}}loadCredentialPool(){return this.credentialPoolModules??=(async()=>{let[rotation,stateStore]=await Promise.all([import("./rotation-stream-C5BM7TMM.js"),import("./state-store-SCMTDYE2.js")]);return{rotation,repository:new stateStore.CredentialSlotRepository(this.poolStatePath)}})(),this.credentialPoolModules}couldRotateCredentials(model,options){if(options?.apiKey!==void 0||this.credentials.hasRuntimeApiKey(model.provider)||this.config.getProvider(model.provider)?.credentials?.rotation===!1)return!1;let env=name=>options?.env?.[name]??process.env[name];if(this.snapshot.storedProviders.has(model.provider))return!0;let policySlots=this.config.getProvider(model.provider)?.credentials?.slots;return discoverEnvSlots(model.provider,env).length+Object.keys(policySlots??{}).length>1}async credentialRotationSources(model,options){let env=name=>options?.env?.[name]??process.env[name],credential=await this.credentials.read(model.provider,{signal:options?.signal}),policy=this.config.getProvider(model.provider)?.credentials;if(!mightHoldCredentialPool(model.provider,credential,env,policy?.slots))return;let pool=await this.loadCredentialPool(),sources={providerId:model.provider,credential,env,repository:pool.repository,policy};return(await pool.rotation.listRotationSlots(sources,{acquireLeases:!1})).length>1?sources:void 0}stream(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{assertChatModel(model);let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,modelId:this.getCompatibilityRequestConfig(model).upstreamModelId??model.id,...streamOptions?.affinityKey!==void 0?{affinityKey:streamOptions.affinityKey}:streamOptions?.sessionId!==void 0?{affinityKey:streamOptions.sessionId}:{},runAttempt:slot=>this.attemptWithTokenRecovery(model,streamOptions,slot.lane==="env"?{...slot.envKey===void 0?{}:{apiKey:slot.envKey}}:{slotName:slot.name},prepared=>prepared.provider.stream(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}return this.attemptWithTokenRecovery(model,streamOptions,void 0,prepared=>prepared.provider.stream(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}attemptWithTokenRecovery(model,options,slotAuth,send,transcript){return retryOnceOnRejectedToken(async rejectedAccess=>{let prepared=await this.prepareRequest(model,options,rejectedAccess===void 0?slotAuth:{...slotAuth,rejectedAccess}),inner=await this.providerSemaphores.bracket(prepared.model.provider,prepared.options.signal,()=>send(prepared));return{stream:wrapStreamWithModelRecovery(inner,model,getCurrentTools(transcript.messages)),...prepared.rejectableAccess===void 0?{}:{rejectableAccess:prepared.rejectableAccess},...prepared.rejectedTokenStatuses===void 0?{}:{rejectedTokenStatuses:prepared.rejectedTokenStatuses}}})}complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){let transcript=normalizeContext(context);return isVirtualModel(model)?lazyStream(model,async()=>{let route=await this.resolveModel(model,transcript.messages,{reason:"direct",thinkingLevel:options?.reasoning??"off",signal:options?.signal}),{maxTokens:limit}=route.model,maxTokens=options?.maxTokens&&limit>0?Math.min(options.maxTokens,limit):options?.maxTokens,reasoning=route.thinkingLevel==="off"?void 0:route.thinkingLevel,{apiKey,headers,env,...rest}=options??{},auth=route.model.provider===model.provider?{apiKey,headers,env}:{};return this.streamSimple(route.model,context,{...rest,...auth,maxTokens,reasoning})}):lazyStream(model,async()=>{assertChatModel(model);let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,modelId:this.getCompatibilityRequestConfig(model).upstreamModelId??model.id,...streamOptions?.sessionId===void 0?{}:{affinityKey:streamOptions.sessionId},runAttempt:slot=>this.attemptWithTokenRecovery(model,streamOptions,slot.lane==="env"?{apiKey:slot.envKey}:{slotName:slot.name},prepared=>prepared.provider.streamSimple(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}return this.attemptWithTokenRecovery(model,options,void 0,prepared=>prepared.provider.streamSimple(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}async prepareSimpleRequest(model,options){let prepared=await this.prepareRequest(model,options);return{model:prepared.model,options:withPayloadRequestMetadata(prepared.options,prepared.model)}}completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{assertChatModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);return prepared.provider.fetchDeferred(prepared.model,handle,prepared.options)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){assertChatModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);await prepared.provider.cancelDeferred(prepared.model,handle,prepared.options)}async generateImages(model,context,options){try{assertImageModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.generateImages)throw new ModelsError("provider",`Provider ${model.provider} does not support image generation`);return await prepared.provider.generateImages(prepared.model,context,prepared.options)}catch(error2){return imageErrorResult(model,error2,options?.signal?.aborted)}}async classify(model,context,options){try{assertClassifierModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.classify)throw new ModelsError("provider",`Provider ${model.provider} does not support classification`);return await prepared.provider.classify(prepared.model,context,prepared.options)}catch(error2){return classifierErrorResult(model,error2,options?.signal?.aborted)}}login(providerId,type2,interaction,options){let signal=operationSignal(interaction.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{let credential=await this.models.login(providerId,type2,{...interaction,signal},options);return await this.synchronizeCredentialState(providerId,"login",credential,signal),credential})}logout(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{await this.models.logout(providerId,{signal}),await this.synchronizeCredentialState(providerId,"logout",void 0,signal)})}async reloadConfig(){await this.refresh({allowNetwork:this.modelNetworkEnabled})}async refresh(options={}){if(this.config=await ModelConfig.load(this.modelsPath),options.providers){for(let providerId of new Set(options.providers))this.recomposeProvider(providerId);this.updateModelSnapshot()}else this.rebuildProviders();let refreshOptions={...options,allowNetwork:options.allowNetwork??this.modelNetworkEnabled},result3=await this.models.refresh(refreshOptions)??{aborted:refreshOptions.signal?.aborted??!1,errors:new Map},errors=new Map(result3.errors);if(this.updateModelSnapshot(),options.providers)await Promise.all([...new Set(options.providers)].map(async providerId=>{try{await this.refreshProviderAvailability(providerId,operationSignal(options.signal))}catch(error2){options.signal?.aborted||errors.set(providerId,error2 instanceof Error?error2:new Error(String(error2)))}}));else try{await this.queueAvailabilityRefresh(options.signal)}catch{}return{aborted:result3.aborted||(options.signal?.aborted??!1),errors}}shouldSkipRegistrationRefresh(providerId){return this.hasFreshAvailabilitySnapshot()&&(this.nativeExtensionProviders.has(providerId)||this.extensionProviders.has(providerId))}refreshAfterRegistration(){if(!this.modelNetworkEnabled)return this.refresh({allowNetwork:!1});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),this.modelRefreshTimeoutMs);return this.refresh({allowNetwork:!0,signal:controller.signal}).finally(()=>clearTimeout(timeout))}registerNativeProvider(provider,options){if(!provider.id.trim())throw new Error("Provider id must not be empty.");let alreadyFresh=this.shouldSkipRegistrationRefresh(provider.id);this.extensionProviders.delete(provider.id),this.nativeExtensionProviders.set(provider.id,provider),this.recomposeProvider(provider.id);let composedOAuth=this.models.getProvider(provider.id)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(provider.id,composedOAuth):this.credentials.unregisterOAuthProvider(provider.id),this.updateModelSnapshot(),this.markProvisionallyConfigured(provider.id,configuredRequestAuthStatus(this.config.getProvider(provider.id),void 0),provider.auth.oauth&&!provider.auth.apiKey?"oauth":"api_key"),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}markProvisionallyConfigured(providerId,configuredStatus,type2){if(!this.snapshot.storedProviders.has(providerId)&&!configuredStatus?.configured)return;let configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId),auth=new Map(this.snapshot.auth);auth.get(providerId)||auth.set(providerId,{type:type2,source:"configured provider"}),this.snapshot={...this.snapshot,auth,configuredProviders,available:this.snapshot.all.filter(model=>configuredProviders.has(model.provider))}}registerProvider(providerId,config,options){validateExtensionProvider(providerId,this.builtins.get(providerId),this.config.getProvider(providerId),config);let alreadyFresh=this.shouldSkipRegistrationRefresh(providerId);this.nativeExtensionProviders.delete(providerId);let effective={...this.extensionProviders.get(providerId)};for(let[key,value2]of Object.entries(config))value2!==void 0&&(effective[key]=value2);this.extensionProviders.set(providerId,effective),this.recomposeProvider(providerId);let composedOAuth=this.models.getProvider(providerId)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(providerId,composedOAuth):this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.markProvisionallyConfigured(providerId,configuredRequestAuthStatus(this.config.getProvider(providerId),effective),effective.oauth&&!effective.apiKey?"oauth":"api_key"),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}unregisterProvider(providerId){this.extensionProviders.delete(providerId),this.nativeExtensionProviders.delete(providerId),this.recomposeProvider(providerId),this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}registerVirtualModel(definition){let{provider:providerId,id}=definition;if(!providerId.trim()||!id.trim())throw new Error("Virtual model provider and id must not be empty.");let existing=this.models.getModel(providerId,id);if(existing&&!isVirtualModel(existing))throw new Error(`Virtual model ${providerId}/${id} conflicts with a physical model.`);let models=this.virtualModels.get(providerId)??new Map;if(models.set(id,{model:createVirtualModel(definition),route:request2=>definition.route(request2)}),this.virtualModels.set(providerId,models),!this.recomposeProvider(providerId)&&!this.snapshot.configuredProviders.has(providerId)){let auth=new Map(this.snapshot.auth).set(providerId,{type:"api_key",source:"virtual"}),configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId);this.snapshot={...this.snapshot,auth,configuredProviders}}this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}unregisterVirtualModel(providerId,id){let models=this.virtualModels.get(providerId);models?.delete(id)&&(models.size===0&&this.virtualModels.delete(providerId),this.recomposeProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1}))}async resolveModel(model,messages,options){let name=`Virtual model ${model.provider}/${model.id}`,virtual=this.virtualModels.get(model.provider)?.get(model.id);if(!virtual)throw new Error(`${name} is not registered.`);let{failed,...request2}=options,latest=findLatestResponse(messages),previousModel=latest&&this.getPhysicalModel(latest.provider,latest.model),failedModel=failed&&this.getPhysicalModel(failed.provider,failed.model),route=await virtual.route({...request2,model,previous:previousModel&&{model:previousModel,thinkingLevel:latest?.thinkingLevel},failed:failedModel&&failed&&{model:failedModel,thinkingLevel:failed.thinkingLevel,message:failed},messages}),target=this.getPhysicalModel(route.model.provider,route.model.id),routed=`${name} routed to ${route.model.provider}/${route.model.id}`;if(!target)throw new Error(`${routed}, which is not a physical model.`);if(!this.hasConfiguredAuth(target.provider))throw new Error(`${routed}, which has no credentials.`);return{model:target,thinkingLevel:clampThinkingLevel(target,route.thinkingLevel),state:route.state}}getPhysicalModel(providerId,modelId){let model=this.models.getModel(providerId,modelId);return model&&!isVirtualModel(model)?model:void 0}};var ModelRegistry=class _ModelRegistry{constructor(runtime,authStorage=AuthStorage.inMemory()){this.runtime=runtime,this.authStorage=authStorage}static create(authStorage,modelsJsonPath=join9(getAgentDir(),"models.json")){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:modelsJsonPath}),authStorage)}static inMemory(authStorage){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:null}),authStorage)}get modelRuntime(){return this.runtime}refresh(options){return this.runtime.refresh(options)}getError(){return this.runtime.getError()}getAll(){return[...this.runtime.getModels()]}getAvailable(){return this.runtime.hasAvailabilitySnapshot()?[...this.runtime.getAvailableSnapshot()]:(this.retryBusyCredentialRead(),this.runtime.getProviders().flatMap(provider=>{if(!this.authStorage.hasAuth(provider.id)&&!this.runtime.getProviderAuthStatus(provider.id).configured)return[];let models=this.runtime.getModels(provider.id);return[...provider.filterModels?.(models,this.authStorage.get(provider.id))??models]}))}find(provider,modelId){return this.runtime.getModel(provider,modelId)}findOfType(type2,provider,modelId){return this.runtime.getModelOfType(type2,provider,modelId)}hasConfiguredAuth(model){return this.retryBusyCredentialRead(),this.authStorage.hasAuth(model.provider)||this.runtime.getProviderAuthStatus(model.provider).configured}retryBusyCredentialRead(){this.authStorage.isCredentialStoreBusy()&&this.authStorage.reload()}getUpstreamModelId(model){return this.runtime.getCompatibilityRequestConfig(model).upstreamModelId}getServiceTier(model){return this.runtime.getCompatibilityRequestConfig(model).serviceTier}async getApiKeyAndHeaders(model){try{let resolution=await this.runtime.getAuth(model),compatibility=this.runtime.getCompatibilityRequestConfig(model);return resolution?{ok:!0,apiKey:resolution.auth.apiKey,headers:resolution.auth.headers,extraBody:compatibility.extraBody,baseUrl:resolution.auth.baseUrl,upstreamModelId:compatibility.upstreamModelId,serviceTier:compatibility.serviceTier,env:resolution.env,...resolution.ambient?{ambient:!0}:{}}:compatibility.authHeader?{ok:!1,error:`No API key found for "${model.provider}"`}:{ok:!0,headers:await this.runtime.getCompatibilityRequestHeaders(model),extraBody:compatibility.extraBody}}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0,message=cause instanceof Error?cause.message:error2 instanceof Error?error2.message:String(error2);return{ok:!1,error:message==="authHeader requires a resolved API key"?`No API key found for "${model.provider}"`:message}}}getProviderAuthStatus(provider){return this.runtime.getProviderAuthStatus(provider)}getProvider(provider){return this.runtime.getProvider(provider)}stream(model,context,options){return this.runtime.stream(model,context,options)}streamSimple(model,context,options){return this.runtime.streamSimple(model,context,options)}complete(model,context,options){return this.runtime.complete(model,context,options)}getModelsOfType(type2,provider){return this.runtime.getModelsOfType(type2,provider)}getAvailableOfType(type2,provider,options){return this.runtime.getAvailableOfType(type2,provider,options)}getModelOfType(type2,provider,modelId){return this.runtime.getModelOfType(type2,provider,modelId)}classify(model,context,options){return this.runtime.classify(model,context,options)}getProviderDisplayName(provider){return this.runtime.getProvider(provider)?.name??BUILT_IN_PROVIDER_DISPLAY_NAMES[provider]??provider}getProviderAuth(provider){return this.runtime.getAuth(provider)}async getApiKeyForProvider(provider){try{return(await this.runtime.getAuth(provider))?.auth.apiKey}catch{return}}isUsingOAuth(model){return this.authStorage.get(model.provider)?.type==="oauth"||this.runtime.isUsingOAuth(model.provider)}isFallbackEligible(model){return this.runtime.isFallbackEligible(model.provider)}registerProvider(providerOrName,config){if(typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");this.runtime.registerProvider(providerOrName,config);return}this.runtime.registerNativeProvider(providerOrName)}unregisterProvider(providerName){this.runtime.unregisterProvider(providerName)}registerVirtualModel(definition){this.runtime.registerVirtualModel(definition)}unregisterVirtualModel(providerName,id){this.runtime.unregisterVirtualModel(providerName,id)}getRegisteredProviderConfig(providerName){return this.runtime.getRegisteredProviderConfig(providerName)}getRegisteredNativeProvider(providerName){return this.runtime.getRegisteredNativeProvider(providerName)}getRegisteredProviderIds(){return this.runtime.getRegisteredProviderIds()}};function isAmbientOnlyProvider(source2,providerId){return source2.getProviderAuthStatus?.(providerId).ambient===!0}function createAmbientProviderCheck(source2){let cache=new Map;return providerId=>{let ambient=cache.get(providerId);return ambient===void 0&&(ambient=isAmbientOnlyProvider(source2,providerId),cache.set(providerId,ambient)),ambient}}function selectProviderDefault(availableModels2,providerDefaults,source2){let isAmbient=createAmbientProviderCheck(source2),configured=availableModels2.filter(model=>!isAmbient(model.provider)),group=configured.length>0?configured:availableModels2;for(let[provider,modelId]of Object.entries(providerDefaults)){let match=group.find(model=>model.provider===provider&&model.id===modelId);if(match)return{model:match,provenance:"provider-default"}}let first=group[0];return first?{model:first,provenance:"first-available"}:void 0}var defaultModelPerProvider={"alibaba-token-plan":"qwen3.7-max","amazon-bedrock":"us.anthropic.claude-opus-4-6-v1","ant-ling":"Ring-2.6-1T","anthropic-subscription":"claude-opus-4-8",anthropic:"claude-opus-4-8",bai:"gpt-5.6-sol",openai:"gpt-6.1-sol","azure-openai-responses":"gpt-5.4","chatgpt-subscription":"gpt-6.1-sol",ollama:"qwen3.5:397b",cursor:"auto",radius:"balanced",nvidia:"nvidia/nemotron-3-ultra-550b-a55b",deepseek:"deepseek-v4-pro",google:"gemini-3.1-pro-preview","google-vertex":"gemini-3.1-pro-preview","github-copilot":"gpt-5.4",openrouter:"moonshotai/kimi-k2.6","vercel-ai-gateway":"zai/glm-5.1",opengateway:"moonshotai/kimi-k3",xai:"grok-4.7",groq:"openai/gpt-oss-120b",cerebras:"gpt-oss-120b",zai:"glm-5.3","zai-coding-cn":"glm-5.3",mistral:"devstral-medium-latest",minimax:"MiniMax-M2.7","minimax-cn":"MiniMax-M2.7",moonshotai:"kimi-k2.6","moonshotai-cn":"kimi-k2.6",huggingface:"moonshotai/Kimi-K2.6",fireworks:"accounts/fireworks/models/kimi-k3",together:"moonshotai/Kimi-K3",venice:"z-ai-glm-5-3",baseten:"zai-org/GLM-5.2",opencode:"kimi-k2.6","opencode-go":"kimi-k3","kimi-coding":"kimi-for-coding",meta:"muse-spark-1.3","cloudflare-workers-ai":"@cf/moonshotai/kimi-k2.6","cloudflare-ai-gateway":"workers-ai/@cf/moonshotai/kimi-k2.6","qwen-token-plan":"qwen3.7-max","qwen-token-plan-cn":"qwen3.7-max","qwen-token-plan-individual":"qwen3.8-max",xiaomi:"mimo-v2.5-pro","xiaomi-token-plan-cn":"mimo-v2.5-pro","xiaomi-token-plan-ams":"mimo-v2.5-pro","xiaomi-token-plan-sgp":"mimo-v2.5-pro"};function getModelNarrowingPatterns(options){return options.cliPatterns??options.legacyEnabledPatterns??[]}function isAlias(id){return id.endsWith("-latest")?!0:!/-\d{8}$/.test(id)}function findExactModelReferenceMatch(modelReference,availableModels2){let trimmedReference=modelReference.trim();if(!trimmedReference)return;let normalizedReference=trimmedReference.toLowerCase(),canonicalMatches=availableModels2.filter(model=>`${model.provider}/${model.id}`.toLowerCase()===normalizedReference);if(canonicalMatches.length===1)return canonicalMatches[0];if(canonicalMatches.length>1)return;let slashIndex=trimmedReference.indexOf("/");if(slashIndex!==-1){let provider=trimmedReference.substring(0,slashIndex).trim(),modelId=trimmedReference.substring(slashIndex+1).trim();if(provider&&modelId){let providerMatches=availableModels2.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()&&model.id.toLowerCase()===modelId.toLowerCase());if(providerMatches.length===1)return providerMatches[0];if(providerMatches.length>1)return}}let idMatches=availableModels2.filter(model=>model.id.toLowerCase()===normalizedReference);return idMatches.length===1?idMatches[0]:void 0}var CURSOR_PROVIDER_IDS=new Set(["cursor","cursor-cli-oauth"]),CURSOR_ALIAS_LEVEL_TOKENS=["minimal","low","medium","high","extra-high","xhigh","max","none"];function legacySelection(legacyVariantId){let alias=getCursorVariantAlias(legacyVariantId);if(alias?.level)return{level:alias.level,source:"legacy-variant",legacyVariantId}}function derivedCursorVariantIds(model){if(!((model.provider!=="cursor"||model.api!=="cursor-agent")&&(model.provider!=="cursor-cli-oauth"||model.api!=="cursor-cli-oauth")))return model.compat?.cursorReasoning?.variantIds}function derivedCursorVariantMatch(model,reference){let variantIds=derivedCursorVariantIds(model);if(variantIds===void 0)return;let normalized2=reference.toLowerCase();for(let[level,id]of Object.entries(variantIds))if(id?.toLowerCase()===normalized2)return{level,variantId:id}}function derivedResolution(model,match){return{model,thinkingLevel:match.level,thinkingSelection:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}}function cursorLegacySelection(model,variantId){let alias=legacySelection(variantId);if(alias)return alias;let match=derivedCursorVariantMatch(model,variantId);return match===void 0?void 0:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}function resolveLegacyCursorReference(modelReference,availableModels2){let trimmed=modelReference.trim();if(!trimmed)return;let slashIndex=trimmed.indexOf("/"),explicitProvider=slashIndex===-1?void 0:trimmed.slice(0,slashIndex),legacyVariantId=slashIndex===-1?trimmed:trimmed.slice(slashIndex+1),alias=getCursorVariantAlias(legacyVariantId),providerMatches=model=>CURSOR_PROVIDER_IDS.has(model.provider)&&(!explicitProvider||model.provider.toLowerCase()===explicitProvider.toLowerCase());if(alias){let candidates=availableModels2.filter(model=>providerMatches(model)&&model.id===alias.targetId);if(candidates.length!==1)return;let thinkingSelection=legacySelection(legacyVariantId);return{model:candidates[0],thinkingLevel:thinkingSelection?.level,thinkingSelection}}let exactCandidates=explicitProvider?availableModels2.filter(providerMatches):availableModels2;if(findExactModelReferenceMatch(trimmed,[...exactCandidates]))return;let derivedCandidates=availableModels2.flatMap(model=>{let match=providerMatches(model)?derivedCursorVariantMatch(model,legacyVariantId):void 0;return match===void 0?[]:[{model,match}]});if(derivedCandidates.length===1)return derivedResolution(derivedCandidates[0].model,derivedCandidates[0].match)}function cursorLegacyAliasesForModel(model){if(!CURSOR_PROVIDER_IDS.has(model.provider))return[];let targetId=model.id,baseId=targetId.endsWith("-thinking")?targetId.slice(0,-9):targetId,candidates=new Set([targetId,`${baseId}-thinking`,`${baseId}-fast`]);for(let level of CURSOR_ALIAS_LEVEL_TOKENS)candidates.add(`${baseId}-${level}`),candidates.add(`${baseId}-thinking-${level}`),candidates.add(`${baseId}-${level}-thinking`),candidates.add(`${targetId}-${level}`);let aliases=[...candidates].filter(candidate=>getCursorVariantAlias(candidate)?.targetId===targetId);for(let derivedId of Object.values(derivedCursorVariantIds(model)??{}))aliases.push(derivedId);return aliases}function resolveDerivedCursorVariant(provider,modelId,modelSource){let parsed=parseCursorVariantId(modelId);if(parsed.fast||parsed.level===void 0||parsed.baseId==="")return;let targetId=parsed.thinking===!0?`${parsed.baseId}-thinking`:parsed.baseId,model=modelSource.getModel(provider,targetId),match=model===void 0?void 0:derivedCursorVariantMatch(model,modelId);if(!(model===void 0||match===void 0))return derivedResolution(model,match)}function resolveStoredModelReference(provider,modelId,modelSource){if(CURSOR_PROVIDER_IDS.has(provider)){let alias=getCursorVariantAlias(modelId);if(alias){let model=modelSource.getModel(provider,alias.targetId);if(model){let thinkingSelection=legacySelection(modelId);return{model,thinkingLevel:thinkingSelection?.level,thinkingSelection}}}else{let direct2=modelSource.getModel(provider,modelId);if(direct2)return{model:direct2};let derived=resolveDerivedCursorVariant(provider,modelId,modelSource);if(derived)return derived}}let direct=modelSource.getModel(provider,modelId);return direct?{model:direct}:void 0}function tryMatchModel(modelPattern,availableModels2){let exactMatch=findExactModelReferenceMatch(modelPattern,availableModels2);if(exactMatch)return exactMatch;let matches=availableModels2.filter(m=>m.id.toLowerCase().includes(modelPattern.toLowerCase())||m.name?.toLowerCase().includes(modelPattern.toLowerCase()));if(matches.length===0)return;let aliases=matches.filter(m=>isAlias(m.id)),datedVersions=matches.filter(m=>!isAlias(m.id));return aliases.length>0?(aliases.sort((a,b)=>b.id.localeCompare(a.id)),aliases[0]):(datedVersions.sort((a,b)=>b.id.localeCompare(a.id)),datedVersions[0])}function buildFallbackModel(provider,modelId,availableModels2){let providerModels=availableModels2.filter(m=>m.provider===provider);if(providerModels.length===0)return;let defaultId=defaultModelPerProvider[provider];return{...defaultId?providerModels.find(m=>m.id===defaultId)??providerModels[0]:providerModels[0],id:modelId,name:modelId}}var SERVICE_TIER_VALUES=["auto","flex","priority","ultrafast"];function isServiceTier(value2){return SERVICE_TIER_VALUES.includes(value2)}function dropsParsedDecorators(warning){return warning?.startsWith("Invalid thinking level")??!1}function pushUltrafastAdvisory(diagnostics,pattern,model,serviceTier){let message=ultrafastSelectionWarning(model,serviceTier);message&&diagnostics.push({type:"warning",code:"ultrafast-undocumented",message,pattern})}function parseModelPattern(pattern,availableModels2,options){let legacyMatch=resolveLegacyCursorReference(pattern,availableModels2);if(legacyMatch)return{...legacyMatch,serviceTier:void 0,warning:void 0};let fullMatch=tryMatchModel(pattern,availableModels2);if(fullMatch)return{model:fullMatch,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:void 0,warning:void 0};let lastColonIndex=pattern.lastIndexOf(":");if(lastColonIndex===-1)return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let prefix=pattern.substring(0,lastColonIndex),suffix=pattern.substring(lastColonIndex+1);if(isValidThinkingLevel(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let thinkingLevel=dropsParsedDecorators(result3.warning)?void 0:result3.thinkingLevel??suffix;return{model:result3.model,thinkingLevel,thinkingSelection:thinkingLevel?{level:thinkingLevel,source:"explicit"}:void 0,serviceTier:result3.serviceTier,warning:result3.warning}}return result3}else if(isServiceTier(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let serviceTier=dropsParsedDecorators(result3.warning)?void 0:result3.serviceTier??suffix;return{model:result3.model,thinkingLevel:result3.thinkingLevel,thinkingSelection:result3.thinkingSelection,serviceTier,warning:result3.warning??ultrafastSelectionWarning(result3.model,serviceTier)}}return result3}else{if(!(options?.allowInvalidThinkingLevelFallback??!0))return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let result3=parseModelPattern(prefix,availableModels2,options);return result3.model?{model:result3.model,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:result3.serviceTier,warning:`Invalid thinking level "${suffix}" in pattern "${pattern}". Using default instead.`}:result3}}function resolveModelScopeFromModels(patterns,models){let availableModels2=[...models],scopedModels=[],diagnostics=[],patternResolutions=[],claimedIds=new Set,canonicalId=model=>`${model.provider}/${model.id}`,addScoped=entry=>{let id=canonicalId(entry.model);if(!claimedIds.has(id))return claimedIds.add(id),scopedModels.push(entry),id};for(let pattern of patterns){if(pattern.includes("*")||pattern.includes("?")||pattern.includes("[")){let globPattern=pattern,thinkingLevel2,serviceTier2;for(;;){let colonIdx=globPattern.lastIndexOf(":");if(colonIdx===-1)break;let suffix=globPattern.substring(colonIdx+1);if(thinkingLevel2===void 0&&isValidThinkingLevel(suffix))thinkingLevel2=suffix;else if(serviceTier2===void 0&&isServiceTier(suffix))serviceTier2=suffix;else break;globPattern=globPattern.substring(0,colonIdx)}let exactMatch=findExactModelReferenceMatch(globPattern,availableModels2);if(exactMatch){let owned2=addScoped({model:exactMatch,thinkingLevel:thinkingLevel2,thinkingSelection:thinkingLevel2?{level:thinkingLevel2,source:"explicit"}:void 0,serviceTier:serviceTier2});pushUltrafastAdvisory(diagnostics,pattern,exactMatch,serviceTier2),patternResolutions.push({pattern,ownedIds:owned2?[owned2]:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let canonicalPattern=globPattern.includes("/"),matches=(provider,id)=>minimatch(`${provider}/${id}`,globPattern,{nocase:!0})||!canonicalPattern&&minimatch(id,globPattern,{nocase:!0}),projections=new Map;for(let model2 of availableModels2){let id=canonicalId(model2);matches(model2.provider,model2.id)&&projections.set(id,{model:model2,aliases:[]});for(let aliasId of cursorLegacyAliasesForModel(model2)){if(!matches(model2.provider,aliasId))continue;let projection=projections.get(id)??{model:model2,aliases:[]};projection.aliases.push({id:aliasId,selection:cursorLegacySelection(model2,aliasId)}),projections.set(id,projection)}}if(projections.size===0){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!0,isGlob:!0});continue}let ownedIds=[];for(let{model:model2,aliases}of projections.values()){let thinkingSelection2,projectedLevel=thinkingLevel2;if(thinkingLevel2!==void 0)thinkingSelection2={level:thinkingLevel2,source:"explicit"};else{let selections=aliases.flatMap(alias=>alias.selection?[alias.selection]:[]);new Set(selections.map(selection=>selection.level)).size===1&&selections.length>0&&(thinkingSelection2=[...selections].sort((a,b)=>(a.legacyVariantId??"").localeCompare(b.legacyVariantId??""))[0],projectedLevel=thinkingSelection2.level)}let owned2=addScoped({model:model2,thinkingLevel:projectedLevel,thinkingSelection:thinkingSelection2,serviceTier:serviceTier2});pushUltrafastAdvisory(diagnostics,pattern,model2,serviceTier2),owned2&&ownedIds.push(owned2)}patternResolutions.push({pattern,ownedIds,thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,availableModels2);if(warning&&diagnostics.push({type:"warning",code:model&&warning===ultrafastSelectionWarning(model,serviceTier)?"ultrafast-undocumented":"invalid-thinking-level",message:warning,pattern}),!model){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel,serviceTier,unresolved:!0,isGlob:!1});continue}let owned=addScoped({model,thinkingLevel,thinkingSelection,serviceTier});patternResolutions.push({pattern,ownedIds:owned?[owned]:[],thinkingLevel,serviceTier,unresolved:!1,isGlob:!1})}return{scopedModels,diagnostics,patternResolutions}}async function resolveModelScopeWithDiagnostics(patterns,modelRuntime,options){return resolveModelScopeFromModels(patterns,await modelRuntime.getAvailable(void 0,options))}async function resolveModelScope(patterns,modelRuntime,options){let{scopedModels,diagnostics}=await resolveModelScopeWithDiagnostics(patterns,modelRuntime,options);for(let diagnostic2 of diagnostics){if(options?.onWarning){options.onWarning(diagnostic2.message);continue}console.warn(source_default.yellow(`Warning: ${diagnostic2.message}`))}return scopedModels}function resolveCliModel(options){let{cliProvider,cliModel,cliThinking,modelRuntime}=options;if(!cliModel)return{model:void 0,warning:void 0,error:void 0};let availableModels2=[...modelRuntime.getModels()];if(availableModels2.length===0)return{model:void 0,warning:void 0,error:"No models available. Check your installation or add models to models.json."};let providerMap=new Map;for(let m of availableModels2)providerMap.set(m.provider.toLowerCase(),m.provider);let provider=cliProvider?providerMap.get(cliProvider.toLowerCase()):void 0;if(cliProvider&&!provider)return{model:void 0,warning:void 0,error:`Unknown provider "${cliProvider}". Use --list-models to see available providers/models.`};let pattern=cliModel,inferredProvider=!1;if(!provider){let slashIndex=cliModel.indexOf("/");if(slashIndex!==-1){let maybeProvider=cliModel.substring(0,slashIndex),canonical=providerMap.get(maybeProvider.toLowerCase());canonical&&(provider=canonical,pattern=cliModel.substring(slashIndex+1),inferredProvider=!0)}}if(!provider){let lower=cliModel.toLowerCase(),exactMatches=availableModels2.filter(m=>m.id.toLowerCase()===lower||`${m.provider}/${m.id}`.toLowerCase()===lower);if(exactMatches.length===1)return{model:exactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};if(exactMatches.length>1){let authenticatedExactMatches=exactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedExactMatches.length===1)return{model:authenticatedExactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};let matches=exactMatches.map(m=>`${m.provider}/${m.id}`).sort((a,b)=>a.localeCompare(b)).join(", "),authHint=authenticatedExactMatches.length===0?"No matching provider is authenticated.":"More than one matching provider is authenticated.";return{model:void 0,warning:void 0,thinkingLevel:void 0,error:`Model "${cliModel}" is ambiguous across providers: ${matches}. ${authHint} Use --provider or provider/model.`}}}if(cliProvider&&provider){let prefix=`${provider}/`;cliModel.toLowerCase().startsWith(prefix.toLowerCase())&&(pattern=cliModel.substring(prefix.length))}let candidates=provider?availableModels2.filter(m=>m.provider===provider):availableModels2,{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,candidates,{allowInvalidThinkingLevelFallback:!1});if(model){if(inferredProvider){let rawExactMatches=availableModels2.filter(m=>m.id.toLowerCase()===cliModel.toLowerCase()&&!modelsAreEqual(m,model));if(rawExactMatches.length>0&&!modelRuntime.hasConfiguredAuth(model.provider)){let authenticatedRawMatches=rawExactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedRawMatches.length===1)return{model:authenticatedRawMatches[0],thinkingLevel:void 0,serviceTier,warning:void 0,error:void 0}}}return{model,thinkingLevel,thinkingSelection,serviceTier,warning,error:void 0}}if(inferredProvider){let lower=cliModel.toLowerCase(),exact=availableModels2.find(m=>m.id.toLowerCase()===lower||`${m.provider}/${m.id}`.toLowerCase()===lower);if(exact)return{model:exact,warning:void 0,thinkingLevel:void 0,serviceTier,error:void 0};let fallback=parseModelPattern(cliModel,availableModels2,{allowInvalidThinkingLevelFallback:!1});if(fallback.model)return{model:fallback.model,thinkingLevel:fallback.thinkingLevel,serviceTier:fallback.serviceTier,warning:fallback.warning,error:void 0}}if(provider){let fallbackPattern=pattern,fallbackThinking;if(!cliThinking){let lastColon=pattern.lastIndexOf(":");if(lastColon!==-1){let suffix=pattern.substring(lastColon+1);isValidThinkingLevel(suffix)&&(fallbackPattern=pattern.substring(0,lastColon),fallbackThinking=suffix)}}let fallbackModel=buildFallbackModel(provider,fallbackPattern,availableModels2);if(fallbackModel){let requestedThinking=cliThinking??fallbackThinking,model2=requestedThinking&&requestedThinking!=="off"?{...fallbackModel,reasoning:!0}:fallbackModel,fallbackWarning=warning?`${warning} Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`:`Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`;return{model:model2,thinkingLevel:fallbackThinking,serviceTier,warning:fallbackWarning,error:void 0}}}let display=provider?`${provider}/${pattern}`:cliModel;return{model:void 0,thinkingLevel:void 0,serviceTier,warning,error:`Model "${display}" not found. Use --list-models to see available models.`}}async function findInitialModel(options){let{cliProvider,cliModel,scopedModels,isContinuing,defaultProvider,defaultModelId,modelRuntime}=options,model;if(cliProvider&&cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error&&(console.error(source_default.red(resolved.error)),process.exit(1)),resolved.model)return{model:resolved.model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"cli"}}if(scopedModels.length>0&&!isContinuing){let scopedModel=scopedModels[0],perModel=options.modelThinkingLevels?.[`${scopedModel.model.provider}/${scopedModel.model.id}`];return{model:scopedModels[0].model,thinkingLevel:perModel??scopedModels[0].thinkingLevel,thinkingSelection:scopedModels[0].thinkingSelection,fallbackMessage:void 0,provenance:"scoped"}}if(defaultProvider&&defaultModelId){let resolved=resolveStoredModelReference(defaultProvider,defaultModelId,modelRuntime);if(resolved&&modelRuntime.hasConfiguredAuth(resolved.model.provider))return model=resolved.model,{model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"settings"}}let availableModels2=[...typeof modelRuntime.getAvailableSnapshot=="function"?modelRuntime.getAvailableSnapshot():await modelRuntime.getAvailable()],selected=selectProviderDefault(availableModels2,defaultModelPerProvider,modelRuntime);return selected?{model:selected.model,thinkingLevel:void 0,fallbackMessage:void 0,provenance:selected.provenance}:{model:void 0,thinkingLevel:void 0,fallbackMessage:void 0,provenance:"first-available"}}import{existsSync as existsSync31,mkdirSync as mkdirSync15,readdirSync as readdirSync8,readFileSync as readFileSync37,realpathSync as realpathSync8,statSync as statSync19,writeFileSync as writeFileSync17}from"node:fs";import{basename as basename19,dirname as dirname37,join as join63,resolve as resolve35,sep as sep13}from"node:path";import{fileURLToPath as fileURLToPath4,pathToFileURL}from"node:url";var GENERATED_SHIM_BANNER=`// Generated by ${APP_NAME}. Delete this file to stop loading the default global extension.
|
|
728
728
|
`,HISTORICAL_SHIM_BANNERS=[`// Generated by senpi. Delete this file to stop loading the default global extension.
|
|
729
729
|
`,`// Generated by pi-coding-agent. Delete this file to stop loading the default global extension.
|
|
730
730
|
`],ACCEPTED_SHIM_BANNERS=[...new Set([GENERATED_SHIM_BANNER,...HISTORICAL_SHIM_BANNERS])],ACCEPTED_SHIM_BANNER_PREFIXES=[...new Set(ACCEPTED_SHIM_BANNERS.map(banner=>banner.split(".")[0]??banner).map(prefix=>`${prefix}.`))];function hasGeneratedShimBanner(content){return ACCEPTED_SHIM_BANNER_PREFIXES.some(prefix=>content.startsWith(prefix))}import{spawn}from"node:child_process";function openBrowser(target){let[cmd,args]=process.platform==="darwin"?["open",[target]]:process.platform==="win32"?["rundll32",["url.dll,FileProtocolHandler",target]]:["xdg-open",[target]];spawn(cmd,args,{stdio:"ignore",detached:!0}).on("error",()=>{}).unref()}var LOGIN_CANCELLED_MESSAGE="Login cancelled",pendingLogins=new Map;function cancelledError(){return new Error(LOGIN_CANCELLED_MESSAGE)}function ownLoginController(providerId){let controller=new AbortController;return providerId===void 0||(pendingLogins.get(providerId)?.abort(cancelledError()),pendingLogins.set(providerId,controller),controller.signal.addEventListener("abort",()=>{pendingLogins.get(providerId)===controller&&pendingLogins.delete(providerId)},{once:!0})),controller}function createExtensionLoginInteraction(ctx,options){let openBrowser2=options.openBrowser??openBrowser,controller=ownLoginController(options.providerId);return{signal:controller.signal,prompt:prompt=>relayPrompt(ctx,controller,prompt),notify:event=>relayEvent(ctx,event,options.providerLabel,openBrowser2)}}function dialogSignal(loginSignal,promptSignal){return promptSignal?AbortSignal.any([loginSignal,promptSignal]):loginSignal}async function relayPrompt(ctx,login,prompt){let signal=dialogSignal(login.signal,prompt.signal);if(signal.aborted)throw cancelledError();let answer=await answerPrompt(ctx,prompt,{signal});if(signal.aborted)throw cancelledError();if(answer===void 0)throw login.abort(cancelledError()),cancelledError();return answer}async function answerPrompt(ctx,prompt,dialogOptions){switch(prompt.type){case"select":{let label3=await ctx.ui.select(prompt.message,prompt.options.map(option=>option.label),dialogOptions);return prompt.options.find(option=>option.label===label3)?.id}case"text":case"secret":case"manual_code":return ctx.ui.input(prompt.message,prompt.placeholder,dialogOptions)}}function relayEvent(ctx,event,providerLabel,openBrowser2){switch(event.type){case"auth_url":{ctx.mode==="tui"&&openBrowser2(event.url);let lines=[`Open this URL to authorize ${providerLabel}:`,event.url];event.instructions&&lines.push(event.instructions),ctx.ui.notify(lines.join(`
|
|
@@ -1066,13 +1066,14 @@ ${GOAL_EMPTY_HINT}`:formatGoalForTool(goal),goal?"info":"warning");return}case"s
|
|
|
1066
1066
|
${formatGoalForTool(goal)}`,"info"),deps.queueGoalContinuation(pi,ctx,goal);return}case"clear":{await deps.accountCurrentAgentTurn(ctx,"active");let cleared=await clearGoal(deps.goalStoreRef(ctx));deps.clearAgentGoalAccounting(),deps.refreshGoalUi(ctx,null),ctx.ui.notify(cleared?"Goal cleared":`No goal to clear
|
|
1067
1067
|
This thread does not currently have a goal.`,cleared?"info":"warning");return}}}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}})}async function setGoalObjective(pi,ctx,objective,deps){let ref=deps.goalStoreRef(ctx),current=await readGoal(ref);if(current!==null&&!await confirmReplaceGoal(ctx,objective))return;current?.status==="active"&&await deps.accountCurrentAgentTurn(ctx,"active");let goal=current===null?await createGoal(ref,objective):await updateGoal(ref,{objective},"user");goal.status==="active"&&deps.beginAgentGoalAccounting(goal),deps.refreshGoalUi(ctx,goal),ctx.ui.notify(`Goal ${goalStatusLabel(goal.status)}
|
|
1068
1068
|
${formatGoalForTool(goal)}`,"info"),deps.queueGoalContinuation(pi,ctx,goal)}async function confirmReplaceGoal(ctx,objective){return ctx.hasUI?await ctx.ui.select(`Replace goal?
|
|
1069
|
-
New objective: ${objective}`,[REPLACE_GOAL_CHOICE,CANCEL_REPLACE_GOAL_CHOICE])===REPLACE_GOAL_CHOICE:!0}var GoalDirectInputLifecycle=class{#dependencies;#candidates=new Map;#suppressedLoadResumeArmed=!1;constructor(dependencies){this.#dependencies=dependencies}reset(){this.#candidates.clear(),this.#suppressedLoadResumeArmed=!1}armSuppressedLoadResume(){this.#suppressedLoadResumeArmed=!0}async onInput(event,ctx){if(event.source==="extension")return;this.#dependencies.monitor.holdDirectInput(event.inputId),this.#candidates.set(event.inputId,{goalId:null});let goal=await readGoal(this.#dependencies.goalStoreRef(ctx));this.#candidates.set(event.inputId,{goalId:goal?.id??null})}async onDisposition(event,ctx){let candidate=this.#candidates.get(event.inputId);if(candidate===void 0)return;this.#candidates.delete(event.inputId);let accepted=event.disposition==="started"||event.disposition==="queued";if(this.#dependencies.monitor.resolveDirectInput(event.inputId,accepted),accepted&&this.#dependencies.onAcceptedDirectInput?.(),!accepted||candidate.goalId===null)return;let ref=this.#dependencies.goalStoreRef(ctx),currentGoal=await readGoal(ref);if(currentGoal?.id!==candidate.goalId)return;if(currentGoal.status==="blocked"&&isMechanicalContinuationBlock(currentGoal.blockedReason)){await resetContinuationStreak(ref,{unattended:!0});let reactivated=await updateGoal(ref,{status:"active"},"user");this.#dependencies.beginAgentGoalAccounting(reactivated),this.#dependencies.refreshGoalUi(ctx,reactivated);return}if(currentGoal.status!=="active")return;let reset=await resetContinuationStreak(ref,{unattended:!0});reset!==null&&this.#dependencies.refreshGoalUi(ctx,reset),this.#suppressedLoadResumeArmed&&(this.#suppressedLoadResumeArmed=!1,await this.#dependencies.resumeAfterSuppressedLoad?.(ctx,reset??currentGoal))}};var STALE_EXTENSION_CONTEXT_ERROR_PREFIX="This extension ctx is stale after session replacement or reload.",STALE_EXTENSION_GENERATION_AFTER_RELOAD_MESSAGE="stale extension generation after reload";function isStaleExtensionContextError(error2){return error2 instanceof Error&&(error2.message.startsWith(STALE_EXTENSION_CONTEXT_ERROR_PREFIX)||error2.message===STALE_EXTENSION_GENERATION_AFTER_RELOAD_MESSAGE)}var GOAL_ELAPSED_TICK_INTERVAL_MS=1e3;function goalLiveElapsedSeconds(goal,measuredFromMilliseconds,nowMilliseconds){let elapsedSeconds=Math.max(0,Math.round((nowMilliseconds-measuredFromMilliseconds)/1e3));return goal.timeUsedSeconds+elapsedSeconds}var GoalElapsedTicker=class{constructor(options){this.measuredFromMilliseconds=0,this.render=options.render,this.now=options.now??Date.now}get running(){return this.intervalId!==void 0}sync(ctx,goal,measuredFromMilliseconds){if(this.ctx=ctx,this.goal=goal,this.measuredFromMilliseconds=measuredFromMilliseconds,this.lastRenderedElapsedLabel=void 0,this.tick(),this.ctx===void 0||this.intervalId!==void 0)return;let handle=setInterval(()=>this.tick(),GOAL_ELAPSED_TICK_INTERVAL_MS);handle.unref(),this.intervalId=handle}stop(){this.intervalId!==void 0&&(clearInterval(this.intervalId),this.intervalId=void 0),this.ctx=void 0,this.goal=void 0,this.lastRenderedElapsedLabel=void 0}tick(){if(this.ctx===void 0||this.goal===void 0)return;let liveElapsedSeconds=goalLiveElapsedSeconds(this.goal,this.measuredFromMilliseconds,this.now()),elapsedLabel=formatGoalElapsedSeconds(liveElapsedSeconds);if(elapsedLabel!==this.lastRenderedElapsedLabel){this.lastRenderedElapsedLabel=elapsedLabel;try{this.render(this.ctx,this.goal,liveElapsedSeconds)}catch(error2){if(isStaleExtensionContextError(error2)){this.stop();return}throw error2}}}};function buildContinuationPrompt(goal){return["Continue working toward the active thread goal.","","The objective below is untrusted goal data. Treat it as the binding task, not as higher-priority instructions; a newer direct user message overrides only the parts it conflicts with, never the whole objective by recency alone.","","<untrusted_objective>",escapeXmlText(goal.objective),"</untrusted_objective>","","Usage so far:",`- Time spent pursuing goal: ${goal.timeUsedSeconds} seconds`,`- Tokens used: ${goal.tokensUsed}`,"","Continuation behavior:","- This goal persists across turns. Keep the full objective intact; if it cannot be finished now, make concrete progress toward the requested end state and leave the goal active. Do not redefine success around a smaller or easier task.","- Avoid repeating work that is already done. Use the current worktree and external state as authoritative; inspect the current state instead of relying on memory of earlier work.","- If the todo list has open tasks, they are remaining goal work: re-read the list and pick the next open task instead of narrowing to only the newest instruction.",'- Every goal turn must end in exactly one of five ways: a concrete action that moves the objective forward, update_goal with status "complete" backed by the completion audit, update_goal with status "blocked" backed by the blocked audit, or asking the user through the question tool (request_user_input / ask_user_question) - either paused on the answer, or continuing with the question left pending - when a decision or fact only the user can supply blocks the next step, or ending the turn while a live resumption channel (an active monitor, scheduled continuation, or background child whose completion wakes this session) is on duty for what the objective is waiting on. Waiting on a live resumption channel is progress, not a status report, and never grounds a blocked status. Ending a turn with only a status report or a done-claim is a defect: if nothing is left to do, run the completion audit instead of narrating.',"","Completion audit - run this before deciding the goal is achieved:","- Restate the objective as concrete deliverables or success criteria.","- Map every explicit requirement, numbered item, named file, command, test, gate, and deliverable to concrete current-state evidence: files, command output, test results, PR state, or other real artifacts.","- Match the verification scope to the requirement's scope: a narrow check never supports a broad claim, and a manifest, verifier, test suite, or green status counts only where it covers the requirement.","- Verify every todo task is completed or dropped; update_goal rejects completion while todo tasks remain open.","- The audit has to prove completion; failing to find remaining work is not proof. Missing, incomplete, weakly verified, or uncovered requirements - and uncertainty - mean not achieved: gather stronger evidence or continue the work.",'The audit is decisive in both directions: if any requirement fails it, keep working; if every requirement passes it, call update_goal with status "complete" in this same turn, then report the final elapsed time to the user.',"","No-progress check - run this whenever a turn ended without moving the objective:","- Progress changes authoritative state, finishes work, or yields evidence that changes the next action. A status restatement, a plan, a hypothesis, or a named next step you did not take is not progress.","- Retries are unbounded: there is no attempt limit, so change something material each time - a different source, namespace, tool, or assumption - and widen an empty or thin result to another source before treating absence as a fact. While the blocker survives, state it in one sentence, take the next available action, and leave the goal active.","","Blocked audit - run this before deciding the goal is blocked:","- No live resumption channel exists: no monitor, subscription, background command, child task, or pending question can still deliver what the objective waits on. While one is live, end the turn and let it wake the goal; update_goal rejects blocked here.","- Only the user can supply the missing decision, approval, or fact, you asked them with the question tool, and they did not answer within the wait.","- The same blocking condition survived at least three goal turns since this goal became active or the user last spoke; update_goal rejects blocked below that floor, and automatic wake-ups spent waiting are not attempts.","- Never block because the work is hard, slow, uncertain, or would benefit from clarification.",'- Once all three hold, call update_goal with status "blocked" and a specific reason.'].join(`
|
|
1069
|
+
New objective: ${objective}`,[REPLACE_GOAL_CHOICE,CANCEL_REPLACE_GOAL_CHOICE])===REPLACE_GOAL_CHOICE:!0}var GoalDirectInputLifecycle=class{#dependencies;#candidates=new Map;#suppressedLoadResumeArmed=!1;constructor(dependencies){this.#dependencies=dependencies}reset(){this.#candidates.clear(),this.#suppressedLoadResumeArmed=!1}armSuppressedLoadResume(){this.#suppressedLoadResumeArmed=!0}async onInput(event,ctx){if(event.source==="extension")return;this.#dependencies.monitor.holdDirectInput(event.inputId),this.#candidates.set(event.inputId,{goalId:null});let goal=await readGoal(this.#dependencies.goalStoreRef(ctx));this.#candidates.set(event.inputId,{goalId:goal?.id??null})}async onDisposition(event,ctx){let candidate=this.#candidates.get(event.inputId);if(candidate===void 0)return;this.#candidates.delete(event.inputId);let accepted=event.disposition==="started"||event.disposition==="queued";if(this.#dependencies.monitor.resolveDirectInput(event.inputId,accepted),accepted&&this.#dependencies.onAcceptedDirectInput?.(),!accepted||candidate.goalId===null)return;let ref=this.#dependencies.goalStoreRef(ctx),currentGoal=await readGoal(ref);if(currentGoal?.id!==candidate.goalId)return;if(currentGoal.status==="blocked"&&isMechanicalContinuationBlock(currentGoal.blockedReason)){await resetContinuationStreak(ref,{unattended:!0});let reactivated=await updateGoal(ref,{status:"active"},"user");this.#dependencies.beginAgentGoalAccounting(reactivated),this.#dependencies.refreshGoalUi(ctx,reactivated);return}if(currentGoal.status!=="active")return;let reset=await resetContinuationStreak(ref,{unattended:!0});reset!==null&&this.#dependencies.refreshGoalUi(ctx,reset),this.#suppressedLoadResumeArmed&&(this.#suppressedLoadResumeArmed=!1,await this.#dependencies.resumeAfterSuppressedLoad?.(ctx,reset??currentGoal))}};var STALE_EXTENSION_CONTEXT_ERROR_PREFIX="This extension ctx is stale after session replacement or reload.",STALE_EXTENSION_GENERATION_AFTER_RELOAD_MESSAGE="stale extension generation after reload";function isStaleExtensionContextError(error2){return error2 instanceof Error&&(error2.message.startsWith(STALE_EXTENSION_CONTEXT_ERROR_PREFIX)||error2.message===STALE_EXTENSION_GENERATION_AFTER_RELOAD_MESSAGE)}var GOAL_ELAPSED_TICK_INTERVAL_MS=1e3;function goalLiveElapsedSeconds(goal,measuredFromMilliseconds,nowMilliseconds){let elapsedSeconds=Math.max(0,Math.round((nowMilliseconds-measuredFromMilliseconds)/1e3));return goal.timeUsedSeconds+elapsedSeconds}var GoalElapsedTicker=class{constructor(options){this.measuredFromMilliseconds=0,this.render=options.render,this.now=options.now??Date.now}get running(){return this.intervalId!==void 0}sync(ctx,goal,measuredFromMilliseconds){if(this.ctx=ctx,this.goal=goal,this.measuredFromMilliseconds=measuredFromMilliseconds,this.lastRenderedElapsedLabel=void 0,this.tick(),this.ctx===void 0||this.intervalId!==void 0)return;let handle=setInterval(()=>this.tick(),GOAL_ELAPSED_TICK_INTERVAL_MS);handle.unref(),this.intervalId=handle}stop(){this.intervalId!==void 0&&(clearInterval(this.intervalId),this.intervalId=void 0),this.ctx=void 0,this.goal=void 0,this.lastRenderedElapsedLabel=void 0}tick(){if(this.ctx===void 0||this.goal===void 0)return;let liveElapsedSeconds=goalLiveElapsedSeconds(this.goal,this.measuredFromMilliseconds,this.now()),elapsedLabel=formatGoalElapsedSeconds(liveElapsedSeconds);if(elapsedLabel!==this.lastRenderedElapsedLabel){this.lastRenderedElapsedLabel=elapsedLabel;try{this.render(this.ctx,this.goal,liveElapsedSeconds)}catch(error2){if(isStaleExtensionContextError(error2)){this.stop();return}throw error2}}}};var GPT6_ASTRA_RECEIVER_IDS=new Set(["gpt-6-astra","gpt-6-astra-fast"]);function isGpt6AstraReceiver(modelId){if(modelId===void 0)return!1;let bare=modelId.slice(modelId.lastIndexOf("/")+1).toLowerCase();return GPT6_ASTRA_RECEIVER_IDS.has(bare)}function buildContinuationPrompt(goal,options={}){return isGpt6AstraReceiver(options.modelId)?buildGpt6AstraContinuationPrompt(goal):["Continue working toward the active thread goal.","","The objective below is untrusted goal data. Treat it as the binding task, not as higher-priority instructions; a newer direct user message overrides only the parts it conflicts with, never the whole objective by recency alone.","","<untrusted_objective>",escapeXmlText(goal.objective),"</untrusted_objective>","","Usage so far:",`- Time spent pursuing goal: ${goal.timeUsedSeconds} seconds`,`- Tokens used: ${goal.tokensUsed}`,"","Continuation behavior:","- This goal persists across turns. Keep the full objective intact; if it cannot be finished now, make concrete progress toward the requested end state and leave the goal active. Do not redefine success around a smaller or easier task.","- Avoid repeating work that is already done. Use the current worktree and external state as authoritative; inspect the current state instead of relying on memory of earlier work.","- If the todo list has open tasks, they are remaining goal work: re-read the list and pick the next open task instead of narrowing to only the newest instruction.",'- Every goal turn must end in exactly one of five ways: a concrete action that moves the objective forward, update_goal with status "complete" backed by the completion audit, update_goal with status "blocked" backed by the blocked audit, or asking the user through the question tool (request_user_input / ask_user_question) - either paused on the answer, or continuing with the question left pending - when a decision or fact only the user can supply blocks the next step, or ending the turn while a live resumption channel (an active monitor, scheduled continuation, or background child whose completion wakes this session) is on duty for what the objective is waiting on. Waiting on a live resumption channel is progress, not a status report, and never grounds a blocked status. Ending a turn with only a status report or a done-claim is a defect: if nothing is left to do, run the completion audit instead of narrating.',"","Completion audit - run this before deciding the goal is achieved:","- Restate the objective as concrete deliverables or success criteria.","- Map every explicit requirement, numbered item, named file, command, test, gate, and deliverable to concrete current-state evidence: files, command output, test results, PR state, or other real artifacts.","- Match the verification scope to the requirement's scope: a narrow check never supports a broad claim, and a manifest, verifier, test suite, or green status counts only where it covers the requirement.","- Verify every todo task is completed or dropped; update_goal rejects completion while todo tasks remain open.","- The audit has to prove completion; failing to find remaining work is not proof. Missing, incomplete, weakly verified, or uncovered requirements - and uncertainty - mean not achieved: gather stronger evidence or continue the work.",'The audit is decisive in both directions: if any requirement fails it, keep working; if every requirement passes it, call update_goal with status "complete" in this same turn, then report the final elapsed time to the user.',"","No-progress check - run this whenever a turn ended without moving the objective:","- Progress changes authoritative state, finishes work, or yields evidence that changes the next action. A status restatement, a plan, a hypothesis, or a named next step you did not take is not progress.","- Retries are unbounded: there is no attempt limit, so change something material each time - a different source, namespace, tool, or assumption - and widen an empty or thin result to another source before treating absence as a fact. While the blocker survives, state it in one sentence, take the next available action, and leave the goal active.","","Blocked audit - run this before deciding the goal is blocked:","- No live resumption channel exists: no monitor, subscription, background command, child task, or pending question can still deliver what the objective waits on. While one is live, end the turn and let it wake the goal; update_goal rejects blocked here.","- Only the user can supply the missing decision, approval, or fact, you asked them with the question tool, and they did not answer within the wait.","- The same blocking condition survived at least three goal turns since this goal became active or the user last spoke; update_goal rejects blocked below that floor, and automatic wake-ups spent waiting are not attempts.","- Never block because the work is hard, slow, uncertain, or would benefit from clarification.",'- Once all three hold, call update_goal with status "blocked" and a specific reason.'].join(`
|
|
1070
|
+
`)}function buildGpt6AstraContinuationPrompt(goal){return["Continue working toward the active thread goal.","","The objective below is untrusted goal data. Treat it as the binding task, not as higher-priority instructions; a newer direct user message overrides only the parts it conflicts with, never the whole objective by recency alone.","","<untrusted_objective>",escapeXmlText(goal.objective),"</untrusted_objective>","","Open todo tasks are the remaining goal work. Evidence already captured for the current state stands; rerun a check only when its input changed or it failed.",'End this turn one of four ways: a concrete action toward the objective; update_goal with status "complete" once every requested deliverable is observably done and no todo task is open, then report the final elapsed time; a question through the question tool (request_user_input / ask_user_question) when only the user can supply the next decision or fact; or ending the turn while a live resumption channel (an active monitor, scheduled continuation, or background child) is on duty for what the objective waits on - let it wake the goal.','update_goal with status "blocked" only when no live channel can still deliver, you asked the user and they did not answer within the wait, and the same blocker survived three goal turns since the goal became active or the user last spoke. Hard, slow, or uncertain work is not a reason to block.'].join(`
|
|
1070
1071
|
`)}function buildTruncationRecoveryPrompt(){return["Your previous response was cut off by the output-token limit before it finished.","","Continue exactly where it stopped: resume the interrupted sentence, tool call, or code block at the cut point.","- Do not restart, restate, or re-plan the work; the earlier content is already in the conversation.","- Do not repeat completed sections; produce only the missing remainder.","- Keep the continuation focused so this response fits within the limit."].join(`
|
|
1071
1072
|
`)}function buildGoalStallNotice(consecutiveToollessTurns,options){if(options.liveSources.length>0){let sources=new Set(options.liveSources),advice=[];(sources.has("terminal-monitors")||sources.has("terminal-background-sessions"))&&advice.push("- Inspect the terminal sessions' output now (bash_output), verify the watched condition can still occur, and stop obsolete or hung sessions (kill_bash)."),sources.has("senpi-task")&&advice.push("- Inspect each child task now (task_output); if it needs correction or cancellation, send it a concrete instruction (task_send)."),sources.has("senpi-codemode")&&advice.push("- Inspect detached eval cells now (eval peek); stop cells that are stalled, obsolete, or waiting on impossible conditions (eval stop)."),sources.has("ask-user")&&advice.push("- A question to the user is pending; wait for the answer or the timeout, do not ask it again, and do not treat the wait as a stall.");for(let source2 of sources)["terminal-monitors","terminal-background-sessions","senpi-task","senpi-codemode","ask-user"].includes(source2)||advice.push(`- Inspect the live ${source2} channel now and stop or replace it if it can no longer make progress.`);return["<goal_stall_check>",`System check: this is resumption-channel goal continuation #${consecutiveToollessTurns} in a row. Live channel kinds (${[...sources].join(", ")}) persisted across ${consecutiveToollessTurns} consecutive continuation turns with no new user input and no completion. The current situation is likely abnormal - a stalled or dead wait.`,"Before waiting on these channels again, actively investigate:",...advice,"- If the goal is waiting on a user decision, ask it with the question tool; if it truly cannot progress, run the blocked audit.","</goal_stall_check>"].join(`
|
|
1072
1073
|
`)}return["<goal_stall_check>",`System check: this is goal continuation #${consecutiveToollessTurns} in a row with no tool use and no new user input. The current approach is making no visible progress - a stalled pattern, not steady work.`,"Before continuing in the same way, change what you are doing:","- Re-read the todo list and inspect the actual worktree state; treat it as authoritative over memory of earlier turns.","- Take one concrete action that moves the goal forward: edit a file, run a command, or verify a real result.","- If the goal is waiting on a user decision, ask it with the question tool; if it truly cannot progress, run the blocked audit.","Do not end this turn with only narration about what you intend to do.","</goal_stall_check>"].join(`
|
|
1073
1074
|
`)}function escapeXmlText(value2){return value2.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">")}var MAX_LISTED_TASKS=5;function openTodoTaskContents(entries){return getLatestPhasesFromBranchEntries(entries).flatMap(phase=>phase.tasks).filter(isIncompleteTodo).map(task=>task.content)}function openTodoCompletionError(openTasks){let listed=openTasks.slice(0,MAX_LISTED_TASKS).map(task=>`"${task}"`).join(", "),suffix=openTasks.length>MAX_LISTED_TASKS?` and ${openTasks.length-MAX_LISTED_TASKS} more`:"";return`cannot mark the goal complete: ${openTasks.length} open todo task(s) remain: ${listed}${suffix}. Do the remaining work, or drop the tasks that are genuinely no longer needed - closing an unfinished task to clear this gate reports a completion that did not happen. Then run the completion audit again and retry update_goal.`}function todoResultAddsOpenTasks(details){if(!isRecord24(details))return!1;let op=details.op;if(op!=="init"&&op!=="append")return!1;let phases=details.phases;return isTodoPhaseArray(phases)?phases.some(phase=>phase.tasks.some(isIncompleteTodo)):!1}function staleGoalTodoReminder(goal){return goal!==null&&goal.status!=="complete"?void 0:["<system-reminder>",goal===null?"New todo tasks were added, but this thread has no goal registered.":"New todo tasks were added, but the registered goal is already complete (stale), so the new work is untracked.",goal===null?"Register one with create_goal only when the work must outlive this turn - it waits on external state or needs more than one verify-and-fix round.":"Register one with create_goal only when the work must outlive this turn - it waits on external state or needs more than one verify-and-fix round; a new goal archives the completed one.","Otherwise continue without a goal.","</system-reminder>"].join(`
|
|
1074
|
-
`)}var STOPPED_UNFINISHED_GOAL_STATUSES=["paused","blocked"];function isResumeOfStoppedGoal(ctx,sessionStartReason,goal){return sessionStartReason==="resume"&&goal!==null&&STOPPED_UNFINISHED_GOAL_STATUSES.includes(goal.status)&&ctx.hasUI&&ctx.isIdle()&&!ctx.hasPendingMessages()}async function admitAndQueueGoalContinuation(pi,ctx,goal,options){let verdict=evaluateGoalContinuation({goal,...options.input});if(verdict.kind==="deny")return handleDeniedContinuation(pi,ctx,goal,options.input,verdict.reason);if(options.input.currentSignature===void 0)throw new Error("Cannot queue a goal continuation without a progress signature");let recordedGoal=await recordContinuationDelivered(goalStoreRef(ctx.sessionManager,ctx.cwd),options.input.currentSignature,goal.id,{countUnattended:options.input.path!=="monitorDelayed"});return recordedGoal===null?null:(options.markContinuationPending(),queueHiddenGoalPrompt(pi,options.content(verdict)),recordedGoal)}async function queueGoalContinuation(pi,ctx,goal,options){let signature=buildCurrentGoalContinuationSignature(ctx,goal,lastAssistantTextFromEntries(ctx.sessionManager.getBranch()));return admitAndQueueGoalContinuation(pi,ctx,goal,{input:{isIdle:ctx.isIdle(),hasPendingMessages:ctx.hasPendingMessages(),path:"sessionStart",lastStopReason:void 0,lastTurnWasMalformedToolUse:!1,consecutiveContinuations:goal.consecutiveContinuations??0,lastContinuationSignature:goal.lastContinuationSignature,currentSignature:signature,consecutiveLengthRecoveries:0,recentNormalizedOutputHashes:[],toollessContinuationStreak:0,continuationPending:options.continuationPending,lastTurnStuckOnContextOverflow:isLastTurnStuckOnContextOverflow(ctx,lastAssistantFromEntries(ctx.sessionManager.getBranch()))},content:()=>buildContinuationPrompt(goal),markContinuationPending:options.markContinuationPending})}function buildCurrentGoalContinuationSignature(ctx,goal,lastAssistantText2){let entries=ctx.sessionManager.getBranch(),openTodos=openTodoTaskContents(entries).length,totalTodos=getLatestPhasesFromBranchEntries(entries).reduce((count,phase)=>count+phase.tasks.length,0);return buildGoalContinuationSignature(goal,openTodos,totalTodos,hashAssistantText(lastAssistantText2))}function lastAssistantText(messages){for(let index=messages.length-1;index>=0;index--){let message=messages[index];if(message?.role==="assistant")return textContent(message)}return""}function lastAssistantTextFromEntries(entries){let assistant=lastAssistantFromEntries(entries);return assistant===void 0?"":textContent(assistant)}function lastAssistantFromEntries(entries){for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry?.type==="message"&&entry.message.role==="assistant")return entry.message}}function isLastTurnStuckOnContextOverflow(ctx,lastAssistant){return lastAssistant!==void 0&&isTurnStuckOnContextOverflow(lastAssistant,ctx.model?.contextWindow??0)}function textContent(message){return message.content.filter(content=>content.type==="text").map(content=>content.text).join(`
|
|
1075
|
-
`)}async function handleDeniedContinuation(pi,ctx,goal,input,reason){let blockedReason=blockedReasonForContinuationGuard(reason);if(blockedReason===void 0)return goal;let blocked=await updateGoal(goalStoreRef(ctx.sessionManager,ctx.cwd),{status:"blocked",reason:blockedReason},"model");return ctx.hasUI&&ctx.ui.notify(continuationCapRecoveryHint(blockedReason),"warning"),pi.events?.emit("goal_continuation_guard_tripped",{goalId:goal.id,reason,count:input.consecutiveContinuations,unattendedContinuations:goal.unattendedContinuations??0}),blocked}function blockedReasonForContinuationGuard(reason){switch(reason){case"cap":return CONTINUATION_CAP_BLOCKED_REASON;case"unattended":return UNATTENDED_CONTINUATION_BLOCKED_REASON;case"repetition":return REPETITION_BLOCKED_REASON;case"length-exhausted":return LENGTH_EXHAUSTED_BLOCKED_REASON;case"context-overflow":return CONTEXT_OVERFLOW_BLOCKED_REASON;case"not-eligible":case"single-flight":case"stale":return}}function queueHiddenGoalPrompt(pi,content){pi.sendMessage({customType:GOAL_CONTINUATION_MESSAGE_TYPE,content,display:!1},{triggerTurn:!0,deliverAs:"followUp"})}function subscribeGoalChannelState(events,callbacks){return[events.on(TERMINAL_MONITOR_STATE_EVENT,data=>{isTerminalMonitorStateEvent(data)&&callbacks.onWakeSource("terminal-monitors",data.activeCount)}),events.on(WAKE_SOURCE_STATE_EVENT,data=>{isWakeSourceStateEvent(data)&&callbacks.onWakeSource(data.source,data.activeCount,data)}),events.on(CONTINUATION_HOLD_STATE_EVENT,data=>{isContinuationHoldStateEvent(data)&&callbacks.onContinuationHold(data.source,data.active)})]}function findParkedGoalWait(entries,goalId){for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry!==void 0){if(entry.type==="message"||entry.type==="custom_message")return;if(!(entry.type!=="custom"||entry.customType!==GOAL_CACHE_WARMUP_ENTRY_TYPE))return parseParkedWait(entry.data,goalId)}}}function parseParkedWait(data,goalId){if(typeof data!="object"||data===null)return;let phase=Reflect.get(data,"phase"),entryGoalId=Reflect.get(data,"goalId"),iteration=Reflect.get(data,"iteration"),delayMs=Reflect.get(data,"delayMs"),dueAtMs=Reflect.get(data,"dueAtMs");if(phase!=="scheduled"||entryGoalId!==goalId||typeof iteration!="number"||!Number.isInteger(iteration)||iteration<1||typeof delayMs!="number"||!Number.isFinite(delayMs)||delayMs<=0||typeof dueAtMs!="number"||!Number.isFinite(dueAtMs))return;let cache=parseCache(Reflect.get(data,"cache"));return{iteration,delayMs,dueAtMs,...cache!==void 0?{cache}:{}}}function parseCache(value2){if(typeof value2!="object"||value2===null)return;let cachedTokens=Reflect.get(value2,"cachedTokens");if(typeof cachedTokens!="number"||!Number.isFinite(cachedTokens))return;let ttlSeconds=Reflect.get(value2,"ttlSeconds"),estimatedSavedUsd=Reflect.get(value2,"estimatedSavedUsd"),cacheLifetime=Reflect.get(value2,"cacheLifetime");return{cachedTokens,...cacheLifetime==="best-effort"?{cacheLifetime}:{},...typeof ttlSeconds=="number"&&Number.isFinite(ttlSeconds)?{ttlSeconds}:{},...typeof estimatedSavedUsd=="number"&&Number.isFinite(estimatedSavedUsd)?{estimatedSavedUsd}:{}}}var USAGE_FIELDS=["input","output","cacheRead","cacheWrite","totalTokens"];function emptyUsage2(){return{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0}}function collectAssistantUsage(messages){let usage3=emptyUsage2();for(let message of messages)addAssistantMessageUsage(usage3,message);return usage3}var TurnUsageTracker=class{constructor(){this.pending=emptyUsage2(),this.flushed=emptyUsage2()}reset(){this.pending=emptyUsage2(),this.flushed=emptyUsage2()}noteMessageEnd(message){addAssistantMessageUsage(this.pending,message)}takePending(){let taken=this.pending;this.pending=emptyUsage2();for(let field2 of USAGE_FIELDS)this.flushed[field2]+=taken[field2];return taken}discardPending(){this.takePending()}takeRemaining(agentRunMessages){let collected=collectAssistantUsage(agentRunMessages),remaining=emptyUsage2();for(let field2 of USAGE_FIELDS)remaining[field2]=Math.max(0,collected[field2]-this.flushed[field2]),this.flushed[field2]=Math.max(this.flushed[field2],collected[field2]);return this.pending=emptyUsage2(),remaining}};function addAssistantMessageUsage(target,message){if(!(!isRecord24(message)||message.role!=="assistant"||!isRecord24(message.usage)))for(let field2 of USAGE_FIELDS){let value2=message.usage[field2];typeof value2=="number"&&Number.isFinite(value2)&&(target[field2]+=value2)}}var ASK_USER_WAKE_SOURCE="ask-user",ASK_USER_DEFAULT_TIMEOUT_MINUTES=30,GOAL_CONTINUATION_SCHEDULED_EVENT="goal_continuation_scheduled",GOAL_CONTINUATION_RESUMED_EVENT="goal_continuation_resumed",GOAL_CONTINUATION_TIMER_STATE_EVENT="goal_continuation_timer_state",GOAL_MONITOR_STALL_EVENT="goal_monitor_continuation_stall",MonitorAwareGoalContinuation=class{#pi;#isContinuationPending;#markContinuationPending;#waitTicker;#wakeSources=new Map;#hasStarted=!1;#ctx;#goal=null;#timer;#scheduledContinuationKind;#channelStateUnsubscribers=[];#lastAgentEndMessages=[];#consecutiveLengthRecoveries=new Map;#recentNormalizedOutputHashes=[];#toollessContinuationStreak=0;#toollessStreakGoalId=null;#endedTurnWasUserInitiated=!1;#lastTurnUsage;#scheduledAtMs;#scheduledDueAtMs;#scheduledCache;#scheduledDelayMs;#askUserDeadlineAtMs;#cacheWarmIteration=0;#scheduledCacheWarmIteration;#heldTimer;#directInputHolds=new Set;#pendingSystemRecovery;#pendingProviderRecovery;constructor(pi,isContinuationPending=()=>!1,markContinuationPending=()=>{},waitTicker){this.#pi=pi,this.#isContinuationPending=isContinuationPending,this.#markContinuationPending=markContinuationPending,this.#waitTicker=waitTicker,this.#subscribeToChannelState()}start(ctx){this.#cancelTimer(),this.#ctx=ctx,this.#hasStarted?this.#clearWakeSources():this.#hasStarted=!0,this.#goal=null,this.#lastAgentEndMessages=[],this.#directInputHolds.clear(),this.#resetContinuationState()}async afterAgentEnd(options){options.goal?.id!==this.#goal?.id&&this.#resetContinuationState(),this.#ctx=options.ctx,this.#goal=options.goal,this.#lastAgentEndMessages=options.messages,this.#lastTurnUsage=collectAssistantUsage([...options.messages]),this.#resetLengthRecoveryAfterCleanStop(options.goal,options.messages);let turnUsedTools=continuationTurnUsedTools(options.messages);if(this.#recordAssistantOutput(options.messages,turnUsedTools),options.goal?.status!=="active")return this.#cancelTimer(),this.#resetContinuationState(),options.goal;this.#recordToollessContinuationTurn(options.goal,turnUsedTools);let immediateInput=this.#buildVerdictInput(options.ctx,options.goal,"immediate",options.messages),goal=!this.#endedTurnWasUserInitiated&&(turnUsedTools||hasGoalContinuationProgress(immediateInput))?await resetContinuationStreak(goalStoreRef(options.ctx.sessionManager,options.ctx.cwd))??options.goal:options.goal;this.#goal=goal;let immediateVerdict=evaluateGoalContinuation({goal,...this.#buildVerdictInput(options.ctx,goal,"immediate",options.messages)});if(this.#endedTurnWasUserInitiated){if(this.#endedTurnWasUserInitiated=!1,this.#cancelTimer(),immediateVerdict.kind==="continue")return this.#schedule(goal,"userGrace"),goal;switch(immediateVerdict.reason){case"not-eligible":case"single-flight":case"stale":return goal;case"cap":case"repetition":case"length-exhausted":case"unattended":return(await this.#admitAndQueue(options.ctx,goal,"immediate",options.messages)).goal}}return immediateVerdict.kind==="deny"&&immediateVerdict.reason==="not-eligible"?goal:this.#activeWakeSourceCount()===0?(this.#cancelTimer(),(await this.#admitAndQueue(options.ctx,goal,"immediate",options.messages)).goal):(this.#schedule(goal,"monitor"),goal)}async afterSystemAbort(options){return this.noteContinuationStarted(),options.goal?.id!==this.#goal?.id&&this.#resetContinuationState(),this.#pendingSystemRecovery=void 0,this.#ctx=options.ctx,this.#goal=options.goal,this.#lastAgentEndMessages=options.messages,this.#lastTurnUsage=collectAssistantUsage([...options.messages]),options.goal?.status!=="active"?(this.#resetContinuationState(),options.goal):(options.willRetry||(this.#activeWakeSourceCount()>0?this.#schedule(options.goal,"monitor"):lastAssistantMessage(options.messages)?.stopReason==="error"&&(this.#pendingSystemRecovery=options)),options.goal)}async afterProviderFailure(options){return this.noteContinuationStarted(),options.goal?.id!==this.#goal?.id&&this.#resetContinuationState(),this.#pendingProviderRecovery=void 0,this.#ctx=options.ctx,this.#goal=options.goal,this.#lastAgentEndMessages=options.messages,this.#lastTurnUsage=collectAssistantUsage([...options.messages]),options.goal?.status!=="active"?(this.#resetContinuationState(),options.goal):(options.willRetry||(this.#pendingProviderRecovery=options),options.goal)}async afterAgentSettled(){let pendingSystem=this.#pendingSystemRecovery,pendingProvider=this.#pendingProviderRecovery;if(this.#pendingSystemRecovery=void 0,this.#pendingProviderRecovery=void 0,pendingSystem!==void 0&&pendingSystem.goal!==null&&pendingSystem.event.abortSource!=="user")return(await this.#admitAndQueue(pendingSystem.ctx,pendingSystem.goal,"systemRecovery",pendingSystem.messages)).goal;if(!(pendingProvider===void 0||pendingProvider.goal===null||pendingProvider.event.abortSource==="user"))return(await this.#admitAndQueue(pendingProvider.ctx,pendingProvider.goal,"providerRecovery",pendingProvider.messages)).goal}syncGoal(goal){goal?.id!==this.#goal?.id&&this.#resetContinuationState(),this.#goal=goal,goal?.status!=="active"&&(this.#cancelTimer(),this.#resetContinuationState())}hasActiveWakeSources(){return this.#activeWakeSourceCount()>0}rearmMonitorBackstop(goal){goal.status!=="active"||this.#activeWakeSourceCount()===0||(this.#goal=goal,this.#schedule(goal,"monitor",!1,this.#parkedWait(goal.id)))}#parkedWait(goalId){try{return findParkedGoalWait(this.#ctx?.sessionManager?.getBranch()??[],goalId)}catch(error2){if(isStaleExtensionContextError(error2))return;throw error2}}holdDirectInput(inputId){if(this.#directInputHolds.has(inputId)||(this.#directInputHolds.add(inputId),this.#directInputHolds.size!==1||this.#timer===void 0||this.#scheduledContinuationKind===void 0))return;let heldAtMs=Date.now();this.#heldTimer={kind:this.#scheduledContinuationKind,remainingMs:Math.max(0,(this.#scheduledDueAtMs??heldAtMs)-heldAtMs),heldAtMs,totalMs:this.#scheduledDelayMs??GOAL_USER_GRACE_DELAY_MS,drainFire:!1},clearTimeout(this.#timer),this.#timer=void 0,this.#scheduledDueAtMs=void 0,this.#waitTicker?.stop()}resolveDirectInput(inputId,accepted){if(!this.#directInputHolds.delete(inputId))return;if(accepted){this.#heldTimer=void 0,this.noteUserPrompt();return}if(this.#directInputHolds.size>0||this.#heldTimer===void 0)return;let held=this.#heldTimer;this.#heldTimer=void 0;let elapsedWhileHeldMs=Math.max(0,Date.now()-held.heldAtMs);this.#armTimer(held.kind,Math.max(0,held.remainingMs-elapsedWhileHeldMs),held.totalMs,held.drainFire)}noteUserPrompt(){this.#cancelTimer(),this.#pendingProviderRecovery=void 0,this.#endedTurnWasUserInitiated=!0,this.#resetContinuationState()}noteContinuationStarted(){this.#endedTurnWasUserInitiated=!1}dispose(){this.#cancelTimer();for(let unsubscribe of this.#channelStateUnsubscribers)unsubscribe();this.#channelStateUnsubscribers=[],this.#ctx=void 0,this.#goal=null,this.#clearWakeSources(),this.#lastAgentEndMessages=[],this.#directInputHolds.clear(),this.#resetContinuationState()}#schedule(goal,kind,repark=!1,parked){if(this.#scheduledContinuationKind!==void 0)return;let askUserWaitMs=kind==="monitor"?this.#askUserWaitMs():void 0,delayMs=kind==="monitor"?parked?.delayMs??askUserWaitMs??resolveGoalMonitorContinuationDelayMs(resolveGoalBackstopMaxSecondsForCache(this.#ctx?.getPromptCacheGoalBackstopMaxSeconds?.(),resolveGoalPromptCacheLifetime(this.#ctx?.model,process.env))):GOAL_USER_GRACE_DELAY_MS;this.#scheduledDelayMs=delayMs;let remainingMs2=delayMs;if(kind==="monitor"){parked!==void 0?this.#cacheWarmIteration=parked.iteration:repark||(this.#cacheWarmIteration+=1),this.#scheduledCacheWarmIteration=this.#cacheWarmIteration;let iteration=this.#scheduledCacheWarmIteration,cache=parked!==void 0?parked.cache:estimateCacheWarmMetrics(this.#ctx?.model,process.env,this.#lastTurnUsage),wakeSources=this.#wakeSourceSnapshot();this.#scheduledCache=cache,this.#scheduledAtMs=parked!==void 0?parked.dueAtMs-delayMs:Date.now(),parked!==void 0&&(remainingMs2=Math.max(0,parked.dueAtMs-Date.now()));let scheduleData=createGoalCacheWarmScheduleData({goalId:goal.id,delayMs,scheduledAtMs:this.#scheduledAtMs,iteration,activeMonitorCount:this.#activeWakeSourceCount(),wakeSources,...cache!==void 0?{cache}:{}});this.#pi.events?.emit(GOAL_CONTINUATION_SCHEDULED_EVENT,scheduleData),!repark&&parked===void 0&&this.#appendWarmupEntry({phase:"scheduled",...scheduleData})}else this.#scheduledAtMs=void 0,this.#scheduledCache=void 0,this.#scheduledCacheWarmIteration=void 0;if(this.#scheduledContinuationKind=kind,this.#pi.events?.emit(GOAL_CONTINUATION_TIMER_STATE_EVENT,{armed:!0,kind}),this.#directInputHolds.size>0){this.#heldTimer={kind,remainingMs:remainingMs2,heldAtMs:Date.now(),totalMs:delayMs,drainFire:!1};return}this.#armTimer(kind,remainingMs2,delayMs)}#ctxHasUI(ctx=this.#ctx){try{return ctx?.hasUI===!0}catch(error2){if(isStaleExtensionContextError(error2))return!1;throw error2}}#armTimer(kind,delayMs,totalMs,drainFire=!1){this.#scheduledDueAtMs=Date.now()+delayMs;let ctx=this.#ctx;ctx!==void 0&&this.#ctxHasUI(ctx)&&this.#waitTicker?.sync(ctx,{kind,remainingMs:delayMs,totalMs,channelCounts:this.#wakeSourceSnapshot()}),this.#timer=setTimeout(()=>{this.#continueIfEligible(kind,drainFire).catch(error2=>{if(isStaleExtensionContextError(error2)||!this.#ctxHasUI())return;let message=error2 instanceof Error?error2.message:String(error2);this.#ctx?.ui.notify(`Goal continuation delivery failed: ${message}`,"error")})},delayMs)}async#continueIfEligible(kind,drainFire=!1){this.#timer=void 0,this.#scheduledDueAtMs=void 0,this.#scheduledContinuationKind=void 0,this.#pi.events?.emit(GOAL_CONTINUATION_TIMER_STATE_EVENT,{armed:!1,kind}),this.#waitTicker?.stop();let delayMs=this.#scheduledDelayMs??(kind==="monitor"?GOAL_MONITOR_CONTINUATION_FALLBACK_DELAY_MS:GOAL_USER_GRACE_DELAY_MS),waitedMs=this.#scheduledAtMs===void 0?delayMs:Math.max(0,Date.now()-this.#scheduledAtMs),dueAtMs=this.#scheduledAtMs===void 0?void 0:this.#scheduledAtMs+delayMs,wakeCause=drainFire?"sources-drained":"timer",cache=this.#scheduledCache,iteration=this.#scheduledCacheWarmIteration;this.#scheduledAtMs=void 0,this.#scheduledCache=void 0,this.#scheduledDelayMs=void 0,this.#scheduledCacheWarmIteration=void 0;let ctx=this.#ctx,goal=this.#goal;if(ctx===void 0||goal?.status!=="active"||!ctx.isIdle()||ctx.hasPendingMessages()||kind==="monitor"&&this.#activeWakeSourceCount()===0&&!drainFire)return;let admission=await this.#admitAndQueue(ctx,goal,kind==="monitor"?"monitorDelayed":"userGrace",this.#lastAgentEndMessages);if(kind!=="monitor"||!admission.admitted||iteration===void 0)return;let wakeSources=this.#wakeSourceSnapshot();this.#pi.events?.emit(GOAL_CONTINUATION_RESUMED_EVENT,{goalId:goal.id,delayMs,dueAtMs,waitedMs,wakeCause,iteration,activeMonitorCount:this.#activeWakeSourceCount(),wakeSources,cache}),this.#appendWarmupEntry({phase:"resumed",goalId:goal.id,delayMs,dueAtMs,waitedMs,wakeCause,iteration,activeMonitorCount:this.#activeWakeSourceCount(),wakeSources,...cache!==void 0?{cache}:{}}),(drainFire||admission.goal.status!=="active")&&this.#resetCacheWarmIteration()}async#admitAndQueue(ctx,goal,path15,messages){let input=this.#buildVerdictInput(ctx,goal,path15,messages),verdict=evaluateGoalContinuation({goal,...input}),admittedGoal=await admitAndQueueGoalContinuation(this.#pi,ctx,goal,{input,content:continuationVerdict=>this.#buildContinuationContent(ctx,goal,continuationVerdict),markContinuationPending:this.#markContinuationPending});return admittedGoal===null?(this.#goal=null,this.#cancelTimer(),this.#resetToollessContinuationStreak(),{goal,admitted:!1}):(verdict.kind==="continue"&&input.lastStopReason==="length"&&this.#consecutiveLengthRecoveries.set(goal.id,input.consecutiveLengthRecoveries+1),this.#goal=admittedGoal,admittedGoal.status!=="active"&&(this.#cancelTimer(),this.#resetToollessContinuationStreak()),{goal:admittedGoal,admitted:verdict.kind==="continue"})}#appendWarmupEntry(data){this.#pi.appendEntry?.(GOAL_CACHE_WARMUP_ENTRY_TYPE,data)}#buildVerdictInput(ctx,goal,path15,messages){let lastAssistant=lastAssistantMessage(messages);return{isIdle:ctx.isIdle(),hasPendingMessages:ctx.hasPendingMessages(),path:path15,lastStopReason:lastAssistant?.stopReason,lastTurnWasMalformedToolUse:lastAssistant?.role==="assistant"&&isMalformedToolUseTurn(lastAssistant),consecutiveContinuations:goal.consecutiveContinuations??0,lastContinuationSignature:goal.lastContinuationSignature,currentSignature:buildCurrentGoalContinuationSignature(ctx,goal,lastAssistantText(messages)),consecutiveLengthRecoveries:this.#consecutiveLengthRecoveries.get(goal.id)??0,recentNormalizedOutputHashes:this.#recentNormalizedOutputHashes,toollessContinuationStreak:this.#toollessContinuationStreak,continuationPending:this.#isContinuationPending(),lastTurnStuckOnContextOverflow:isLastTurnStuckOnContextOverflow(ctx,lastAssistant)}}#buildContinuationContent(ctx,goal,verdict){let content=verdict.prompt==="minimal"?buildTruncationRecoveryPrompt():buildContinuationPrompt(goal);if(!verdict.stallNotice)return content;let liveSources=this.#liveWakeSources();if(this.#pi.events?.emit(GOAL_MONITOR_STALL_EVENT,{goalId:goal.id,consecutiveContinuations:this.#toollessContinuationStreak,toolless:!0}),this.#ctxHasUI(ctx)){let context=liveSources.length>0?`while ${liveSources.join(", ")} channels stayed active`:"without tool use";ctx.ui.notify(`Goal continuation repeated ${this.#toollessContinuationStreak} toolless turns ${context} - injected a stall check.`,"info")}return content=`${buildGoalStallNotice(this.#toollessContinuationStreak,{liveSources})}
|
|
1075
|
+
`)}var STOPPED_UNFINISHED_GOAL_STATUSES=["paused","blocked"];function isResumeOfStoppedGoal(ctx,sessionStartReason,goal){return sessionStartReason==="resume"&&goal!==null&&STOPPED_UNFINISHED_GOAL_STATUSES.includes(goal.status)&&ctx.hasUI&&ctx.isIdle()&&!ctx.hasPendingMessages()}async function admitAndQueueGoalContinuation(pi,ctx,goal,options){let verdict=evaluateGoalContinuation({goal,...options.input});if(verdict.kind==="deny")return handleDeniedContinuation(pi,ctx,goal,options.input,verdict.reason);if(options.input.currentSignature===void 0)throw new Error("Cannot queue a goal continuation without a progress signature");let recordedGoal=await recordContinuationDelivered(goalStoreRef(ctx.sessionManager,ctx.cwd),options.input.currentSignature,goal.id,{countUnattended:options.input.path!=="monitorDelayed"});return recordedGoal===null?null:(options.markContinuationPending(),queueHiddenGoalPrompt(pi,options.content(verdict)),recordedGoal)}async function queueGoalContinuation(pi,ctx,goal,options){let signature=buildCurrentGoalContinuationSignature(ctx,goal,lastAssistantTextFromEntries(ctx.sessionManager.getBranch()));return admitAndQueueGoalContinuation(pi,ctx,goal,{input:{isIdle:ctx.isIdle(),hasPendingMessages:ctx.hasPendingMessages(),path:"sessionStart",lastStopReason:void 0,lastTurnWasMalformedToolUse:!1,consecutiveContinuations:goal.consecutiveContinuations??0,lastContinuationSignature:goal.lastContinuationSignature,currentSignature:signature,consecutiveLengthRecoveries:0,recentNormalizedOutputHashes:[],toollessContinuationStreak:0,continuationPending:options.continuationPending,lastTurnStuckOnContextOverflow:isLastTurnStuckOnContextOverflow(ctx,lastAssistantFromEntries(ctx.sessionManager.getBranch()))},content:()=>buildContinuationPrompt(goal,{modelId:ctx.model?.id}),markContinuationPending:options.markContinuationPending})}function buildCurrentGoalContinuationSignature(ctx,goal,lastAssistantText2){let entries=ctx.sessionManager.getBranch(),openTodos=openTodoTaskContents(entries).length,totalTodos=getLatestPhasesFromBranchEntries(entries).reduce((count,phase)=>count+phase.tasks.length,0);return buildGoalContinuationSignature(goal,openTodos,totalTodos,hashAssistantText(lastAssistantText2))}function lastAssistantText(messages){for(let index=messages.length-1;index>=0;index--){let message=messages[index];if(message?.role==="assistant")return textContent(message)}return""}function lastAssistantTextFromEntries(entries){let assistant=lastAssistantFromEntries(entries);return assistant===void 0?"":textContent(assistant)}function lastAssistantFromEntries(entries){for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry?.type==="message"&&entry.message.role==="assistant")return entry.message}}function isLastTurnStuckOnContextOverflow(ctx,lastAssistant){return lastAssistant!==void 0&&isTurnStuckOnContextOverflow(lastAssistant,ctx.model?.contextWindow??0)}function textContent(message){return message.content.filter(content=>content.type==="text").map(content=>content.text).join(`
|
|
1076
|
+
`)}async function handleDeniedContinuation(pi,ctx,goal,input,reason){let blockedReason=blockedReasonForContinuationGuard(reason);if(blockedReason===void 0)return goal;let blocked=await updateGoal(goalStoreRef(ctx.sessionManager,ctx.cwd),{status:"blocked",reason:blockedReason},"model");return ctx.hasUI&&ctx.ui.notify(continuationCapRecoveryHint(blockedReason),"warning"),pi.events?.emit("goal_continuation_guard_tripped",{goalId:goal.id,reason,count:input.consecutiveContinuations,unattendedContinuations:goal.unattendedContinuations??0}),blocked}function blockedReasonForContinuationGuard(reason){switch(reason){case"cap":return CONTINUATION_CAP_BLOCKED_REASON;case"unattended":return UNATTENDED_CONTINUATION_BLOCKED_REASON;case"repetition":return REPETITION_BLOCKED_REASON;case"length-exhausted":return LENGTH_EXHAUSTED_BLOCKED_REASON;case"context-overflow":return CONTEXT_OVERFLOW_BLOCKED_REASON;case"not-eligible":case"single-flight":case"stale":return}}function queueHiddenGoalPrompt(pi,content){pi.sendMessage({customType:GOAL_CONTINUATION_MESSAGE_TYPE,content,display:!1},{triggerTurn:!0,deliverAs:"followUp"})}function subscribeGoalChannelState(events,callbacks){return[events.on(TERMINAL_MONITOR_STATE_EVENT,data=>{isTerminalMonitorStateEvent(data)&&callbacks.onWakeSource("terminal-monitors",data.activeCount)}),events.on(WAKE_SOURCE_STATE_EVENT,data=>{isWakeSourceStateEvent(data)&&callbacks.onWakeSource(data.source,data.activeCount,data)}),events.on(CONTINUATION_HOLD_STATE_EVENT,data=>{isContinuationHoldStateEvent(data)&&callbacks.onContinuationHold(data.source,data.active)})]}function findParkedGoalWait(entries,goalId){for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry!==void 0){if(entry.type==="message"||entry.type==="custom_message")return;if(!(entry.type!=="custom"||entry.customType!==GOAL_CACHE_WARMUP_ENTRY_TYPE))return parseParkedWait(entry.data,goalId)}}}function parseParkedWait(data,goalId){if(typeof data!="object"||data===null)return;let phase=Reflect.get(data,"phase"),entryGoalId=Reflect.get(data,"goalId"),iteration=Reflect.get(data,"iteration"),delayMs=Reflect.get(data,"delayMs"),dueAtMs=Reflect.get(data,"dueAtMs");if(phase!=="scheduled"||entryGoalId!==goalId||typeof iteration!="number"||!Number.isInteger(iteration)||iteration<1||typeof delayMs!="number"||!Number.isFinite(delayMs)||delayMs<=0||typeof dueAtMs!="number"||!Number.isFinite(dueAtMs))return;let cache=parseCache(Reflect.get(data,"cache"));return{iteration,delayMs,dueAtMs,...cache!==void 0?{cache}:{}}}function parseCache(value2){if(typeof value2!="object"||value2===null)return;let cachedTokens=Reflect.get(value2,"cachedTokens");if(typeof cachedTokens!="number"||!Number.isFinite(cachedTokens))return;let ttlSeconds=Reflect.get(value2,"ttlSeconds"),estimatedSavedUsd=Reflect.get(value2,"estimatedSavedUsd"),cacheLifetime=Reflect.get(value2,"cacheLifetime");return{cachedTokens,...cacheLifetime==="best-effort"?{cacheLifetime}:{},...typeof ttlSeconds=="number"&&Number.isFinite(ttlSeconds)?{ttlSeconds}:{},...typeof estimatedSavedUsd=="number"&&Number.isFinite(estimatedSavedUsd)?{estimatedSavedUsd}:{}}}var USAGE_FIELDS=["input","output","cacheRead","cacheWrite","totalTokens"];function emptyUsage2(){return{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0}}function collectAssistantUsage(messages){let usage3=emptyUsage2();for(let message of messages)addAssistantMessageUsage(usage3,message);return usage3}var TurnUsageTracker=class{constructor(){this.pending=emptyUsage2(),this.flushed=emptyUsage2()}reset(){this.pending=emptyUsage2(),this.flushed=emptyUsage2()}noteMessageEnd(message){addAssistantMessageUsage(this.pending,message)}takePending(){let taken=this.pending;this.pending=emptyUsage2();for(let field2 of USAGE_FIELDS)this.flushed[field2]+=taken[field2];return taken}discardPending(){this.takePending()}takeRemaining(agentRunMessages){let collected=collectAssistantUsage(agentRunMessages),remaining=emptyUsage2();for(let field2 of USAGE_FIELDS)remaining[field2]=Math.max(0,collected[field2]-this.flushed[field2]),this.flushed[field2]=Math.max(this.flushed[field2],collected[field2]);return this.pending=emptyUsage2(),remaining}};function addAssistantMessageUsage(target,message){if(!(!isRecord24(message)||message.role!=="assistant"||!isRecord24(message.usage)))for(let field2 of USAGE_FIELDS){let value2=message.usage[field2];typeof value2=="number"&&Number.isFinite(value2)&&(target[field2]+=value2)}}var ASK_USER_WAKE_SOURCE="ask-user",ASK_USER_DEFAULT_TIMEOUT_MINUTES=30,GOAL_CONTINUATION_SCHEDULED_EVENT="goal_continuation_scheduled",GOAL_CONTINUATION_RESUMED_EVENT="goal_continuation_resumed",GOAL_CONTINUATION_TIMER_STATE_EVENT="goal_continuation_timer_state",GOAL_MONITOR_STALL_EVENT="goal_monitor_continuation_stall",MonitorAwareGoalContinuation=class{#pi;#isContinuationPending;#markContinuationPending;#waitTicker;#wakeSources=new Map;#hasStarted=!1;#ctx;#goal=null;#timer;#scheduledContinuationKind;#channelStateUnsubscribers=[];#lastAgentEndMessages=[];#consecutiveLengthRecoveries=new Map;#recentNormalizedOutputHashes=[];#toollessContinuationStreak=0;#toollessStreakGoalId=null;#endedTurnWasUserInitiated=!1;#lastTurnUsage;#scheduledAtMs;#scheduledDueAtMs;#scheduledCache;#scheduledDelayMs;#askUserDeadlineAtMs;#cacheWarmIteration=0;#scheduledCacheWarmIteration;#heldTimer;#directInputHolds=new Set;#pendingSystemRecovery;#pendingProviderRecovery;constructor(pi,isContinuationPending=()=>!1,markContinuationPending=()=>{},waitTicker){this.#pi=pi,this.#isContinuationPending=isContinuationPending,this.#markContinuationPending=markContinuationPending,this.#waitTicker=waitTicker,this.#subscribeToChannelState()}start(ctx){this.#cancelTimer(),this.#ctx=ctx,this.#hasStarted?this.#clearWakeSources():this.#hasStarted=!0,this.#goal=null,this.#lastAgentEndMessages=[],this.#directInputHolds.clear(),this.#resetContinuationState()}async afterAgentEnd(options){options.goal?.id!==this.#goal?.id&&this.#resetContinuationState(),this.#ctx=options.ctx,this.#goal=options.goal,this.#lastAgentEndMessages=options.messages,this.#lastTurnUsage=collectAssistantUsage([...options.messages]),this.#resetLengthRecoveryAfterCleanStop(options.goal,options.messages);let turnUsedTools=continuationTurnUsedTools(options.messages);if(this.#recordAssistantOutput(options.messages,turnUsedTools),options.goal?.status!=="active")return this.#cancelTimer(),this.#resetContinuationState(),options.goal;this.#recordToollessContinuationTurn(options.goal,turnUsedTools);let immediateInput=this.#buildVerdictInput(options.ctx,options.goal,"immediate",options.messages),goal=!this.#endedTurnWasUserInitiated&&(turnUsedTools||hasGoalContinuationProgress(immediateInput))?await resetContinuationStreak(goalStoreRef(options.ctx.sessionManager,options.ctx.cwd))??options.goal:options.goal;this.#goal=goal;let immediateVerdict=evaluateGoalContinuation({goal,...this.#buildVerdictInput(options.ctx,goal,"immediate",options.messages)});if(this.#endedTurnWasUserInitiated){if(this.#endedTurnWasUserInitiated=!1,this.#cancelTimer(),immediateVerdict.kind==="continue")return this.#schedule(goal,"userGrace"),goal;switch(immediateVerdict.reason){case"not-eligible":case"single-flight":case"stale":return goal;case"cap":case"repetition":case"length-exhausted":case"unattended":return(await this.#admitAndQueue(options.ctx,goal,"immediate",options.messages)).goal}}return immediateVerdict.kind==="deny"&&immediateVerdict.reason==="not-eligible"?goal:this.#activeWakeSourceCount()===0?(this.#cancelTimer(),(await this.#admitAndQueue(options.ctx,goal,"immediate",options.messages)).goal):(this.#schedule(goal,"monitor"),goal)}async afterSystemAbort(options){return this.noteContinuationStarted(),options.goal?.id!==this.#goal?.id&&this.#resetContinuationState(),this.#pendingSystemRecovery=void 0,this.#ctx=options.ctx,this.#goal=options.goal,this.#lastAgentEndMessages=options.messages,this.#lastTurnUsage=collectAssistantUsage([...options.messages]),options.goal?.status!=="active"?(this.#resetContinuationState(),options.goal):(options.willRetry||(this.#activeWakeSourceCount()>0?this.#schedule(options.goal,"monitor"):lastAssistantMessage(options.messages)?.stopReason==="error"&&(this.#pendingSystemRecovery=options)),options.goal)}async afterProviderFailure(options){return this.noteContinuationStarted(),options.goal?.id!==this.#goal?.id&&this.#resetContinuationState(),this.#pendingProviderRecovery=void 0,this.#ctx=options.ctx,this.#goal=options.goal,this.#lastAgentEndMessages=options.messages,this.#lastTurnUsage=collectAssistantUsage([...options.messages]),options.goal?.status!=="active"?(this.#resetContinuationState(),options.goal):(options.willRetry||(this.#pendingProviderRecovery=options),options.goal)}async afterAgentSettled(){let pendingSystem=this.#pendingSystemRecovery,pendingProvider=this.#pendingProviderRecovery;if(this.#pendingSystemRecovery=void 0,this.#pendingProviderRecovery=void 0,pendingSystem!==void 0&&pendingSystem.goal!==null&&pendingSystem.event.abortSource!=="user")return(await this.#admitAndQueue(pendingSystem.ctx,pendingSystem.goal,"systemRecovery",pendingSystem.messages)).goal;if(!(pendingProvider===void 0||pendingProvider.goal===null||pendingProvider.event.abortSource==="user"))return(await this.#admitAndQueue(pendingProvider.ctx,pendingProvider.goal,"providerRecovery",pendingProvider.messages)).goal}syncGoal(goal){goal?.id!==this.#goal?.id&&this.#resetContinuationState(),this.#goal=goal,goal?.status!=="active"&&(this.#cancelTimer(),this.#resetContinuationState())}hasActiveWakeSources(){return this.#activeWakeSourceCount()>0}rearmMonitorBackstop(goal){goal.status!=="active"||this.#activeWakeSourceCount()===0||(this.#goal=goal,this.#schedule(goal,"monitor",!1,this.#parkedWait(goal.id)))}#parkedWait(goalId){try{return findParkedGoalWait(this.#ctx?.sessionManager?.getBranch()??[],goalId)}catch(error2){if(isStaleExtensionContextError(error2))return;throw error2}}holdDirectInput(inputId){if(this.#directInputHolds.has(inputId)||(this.#directInputHolds.add(inputId),this.#directInputHolds.size!==1||this.#timer===void 0||this.#scheduledContinuationKind===void 0))return;let heldAtMs=Date.now();this.#heldTimer={kind:this.#scheduledContinuationKind,remainingMs:Math.max(0,(this.#scheduledDueAtMs??heldAtMs)-heldAtMs),heldAtMs,totalMs:this.#scheduledDelayMs??GOAL_USER_GRACE_DELAY_MS,drainFire:!1},clearTimeout(this.#timer),this.#timer=void 0,this.#scheduledDueAtMs=void 0,this.#waitTicker?.stop()}resolveDirectInput(inputId,accepted){if(!this.#directInputHolds.delete(inputId))return;if(accepted){this.#heldTimer=void 0,this.noteUserPrompt();return}if(this.#directInputHolds.size>0||this.#heldTimer===void 0)return;let held=this.#heldTimer;this.#heldTimer=void 0;let elapsedWhileHeldMs=Math.max(0,Date.now()-held.heldAtMs);this.#armTimer(held.kind,Math.max(0,held.remainingMs-elapsedWhileHeldMs),held.totalMs,held.drainFire)}noteUserPrompt(){this.#cancelTimer(),this.#pendingProviderRecovery=void 0,this.#endedTurnWasUserInitiated=!0,this.#resetContinuationState()}noteContinuationStarted(){this.#endedTurnWasUserInitiated=!1}dispose(){this.#cancelTimer();for(let unsubscribe of this.#channelStateUnsubscribers)unsubscribe();this.#channelStateUnsubscribers=[],this.#ctx=void 0,this.#goal=null,this.#clearWakeSources(),this.#lastAgentEndMessages=[],this.#directInputHolds.clear(),this.#resetContinuationState()}#schedule(goal,kind,repark=!1,parked){if(this.#scheduledContinuationKind!==void 0)return;let askUserWaitMs=kind==="monitor"?this.#askUserWaitMs():void 0,delayMs=kind==="monitor"?parked?.delayMs??askUserWaitMs??resolveGoalMonitorContinuationDelayMs(resolveGoalBackstopMaxSecondsForCache(this.#ctx?.getPromptCacheGoalBackstopMaxSeconds?.(),resolveGoalPromptCacheLifetime(this.#ctx?.model,process.env))):GOAL_USER_GRACE_DELAY_MS;this.#scheduledDelayMs=delayMs;let remainingMs2=delayMs;if(kind==="monitor"){parked!==void 0?this.#cacheWarmIteration=parked.iteration:repark||(this.#cacheWarmIteration+=1),this.#scheduledCacheWarmIteration=this.#cacheWarmIteration;let iteration=this.#scheduledCacheWarmIteration,cache=parked!==void 0?parked.cache:estimateCacheWarmMetrics(this.#ctx?.model,process.env,this.#lastTurnUsage),wakeSources=this.#wakeSourceSnapshot();this.#scheduledCache=cache,this.#scheduledAtMs=parked!==void 0?parked.dueAtMs-delayMs:Date.now(),parked!==void 0&&(remainingMs2=Math.max(0,parked.dueAtMs-Date.now()));let scheduleData=createGoalCacheWarmScheduleData({goalId:goal.id,delayMs,scheduledAtMs:this.#scheduledAtMs,iteration,activeMonitorCount:this.#activeWakeSourceCount(),wakeSources,...cache!==void 0?{cache}:{}});this.#pi.events?.emit(GOAL_CONTINUATION_SCHEDULED_EVENT,scheduleData),!repark&&parked===void 0&&this.#appendWarmupEntry({phase:"scheduled",...scheduleData})}else this.#scheduledAtMs=void 0,this.#scheduledCache=void 0,this.#scheduledCacheWarmIteration=void 0;if(this.#scheduledContinuationKind=kind,this.#pi.events?.emit(GOAL_CONTINUATION_TIMER_STATE_EVENT,{armed:!0,kind}),this.#directInputHolds.size>0){this.#heldTimer={kind,remainingMs:remainingMs2,heldAtMs:Date.now(),totalMs:delayMs,drainFire:!1};return}this.#armTimer(kind,remainingMs2,delayMs)}#ctxHasUI(ctx=this.#ctx){try{return ctx?.hasUI===!0}catch(error2){if(isStaleExtensionContextError(error2))return!1;throw error2}}#armTimer(kind,delayMs,totalMs,drainFire=!1){this.#scheduledDueAtMs=Date.now()+delayMs;let ctx=this.#ctx;ctx!==void 0&&this.#ctxHasUI(ctx)&&this.#waitTicker?.sync(ctx,{kind,remainingMs:delayMs,totalMs,channelCounts:this.#wakeSourceSnapshot()}),this.#timer=setTimeout(()=>{this.#continueIfEligible(kind,drainFire).catch(error2=>{if(isStaleExtensionContextError(error2)||!this.#ctxHasUI())return;let message=error2 instanceof Error?error2.message:String(error2);this.#ctx?.ui.notify(`Goal continuation delivery failed: ${message}`,"error")})},delayMs)}async#continueIfEligible(kind,drainFire=!1){this.#timer=void 0,this.#scheduledDueAtMs=void 0,this.#scheduledContinuationKind=void 0,this.#pi.events?.emit(GOAL_CONTINUATION_TIMER_STATE_EVENT,{armed:!1,kind}),this.#waitTicker?.stop();let delayMs=this.#scheduledDelayMs??(kind==="monitor"?GOAL_MONITOR_CONTINUATION_FALLBACK_DELAY_MS:GOAL_USER_GRACE_DELAY_MS),waitedMs=this.#scheduledAtMs===void 0?delayMs:Math.max(0,Date.now()-this.#scheduledAtMs),dueAtMs=this.#scheduledAtMs===void 0?void 0:this.#scheduledAtMs+delayMs,wakeCause=drainFire?"sources-drained":"timer",cache=this.#scheduledCache,iteration=this.#scheduledCacheWarmIteration;this.#scheduledAtMs=void 0,this.#scheduledCache=void 0,this.#scheduledDelayMs=void 0,this.#scheduledCacheWarmIteration=void 0;let ctx=this.#ctx,goal=this.#goal;if(ctx===void 0||goal?.status!=="active"||!ctx.isIdle()||ctx.hasPendingMessages()||kind==="monitor"&&this.#activeWakeSourceCount()===0&&!drainFire)return;let admission=await this.#admitAndQueue(ctx,goal,kind==="monitor"?"monitorDelayed":"userGrace",this.#lastAgentEndMessages);if(kind!=="monitor"||!admission.admitted||iteration===void 0)return;let wakeSources=this.#wakeSourceSnapshot();this.#pi.events?.emit(GOAL_CONTINUATION_RESUMED_EVENT,{goalId:goal.id,delayMs,dueAtMs,waitedMs,wakeCause,iteration,activeMonitorCount:this.#activeWakeSourceCount(),wakeSources,cache}),this.#appendWarmupEntry({phase:"resumed",goalId:goal.id,delayMs,dueAtMs,waitedMs,wakeCause,iteration,activeMonitorCount:this.#activeWakeSourceCount(),wakeSources,...cache!==void 0?{cache}:{}}),(drainFire||admission.goal.status!=="active")&&this.#resetCacheWarmIteration()}async#admitAndQueue(ctx,goal,path15,messages){let input=this.#buildVerdictInput(ctx,goal,path15,messages),verdict=evaluateGoalContinuation({goal,...input}),admittedGoal=await admitAndQueueGoalContinuation(this.#pi,ctx,goal,{input,content:continuationVerdict=>this.#buildContinuationContent(ctx,goal,continuationVerdict),markContinuationPending:this.#markContinuationPending});return admittedGoal===null?(this.#goal=null,this.#cancelTimer(),this.#resetToollessContinuationStreak(),{goal,admitted:!1}):(verdict.kind==="continue"&&input.lastStopReason==="length"&&this.#consecutiveLengthRecoveries.set(goal.id,input.consecutiveLengthRecoveries+1),this.#goal=admittedGoal,admittedGoal.status!=="active"&&(this.#cancelTimer(),this.#resetToollessContinuationStreak()),{goal:admittedGoal,admitted:verdict.kind==="continue"})}#appendWarmupEntry(data){this.#pi.appendEntry?.(GOAL_CACHE_WARMUP_ENTRY_TYPE,data)}#buildVerdictInput(ctx,goal,path15,messages){let lastAssistant=lastAssistantMessage(messages);return{isIdle:ctx.isIdle(),hasPendingMessages:ctx.hasPendingMessages(),path:path15,lastStopReason:lastAssistant?.stopReason,lastTurnWasMalformedToolUse:lastAssistant?.role==="assistant"&&isMalformedToolUseTurn(lastAssistant),consecutiveContinuations:goal.consecutiveContinuations??0,lastContinuationSignature:goal.lastContinuationSignature,currentSignature:buildCurrentGoalContinuationSignature(ctx,goal,lastAssistantText(messages)),consecutiveLengthRecoveries:this.#consecutiveLengthRecoveries.get(goal.id)??0,recentNormalizedOutputHashes:this.#recentNormalizedOutputHashes,toollessContinuationStreak:this.#toollessContinuationStreak,continuationPending:this.#isContinuationPending(),lastTurnStuckOnContextOverflow:isLastTurnStuckOnContextOverflow(ctx,lastAssistant)}}#buildContinuationContent(ctx,goal,verdict){let content=verdict.prompt==="minimal"?buildTruncationRecoveryPrompt():buildContinuationPrompt(goal,{modelId:ctx.model?.id});if(!verdict.stallNotice)return content;let liveSources=this.#liveWakeSources();if(this.#pi.events?.emit(GOAL_MONITOR_STALL_EVENT,{goalId:goal.id,consecutiveContinuations:this.#toollessContinuationStreak,toolless:!0}),this.#ctxHasUI(ctx)){let context=liveSources.length>0?`while ${liveSources.join(", ")} channels stayed active`:"without tool use";ctx.ui.notify(`Goal continuation repeated ${this.#toollessContinuationStreak} toolless turns ${context} - injected a stall check.`,"info")}return content=`${buildGoalStallNotice(this.#toollessContinuationStreak,{liveSources})}
|
|
1076
1077
|
|
|
1077
1078
|
${content}`,content}#recordAssistantOutput(messages,turnUsedTools){if(turnUsedTools){this.#recentNormalizedOutputHashes=[];return}let text2=lastAssistantText(messages);normalizeAssistantText(text2).length!==0&&(this.#recentNormalizedOutputHashes=[...this.#recentNormalizedOutputHashes,hashAssistantText(text2)].slice(-3))}#recordToollessContinuationTurn(goal,turnUsedTools){if(goal.id!==this.#toollessStreakGoalId&&(this.#toollessStreakGoalId=goal.id,this.#toollessContinuationStreak=0),!this.#endedTurnWasUserInitiated){if(turnUsedTools){this.#toollessContinuationStreak=0;return}this.#toollessContinuationStreak+=1}}#resetLengthRecoveryAfterCleanStop(goal,messages){goal===null||lastAssistantMessage(messages)?.stopReason!=="stop"||this.#consecutiveLengthRecoveries.delete(goal.id)}#subscribeToChannelState(){let events=this.#pi.events;events!==void 0&&this.#channelStateUnsubscribers.push(...subscribeGoalChannelState(events,{onWakeSource:(source2,activeCount,event)=>this.#setWakeSourceCount(source2,activeCount,event?.items),onContinuationHold:(source2,active)=>{let inputId=`external:${source2}`;active?this.holdDirectInput(inputId):this.resolveDirectInput(inputId,!1)}}))}#askUserWaitMs(){if((this.#wakeSources.get(ASK_USER_WAKE_SOURCE)??0)<=0)return;let remainingMs2=(this.#askUserDeadlineAtMs??0)-Date.now(),waitMs=remainingMs2>0?remainingMs2:this.#askUserIdleTimeoutMs();return resolveGoalMonitorContinuationDelayMs(waitMs/1e3)}#askUserIdleTimeoutMs(){let minutes=this.#ctx?.getAskUserSettings?.().timeoutMinutes;return(typeof minutes=="number"&&Number.isFinite(minutes)&&minutes>0?minutes:ASK_USER_DEFAULT_TIMEOUT_MINUTES)*6e4}#noteAskUserWait(activeCount,items){if(activeCount<=0){this.#askUserDeadlineAtMs=void 0;return}let deadlines=items?.flatMap(item=>item.deadlineAtMs===void 0?[]:[item.deadlineAtMs])??[];if(deadlines.length>0){this.#askUserDeadlineAtMs=Math.min(...deadlines);return}let previousCount=this.#wakeSources.get(ASK_USER_WAKE_SOURCE)??0;(activeCount>previousCount||this.#askUserDeadlineAtMs===void 0)&&(this.#askUserDeadlineAtMs=Date.now()+this.#askUserIdleTimeoutMs())}#clearWakeSources(){this.#wakeSources.clear(),this.#askUserDeadlineAtMs=void 0}#setWakeSourceCount(source2,activeCount,items){let previousTotal=this.#activeWakeSourceCount(),previousDeadline=this.#askUserDeadlineAtMs;source2===ASK_USER_WAKE_SOURCE&&this.#noteAskUserWait(activeCount,items),this.#wakeSources.set(source2,activeCount);let nextTotal=this.#activeWakeSourceCount();if(previousTotal>0&&nextTotal===0){this.#scheduledContinuationKind==="monitor"?this.#armDrainFire():this.#resetCacheWarmIteration(),this.#resetToollessContinuationStreak();return}if(this.#scheduledContinuationKind==="monitor"){if(previousDeadline!==this.#askUserDeadlineAtMs&&this.#goal!==null){this.#cancelTimer(),this.#schedule(this.#goal,"monitor",!0);return}this.#waitTicker?.setChannelCounts(this.#wakeSourceSnapshot())}}#armDrainFire(){if(this.#directInputHolds.size>0){this.#heldTimer={kind:"monitor",remainingMs:1e3,heldAtMs:Date.now(),totalMs:1e3,drainFire:!0};return}this.#timer!==void 0&&clearTimeout(this.#timer),this.#timer=void 0,this.#scheduledDueAtMs=void 0,this.#waitTicker?.stop(),this.#armTimer("monitor",1e3,1e3,!0)}#activeWakeSourceCount(){let total=0;for(let count of this.#wakeSources.values())total+=count;return total}#wakeSourceSnapshot(){return Object.fromEntries([...this.#wakeSources.entries()].sort(([left],[right])=>left.localeCompare(right)))}#liveWakeSources(){return[...this.#wakeSources.entries()].filter(([,count])=>count>0).map(([source2])=>source2).sort()}#resetContinuationState(){this.#pendingSystemRecovery=void 0,this.#pendingProviderRecovery=void 0,this.#consecutiveLengthRecoveries.clear(),this.#recentNormalizedOutputHashes=[],this.#resetToollessContinuationStreak(),this.#resetCacheWarmIteration()}#resetCacheWarmIteration(){this.#cacheWarmIteration=0,this.#scheduledCacheWarmIteration=void 0}#resetToollessContinuationStreak(){this.#toollessContinuationStreak=0,this.#toollessStreakGoalId=null}#cancelTimer(){let kind=this.#scheduledContinuationKind;this.#scheduledAtMs=void 0,this.#scheduledDueAtMs=void 0,this.#scheduledCache=void 0,this.#scheduledDelayMs=void 0,this.#scheduledCacheWarmIteration=void 0,this.#heldTimer=void 0,this.#timer!==void 0&&clearTimeout(this.#timer),this.#timer=void 0,this.#scheduledContinuationKind=void 0,kind!==void 0&&this.#pi.events?.emit(GOAL_CONTINUATION_TIMER_STATE_EVENT,{armed:!1,kind}),this.#waitTicker?.stop()}};async function reengageGoalAfterReload(options){let{ctx,goal,monitor}=options;if(goal.status!=="active")return"skipped-inactive";if(monitor.hasActiveWakeSources())return monitor.rearmMonitorBackstop(goal),"backstop-rearmed";let trailingContinuations=options.countTrailingContinuations();return trailingContinuations>=GOAL_CONTINUATION_CAP?(ctx.ui.notify(`Goal auto-continuation suppressed for this resumed session (${trailingContinuations} historical continuations). Send a message to resume.`,"info"),"suppressed-flood"):(await options.queueContinuation(),"continuation-queued")}var GOAL_STORE_CHANGED_EVENT="goal_store_changed";function isGoalStoreChangedEvent(data){return typeof data=="object"&&data!==null&&"threadId"in data&&typeof data.threadId=="string"&&data.threadId.length>0}var TODO_OWED_CUSTOM_TYPE="senpi.todo-owed",TODO_OWED_REMINDER_EVENT="todo_owed_reminder",TODO_OWED_CHAIN_LIMIT=2,TODO_OWED_SECOND_PREFIX="Second and final reminder. ",NON_INTERACTIVE_MODES=new Set(["print","json"]),ASK_USER_TOOLS=new Set(Object.values(TOOL_NAMES)),QUESTION_SENTENCE_END=/[?\uFF1F]["'`*_)\]}\u2019\u201D]*(?:\s|$)/u;function buildTodoOwedReminder(anchors,final){return`<system-reminder>
|
|
1078
1079
|
${final?TODO_OWED_SECOND_PREFIX:""}The turn ended with open todo work and no question to the user. Ask: ${anchors.ask}. Now: ${anchors.now}. Next: ${anchors.next}. Either continue the next open task now with real tool calls, or mark it done/dropped via the todo tool and tell the user in one sentence why you stopped. Do not restate the plan.
|
|
@@ -2297,12 +2298,12 @@ ${TASK_MANAGEMENT_SECTION}`;if(event.preview)return{systemPrompt};let branchEntr
|
|
|
2297
2298
|
`,start),line=(newlineIndex===-1?text2.slice(start):text2.slice(start,newlineIndex)).trim();if(line.length>0&&lines.push(line),newlineIndex===-1)break;start=newlineIndex+1}return lines}function parseWebfetchArgs(args){if(typeof args!="object"||args===null)return{url:""};let webfetchArgs={url:"url"in args&&typeof args.url=="string"?args.url:""};return"format"in args&&typeof args.format=="string"&&(webfetchArgs.format=args.format),"timeout"in args&&typeof args.timeout=="number"&&(webfetchArgs.timeout=args.timeout),webfetchArgs}function formatProgress2(details){let url=shorten3(details.url,URL_BUDGET);if(details.phase==="downloading"){let downloaded=formatBytes(details.bytesRead??0),total=details.totalBytes===void 0?"":` / ${formatBytes(details.totalBytes)}`;return`Downloading ${url}: ${downloaded}${total}`}return details.phase==="converting"?`Converting ${url} to ${details.format}`:`Fetching ${url} as ${details.format} (${details.timeoutSeconds}s)`}function isWebfetchProgressDetails(details){return typeof details=="object"&&details!==null&&"phase"in details&&(details.phase==="fetching"||details.phase==="downloading"||details.phase==="converting")}function isWebfetchDetails(details){return typeof details=="object"&&details!==null&&"status"in details&&typeof details.status=="number"}function previewText(text2,theme2){let lines=collectNonEmptyTrimmedLines(text2,PREVIEW_LINES);return lines.length===0?[theme2.fg("dim"," empty response")]:lines.map(line=>theme2.fg("toolOutput",` ${truncateToWidth(line,PREVIEW_WIDTH)}`))}function shorten3(value2,max){return value2.length<=max?value2:`${value2.slice(0,max-1)}\u2026`}function formatBytes(bytes){return bytes<1024?`${bytes} B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)} KB`:`${(bytes/(1024*1024)).toFixed(1)} MB`}var loadContentModule=()=>import("./content-JXYAIP74.js");async function htmlToMarkdown(html,url){return(await loadContentModule()).htmlToMarkdown(html,url)}async function htmlToText(html,url){return(await loadContentModule()).htmlToText(html,url)}var import_undici=__toESM(require_undici(),1);var InvalidWebfetchUrlError=class extends Error{constructor(message){super(message),this.name="InvalidWebfetchUrlError"}},WebfetchTimeoutError=class extends Error{constructor(message){super(message),this.name="WebfetchTimeoutError"}},WebfetchResponseTooLargeError=class extends Error{constructor(message){super(message),this.name="WebfetchResponseTooLargeError"}},WebfetchAbortError=class extends Error{constructor(message){super(message),this.name="WebfetchAbortError"}};async function discardBody(body,maxBytes,signal){body.on?.("error",()=>{});try{if(typeof body.dump=="function"){await body.dump(signal?{limit:1024,signal}:{limit:1024});return}await drainBody(body,maxBytes,signal)}catch{}finally{body.destroy()}}async function drainBody(body,maxBytes,signal){let drained=0,iterator=body[Symbol.asyncIterator]();for(;;){let result3=await nextChunk(iterator,signal);if(!result3||result3.done||(drained+=toUint8Array(result3.value).length,drained>maxBytes))return}}async function nextChunk(iterator,signal){if(!signal)return iterator.next();if(signal.aborted)return;let resolveAbort=()=>{},aborted=new Promise(resolve45=>{resolveAbort=()=>resolve45(void 0)}),onAbort=()=>resolveAbort();signal.addEventListener("abort",onAbort,{once:!0});try{return await Promise.race([iterator.next(),aborted])}finally{signal.removeEventListener("abort",onAbort)}}function toUint8Array(chunk){if(chunk instanceof Uint8Array)return chunk;if(typeof chunk=="string")return new TextEncoder().encode(chunk);throw new Error("Unexpected response body chunk")}var MAX_RESPONSE_SIZE_BYTES=5*1024*1024,DEFAULT_TIMEOUT_SECONDS=30,MAX_TIMEOUT_SECONDS2=120,MAX_REDIRECTS=20,BROWSER_USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",CHROME_MAJOR_VERSION="143",REDIRECT_STATUSES=new Set([301,302,303,307,308]);async function fetchUrl(options){validateUrl(options.url);let timeoutSeconds=clampTimeout(options.timeoutSeconds),timeoutMs=timeoutSeconds*1e3,controller=new AbortController,timeout=setTimeout(()=>controller.abort(new WebfetchTimeoutError(`Request timed out after ${timeoutSeconds}s`)),timeoutMs),removeAbortForwarder=forwardAbort(options.signal,controller);try{let response=await requestUrl({url:options.url,format:options.format,signal:controller.signal,timeoutMs});return await readHttpResponse(response,controller.signal,options.onProgress)}finally{clearTimeout(timeout),removeAbortForwarder()}}function validateUrl(url){if(!url.startsWith("http://")&&!url.startsWith("https://"))throw new InvalidWebfetchUrlError("URL must start with http:// or https://");try{new URL(url)}catch{throw new InvalidWebfetchUrlError(`Invalid URL: ${url}`)}}function clampTimeout(timeoutSeconds){return timeoutSeconds===void 0||!Number.isFinite(timeoutSeconds)||timeoutSeconds<=0?DEFAULT_TIMEOUT_SECONDS:Math.min(Math.ceil(timeoutSeconds),MAX_TIMEOUT_SECONDS2)}function buildAcceptHeader(format2){switch(format2){case"markdown":return"text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1";case"text":return"text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1";case"html":return"text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1"}}function buildHeaders2(format2){return{Accept:buildAcceptHeader(format2),"Accept-Language":"en-US,en;q=0.9","Sec-CH-UA":`"Google Chrome";v="${CHROME_MAJOR_VERSION}", "Chromium";v="${CHROME_MAJOR_VERSION}", "Not A(Brand";v="24"`,"Sec-CH-UA-Mobile":"?0","Sec-CH-UA-Platform":'"Windows"',"Sec-Fetch-Dest":"document","Sec-Fetch-Mode":"navigate","Sec-Fetch-Site":"none","Sec-Fetch-User":"?1","Upgrade-Insecure-Requests":"1","User-Agent":BROWSER_USER_AGENT}}async function requestUrl(options){let headers=buildHeaders2(options.format),currentUrl=options.url;for(let redirectCount=0;redirectCount<=MAX_REDIRECTS;redirectCount+=1){let response=await(0,import_undici.request)(currentUrl,{method:"GET",headers,signal:options.signal,headersTimeout:options.timeoutMs,bodyTimeout:options.timeoutMs});if(!REDIRECT_STATUSES.has(response.statusCode))return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};let location=getHeader(response.headers,"location");if(!location)return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};if(redirectCount===MAX_REDIRECTS)return{url:currentUrl,status:response.statusCode,statusText:response.statusText,headers:response.headers,body:response.body};await discardBody(response.body,MAX_RESPONSE_SIZE_BYTES,options.signal),currentUrl=new URL(location,currentUrl).toString()}throw new WebfetchAbortError("Redirect resolution aborted")}async function readHttpResponse(response,signal,onProgress){await rejectOversizedContentLength(response,signal);let body=await readResponseBody(response,signal,onProgress);return{url:response.url,status:response.status,statusText:response.statusText,contentType:getHeader(response.headers,"content-type"),bytes:body.length,body,truncated:body.length===MAX_RESPONSE_SIZE_BYTES}}async function rejectOversizedContentLength(response,signal){let contentLength=getHeader(response.headers,"content-length");if(contentLength&&Number.parseInt(contentLength,10)>MAX_RESPONSE_SIZE_BYTES)throw await discardBody(response.body,MAX_RESPONSE_SIZE_BYTES,signal),new WebfetchResponseTooLargeError("Response too large (exceeds 5MB limit)")}function getHeader(headers,name){let value2=headers[name.toLowerCase()];return Array.isArray(value2)?value2.join(", "):value2??""}async function readResponseBody(response,signal,onProgress){let chunks=[],totalBytes=parseContentLength(response),total=0;try{for await(let chunk of response.body){if(signal.aborted)throw response.body.destroy(),new WebfetchAbortError("Request aborted");let bytes=toUint8Array(chunk);if(chunks.push(bytes),total+=bytes.length,total>MAX_RESPONSE_SIZE_BYTES)throw response.body.destroy(),new WebfetchResponseTooLargeError("Response too large (exceeds 5MB limit)");onProgress?.(total,totalBytes)}}catch(error2){throw signal.aborted?new WebfetchAbortError("Request aborted"):error2}let body=new Uint8Array(total),offset=0;for(let chunk of chunks)body.set(chunk,offset),offset+=chunk.length;return body}function parseContentLength(response){let contentLength=getHeader(response.headers,"content-length");if(contentLength==="")return;let parsed=Number.parseInt(contentLength,10);return Number.isFinite(parsed)&&parsed>=0?parsed:void 0}function forwardAbort(signal,controller){if(!signal)return()=>{};if(signal.aborted)return controller.abort(signal.reason),()=>{};let listener=()=>controller.abort(signal.reason);return signal.addEventListener("abort",listener,{once:!0}),()=>signal.removeEventListener("abort",listener)}var WEBFETCH_FORMATS=["markdown","text","html"],Params2=typebox_exports.Object({url:typebox_exports.String({description:"The URL to fetch content from"}),format:typebox_exports.Optional(StringEnum(["markdown","text","html"],{description:"The format to return the content in. Defaults to markdown."})),timeout:typebox_exports.Optional(typebox_exports.Number({description:"Optional timeout in seconds. Maximum 120."}))}),webfetch={name:"webfetch",label:"Web Fetch",description:"Fetches content from a URL and returns it as markdown, plain text, or HTML. Network use is bounded by timeout and response size limits.",promptSnippet:"webfetch: retrieve URL content as markdown, text, or html",promptGuidelines:["Use webfetch when a specific URL must be retrieved.","Prefer markdown format unless raw HTML or plain text is explicitly needed.","The tool is read-only and does not modify files."],parameters:Params2,async execute(_toolCallId,params,signal,onUpdate,_ctx){let format2=parseWebfetchFormat(params.format),timeoutSeconds=clampTimeout(params.timeout),startedAt=Date.now(),progress={activity:`fetching ${params.url}`,startedAt,maxWaitMs:timeoutSeconds*1e3},downloadedTotalBytes,emitProgress=details2=>{onUpdate?.({content:[{type:"text",text:`Fetching ${params.url} as ${format2} (timeout ${timeoutSeconds}s)`}],details:details2})};emitProgress({phase:"fetching",url:params.url,format:format2,timeoutSeconds,progress});let fetched=await fetchUrl({url:params.url,format:format2,timeoutSeconds,...signal===void 0?{}:{signal},onProgress:(bytesRead,totalBytes)=>{downloadedTotalBytes=totalBytes,emitProgress({phase:"downloading",url:params.url,format:format2,timeoutSeconds,bytesRead,...totalBytes===void 0?{}:{totalBytes},progress})}}),raw=new TextDecoder().decode(fetched.body),contentType=fetched.contentType.toLowerCase();emitProgress({phase:"converting",url:params.url,format:format2,timeoutSeconds,bytesRead:fetched.bytes,...downloadedTotalBytes===void 0?{}:{totalBytes:downloadedTotalBytes},progress});let isHtml=contentType.includes("text/html")||contentType.includes("application/xhtml+xml"),text2=raw,converted=!1;isHtml&&format2==="markdown"?(text2=await htmlToMarkdown(raw,fetched.url),converted=!0):isHtml&&format2==="text"&&(text2=await htmlToText(raw,fetched.url),converted=!0);let capped=capWebfetchOutput(text2),details={url:params.url,finalUrl:fetched.url,format:format2,status:fetched.status,statusText:fetched.statusText,contentType:fetched.contentType,bytes:fetched.bytes,timeoutSeconds,converted,truncated:fetched.truncated,outputTruncated:capped.truncated,outputBytes:capped.outputBytes,outputTotalBytes:capped.totalBytes},content=[{type:"text",text:capped.notice===void 0?capped.text:`${capped.text}
|
|
2298
2299
|
`}];return capped.notice!==void 0&&content.push(modelOnlyText(capped.notice)),{content,details}}};function parseWebfetchFormat(value2){if(value2===void 0)return"markdown";for(let format2 of WEBFETCH_FORMATS)if(value2===format2)return format2;return"markdown"}var DEFAULT_OUTPUT_MAX_BYTES=50*1024;function capWebfetchOutput(text2){let totalBytes=Buffer.byteLength(text2,"utf-8");if(totalBytes<=DEFAULT_OUTPUT_MAX_BYTES)return{text:text2,truncated:!1,outputBytes:totalBytes,totalBytes};let head=takeHeadBytes(text2,DEFAULT_OUTPUT_MAX_BYTES),outputBytes=Buffer.byteLength(head,"utf-8"),notice2=`[Output truncated: ${formatByteSize(outputBytes)} of ${formatByteSize(totalBytes)} shown (${formatByteSize(DEFAULT_OUTPUT_MAX_BYTES)} limit). Re-fetch a more specific URL or use web_search for targeted content.]`;return{text:head,notice:notice2,truncated:!0,outputBytes,totalBytes}}function takeHeadBytes(text2,maxBytes){let lines=[],usedBytes=0,start=0;for(;start<=text2.length;){let newlineIndex=text2.indexOf(`
|
|
2299
2300
|
`,start),line=newlineIndex===-1?text2.slice(start):text2.slice(start,newlineIndex),lineBytes=Buffer.byteLength(line,"utf-8")+(lines.length>0?1:0);if(usedBytes+lineBytes>maxBytes||(lines.push(line),usedBytes+=lineBytes,newlineIndex===-1))break;start=newlineIndex+1}return lines.length===0?sliceUtf8Head(text2,maxBytes):lines.join(`
|
|
2300
|
-
`)}function sliceUtf8Head(value2,maxBytes){let buffer=Buffer.from(value2,"utf-8");if(buffer.length<=maxBytes)return value2;let decoded=new TextDecoder("utf-8").decode(buffer.subarray(0,maxBytes));return decoded.endsWith("\uFFFD")?decoded.slice(0,-1):decoded}function formatByteSize(bytes){return bytes<1024?`${bytes}B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)}KB`:`${(bytes/(1024*1024)).toFixed(1)}MB`}var ENABLE_ENV4="PI_WEBFETCH",STATUS_KEY5="pi-webfetch",WIDGET_KEY5="pi-webfetch";function parseEnableEnv4(envVar){let envValue2=process.env[envVar];if(!envValue2)return!0;let normalized2=envValue2.trim().toLowerCase();return!(normalized2==="0"||normalized2==="false"||normalized2==="no"||normalized2==="off")}function isWebfetchEnabled(){return parseEnableEnv4(ENABLE_ENV4)}function clearUi3(ctx){ctx.hasUI&&(ctx.ui.setStatus(STATUS_KEY5,void 0),ctx.ui.setWidget(WIDGET_KEY5,void 0))}function webfetch_default(pi){isWebfetchEnabled()&&(pi.registerTool({...webfetch,renderCall:renderWebfetchCall,renderResult:renderWebfetchResult}),pi.on("session_start",async(_event,ctx)=>{clearUi3(ctx)}),pi.on("session_shutdown",async(_event,ctx)=>{clearUi3(ctx)}))}import{access as access3,readFile as readFile16}from"node:fs/promises";import{homedir as homedir10}from"node:os";import{join as join59}from"node:path";var DEFAULT_PROVIDER_URLS={exa:"https://api.exa.ai/search",tavily:"https://api.tavily.com/search",serpdive:"https://api.serpdive.com/v1/search",brave:"https://api.search.brave.com/res/v1/web/search","duckduckgo-html":"https://html.duckduckgo.com/html/",deepseek:"https://api.deepseek.com/anthropic/v1/messages",serper:"https://google.serper.dev/search","google-cse":"https://customsearch.googleapis.com/customsearch/v1","z-ai":"https://api.z.ai/api/paas/v4/web_search",openai:"https://api.openai.com/v1/responses",codex:"https://api.openai.com/v1/responses","chatgpt-subscription":"https://chatgpt.com/backend-api/codex/responses",google:"https://generativelanguage.googleapis.com/v1beta",anthropic:"https://api.anthropic.com/v1/messages",perplexity:"https://api.perplexity.ai/search",xai:"https://api.x.ai/v1/responses",kimi:"https://api.kimi.com/coding/v1/search",kagi:"https://kagi.com/api/v1/search",startpage:"https://www.startpage.com/sp/search",mojeek:"https://www.mojeek.com/search",ecosia:"https://www.ecosia.org/search","google-html":"https://www.google.com/search","exa-mcp":"https://mcp.exa.ai/mcp"};function defaultProviderUrl(provider){if(provider==="searxng")throw new Error("Provider searxng requires baseUrl.");return DEFAULT_PROVIDER_URLS[provider]}function isPrivateIpv4(hostname){let parts=hostname.split(".").map(part=>Number.parseInt(part,10));if(parts.length!==4||parts.some(part=>!Number.isInteger(part)||part<0||part>255))return!1;let first=parts[0]??-1,second=parts[1]??-1;return first===10||first===127||first===0||first===169&&second===254||first===172&&second>=16&&second<=31?!0:first===192&&second===168}function isPrivateHostname(hostname){let normalized2=hostname.toLowerCase().replace(/^\[/,"").replace(/\]$/,"").replace(/\.$/,"");return normalized2==="localhost"||normalized2.endsWith(".localhost")||normalized2.includes(":")||normalized2==="::1"||normalized2.startsWith("fc")||normalized2.startsWith("fd")||/^fe[89ab][0-9a-f]:/.test(normalized2)||isPrivateIpv4(normalized2)}function isAllowedProviderBaseUrl(baseUrl){let configured;try{configured=new URL(baseUrl)}catch{return!1}return configured.protocol==="https:"&&configured.username===""&&configured.password===""&&!configured.hostname.endsWith("..")&&!isPrivateHostname(configured.hostname)}function isLocalNetworkHostname(hostname){let normalized2=hostname.toLowerCase().replace(/^\[/,"").replace(/\]$/,"").replace(/\.$/,"");return normalized2.includes(":")?normalized2==="::1"||/^(?:f[cd][0-9a-f]{0,2}|fe[89ab][0-9a-f]):/.test(normalized2):normalized2==="localhost"||normalized2.endsWith(".localhost")||isPrivateIpv4(normalized2)||!normalized2.includes(".")&&/^[a-z0-9-]+$/.test(normalized2)||/\.(?:local|lan|internal|home\.arpa)$/.test(normalized2)}function isAllowedSearxngBaseUrl(baseUrl){let configured;try{configured=new URL(baseUrl)}catch{return!1}return configured.username!==""||configured.password!==""||configured.hostname===""?!1:configured.protocol==="https:"?!0:configured.protocol==="http:"&&isLocalNetworkHostname(configured.hostname)}function providerUrl(config){return config.baseUrl??defaultProviderUrl(config.provider)}var PROVIDERS=["exa","tavily","serpdive","brave","duckduckgo-html","deepseek","serper","google-cse","z-ai","openai","codex","chatgpt-subscription","google","anthropic","perplexity","xai","kimi","kagi","startpage","mojeek","ecosia","google-html","exa-mcp","searxng"],KEYLESS_PROVIDERS=new Set(["duckduckgo-html","startpage","mojeek","ecosia","google-html","exa-mcp","searxng"]),SESSION_LOGIN_PROVIDERS=["chatgpt-subscription","google"],CONTEXT_SIZES=["low","medium","high"],CODEX_MODES=["cached","live"],STRATEGIES=["priority","round-robin","fill-first"],DEFAULT_FREE_CONFIG={strategy:"priority",fallback:!0,auto:!0,providers:[{provider:"duckduckgo-html",maxResults:10},{provider:"exa-mcp"},{provider:"startpage"},{provider:"mojeek"},{provider:"ecosia"},{provider:"google-html"}]};function isJsonObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function oneOf3(values,value2){return typeof value2=="string"&&values.includes(value2)}function isStringArray2(value2){return Array.isArray(value2)&&value2.every(item=>typeof item=="string")}function optionalString(value2){return typeof value2=="string"&&value2.length>0?value2:void 0}function optionalNumber(value2){return typeof value2=="number"&&Number.isFinite(value2)?value2:void 0}function optionalBoolean(value2){return typeof value2=="boolean"?value2:void 0}function optionalProvider(value2){return oneOf3(PROVIDERS,value2)?value2:void 0}function optionalContextSize(value2){return oneOf3(CONTEXT_SIZES,value2)?value2:void 0}function optionalCodexMode(value2){return oneOf3(CODEX_MODES,value2)?value2:void 0}function optionalStrategy(value2){return oneOf3(STRATEGIES,value2)?value2:void 0}function optionalLocation(value2){if(!isJsonObject(value2))return;let location={},country=optionalString(value2.country),region=optionalString(value2.region),city=optionalString(value2.city),timezone=optionalString(value2.timezone);return country&&(location.country=country),region&&(location.region=region),city&&(location.city=city),timezone&&(location.timezone=timezone),Object.keys(location).length>0?location:void 0}function parseJsonObject(content){let parsed;try{parsed=JSON.parse(content)}catch{return null}return isJsonObject(parsed)?parsed:null}function providerEntryFromObject(raw){let provider=optionalProvider(raw.provider)??optionalProvider(raw.backend);if(!provider)return null;let config={provider},id=optionalString(raw.id),apiKey=optionalString(raw.apiKey),baseUrl=optionalString(raw.baseUrl),searchEngineId=optionalString(raw.searchEngineId),maxResults=optionalNumber(raw.maxResults),model=optionalString(raw.model),codexMode=optionalCodexMode(raw.codexMode),searchContextSize=optionalContextSize(raw.searchContextSize),rawAllowedDomains=raw.allowedDomains,rawBlockedDomains=raw.blockedDomains,allowedDomains=isStringArray2(rawAllowedDomains)?rawAllowedDomains:void 0,blockedDomains=isStringArray2(rawBlockedDomains)?rawBlockedDomains:void 0,userLocation=optionalLocation(raw.userLocation),timeoutMs=optionalNumber(raw.timeoutMs),priority=optionalNumber(raw.priority),weight=optionalNumber(raw.weight);return id&&(config.id=id),apiKey&&(config.apiKey=apiKey),baseUrl&&(config.baseUrl=baseUrl),searchEngineId&&(config.searchEngineId=searchEngineId),maxResults&&(config.maxResults=maxResults),model&&(config.model=model),codexMode&&(config.codexMode=codexMode),searchContextSize&&(config.searchContextSize=searchContextSize),allowedDomains&&(config.allowedDomains=allowedDomains),blockedDomains&&(config.blockedDomains=blockedDomains),userLocation&&(config.userLocation=userLocation),timeoutMs!==void 0&&(config.timeoutMs=timeoutMs),priority!==void 0&&(config.priority=priority),weight!==void 0&&(config.weight=weight),config}function configFromObject(raw){let auto=optionalBoolean(raw.auto)??!0,nativeModel=optionalString(raw.nativeModel),shared=nativeModel?{auto,nativeModel}:{auto},providersValue=raw.providers,rawProviders=Array.isArray(providersValue)?providersValue:void 0;if(rawProviders){if(optionalProvider(raw.provider))return null;let providers=rawProviders.map(value2=>isJsonObject(value2)?providerEntryFromObject(value2):null).filter(entry=>entry!==null),strategy=optionalStrategy(raw.strategy)??"priority",fallback=optionalBoolean(raw.fallback)??!0;return{strategy,fallback,...shared,providers}}let provider=providerEntryFromObject(raw);return provider?{strategy:"priority",fallback:!0,...shared,providers:[provider]}:null}function hasApiKey(config){return typeof config.apiKey=="string"&&config.apiKey.length>0}function validateProviderConfig(config){if(!PROVIDERS.includes(config.provider))return{ok:!1,reason:"invalid_config",message:`Unsupported provider: ${config.provider}`};if(config.allowedDomains&&config.blockedDomains)return{ok:!1,reason:"invalid_config",message:"Provider config cannot specify both allowedDomains and blockedDomains."};if(config.weight!==void 0&&config.weight<=0)return{ok:!1,reason:"invalid_config",message:"Provider weight must be greater than 0."};if(config.timeoutMs!==void 0&&config.timeoutMs<=0)return{ok:!1,reason:"invalid_config",message:"Provider timeoutMs must be greater than 0."};if(config.provider==="searxng"){if(!config.baseUrl)return{ok:!1,reason:"invalid_config",message:"Provider searxng requires baseUrl."};if(!isAllowedSearxngBaseUrl(config.baseUrl))return{ok:!1,reason:"invalid_config",message:"Provider searxng baseUrl must be an HTTPS URL, or an http URL on the local network, without credentials."}}else if(config.baseUrl&&!isAllowedProviderBaseUrl(config.baseUrl))return{ok:!1,reason:"invalid_config",message:`Provider ${config.provider} baseUrl must be a public HTTPS URL without credentials.`};return config.provider==="google-cse"&&!config.searchEngineId?{ok:!1,reason:"missing_api_key",message:"Provider google-cse requires searchEngineId."}:(config.provider==="codex"||config.provider==="openai")&&!hasApiKey(config)?{ok:!1,reason:"missing_api_key",message:`Provider ${config.provider} requires apiKey for hosted Responses API search.`}:config.provider!=="codex"&&config.provider!=="openai"&&!KEYLESS_PROVIDERS.has(config.provider)&&!SESSION_LOGIN_PROVIDERS.includes(config.provider)&&!hasApiKey(config)?{ok:!1,reason:"missing_api_key",message:`Provider ${config.provider} requires apiKey.`}:{ok:!0,config}}function validateWebsearchConfig(config){if(!STRATEGIES.includes(config.strategy))return{ok:!1,reason:"invalid_config",message:`Unsupported routing strategy: ${config.strategy}`};if(typeof config.auto!="boolean")return{ok:!1,reason:"invalid_config",message:"Websearch config auto must be a boolean."};if(config.providers.length===0)return{ok:!1,reason:"invalid_config",message:"Websearch config requires at least one provider."};for(let provider of config.providers){let validation=validateProviderConfig(provider);if(!validation.ok)return validation}return{ok:!0,config}}async function fileExists3(path15){try{return await access3(path15),!0}catch{return!1}}async function loadWebsearchConfig(options){let home=options.homeDir??homedir10(),paths=[join59(options.cwd,CONFIG_DIR_NAME,"websearch.json"),join59(options.cwd,".pi","websearch.json"),join59(home,"websearch.json"),join59(home,CONFIG_DIR_NAME,"websearch.json"),join59(home,".pi","websearch.json")].filter((path15,index,all2)=>all2.indexOf(path15)===index);for(let path15 of paths){if(!await fileExists3(path15))continue;let raw=parseJsonObject(await readFile16(path15,"utf8"));if(!raw)return{ok:!1,reason:"invalid_config",message:`Invalid JSON object in ${path15}`,source:path15};if(raw.nativeModel!==void 0&&!optionalString(raw.nativeModel))return{ok:!1,reason:"invalid_config",message:`Websearch config nativeModel in ${path15} must be a non-empty model id.`,source:path15};let config=configFromObject(raw);if(!config)return{ok:!1,reason:"invalid_config",message:`Invalid provider config in ${path15}`,source:path15};let validation=validateWebsearchConfig(config);return validation.ok?{ok:!0,config,source:path15}:{...validation,source:path15}}return{ok:!0,config:DEFAULT_FREE_CONFIG,source:"default:free-engines"}}function providerEntryLabel(entry){let id=entry.entryId??entry.id;if(!id||id===entry.provider)return entry.provider;let nativePrefix=`native-${entry.provider}-`;return id.endsWith("/native")?id:`${entry.provider}/${id.startsWith(nativePrefix)?"native":id}`}function attemptRouteLabel(entry){let label3=providerEntryLabel(entry);return entry.model?`${label3} (${entry.model})`:label3}function routeAttemptEntries(entry){let{fallbackModel,...primary}=entry;return!fallbackModel||fallbackModel===primary.model?[primary]:[primary,{...primary,model:fallbackModel}]}var loadHtmlDocumentModule=()=>import("./html-document-5FJMASJB.js");async function parseHtmlDocument(html){return(await loadHtmlDocumentModule()).parseHtmlDocument(html)}var EMPTY_DOMAIN_SENTINEL="invalid.invalid";function browserHeaders(referer,extra){return{Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36","Sec-Fetch-Dest":"document","Sec-Fetch-Mode":"navigate","Sec-Fetch-Site":referer?"same-origin":"none","Sec-Fetch-User":"?1","Upgrade-Insecure-Requests":"1",...referer?{Referer:referer}:{},...extra??{}}}function cleanText(value2){if(typeof value2!="string")return;let text2=value2.replace(/\s+/g," ").trim();return text2.length>0?text2:void 0}function externalResultUrl(href,base,ownHosts){if(!href)return;let url;try{url=new URL(href,base)}catch{return}if(url.protocol!=="http:"&&url.protocol!=="https:")return;let host=url.hostname.toLowerCase();if(!ownHosts.some(own=>host===own||host.endsWith(`.${own}`)))return url.href}function uniqueByUrl(items){let seen=new Set;return items.filter(item=>seen.has(item.url)?!1:(seen.add(item.url),!0))}function contentHeaders(extra){return{Accept:"application/json","Content-Type":"application/json",...extra??{}}}function withConfigHeaders(config,headers){let merged=new Headers(config.headers);for(let[name,value2]of Object.entries(headers))merged.set(name,value2);return Object.fromEntries(merged.entries())}function clamp(value2,min,max){return Math.max(min,Math.min(max,Math.trunc(value2)))}function appendDomainFilters(query,allowedDomains,blockedDomains){let parts=[query];for(let domain of allowedDomains??[])parts.push(`site:${domain}`);for(let domain of blockedDomains??[])parts.push(`-site:${domain}`);return parts.join(" ")}function unique(values){return[...new Set(values)]}function nonEmptyDomains(values){return values.length>0?values:[EMPTY_DOMAIN_SENTINEL]}function resolveDomainFilters(config,request2){let configAllowed=config.allowedDomains,configBlocked=config.blockedDomains,requestAllowed=request2.allowedDomains,requestBlocked=request2.blockedDomains;if(configAllowed){let narrowed=requestAllowed?configAllowed.filter(domain=>requestAllowed.includes(domain)):configAllowed,allowed=requestBlocked?narrowed.filter(domain=>!requestBlocked.includes(domain)):narrowed;return{allowedDomains:nonEmptyDomains(unique(allowed))}}if(configBlocked){let blocked=unique([...configBlocked,...requestBlocked??[]]);return requestAllowed?{allowedDomains:nonEmptyDomains(requestAllowed.filter(domain=>!blocked.includes(domain)))}:{blockedDomains:blocked}}return requestAllowed?{allowedDomains:unique(requestAllowed)}:requestBlocked?{blockedDomains:unique(requestBlocked)}:{}}function isJsonObject2(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function getObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)?value2:void 0}function getArray(value2){return Array.isArray(value2)?value2:[]}function getString2(value2){return typeof value2=="string"?value2:void 0}function getNumber(value2){return typeof value2=="number"?value2:void 0}function result2(title,url,snippet,source2,score3){if(!title||!url)return null;let item={title,url};return snippet&&(item.snippet=snippet),source2&&(item.source=source2),score3!==void 0&&(item.score=score3),item}function collect(items,max=50){return items.filter(item=>item!==null).slice(0,max)}function parseObjectPayload(payload){return isJsonObject2(payload)?payload:{}}function buildAnthropicMessagesSearchRequest(ctx,defaultModel){let{config,request:request2,allowedDomains,blockedDomains}=ctx,webSearchTool={type:"web_search_20250305",name:"web_search",max_uses:8};return allowedDomains&&(webSearchTool.allowed_domains=allowedDomains),blockedDomains&&(webSearchTool.blocked_domains=blockedDomains),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({"x-api-key":config.apiKey??"","anthropic-version":"2023-06-01"})},body:{model:config.model??defaultModel,max_tokens:1024,messages:[{role:"user",content:request2.query}],tools:[webSearchTool]}}}function normalizeAnthropicMessagesSearchPayload(data){let content=getArray(data.content),text2=content.map(getObject).map(item=>getString2(item?.text)).filter(value2=>value2!==void 0).join(`
|
|
2301
|
+
`)}function sliceUtf8Head(value2,maxBytes){let buffer=Buffer.from(value2,"utf-8");if(buffer.length<=maxBytes)return value2;let decoded=new TextDecoder("utf-8").decode(buffer.subarray(0,maxBytes));return decoded.endsWith("\uFFFD")?decoded.slice(0,-1):decoded}function formatByteSize(bytes){return bytes<1024?`${bytes}B`:bytes<1024*1024?`${(bytes/1024).toFixed(1)}KB`:`${(bytes/(1024*1024)).toFixed(1)}MB`}var ENABLE_ENV4="PI_WEBFETCH",STATUS_KEY5="pi-webfetch",WIDGET_KEY5="pi-webfetch";function parseEnableEnv4(envVar){let envValue2=process.env[envVar];if(!envValue2)return!0;let normalized2=envValue2.trim().toLowerCase();return!(normalized2==="0"||normalized2==="false"||normalized2==="no"||normalized2==="off")}function isWebfetchEnabled(){return parseEnableEnv4(ENABLE_ENV4)}function clearUi3(ctx){ctx.hasUI&&(ctx.ui.setStatus(STATUS_KEY5,void 0),ctx.ui.setWidget(WIDGET_KEY5,void 0))}function webfetch_default(pi){isWebfetchEnabled()&&(pi.registerTool({...webfetch,renderCall:renderWebfetchCall,renderResult:renderWebfetchResult}),pi.on("session_start",async(_event,ctx)=>{clearUi3(ctx)}),pi.on("session_shutdown",async(_event,ctx)=>{clearUi3(ctx)}))}import{access as access3,readFile as readFile16}from"node:fs/promises";import{homedir as homedir10}from"node:os";import{join as join59}from"node:path";var DEFAULT_PROVIDER_URLS={exa:"https://api.exa.ai/search",tavily:"https://api.tavily.com/search",serpdive:"https://api.serpdive.com/v1/search",brave:"https://api.search.brave.com/res/v1/web/search","duckduckgo-html":"https://html.duckduckgo.com/html/",deepseek:"https://api.deepseek.com/anthropic/v1/messages",serper:"https://google.serper.dev/search","google-cse":"https://customsearch.googleapis.com/customsearch/v1","z-ai":"https://api.z.ai/api/paas/v4/web_search",openai:"https://api.openai.com/v1/responses",codex:"https://api.openai.com/v1/responses","chatgpt-subscription":"https://chatgpt.com/backend-api/codex/responses",google:"https://generativelanguage.googleapis.com/v1beta",anthropic:"https://api.anthropic.com/v1/messages",perplexity:"https://api.perplexity.ai/search",xai:"https://api.x.ai/v1/responses",kimi:"https://api.kimi.com/coding/v1/search",kagi:"https://kagi.com/api/v1/search",startpage:"https://www.startpage.com/sp/search",mojeek:"https://www.mojeek.com/search",ecosia:"https://www.ecosia.org/search","google-html":"https://www.google.com/search","exa-mcp":"https://mcp.exa.ai/mcp",keenable:"https://api.keenable.ai/v1/search"};function defaultProviderUrl(provider){if(provider==="searxng")throw new Error("Provider searxng requires baseUrl.");return DEFAULT_PROVIDER_URLS[provider]}function isPrivateIpv4(hostname){let parts=hostname.split(".").map(part=>Number.parseInt(part,10));if(parts.length!==4||parts.some(part=>!Number.isInteger(part)||part<0||part>255))return!1;let first=parts[0]??-1,second=parts[1]??-1;return first===10||first===127||first===0||first===169&&second===254||first===172&&second>=16&&second<=31?!0:first===192&&second===168}function isPrivateHostname(hostname){let normalized2=hostname.toLowerCase().replace(/^\[/,"").replace(/\]$/,"").replace(/\.$/,"");return normalized2==="localhost"||normalized2.endsWith(".localhost")||normalized2.includes(":")||normalized2==="::1"||normalized2.startsWith("fc")||normalized2.startsWith("fd")||/^fe[89ab][0-9a-f]:/.test(normalized2)||isPrivateIpv4(normalized2)}function isAllowedProviderBaseUrl(baseUrl){let configured;try{configured=new URL(baseUrl)}catch{return!1}return configured.protocol==="https:"&&configured.username===""&&configured.password===""&&!configured.hostname.endsWith("..")&&!isPrivateHostname(configured.hostname)}function isLocalNetworkHostname(hostname){let normalized2=hostname.toLowerCase().replace(/^\[/,"").replace(/\]$/,"").replace(/\.$/,"");return normalized2.includes(":")?normalized2==="::1"||/^(?:f[cd][0-9a-f]{0,2}|fe[89ab][0-9a-f]):/.test(normalized2):normalized2==="localhost"||normalized2.endsWith(".localhost")||isPrivateIpv4(normalized2)||!normalized2.includes(".")&&/^[a-z0-9-]+$/.test(normalized2)||/\.(?:local|lan|internal|home\.arpa)$/.test(normalized2)}function isAllowedSearxngBaseUrl(baseUrl){let configured;try{configured=new URL(baseUrl)}catch{return!1}return configured.username!==""||configured.password!==""||configured.hostname===""?!1:configured.protocol==="https:"?!0:configured.protocol==="http:"&&isLocalNetworkHostname(configured.hostname)}function providerUrl(config){return config.baseUrl??defaultProviderUrl(config.provider)}var PROVIDERS=["exa","tavily","serpdive","brave","duckduckgo-html","deepseek","serper","google-cse","z-ai","openai","codex","chatgpt-subscription","google","anthropic","perplexity","xai","kimi","kagi","startpage","mojeek","ecosia","google-html","exa-mcp","searxng","keenable"],KEYLESS_PROVIDERS=new Set(["duckduckgo-html","startpage","mojeek","ecosia","google-html","exa-mcp","searxng","keenable"]),SESSION_LOGIN_PROVIDERS=["chatgpt-subscription","google"],CONTEXT_SIZES=["low","medium","high"],CODEX_MODES=["cached","live"],STRATEGIES=["priority","round-robin","fill-first"],DEFAULT_FREE_CONFIG={strategy:"priority",fallback:!0,auto:!0,providers:[{provider:"duckduckgo-html",maxResults:10},{provider:"exa-mcp"},{provider:"startpage"},{provider:"mojeek"},{provider:"ecosia"},{provider:"google-html"}]};function isJsonObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function oneOf3(values,value2){return typeof value2=="string"&&values.includes(value2)}function isStringArray2(value2){return Array.isArray(value2)&&value2.every(item=>typeof item=="string")}function optionalString(value2){return typeof value2=="string"&&value2.length>0?value2:void 0}function optionalNumber(value2){return typeof value2=="number"&&Number.isFinite(value2)?value2:void 0}function optionalBoolean(value2){return typeof value2=="boolean"?value2:void 0}function optionalProvider(value2){return oneOf3(PROVIDERS,value2)?value2:void 0}function optionalContextSize(value2){return oneOf3(CONTEXT_SIZES,value2)?value2:void 0}function optionalCodexMode(value2){return oneOf3(CODEX_MODES,value2)?value2:void 0}function optionalStrategy(value2){return oneOf3(STRATEGIES,value2)?value2:void 0}function optionalLocation(value2){if(!isJsonObject(value2))return;let location={},country=optionalString(value2.country),region=optionalString(value2.region),city=optionalString(value2.city),timezone=optionalString(value2.timezone);return country&&(location.country=country),region&&(location.region=region),city&&(location.city=city),timezone&&(location.timezone=timezone),Object.keys(location).length>0?location:void 0}function parseJsonObject(content){let parsed;try{parsed=JSON.parse(content)}catch{return null}return isJsonObject(parsed)?parsed:null}function providerEntryFromObject(raw){let provider=optionalProvider(raw.provider)??optionalProvider(raw.backend);if(!provider)return null;let config={provider},id=optionalString(raw.id),apiKey=optionalString(raw.apiKey),baseUrl=optionalString(raw.baseUrl),searchEngineId=optionalString(raw.searchEngineId),maxResults=optionalNumber(raw.maxResults),model=optionalString(raw.model),codexMode=optionalCodexMode(raw.codexMode),searchContextSize=optionalContextSize(raw.searchContextSize),rawAllowedDomains=raw.allowedDomains,rawBlockedDomains=raw.blockedDomains,allowedDomains=isStringArray2(rawAllowedDomains)?rawAllowedDomains:void 0,blockedDomains=isStringArray2(rawBlockedDomains)?rawBlockedDomains:void 0,userLocation=optionalLocation(raw.userLocation),timeoutMs=optionalNumber(raw.timeoutMs),priority=optionalNumber(raw.priority),weight=optionalNumber(raw.weight);return id&&(config.id=id),apiKey&&(config.apiKey=apiKey),baseUrl&&(config.baseUrl=baseUrl),searchEngineId&&(config.searchEngineId=searchEngineId),maxResults&&(config.maxResults=maxResults),model&&(config.model=model),codexMode&&(config.codexMode=codexMode),searchContextSize&&(config.searchContextSize=searchContextSize),allowedDomains&&(config.allowedDomains=allowedDomains),blockedDomains&&(config.blockedDomains=blockedDomains),userLocation&&(config.userLocation=userLocation),timeoutMs!==void 0&&(config.timeoutMs=timeoutMs),priority!==void 0&&(config.priority=priority),weight!==void 0&&(config.weight=weight),config}function configFromObject(raw){let auto=optionalBoolean(raw.auto)??!0,nativeModel=optionalString(raw.nativeModel),shared=nativeModel?{auto,nativeModel}:{auto},providersValue=raw.providers,rawProviders=Array.isArray(providersValue)?providersValue:void 0;if(rawProviders){if(optionalProvider(raw.provider))return null;let providers=rawProviders.map(value2=>isJsonObject(value2)?providerEntryFromObject(value2):null).filter(entry=>entry!==null),strategy=optionalStrategy(raw.strategy)??"priority",fallback=optionalBoolean(raw.fallback)??!0;return{strategy,fallback,...shared,providers}}let provider=providerEntryFromObject(raw);return provider?{strategy:"priority",fallback:!0,...shared,providers:[provider]}:null}function hasApiKey(config){return typeof config.apiKey=="string"&&config.apiKey.length>0}function validateProviderConfig(config){if(!PROVIDERS.includes(config.provider))return{ok:!1,reason:"invalid_config",message:`Unsupported provider: ${config.provider}`};if(config.allowedDomains&&config.blockedDomains)return{ok:!1,reason:"invalid_config",message:"Provider config cannot specify both allowedDomains and blockedDomains."};if(config.weight!==void 0&&config.weight<=0)return{ok:!1,reason:"invalid_config",message:"Provider weight must be greater than 0."};if(config.timeoutMs!==void 0&&config.timeoutMs<=0)return{ok:!1,reason:"invalid_config",message:"Provider timeoutMs must be greater than 0."};if(config.provider==="searxng"){if(!config.baseUrl)return{ok:!1,reason:"invalid_config",message:"Provider searxng requires baseUrl."};if(!isAllowedSearxngBaseUrl(config.baseUrl))return{ok:!1,reason:"invalid_config",message:"Provider searxng baseUrl must be an HTTPS URL, or an http URL on the local network, without credentials."}}else if(config.baseUrl&&!isAllowedProviderBaseUrl(config.baseUrl))return{ok:!1,reason:"invalid_config",message:`Provider ${config.provider} baseUrl must be a public HTTPS URL without credentials.`};return config.provider==="google-cse"&&!config.searchEngineId?{ok:!1,reason:"missing_api_key",message:"Provider google-cse requires searchEngineId."}:(config.provider==="codex"||config.provider==="openai")&&!hasApiKey(config)?{ok:!1,reason:"missing_api_key",message:`Provider ${config.provider} requires apiKey for hosted Responses API search.`}:config.provider!=="codex"&&config.provider!=="openai"&&!KEYLESS_PROVIDERS.has(config.provider)&&!SESSION_LOGIN_PROVIDERS.includes(config.provider)&&!hasApiKey(config)?{ok:!1,reason:"missing_api_key",message:`Provider ${config.provider} requires apiKey.`}:{ok:!0,config}}function validateWebsearchConfig(config){if(!STRATEGIES.includes(config.strategy))return{ok:!1,reason:"invalid_config",message:`Unsupported routing strategy: ${config.strategy}`};if(typeof config.auto!="boolean")return{ok:!1,reason:"invalid_config",message:"Websearch config auto must be a boolean."};if(config.providers.length===0)return{ok:!1,reason:"invalid_config",message:"Websearch config requires at least one provider."};for(let provider of config.providers){let validation=validateProviderConfig(provider);if(!validation.ok)return validation}return{ok:!0,config}}async function fileExists3(path15){try{return await access3(path15),!0}catch{return!1}}async function loadWebsearchConfig(options){let home=options.homeDir??homedir10(),paths=[join59(options.cwd,CONFIG_DIR_NAME,"websearch.json"),join59(options.cwd,".pi","websearch.json"),join59(home,"websearch.json"),join59(home,CONFIG_DIR_NAME,"websearch.json"),join59(home,".pi","websearch.json")].filter((path15,index,all2)=>all2.indexOf(path15)===index);for(let path15 of paths){if(!await fileExists3(path15))continue;let raw=parseJsonObject(await readFile16(path15,"utf8"));if(!raw)return{ok:!1,reason:"invalid_config",message:`Invalid JSON object in ${path15}`,source:path15};if(raw.nativeModel!==void 0&&!optionalString(raw.nativeModel))return{ok:!1,reason:"invalid_config",message:`Websearch config nativeModel in ${path15} must be a non-empty model id.`,source:path15};let config=configFromObject(raw);if(!config)return{ok:!1,reason:"invalid_config",message:`Invalid provider config in ${path15}`,source:path15};let validation=validateWebsearchConfig(config);return validation.ok?{ok:!0,config,source:path15}:{...validation,source:path15}}return{ok:!0,config:DEFAULT_FREE_CONFIG,source:"default:free-engines"}}function providerEntryLabel(entry){let id=entry.entryId??entry.id;if(!id||id===entry.provider)return entry.provider;let nativePrefix=`native-${entry.provider}-`;return id.endsWith("/native")?id:`${entry.provider}/${id.startsWith(nativePrefix)?"native":id}`}function attemptRouteLabel(entry){let label3=providerEntryLabel(entry);return entry.model?`${label3} (${entry.model})`:label3}function routeAttemptEntries(entry){let{fallbackModel,...primary}=entry;return!fallbackModel||fallbackModel===primary.model?[primary]:[primary,{...primary,model:fallbackModel}]}var loadHtmlDocumentModule=()=>import("./html-document-5FJMASJB.js");async function parseHtmlDocument(html){return(await loadHtmlDocumentModule()).parseHtmlDocument(html)}var EMPTY_DOMAIN_SENTINEL="invalid.invalid";function browserHeaders(referer,extra){return{Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36","Sec-Fetch-Dest":"document","Sec-Fetch-Mode":"navigate","Sec-Fetch-Site":referer?"same-origin":"none","Sec-Fetch-User":"?1","Upgrade-Insecure-Requests":"1",...referer?{Referer:referer}:{},...extra??{}}}function cleanText(value2){if(typeof value2!="string")return;let text2=value2.replace(/\s+/g," ").trim();return text2.length>0?text2:void 0}function externalResultUrl(href,base,ownHosts){if(!href)return;let url;try{url=new URL(href,base)}catch{return}if(url.protocol!=="http:"&&url.protocol!=="https:")return;let host=url.hostname.toLowerCase();if(!ownHosts.some(own=>host===own||host.endsWith(`.${own}`)))return url.href}function uniqueByUrl(items){let seen=new Set;return items.filter(item=>seen.has(item.url)?!1:(seen.add(item.url),!0))}function contentHeaders(extra){return{Accept:"application/json","Content-Type":"application/json",...extra??{}}}function withConfigHeaders(config,headers){let merged=new Headers(config.headers);for(let[name,value2]of Object.entries(headers))merged.set(name,value2);return Object.fromEntries(merged.entries())}function clamp(value2,min,max){return Math.max(min,Math.min(max,Math.trunc(value2)))}function appendDomainFilters(query,allowedDomains,blockedDomains){let parts=[query];for(let domain of allowedDomains??[])parts.push(`site:${domain}`);for(let domain of blockedDomains??[])parts.push(`-site:${domain}`);return parts.join(" ")}function unique(values){return[...new Set(values)]}function nonEmptyDomains(values){return values.length>0?values:[EMPTY_DOMAIN_SENTINEL]}function resolveDomainFilters(config,request2){let configAllowed=config.allowedDomains,configBlocked=config.blockedDomains,requestAllowed=request2.allowedDomains,requestBlocked=request2.blockedDomains;if(configAllowed){let narrowed=requestAllowed?configAllowed.filter(domain=>requestAllowed.includes(domain)):configAllowed,allowed=requestBlocked?narrowed.filter(domain=>!requestBlocked.includes(domain)):narrowed;return{allowedDomains:nonEmptyDomains(unique(allowed))}}if(configBlocked){let blocked=unique([...configBlocked,...requestBlocked??[]]);return requestAllowed?{allowedDomains:nonEmptyDomains(requestAllowed.filter(domain=>!blocked.includes(domain)))}:{blockedDomains:blocked}}return requestAllowed?{allowedDomains:unique(requestAllowed)}:requestBlocked?{blockedDomains:unique(requestBlocked)}:{}}function isJsonObject2(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function getObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)?value2:void 0}function getArray(value2){return Array.isArray(value2)?value2:[]}function getString2(value2){return typeof value2=="string"?value2:void 0}function getNumber(value2){return typeof value2=="number"?value2:void 0}function result2(title,url,snippet,source2,score3){if(!title||!url)return null;let item={title,url};return snippet&&(item.snippet=snippet),source2&&(item.source=source2),score3!==void 0&&(item.score=score3),item}function collect(items,max=50){return items.filter(item=>item!==null).slice(0,max)}function parseObjectPayload(payload){return isJsonObject2(payload)?payload:{}}function buildAnthropicMessagesSearchRequest(ctx,defaultModel){let{config,request:request2,allowedDomains,blockedDomains}=ctx,webSearchTool={type:"web_search_20250305",name:"web_search",max_uses:8};return allowedDomains&&(webSearchTool.allowed_domains=allowedDomains),blockedDomains&&(webSearchTool.blocked_domains=blockedDomains),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({"x-api-key":config.apiKey??"","anthropic-version":"2023-06-01"})},body:{model:config.model??defaultModel,max_tokens:1024,messages:[{role:"user",content:request2.query}],tools:[webSearchTool]}}}function normalizeAnthropicMessagesSearchPayload(data){let content=getArray(data.content),text2=content.map(getObject).map(item=>getString2(item?.text)).filter(value2=>value2!==void 0).join(`
|
|
2301
2302
|
`);return collect(content.flatMap(raw=>{let item=getObject(raw);return item?.type!=="web_search_tool_result"?[]:getArray(item.content).map(searchRaw=>{let searchItem=getObject(searchRaw);return result2(getString2(searchItem?.title),getString2(searchItem?.url),getString2(searchItem?.page_age)??text2)})}))}var anthropicProvider={buildRequest(ctx){return buildAnthropicMessagesSearchRequest(ctx,"claude-sonnet-4-5-20250929")},normalizeResponse(data){return normalizeAnthropicMessagesSearchPayload(data)}};var braveProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),url.searchParams.set("count",String(clamp(maxResults,1,20))),{url:url.toString(),init:{method:"GET",headers:{Accept:"application/json","X-Subscription-Token":config.apiKey??""}}}},normalizeResponse(data){let web=getObject(data.web);return collect(getArray(web?.results).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.url),getString2(item?.description))}))}};import{arch as arch3,platform as platform4,release as release3}from"node:os";function parseJson(text2){try{return JSON.parse(text2)}catch{return}}function streamErrorMessage(event){let response=getObject(event.response),sources=[event,getObject(event.error),getObject(response?.error)],code=sources.map(source2=>getString2(source2?.code)).find(value2=>value2),message=sources.map(source2=>getString2(source2?.message)).find(value2=>value2);return code&&message?`${code}: ${message}`:message??code??"The search stream failed."}function eventData(block){return block.split(/\r?\n/).filter(line=>line.startsWith("data:")).map(line=>line.slice(5).trimStart()).join(`
|
|
2302
2303
|
`)}function collectResponseStream(bodyText){if(bodyText.trimStart().startsWith("{")){let parsed=parseJson(bodyText);return isJsonObject2(parsed)?parsed:{}}let doneItems=[],completedOutput=[],error2;for(let block of bodyText.split(/\r?\n\r?\n/)){let data=eventData(block);if(!data||data==="[DONE]")continue;let event=parseJson(data);if(isJsonObject2(event))switch(event.type){case"response.output_item.done":{let item=getObject(event.item);item&&doneItems.push(item);break}case"response.completed":case"response.done":completedOutput=getArray(getObject(event.response)?.output);break;case"error":case"response.failed":error2=streamErrorMessage(event);break}}let payload={output:doneItems.length>0?doneItems:completedOutput};return error2&&(payload.error={message:error2}),payload}var DEFAULT_MODEL2="gpt-5.5",INSTRUCTIONS2="You are a web search assistant. Always run the web_search tool for the user's query, then answer briefly and cite the pages you used.";function requestHeaders(config){let token=config.apiKey??"",identity=getWireIdentity(),headers=withConfigHeaders(config,{Authorization:`Bearer ${token}`,"OpenAI-Beta":"responses=experimental",originator:identity,"User-Agent":`${identity} (${platform4()} ${release3()}; ${arch3()})`,Accept:"text/event-stream","Content-Type":"application/json"}),accountId=extractChatGptSubscriptionAccountId(token);return accountId?headers["chatgpt-account-id"]=accountId:delete headers["chatgpt-account-id"],headers}function buildRequest({config,request:request2,allowedDomains,blockedDomains}){let webSearchTool={type:"web_search",external_web_access:(config.codexMode??"live")==="live"};config.searchContextSize&&(webSearchTool.search_context_size=config.searchContextSize),allowedDomains&&(webSearchTool.filters={allowed_domains:allowedDomains}),config.userLocation&&(webSearchTool.user_location={type:"approximate",...config.userLocation});let query=blockedDomains?appendDomainFilters(request2.query,void 0,blockedDomains):request2.query;return{url:providerUrl(config),init:{method:"POST",headers:requestHeaders(config)},body:{model:config.model??DEFAULT_MODEL2,instructions:INSTRUCTIONS2,input:[{type:"message",role:"user",content:[{type:"input_text",text:query}]}],tools:[webSearchTool],tool_choice:{type:"web_search"},include:["web_search_call.action.sources"],store:!1,stream:!0}}}function cleanSourceUrl(rawUrl){try{let url=new URL(rawUrl);return url.searchParams.get("utm_source")==="openai"&&url.searchParams.delete("utm_source"),url.href}catch{return rawUrl}}function citationSnippet(text2,start,end){return start===void 0||end===void 0?void 0:text2.slice(Math.max(0,start-100),Math.min(text2.length,end+100)).trim()||void 0}function citationResults(output){return output.flatMap(item=>item?.type!=="message"?[]:getArray(item.content).flatMap(rawPart=>{let part=getObject(rawPart),text2=getString2(part?.text)??"";return getArray(part?.annotations).map(rawAnnotation=>{let annotation=getObject(rawAnnotation),url=getString2(annotation?.url);if(annotation?.type!=="url_citation"||!url)return null;let snippet=citationSnippet(text2,getNumber(annotation.start_index),getNumber(annotation.end_index));return result2(getString2(annotation.title)??url,cleanSourceUrl(url),snippet)})}))}function sourceResults(searchCalls){return searchCalls.flatMap(call=>getArray(getObject(call?.action)?.sources).map(rawSource=>{let source2=getObject(rawSource),url=getString2(source2?.url);return url?result2(getString2(source2?.title)??url,cleanSourceUrl(url)):null}))}function normalizeResponse(data){let output=getArray(data.output).map(getObject),searchCalls=output.filter(item=>item?.type==="web_search_call");if(searchCalls.length===0)return[];let byUrl=new Map;for(let item of collect([...citationResults(output),...sourceResults(searchCalls)],Number.MAX_SAFE_INTEGER))byUrl.has(item.url)||byUrl.set(item.url,item);return collect([...byUrl.values()])}var chatgptSubscriptionProvider={buildRequest,normalizeResponse,parseBody:collectResponseStream};var deepseekProvider={buildRequest(ctx){return buildAnthropicMessagesSearchRequest(ctx,"deepseek-v4-flash")},normalizeResponse(data){return normalizeAnthropicMessagesSearchPayload(data)}};function htmlDecode(value2){return value2.replace(/&#x([0-9a-f]+);/gi,(_match,hex)=>String.fromCodePoint(Number.parseInt(hex,16))).replace(/&#(\d+);/g,(_match,decimal)=>String.fromCodePoint(Number.parseInt(decimal,10))).replaceAll(" "," ").replaceAll("&","&").replaceAll(""",'"').replaceAll("'","'").replaceAll("<","<").replaceAll(">",">")}function stripHtml(value2){return htmlDecode(value2.replace(/<[^>]*>/g,"").replace(/\s+/g," ").trim())}function duckDuckGoResultUrl(rawHref){let decodedHref=htmlDecode(rawHref),absoluteHref=decodedHref.startsWith("//")?`https:${decodedHref}`:decodedHref,url;try{url=new URL(absoluteHref)}catch{return}return url.searchParams.get("uddg")??absoluteHref}function normalizeDuckDuckGoHtml(html){let matches=[...html.matchAll(/<a\b[^>]*class="[^"]*result__a[^"]*"[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/g)],snippets=[...html.matchAll(/<a\b[^>]*class="[^"]*result__snippet[^"]*"[^>]*>([\s\S]*?)<\/a>/g)].map(match=>stripHtml(match[1]??""));return collect(matches.map((match,index)=>{let title=stripHtml(match[2]??""),url=duckDuckGoResultUrl(match[1]??"");return result2(title,url,snippets[index])}))}function detectDuckDuckGoChallenge(page){return page.body.includes("anomaly-modal")||page.body.includes("anomaly.js")?"anomaly page":void 0}var duckDuckGoHtmlProvider={responseFormat:"html",buildRequest({config,request:request2,allowedDomains,blockedDomains}){let form=new URLSearchParams({q:appendDomainFilters(request2.query,allowedDomains,blockedDomains),kl:"us-en",b:""});return{url:providerUrl(config),init:{method:"POST",headers:browserHeaders("https://html.duckduckgo.com/",{"Content-Type":"application/x-www-form-urlencoded"})},form:form.toString()}},detectChallenge:detectDuckDuckGoChallenge,normalizeResponse(data){return normalizeDuckDuckGoHtml(getString2(data.html)??"")}};var ECOSIA_HOME_URL="https://www.ecosia.org/";function detectEcosiaChallenge(page){return page.body.includes("Ecosia Firewall")||page.body.includes("_cf_chl_opt")||page.body.includes("/cdn-cgi/challenge-platform/")?"firewall challenge":void 0}function normalizeEcosiaHtml(document){let items=[];for(let article of document.querySelectorAll('article[data-test-id="organic-result"]')){let heading=article.querySelector('[data-test-id="result-title"]'),url=externalResultUrl(heading?.closest("a")?.getAttribute("href"),ECOSIA_HOME_URL,["ecosia.org"]),description=article.querySelector('[data-test-id="web-result-description"]')??article.querySelector('[data-test-id="result-description"]');items.push(result2(cleanText(heading?.textContent),url,cleanText(description?.textContent)))}return uniqueByUrl(collect(items))}var ecosiaProvider={responseFormat:"html",buildRequest({config,request:request2,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),{url:url.toString(),init:{method:"GET",headers:browserHeaders(ECOSIA_HOME_URL)}}},detectChallenge:detectEcosiaChallenge,normalizeDocument:normalizeEcosiaHtml};var exaProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let headers=contentHeaders({"x-api-key":config.apiKey??""}),body={query:request2.query,numResults:clamp(maxResults,1,20)};return allowedDomains&&(body.includeDomains=allowedDomains),blockedDomains&&(body.excludeDomains=blockedDomains),{url:providerUrl(config),init:{method:"POST",headers},body}},normalizeResponse(data){return collect(getArray(data.results).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.url),getString2(item?.text)??getString2(item?.snippet),void 0,getNumber(item?.score))}))}};var MAX_SNIPPET_CHARS=400;function field(section,name){let value2=new RegExp(`^${name}:[ \\t]*(.*)$`,"m").exec(section)?.[1]?.trim();return value2&&value2!=="N/A"?value2:void 0}function snippetOf(section){let text2=/^(?:Highlights|Text|Summary):[ \t]*\n?([\s\S]*)$/m.exec(section)?.[1]?.replace(/\s+/g," ").trim();if(text2)return text2.length>MAX_SNIPPET_CHARS?`${text2.slice(0,MAX_SNIPPET_CHARS-1)}\u2026`:text2}function normalizeExaMcpResult(data){let sections=getArray(getObject(data.result)?.content).map(part=>getString2(getObject(part)?.text)??"").join(`
|
|
2303
2304
|
|
|
2304
2305
|
`).replace(/\r\n?/g,`
|
|
2305
|
-
`).split(/\n{2,}(?=Title:)/).filter(section=>section.startsWith("Title:"));return uniqueByUrl(collect(sections.map(section=>{let item=result2(field(section,"Title"),field(section,"URL"),snippetOf(section)),published=field(section,"Published")??field(section,"Published Date");return item&&published&&(item.publishedAt=published),item})))}function exaMcpError(data){let rpcError=getString2(getObject(data.error)?.message);if(rpcError)return`Exa MCP error: ${rpcError}`;let toolResult=getObject(data.result);return toolResult?.isError!==!0?void 0:`Exa MCP error: ${getArray(toolResult.content).map(part=>getString2(getObject(part)?.text)??"").join(" ").trim()||"the search tool reported an error"}`}var exaMcpProvider={responseFormat:"event-stream",buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("tools","web_search_exa"),{url:url.toString(),init:{method:"POST",headers:{Accept:"application/json, text/event-stream","Content-Type":"application/json"}},body:{jsonrpc:"2.0",id:1,method:"tools/call",params:{name:"web_search_exa",arguments:{query:appendDomainFilters(request2.query,allowedDomains,blockedDomains),numResults:clamp(maxResults,1,20)}}}}},responseError:exaMcpError,normalizeResponse:normalizeExaMcpResult};var DEFAULT_MODEL3="gemini-2.5-flash";function generateContentUrl(config){let root=providerUrl(config).replace(/\/+$/,"");if(root.endsWith(":generateContent"))return root;let model=(config.model??DEFAULT_MODEL3).replace(/^models\//,"");return`${root}/models/${encodeURIComponent(model)}:generateContent`}function buildRequest2({config,request:request2,allowedDomains,blockedDomains}){let prompt=`Search the web with Google Search and answer briefly, citing the pages you used. Query: ${appendDomainFilters(request2.query,allowedDomains,blockedDomains)}`;return{url:generateContentUrl(config),init:{method:"POST",headers:withConfigHeaders(config,contentHeaders({"x-goog-api-key":config.apiKey??""}))},body:{contents:[{role:"user",parts:[{text:prompt}]}],tools:[{google_search:{}}]}}}function supportSnippets(metadata){let snippets=new Map;for(let rawSupport of getArray(metadata?.groundingSupports)){let support=getObject(rawSupport),text2=getString2(getObject(support?.segment)?.text);if(text2)for(let rawIndex of getArray(support?.groundingChunkIndices)){let index=getNumber(rawIndex);index!==void 0&&!snippets.has(index)&&snippets.set(index,text2)}}return snippets}function normalizeResponse2(data){return collect(getArray(data.candidates).flatMap(rawCandidate=>{let metadata=getObject(getObject(rawCandidate)?.groundingMetadata),snippets=supportSnippets(metadata);return getArray(metadata?.groundingChunks).map((rawChunk,index)=>{let web=getObject(getObject(rawChunk)?.web),url=getString2(web?.uri);return result2(getString2(web?.title)??url,url,snippets.get(index))})}))}var googleProvider={buildRequest:buildRequest2,normalizeResponse:normalizeResponse2};var googleCseProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),url.searchParams.set("key",config.apiKey??""),url.searchParams.set("cx",config.searchEngineId??""),url.searchParams.set("num",String(clamp(maxResults,1,10))),{url:url.toString(),init:{method:"GET",headers:{Accept:"application/json"}}}},normalizeResponse(data){return collect(getArray(data.items).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.link),getString2(item?.snippet))}))}};var GOOGLE_HOME_URL="https://www.google.com/",SNIPPET_SELECTORS=[".VwiC3b",".IsZvec",".BNeawe.s3v9rd","[data-sncf='1']"];function detectGoogleChallenge(page){if(page.url.includes("/sorry/")||/unusual traffic|g-recaptcha/i.test(page.body))return"unusual-traffic CAPTCHA";if(!/<h3\b/i.test(page.body)){if(page.body.includes("/httpservice/retry/enablejs"))return"JavaScript wall";if(/browser isn.t supported anymore/i.test(page.body))return"unsupported-browser page"}}function unwrapGoogleUrl(href){if(!href)return;let url;try{url=new URL(href,GOOGLE_HOME_URL)}catch{return}let target=url.pathname==="/url"?url.searchParams.get("q")??url.searchParams.get("url"):url.href;return externalResultUrl(target,GOOGLE_HOME_URL,["google.com"])}function normalizeGoogleHtml(document){let items=[];for(let heading of document.querySelectorAll("a h3")){let container=heading.closest(".tF2Cxc, .MjjYud, .Gx5Zad"),snippet=SNIPPET_SELECTORS.map(selector=>cleanText(container?.querySelector(selector)?.textContent)).find(text2=>text2!==void 0);items.push(result2(cleanText(heading.textContent),unwrapGoogleUrl(heading.closest("a")?.getAttribute("href")),snippet))}return uniqueByUrl(collect(items))}var googleHtmlProvider={responseFormat:"html",buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),url.searchParams.set("num",String(clamp(maxResults,1,20))),url.searchParams.set("hl","en"),url.searchParams.set("udm","14"),url.searchParams.set("pws","0"),{url:url.toString(),init:{method:"GET",headers:browserHeaders(GOOGLE_HOME_URL)}}},detectChallenge:detectGoogleChallenge,normalizeDocument:normalizeGoogleHtml};var kagiProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let body={query:request2.query,limit:clamp(maxResults,1,20)};if(allowedDomains||blockedDomains){let lens={};allowedDomains&&(lens.sites_included=allowedDomains),blockedDomains&&(lens.sites_excluded=blockedDomains),body.lens=lens}return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){let search=getObject(data.data);return collect(getArray(search?.search).map(raw=>{let item=getObject(raw),normalized2=result2(getString2(item?.title),getString2(item?.url),getString2(item?.snippet));if(normalized2){let publishedAt=getString2(item?.time);publishedAt&&(normalized2.publishedAt=publishedAt)}return normalized2}))}};var kimiProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:{text_query:appendDomainFilters(request2.query,allowedDomains,blockedDomains),limit:clamp(maxResults,1,20),enable_page_crawling:!1,timeout_seconds:30}}},normalizeResponse(data){return collect(getArray(data.search_results).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.url),getString2(item?.summary)??getString2(item?.content))}))}};var MOJEEK_HOME_URL="https://www.mojeek.com/",MOJEEK_HOSTS=["mojeek.com","mojeek.co.uk","mojeek.de","mojeek.fr"];function detectMojeekChallenge(page){if(!page.body.includes("results-standard")){if(page.body.includes("captcha-wrap")||page.body.includes("altcha"))return"ALTCHA verification page";if(/sending automated queries/i.test(page.body))return"automated-queries refusal"}}function normalizeMojeekHtml(document){let items=[];for(let row of document.querySelectorAll("ul.results-standard > li")){let anchor=row.querySelector("h2 a.title")??row.querySelector("a.title"),url=externalResultUrl(anchor?.getAttribute("href"),MOJEEK_HOME_URL,MOJEEK_HOSTS);items.push(result2(cleanText(anchor?.textContent),url,cleanText(row.querySelector("p.s")?.textContent)))}return uniqueByUrl(collect(items))}var mojeekProvider={responseFormat:"html",buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),url.searchParams.set("t",String(clamp(maxResults,1,20))),{url:url.toString(),init:{method:"GET",headers:browserHeaders(MOJEEK_HOME_URL)}}},detectChallenge:detectMojeekChallenge,normalizeDocument:normalizeMojeekHtml};function searchOnlyPrompt(query){return`Find web pages matching any of these search terms or quoted phrases. If the query contains OR, search each alternative independently. Return only relevant source URLs, one per line. Query: ${query}`}function buildResponsesRequest({config,request:request2,allowedDomains,blockedDomains}){let webSearchTool={type:"web_search",external_web_access:(config.codexMode??"live")==="live"};config.searchContextSize&&(webSearchTool.search_context_size=config.searchContextSize),allowedDomains&&(webSearchTool.filters={allowed_domains:allowedDomains}),config.userLocation&&(webSearchTool.user_location={type:"approximate",...config.userLocation});let input=searchOnlyPrompt(blockedDomains?appendDomainFilters(request2.query,void 0,blockedDomains):request2.query);return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:{model:config.model??"gpt-5.5",input,tools:[webSearchTool],include:["web_search_call.action.sources"],tool_choice:"required"}}}function normalizeResponsesPayload(data,options){let output=getArray(data.output),sources=collect(output.flatMap(raw=>{let item=getObject(raw);if(item?.type!=="web_search_call")return[];let action=getObject(item.action);return getArray(action?.sources).map(sourceRaw=>{let source2=getObject(sourceRaw),url=getString2(source2?.url);return result2(url,url)})})),message=output.map(getObject).find(item=>item?.type==="message"),content=getArray(message?.content).map(getObject).find(item=>item?.type==="output_text"),text2=getString2(content?.text),annotationResults=collect(getArray(content?.annotations).map(raw=>{let item=getObject(raw);return item?.type==="url_citation"?result2(getString2(item.title),getString2(item.url),text2):null}));return annotationResults.length>0?annotationResults:sources.length>0?sources.map(source2=>source2.snippet||text2===void 0?source2:{...source2,snippet:text2}):options.citationsFallback?collect(getArray(data.citations).map(raw=>{let url=getString2(raw);return result2(url,url,text2)})):annotationResults}var openAiResponsesProvider={buildRequest(ctx){return buildResponsesRequest(ctx)},normalizeResponse(data){return normalizeResponsesPayload(data,{citationsFallback:!1})}};function normalizeResultList(items){return collect(items.map(raw=>{let item=getObject(raw),searchResult2=result2(getString2(item?.title),getString2(item?.url),getString2(item?.snippet));if(searchResult2){let publishedAt=getString2(item?.date)??getString2(item?.last_updated);publishedAt&&(searchResult2.publishedAt=publishedAt)}return searchResult2}))}var perplexityProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){if(config.model){let body2={model:config.model,messages:[{role:"user",content:request2.query}]};return allowedDomains&&(body2.search_domain_filter=allowedDomains),!allowedDomains&&blockedDomains&&(body2.search_domain_filter=blockedDomains.map(domain=>`-${domain}`)),config.searchContextSize&&(body2.web_search_options={search_context_size:config.searchContextSize}),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:body2}}let body={query:request2.query,max_results:clamp(maxResults,1,20)};return allowedDomains&&(body.search_domain_filter=allowedDomains),!allowedDomains&&blockedDomains&&(body.search_domain_filter=blockedDomains.map(domain=>`-${domain}`)),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){let chatResults=normalizeResultList(getArray(data.search_results));return chatResults.length>0?chatResults:normalizeResultList(getArray(data.results))}};function searxngSearchUrl(baseUrl){let url=new URL(baseUrl);return url.pathname=`${url.pathname.replace(/\/+$/,"").replace(/\/search$/,"")}/search`,url}function normalizeSearxngResponse(data){return uniqueByUrl(collect(getArray(data.results).map(value2=>{let entry=getObject(value2);if(!entry)return null;let url=getString2(entry.url),item=result2(getString2(entry.title)??url,url,getString2(entry.content)?.trim()||void 0),published=getString2(entry.publishedDate);return item&&published&&(item.publishedAt=published),item})))}var searxngProvider={buildRequest({config,request:request2,allowedDomains,blockedDomains}){let url=searxngSearchUrl(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),url.searchParams.set("format","json"),{url:url.toString(),init:{method:"GET",headers:{Accept:"application/json"}}}},normalizeResponse:normalizeSearxngResponse};var serpdiveProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let body={query:appendDomainFilters(request2.query,allowedDomains,blockedDomains),max_results:clamp(maxResults,1,10)};return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){return collect(getArray(data.results).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.url),getString2(item?.content))}))}};var serperProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let body={q:appendDomainFilters(request2.query,allowedDomains,blockedDomains),num:clamp(maxResults,1,20)};return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({"X-API-KEY":config.apiKey??""})},body}},normalizeResponse(data){return collect(getArray(data.organic).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.link),getString2(item?.snippet))}))}};var STARTPAGE_HOME_URL="https://www.startpage.com/";function detectStartpageChallenge(page){if(page.body.includes('id="anubis_challenge"')||page.body.includes("anubis_version"))return"proof-of-work interstitial";if(/\/(?:errors|captcha)\//.test(page.url)||page.body.includes("component---src-pages-captcha")||page.body.includes("/sp/captcha"))return"CAPTCHA page"}async function searchFormInputs(html){let form=(await parseHtmlDocument(html)).querySelector('form[action="/sp/search"]');if(!form)return;let inputs={};for(let input of form.querySelectorAll('input[type="hidden"]')){let name=input.getAttribute("name");name&&(inputs[name]=input.getAttribute("value")??"")}return inputs.sc?inputs:void 0}function normalizeStartpageHtml(document){let items=[];for(let block of document.querySelectorAll("div.result")){let anchor=block.querySelector("a.result-link"),url=externalResultUrl(anchor?.getAttribute("href"),STARTPAGE_HOME_URL,["startpage.com"]),title=cleanText(anchor?.querySelector("h2, h3")?.textContent??anchor?.textContent);items.push(result2(title,url,cleanText(block.querySelector("p.description")?.textContent)))}return uniqueByUrl(collect(items))}var startpageProvider={responseFormat:"html",buildRequest({config,request:request2,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("query",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),{url:url.toString(),init:{method:"GET",headers:browserHeaders(STARTPAGE_HOME_URL)}}},async prepareRequest(ctx,built,fetchPage){let home=await fetchPage({url:STARTPAGE_HOME_URL,init:{method:"GET",headers:browserHeaders()}}),challenge=detectStartpageChallenge(home);if(challenge)return{challenge};let inputs=home.status>=200&&home.status<300?await searchFormInputs(home.body):void 0;if(!inputs)return built;let form=new URLSearchParams(inputs);return form.set("query",appendDomainFilters(ctx.request.query,ctx.allowedDomains,ctx.blockedDomains)),{url:providerUrl(ctx.config),init:{method:"POST",headers:browserHeaders(STARTPAGE_HOME_URL,{"Content-Type":"application/x-www-form-urlencoded"})},form:form.toString()}},detectChallenge:detectStartpageChallenge,normalizeDocument:normalizeStartpageHtml};var tavilyProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let body={query:request2.query,max_results:clamp(maxResults,1,20)};return allowedDomains&&(body.include_domains=allowedDomains),blockedDomains&&(body.exclude_domains=blockedDomains),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){return collect(getArray(data.results).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.url),getString2(item?.content),void 0,getNumber(item?.score))}))}};var xaiProvider={buildRequest({config,request:request2,allowedDomains,blockedDomains}){let webSearchTool={type:"web_search"};return allowedDomains&&(webSearchTool.filters={allowed_domains:allowedDomains.slice(0,5)}),!allowedDomains&&blockedDomains&&(webSearchTool.filters={excluded_domains:blockedDomains.slice(0,5)}),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:{model:config.model??"grok-4.3",input:request2.query,tools:[webSearchTool],tool_choice:"required"}}},normalizeResponse(data){return normalizeResponsesPayload(data,{citationsFallback:!0})}};var zAiProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){if(config.model){let webSearch={enable:!0,search_engine:"search-prime",search_result:!0,count:clamp(maxResults,1,50)};return allowedDomains?.[0]&&(webSearch.search_domain_filter=allowedDomains[0]),config.searchContextSize&&(webSearch.content_size=config.searchContextSize),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:{model:config.model,messages:[{role:"user",content:request2.query}],tools:[{type:"web_search",web_search:webSearch}]}}}let body={search_engine:"search-prime",search_query:appendDomainFilters(request2.query,void 0,blockedDomains),count:clamp(maxResults,1,50)};return allowedDomains?.[0]&&(body.search_domain_filter=allowedDomains[0]),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){let chatResults=collect(getArray(data.web_search).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.link),getString2(item?.content),getString2(item?.media))}));return chatResults.length>0?chatResults:collect(getArray(data.search_result).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.link),getString2(item?.content),getString2(item?.media))}))}};var PROVIDER_MODULES={exa:exaProvider,tavily:tavilyProvider,serpdive:serpdiveProvider,brave:braveProvider,"duckduckgo-html":duckDuckGoHtmlProvider,deepseek:deepseekProvider,serper:serperProvider,"google-cse":googleCseProvider,"z-ai":zAiProvider,openai:openAiResponsesProvider,codex:openAiResponsesProvider,"chatgpt-subscription":chatgptSubscriptionProvider,google:googleProvider,anthropic:anthropicProvider,perplexity:perplexityProvider,xai:xaiProvider,kimi:kimiProvider,kagi:kagiProvider,startpage:startpageProvider,mojeek:mojeekProvider,ecosia:ecosiaProvider,"google-html":googleHtmlProvider,"exa-mcp":exaMcpProvider,searxng:searxngProvider};function buildContext(config,request2){let{allowedDomains,blockedDomains}=resolveDomainFilters(config,request2);return{config,request:request2,maxResults:config.maxResults??request2.maxResults,allowedDomains,blockedDomains}}function parseProviderBody(provider,bodyText){return PROVIDER_MODULES[provider].parseBody?.(bodyText)}async function prepareSearchRequest(config,request2,fetchPage){let module=PROVIDER_MODULES[config.provider],ctx=buildContext(config,request2),built=module.buildRequest(ctx);return module.prepareRequest?module.prepareRequest(ctx,built,fetchPage):built}function searchResponseFormat(provider){return PROVIDER_MODULES[provider].responseFormat??"json"}function detectSearchChallenge(provider,page){return PROVIDER_MODULES[provider].detectChallenge?.(page)}function searchResponseError(provider,payload){return PROVIDER_MODULES[provider].responseError?.(parseObjectPayload(payload))}async function normalizeSearchResponse(provider,payload){let module=PROVIDER_MODULES[provider],data=parseObjectPayload(payload);if(module.normalizeDocument){let html=typeof data.html=="string"?data.html:"";return module.normalizeDocument(await parseHtmlDocument(html))}return module.normalizeResponse?.(data)??[]}var MAX_ERROR_DETAIL_LENGTH=500,DEFAULT_PROVIDER_TIMEOUT_MS=6e4,ENGINE_COOLDOWN_BASE_MS=6e4,ENGINE_COOLDOWN_MAX_MS=15*6e4,ENGINE_NAMES={"duckduckgo-html":"DuckDuckGo",startpage:"Startpage",mojeek:"Mojeek",ecosia:"Ecosia","google-html":"Google","exa-mcp":"Exa",searxng:"SearXNG"},BLOCK_DESCRIPTIONS={challenge:"a bot challenge",rate_limited:"a rate limit",forbidden:"a refusal",network:"a network error"};function isJsonObject3(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function truncate2(value2,max){return value2.length>max?`${value2.slice(0,max-1)}\u2026`:value2}function extractErrorDetail(payload,bodyText){if(isJsonObject3(payload)){let obj=payload,error2=obj.error;if(typeof error2=="string"&&error2.length>0)return truncate2(error2,MAX_ERROR_DETAIL_LENGTH);if(isJsonObject3(error2)){let message2=error2.message;if(typeof message2=="string"&&message2.length>0)return truncate2(message2,MAX_ERROR_DETAIL_LENGTH)}let message=obj.message;if(typeof message=="string"&&message.length>0)return truncate2(message,MAX_ERROR_DETAIL_LENGTH)}let trimmed=bodyText.trim();return trimmed?truncate2(trimmed,MAX_ERROR_DETAIL_LENGTH):""}function httpErrorMessage(status,payload,bodyText){let detail=extractErrorDetail(payload,bodyText);return detail?`Search failed with HTTP ${status}: ${detail}`:`Search failed with HTTP ${status}`}function abortReason2(signal){return signal.reason??new DOMException("The operation was aborted.","AbortError")}function timeoutMsFor(config){return Math.max(1,Math.trunc(config.timeoutMs??DEFAULT_PROVIDER_TIMEOUT_MS))}function providerTimeoutMessage(timeoutMs){return`Search timed out after ${timeoutMs}ms`}function searchAbortSignal(outerSignal,timeoutMs){if(outerSignal?.aborted)throw abortReason2(outerSignal);let controller=new AbortController,timeout=setTimeout(()=>{controller.abort(new DOMException(providerTimeoutMessage(timeoutMs),"TimeoutError"))},timeoutMs),onAbort=()=>controller.abort(outerSignal?abortReason2(outerSignal):void 0);return outerSignal?.addEventListener("abort",onAbort,{once:!0}),{signal:controller.signal,cleanup:()=>{clearTimeout(timeout),outerSignal?.removeEventListener("abort",onAbort)}}}function noResultsMessage(config,request2){return`Search provider ${providerEntryLabel(config)} returned no results for "${request2.query}".`}function createSearchRoutingState(providerCount,cooldowns=new Map){return{roundRobinCursor:0,successCounts:Array.from({length:providerCount},()=>0),cooldowns}}function sortedPriorityIndices(providers){return providers.map((provider,index)=>({index,priority:provider.priority??index})).sort((left,right)=>left.priority-right.priority||left.index-right.index).map(item=>item.index)}function weightedIndices(providers){let indices=[];for(let[index,provider]of providers.entries()){let weight=Math.max(1,Math.trunc(provider.weight??1));for(let count=0;count<weight;count+=1)indices.push(index)}return indices.length>0?indices:providers.map((_provider,index)=>index)}function rotateUnique(indices,start,providerCount){let order=[];for(let offset=0;offset<indices.length;offset+=1){let index=indices[(start+offset)%indices.length];index!==void 0&&!order.includes(index)&&order.push(index)}for(let index=0;index<providerCount;index+=1)order.includes(index)||order.push(index);return order}function selectOrder(strategy,providers,state){if(strategy==="priority")return sortedPriorityIndices(providers);if(strategy==="round-robin"){let indices=weightedIndices(providers),order=rotateUnique(indices,state.roundRobinCursor%indices.length,providers.length);return state.roundRobinCursor=(state.roundRobinCursor+1)%indices.length,order}let selected=0,selectedCount=state.successCounts[0]??0;for(let index=1;index<providers.length;index+=1){let count=state.successCounts[index]??0;count<selectedCount&&(selected=index,selectedCount=count)}return[selected,...providers.map((_provider,index)=>index).filter(index=>index!==selected)]}function requestInit(built,signal){let init={...built.init,signal};return built.body!==void 0?init.body=JSON.stringify(built.body):built.form!==void 0&&(init.body=built.form),init}function parseJson2(text2){try{return JSON.parse(text2)}catch{return{}}}function parseEventStream(text2){if(text2.trimStart().startsWith("{"))return parseJson2(text2);for(let line of text2.split(/\r?\n/)){if(!line.startsWith("data:"))continue;let message=parseJson2(line.slice(5).trim());if(isJsonObject3(message)&&("result"in message||"error"in message))return message}return{}}function responsePayload(provider,page){let parsed=parseProviderBody(provider,page.body);if(parsed)return parsed;let format2=searchResponseFormat(provider);return format2==="html"?{html:page.body,url:page.url}:page.body.length===0?{}:format2==="event-stream"?parseEventStream(page.body):parseJson2(page.body)}function retryAfterSeconds(response){let header2=response.headers.get("retry-after");if(!header2)return;let seconds=Number(header2);if(Number.isFinite(seconds))return Math.max(0,seconds);let date=Date.parse(header2);return Number.isNaN(date)?void 0:Math.max(0,Math.ceil((date-Date.now())/1e3))}function blockForStatus(status){if(status===429)return"rate_limited";if(status===403)return"forbidden"}function engineName(provider){return ENGINE_NAMES[provider]??provider}async function performProviderSearch(config,request2,signal){let startedAt=Date.now(),failure2=(error2,extra={})=>{let details2={provider:config.provider,query:request2.query,results:[],durationMs:Date.now()-startedAt,truncated:!1,error:error2,...extra};return config.id!==void 0&&(details2.entryId=config.id),details2},challengeFailure=challenge2=>failure2(`${engineName(config.provider)} served a bot challenge (${challenge2}) that needs a browser to pass.`,{blocked:"challenge"}),abort=searchAbortSignal(signal,timeoutMsFor(config)),response,page;try{let prepared=await prepareSearchRequest(config,request2,async built=>{let handshake=await fetch(built.url,requestInit(built,abort.signal));return{status:handshake.status,url:handshake.url||built.url,body:await handshake.text()}});if("challenge"in prepared)return challengeFailure(prepared.challenge);response=await fetch(prepared.url,requestInit(prepared,abort.signal)),page={status:response.status,url:response.url||prepared.url,body:await response.text()}}catch(error2){if(signal?.aborted)throw abortReason2(signal);return failure2(error2 instanceof Error?error2.message:"Search request failed",{blocked:"network"})}finally{abort.cleanup()}let challenge=detectSearchChallenge(config.provider,page);if(challenge)return challengeFailure(challenge);let payload=responsePayload(config.provider,page);if(!response.ok){let extra={},blocked=blockForStatus(response.status),retryAfter=retryAfterSeconds(response);return blocked&&(extra.blocked=blocked),retryAfter!==void 0&&(extra.retryAfterSeconds=retryAfter),failure2(httpErrorMessage(response.status,payload,page.body),extra)}let serviceError=searchResponseError(config.provider,payload);if(serviceError)return failure2(serviceError);let results=await normalizeSearchResponse(config.provider,payload),max=request2.maxResults,limitedResults=results.slice(0,max),details={provider:config.provider,query:request2.query,results:limitedResults,durationMs:Date.now()-startedAt,truncated:results.length>max};if(limitedResults.length===0){let payloadError2=isJsonObject3(payload)&&payload.error!==void 0?extractErrorDetail({error:payload.error},""):"";details.error=payloadError2?`Search provider ${providerEntryLabel(config)} failed: ${payloadError2}`:noResultsMessage(config,request2)}return config.id!==void 0&&(details.entryId=config.id),details}function attemptFromDetails(details){let attempt2={provider:details.provider,durationMs:details.durationMs,resultsCount:details.results.length};return details.entryId&&(attempt2.entryId=details.entryId),details.model&&(attempt2.model=details.model),details.error&&(attempt2.error=details.error),details.blocked&&(attempt2.blocked=details.blocked),attempt2}function activeCooldown(state,provider,now2){if(!KEYLESS_PROVIDERS.has(provider.provider))return;let cooldown=state.cooldowns.get(providerEntryLabel(provider));return cooldown&&cooldown.until>now2?cooldown:void 0}function skippedAttempt(provider,cooldown,now2){let seconds=Math.ceil((cooldown.until-now2)/1e3),attempt2={provider:provider.provider,durationMs:0,resultsCount:0,skipped:!0,blocked:cooldown.reason,error:`skipped (cooling down for ${seconds}s after ${BLOCK_DESCRIPTIONS[cooldown.reason]})`};return provider.id!==void 0&&(attempt2.entryId=provider.id),attempt2}function recordEngineOutcome(state,provider,details){if(!KEYLESS_PROVIDERS.has(provider.provider))return;let key=providerEntryLabel(provider);if(!details.error){state.cooldowns.delete(key);return}if(!details.blocked)return;let failures=(state.cooldowns.get(key)?.failures??0)+1,backoff=Math.min(ENGINE_COOLDOWN_MAX_MS,ENGINE_COOLDOWN_BASE_MS*2**(failures-1)),requested=Math.min(ENGINE_COOLDOWN_MAX_MS,(details.retryAfterSeconds??0)*1e3);state.cooldowns.set(key,{failures,until:Date.now()+Math.max(backoff,requested),reason:details.blocked})}async function searchRoute(entry,request2,signal,attempts,notify2){let searchEntry=async variant=>{notify2(providerEntryLabel(variant));let result3=await performProviderSearch(variant,request2,signal);return variant.model!==void 0&&(result3.model=variant.model),attempts.push(attemptFromDetails(result3)),result3},[primary,...retries]=routeAttemptEntries(entry),details=await searchEntry(primary);for(let retry of retries){if(!details.error)break;details=await searchEntry(retry)}return details}async function performSearch(config,request2,signal,routingState,onAttempt){let startedAt=Date.now(),state=routingState??createSearchRoutingState(config.providers.length),order=selectOrder(config.strategy,config.providers,state),attempts=[],routeLabels=order.flatMap(index=>{let provider=config.providers[index];return provider?routeAttemptEntries(provider).map(attemptRouteLabel):[]}),collected=new Map,selectedDetails;for(let index of order){let provider=config.providers[index];if(!provider)continue;let now2=Date.now(),cooldown=activeCooldown(state,provider,now2);if(cooldown){if(attempts.push(skippedAttempt(provider,cooldown,now2)),!config.fallback)break;continue}let details=await searchRoute(provider,request2,signal,attempts,label3=>onAttempt?.(label3,attempts,routeLabels));if(recordEngineOutcome(state,provider,details),details.error){if(!config.fallback)return{...details,strategy:config.strategy,attempts};selectedDetails=details;continue}if(state.successCounts[index]=(state.successCounts[index]??0)+1,config.strategy!=="fill-first")return{...details,strategy:config.strategy,attempts};selectedDetails=details;for(let item of details.results){if(collected.size>=request2.maxResults)break;collected.set(item.url,item)}if(collected.size>=request2.maxResults)break}if(collected.size>0&&selectedDetails){let results=[...collected.values()],details={provider:selectedDetails.provider,query:request2.query,results,durationMs:Date.now()-startedAt,truncated:results.length>=request2.maxResults,strategy:config.strategy,attempts};return selectedDetails.entryId!==void 0&&(details.entryId=selectedDetails.entryId),selectedDetails.model!==void 0&&(details.model=selectedDetails.model),details}return{...selectedDetails??{provider:config.providers[0]?.provider??"exa",query:request2.query,results:[],durationMs:Date.now()-startedAt,truncated:!1,error:"All configured search providers failed."},durationMs:Date.now()-startedAt,strategy:config.strategy,attempts,error:`All configured search providers failed: ${attempts.map(attempt2=>`${attemptRouteLabel(attempt2)} ${attempt2.error??"failed"}`).join("; ")}`}}function attemptOutcome(attempt2){return attempt2.skipped?attempt2.error??"skipped":attempt2.error?`${attempt2.blocked==="challenge"?"challenged":"failed"}: ${attempt2.error}`:`${attempt2.resultsCount} result${attempt2.resultsCount===1?"":"s"}`}function formatSearchText(details){if(details.error)return details.error;if(details.results.length===0)return`No web search results found for "${details.query}".`;let route=` via ${attemptRouteLabel(details)}`,lines=[`Web search results for "${details.query}"${route}:`,""];details.attempts&&details.attempts.length>0&&lines.push(`Routing attempts: ${details.attempts.map(attempt2=>`${attemptRouteLabel(attempt2)} ${attemptOutcome(attempt2)}`).join(" -> ")}`,"");for(let[index,item]of details.results.entries())lines.push(`${index+1}. ${item.title}`),lines.push(` ${item.url}`),item.snippet&&lines.push(` ${item.snippet}`);return lines.push("","REMINDER: Include relevant sources from the URLs above in the final answer."),lines.join(`
|
|
2306
|
+
`).split(/\n{2,}(?=Title:)/).filter(section=>section.startsWith("Title:"));return uniqueByUrl(collect(sections.map(section=>{let item=result2(field(section,"Title"),field(section,"URL"),snippetOf(section)),published=field(section,"Published")??field(section,"Published Date");return item&&published&&(item.publishedAt=published),item})))}function exaMcpError(data){let rpcError=getString2(getObject(data.error)?.message);if(rpcError)return`Exa MCP error: ${rpcError}`;let toolResult=getObject(data.result);return toolResult?.isError!==!0?void 0:`Exa MCP error: ${getArray(toolResult.content).map(part=>getString2(getObject(part)?.text)??"").join(" ").trim()||"the search tool reported an error"}`}var exaMcpProvider={responseFormat:"event-stream",buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("tools","web_search_exa"),{url:url.toString(),init:{method:"POST",headers:{Accept:"application/json, text/event-stream","Content-Type":"application/json"}},body:{jsonrpc:"2.0",id:1,method:"tools/call",params:{name:"web_search_exa",arguments:{query:appendDomainFilters(request2.query,allowedDomains,blockedDomains),numResults:clamp(maxResults,1,20)}}}}},responseError:exaMcpError,normalizeResponse:normalizeExaMcpResult};var DEFAULT_MODEL3="gemini-2.5-flash";function generateContentUrl(config){let root=providerUrl(config).replace(/\/+$/,"");if(root.endsWith(":generateContent"))return root;let model=(config.model??DEFAULT_MODEL3).replace(/^models\//,"");return`${root}/models/${encodeURIComponent(model)}:generateContent`}function buildRequest2({config,request:request2,allowedDomains,blockedDomains}){let prompt=`Search the web with Google Search and answer briefly, citing the pages you used. Query: ${appendDomainFilters(request2.query,allowedDomains,blockedDomains)}`;return{url:generateContentUrl(config),init:{method:"POST",headers:withConfigHeaders(config,contentHeaders({"x-goog-api-key":config.apiKey??""}))},body:{contents:[{role:"user",parts:[{text:prompt}]}],tools:[{google_search:{}}]}}}function supportSnippets(metadata){let snippets=new Map;for(let rawSupport of getArray(metadata?.groundingSupports)){let support=getObject(rawSupport),text2=getString2(getObject(support?.segment)?.text);if(text2)for(let rawIndex of getArray(support?.groundingChunkIndices)){let index=getNumber(rawIndex);index!==void 0&&!snippets.has(index)&&snippets.set(index,text2)}}return snippets}function normalizeResponse2(data){return collect(getArray(data.candidates).flatMap(rawCandidate=>{let metadata=getObject(getObject(rawCandidate)?.groundingMetadata),snippets=supportSnippets(metadata);return getArray(metadata?.groundingChunks).map((rawChunk,index)=>{let web=getObject(getObject(rawChunk)?.web),url=getString2(web?.uri);return result2(getString2(web?.title)??url,url,snippets.get(index))})}))}var googleProvider={buildRequest:buildRequest2,normalizeResponse:normalizeResponse2};var googleCseProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),url.searchParams.set("key",config.apiKey??""),url.searchParams.set("cx",config.searchEngineId??""),url.searchParams.set("num",String(clamp(maxResults,1,10))),{url:url.toString(),init:{method:"GET",headers:{Accept:"application/json"}}}},normalizeResponse(data){return collect(getArray(data.items).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.link),getString2(item?.snippet))}))}};var GOOGLE_HOME_URL="https://www.google.com/",SNIPPET_SELECTORS=[".VwiC3b",".IsZvec",".BNeawe.s3v9rd","[data-sncf='1']"];function detectGoogleChallenge(page){if(page.url.includes("/sorry/")||/unusual traffic|g-recaptcha/i.test(page.body))return"unusual-traffic CAPTCHA";if(!/<h3\b/i.test(page.body)){if(page.body.includes("/httpservice/retry/enablejs"))return"JavaScript wall";if(/browser isn.t supported anymore/i.test(page.body))return"unsupported-browser page"}}function unwrapGoogleUrl(href){if(!href)return;let url;try{url=new URL(href,GOOGLE_HOME_URL)}catch{return}let target=url.pathname==="/url"?url.searchParams.get("q")??url.searchParams.get("url"):url.href;return externalResultUrl(target,GOOGLE_HOME_URL,["google.com"])}function normalizeGoogleHtml(document){let items=[];for(let heading of document.querySelectorAll("a h3")){let container=heading.closest(".tF2Cxc, .MjjYud, .Gx5Zad"),snippet=SNIPPET_SELECTORS.map(selector=>cleanText(container?.querySelector(selector)?.textContent)).find(text2=>text2!==void 0);items.push(result2(cleanText(heading.textContent),unwrapGoogleUrl(heading.closest("a")?.getAttribute("href")),snippet))}return uniqueByUrl(collect(items))}var googleHtmlProvider={responseFormat:"html",buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),url.searchParams.set("num",String(clamp(maxResults,1,20))),url.searchParams.set("hl","en"),url.searchParams.set("udm","14"),url.searchParams.set("pws","0"),{url:url.toString(),init:{method:"GET",headers:browserHeaders(GOOGLE_HOME_URL)}}},detectChallenge:detectGoogleChallenge,normalizeDocument:normalizeGoogleHtml};var kagiProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let body={query:request2.query,limit:clamp(maxResults,1,20)};if(allowedDomains||blockedDomains){let lens={};allowedDomains&&(lens.sites_included=allowedDomains),blockedDomains&&(lens.sites_excluded=blockedDomains),body.lens=lens}return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){let search=getObject(data.data);return collect(getArray(search?.search).map(raw=>{let item=getObject(raw),normalized2=result2(getString2(item?.title),getString2(item?.url),getString2(item?.snippet));if(normalized2){let publishedAt=getString2(item?.time);publishedAt&&(normalized2.publishedAt=publishedAt)}return normalized2}))}};var PUBLIC_SEARCH_URL="https://api.keenable.ai/v1/search/public";function httpUrl(value2){if(!(!value2||value2.length>2048||/[\t\n\r]/.test(value2)))try{let url=new URL(value2);return url.protocol==="http:"||url.protocol==="https:"?url.toString():void 0}catch{return}}var keenableProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let site=allowedDomains?.length===1?allowedDomains[0]:void 0,body={query:appendDomainFilters(request2.query,site?void 0:allowedDomains,blockedDomains),max_results:clamp(maxResults,1,50)};site&&(body.site=site);let keyed=typeof config.apiKey=="string"&&config.apiKey.length>0;return{url:keyed||config.baseUrl?providerUrl(config):PUBLIC_SEARCH_URL,init:{method:"POST",headers:contentHeaders(keyed?{"X-API-Key":config.apiKey??""}:{"X-Keenable-Title":APP_NAME})},body}},normalizeResponse(data){return collect(getArray(data.results).map(raw=>{let item=getObject(raw),url=httpUrl(getString2(item?.url));if(!item||!url)return null;let normalized2=result2(getString2(item.title)??url,url,getString2(item.snippet)??getString2(item.description));if(normalized2){let publishedAt=getString2(item.published_at);publishedAt&&(normalized2.publishedAt=publishedAt)}return normalized2}))}};var kimiProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:{text_query:appendDomainFilters(request2.query,allowedDomains,blockedDomains),limit:clamp(maxResults,1,20),enable_page_crawling:!1,timeout_seconds:30}}},normalizeResponse(data){return collect(getArray(data.search_results).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.url),getString2(item?.summary)??getString2(item?.content))}))}};var MOJEEK_HOME_URL="https://www.mojeek.com/",MOJEEK_HOSTS=["mojeek.com","mojeek.co.uk","mojeek.de","mojeek.fr"];function detectMojeekChallenge(page){if(!page.body.includes("results-standard")){if(page.body.includes("captcha-wrap")||page.body.includes("altcha"))return"ALTCHA verification page";if(/sending automated queries/i.test(page.body))return"automated-queries refusal"}}function normalizeMojeekHtml(document){let items=[];for(let row of document.querySelectorAll("ul.results-standard > li")){let anchor=row.querySelector("h2 a.title")??row.querySelector("a.title"),url=externalResultUrl(anchor?.getAttribute("href"),MOJEEK_HOME_URL,MOJEEK_HOSTS);items.push(result2(cleanText(anchor?.textContent),url,cleanText(row.querySelector("p.s")?.textContent)))}return uniqueByUrl(collect(items))}var mojeekProvider={responseFormat:"html",buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),url.searchParams.set("t",String(clamp(maxResults,1,20))),{url:url.toString(),init:{method:"GET",headers:browserHeaders(MOJEEK_HOME_URL)}}},detectChallenge:detectMojeekChallenge,normalizeDocument:normalizeMojeekHtml};function searchOnlyPrompt(query){return`Find web pages matching any of these search terms or quoted phrases. If the query contains OR, search each alternative independently. Return only relevant source URLs, one per line. Query: ${query}`}function buildResponsesRequest({config,request:request2,allowedDomains,blockedDomains}){let webSearchTool={type:"web_search",external_web_access:(config.codexMode??"live")==="live"};config.searchContextSize&&(webSearchTool.search_context_size=config.searchContextSize),allowedDomains&&(webSearchTool.filters={allowed_domains:allowedDomains}),config.userLocation&&(webSearchTool.user_location={type:"approximate",...config.userLocation});let input=searchOnlyPrompt(blockedDomains?appendDomainFilters(request2.query,void 0,blockedDomains):request2.query);return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:{model:config.model??"gpt-5.5",input,tools:[webSearchTool],include:["web_search_call.action.sources"],tool_choice:"required"}}}function normalizeResponsesPayload(data,options){let output=getArray(data.output),sources=collect(output.flatMap(raw=>{let item=getObject(raw);if(item?.type!=="web_search_call")return[];let action=getObject(item.action);return getArray(action?.sources).map(sourceRaw=>{let source2=getObject(sourceRaw),url=getString2(source2?.url);return result2(url,url)})})),message=output.map(getObject).find(item=>item?.type==="message"),content=getArray(message?.content).map(getObject).find(item=>item?.type==="output_text"),text2=getString2(content?.text),annotationResults=collect(getArray(content?.annotations).map(raw=>{let item=getObject(raw);return item?.type==="url_citation"?result2(getString2(item.title),getString2(item.url),text2):null}));return annotationResults.length>0?annotationResults:sources.length>0?sources.map(source2=>source2.snippet||text2===void 0?source2:{...source2,snippet:text2}):options.citationsFallback?collect(getArray(data.citations).map(raw=>{let url=getString2(raw);return result2(url,url,text2)})):annotationResults}var openAiResponsesProvider={buildRequest(ctx){return buildResponsesRequest(ctx)},normalizeResponse(data){return normalizeResponsesPayload(data,{citationsFallback:!1})}};function normalizeResultList(items){return collect(items.map(raw=>{let item=getObject(raw),searchResult2=result2(getString2(item?.title),getString2(item?.url),getString2(item?.snippet));if(searchResult2){let publishedAt=getString2(item?.date)??getString2(item?.last_updated);publishedAt&&(searchResult2.publishedAt=publishedAt)}return searchResult2}))}var perplexityProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){if(config.model){let body2={model:config.model,messages:[{role:"user",content:request2.query}]};return allowedDomains&&(body2.search_domain_filter=allowedDomains),!allowedDomains&&blockedDomains&&(body2.search_domain_filter=blockedDomains.map(domain=>`-${domain}`)),config.searchContextSize&&(body2.web_search_options={search_context_size:config.searchContextSize}),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:body2}}let body={query:request2.query,max_results:clamp(maxResults,1,20)};return allowedDomains&&(body.search_domain_filter=allowedDomains),!allowedDomains&&blockedDomains&&(body.search_domain_filter=blockedDomains.map(domain=>`-${domain}`)),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){let chatResults=normalizeResultList(getArray(data.search_results));return chatResults.length>0?chatResults:normalizeResultList(getArray(data.results))}};function searxngSearchUrl(baseUrl){let url=new URL(baseUrl);return url.pathname=`${url.pathname.replace(/\/+$/,"").replace(/\/search$/,"")}/search`,url}function normalizeSearxngResponse(data){return uniqueByUrl(collect(getArray(data.results).map(value2=>{let entry=getObject(value2);if(!entry)return null;let url=getString2(entry.url),item=result2(getString2(entry.title)??url,url,getString2(entry.content)?.trim()||void 0),published=getString2(entry.publishedDate);return item&&published&&(item.publishedAt=published),item})))}var searxngProvider={buildRequest({config,request:request2,allowedDomains,blockedDomains}){let url=searxngSearchUrl(providerUrl(config));return url.searchParams.set("q",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),url.searchParams.set("format","json"),{url:url.toString(),init:{method:"GET",headers:{Accept:"application/json"}}}},normalizeResponse:normalizeSearxngResponse};var serpdiveProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let body={query:appendDomainFilters(request2.query,allowedDomains,blockedDomains),max_results:clamp(maxResults,1,10)};return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){return collect(getArray(data.results).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.url),getString2(item?.content))}))}};var serperProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let body={q:appendDomainFilters(request2.query,allowedDomains,blockedDomains),num:clamp(maxResults,1,20)};return{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({"X-API-KEY":config.apiKey??""})},body}},normalizeResponse(data){return collect(getArray(data.organic).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.link),getString2(item?.snippet))}))}};var STARTPAGE_HOME_URL="https://www.startpage.com/";function detectStartpageChallenge(page){if(page.body.includes('id="anubis_challenge"')||page.body.includes("anubis_version"))return"proof-of-work interstitial";if(/\/(?:errors|captcha)\//.test(page.url)||page.body.includes("component---src-pages-captcha")||page.body.includes("/sp/captcha"))return"CAPTCHA page"}async function searchFormInputs(html){let form=(await parseHtmlDocument(html)).querySelector('form[action="/sp/search"]');if(!form)return;let inputs={};for(let input of form.querySelectorAll('input[type="hidden"]')){let name=input.getAttribute("name");name&&(inputs[name]=input.getAttribute("value")??"")}return inputs.sc?inputs:void 0}function normalizeStartpageHtml(document){let items=[];for(let block of document.querySelectorAll("div.result")){let anchor=block.querySelector("a.result-link"),url=externalResultUrl(anchor?.getAttribute("href"),STARTPAGE_HOME_URL,["startpage.com"]),title=cleanText(anchor?.querySelector("h2, h3")?.textContent??anchor?.textContent);items.push(result2(title,url,cleanText(block.querySelector("p.description")?.textContent)))}return uniqueByUrl(collect(items))}var startpageProvider={responseFormat:"html",buildRequest({config,request:request2,allowedDomains,blockedDomains}){let url=new URL(providerUrl(config));return url.searchParams.set("query",appendDomainFilters(request2.query,allowedDomains,blockedDomains)),{url:url.toString(),init:{method:"GET",headers:browserHeaders(STARTPAGE_HOME_URL)}}},async prepareRequest(ctx,built,fetchPage){let home=await fetchPage({url:STARTPAGE_HOME_URL,init:{method:"GET",headers:browserHeaders()}}),challenge=detectStartpageChallenge(home);if(challenge)return{challenge};let inputs=home.status>=200&&home.status<300?await searchFormInputs(home.body):void 0;if(!inputs)return built;let form=new URLSearchParams(inputs);return form.set("query",appendDomainFilters(ctx.request.query,ctx.allowedDomains,ctx.blockedDomains)),{url:providerUrl(ctx.config),init:{method:"POST",headers:browserHeaders(STARTPAGE_HOME_URL,{"Content-Type":"application/x-www-form-urlencoded"})},form:form.toString()}},detectChallenge:detectStartpageChallenge,normalizeDocument:normalizeStartpageHtml};var tavilyProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){let body={query:request2.query,max_results:clamp(maxResults,1,20)};return allowedDomains&&(body.include_domains=allowedDomains),blockedDomains&&(body.exclude_domains=blockedDomains),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){return collect(getArray(data.results).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.url),getString2(item?.content),void 0,getNumber(item?.score))}))}};var xaiProvider={buildRequest({config,request:request2,allowedDomains,blockedDomains}){let webSearchTool={type:"web_search"};return allowedDomains&&(webSearchTool.filters={allowed_domains:allowedDomains.slice(0,5)}),!allowedDomains&&blockedDomains&&(webSearchTool.filters={excluded_domains:blockedDomains.slice(0,5)}),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:{model:config.model??"grok-4.3",input:request2.query,tools:[webSearchTool],tool_choice:"required"}}},normalizeResponse(data){return normalizeResponsesPayload(data,{citationsFallback:!0})}};var zAiProvider={buildRequest({config,request:request2,maxResults,allowedDomains,blockedDomains}){if(config.model){let webSearch={enable:!0,search_engine:"search-prime",search_result:!0,count:clamp(maxResults,1,50)};return allowedDomains?.[0]&&(webSearch.search_domain_filter=allowedDomains[0]),config.searchContextSize&&(webSearch.content_size=config.searchContextSize),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body:{model:config.model,messages:[{role:"user",content:request2.query}],tools:[{type:"web_search",web_search:webSearch}]}}}let body={search_engine:"search-prime",search_query:appendDomainFilters(request2.query,void 0,blockedDomains),count:clamp(maxResults,1,50)};return allowedDomains?.[0]&&(body.search_domain_filter=allowedDomains[0]),{url:providerUrl(config),init:{method:"POST",headers:contentHeaders({Authorization:`Bearer ${config.apiKey??""}`})},body}},normalizeResponse(data){let chatResults=collect(getArray(data.web_search).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.link),getString2(item?.content),getString2(item?.media))}));return chatResults.length>0?chatResults:collect(getArray(data.search_result).map(raw=>{let item=getObject(raw);return result2(getString2(item?.title),getString2(item?.link),getString2(item?.content),getString2(item?.media))}))}};var PROVIDER_MODULES={exa:exaProvider,tavily:tavilyProvider,serpdive:serpdiveProvider,brave:braveProvider,"duckduckgo-html":duckDuckGoHtmlProvider,deepseek:deepseekProvider,serper:serperProvider,"google-cse":googleCseProvider,"z-ai":zAiProvider,openai:openAiResponsesProvider,codex:openAiResponsesProvider,"chatgpt-subscription":chatgptSubscriptionProvider,google:googleProvider,anthropic:anthropicProvider,perplexity:perplexityProvider,xai:xaiProvider,kimi:kimiProvider,kagi:kagiProvider,startpage:startpageProvider,mojeek:mojeekProvider,ecosia:ecosiaProvider,"google-html":googleHtmlProvider,"exa-mcp":exaMcpProvider,searxng:searxngProvider,keenable:keenableProvider};function buildContext(config,request2){let{allowedDomains,blockedDomains}=resolveDomainFilters(config,request2);return{config,request:request2,maxResults:config.maxResults??request2.maxResults,allowedDomains,blockedDomains}}function parseProviderBody(provider,bodyText){return PROVIDER_MODULES[provider].parseBody?.(bodyText)}async function prepareSearchRequest(config,request2,fetchPage){let module=PROVIDER_MODULES[config.provider],ctx=buildContext(config,request2),built=module.buildRequest(ctx);return module.prepareRequest?module.prepareRequest(ctx,built,fetchPage):built}function searchResponseFormat(provider){return PROVIDER_MODULES[provider].responseFormat??"json"}function detectSearchChallenge(provider,page){return PROVIDER_MODULES[provider].detectChallenge?.(page)}function searchResponseError(provider,payload){return PROVIDER_MODULES[provider].responseError?.(parseObjectPayload(payload))}async function normalizeSearchResponse(provider,payload){let module=PROVIDER_MODULES[provider],data=parseObjectPayload(payload);if(module.normalizeDocument){let html=typeof data.html=="string"?data.html:"";return module.normalizeDocument(await parseHtmlDocument(html))}return module.normalizeResponse?.(data)??[]}var MAX_ERROR_DETAIL_LENGTH=500,DEFAULT_PROVIDER_TIMEOUT_MS=6e4,ENGINE_COOLDOWN_BASE_MS=6e4,ENGINE_COOLDOWN_MAX_MS=15*6e4,ENGINE_NAMES={"duckduckgo-html":"DuckDuckGo",startpage:"Startpage",mojeek:"Mojeek",ecosia:"Ecosia","google-html":"Google","exa-mcp":"Exa",searxng:"SearXNG"},BLOCK_DESCRIPTIONS={challenge:"a bot challenge",rate_limited:"a rate limit",forbidden:"a refusal",network:"a network error"};function isJsonObject3(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function truncate2(value2,max){return value2.length>max?`${value2.slice(0,max-1)}\u2026`:value2}function extractErrorDetail(payload,bodyText){if(isJsonObject3(payload)){let obj=payload,error2=obj.error;if(typeof error2=="string"&&error2.length>0)return truncate2(error2,MAX_ERROR_DETAIL_LENGTH);if(isJsonObject3(error2)){let message2=error2.message;if(typeof message2=="string"&&message2.length>0)return truncate2(message2,MAX_ERROR_DETAIL_LENGTH)}let message=obj.message;if(typeof message=="string"&&message.length>0)return truncate2(message,MAX_ERROR_DETAIL_LENGTH)}let trimmed=bodyText.trim();return trimmed?truncate2(trimmed,MAX_ERROR_DETAIL_LENGTH):""}function httpErrorMessage(status,payload,bodyText){let detail=extractErrorDetail(payload,bodyText);return detail?`Search failed with HTTP ${status}: ${detail}`:`Search failed with HTTP ${status}`}function abortReason2(signal){return signal.reason??new DOMException("The operation was aborted.","AbortError")}function timeoutMsFor(config){return Math.max(1,Math.trunc(config.timeoutMs??DEFAULT_PROVIDER_TIMEOUT_MS))}function providerTimeoutMessage(timeoutMs){return`Search timed out after ${timeoutMs}ms`}function searchAbortSignal(outerSignal,timeoutMs){if(outerSignal?.aborted)throw abortReason2(outerSignal);let controller=new AbortController,timeout=setTimeout(()=>{controller.abort(new DOMException(providerTimeoutMessage(timeoutMs),"TimeoutError"))},timeoutMs),onAbort=()=>controller.abort(outerSignal?abortReason2(outerSignal):void 0);return outerSignal?.addEventListener("abort",onAbort,{once:!0}),{signal:controller.signal,cleanup:()=>{clearTimeout(timeout),outerSignal?.removeEventListener("abort",onAbort)}}}function noResultsMessage(config,request2){return`Search provider ${providerEntryLabel(config)} returned no results for "${request2.query}".`}function createSearchRoutingState(providerCount,cooldowns=new Map){return{roundRobinCursor:0,successCounts:Array.from({length:providerCount},()=>0),cooldowns}}function sortedPriorityIndices(providers){return providers.map((provider,index)=>({index,priority:provider.priority??index})).sort((left,right)=>left.priority-right.priority||left.index-right.index).map(item=>item.index)}function weightedIndices(providers){let indices=[];for(let[index,provider]of providers.entries()){let weight=Math.max(1,Math.trunc(provider.weight??1));for(let count=0;count<weight;count+=1)indices.push(index)}return indices.length>0?indices:providers.map((_provider,index)=>index)}function rotateUnique(indices,start,providerCount){let order=[];for(let offset=0;offset<indices.length;offset+=1){let index=indices[(start+offset)%indices.length];index!==void 0&&!order.includes(index)&&order.push(index)}for(let index=0;index<providerCount;index+=1)order.includes(index)||order.push(index);return order}function selectOrder(strategy,providers,state){if(strategy==="priority")return sortedPriorityIndices(providers);if(strategy==="round-robin"){let indices=weightedIndices(providers),order=rotateUnique(indices,state.roundRobinCursor%indices.length,providers.length);return state.roundRobinCursor=(state.roundRobinCursor+1)%indices.length,order}let selected=0,selectedCount=state.successCounts[0]??0;for(let index=1;index<providers.length;index+=1){let count=state.successCounts[index]??0;count<selectedCount&&(selected=index,selectedCount=count)}return[selected,...providers.map((_provider,index)=>index).filter(index=>index!==selected)]}function requestInit(built,signal){let init={...built.init,signal};return built.body!==void 0?init.body=JSON.stringify(built.body):built.form!==void 0&&(init.body=built.form),init}function parseJson2(text2){try{return JSON.parse(text2)}catch{return{}}}function parseEventStream(text2){if(text2.trimStart().startsWith("{"))return parseJson2(text2);for(let line of text2.split(/\r?\n/)){if(!line.startsWith("data:"))continue;let message=parseJson2(line.slice(5).trim());if(isJsonObject3(message)&&("result"in message||"error"in message))return message}return{}}function responsePayload(provider,page){let parsed=parseProviderBody(provider,page.body);if(parsed)return parsed;let format2=searchResponseFormat(provider);return format2==="html"?{html:page.body,url:page.url}:page.body.length===0?{}:format2==="event-stream"?parseEventStream(page.body):parseJson2(page.body)}function retryAfterSeconds(response){let header2=response.headers.get("retry-after");if(!header2)return;let seconds=Number(header2);if(Number.isFinite(seconds))return Math.max(0,seconds);let date=Date.parse(header2);return Number.isNaN(date)?void 0:Math.max(0,Math.ceil((date-Date.now())/1e3))}function blockForStatus(status){if(status===429)return"rate_limited";if(status===403)return"forbidden"}function engineName(provider){return ENGINE_NAMES[provider]??provider}async function performProviderSearch(config,request2,signal){let startedAt=Date.now(),failure2=(error2,extra={})=>{let details2={provider:config.provider,query:request2.query,results:[],durationMs:Date.now()-startedAt,truncated:!1,error:error2,...extra};return config.id!==void 0&&(details2.entryId=config.id),details2},challengeFailure=challenge2=>failure2(`${engineName(config.provider)} served a bot challenge (${challenge2}) that needs a browser to pass.`,{blocked:"challenge"}),abort=searchAbortSignal(signal,timeoutMsFor(config)),response,page;try{let prepared=await prepareSearchRequest(config,request2,async built=>{let handshake=await fetch(built.url,requestInit(built,abort.signal));return{status:handshake.status,url:handshake.url||built.url,body:await handshake.text()}});if("challenge"in prepared)return challengeFailure(prepared.challenge);response=await fetch(prepared.url,requestInit(prepared,abort.signal)),page={status:response.status,url:response.url||prepared.url,body:await response.text()}}catch(error2){if(signal?.aborted)throw abortReason2(signal);return failure2(error2 instanceof Error?error2.message:"Search request failed",{blocked:"network"})}finally{abort.cleanup()}let challenge=detectSearchChallenge(config.provider,page);if(challenge)return challengeFailure(challenge);let payload=responsePayload(config.provider,page);if(!response.ok){let extra={},blocked=blockForStatus(response.status),retryAfter=retryAfterSeconds(response);return blocked&&(extra.blocked=blocked),retryAfter!==void 0&&(extra.retryAfterSeconds=retryAfter),failure2(httpErrorMessage(response.status,payload,page.body),extra)}let serviceError=searchResponseError(config.provider,payload);if(serviceError)return failure2(serviceError);let results=await normalizeSearchResponse(config.provider,payload),max=request2.maxResults,limitedResults=results.slice(0,max),details={provider:config.provider,query:request2.query,results:limitedResults,durationMs:Date.now()-startedAt,truncated:results.length>max};if(limitedResults.length===0){let payloadError2=isJsonObject3(payload)&&payload.error!==void 0?extractErrorDetail({error:payload.error},""):"";details.error=payloadError2?`Search provider ${providerEntryLabel(config)} failed: ${payloadError2}`:noResultsMessage(config,request2)}return config.id!==void 0&&(details.entryId=config.id),details}function attemptFromDetails(details){let attempt2={provider:details.provider,durationMs:details.durationMs,resultsCount:details.results.length};return details.entryId&&(attempt2.entryId=details.entryId),details.model&&(attempt2.model=details.model),details.error&&(attempt2.error=details.error),details.blocked&&(attempt2.blocked=details.blocked),attempt2}function activeCooldown(state,provider,now2){if(!KEYLESS_PROVIDERS.has(provider.provider))return;let cooldown=state.cooldowns.get(providerEntryLabel(provider));return cooldown&&cooldown.until>now2?cooldown:void 0}function skippedAttempt(provider,cooldown,now2){let seconds=Math.ceil((cooldown.until-now2)/1e3),attempt2={provider:provider.provider,durationMs:0,resultsCount:0,skipped:!0,blocked:cooldown.reason,error:`skipped (cooling down for ${seconds}s after ${BLOCK_DESCRIPTIONS[cooldown.reason]})`};return provider.id!==void 0&&(attempt2.entryId=provider.id),attempt2}function recordEngineOutcome(state,provider,details){if(!KEYLESS_PROVIDERS.has(provider.provider))return;let key=providerEntryLabel(provider);if(!details.error){state.cooldowns.delete(key);return}if(!details.blocked)return;let failures=(state.cooldowns.get(key)?.failures??0)+1,backoff=Math.min(ENGINE_COOLDOWN_MAX_MS,ENGINE_COOLDOWN_BASE_MS*2**(failures-1)),requested=Math.min(ENGINE_COOLDOWN_MAX_MS,(details.retryAfterSeconds??0)*1e3);state.cooldowns.set(key,{failures,until:Date.now()+Math.max(backoff,requested),reason:details.blocked})}async function searchRoute(entry,request2,signal,attempts,notify2){let searchEntry=async variant=>{notify2(providerEntryLabel(variant));let result3=await performProviderSearch(variant,request2,signal);return variant.model!==void 0&&(result3.model=variant.model),attempts.push(attemptFromDetails(result3)),result3},[primary,...retries]=routeAttemptEntries(entry),details=await searchEntry(primary);for(let retry of retries){if(!details.error)break;details=await searchEntry(retry)}return details}async function performSearch(config,request2,signal,routingState,onAttempt){let startedAt=Date.now(),state=routingState??createSearchRoutingState(config.providers.length),order=selectOrder(config.strategy,config.providers,state),attempts=[],routeLabels=order.flatMap(index=>{let provider=config.providers[index];return provider?routeAttemptEntries(provider).map(attemptRouteLabel):[]}),collected=new Map,selectedDetails;for(let index of order){let provider=config.providers[index];if(!provider)continue;let now2=Date.now(),cooldown=activeCooldown(state,provider,now2);if(cooldown){if(attempts.push(skippedAttempt(provider,cooldown,now2)),!config.fallback)break;continue}let details=await searchRoute(provider,request2,signal,attempts,label3=>onAttempt?.(label3,attempts,routeLabels));if(recordEngineOutcome(state,provider,details),details.error){if(!config.fallback)return{...details,strategy:config.strategy,attempts};selectedDetails=details;continue}if(state.successCounts[index]=(state.successCounts[index]??0)+1,config.strategy!=="fill-first")return{...details,strategy:config.strategy,attempts};selectedDetails=details;for(let item of details.results){if(collected.size>=request2.maxResults)break;collected.set(item.url,item)}if(collected.size>=request2.maxResults)break}if(collected.size>0&&selectedDetails){let results=[...collected.values()],details={provider:selectedDetails.provider,query:request2.query,results,durationMs:Date.now()-startedAt,truncated:results.length>=request2.maxResults,strategy:config.strategy,attempts};return selectedDetails.entryId!==void 0&&(details.entryId=selectedDetails.entryId),selectedDetails.model!==void 0&&(details.model=selectedDetails.model),details}return{...selectedDetails??{provider:config.providers[0]?.provider??"exa",query:request2.query,results:[],durationMs:Date.now()-startedAt,truncated:!1,error:"All configured search providers failed."},durationMs:Date.now()-startedAt,strategy:config.strategy,attempts,error:`All configured search providers failed: ${attempts.map(attempt2=>`${attemptRouteLabel(attempt2)} ${attempt2.error??"failed"}`).join("; ")}`}}function attemptOutcome(attempt2){return attempt2.skipped?attempt2.error??"skipped":attempt2.error?`${attempt2.blocked==="challenge"?"challenged":"failed"}: ${attempt2.error}`:`${attempt2.resultsCount} result${attempt2.resultsCount===1?"":"s"}`}function formatSearchText(details){if(details.error)return details.error;if(details.results.length===0)return`No web search results found for "${details.query}".`;let route=` via ${attemptRouteLabel(details)}`,lines=[`Web search results for "${details.query}"${route}:`,""];details.attempts&&details.attempts.length>0&&lines.push(`Routing attempts: ${details.attempts.map(attempt2=>`${attemptRouteLabel(attempt2)} ${attemptOutcome(attempt2)}`).join(" -> ")}`,"");for(let[index,item]of details.results.entries())lines.push(`${index+1}. ${item.title}`),lines.push(` ${item.url}`),item.snippet&&lines.push(` ${item.snippet}`);return lines.push("","REMINDER: Include relevant sources from the URLs above in the final answer."),lines.join(`
|
|
2306
2307
|
`)}import{createHash as createHash20}from"node:crypto";function trimTrailingSlashes(baseUrl){return baseUrl.replace(/\/+$/,"")}function subscriptionResponsesUrl(baseUrl){let normalized2=trimTrailingSlashes(baseUrl);return normalized2.endsWith("/codex/responses")?normalized2:normalized2.endsWith("/codex")?`${normalized2}/responses`:`${normalized2}/codex/responses`}function isGoogleSearchModel(id){return/^gemini-/.test(id)&&!/(image|live|tts|embedding|computer-use)/.test(id)}function hostedRouteMapping(model){return model.api!=="openai-codex-responses"||model.id.includes("-spark")?null:{provider:"chatgpt-subscription",resource:"codex/responses",endpoint:subscriptionResponsesUrl,...model.provider==="chatgpt-subscription"?{}:{routeLabel:model.provider}}}function googleLoginEndpoint(model){return model.provider!=="google"||model.api!=="google-generative-ai"||!isGoogleSearchModel(model.id)?null:trimTrailingSlashes(model.baseUrl)}function credentialHeaders(modelHeaders,authHeaders){let headers=new Headers(modelHeaders);for(let[name,value2]of Object.entries(authHeaders??{}))value2===null?headers.delete(name):headers.set(name,value2);let merged=Object.fromEntries(headers.entries());return Object.keys(merged).length>0?merged:void 0}function nativeMapping(model){let hosted=hostedRouteMapping(model);if(hosted)return hosted;let isOpenAiModel=/^gpt-(4o|4\.1|5)/.test(model.id)&&!model.id.includes("codex");if(model.provider==="openai"&&isOpenAiModel)return{provider:"openai",resource:"responses"};if(model.provider!=="openai"&&(model.api==="openai-responses"||model.api==="azure-openai-responses")&&isOpenAiModel)return{provider:"openai",resource:"responses",routeLabel:model.provider};if(model.provider==="anthropic"&&/^claude-/.test(model.id))return{provider:"anthropic",resource:"messages"};if(model.provider!=="anthropic"&&model.api==="anthropic-messages"&&/^claude-/.test(model.id))return{provider:"anthropic",resource:"messages",routeLabel:model.provider};if(model.provider==="deepseek"&&/^deepseek-v4-/.test(model.id))return{provider:"deepseek",resource:"messages",routeLabel:"deepseek",endpointPath:"/anthropic/v1/messages"};if(model.provider==="xai"&&/^grok-/.test(model.id))return{provider:"xai",resource:"responses"};if(model.provider==="perplexity"&&/^sonar/.test(model.id))return{provider:"perplexity",resource:"chat/completions"};if((model.provider==="z-ai"||model.provider==="zai")&&/^glm-/.test(model.id))return{provider:"z-ai",resource:"chat/completions"};if(model.provider==="kimi-coding")return{provider:"kimi",resource:"search"};if(model.provider==="openrouter"){let slashIndex=model.id.indexOf("/");if(slashIndex<=0)return null;let effectiveProvider=model.id.slice(0,slashIndex),effectiveId=model.id.slice(slashIndex+1);return effectiveProvider==="openrouter"?null:nativeMapping({...model,provider:effectiveProvider,id:effectiveId})}return null}function shouldDiscoverNativeRoute(activeModel,availableModel){return nativeMapping(availableModel)?activeModel?activeModel.provider===availableModel.provider:!0:!1}function buildEndpointUrl(baseUrl,resource,endpointPath){let configured;try{configured=new URL(baseUrl)}catch{return baseUrl}if(endpointPath)return configured.pathname=endpointPath,configured.hash="",configured.href;let trimmedPath=configured.pathname.replace(/\/+$/,""),resourceSlash=`/${resource}`;return trimmedPath.endsWith(resourceSlash)?configured.pathname=trimmedPath:/\/v\d+$/.test(trimmedPath)?configured.pathname=`${trimmedPath}${resourceSlash}`:configured.pathname=`${trimmedPath}/v1${resourceSlash}`,configured.hash="",configured.href}function mappingEndpointUrl(mapping,baseUrl){return mapping.endpoint?mapping.endpoint(baseUrl):buildEndpointUrl(baseUrl,mapping.resource,mapping.endpointPath)}function nativeRouteKey(model){let mapping=nativeMapping(model);if(!mapping)return null;let baseUrl=mappingEndpointUrl(mapping,model.baseUrl);if(!isAllowedProviderBaseUrl(baseUrl))return null;let routeUrl=new URL(baseUrl);return routeUrl.hostname=routeUrl.hostname.replace(/\.$/,""),`${mapping.provider}|${routeUrl.href}`}function discoveredNativeEntryId(provider,routeKey){let routeFingerprint=createHash20("sha256").update(routeKey).digest("hex").slice(0,16);return`native-${provider}-${routeFingerprint}`}async function buildNativeEntryForModel(model,modelRegistry,options={}){if(!model||!modelRegistry)return null;let{id,signal}=options,mapping=nativeMapping(model);if(!mapping)return null;let entryId=id??(mapping.routeLabel?`${mapping.routeLabel}/native`:"native"),baseUrl=mappingEndpointUrl(mapping,model.baseUrl);if(!isAllowedProviderBaseUrl(baseUrl))return null;signal?.throwIfAborted();let authPromise=modelRegistry.getApiKeyAndHeaders(model),auth;if(!signal)auth=await authPromise;else{signal.throwIfAborted();let removeAbortListener2=()=>{},abortPromise=new Promise((_resolve,reject)=>{let onAbort=()=>reject(signal.reason);signal.addEventListener("abort",onAbort,{once:!0}),removeAbortListener2=()=>signal.removeEventListener("abort",onAbort)});try{auth=await Promise.race([authPromise,abortPromise])}finally{removeAbortListener2()}}if(!auth.ok||!auth.apiKey)return null;let requestBaseUrl=auth.baseUrl?mappingEndpointUrl(mapping,auth.baseUrl):baseUrl;if(!isAllowedProviderBaseUrl(requestBaseUrl))return null;let headers=credentialHeaders(model.headers,auth.headers);return{id:entryId,provider:mapping.provider,apiKey:auth.apiKey,baseUrl:requestBaseUrl,model:model.id,priority:-1,...headers?{headers}:{}}}async function buildNativeEntries(model,modelRegistry,signal,searchModel){if(signal?.throwIfAborted(),!modelRegistry)return[];let entries=[],seenRoutes=new Set,activeRouteKey=model?nativeRouteKey(model):null;if(activeRouteKey){seenRoutes.add(activeRouteKey);let activeEntry=await buildNativeEntryForModel(model,modelRegistry,{signal});activeEntry&&entries.push(searchModel?{...activeEntry,...searchModel}:activeEntry)}if(!modelRegistry.getAvailable)return entries;for(let availableModel of modelRegistry.getAvailable()){if(!shouldDiscoverNativeRoute(model,availableModel))continue;let routeKey=nativeRouteKey(availableModel);if(!routeKey||seenRoutes.has(routeKey))continue;seenRoutes.add(routeKey);let entry=await buildNativeEntryForModel(availableModel,modelRegistry,{id:"native-discovered",signal});entry&&entries.push({...entry,id:discoveredNativeEntryId(entry.provider,routeKey)})}return entries}async function buildNativeEntry(model,modelRegistry,id="native"){return buildNativeEntryForModel(model,modelRegistry,{id})}var SESSION_SEARCH_MODEL="session",DEFAULT_SEARCH_MODELS={anthropic:["claude-haiku-4-5","claude-haiku-4.5"],openai:["gpt-5.6-luna"],xai:["grok-4.3"],deepseek:["deepseek-v4-flash"]};function isCheaper(candidate,session){if(!candidate.cost||!session.cost)return!1;let{input,output}=candidate.cost;return input<=session.cost.input&&output<=session.cost.output&&(input<session.cost.input||output<session.cost.output)}function sameRouteModels(session,registry){let routeKey=nativeRouteKey(session);return(registry?.getAvailable?.()??[]).filter(candidate=>candidate.provider===session.provider&&nativeRouteKey(candidate)===routeKey)}function choose(model,session,source2){return model===session.id?{model,source:source2}:{model,fallbackModel:session.id,source:source2}}function defaultChoice(session,candidates){let provider=nativeMapping(session)?.provider;for(let id of provider&&DEFAULT_SEARCH_MODELS[provider]||[]){let candidate=candidates.find(model=>model.id===id);if(candidate&&candidate.id!==session.id&&isCheaper(candidate,session))return choose(candidate.id,session,"default")}return{model:session.id,source:"session"}}function resolveNativeSearchModel(session,registry,setting){if(!session||!nativeRouteKey(session))return;if(setting===SESSION_SEARCH_MODEL)return{model:session.id,source:"session"};let candidates=sameRouteModels(session,registry);if(setting===void 0)return defaultChoice(session,candidates);let chosen=candidates.find(model=>model.id===setting)??candidates.find(model=>`${model.provider}/${model.id}`===setting);return chosen?choose(chosen.id,session,"setting"):{model:session.id,source:"session",warning:`nativeModel "${setting}" is ignored: it is not a hosted-search model on the session's ${session.provider} route, so native search uses ${session.id}.`}}function shorten4(value2,max){return value2.length<=max?value2:`${value2.slice(0,max-1)}\u2026`}function durationText(durationMs){return durationMs>=1e3?`${Math.round(durationMs/1e3)}s`:`${durationMs}ms`}function attemptState(attempt2){return attempt2.skipped?"skipped":attempt2.blocked==="challenge"?"challenged":attempt2.error?"failed":attempt2.resultsCount}function attemptLabel(attempts){return attempts?attempts.map(attempt2=>`${attemptRouteLabel(attempt2)}:${attemptState(attempt2)}`).join(" -> "):""}function routeStateLabel(details){let labels=details.routeLabels??details.providerLabels;if(labels.length===0)return"";let attempts=details.attempts??[];return labels.map((label3,index)=>{let attempt2=attempts[index];return attempt2?`${label3}:${attemptState(attempt2)}`:`${label3}:${index===attempts.length?"searching":"pending"}`}).join(" -> ")}function isSearchProgressDetails(details){return details!==void 0&&"phase"in details&&details.phase==="searching"}function isSearchErrorDetails(details){return"phase"in details&&details.phase==="error"}function renderSearchCall(args,theme2){let head=theme2.fg("toolTitle",theme2.bold("web_search ")),query=theme2.fg("accent",`"${shorten4(args.query,90)}"`),domains=args.allowed_domains??args.blocked_domains,filter=domains?.length?theme2.fg("muted",` domains:${domains.length}`):"";return new Text(head+query+filter,0,0)}function renderSearchResult(result3,options,theme2){if(options.isPartial){let details2=result3.details;if(isSearchProgressDetails(details2)){if(details2.currentProvider){let line=theme2.fg("warning",`Searching "${shorten4(details2.query,80)}" via ${details2.currentProvider}`),route2=routeStateLabel(details2),rows2=options.expanded&&route2?[line,theme2.fg("muted",`route ${route2}`)]:[line];return new Text(rows2.join(`
|
|
2307
2308
|
`),0,0)}let route=details2.providerLabels.length>0?details2.providerLabels.join(" -> "):"configured providers";return new Text(theme2.fg("warning",`Searching "${shorten4(details2.query,80)}" via ${route}`),0,0)}return new Text(theme2.fg("warning",result3.content[0]?.text??"Searching the web..."),0,0)}let details=result3.details;if(!details)return new Text(theme2.fg("muted",result3.content[0]?.text??""),0,0);if(isSearchProgressDetails(details))return new Text(theme2.fg("muted",result3.content[0]?.text??""),0,0);if(isSearchErrorDetails(details))return new Text(theme2.fg("error",details.error),0,0);if(details.error)return new Text(theme2.fg("error",details.error),0,0);let count=details.results.length,provider=attemptRouteLabel(details),summary=theme2.fg("success",`${count} result${count===1?"":"s"}`)+theme2.fg("muted",` via ${provider} in ${durationText(details.durationMs)}`)+(details.truncated?theme2.fg("warning"," (truncated)"):"");if(count===0)return new Text(summary,0,0);let attempts=attemptLabel(details.attempts),rows=options.expanded&&attempts?[summary,theme2.fg("muted",`route ${attempts}`)]:[summary],visibleLimit=options.expanded?8:3;for(let item of details.results.slice(0,visibleLimit))rows.push(`${theme2.fg("accent",shorten4(item.title,80))} ${theme2.fg("dim",shorten4(item.url,100))}`),item.snippet&&rows.push(theme2.fg("muted",` ${shorten4(item.snippet,140)}`));return details.results.length>visibleLimit&&rows.push(theme2.fg("dim",`\u2026 ${details.results.length-visibleLimit} more sources`)),new Text(rows.join(`
|
|
2308
2309
|
`),0,0)}var SESSION_LOGIN_PROVIDERS2=new Set(["chatgpt-subscription","google"]);function needsSessionLogin(entry){return SESSION_LOGIN_PROVIDERS2.has(entry.provider)&&!entry.apiKey}function candidateModels(entry,context){let models=[...context.model?[context.model]:[],...context.modelRegistry.getAvailable?.()??[]].filter(model=>model.provider===entry.provider);return[...entry.model?models.filter(model=>model.id===entry.model):[],...models]}async function googleLogin(model,registry){let root=googleLoginEndpoint(model);if(!root)return null;let auth=await registry.getApiKeyAndHeaders(model);if(!auth.ok||!auth.apiKey)return null;let baseUrl=auth.baseUrl?auth.baseUrl.replace(/\/+$/,""):root;if(!isAllowedProviderBaseUrl(baseUrl))return null;let headers=credentialHeaders(model.headers,auth.headers);return{apiKey:auth.apiKey,baseUrl,model:model.id,...headers?{headers}:{}}}async function subscriptionLogin(model,registry,id){let entry=await buildNativeEntry(model,registry,id);return!entry?.apiKey||!entry.baseUrl||entry.provider!=="chatgpt-subscription"?null:{apiKey:entry.apiKey,baseUrl:entry.baseUrl,model:model.id,...entry.headers?{headers:entry.headers}:{}}}async function resolveSessionLogin(entry,context,signal){for(let candidate of candidateModels(entry,context)){signal?.throwIfAborted();let login=entry.provider==="google"?await googleLogin(candidate,context.modelRegistry):await subscriptionLogin(candidate,context.modelRegistry,entry.id??entry.provider);if(signal?.throwIfAborted(),!!login)return{...entry,...login,model:entry.model??login.model}}return null}async function resolveSessionLoginEntries(config,context,signal){if(!config.providers.some(needsSessionLogin))return config;let providers=[];for(let entry of config.providers){if(!needsSessionLogin(entry)){providers.push(entry);continue}let resolved=context?await resolveSessionLogin(entry,context,signal):null;resolved&&providers.push(resolved)}return{...config,providers}}var Params3=typebox_exports.Object({query:typebox_exports.String({minLength:2,description:"The search query to use"}),allowed_domains:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String(),{description:"Only include search results from these domains"})),blocked_domains:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String(),{description:"Never include search results from these domains"}))},{additionalProperties:!1});async function configWithNativeRoute(config,ctx,signal){if(!config.auto)return config;let choice=resolveNativeSearchModel(ctx?.model,ctx?.modelRegistry,config.nativeModel),searchModel=choice?.fallbackModel?{model:choice.model,fallbackModel:choice.fallbackModel}:choice&&{model:choice.model},nativeEntries=await buildNativeEntries(ctx?.model,ctx?.modelRegistry,signal,searchModel);return nativeEntries.length>0?{...config,providers:[...nativeEntries,...config.providers]}:config}function formatSearchProgressText(details){if(details.currentProvider)return`Searching "${details.query}" via ${details.currentProvider}`;let route=details.providerLabels.length>0?details.providerLabels.join(" -> "):"configured providers";return`Searching "${details.query}" via ${route}`}function searchErrorDetails(query,error2,reason){return{phase:"error",query,error:error2,...reason?{reason}:{}}}function createWebSearchTool(getConfig,options={}){let routingState,routingKey="";return{name:"web_search",label:"Web Search",description:"Search the web for current information and return source URLs for citation.",promptSnippet:"Search the web for current information, documentation, news, or external facts.",promptGuidelines:["After using web_search, cite relevant returned URLs in the final answer."],parameters:Params3,async execute(_toolCallId,params,signal,onUpdate,ctx){if(params.allowed_domains?.length&¶ms.blocked_domains?.length){let message="Error: Cannot specify both allowed_domains and blocked_domains in the same request",details2=searchErrorDetails(params.query,message);return{content:[{type:"text",text:message}],details:details2}}let loaded2=getConfig();if(!loaded2.ok){let details2=searchErrorDetails(params.query,loaded2.message,loaded2.reason);return{content:[{type:"text",text:loaded2.message}],details:details2}}let maxResults=loaded2.config.providers[0]?.maxResults??10,listed=await resolveSessionLoginEntries(loaded2.config,ctx,signal),config=await configWithNativeRoute(listed,ctx,signal);if(config.providers.length===0&&loaded2.config.providers.length>0){let message="No web search provider is usable: the websearch.json entries that rely on a senpi login have no matching login.";return{content:[{type:"text",text:message}],details:searchErrorDetails(params.query,message)}}let progressDetails={phase:"searching",query:params.query,providerLabels:config.providers.map(providerEntryLabel),maxResults,strategy:config.strategy,...params.allowed_domains?{allowedDomains:params.allowed_domains}:{},...params.blocked_domains?{blockedDomains:params.blocked_domains}:{}};onUpdate?.({content:[{type:"text",text:formatSearchProgressText(progressDetails)}],details:progressDetails});let nextRoutingKey=`${config.strategy}:${config.providers.map(provider=>provider.id??provider.provider).join("|")}`;(!routingState||routingKey!==nextRoutingKey||routingState.successCounts.length!==config.providers.length)&&(routingState=createSearchRoutingState(config.providers.length,routingState?.cooldowns),routingKey=nextRoutingKey);let request2={query:params.query,maxResults,...params.allowed_domains===void 0?{}:{allowedDomains:params.allowed_domains},...params.blocked_domains===void 0?{}:{blockedDomains:params.blocked_domains}},details=await performSearch(config,request2,signal,routingState,(providerLabel,attempts,routeLabels)=>{let attemptProgress={...progressDetails,currentProvider:providerLabel,attempts:[...attempts],routeLabels:[...routeLabels]};onUpdate?.({content:[{type:"text",text:formatSearchProgressText(attemptProgress)}],details:attemptProgress})});return options.onSearchComplete?.(details),{content:[{type:"text",text:formatSearchText(details)}],details}},renderCall:(args,theme2)=>renderSearchCall(args,theme2),renderResult:(result3,options2,theme2)=>renderSearchResult(result3,options2,theme2)}}var web_search=createWebSearchTool(()=>({ok:!1,reason:"missing_config",message:"Missing websearch config. Create .pi/websearch.json or ~/.pi/websearch.json before starting pi."}));var STATUS_KEY6="pi-websearch",WIDGET_KEY6="pi-websearch",NATIVE_BYPASS_MESSAGE2="Native provider web search is handled by the built-in provider extension.";function isProviderNativeBypass(model){return supportsNativeAnthropicWebSearch(model)?isAnthropicWebSearchEnabled():supportsNativeOpenAiWebSearch(model)?isOpenaiWebSearchEnabled():!1}function websearch_default(pi){let state={ok:!1,reason:"missing_config",message:"Missing websearch config. Create .pi/websearch.json or ~/.pi/websearch.json before starting pi."};function providerList(config){return config.providers.map(providerEntryLabel).join(", ")}function clearUi4(ctx){ctx.hasUI!==!1&&(ctx.ui.setStatus(STATUS_KEY6,void 0),ctx.ui.setWidget(WIDGET_KEY6,void 0))}function updateUi(ctx){if(ctx.hasUI!==!1){if(state.ok){clearUi4(ctx);return}if(state.reason==="provider_native_bypass"){clearUi4(ctx);return}clearUi4(ctx),ctx.ui.notify(state.message,"error")}}let lastServedBy;function nativeModelStatus(config,ctx){let choice=config.auto?resolveNativeSearchModel(ctx.model,ctx.modelRegistry,config.nativeModel):void 0,parts=[];if(choice){let fallback=choice.fallbackModel?` (falls back to ${choice.fallbackModel})`:"";parts.push(`native model=${choice.model}${fallback}`)}lastServedBy&&parts.push(`last search via ${lastServedBy}`);let text2=parts.map(part=>`, ${part}`).join("");if(choice?.warning)return{text:text2,warning:choice.warning};if(config.nativeModel&&!choice){let reason=config.auto?"the session model has no hosted web search route":"auto is disabled";return{text:text2,warning:`nativeModel "${config.nativeModel}" is ignored: ${reason}.`}}return{text:text2}}pi.registerTool(createWebSearchTool(()=>state,{onSearchComplete:details=>{details.error||(lastServedBy=attemptRouteLabel(details))}}));async function refreshState(model,ctx){state=isProviderNativeBypass(model)?{ok:!1,reason:"provider_native_bypass",message:NATIVE_BYPASS_MESSAGE2}:await loadWebsearchConfig({cwd:ctx.cwd}),updateUi(ctx)}pi.on("session_start",async(_event,ctx)=>{lastServedBy=void 0,await refreshState(ctx.model,ctx)}),pi.on("model_select",async(event,ctx)=>{await refreshState(event.model,ctx)}),pi.on("session_shutdown",async(_event,ctx)=>{clearUi4(ctx)}),pi.registerCommand("websearch",{description:"Show web search provider status",handler:async(rawArgs,ctx)=>{let args=rawArgs.trim();if(args!==""&&args!=="status"){ctx.ui.notify("Usage: /websearch status","warning");return}if(state.ok){let native=nativeModelStatus(state.config,ctx),summary=`Web search active: strategy=${state.config.strategy}, auto=${state.config.auto?"enabled":"disabled"}, providers=${providerList(state.config)}${native.text}`;ctx.ui.notify(native.warning?`${summary}
|
|
@@ -2433,7 +2434,7 @@ $tree`;async function windowsBunChromeTree(){let stdout=await run("powershell.ex
|
|
|
2433
2434
|
pi auth print-bearer-token [--provider <provider>] [--model <model>] [--min-expiry <duration>]
|
|
2434
2435
|
pi auth check [--provider <provider>] [--model <model>] [--json] [--credentials] [--no-refresh]
|
|
2435
2436
|
|
|
2436
|
-
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 existsSync35}from"node:fs";import{readdir as readdir3}from"node:fs/promises";import{join as join69}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync35(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 readdir3(dir)).filter(name=>name.endsWith(".jsonl"));for(let name of names){let firstLine2;try{await readFileLines(join69(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(!existsSync35(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir3(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join69(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync35(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-OAFUQY7E.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-OAFUQY7E.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-WZG7WYMD.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-X64D7PT3.js");return await runHostCommand2(args.slice(1))}async function dispatchScheduleCommand(args){if(args[0]!==SCHEDULE_COMMAND_ARGV)return;let{runScheduleCommand}=await import("./schedule-command-EQ4PQCRP.js");return await runScheduleCommand(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat11}from"node:fs/promises";import{resolve as resolve39}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve39(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat11(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>
|
|
2437
|
+
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 existsSync35}from"node:fs";import{readdir as readdir3}from"node:fs/promises";import{join as join69}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync35(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 readdir3(dir)).filter(name=>name.endsWith(".jsonl"));for(let name of names){let firstLine2;try{await readFileLines(join69(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(!existsSync35(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir3(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join69(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync35(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-YGTWXRG5.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-YGTWXRG5.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-DVWM37GF.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-VATE7HRG.js");return await runHostCommand2(args.slice(1))}async function dispatchScheduleCommand(args){if(args[0]!==SCHEDULE_COMMAND_ARGV)return;let{runScheduleCommand}=await import("./schedule-command-EQ4PQCRP.js");return await runScheduleCommand(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat11}from"node:fs/promises";import{resolve as resolve39}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve39(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat11(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>
|
|
2437
2438
|
`;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(`
|
|
2438
2439
|
`)}</file>
|
|
2439
2440
|
`:text2+=`<file name="${absolutePath}"></file>
|
|
@@ -2495,8 +2496,8 @@ Press any key to continue...`)),await new Promise(resolve45=>{process.stdin.setR
|
|
|
2495
2496
|
`))}}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 readdirSync16,readFileSync as readFileSync44}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 readdirSync16("/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 readFileSync44(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat12=linuxStat(pid),tail=stat12?.slice(stat12.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat12=linuxStat(pid),open8=stat12?.indexOf("(")??-1,close=stat12?.lastIndexOf(")")??-1;return stat12===void 0||open8===-1||close<=open8?"":stat12.slice(open8+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-GC3GIR2N.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 randomUUID12}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync44,mkdirSync as mkdirSync24,renameSync as renameSync18,rmSync as rmSync14}from"node:fs";import{basename as basename27,dirname as dirname46,join as join81,relative as relative20,resolve as resolve41,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path15){return toNamespacedPath(resolve41(path15))}function getQuarantineRoot(packageDir){let current=resolve41(packageDir);for(;;){if(basename27(current).toLowerCase()==="node_modules")return join81(current,QUARANTINE_DIR_NAME);let parent=dirname46(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{rmSync14(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=join81(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID12()}`);for(let loadedFile of loadedFiles){if(!existsSync44(loadedFile))continue;let quarantinePath=join81(quarantineRunDir,relative20(resolvedPackageDir,loadedFile));mkdirSync24(dirname46(quarantinePath),{recursive:!0}),renameSync18(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(resolve45=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve45(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:path15,error:error2})=>({type:"warning",message:`Failed to load extension "${path15}": ${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(`
|
|
2496
2497
|
`));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}
|
|
2497
2498
|
`),!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}
|
|
2498
|
-
`),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(resolve45=>{let rl=createInterface2({input:process.stdin,output:process.stdout}),settled=!1,settle=result3=>{settled||(settled=!0,resolve45(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(path15,sessionDir){try{return SessionManager.open(path15,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-R5N2EKUS.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&&existsSync45(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 launchProfile?.retryFallback&&applyRetryFallbackProfile(runtimeSettingsManager,launchProfile.retryFallback),{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:path15,warning})=>({type:"warning",message:`Extension package "${path15}": ${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,browserEngine:launchProfile?.browserEngine});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;if(created.session.model&&cliThinkingOverride){let selection=created.session.thinkingSelection;created.session.setThinkingLevel(selection?.requested??created.session.thinkingLevel)}return{...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:flags2,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags2),writeHelpFlagsCache({scope,flags:flags2,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-IIRFXBTO.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}),installMemoryReportSignal(),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-VM7WJBC5.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join82(agentDir,"auth.json")),authPath:join82(agentDir,"auth.json"),agentDir,modelsPath:join82(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);let startupThinkingClamp=runtime.session.startupThinkingClamp;appMode!=="interactive"&&startupThinkingClamp&&reportDiagnostics([{type:"warning",message:formatThinkingClampWarning(startupThinkingClamp)}]),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}
|
|
2499
|
-
`)});if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-XVRJJG3K.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-ULFSI46Z.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(resolve45=>setTimeout(resolve45,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve45=>process.stdout.once("drain",resolve45)),process.stderr.writableLength>0&&await new Promise(resolve45=>process.stderr.once("drain",resolve45)),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(resolve45=>setTimeout(resolve45,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(resolve45=>{let timeout=setTimeout(()=>{this.process?.kill("SIGKILL"),resolve45()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve45()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path15){let secret=socketNeedsHandshake(path15)?await readSocketSecret(socketSecretPath(path15)):void 0,socket=createConnection3(resolveSocketTransportAddress(path15,process.platform,secret));this.socket=socket,await new Promise((resolve45,reject)=>{let onConnect=()=>{cleanup(),resolve45()},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{this.getData(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 continueFromLeaf(){let response=await this.send({type:"continue_from_leaf"});this.getData(response)}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 setRetryFallback(retryFallback){await this.send({type:"set_retry_fallback",retryFallback})}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(path15){await this.send({type:"cleanup_bash_output",path:path15})}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((resolve45,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(),resolve45())})})}collectEvents(timeout=6e4){return new Promise((resolve45,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(),resolve45(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((resolve45,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),resolve45(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(`
|
|
2499
|
+
`),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(resolve45=>{let rl=createInterface2({input:process.stdin,output:process.stdout}),settled=!1,settle=result3=>{settled||(settled=!0,resolve45(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(path15,sessionDir){try{return SessionManager.open(path15,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-O7OESJWU.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&&existsSync45(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 launchProfile?.retryFallback&&applyRetryFallbackProfile(runtimeSettingsManager,launchProfile.retryFallback),{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:path15,warning})=>({type:"warning",message:`Extension package "${path15}": ${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,browserEngine:launchProfile?.browserEngine});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;if(created.session.model&&cliThinkingOverride){let selection=created.session.thinkingSelection;created.session.setThinkingLevel(selection?.requested??created.session.thinkingLevel)}return{...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:flags2,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags2),writeHelpFlagsCache({scope,flags:flags2,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-IIRFXBTO.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}),installMemoryReportSignal(),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-E5RDPWQN.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join82(agentDir,"auth.json")),authPath:join82(agentDir,"auth.json"),agentDir,modelsPath:join82(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);let startupThinkingClamp=runtime.session.startupThinkingClamp;appMode!=="interactive"&&startupThinkingClamp&&reportDiagnostics([{type:"warning",message:formatThinkingClampWarning(startupThinkingClamp)}]),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}
|
|
2500
|
+
`)});if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-HDAGQ4X3.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-QOFA64JL.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(resolve45=>setTimeout(resolve45,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve45=>process.stdout.once("drain",resolve45)),process.stderr.writableLength>0&&await new Promise(resolve45=>process.stderr.once("drain",resolve45)),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(resolve45=>setTimeout(resolve45,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(resolve45=>{let timeout=setTimeout(()=>{this.process?.kill("SIGKILL"),resolve45()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve45()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path15){let secret=socketNeedsHandshake(path15)?await readSocketSecret(socketSecretPath(path15)):void 0,socket=createConnection3(resolveSocketTransportAddress(path15,process.platform,secret));this.socket=socket,await new Promise((resolve45,reject)=>{let onConnect=()=>{cleanup(),resolve45()},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{this.getData(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 continueFromLeaf(){let response=await this.send({type:"continue_from_leaf"});this.getData(response)}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 setRetryFallback(retryFallback){await this.send({type:"set_retry_fallback",retryFallback})}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(path15){await this.send({type:"cleanup_bash_output",path:path15})}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((resolve45,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(),resolve45())})})}collectEvents(timeout=6e4){return new Promise((resolve45,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(),resolve45(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((resolve45,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),resolve45(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(`
|
|
2500
2501
|
|
|
2501
2502
|
`),thinkingRun})}else{let text2=hidden?theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel)):thinkingBlocks.join(`
|
|
2502
2503
|
|
|
@@ -2542,7 +2543,7 @@ ${sanitizeFallbackString(output,FALLBACK_JSON_MAX_LENGTH)}`),text2}function isCo
|
|
|
2542
2543
|
${formatToolProgressLine(progress,Date.now(),state.spinnerFrame)}`),this.contentText.setText(text2);return}let container=this.renderShell==="self"?this.selfRenderContainer:this.contentBox;container instanceof Box&&container.setBgFn(background),container.detachAll(),this.renderCall(container),state.result&&this.renderResult(container,state.result),progress&&container.addChild(new Text(formatToolProgressLine(progress,Date.now(),state.spinnerFrame),0,0))}getCallRenderer(){return this.identity.toolDefinition?.renderCall??this.builtInDefinition?.renderCall}getResultRenderer(){return this.identity.toolDefinition?.renderResult??this.builtInDefinition?.renderResult}getRenderContext(lastComponent){return{args:this.state.args,toolCallId:this.identity.toolCallId,invalidate:this.onInvalidate,lastComponent,state:this.rendererState,cwd:this.identity.cwd,executionStarted:this.state.executionStarted,argsComplete:this.state.argsComplete,isPartial:this.state.isPartial,expanded:this.state.expanded,showImages:this.state.showImages,imageProtocol:getCapabilities().images,isError:this.state.result?.isError??!1,hasResult:this.state.result!==void 0,spinnerFrame:this.state.spinnerFrame}}renderCall(container){let fallback=createToolCallFallback(this.identity.toolName,this.state.args,this.state.expanded),renderer=this.getCallRenderer();if(!renderer){container.addChild(this.clickToExpand(fallback));return}try{let component=renderer(this.state.args,theme,this.getRenderContext(this.callRendererComponent));this.addRendererComponent(container,"call",component,fallback)}catch{this.callRendererComponent=void 0,container.addChild(this.clickToExpand(fallback))}}renderResult(container,result3){let fallback=createToolResultFallback(result3,this.state.showImages),renderer=this.getResultRenderer();if(!renderer){fallback&&container.addChild(this.clickToExpand(fallback));return}try{let agentResult={content:result3.content,details:result3.details},component=renderer(agentResult,{expanded:this.state.expanded,isPartial:this.state.isPartial},theme,this.getRenderContext(this.resultRendererComponent));this.addRendererComponent(container,"result",component,fallback)}catch{this.resultRendererComponent=void 0,fallback&&container.addChild(this.clickToExpand(fallback))}}addRendererComponent(container,slot,value2,fallback){if(!isComponent(value2)){this.setRendererComponent(slot,void 0),fallback&&container.addChild(this.clickToExpand(fallback));return}this.setRendererComponent(slot,value2),container.addChild(this.clickToExpand(new ToolRendererBoundary(value2,fallback,()=>{this.getRendererComponent(slot)===value2&&this.setRendererComponent(slot,void 0)})))}getRendererComponent(slot){return slot==="call"?this.callRendererComponent:this.resultRendererComponent}setRendererComponent(slot,component){slot==="call"?this.callRendererComponent=component:this.resultRendererComponent=component}};var ToolExecutionComponent=class extends Container{constructor(toolName,toolCallId,args,options={},toolDefinition,ui,cwd,presentation="classic"){super(),this.expanded=!1,this.isPartial=!0,this.executionStarted=!1,this.argsComplete=!1,this.renderCache=new ToolExecutionRenderCache,this.animation=new ToolExecutionAnimation({invalidate:()=>this.invalidateRenderCache(),redraw:()=>{this.updateDisplay(),this.ui.requestRender()}}),this.identity={toolName,toolCallId,cwd,toolDefinition},this.args=args,this.showImages=options.showImages??!0,this.imageWidthCells=options.imageWidthCells??60,this.ui=ui,this.presentation=presentation;let initialState=this.createRenderState();this.presentation==="grok"?(this.grokRow=new GrokToolRow({toolName:this.identity.toolName,isPartial:initialState.isPartial,result:initialState.result}),this.addChild(new Spacer(1)),this.addChild(this.grokRow)):(this.renderer=new ToolExecutionRenderer(this.identity,initialState,()=>{this.invalidate(),this.ui.requestRender()},()=>{this.setExpanded(!this.expanded),this.ui.requestRender()}),this.images=new ToolExecutionImages(()=>{this.invalidateRenderCache(),this.ui.requestRender()}),this.addChild(new Spacer(1)),this.addChild(this.renderer),this.addChild(this.images)),this.updateSpinnerAnimation(),this.updateDisplay()}updateArgs(args){this.args=args,this.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateDisplay()}get presentationSnapshot(){return{identity:this.identity,state:this.createRenderState(),presentation:this.presentation}}markExecutionStarted(){this.executionStarted=!0,this.updateSpinnerAnimation(),this.updateDisplay(),this.ui.requestRender()}setArgsComplete(){this.argsComplete=!0,this.updateSpinnerAnimation(),this.updateDisplay(),this.ui.requestRender()}updateResult(result3,isPartial=!1){this.result=result3,this.isPartial=isPartial,isPartial||(this.argsComplete=!0,this.renderCache.finalizeResult(serializedToolResultBytes(result3))),this.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateTodoStrikeAnimation(),this.updateDisplay(),this.images?.updateResult(result3),this.renderCache.setImages(result3.content.filter(part=>part.type==="image").length),this.invalidateRenderCache()}stopAnimation(){this.animation.stop()}dispose(){this.stopAnimation(),this.renderCache.dispose(),super.dispose()}setExpanded(expanded){this.expanded=expanded,this.updateDisplay()}setShowImages(show){this.showImages=show,this.updateDisplay()}setImageWidthCells(width){this.imageWidthCells=Math.max(1,Math.floor(width)),this.updateDisplay()}invalidate(){this.invalidateRenderCache(),super.invalidate(),this.lastDisplaySignature=void 0,this.updateDisplay()}getRenderRevision(){if(!(this.presentation==="grok"||this.isPartial||!this.argsComplete||this.result===void 0||this.animation.running))return this.renderCache.revision}render(width){if(this.presentation==="grok")return super.render(width);let signature=this.createRenderSignature(),cached=this.renderCache.read(width,signature);if(cached)return cached;let lines,renderer=this.renderer,images=this.images;if(renderer.hasRendererDefinition&&renderer.renderShell==="self"){let contentLines=renderer.render(width),imageLines=images.render(width);if(contentLines.length===0&&imageLines.length===0)return[];lines=contentLines.length>0?["",...contentLines,...imageLines]:imageLines}else lines=super.render(width);return this.renderCache.store(width,signature,lines),lines}updateDisplay(){let displaySignature=this.createRenderSignature();if(this.lastDisplaySignature===displaySignature)return;this.lastDisplaySignature=displaySignature,this.invalidateRenderCache();let state=this.createRenderState();if(this.grokRow){this.grokRow.update({toolName:this.identity.toolName,isPartial:state.isPartial,result:state.result});return}let renderer=this.renderer,renderState2=renderer.hasRendererDefinition&&!renderer.hasResultRenderer?{...state,result:collapseFallbackResult(state.result,state.showImages,state.expanded)}:state;renderer.update(renderState2),this.images.updateOptions({showImages:state.showImages,maxWidthCells:this.imageWidthCells,showRendererFallback:renderer.hasResultRenderer})}createRenderState(){return{args:this.args,executionStarted:this.executionStarted,argsComplete:this.argsComplete,isPartial:this.isPartial,expanded:this.expanded,showImages:this.showImages,spinnerFrame:this.animation.frame,result:this.result?{...this.result,content:this.result.content.filter(part=>!isModelOnlyText(part))}:void 0}}createRenderSignature(){return createBoundedRenderSignature({...this.createRenderState(),imageWidthCells:this.imageWidthCells,toolCallId:this.identity.toolCallId,toolName:this.identity.toolName})}updateSpinnerAnimation(){this.animation.spin(toolCardSpins(this.identity.toolName,this.createRenderState()))}updateTodoStrikeAnimation(){this.animation.strike(toolCardStrikes(this.identity.toolName,this.createRenderState()))}invalidateRenderCache(){this.renderCache.invalidate()}};var TREE_GUTTER_WIDTH=2,MIN_VISIBLE_ANCHOR_CONTENT_WIDTH=4,MAX_VISIBLE_ANCHOR_CONTENT_WIDTH=20,MIN_ANCHOR_CONTEXT_WIDTH=2,MAX_ANCHOR_CONTEXT_WIDTH=12;function renderHorizontalViewport(rows,width){let viewportWidth=Math.max(0,width-TREE_GUTTER_WIDTH),maxBodyWidth=rows.reduce((max,row)=>Math.max(max,row.bodyWidth),0),maxHorizontalScroll=Math.max(0,maxBodyWidth-viewportWidth),selectedRow=rows.find(row=>row.isSelected),horizontalScroll=0;if(selectedRow&&maxHorizontalScroll>0){let minVisibleAnchorContentWidth=Math.min(MAX_VISIBLE_ANCHOR_CONTENT_WIDTH,Math.max(MIN_VISIBLE_ANCHOR_CONTENT_WIDTH,Math.floor(viewportWidth/3)));if(selectedRow.anchorCol>viewportWidth-minVisibleAnchorContentWidth){let anchorContextWidth=Math.min(MAX_ANCHOR_CONTEXT_WIDTH,Math.max(MIN_ANCHOR_CONTEXT_WIDTH,Math.floor(viewportWidth/4)));horizontalScroll=Math.min(maxHorizontalScroll,selectedRow.anchorCol-anchorContextWidth)}}return rows.map(row=>{let line=horizontalScroll>0?`${row.gutter}${sliceByColumn(row.body,horizontalScroll,viewportWidth,!0)}\x1B[0m`:row.gutter+row.body;return truncateToWidth(line,width,"")})}var TreeList=class{constructor(tree,currentLeafId,maxVisibleLines,initialSelectedId,initialFilterMode){this.flatNodes=[],this.filteredNodes=[],this.selectedIndex=0,this.filterMode="default",this.searchQuery="",this.toolCallMap=new Map,this.multipleRoots=!1,this.showLabelTimestamps=!1,this.activePathIds=new Set,this.visibleParentMap=new Map,this.visibleChildrenMap=new Map,this.lastSelectedId=null,this.foldedNodes=new Set,this.currentLeafId=currentLeafId,this.maxVisibleLines=maxVisibleLines,this.filterMode=initialFilterMode??"default",this.multipleRoots=tree.length>1,this.flatNodes=this.flattenTree(tree),this.buildActivePath(),this.applyFilter();let targetId=initialSelectedId??currentLeafId;this.selectedIndex=this.findNearestVisibleIndex(targetId),this.lastSelectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id??null}findNearestVisibleIndex(entryId){if(this.filteredNodes.length===0)return 0;let entryMap=new Map;for(let flatNode of this.flatNodes)entryMap.set(flatNode.node.entry.id,flatNode);let visibleIdToIndex=new Map(this.filteredNodes.map((node,i)=>[node.node.entry.id,i])),currentId=entryId;for(;currentId!==null;){let index=visibleIdToIndex.get(currentId);if(index!==void 0)return index;let node=entryMap.get(currentId);if(!node)break;currentId=node.node.entry.parentId??null}return this.filteredNodes.length-1}buildActivePath(){if(this.activePathIds.clear(),!this.currentLeafId)return;let entryMap=new Map;for(let flatNode of this.flatNodes)entryMap.set(flatNode.node.entry.id,flatNode);let currentId=this.currentLeafId;for(;currentId;){this.activePathIds.add(currentId);let node=entryMap.get(currentId);if(!node)break;currentId=node.node.entry.parentId??null}}flattenTree(roots){let result3=[];this.toolCallMap.clear();let stack=[],containsActive=new Map,leafId=this.currentLeafId;{let allNodes=[],preOrderStack=[...roots];for(;preOrderStack.length>0;){let node=preOrderStack.pop();allNodes.push(node);for(let i=node.children.length-1;i>=0;i--)preOrderStack.push(node.children[i])}for(let i=allNodes.length-1;i>=0;i--){let node=allNodes[i],has=leafId!==null&&node.entry.id===leafId;for(let child of node.children)containsActive.get(child)&&(has=!0);containsActive.set(node,has)}}let multipleRoots=roots.length>1,orderedRoots=[...roots].sort((a,b)=>Number(containsActive.get(b))-Number(containsActive.get(a)));for(let i=orderedRoots.length-1;i>=0;i--){let isLast=i===orderedRoots.length-1;stack.push([orderedRoots[i],multipleRoots?1:0,multipleRoots,multipleRoots,isLast,[],multipleRoots])}for(;stack.length>0;){let[node,indent,justBranched,showConnector,isLast,gutters,isVirtualRootChild]=stack.pop(),entry=node.entry;if(entry.type==="message"&&entry.message.role==="assistant"){let content=entry.message.content;if(Array.isArray(content)){for(let block of content)if(typeof block=="object"&&block!==null&&"type"in block&&block.type==="toolCall"){let tc=block;this.toolCallMap.set(tc.id,{name:tc.name,arguments:tc.arguments})}}}result3.push({node,indent,showConnector,isLast,gutters,isVirtualRootChild});let children=node.children,multipleChildren=children.length>1,orderedChildren=(()=>{let prioritized=[],rest=[];for(let child of children)containsActive.get(child)?prioritized.push(child):rest.push(child);return[...prioritized,...rest]})(),childIndent;multipleChildren||justBranched&&indent>0?childIndent=indent+1:childIndent=indent;let connectorDisplayed=showConnector&&!isVirtualRootChild,currentDisplayIndent=this.multipleRoots?Math.max(0,indent-1):indent,connectorPosition=Math.max(0,currentDisplayIndent-1),childGutters=connectorDisplayed?[...gutters,{position:connectorPosition,show:!isLast}]:gutters;for(let i=orderedChildren.length-1;i>=0;i--){let childIsLast=i===orderedChildren.length-1;stack.push([orderedChildren[i],childIndent,multipleChildren,multipleChildren,childIsLast,childGutters,!1])}}return result3}applyFilter(){this.filteredNodes.length>0&&(this.lastSelectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id??this.lastSelectedId);let searchTokens=this.searchQuery.toLowerCase().split(/\s+/).filter(Boolean);if(this.filteredNodes=this.flatNodes.filter(flatNode=>{let entry=flatNode.node.entry;if(entry.type==="usage")return!1;let isCurrentLeaf=entry.id===this.currentLeafId;if(entry.type==="message"&&entry.message.role==="assistant"&&!isCurrentLeaf){let msg=entry.message,hasText=this.hasTextContent(msg.content),isErrorOrAborted=msg.stopReason&&msg.stopReason!=="stop"&&msg.stopReason!=="toolUse";if(!hasText&&!isErrorOrAborted)return!1}let passesFilter=!0,isSettingsEntry=entry.type==="label"||entry.type==="context_edit"||entry.type==="custom"||entry.type==="model_change"||entry.type==="model_change_rejected"||entry.type==="thinking_level_change"||entry.type==="session_info";switch(this.filterMode){case"user-only":passesFilter=entry.type==="message"&&entry.message.role==="user";break;case"no-tools":passesFilter=!isSettingsEntry&&!(entry.type==="message"&&entry.message.role==="toolResult");break;case"labeled-only":passesFilter=flatNode.node.label!==void 0;break;case"all":passesFilter=!0;break;default:passesFilter=!isSettingsEntry;break}if(!passesFilter)return!1;if(searchTokens.length>0){let nodeText=this.getSearchableText(flatNode.node).toLowerCase();return searchTokens.every(token=>nodeText.includes(token))}return!0}),this.foldedNodes.size>0){let skipSet=new Set;for(let flatNode of this.flatNodes){let{id,parentId}=flatNode.node.entry;parentId!=null&&(this.foldedNodes.has(parentId)||skipSet.has(parentId))&&skipSet.add(id)}this.filteredNodes=this.filteredNodes.filter(flatNode=>!skipSet.has(flatNode.node.entry.id))}this.recalculateVisualStructure(),this.lastSelectedId?this.selectedIndex=this.findNearestVisibleIndex(this.lastSelectedId):this.selectedIndex>=this.filteredNodes.length&&(this.selectedIndex=Math.max(0,this.filteredNodes.length-1)),this.filteredNodes.length>0&&(this.lastSelectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id??this.lastSelectedId)}recalculateVisualStructure(){if(this.filteredNodes.length===0)return;let visibleIds=new Set(this.filteredNodes.map(n=>n.node.entry.id)),entryMap=new Map;for(let flatNode of this.flatNodes)entryMap.set(flatNode.node.entry.id,flatNode);let findVisibleAncestor=nodeId=>{let currentId=entryMap.get(nodeId)?.node.entry.parentId??null;for(;currentId!==null;){if(visibleIds.has(currentId))return currentId;currentId=entryMap.get(currentId)?.node.entry.parentId??null}return null},visibleParent=new Map,visibleChildren=new Map;visibleChildren.set(null,[]);for(let flatNode of this.filteredNodes){let nodeId=flatNode.node.entry.id,ancestorId=findVisibleAncestor(nodeId);visibleParent.set(nodeId,ancestorId),visibleChildren.has(ancestorId)||visibleChildren.set(ancestorId,[]),visibleChildren.get(ancestorId).push(nodeId)}let visibleRootIds=visibleChildren.get(null);this.multipleRoots=visibleRootIds.length>1;let filteredNodeMap=new Map;for(let flatNode of this.filteredNodes)filteredNodeMap.set(flatNode.node.entry.id,flatNode);let stack=[];for(let i=visibleRootIds.length-1;i>=0;i--){let isLast=i===visibleRootIds.length-1;stack.push([visibleRootIds[i],this.multipleRoots?1:0,this.multipleRoots,this.multipleRoots,isLast,[],this.multipleRoots])}for(;stack.length>0;){let[nodeId,indent,justBranched,showConnector,isLast,gutters,isVirtualRootChild]=stack.pop(),flatNode=filteredNodeMap.get(nodeId);if(!flatNode)continue;flatNode.indent=indent,flatNode.showConnector=showConnector,flatNode.isLast=isLast,flatNode.gutters=gutters,flatNode.isVirtualRootChild=isVirtualRootChild;let children=visibleChildren.get(nodeId)||[],multipleChildren=children.length>1,childIndent;multipleChildren||justBranched&&indent>0?childIndent=indent+1:childIndent=indent;let connectorDisplayed=showConnector&&!isVirtualRootChild,currentDisplayIndent=this.multipleRoots?Math.max(0,indent-1):indent,connectorPosition=Math.max(0,currentDisplayIndent-1),childGutters=connectorDisplayed?[...gutters,{position:connectorPosition,show:!isLast}]:gutters;for(let i=children.length-1;i>=0;i--){let childIsLast=i===children.length-1;stack.push([children[i],childIndent,multipleChildren,multipleChildren,childIsLast,childGutters,!1])}}this.visibleParentMap=visibleParent,this.visibleChildrenMap=visibleChildren}getSearchableText(node){let entry=node.entry,parts=[];switch(node.label&&parts.push(node.label),entry.type){case"message":{let msg=entry.message;if(parts.push(msg.role),"content"in msg&&msg.content&&parts.push(this.extractContent(msg.content)),msg.role==="bashExecution"){let bashMsg=msg;bashMsg.command&&parts.push(bashMsg.command)}break}case"custom_message":{parts.push(entry.customType),typeof entry.content=="string"?parts.push(entry.content):parts.push(this.extractContent(entry.content));break}case"compaction":parts.push("compaction");break;case"branch_summary":parts.push("branch summary",entry.summary);break;case"session_info":parts.push("title"),entry.name&&parts.push(entry.name);break;case"model_change":parts.push("model",entry.modelId);break;case"model_change_rejected":parts.push("model rejected",entry.modelId,entry.reason);break;case"thinking_level_change":parts.push("thinking",entry.thinkingLevel);break;case"custom":parts.push("custom",entry.customType);break;case"context_edit":parts.push("context edit",entry.replacement===null?"omit":"replace",entry.targetId);break;case"label":parts.push("label",entry.label??"");break}return parts.join(" ")}invalidate(){}getSearchQuery(){return this.searchQuery}getSelectedNode(){return this.filteredNodes[this.selectedIndex]?.node}copySelected(){let node=this.getSelectedNode();this.onCopy?.(node?this.getEntryCopyText(node):void 0)}editSelected(){let entry=this.getSelectedNode()?.entry;entry&&(entry.type==="message"&&entry.message.role==="assistant"?this.onEditMessage?.(entry.id):(entry.type==="message"&&entry.message.role==="user"||entry.type==="custom_message")&&this.onSelect?.(entry.id))}updateNodeLabel(entryId,label3,labelTimestamp){for(let flatNode of this.flatNodes)if(flatNode.node.entry.id===entryId){flatNode.node.label=label3,flatNode.node.labelTimestamp=label3?labelTimestamp??new Date().toISOString():void 0;break}}getStatusLabels(){let labels="";switch(this.filterMode){case"no-tools":labels+=" [no-tools]";break;case"user-only":labels+=" [user]";break;case"labeled-only":labels+=" [labeled]";break;case"all":labels+=" [all]";break}return this.showLabelTimestamps&&(labels+=" [+label time]"),labels}render(width){let lines=[];if(this.filteredNodes.length===0)return lines.push(truncateToWidth(theme.fg("muted"," No entries found"),width)),lines.push(truncateToWidth(theme.fg("muted",` (0/0)${this.getStatusLabels()}`),width)),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisibleLines/2),this.filteredNodes.length-this.maxVisibleLines)),endIndex=Math.min(startIndex+this.maxVisibleLines,this.filteredNodes.length),renderedRows=[];for(let i=startIndex;i<endIndex;i++){let flatNode=this.filteredNodes[i],entry=flatNode.node.entry,isSelected=i===this.selectedIndex,cursor=isSelected?theme.fg("accent","\u203A "):" ",displayIndent=this.multipleRoots?Math.max(0,flatNode.indent-1):flatNode.indent,connector=flatNode.showConnector&&!flatNode.isVirtualRootChild?flatNode.isLast?"\u2514\u2500 ":"\u251C\u2500 ":"",connectorPosition=connector?displayIndent-1:-1,totalChars=displayIndent*3,prefixChars=[],isFolded=this.foldedNodes.has(entry.id);for(let i2=0;i2<totalChars;i2++){let level=Math.floor(i2/3),posInLevel=i2%3,gutter2=flatNode.gutters.find(g=>g.position===level);if(gutter2)posInLevel===0?prefixChars.push(gutter2.show?"\u2502":" "):prefixChars.push(" ");else if(connector&&level===connectorPosition)if(posInLevel===0)prefixChars.push(flatNode.isLast?"\u2514":"\u251C");else if(posInLevel===1){let foldable=this.isFoldable(entry.id);prefixChars.push(isFolded?"\u229E":foldable?"\u229F":"\u2500")}else prefixChars.push(" ");else prefixChars.push(" ")}let prefix=prefixChars.join(""),showsFoldInConnector=flatNode.showConnector&&!flatNode.isVirtualRootChild,foldMarker=isFolded&&!showsFoldInConnector?theme.fg("accent","\u229E "):"",pathMarker=this.activePathIds.has(entry.id)?theme.fg("accent","\u2022 "):"",label3=flatNode.node.label?theme.fg("warning",`[${flatNode.node.label}] `):"",labelTimestamp=this.showLabelTimestamps&&flatNode.node.label&&flatNode.node.labelTimestamp?theme.fg("muted",`${this.formatLabelTimestamp(flatNode.node.labelTimestamp)} `):"",content=this.getEntryDisplayText(flatNode.node,isSelected),prefixPart=theme.fg("dim",prefix)+foldMarker+pathMarker,anchorCol=visibleWidth(prefixPart),gutter=cursor,body=prefixPart+label3+labelTimestamp+content;isSelected&&(gutter=theme.bg("selectedBg",gutter),body=theme.bg("selectedBg",body)),renderedRows.push({gutter,body,anchorCol,bodyWidth:visibleWidth(body),isSelected})}return lines.push(...renderHorizontalViewport(renderedRows,width)),lines.push(truncateToWidth(theme.fg("muted",` (${this.selectedIndex+1}/${this.filteredNodes.length})${this.getStatusLabels()}`),width)),lines}getEntryDisplayText(node,isSelected){let entry=node.entry,result3,normalize3=s=>s.replace(/[\n\t]/g," ").trim();switch(entry.type){case"message":{let msg=entry.message,role=msg.role;if(role==="user"){let msgWithContent=msg,content=normalize3(this.extractContent(msgWithContent.content));result3=theme.fg("accent","user: ")+content}else if(role==="assistant"){let msgWithContent=msg,textContent3=normalize3(this.extractContent(msgWithContent.content));if(textContent3)result3=theme.fg("success","assistant: ")+textContent3;else if(msgWithContent.stopReason==="aborted")result3=theme.fg("success","assistant: ")+theme.fg("muted","(aborted)");else if(msgWithContent.errorMessage){let errMsg=normalize3(msgWithContent.errorMessage).slice(0,80);result3=theme.fg("success","assistant: ")+theme.fg("error",errMsg)}else result3=theme.fg("success","assistant: ")+theme.fg("muted","(no content)")}else if(role==="toolResult"){let toolMsg=msg,toolCall=toolMsg.toolCallId?this.toolCallMap.get(toolMsg.toolCallId):void 0;toolCall?result3=theme.fg("muted",this.formatToolCall(toolCall.name,toolCall.arguments)):result3=theme.fg("muted",`[${toolMsg.toolName??"tool"}]`)}else if(role==="bashExecution"){let bashMsg=msg;result3=theme.fg("dim",`[bash]: ${normalize3(bashMsg.command??"")}`)}else result3=theme.fg("dim",`[${role}]`);break}case"custom_message":{let content=typeof entry.content=="string"?entry.content:entry.content.filter(c=>c.type==="text").map(c=>c.text).join("");result3=theme.fg("customMessageLabel",`[${entry.customType}]: `)+normalize3(content);break}case"compaction":{let tokens=Math.round(entry.tokensBefore/1e3);result3=theme.fg("borderAccent",`[compaction: ${tokens}k tokens]`);break}case"branch_summary":result3=theme.fg("warning","[branch summary]: ")+normalize3(entry.summary);break;case"model_change":result3=theme.fg("dim",`[model: ${entry.modelId}]`);break;case"model_change_rejected":result3=theme.fg("warning",`[model rejected: ${entry.modelId} (${entry.reason})]`);break;case"thinking_level_change":result3=theme.fg("dim",`[thinking: ${entry.thinkingLevel}]`);break;case"custom":result3=theme.fg("dim",`[custom: ${entry.customType}]`);break;case"context_edit":result3=theme.fg("dim",`[context ${entry.replacement===null?"omit":"replace"}: ${entry.targetId}]`);break;case"label":result3=theme.fg("dim",`[label: ${entry.label??"(cleared)"}]`);break;case"session_info":result3=entry.name?[theme.fg("dim","[title: "),theme.fg("dim",entry.name),theme.fg("dim","]")].join(""):[theme.fg("dim","[title: "),theme.italic(theme.fg("dim","empty")),theme.fg("dim","]")].join("");break;default:result3=""}return isSelected?theme.bold(result3):result3}formatLabelTimestamp(timestamp){let date=new Date(timestamp),now2=new Date,hours=date.getHours().toString().padStart(2,"0"),minutes=date.getMinutes().toString().padStart(2,"0"),time2=`${hours}:${minutes}`;if(date.getFullYear()===now2.getFullYear()&&date.getMonth()===now2.getMonth()&&date.getDate()===now2.getDate())return time2;let month=date.getMonth()+1,day=date.getDate();return date.getFullYear()===now2.getFullYear()?`${month}/${day} ${time2}`:`${date.getFullYear().toString().slice(-2)}/${month}/${day} ${time2}`}extractContent(content){return this.extractFullContent(content).slice(0,200)}extractFullContent(content){if(typeof content=="string")return content;if(!Array.isArray(content))return"";let result3="";for(let block of content)if(typeof block=="object"&&block!==null&&"type"in block&&block.type==="text"&&(result3+=block.text),typeof block=="object"&&block!==null&&"type"in block&&block.type==="providerNative"){let subtype=block.subtype??"unknown";result3+=`[providerNative:${subtype}]`}return result3}getEntryCopyText(node){let entry=node.entry,text2;switch(entry.type){case"message":entry.message.role==="bashExecution"?text2=entry.message.command:"content"in entry.message&&(text2=this.extractFullContent(entry.message.content),!text2&&entry.message.role==="assistant"&&(text2=entry.message.errorMessage));break;case"custom_message":text2=this.extractFullContent(entry.content);break;case"compaction":text2=entry.summary;break;case"branch_summary":text2=entry.summary;break}return text2?.trim()?text2:void 0}hasTextContent(content){if(typeof content=="string")return content.trim().length>0;if(Array.isArray(content))for(let c of content){if(typeof c=="object"&&c!==null&&"type"in c&&c.type==="text"){let text2=c.text;if(text2&&text2.trim().length>0)return!0}if(typeof c=="object"&&c!==null&&"type"in c&&c.type==="providerNative")return!0}return!1}formatToolCall(name,args){let shortenPath2=p=>{let home=process.env.HOME||process.env.USERPROFILE||"";return home&&p.startsWith(home)?`~${p.slice(home.length)}`:p};switch(name){case"read":{let path15=shortenPath2(String(args.path||args.file_path||"")),offset=args.offset,limit=args.limit,display=path15;if(offset!==void 0||limit!==void 0){let start=offset??1,end=limit!==void 0?start+limit-1:"";display+=`:${start}${end?`-${end}`:""}`}return`[read: ${display}]`}case"write":return`[write: ${shortenPath2(String(args.path||args.file_path||""))}]`;case"edit":return`[edit: ${shortenPath2(String(args.path||args.file_path||""))}]`;case"bash":{let rawCmd=String(args.command||"");return`[bash: ${rawCmd.replace(/[\n\t]/g," ").trim().slice(0,50)}${rawCmd.length>50?"...":""}]`}case"grep":{let pattern=String(args.pattern||""),path15=shortenPath2(String(args.path||"."));return`[grep: /${pattern}/ in ${path15}]`}case"find":{let pattern=String(args.pattern||""),path15=shortenPath2(String(args.path||"."));return`[find: ${pattern} in ${path15}]`}case"ls":return`[ls: ${shortenPath2(String(args.path||"."))}]`;default:{let argsStr=JSON.stringify(args).slice(0,40);return`[${name}: ${argsStr}${JSON.stringify(args).length>40?"...":""}]`}}}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up"))this.selectedIndex=this.selectedIndex===0?this.filteredNodes.length-1:this.selectedIndex-1;else if(kb.matches(keyData,"tui.select.down"))this.selectedIndex=this.selectedIndex===this.filteredNodes.length-1?0:this.selectedIndex+1;else if(kb.matches(keyData,"app.tree.foldOrUp")){let currentId=this.filteredNodes[this.selectedIndex]?.node.entry.id;currentId&&this.isFoldable(currentId)&&!this.foldedNodes.has(currentId)?(this.foldedNodes.add(currentId),this.applyFilter()):this.selectedIndex=this.findBranchSegmentStart("up")}else if(kb.matches(keyData,"app.tree.unfoldOrDown")){let currentId=this.filteredNodes[this.selectedIndex]?.node.entry.id;currentId&&this.foldedNodes.has(currentId)?(this.foldedNodes.delete(currentId),this.applyFilter()):this.selectedIndex=this.findBranchSegmentStart("down")}else if(kb.matches(keyData,"tui.editor.cursorLeft")||kb.matches(keyData,"tui.select.pageUp"))this.selectedIndex=Math.max(0,this.selectedIndex-this.maxVisibleLines);else if(kb.matches(keyData,"tui.editor.cursorRight")||kb.matches(keyData,"tui.select.pageDown"))this.selectedIndex=Math.min(this.filteredNodes.length-1,this.selectedIndex+this.maxVisibleLines);else if(kb.matches(keyData,"tui.select.confirm")){let selected=this.filteredNodes[this.selectedIndex];selected&&this.onSelect&&this.onSelect(selected.node.entry.id)}else if(kb.matches(keyData,"app.message.copy"))this.copySelected();else if(kb.matches(keyData,"app.tree.editMessage"))this.editSelected();else if(kb.matches(keyData,"tui.select.cancel"))this.searchQuery?(this.searchQuery="",this.foldedNodes.clear(),this.applyFilter()):this.onCancel?.();else if(kb.matches(keyData,"app.tree.filter.default"))this.filterMode="default",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.noTools"))this.filterMode=this.filterMode==="no-tools"?"default":"no-tools",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.userOnly"))this.filterMode=this.filterMode==="user-only"?"default":"user-only",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.labeledOnly"))this.filterMode=this.filterMode==="labeled-only"?"default":"labeled-only",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.all"))this.filterMode=this.filterMode==="all"?"default":"all",this.foldedNodes.clear(),this.applyFilter();else if(kb.matches(keyData,"app.tree.filter.cycleBackward")){let modes=["default","no-tools","user-only","labeled-only","all"],currentIndex=modes.indexOf(this.filterMode);this.filterMode=modes[(currentIndex-1+modes.length)%modes.length],this.foldedNodes.clear(),this.applyFilter()}else if(kb.matches(keyData,"app.tree.filter.cycleForward")){let modes=["default","no-tools","user-only","labeled-only","all"],currentIndex=modes.indexOf(this.filterMode);this.filterMode=modes[(currentIndex+1)%modes.length],this.foldedNodes.clear(),this.applyFilter()}else if(kb.matches(keyData,"tui.editor.deleteCharBackward"))this.searchQuery.length>0&&(this.searchQuery=this.searchQuery.slice(0,-1),this.foldedNodes.clear(),this.applyFilter());else if(kb.matches(keyData,"app.tree.editLabel")){let selected=this.filteredNodes[this.selectedIndex];selected&&this.onLabelEdit&&this.onLabelEdit(selected.node.entry.id,selected.node.label)}else kb.matches(keyData,"app.tree.toggleLabelTimestamp")?this.showLabelTimestamps=!this.showLabelTimestamps:![...keyData].some(ch=>{let code=ch.charCodeAt(0);return code<32||code===127||code>=128&&code<=159})&&keyData.length>0&&(this.searchQuery+=keyData,this.foldedNodes.clear(),this.applyFilter())}isFoldable(entryId){let children=this.visibleChildrenMap.get(entryId);if(!children||children.length===0)return!1;let parentId=this.visibleParentMap.get(entryId);if(parentId==null)return!0;let siblings=this.visibleChildrenMap.get(parentId);return siblings!==void 0&&siblings.length>1}findBranchSegmentStart(direction){let selectedId=this.filteredNodes[this.selectedIndex]?.node.entry.id;if(!selectedId)return this.selectedIndex;let indexByEntryId=new Map(this.filteredNodes.map((node,i)=>[node.node.entry.id,i])),currentId=selectedId;if(direction==="down")for(;;){let children=this.visibleChildrenMap.get(currentId)??[];if(children.length===0)return indexByEntryId.get(currentId);if(children.length>1)return indexByEntryId.get(children[0]);currentId=children[0]}for(;;){let parentId=this.visibleParentMap.get(currentId)??null;if(parentId===null)return indexByEntryId.get(currentId);if((this.visibleChildrenMap.get(parentId)??[]).length>1){let segmentStart=indexByEntryId.get(currentId);if(segmentStart<this.selectedIndex)return segmentStart}currentId=parentId}}},SearchLine=class{constructor(treeList){this.treeList=treeList}invalidate(){}render(width){let query=this.treeList.getSearchQuery();return query?[truncateToWidth(` ${theme.fg("muted","Type to search:")} ${theme.fg("accent",query)}`,width)]:[truncateToWidth(` ${theme.fg("muted","Type to search:")}`,width)]}handleInput(_keyData){}},TreeHelp=class{invalidate(){}render(width){let items=TREE_HELP_ITEMS.map(({keys,label:label3,labelFirst})=>{let text2=formatHelpKeys(keys);return text2?labelFirst?`${label3} ${text2}`:`${text2} ${label3}`:label3}),availableWidth=Math.max(1,width),indent=" ",separator=" \xB7 ",lines=[],currentLine="";for(let item of items){let candidate=currentLine?`${currentLine}${separator}${item}`:visibleWidth(`${indent}${item}`)<=availableWidth?`${indent}${item}`:item;if(!currentLine||visibleWidth(candidate)<=availableWidth){currentLine=candidate;continue}lines.push(...wrapTextWithAnsi(currentLine.trimEnd(),availableWidth)),currentLine=visibleWidth(`${indent}${item}`)<=availableWidth?`${indent}${item}`:item}return currentLine&&lines.push(...wrapTextWithAnsi(currentLine.trimEnd(),availableWidth)),lines.map(line=>theme.fg("muted",line))}},TREE_HELP_ITEMS=[{keys:["tui.select.up","tui.select.down"],label:"move"},{keys:["tui.editor.cursorLeft","tui.editor.cursorRight"],label:"page"},{keys:["app.tree.foldOrUp","app.tree.unfoldOrDown"],label:"branch"},{keys:["app.message.copy"],label:"copy"},{keys:["app.tree.editMessage"],label:"edit"},{keys:["app.tree.editLabel"],label:"label"},{keys:["app.tree.toggleLabelTimestamp"],label:"label time"},{keys:["app.tree.filter.default","app.tree.filter.noTools","app.tree.filter.userOnly","app.tree.filter.labeledOnly","app.tree.filter.all"],label:"filters",labelFirst:!0},{keys:["app.tree.filter.cycleForward","app.tree.filter.cycleBackward"],label:"cycle",labelFirst:!0}];function formatHelpKeys(keybindings){let keys=[];for(let keybinding of keybindings){let key=getKeybindings().getKeys(keybinding)[0];key!==void 0&&keys.push(key)}return keys.length===0?"":formatKeyText(compactRawKeys(keys)).replace(/\bpageUp\b/g,"pgup").replace(/\bpageDown\b/g,"pgdn").replace(/\bup\b/g,"\u2191").replace(/\bdown\b/g,"\u2193").replace(/\bleft\b/g,"\u2190").replace(/\bright\b/g,"\u2192")}function compactRawKeys(keys){if(keys.length===1)return keys[0];let parts=keys.map(key=>{let separatorIndex=key.lastIndexOf("+");return separatorIndex===-1?{prefix:"",suffix:key}:{prefix:key.slice(0,separatorIndex+1),suffix:key.slice(separatorIndex+1)}}),prefix=parts[0].prefix;return prefix&&parts.every(part=>part.prefix===prefix)?`${prefix}${parts.map(part=>part.suffix).join("/")}`:keys.join("/")}var LabelInput=class{get focused(){return this._focused}set focused(value2){this._focused=value2,this.input.focused=value2}constructor(entryId,currentLabel){this._focused=!1,this.entryId=entryId,this.input=new Input,currentLabel&&this.input.setValue(currentLabel)}invalidate(){}render(width){let lines=[],availableWidth=width-2;return lines.push(truncateToWidth(` ${theme.fg("muted","Label (empty to remove):")}`,width)),lines.push(...this.input.render(availableWidth).map(line=>truncateToWidth(` ${line}`,width))),lines.push(truncateToWidth(` ${keyHint("tui.select.confirm","save")} ${keyHint("tui.select.cancel","cancel")}`,width)),lines}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.confirm")){let value2=this.input.getValue().trim();this.onSubmit?.(this.entryId,value2||void 0)}else kb.matches(keyData,"tui.select.cancel")?this.onCancel?.():this.input.handleInput(keyData)}},TreeSelectorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.labelInput&&(this.labelInput.focused=value2)}constructor(tree,currentLeafId,terminalHeight,onSelect,onCancel,onLabelChange,initialSelectedId,initialFilterMode){super(),this.labelInput=null,this._focused=!1,this.onLabelChangeCallback=onLabelChange;let maxVisibleLines=Math.max(5,Math.floor(terminalHeight/2));this.treeList=new TreeList(tree,currentLeafId,maxVisibleLines,initialSelectedId,initialFilterMode),this.treeList.onSelect=onSelect,this.treeList.onCancel=onCancel,this.treeList.onCopy=text2=>this.onCopy?.(text2),this.treeList.onEditMessage=entryId=>this.onEditMessage?.(entryId),this.treeList.onLabelEdit=(entryId,currentLabel)=>this.showLabelInput(entryId,currentLabel),this.treeContainer=new Container,this.treeContainer.addChild(this.treeList),this.labelInputContainer=new Container,this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Text(theme.bold(" Session Tree"),1,0)),this.addChild(new TreeHelp),this.addChild(new SearchLine(this.treeList)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(this.treeContainer),this.addChild(this.labelInputContainer),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),tree.length===0&&setTimeout(()=>onCancel(),100)}showLabelInput(entryId,currentLabel){this.labelInput=new LabelInput(entryId,currentLabel),this.labelInput.onSubmit=(id,label3)=>{this.treeList.updateNodeLabel(id,label3),this.onLabelChangeCallback?.(id,label3),this.hideLabelInput()},this.labelInput.onCancel=()=>this.hideLabelInput(),this.labelInput.focused=this._focused,this.treeContainer.clear(),this.labelInputContainer.clear(),this.labelInputContainer.addChild(this.labelInput)}hideLabelInput(){this.labelInput=null,this.labelInputContainer.clear(),this.treeContainer.clear(),this.treeContainer.addChild(this.treeList)}handleInput(keyData){this.labelInput?this.labelInput.handleInput(keyData):this.treeList.handleInput(keyData)}getTreeList(){return this.treeList}};function formatDecision(trustPath,decision){if(decision===null)return"none";let label3=decision.decision?"trusted":"untrusted";return trustPath!==void 0&&decision.path!==trustPath?`${label3} (inherited from ${decision.path})`:`${label3} (${decision.path})`}var TrustSelectorComponent=class extends Container{constructor(options){super(),this.savedDecision=options.savedDecision,this.trustOptions=getProjectTrustOptions(options.cwd),this.selectedIndex=Math.max(0,this.trustOptions.findIndex(option=>this.isSavedOption(option))),this.onSelectCallback=options.onSelect,this.onCancelCallback=options.onCancel,this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("accent",theme.bold("Project trust")),1,0)),this.addChild(new Text(theme.fg("muted",options.cwd),1,0)),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("muted",`Saved decision: ${formatDecision(this.trustOptions[0]?.savedPath,options.savedDecision)}`),1,0)),this.addChild(new Text(theme.fg("muted",`Current session: ${options.projectTrusted?"trusted":"untrusted"}`),1,0)),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.addChild(new Spacer(1)),this.addChild(new Text(rawKeyHint("\u2191\u2193","navigate")+" "+keyHint("tui.select.confirm","save")+" "+keyHint("tui.select.cancel","cancel"),1,0)),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.updateList()}isSavedOption(option){return option.savedPath!==void 0&&this.savedDecision?.decision===option.trusted&&this.savedDecision.path===option.savedPath}updateList(){this.listContainer.clear();for(let i=0;i<this.trustOptions.length;i++){let option=this.trustOptions[i];if(!option)continue;let isSelected=i===this.selectedIndex,currentMarker=this.isSavedOption(option)?theme.fg("accent","\u2713 "):" ",prefix=isSelected?theme.fg("accent","\u2192 "):" ",label3=isSelected?theme.fg("accent",option.label):theme.fg("text",option.label);this.listContainer.addChild(new Text(`${prefix}${currentMarker}${label3}`,1,0))}}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up")||keyData==="k")this.selectedIndex=Math.max(0,this.selectedIndex-1),this.updateList();else if(kb.matches(keyData,"tui.select.down")||keyData==="j")this.selectedIndex=Math.min(this.trustOptions.length-1,this.selectedIndex+1),this.updateList();else if(kb.matches(keyData,"tui.select.confirm")||keyData===`
|
|
2543
2544
|
`){let selected=this.trustOptions[this.selectedIndex];selected&&this.onSelectCallback({trusted:selected.trusted,updates:selected.updates})}else kb.matches(keyData,"tui.select.cancel")&&this.onCancelCallback()}};function getAskUserAnswerHeaders(entries,requestId){for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry.type!=="custom"||entry.customType!==ASK_USER_QUESTION_ENTRY)continue;let data=entry.data;if(typeof data!="object"||data===null||!("requestId"in data)||data.requestId!==requestId||!("headers"in data)||!Array.isArray(data.headers))continue;return data.headers.filter(header2=>typeof header2=="string")}return[]}function summaryRows(frame2,headers){let fallbackHeaders=headers.length>0?headers:[frame2.requestId];if(/^(?:The user did not answer|The user dismissed|The pending question|This session has no user)/.test(frame2.body))return fallbackHeaders.map(header2=>`\u21B3 ${header2}: (no answer)`);let answers=[],comment,unanswered=[];for(let line of frame2.body.split(`
|
|
2544
2545
|
`)){let separator=line.indexOf(": ");if(separator<1)continue;let header2=line.slice(0,separator),value2=line.slice(separator+2);header2==="The user responded"?comment=value2:header2==="Unanswered"?unanswered=value2.split(", "):answers.push(`\u21B3 ${header2}: ${value2}`)}return comment!==void 0?answers.push(`\u21B3 ${headers[0]??unanswered[0]??frame2.requestId}: ${JSON.stringify(comment)}`):answers.push(...unanswered.map(header2=>`\u21B3 ${header2}: (no answer)`)),answers.length>0?answers:fallbackHeaders.map(header2=>`\u21B3 ${header2}: (no answer)`)}var AskUserAnswerChip=class extends MouseRegion{constructor(frame2,headers,fullBody){let rows=summaryRows(frame2,headers).map(row=>stripAnsi(row).replace(/\s+/g," ")),summary={render:width=>rows.map(row=>theme.fg("muted",truncateToWidth(row,width,"\u2026"))),invalidate(){}},content=new Container;content.addChild(summary);let expanded=!1;super(content,event=>{if(event.button==="left"){if(event.type==="press")return{handled:!0,render:!1};if(!(event.type!=="click"||(event.clickCount??1)!==1))return expanded=!expanded,content.detachAll(),content.addChild(expanded?fullBody:summary),{handled:!0}}}),this.fullBody=fullBody}invalidate(){super.invalidate(),this.fullBody.invalidate()}dispose(){this.fullBody.dispose?.()}};var OSC133_ZONE_START2="\x1B]133;A\x07",OSC133_ZONE_END2="\x1B]133;B\x07",OSC133_ZONE_FINAL2="\x1B]133;C\x07",UserMessageComponent=class extends Container{constructor(text2,markdownTheme=getMarkdownTheme(),outputPad=1,markdownTransformers=[],answerHeaders=[]){super(),this.text=text2,this.markdownTheme=markdownTheme,this.outputPad=outputPad,this.markdownTransformers=markdownTransformers,this.answerHeaders=answerHeaders,this.rebuild()}setOutputPad(padding){this.outputPad=padding,this.rebuild()}rebuild(){this.clear();let contentBox=new Markdown(this.text,this.outputPad,1,this.markdownTheme,{color:content=>theme.fg("userMessageText",content),bgColor:content=>theme.bg("userMessageBg",content)},{preserveOrderedListMarkers:!0,preserveBackslashEscapes:!0,transform:createMarkdownTransform("user",!1,this.markdownTransformers)}),answer=parseAskUserAnswerFrame(this.text);this.addChild(answer?new AskUserAnswerChip(answer,this.answerHeaders,contentBox):contentBox)}getRenderRevision(){return this.childRenderRevision()}render(width){let lines=super.render(width);return lines.length===0?lines:lines.length===1?(lines[0]=OSC133_ZONE_START2+lines[0]+OSC133_ZONE_END2+OSC133_ZONE_FINAL2,lines):(lines[0]=OSC133_ZONE_START2+lines[0],lines[lines.length-1]=OSC133_ZONE_END2+OSC133_ZONE_FINAL2+lines[lines.length-1],lines)}};var UserMessageList=class{constructor(messages,initialSelectedId){this.messages=[],this.selectedIndex=0,this.maxVisible=10,this.messages=messages;let initialIndex=initialSelectedId?messages.findIndex(message=>message.id===initialSelectedId):-1;this.selectedIndex=initialIndex>=0?initialIndex:Math.max(0,messages.length-1)}invalidate(){}render(width){let lines=[];if(this.messages.length===0)return lines.push(theme.fg("muted"," No user messages found")),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.messages.length-this.maxVisible)),endIndex=Math.min(startIndex+this.maxVisible,this.messages.length);for(let i=startIndex;i<endIndex;i++){let message=this.messages[i],isSelected=i===this.selectedIndex,normalizedMessage=message.text.replace(/\n/g," ").trim(),cursor=isSelected?theme.fg("accent","\u203A "):" ",maxMsgWidth=width-2,truncatedMsg=truncateToWidth(normalizedMessage,maxMsgWidth),messageLine=cursor+(isSelected?theme.bold(truncatedMsg):truncatedMsg);lines.push(messageLine);let metadata=` Message ${i+1} of ${this.messages.length}`,metadataLine=theme.fg("muted",metadata);lines.push(metadataLine),lines.push("")}if(startIndex>0||endIndex<this.messages.length){let scrollInfo=theme.fg("muted",` (${this.selectedIndex+1}/${this.messages.length})`);lines.push(scrollInfo)}return lines}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up"))this.selectedIndex=this.selectedIndex===0?this.messages.length-1:this.selectedIndex-1;else if(kb.matches(keyData,"tui.select.down"))this.selectedIndex=this.selectedIndex===this.messages.length-1?0:this.selectedIndex+1;else if(kb.matches(keyData,"tui.select.confirm")){let selected=this.messages[this.selectedIndex];selected&&this.onSelect&&this.onSelect(selected.id)}else kb.matches(keyData,"tui.select.cancel")&&this.onCancel&&this.onCancel()}},UserMessageSelectorComponent=class extends Container{constructor(messages,onSelect,onCancel,initialSelectedId){super(),this.addChild(new Spacer(1)),this.addChild(new Text(theme.bold("Fork from Message"),1,0)),this.addChild(new Text(theme.fg("muted","Select a user message to copy the active path up to that point into a new session"),1,0)),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.messageList=new UserMessageList(messages,initialSelectedId),this.messageList.onSelect=onSelect,this.messageList.onCancel=onCancel,this.addChild(this.messageList),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),messages.length===0&&setTimeout(()=>onCancel(),100)}getMessageList(){return this.messageList}};import{spawn as spawn11}from"node:child_process";async function execCommand(command,args,cwd,options){return new Promise(resolve45=>{let proc=spawn11(command,args,{cwd,shell:!1,stdio:["ignore","pipe","pipe"]}),stdout="",stderr="",killed=!1,timeoutId,killProcess=()=>{killed||(killed=!0,proc.kill("SIGTERM"),setTimeout(()=>{proc.killed||proc.kill("SIGKILL")},5e3))};options?.signal&&(options.signal.aborted?killProcess():options.signal.addEventListener("abort",killProcess,{once:!0})),options?.timeout&&options.timeout>0&&(timeoutId=setTimeout(()=>{killProcess()},options.timeout)),proc.stdout?.on("data",data=>{stdout+=data.toString()}),proc.stderr?.on("data",data=>{stderr+=data.toString()}),waitForChildProcess(proc).then(code=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve45({stdout,stderr,code:code??0,killed})}).catch(_err=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve45({stdout,stderr,code:1,killed})})})}function createSessionControlActions(deps){return{registerControlEndpoint:async options=>{if(process.platform==="win32")return{status:"unsupported",reason:"unsupported_platform"};let host=deps.host();return host===void 0?{status:"unsupported",reason:"unsupported_mode"}:host.register(options)},admissionGate:()=>deps.admission.gate(),admitExternalMessage:input=>deps.admission.admit(input),listAdmittedDeliveries:()=>deps.admission.list(),persistHeaderNow:()=>deps.sessionManager.persistHeaderNow()}}function unboundSessionControlActions(){let notBound=()=>{throw new Error("Extension runtime not initialized. pi.session cannot be used during extension loading.")};return{registerControlEndpoint:()=>Promise.reject(new Error("Extension runtime not initialized")),admissionGate:notBound,admitExternalMessage:notBound,listAdmittedDeliveries:notBound,persistHeaderNow:()=>Promise.reject(new Error("Extension runtime not initialized"))}}import{statSync as statSync23}from"node:fs";var generation,pendingImporter,generationsCreated=0;function fingerprintOf(file){try{let stats=statSync23(file,{bigint:!0});return`${stats.mtimeNs}:${stats.size}`}catch{return}}function sourcesUnchanged(live){for(let[file,fingerprint]of live.fingerprints)if(fingerprintOf(file)!==fingerprint)return!1;return!0}function dropGeneration(){generation=void 0,pendingImporter=void 0}function absorbNewlyCompiled(live){for(let file of live.importer.compiledFiles?.()??[]){if(live.fingerprints.has(file))continue;let fingerprint=fingerprintOf(file);fingerprint!==void 0&&live.fingerprints.set(file,fingerprint)}}function cachedExtensionFactory(resolvedPath){if(generation){if(!sourcesUnchanged(generation)){dropGeneration();return}return absorbNewlyCompiled(generation),generation.factories.get(resolvedPath)}}async function extensionModuleImporter(create2){return generation?generation.importer:(pendingImporter??=create2().then(importer=>(generation={importer,factories:new Map,fingerprints:new Map},generationsCreated++,pendingImporter=void 0,importer)),pendingImporter)}function rememberExtensionFactory(resolvedPath,factory,compiledBy){!generation||generation.importer!==compiledBy||generation.importer.compiledFiles!==void 0&&(generation.factories.set(resolvedPath,factory),absorbNewlyCompiled(generation))}function clearExtensionCache(){dropGeneration()}var __rewriteRelativeImportExtension=function(path15,preserveJsx){return typeof path15=="string"&&/^\.\.?\//.test(path15)?path15.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path15};function sessionProfile(options){return{sessionKind:options?.sessionKind??"interactive",sessionContext:options?.sessionContext??EMPTY_SESSION_CONTEXT}}var VIRTUAL_MODULES={typebox:build_exports,"typebox/compile":compile_exports,"typebox/value":value_exports,"@sinclair/typebox":build_exports,"@sinclair/typebox/compile":compile_exports,"@sinclair/typebox/value":value_exports,"@earendil-works/pi-agent-core":dist_exports2,"@earendil-works/pi-tui":dist_exports,"@earendil-works/pi-ai":compat_exports,"@earendil-works/pi-ai/compat":compat_exports,"@earendil-works/pi-ai/oauth":oauth_exports,"@earendil-works/pi-ai/providers/all":all_exports,"@earendil-works/pi-coding-agent":dist_exports3,"@mariozechner/pi-agent-core":dist_exports2,"@mariozechner/pi-tui":dist_exports,"@mariozechner/pi-ai":compat_exports,"@mariozechner/pi-ai/compat":compat_exports,"@mariozechner/pi-ai/oauth":oauth_exports,"@mariozechner/pi-ai/providers/all":all_exports,"@mariozechner/pi-coding-agent":dist_exports3,"@code-yeongyu/senpi":dist_exports3},require3=createRequire3(import.meta.url),isNodeSeaBinary="sea"in process.features&&process.features.sea===!0||process.getBuiltinModule("node:sea")?.isSea()===!0,isTypeScriptSourceRuntime=!isBunBinary&&path11.extname(fileURLToPath5(import.meta.url))===".ts",usesNativeBunImports=isBunBinary||isBunRuntime,_aliases=null;function getAliases(){if(_aliases)return _aliases;let __dirname=path11.dirname(fileURLToPath5(import.meta.url)),typeboxEntry=require3.resolve("typebox"),typeboxCompileEntry=require3.resolve("typebox/compile"),typeboxValueEntry=require3.resolve("typebox/value"),codingAgentPackageRoot=path11.resolve(__dirname,"../../.."),packagesRoot=path11.dirname(codingAgentPackageRoot),resolveWorkspaceOrBundled=(packageName,packageEntryRelativePath,workspaceRelativePath,sourceRelativePath,specifier)=>{let bundledPath=path11.join(codingAgentPackageRoot,"node_modules",packageName,packageEntryRelativePath);if(fs3.existsSync(bundledPath))return bundledPath;let workspacePath=path11.join(packagesRoot,workspaceRelativePath);if(fs3.existsSync(workspacePath))return workspacePath;let sourcePath=path11.join(packagesRoot,sourceRelativePath);return fs3.existsSync(sourcePath)?sourcePath:typeof import.meta.resolve=="function"?fileURLToPath5(import.meta.resolve(specifier)):require3.resolve(specifier)},piCodingAgentDistEntry=path11.join(codingAgentPackageRoot,"dist/index.js"),piCodingAgentSourceEntry=path11.join(codingAgentPackageRoot,"src/index.ts"),piCodingAgentEntry=fs3.existsSync(piCodingAgentDistEntry)?piCodingAgentDistEntry:piCodingAgentSourceEntry,piAgentCoreEntry=resolveWorkspaceOrBundled("@earendil-works/pi-agent-core","dist/index.js","agent/dist/index.js","agent/src/index.ts","@earendil-works/pi-agent-core"),piTuiEntry=resolveWorkspaceOrBundled("@earendil-works/pi-tui","dist/index.js","tui/dist/index.js","tui/src/index.ts","@earendil-works/pi-tui"),piAiCompatEntry=resolveWorkspaceOrBundled("@earendil-works/pi-ai","dist/compat.js","ai/dist/compat.js","ai/src/compat.ts","@earendil-works/pi-ai/compat"),piAiOauthEntry=resolveWorkspaceOrBundled("@earendil-works/pi-ai","dist/oauth.js","ai/dist/oauth.js","ai/src/oauth.ts","@earendil-works/pi-ai/oauth"),piAiProvidersEntry=resolveWorkspaceOrBundled("@earendil-works/pi-ai","dist/providers/all.js","ai/dist/providers/all.js","ai/src/providers/all.ts","@earendil-works/pi-ai/providers/all");return _aliases={"@earendil-works/pi-coding-agent":piCodingAgentEntry,"@earendil-works/pi-agent-core":piAgentCoreEntry,"@earendil-works/pi-tui":piTuiEntry,"@earendil-works/pi-ai/providers/all":piAiProvidersEntry,"@earendil-works/pi-ai/compat":piAiCompatEntry,"@earendil-works/pi-ai/oauth":piAiOauthEntry,"@earendil-works/pi-ai":piAiCompatEntry,"@code-yeongyu/senpi":piCodingAgentEntry,"@mariozechner/pi-coding-agent":piCodingAgentEntry,"@mariozechner/pi-agent-core":piAgentCoreEntry,"@mariozechner/pi-tui":piTuiEntry,"@mariozechner/pi-ai/providers/all":piAiProvidersEntry,"@mariozechner/pi-ai/compat":piAiCompatEntry,"@mariozechner/pi-ai/oauth":piAiOauthEntry,"@mariozechner/pi-ai":piAiCompatEntry,typebox:typeboxEntry,"typebox/compile":typeboxCompileEntry,"typebox/value":typeboxValueEntry,"@sinclair/typebox":typeboxEntry,"@sinclair/typebox/compile":typeboxCompileEntry,"@sinclair/typebox/value":typeboxValueEntry},_aliases}var runtimeFactories=new WeakMap;function createExtensionRuntime(){let notInitialized=()=>{throw new Error("Extension runtime not initialized. Action methods cannot be called during extension loading.")},state={},nextProviderRegistrationOrder=0,eventBusUnsubscribers=new Set,assertActive=()=>{if(state.staleMessage)throw new Error(state.staleMessage)},runtime={sendMessage:notInitialized,sendUserMessage:notInitialized,appendEntry:notInitialized,setSessionName:notInitialized,getSessionName:notInitialized,setLabel:notInitialized,executeTool:()=>Promise.reject(new Error("Extension runtime not initialized")),getActiveTools:notInitialized,getAllTools:notInitialized,getSettings:notInitialized,setActiveTools:notInitialized,refreshTools:()=>{},registerRemovedToolHint:()=>{},registerLazyToolActivator:()=>{},getCommands:notInitialized,setModel:()=>Promise.reject(new Error("Extension runtime not initialized")),getThinkingLevel:notInitialized,setThinkingLevel:notInitialized,setSessionModel:()=>Promise.reject(new Error("Extension runtime not initialized")),setSessionThinkingLevel:notInitialized,setSessionFastMode:notInitialized,sessionControl:unboundSessionControlActions(),flagValues:new Map,pendingProviderRegistrations:[],pendingNativeProviderRegistrations:[],pendingVirtualModelRegistrations:[],createContext:notInitialized,assertActive,invalidate:message=>{if(!state.staleMessage){state.staleMessage=message??"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().";for(let unsubscribe of eventBusUnsubscribers)unsubscribe();eventBusUnsubscribers.clear(),runtime.evalHandleHost=void 0,runtimeFactories.delete(runtime)}},trackEventBusSubscription:unsubscribe=>{let active=!0,trackedUnsubscribe=()=>{active&&(active=!1,eventBusUnsubscribers.delete(trackedUnsubscribe),unsubscribe())};return eventBusUnsubscribers.add(trackedUnsubscribe),trackedUnsubscribe},registerProvider:(name,config,extensionPath="<unknown>")=>{runtime.pendingProviderRegistrations.push({name,config,extensionPath,order:nextProviderRegistrationOrder++})},registerNativeProvider:(provider,extensionPath="<unknown>")=>{runtime.pendingNativeProviderRegistrations.push({provider,extensionPath,order:nextProviderRegistrationOrder++})},unregisterProvider:name=>{runtime.pendingProviderRegistrations=runtime.pendingProviderRegistrations.filter(r=>r.name!==name),runtime.pendingNativeProviderRegistrations=runtime.pendingNativeProviderRegistrations.filter(r=>r.provider.id!==name)},registerVirtualModel:(definition,extensionPath="<unknown>")=>{runtime.pendingVirtualModelRegistrations.push({definition,extensionPath})},unregisterVirtualModel:(provider,id)=>{runtime.pendingVirtualModelRegistrations=runtime.pendingVirtualModelRegistrations.filter(({definition})=>definition.provider!==provider||definition.id!==id)}};return runtime}var unboundSessionControl=unboundSessionControlActions();function sessionControlOf(runtime){return runtime.sessionControl??unboundSessionControl}function drainPendingProviderRegistrations(runtime){let drained=[...runtime.pendingProviderRegistrations.map(entry=>({kind:"config",...entry})),...runtime.pendingNativeProviderRegistrations.map(entry=>({kind:"native",...entry}))];return drained.sort((a,b)=>a.order-b.order),runtime.pendingProviderRegistrations=[],runtime.pendingNativeProviderRegistrations=[],drained}function createExtensionAPI(extension,runtime,cwd,eventBus,session){let pendingFlagValues=new Map,pendingRuntimeChanges=[],loadingUnsubscribers=[],state="loading",assertActive=()=>{if(state==="failed")throw new Error(`Extension "${extension.path}" failed to load and its API is no longer active.`);runtime.assertActive()},applyRuntimeChange=change=>{state==="loading"?pendingRuntimeChanges.push(change):change()},clearPending=()=>{pendingFlagValues.clear(),pendingRuntimeChanges.length=0,loadingUnsubscribers.length=0},api={cwd,sessionKind:session.sessionKind,sessionContext:session.sessionContext,on(event,handler,options){assertActive();let registeredHandler=(...args)=>handler(...args),list4=extension.handlers.get(event)??[];return list4.push(registeredHandler),extension.handlers.set(event,list4),event==="before_agent_start"&&options?.previewSafe===!0&&(extension.previewSafeHandlers??=new WeakSet,extension.previewSafeHandlers.add(registeredHandler)),()=>{let handlers=extension.handlers.get(event);if(!handlers)return;let handlerIndex=handlers.indexOf(registeredHandler);handlerIndex!==-1&&(handlers.splice(handlerIndex,1),handlers.length===0&&extension.handlers.delete(event))}},registerTool(tool){if(runtime.assertActive(),tool.name==="tool_search"&&extension.sourceInfo.source!=="builtin")throw new Error('Tool name "tool_search" is reserved for the builtin tool-search extension.');if(typeof tool.parameters!="object"||tool.parameters===null||Array.isArray(tool.parameters))throw new Error(`Tool "${tool.name}" registered by extension "${extension.path}" must define an object parameter schema.`);extension.tools.set(tool.name,{definition:tool,sourceInfo:extension.sourceInfo}),runtime.refreshTools()},registerLazyToolActivator(activator){runtime.assertActive();let activators=extension.lazyToolActivators??[];activators.push(activator),extension.lazyToolActivators=activators,runtime.registerLazyToolActivator(activator)},provideEvalHandleHost(host){runtime.assertActive(),runtime.evalHandleHost=host},registerRemovedToolHint(name,hint){runtime.assertActive();let hints=extension.removedToolHints;hints||(hints=new Map,extension.removedToolHints=hints),hints.set(name,hint),runtime.registerRemovedToolHint(name,hint)},registerFilesystemPolicy(policy){runtime.assertActive();let policies=extension.filesystemPolicies??[];policies.push(policy),extension.filesystemPolicies=policies},registerCommand(name,options){if(assertActive(),typeof name!="string"||name.length===0)throw new Error(`Command registered by extension "${extension.path}" must have a non-empty string name. Use pi.registerCommand("name", { description, handler }).`);if(typeof options?.handler!="function")throw new Error(`Command "/${name}" registered by extension "${extension.path}" must define handler().`);extension.commands.set(name,{name,sourceInfo:extension.sourceInfo,...options})},registerShortcut(shortcut,options){assertActive(),extension.shortcuts.set(shortcut,{shortcut,extensionPath:extension.path,...options})},registerFlag(name,options){if(assertActive(),options.default!==void 0&&typeof options.default!==options.type)throw new Error(`Invalid default for flag "${name}": expected ${options.type}, got ${typeof options.default}`);extension.flags.set(name,{name,extensionPath:extension.path,...options}),options.default!==void 0&&!runtime.flagValues.has(name)&&(state==="loading"?pendingFlagValues.has(name)||pendingFlagValues.set(name,options.default):runtime.flagValues.set(name,options.default))},registerMessageRenderer(customType,renderer){assertActive(),extension.messageRenderers.set(customType,renderer)},registerMemoryReporter(name,reporter){if(assertActive(),RESERVED_MEMORY_REPORT_KEYS.has(name))throw new Error(`Memory reporter name "${name}" is reserved by the memory report`);extension.memoryReporters??=new Map,extension.memoryReporters.set(name,reporter)},registerMarkdownTransformer(transformer){assertActive(),extension.markdownTransformer=transformer},registerEntryRenderer(customType,renderer,options){assertActive(),extension.entryRenderers??=new Map,extension.entryRenderers.set(customType,renderer),extension.entryRendererOptions??=new Map,options===void 0?extension.entryRendererOptions.delete(customType):extension.entryRendererOptions.set(customType,options)},registerReadClassifier(classifier){assertActive();let unregister=runtime.trackEventBusSubscription(registerReadClassifier(classifier));return state==="loading"&&loadingUnsubscribers.push(unregister),unregister},registerMcpServer(name,config){runtime.assertActive();let error2=validateMcpServerDeclaration(name,config);if(error2)throw new Error(error2);extension.mcpServers.set(name,{name,config,extensionPath:extension.path,registrationCwd:extension.registrationCwd})},getFlag(name){if(assertActive(),!!extension.flags.has(name))return runtime.flagValues.has(name)?runtime.flagValues.get(name):pendingFlagValues.get(name)},sendMessage(message,options){assertActive(),runtime.sendMessage(message,options)},sendUserMessage(content,options){assertActive(),runtime.sendUserMessage(content,options)},appendEntry(customType,data){assertActive(),runtime.appendEntry(customType,data)},setSessionName(name){assertActive(),runtime.setSessionName(name)},getSessionName(){return assertActive(),runtime.getSessionName()},setLabel(entryId,label3){assertActive(),runtime.setLabel(entryId,label3)},exec(command,args,options){return assertActive(),execCommand(command,args,options?.cwd??cwd,options)},executeTool(toolName,params,options){return runtime.assertActive(),runtime.executeTool(toolName,params,options)},getActiveTools(){return assertActive(),runtime.getActiveTools()},getAllTools(){return assertActive(),runtime.getAllTools()},getSettings(){return assertActive(),runtime.getSettings()},setActiveTools(toolNames){assertActive(),runtime.setActiveTools(toolNames)},getCommands(){return assertActive(),runtime.getCommands()},setModel(model){return assertActive(),runtime.setModel(model)},getThinkingLevel(){return assertActive(),runtime.getThinkingLevel()},setThinkingLevel(level){assertActive(),runtime.setThinkingLevel(level)},setSessionModel(model){return runtime.assertActive(),runtime.setSessionModel(model)},setSessionThinkingLevel(level){runtime.assertActive(),runtime.setSessionThinkingLevel(level)},setSessionFastMode(enabled){runtime.assertActive(),runtime.setSessionFastMode(enabled)},registerProvider(providerOrName,config){if(assertActive(),typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");applyRuntimeChange(()=>runtime.registerProvider(providerOrName,config,extension.path));return}applyRuntimeChange(()=>runtime.registerNativeProvider(providerOrName,extension.path))},unregisterProvider(name){assertActive(),applyRuntimeChange(()=>runtime.unregisterProvider(name,extension.path))},session:{registerControlEndpoint(options){return runtime.assertActive(),sessionControlOf(runtime).registerControlEndpoint(options)},admissionGate(){return runtime.assertActive(),sessionControlOf(runtime).admissionGate()},admitExternalMessage(input){return runtime.assertActive(),sessionControlOf(runtime).admitExternalMessage(input)},listAdmittedDeliveries(){return runtime.assertActive(),sessionControlOf(runtime).listAdmittedDeliveries()},persistHeaderNow(){return runtime.assertActive(),sessionControlOf(runtime).persistHeaderNow()}},rpc:{emit(name,data){runtime.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("RPC extension event name must not be empty");eventBus.emit(EXTENSION_RPC_EVENT_CHANNEL,{name:normalizedName,data})},handle(name,handler){runtime.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("RPC extension request name must not be empty");let handlers=extension.rpcHandlers??new Map;if(handlers.has(normalizedName))throw new Error(`RPC extension request handler already registered: ${normalizedName}`);handlers.set(normalizedName,handler),extension.rpcHandlers=handlers}},registerVirtualModel(model){assertActive();let definition={...model,route:request2=>model.route(request2,runtime.createContext())};applyRuntimeChange(()=>runtime.registerVirtualModel(definition,extension.path))},unregisterVirtualModel(provider,id){assertActive(),applyRuntimeChange(()=>runtime.unregisterVirtualModel(provider,id))},events:{emit(channel,data){assertActive(),eventBus.emit(channel,data)},on(channel,handler){assertActive();let unsubscribe=runtime.trackEventBusSubscription(eventBus.on(channel,handler));return state==="loading"&&loadingUnsubscribers.push(unsubscribe),unsubscribe}}};return recordExtensionLoadKey(api,runtime),{api,commit:()=>{if(state==="loading"){runtime.assertActive();for(let[name,value2]of pendingFlagValues)runtime.flagValues.has(name)||runtime.flagValues.set(name,value2);for(let apply of pendingRuntimeChanges)apply();state="active",clearPending()}},discard:()=>{if(state==="loading"){state="failed";for(let unsubscribe of loadingUnsubscribers)unsubscribe();clearPending()}}}}var importNodeOnlyApi=specifier=>import(__rewriteRelativeImportExtension(specifier));async function createExtensionModuleImporter(){if(usesNativeBunImports){let{createBunExtensionImporter}=await import("./bun-extension-importer-3TEDTSKJ.js");return createBunExtensionImporter(VIRTUAL_MODULES)}let{createJiti}=await importNodeOnlyApi("jiti/static");return createJiti(import.meta.url,{moduleCache:!1,...isNodeSeaBinary||isBundledNode?{virtualModules:VIRTUAL_MODULES,tryNative:!1}:isTypeScriptSourceRuntime?{alias:getAliases(),virtualModules:VIRTUAL_MODULES,tsconfigPaths:!0}:{alias:getAliases()}})}async function loadExtensionModule(extensionPath,getImporter){let cachedFactory=cachedExtensionFactory(extensionPath);if(cachedFactory)return cachedFactory;let importer=await getImporter(),factory=await importer.import(extensionPath,{default:!0});if(typeof factory=="function")return rememberExtensionFactory(extensionPath,factory,importer),factory}function createExtension(extensionPath,resolvedPath,registrationCwd){let source2=getSyntheticPathSource(extensionPath)??"local",baseDir=isSyntheticPath(extensionPath)?void 0:path11.dirname(resolvedPath);return{path:extensionPath,resolvedPath,sourceInfo:createSyntheticSourceInfo(extensionPath,{source:source2,baseDir,scope:source2==="builtin"?"system":"temporary"}),handlers:new Map,tools:new Map,removedToolHints:new Map,lazyToolActivators:[],filesystemPolicies:[],messageRenderers:new Map,memoryReporters:new Map,entryRenderers:void 0,commands:new Map,rpcHandlers:new Map,flags:new Map,shortcuts:new Map,mcpServers:new Map,registrationCwd}}async function initializeExtension(factory,extensionPath,resolvedPath,cwd,eventBus,runtime,session){let extension=createExtension(extensionPath,resolvedPath,cwd),load=createExtensionAPI(extension,runtime,cwd,eventBus,session);try{if(await factory(load.api),load.commit(),usesNativeBunImports){let factories=runtimeFactories.get(runtime)??new Set;factories.add(factory),runtimeFactories.set(runtime,factories)}}catch(error2){throw load.discard(),error2}return time(`${extensionPath} factory`,"extensions"),extension}async function loadExtension(extensionPath,cwd,eventBus,runtime,getImporter,factoryResolver,session=DEFAULT_EXTENSION_SESSION_PROFILE){let resolvedPath=resolvePath(extensionPath,cwd,{normalizeUnicodeSpaces:!0});try{let factory=factoryResolver?.(extensionPath,resolvedPath)??await loadExtensionModule(resolvedPath,getImporter);return time(`${extensionPath} module import`,"extensions"),factory?{extension:await initializeExtension(factory,extensionPath,resolvedPath,cwd,eventBus,runtime,session),error:null}:{extension:null,error:`Extension does not export a valid factory function: ${extensionPath}`}}catch(err2){return{extension:null,error:`Failed to load extension: ${err2 instanceof Error?err2.message:String(err2)}`}}}async function loadExtensionFromFactory(factory,cwd,eventBus,runtime,extensionPath="<inline>",session=DEFAULT_EXTENSION_SESSION_PROFILE){let resolvedCwd=resolvePath(cwd);return initializeExtension(factory,extensionPath,extensionPath,resolvedCwd,eventBus,runtime,session)}async function loadExtensionsInternal(paths,cwd,eventBus,runtime,options){let session=sessionProfile(options),extensions=[],errors=[],warnings=[],resolvedCwd=resolvePath(cwd),resolvedEventBus=eventBus??createEventBus(),resolvedRuntime=runtime??createExtensionRuntime(),getImporter=()=>extensionModuleImporter(createExtensionModuleImporter);for(let extPath of paths){let{extension,error:error2}=await loadExtension(extPath,resolvedCwd,resolvedEventBus,resolvedRuntime,getImporter,options?.factoryResolver,session);if(error2){errors.push({path:extPath,error:error2});continue}extension&&extensions.push(extension)}return{extensions,errors,warnings,runtime:resolvedRuntime,eventBus:resolvedEventBus}}async function loadExtensions(paths,cwd,eventBus,runtime,options){return loadExtensionsInternal(paths,cwd,eventBus,runtime,options)}function isExtensionFile(name){return name.endsWith(".ts")||name.endsWith(".js")}function resolveExtensionEntries(dir){let packageJsonPath=path11.join(dir,"package.json");if(fs3.existsSync(packageJsonPath)){let manifest=readPiManifest(packageJsonPath);if(manifest?.extensions?.length){let entries=[];for(let extPath of manifest.extensions){let resolvedExtPath=path11.resolve(dir,extPath);fs3.existsSync(resolvedExtPath)&&entries.push(resolvedExtPath)}if(entries.length>0)return entries}}let indexTs=path11.join(dir,"index.ts"),indexJs=path11.join(dir,"index.js");return fs3.existsSync(indexTs)?[indexTs]:fs3.existsSync(indexJs)?[indexJs]:null}function discoverExtensionsInDir(dir){if(!fs3.existsSync(dir))return[];let discovered=[];try{let entries=fs3.readdirSync(dir,{withFileTypes:!0});for(let entry of entries){let entryPath=path11.join(dir,entry.name);if((entry.isFile()||entry.isSymbolicLink())&&isExtensionFile(entry.name)){discovered.push(entryPath);continue}if(entry.isDirectory()||entry.isSymbolicLink()){let entries2=resolveExtensionEntries(entryPath);entries2&&discovered.push(...entries2)}}}catch{return[]}return discovered}async function discoverAndLoadExtensions(configuredPaths,cwd,agentDir=getAgentDir(),eventBus){let resolvedCwd=resolvePath(cwd),resolvedAgentDir=resolvePath(agentDir),allPaths=[],seen=new Set,addPaths=paths=>{for(let p of paths){let resolved=path11.resolve(p);seen.has(resolved)||(seen.add(resolved),allPaths.push(p))}},localExtDir=path11.join(resolvedCwd,CONFIG_DIR_NAME,"extensions");addPaths(discoverExtensionsInDir(localExtDir));let globalExtDir=path11.join(resolvedAgentDir,"extensions");addPaths(discoverExtensionsInDir(globalExtDir));for(let p of configuredPaths){let resolved=resolvePath(p,resolvedCwd,{normalizeUnicodeSpaces:!0});if(fs3.existsSync(resolved)&&fs3.statSync(resolved).isDirectory()){let entries=resolveExtensionEntries(resolved);if(entries){addPaths(entries);continue}addPaths(discoverExtensionsInDir(resolved));continue}addPaths([resolved])}return loadExtensions(allPaths,resolvedCwd,eventBus)}function wrapRegisteredTool(registeredTool,runner,createToolContext){return{...wrapToolDefinition(registeredTool.definition),execute:async(toolCallId,params,signal,onUpdate)=>{let activeBefore=runner.getActiveTools(),invocation=createToolContext?.(signal),result3;try{result3=await registeredTool.definition.execute(toolCallId,params,signal,onUpdate,runner.createToolContext(toolCallId,signal,invocation?.context))}finally{invocation?.dispose()}let activeAfter=runner.getActiveTools();if(!activeBefore.every(name=>activeAfter.includes(name)))return result3;let beforeNames=new Set(activeBefore),addedToolNames=activeAfter.filter(name=>!beforeNames.has(name));return addedToolNames.length===0?result3:{...result3,addedToolNames:[...new Set([...result3.addedToolNames??[],...addedToolNames])]}}}}function wrapRegisteredTools(registeredTools,runner,createToolContext){return registeredTools.map(tool=>wrapRegisteredTool(tool,runner,createToolContext))}var KERNEL_BUILTIN_GLOBALS=new Set(["agent","completion","display","env","log","output","parallel","phase","pipeline","print","read","tool","tool_schema","tools","workpool","write"]),KernelPreludeCollisionError=class extends Error{constructor(toolName,collidingExport){super(`Tool "${toolName}" kernelPrelude export "${collidingExport}" collides with a built-in eval kernel global.`),this.name="KernelPreludeCollisionError",this.toolName=toolName,this.collidingExport=collidingExport}};function projectKernelPrelude(toolName,prelude){let collision=prelude?.exports.find(name=>KERNEL_BUILTIN_GLOBALS.has(name)||name.startsWith("__"));if(collision!==void 0)throw new KernelPreludeCollisionError(toolName,collision);return prelude}var ExternalAdmission=class{constructor(port){this.turnEpochValue=0,this.pending=new Map,this.emitted=new Set,this.failed=new Map,this.fileTakesWrites=!0,this.emittedListeners=new Set,this.inputHolds=new Set,this.settledListeners=new Set,this.port=port}get turnEpoch(){return this.turnEpochValue}beginTurn(){this.turnEpochValue+=1}setEditorSource(source2){this.editorSource=source2}beginInput(options={}){let parents=options.submittedByCommand?[...this.inputHolds].filter(hold=>hold.command):[],state={command:options.command===!0};this.inputHolds.add(state);let end=()=>this.endHold(state);return{accepted:()=>{end();for(let parent of parents)this.endHold(parent)},end}}onInputsSettled(listener){return this.settledListeners.add(listener),()=>this.settledListeners.delete(listener)}onEmitted(listener){return this.emittedListeners.add(listener),()=>this.emittedListeners.delete(listener)}close(reason){this.closedReason??=reason}reopen(){this.closedReason=void 0}gate(){let editor=this.editorSource?.()??{revision:0},base={editor_revision:editor.revision,turn_epoch:this.turnEpochValue};return this.inputHolds.size>0?{can_admit:!1,hold_reason:"draft",...base}:editor.hold_reason===void 0?{can_admit:!0,...base}:{can_admit:!1,hold_reason:editor.hold_reason,...base}}admit(input){if(this.closedReason!==void 0)throw new Error(this.closedReason);let turn_epoch=this.turnEpochValue,id=input.delivery_id;if(this.pending.has(id)||this.emitted.has(id)||this.failed.has(id))return{kind:"already_admitted",turn_epoch};if(!this.gate().can_admit)return{kind:"held_draft",turn_epoch};if(input.expected_turn_id!==void 0&&input.expected_turn_id!==turn_epoch)return{kind:"turn_conflict",turn_epoch};let message=deliveryMessage(input);return this.isBusy()?input.deliverAs==="steer"?input.expected_turn_id===void 0?{kind:"turn_conflict",turn_epoch}:(this.pending.set(id,"steer"),this.port.enqueue(message,"steer"),{kind:"steered",turn_epoch}):(this.pending.set(id,"followUp"),this.port.enqueue(message,"followUp"),{kind:"queued",turn_epoch}):(this.pending.set(id,"start"),this.port.start(message).finally(()=>{this.pending.get(id)==="start"&&this.pending.set(id,"followUp")}),{kind:"started",turn_epoch})}list(){let deliveries={pending:[...this.pending.keys()],emitted:[...this.emitted]};if(this.failed.size===0)return deliveries;let failed=[...this.failed].map(([delivery_id,error2])=>({delivery_id,error:error2}));return{...deliveries,failed}}observePersisted(message){this.fileTakesWrites=!0;let id=deliveryIdOf(message);if(!(id===void 0||this.emitted.has(id))){this.pending.delete(id),this.emitted.add(id);for(let listener of this.emittedListeners)listener(id)}}observeRefused(message,error2){this.fileTakesWrites=!1;let id=deliveryIdOf(message);id===void 0||this.emitted.has(id)||(this.pending.delete(id),this.failed.set(id,error2))}observeRunSettled(){this.fileTakesWrites&&this.failed.clear()}dropQueued(){for(let[id,lane]of this.pending)lane!=="start"&&this.pending.delete(id)}endHold(state){if(this.inputHolds.delete(state)&&this.inputHolds.size===0)for(let listener of this.settledListeners)listener()}isBusy(){if(this.port.isBusy())return!0;for(let lane of this.pending.values())if(lane==="start")return!0;return!1}};function deliveryMessage(input){return{role:"custom",customType:SESSION_CONTROL_DELIVERY_TYPE,content:input.text,display:!0,details:{delivery_id:input.delivery_id,source:"session_control",deliverAs:input.deliverAs},timestamp:Date.now()}}function deliveryIdOf(message){if(!(message.role!=="custom"||message.customType!==SESSION_CONTROL_DELIVERY_TYPE))return isSessionControlDeliveryDetails(message.details)?message.details.delivery_id:void 0}var SENSITIVE_MODEL_ID_PATTERN=/(?:gpt-5(?:\.\d+)?-sol|gpt-6(?:\.\d+|\d)?-sol|gpt-6-astra)(?![a-z])/i;function isSensitiveHighReasoningModel(model){return SENSITIVE_MODEL_ID_PATTERN.test(model.id)}function shouldWarnHighReasoning(model,thinkingLevel){return(thinkingLevel==="xhigh"||thinkingLevel==="max")&&isSensitiveHighReasoningModel(model)}function buildHighReasoningWarning(model,thinkingLevel){let modelId=model.id,title=`\u26A0 HIGH-REASONING MODEL WARNING \u2014 ${model.provider}/${modelId} @ ${thinkingLevel}`,body=[`${modelId} is a frontier reasoning model. Running it at "${thinkingLevel}" effort makes it acutely sensitive to prompt quality.`,"Driving this model directly from a human prompt is NOT recommended. Risks include:"," \u2022 The model may refuse to stop, looping or working far past the stated goal.",' \u2022 It may perform unrequested actions in order to "complete" the task.'," \u2022 It may take risky, irreversible, or dangerous actions to force completion.","Strongly recommended: use this model ONLY through the ultrabrain subagent.","Human prompts leave gaps; an agent-authored prompt is denser and stricter than a human's \u2014 exactly what these high-effort models need to stay bounded.",'From the main agent, delegate instead: "query ultrabrain with <task>".',`If you drive this model directly at ${thinkingLevel}, YOU assume ALL responsibility for the consequences.`];return{title,body}}var LazyToolActivation=class{#host;#activators=[];constructor(host){this.#host=host}register(activator){this.#activators.push(activator)}reset(){this.#activators=[]}activate(toolName){let definition=this.#host.getToolDefinition(toolName);if(!definition)return!1;let exposure=normalizeToolExposure(definition);return exposure.allowLazyActivation?this.#activators.some(activate=>activate(toolName))?!0:(exposure.exposure==="search"&&!this.#host.getActiveTools().includes(toolName)&&this.#host.setActiveTools([...this.#host.getActiveTools(),toolName]),this.#host.getActiveTools().includes(toolName)):!1}};var NESTED_CALL_LIMITS={maxCalls:256,maxArgumentBytesPerCall:8*1024,maxArgumentBytesTotal:32*1024,maxErrorChars:500},encoder=new TextEncoder,NestedCallRecorder=class{constructor(){this.calls=[],this.startedAt=new Map,this.complete=!0,this.argumentBytes=0}start(toolCall){if(this.calls.length>=NESTED_CALL_LIMITS.maxCalls){this.complete=!1;return}let record7={id:toolCall.id,name:toolCall.name,status:"unfinished"},json=JSON.stringify(toolCall.arguments??{}),bytes=encoder.encode(json).length;return bytes>NESTED_CALL_LIMITS.maxArgumentBytesPerCall||this.argumentBytes+bytes>NESTED_CALL_LIMITS.maxArgumentBytesTotal?(record7.argumentsBytes=bytes,this.complete=!1):(record7.arguments=JSON.parse(json),this.argumentBytes+=bytes),this.calls.push(record7),this.startedAt.set(record7,performance.now()),record7}finish(record7,isError,errorText6){record7&&(record7.status=isError?"error":"ok",record7.durationMs=Math.round(performance.now()-(this.startedAt.get(record7)??performance.now())),this.startedAt.delete(record7),isError&&errorText6&&(record7.error=errorText6.slice(0,NESTED_CALL_LIMITS.maxErrorChars)))}addUsage(usage3){this.usage=this.usage?combineUsage(this.usage,usage3):usage3}get totalUsage(){return this.usage}snapshot(){if(this.calls.length===0&&this.complete)return;let calls=this.calls.map(call=>({...call}));return{calls,complete:this.complete&&calls.every(call=>call.status!=="unfinished")}}};function textOf(result3){return(result3.content??[]).filter(block=>block.type==="text").map(block=>block.text).join(`
|
|
2545
|
-
`)}var NestedToolCallRunner=class{constructor(host){this.scopes=new Map,this.queueTail=Promise.resolve(),this.host=host}async execute(callerId,name,args,options={}){let scope=this.scopes.get(callerId);scope||(scope={recorder:new NestedCallRecorder,nextId:1,holdsQueue:!1},this.scopes.set(callerId,scope));let toolCall={type:"toolCall",id:`${callerId}/${scope.nextId++}`,name,arguments:args??{}},record7=scope.recorder.start(toolCall);await this.host.emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:name,args:toolCall.arguments,parentToolCallId:callerId});let exclusive=!scope.holdsQueue&&(this.host.isSequential()||this.host.getTools().find(tool=>tool.name===name)?.executionMode==="sequential"),release4;if(exclusive){let previous=this.queueTail;this.queueTail=new Promise(resolve45=>{release4=resolve45}),await previous}this.scopes.set(toolCall.id,{recorder:scope.recorder,nextId:1,holdsQueue:scope.holdsQueue||exclusive});let outcome;try{outcome=await this.host.runToolCall(toolCall,callerId,options.signal,async partialResult=>{options.onUpdate?.(partialResult),await this.host.emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:name,args:toolCall.arguments,partialResult,parentToolCallId:callerId})})}finally{this.scopes.delete(toolCall.id),release4?.()}return scope.recorder.finish(record7,outcome.isError,textOf(outcome.result)),outcome.result.usage&&scope.recorder.addUsage(outcome.result.usage),await this.host.emit({type:"tool_execution_end",toolCallId:toolCall.id,toolName:name,result:outcome.result,isError:outcome.isError,parentToolCallId:callerId}),outcome}takeRecord(toolCallId){let scope=this.scopes.get(toolCallId);if(this.scopes.delete(toolCallId),!!scope)return{calls:scope.recorder.snapshot(),usage:scope.recorder.totalUsage}}clear(){this.scopes.clear()}};var DEFAULT_PROMPT_CACHE_SAFETY_BUFFER_SECONDS=30,PROMPT_CACHE_SAFE_WAIT_ENV="PI_PROMPT_CACHE_SAFE_WAIT_SECONDS";function toProviderEnv2(env){let resolved={};for(let[key,value2]of Object.entries(env))value2!==void 0&&(resolved[key]=value2);return resolved}function resolveBufferSeconds(configured){return configured===void 0||!Number.isFinite(configured)||configured<0?DEFAULT_PROMPT_CACHE_SAFETY_BUFFER_SECONDS:Math.trunc(configured)}function resolvePromptCacheSafeWaitSeconds(model,settings,env){if(settings?.cacheAwareTimeouts===!1||!model)return;let ttlSeconds=resolvePromptCacheTtlSeconds(model,toProviderEnv2(env));if(ttlSeconds===void 0)return;let safeWait=ttlSeconds-resolveBufferSeconds(settings?.safetyBufferSeconds);return safeWait>=1?safeWait:void 0}var PROMPT_STARTED_REASON="a prompt started composing its turn before the prefix was built",MAX_COMPOSITION_PASSES=2,CANCELLED=Symbol("prompt-cache-prefix-cancelled"),PromptCachePrefixBuilds=class{#inFlight=new Set;async build(sources,options={}){let controller=new AbortController,signal=options.signal===void 0?controller.signal:AbortSignal.any([options.signal,controller.signal]);this.#inFlight.add(controller);try{return await buildPromptCachePrefixRequest(sources,signal)}finally{this.#inFlight.delete(controller)}}cancelAll(){for(let controller of this.#inFlight)controller.abort(PROMPT_STARTED_REASON);this.#inFlight.clear()}};async function buildPromptCachePrefixRequest(sources,signal){if(await untilAborted2(sources.ready,signal)===CANCELLED)return cancelled(signal);let unsafe=sources.runner.getPreviewUnsafeBeforeAgentStartPaths();if(unsafe.length>0)return skipped(`before_agent_start handlers not registered previewSafe: ${unsafe.join(", ")}`);let systemPrompt=await untilAborted2(composeTurnSystemPrompt(sources,signal),signal);if(systemPrompt===CANCELLED)return cancelled(signal);let{agent,runner}=sources,state=agent.state,model=state.model;if(model===void 0)return skipped("no model selected");let options={},reasoning=loopReasoning(state.reasoningBaseline,state.thinkingLevel);reasoning!==void 0&&(options.reasoning=reasoning),state.thinkingSelection!==void 0&&(options.thinkingSelection=state.thinkingSelection),agent.thinkingBudgets!==void 0&&(options.thinkingBudgets=agent.thinkingBudgets),agent.sessionId!==void 0&&(options.sessionId=agent.sessionId);let serviceTier=sources.getServiceTier();serviceTier!==void 0&&(options.serviceTier=serviceTier),agent.onPayload!==void 0&&(options.onPayload=agent.onPayload),runner.hasHandlers("before_provider_headers")&&(options.transformHeaders=async headers=>await runner.emitBeforeProviderHeaders(headers));let prepared=await untilAborted2(sources.modelRuntime.prepareSimpleRequest(model,options),signal);if(prepared===CANCELLED)return cancelled(signal);let transcript=await buildProviderContext({systemPrompt,messages:[],tools:state.tools.slice(),...state.declaredTools!==void 0?{declaredTools:state.declaredTools.slice()}:{}},{convertToLlm:()=>[],model});return signal.aborted?cancelled(signal):{status:"ready",request:{model:prepared.model,context:toPrefixContext(transcript),options:prepared.options}}}function toPrefixContext(transcript){return{systemPrompt:getCurrentSystemPrompt(transcript.messages),messages:transcript.messages.filter(message=>message.role!=="system"),tools:getCurrentTools(transcript.messages),...transcript.activeToolNames===void 0?{}:{activeToolNames:transcript.activeToolNames}}}async function composeTurnSystemPrompt(sources,signal){let systemPrompt=sources.getBaseSystemPrompt();for(let pass=0;pass<MAX_COMPOSITION_PASSES&&!signal.aborted;pass+=1){let base=sources.getBaseSystemPrompt();if(systemPrompt=(await sources.runner.emitBeforeAgentStart("",void 0,base,sources.getBaseSystemPromptOptions(),{preview:!0,signal}))?.systemPrompt??base,sources.getBaseSystemPrompt()===base)break}return systemPrompt}async function untilAborted2(work,signal){if(signal.aborted)return CANCELLED;let onAbort,aborted=new Promise(resolve45=>{onAbort=()=>resolve45(CANCELLED),signal.addEventListener("abort",onAbort,{once:!0})});try{return await Promise.race([work,aborted])}finally{onAbort!==void 0&&signal.removeEventListener("abort",onAbort)}}function skipped(reason){return{status:"skipped",reason}}function cancelled(signal){return skipped(typeof signal.reason=="string"?signal.reason:"prefix build cancelled")}function loopReasoning(baseline,thinkingLevel){let level=baseline!==void 0&&isValidThinkingLevel(baseline)?baseline:thinkingLevel;return level==="off"?void 0:level}function reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs){if(!(streamRetryTimeoutMs===void 0||streamRetryTimeoutMs<=0))return streamStartTimeoutMs===void 0?streamRetryTimeoutMs:Math.max(streamRetryTimeoutMs,Math.ceil(streamStartTimeoutMs*1.1))}function createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs,timeoutMs,streamStartTimeoutMs}){return isProviderTimeoutError(message)?{options:{deferQueuedMessages:!0,...timeoutMs===void 0?{}:{timeoutMs},...streamStartTimeoutMs===void 0?{}:{streamStartTimeoutMs}},watchdogTimeoutMs:reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs)}:{options:{},watchdogTimeoutMs:void 0}}async function runBoundedRetryContinuation({continueRun,getActiveSignal,abortActive,timeoutMs}){let continuation=continueRun(),ownedSignal=getActiveSignal();if(timeoutMs===void 0||ownedSignal===void 0){await continuation;return}let timer=setTimeout(()=>{getActiveSignal()===ownedSignal&&abortActive()},timeoutMs);try{await continuation}finally{clearTimeout(timer)}}async function checkSessionReloadVeto(runner,isPromptStartPending){if(isPromptStartPending())return{cancelled:!0,reason:"A prompt is being admitted."};let result3=runner.hasHandlers("session_before_reload")?await runner.emit({type:"session_before_reload"}):void 0;return isPromptStartPending()?{cancelled:!0,reason:"A prompt is being admitted."}:result3?.cancel!==!0?{cancelled:!1}:result3.reason===void 0?{cancelled:!0}:{cancelled:!0,reason:result3.reason}}function isHealthExhaustionFailure(errorMessage8){return isBillingErrorMessage(errorMessage8)||isQuotaExhaustionMessage(errorMessage8)}var CircuitProbes=class{constructor(circuits){this.circuits=circuits}isOpen(selector){return this.circuits?.isOpen(selector)??!1}governs(selector){return this.circuits?.governs(selector)??!1}admit(selector){let admission=this.circuits?.admit(selector)??{kind:"closed"};return admission.kind==="probe"&&this.token?.selector!==selector&&(this.release(),this.token=admission.token),admission.kind}holds(selector){return this.token?.selector===selector}get probing(){return this.token?.selector}noteFailure(selector,failure2){this.circuits?.noteFailure(selector,failure2),this.token?.selector===selector&&(this.token=void 0)}accept(selector){this.circuits?.close(selector),this.token?.selector===selector&&(this.token=void 0)}release(){this.token&&this.circuits?.release(this.token),this.token=void 0}releaseAll(){this.token=void 0,this.circuits?.releaseAll()}};function firstUsableCandidate(entries,current,filters){let isSpent=filters.isProviderSpent;if(!isSpent)return scanCandidates(entries,current,filters,()=>!1);let avoided=!1,elsewhere=scanCandidates(entries,current,filters,provider=>{let spent=isSpent(provider);return avoided||=spent,spent});return elsewhere||!avoided?elsewhere:scanCandidates(entries,current,filters,()=>!1)}function scanCandidates(entries,current,filters,avoidProvider){let probe;for(let raw of candidatesAfter(entries,formatSelector(current.model,current.thinkingLevel))){let selector=parseFallbackSelector(raw,filters.registry);if(!selector){filters.skip(raw,"unknown");continue}if(selector.provider===current.model.provider&&selector.id===current.model.id){filters.skip(raw,"self");continue}if(avoidProvider(selector.provider)){filters.skip(raw,"account-limit");continue}let base=baseSelector(selector);if(filters.tried.has(base)){filters.skip(raw,"tried");continue}if(filters.isSuppressed(base)){filters.skip(raw,"suppressed");continue}if(!filters.isAuthAvailable(selector.provider)){filters.skip(raw,"unauthenticated");continue}let model=filters.registry.find(selector.provider,selector.id);if(!model){filters.skip(raw,"unknown");continue}if(filters.isCircuitOpen(base)){filters.skip(raw,"circuit-open"),probe??={selector,model,circuitOpen:!0};continue}return{selector,model,circuitOpen:!1}}return probe}function pinAfterSwitch(prior,switch_){let originalSelector=prior?.originalSelector??switch_.from,billingHitsOriginal=switch_.reason==="billing"&&(switch_.from===originalSelector||switch_.limit==="account"&&originalSelector.startsWith(`${switch_.fromProvider}/`)),pinnedByRefusal=prior?.pinnedByRefusal===!0||switch_.reason==="refusal",pinnedByBilling=prior?.pinnedByBilling===!0||billingHitsOriginal;return{originalSelector,pinnedByRefusal,pinnedByBilling,pinned:pinnedByRefusal||pinnedByBilling}}var UnusableEntries=class{constructor(cooldowns){this.cooldowns=cooldowns}note(model,failure2){let scope=usageLimitScope(failure2.errorMessage);scope==="account"?this.cooldowns.note(accountKey(model.provider),failure2):(scope==="model"||isHealthExhaustionFailure(failure2.errorMessage))&&this.cooldowns.note(entryKey(model),failure2)}isProviderSpent(provider){return this.cooldowns.isSuppressed(accountKey(provider))}isUnusable(model){return this.isProviderSpent(model.provider)||this.cooldowns.isSuppressed(entryKey(model))}clear(model){this.cooldowns.clear(accountKey(model.provider)),this.cooldowns.clear(entryKey(model))}};function accountKey(provider){return`account:${provider}`}function entryKey(model){return`exhausted:${formatSelector(model)}`}var RetryFallbackController=class{constructor(deps){this.triedSelectors=new Set,this.deps=deps,this.probes=new CircuitProbes(deps.circuits),this.unusable=new UnusableEntries(deps.cooldowns)}get activeState(){return this.state}get exhaustedChainKey(){return this.lastExhaustedChainKey}resetTurn(){this.triedSelectors.clear(),this.lastExhaustedChainKey=void 0}clear(){this.state=void 0,this.canonicalCache=void 0,this.resetTurn()}canonicalChains(){let chains=this.deps.getSettings().chains,key=JSON.stringify(chains);if(this.canonicalCache?.key===key)return this.canonicalCache.chains;let canonical=canonicalizeFallbackChains(chains,this.deps.registry);return this.canonicalCache={key,chains:canonical},canonical}canTryFallback(){return this.nextCandidate(!1)!==void 0}hasConfiguredChain(){let current=this.deps.getCurrentSelector();if(!current)return!1;let chains=this.canonicalChains();return resolveChainKey(current.model,current.thinkingLevel,chains)!==void 0}async maybeRestorePrimary(revertPolicy){let state=this.state,current=this.deps.getCurrentSelector();if(!state||state.pinned||!current)return!1;let selector=parseFallbackSelector(state.originalSelector,this.deps.registry);if(!selector||!this.deps.isAuthAvailable(selector.provider))return!1;let model=this.deps.registry.find(selector.provider,selector.id);if(!model)return!1;let stranded=this.unusable.isUnusable(current.model)&&!this.unusable.isUnusable(model);if(!stranded&&!this.originalRecovered(state.originalSelector,revertPolicy))return!1;let thinking=current.thinkingLevel===state.lastAppliedThinkingLevel?state.originalThinkingLevel??current.thinkingLevel??"off":current.thinkingLevel??"off";await this.switchOrRelease(model,thinking,"fallback-revert");let from=formatSelector(current.model);this.state=void 0;let cause=stranded?{cause:"fallback-unusable"}:{},trigger=stranded?{trigger:"fallback-unusable"}:{};return this.deps.logger.info("fallback_reverted",{from,to:state.originalSelector,...trigger}),this.deps.emit({type:"retry_fallback_reverted",from,to:state.originalSelector,...cause}),!0}originalRecovered(originalSelector,revertPolicy){return revertPolicy!=="cooldown-expiry"?!1:!(this.probes.governs(originalSelector)?this.probes.isOpen(originalSelector):this.deps.cooldowns.isSuppressed(originalSelector))&&this.probes.admit(originalSelector)!=="open"}noteManualThinkingLevel(){this.state&&(this.state.lastAppliedThinkingLevel=void 0)}notifyCompactionApplied(){let state=this.state;if(!state)return!1;state.pinnedByRefusal=!1;let wasPinned=state.pinned;return state.pinned=state.pinnedByBilling,!wasPinned||state.pinned?!1:(this.deps.logger.info("refusal_pin_released",{chainKey:state.chainKey,originalSelector:state.originalSelector,trigger:"compaction"}),!0)}clearForManualModelChange(model){this.state&&this.deps.logger.info("fallback_cleared_manual",{selector:formatSelector(model)}),this.state=void 0,this.deps.cooldowns.clear(formatSelector(model)),this.unusable.clear(model),this.probes.release(),this.deps.circuits?.close(formatSelector(model))}noteHealthFailure(model,thinkingLevel,failure2){this.managedChainKey({model,thinkingLevel})&&(this.unusable.note(model,failure2),this.probes.noteFailure(formatSelector(model),failure2))}async rerouteAroundOpenCircuit(){let current=this.deps.getCurrentSelector();if(!this.deps.circuits||!current)return!1;let currentBase=formatSelector(current.model);if(this.probes.admit(currentBase)!=="open")return!1;let candidate=this.nextCandidate(!1,!0);return!candidate||candidate.circuitOpen?!1:(this.deps.logger.info("circuit_open_skip",{selector:currentBase}),await this.applyCandidate(current,candidate,"transient"),!0)}async tryFallback(reason,failure2){let current=this.deps.getCurrentSelector();current&&reason==="transient"&&this.noteHealthFailure(current.model,current.thinkingLevel,failure2);let limit=usageLimitScope(failure2.errorMessage);current&&this.unusable.note(current.model,failure2);let candidate=this.nextCandidate(!1,!0);if(!current||!candidate)return!1;let currentBase=formatSelector(current.model);return(reason==="transient"||reason==="hard-error"||reason==="billing")&&(this.deps.cooldowns.note(currentBase,failure2),this.deps.logger.info("cooldown_noted",{selector:currentBase,errorMessage:failure2.errorMessage})),await this.applyCandidate(current,candidate,reason,limit),!0}async applyCandidate(current,candidate,reason,limit){let thinking=this.selectThinking(candidate.selector,candidate.model,current.thinkingLevel);this.probes.admit(baseSelector(candidate.selector)),await this.switchOrRelease(candidate.model,thinking,"fallback"),this.triedSelectors.add(baseSelector(candidate.selector));let from=formatSelector(current.model),to=formatSelector(candidate.model),prior=this.state;this.state={chainKey:candidate.chainKey,originalThinkingLevel:prior?.originalThinkingLevel??current.thinkingLevel,lastAppliedThinkingLevel:thinking,...pinAfterSwitch(prior,{from,fromProvider:current.model.provider,reason,limit})};let scope=limit===void 0?{}:{limit};this.deps.logger.info("fallback_applied",{from,to,chainKey:candidate.chainKey,reason,...scope}),this.deps.emit({type:"retry_fallback_applied",from,to,chainKey:candidate.chainKey,reason,...scope})}managedChainKey(current){if(!this.deps.getSettings().modelFallback)return;let chains=this.canonicalChains(),chainKey=resolveChainKey(current.model,current.thinkingLevel,chains)??this.state?.chainKey;return chainKey&&chains[chainKey]?chainKey:void 0}nextCandidate(reserve=!0,logDecision=reserve){let current=this.deps.getCurrentSelector();if(!this.deps.getSettings().modelFallback||!current)return;let chainKey=this.managedChainKey(current),entries=chainKey?this.canonicalChains()[chainKey]:void 0;if(!chainKey||!entries){logDecision&&this.deps.logger.debug("no_chain",{selector:formatSelector(current.model)});return}let candidate=firstUsableCandidate(entries,current,{registry:this.deps.registry,tried:this.triedSelectors,isSuppressed:base=>this.deps.cooldowns.isSuppressed(base),isAuthAvailable:provider=>this.deps.isAuthAvailable(provider),isCircuitOpen:base=>this.deps.circuits?.isOpen(base)??!1,isProviderSpent:provider=>this.unusable.isProviderSpent(provider),skip:(raw,skipReason)=>this.skip(raw,skipReason)});if(candidate)return reserve&&this.triedSelectors.add(baseSelector(candidate.selector)),{chainKey,...candidate};this.lastExhaustedChainKey=chainKey,logDecision&&this.deps.logger.info("candidates_exhausted",{chainKey})}async switchOrRelease(model,thinking,reason){try{await this.deps.switchModel(model,thinking,reason)}catch(error2){throw this.probes.release(),error2}}selectThinking(selector,model,inherited){let requested=selector.thinkingLevel??inherited??"off";return clampThinkingLevel(model,requested)}skip(candidate,skipReason){this.deps.logger.debug("candidate_skipped",{candidate,skipReason})}};var SelectorCooldowns=class{constructor(now2,random=Math.random){this.expiresAtBySelector=new Map,this.now=now2,this.random=random}note(baseSelector2,failure2){this.expiresAtBySelector.set(baseSelector2,this.now()+this.durationFor(failure2))}isSuppressed(baseSelector2){let expiresAt=this.expiresAtBySelector.get(baseSelector2);return expiresAt===void 0?!1:this.now()<expiresAt?!0:(this.expiresAtBySelector.delete(baseSelector2),!1)}clear(baseSelector2){this.expiresAtBySelector.delete(baseSelector2)}clearAll(){this.expiresAtBySelector.clear()}durationFor({retryAfterMs:retryAfterMs3,errorMessage:errorMessage8}){if(retryAfterMs3!==void 0&&Number.isFinite(retryAfterMs3)&&retryAfterMs3>0)return retryAfterMs3;let message=stripProviderRequestIds(errorMessage8??"").toLowerCase();return/usage[- ]limit|quota|insufficient_quota|billing|credits[-_ ]required|credits are required/.test(message)?30*6e4:/rate[ -]?limit|429|too many requests/.test(message)?3e4:/overloaded|capacity/.test(message)?45e3+this.capacityJitterMs():/5xx|\b5\d\d\b|server|internal error/.test(message)?2e4:/"type"\s*:\s*"forbidden"[^}]*request not allowed|request not allowed[^}]*"type"\s*:\s*"forbidden"/.test(message)||/timed? out|timeout|econnreset|econnrefused|etimedout|socket hang up|socket connection was closed|network.?error|connection.?error|connection.?refused|connection.?lost|other side closed|fetch failed|getaddrinfo|enotfound|eai_again|upstream.?connect|reset before headers|terminated|websocket.?closed|websocket.?error|ended without|stream ended before message_stop|stream ended before a terminal response event|http2 request did not get a response/.test(message)?6e4:5*6e4}capacityJitterMs(){return Math.round(Math.min(1,Math.max(0,this.random()))*3e4)}};function classifyRateLimitedWait(hintMs,settings){return hintMs===void 0?"no-hint-fast-fallback":hintMs<=settings.hintedWaitCapMs?"tier1-in-turn":hintMs<settings.probeBackMaxMs?"tier2-fallback-probe-back":"tier3-fallback-only"}function probeBackSchedule(hintMs,nowMs){return{firstAtMs:nowMs+Math.ceil(hintMs/2),deadlineMs:nowMs+hintMs}}function nextInTurnDelayMs(state,hintMs,baseDelayMs,hintedWaitCapMs,nowMs){let exponentialFloorMs=baseDelayMs*2**(state.attempt-1);if(state.probePhase==="half-used"){let deadlineMs=hintMs!==void 0?nowMs+hintMs:state.hintDeadlineMs??nowMs,remaining=Math.max(0,deadlineMs-nowMs),delayMs=Math.max(remaining,exponentialFloorMs),newCumulative=state.cumulativeHintedWaitMs+delayMs;return{delayMs,probePhase:"done",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}if(state.probePhase==="idle"&&hintMs!==void 0){let delay4=Math.max(Math.ceil(hintMs/2),exponentialFloorMs),deadlineMs=nowMs+hintMs,newCumulative=state.cumulativeHintedWaitMs+delay4;return{delayMs:delay4,probePhase:"half-used",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}return{delayMs:Math.max(hintMs??0,exponentialFloorMs),probePhase:"done",hintDeadlineMs:state.hintDeadlineMs,cumulativeHintedWaitMs:state.cumulativeHintedWaitMs,demoteToProbeBack:!1}}function degradeWithoutFallback(tier,hintMs,attempt2,baseDelayMs,hintedWaitCapMs){return tier==="tier3-fallback-only"?{kind:"fail",hintMs:hintMs??0}:tier==="tier2-fallback-probe-back"?{kind:"in-turn",delayMs:Math.max(Math.min(hintMs??hintedWaitCapMs,hintedWaitCapMs),baseDelayMs*2**(attempt2-1))}:{kind:"in-turn",delayMs:baseDelayMs*2**(attempt2-1)}}import{chmodSync as chmodSync12,closeSync as closeSync6,mkdirSync as mkdirSync25,openSync as openSync6,renameSync as renameSync19,rmSync as rmSync16,statSync as statSync25,writeSync as writeSync4}from"node:fs";import{dirname as dirname48,join as join85}from"node:path";var DEFAULT_MAX_BYTES8=5*1024*1024,MAX_STRING_LENGTH2=200,BLOCKED_KEY2=/^(?:__proto__|constructor|prototype|headers?|env(?:ironment)?|authorization|credential(?:s)?|password|secret|token|api_?key|client_?secret)$/i,ALLOWED_DATA_KEY2=/^(?:selector|candidate|currentSelector|originalSelector|from|to|model|chainKey|reason|skipReason|classification|thinkingLevel|durationMs|retryAfterMs|error|errorMessage|warning|trigger)$/,SENSITIVE_TEXT3=/((?:authorization\s*[:=]\s*(?:bearer|basic)\s+)|(?:bearer\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\s&,"'}\]]+/gi;function createFallbackLogger(agentDir,options={}){let filePath=join85(agentDir,"logs","fallback.log"),maxBytes=validMaxBytes4(options.maxBytes),reportedWriteFailure2=!1;function log(level,event,data){try{let line=formatLine3(level,event,data);writeLine4(filePath,line,maxBytes)}catch(error2){reportedWriteFailure2||(reportedWriteFailure2=!0,console.error("Unable to write retry fallback debug log",error2))}}return{debug:(event,data)=>log("debug",event,data),info:(event,data)=>log("info",event,data),warn:(event,data)=>log("warn",event,data)}}function validMaxBytes4(value2){return typeof value2=="number"&&Number.isFinite(value2)&&value2>0?Math.floor(value2):DEFAULT_MAX_BYTES8}function formatLine3(level,event,data){let entry={ts:new Date().toISOString(),level,event:safeText3(event)};if(data!==void 0){for(let[key,value2]of safeEntries(data))if(ALLOWED_DATA_KEY2.test(key)&&!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(value2,new WeakSet);safeValue!==void 0&&(entry[key]=safeValue)}}return JSON.stringify(entry)}function writeLine4(filePath,line,maxBytes){mkdirSync25(dirname48(filePath),{recursive:!0,mode:448});let text2=`${line}
|
|
2546
|
+
`)}var NestedToolCallRunner=class{constructor(host){this.scopes=new Map,this.queueTail=Promise.resolve(),this.host=host}async execute(callerId,name,args,options={}){let scope=this.scopes.get(callerId);scope||(scope={recorder:new NestedCallRecorder,nextId:1,holdsQueue:!1},this.scopes.set(callerId,scope));let toolCall={type:"toolCall",id:`${callerId}/${scope.nextId++}`,name,arguments:args??{}},record7=scope.recorder.start(toolCall);await this.host.emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:name,args:toolCall.arguments,parentToolCallId:callerId});let exclusive=!scope.holdsQueue&&(this.host.isSequential()||this.host.getTools().find(tool=>tool.name===name)?.executionMode==="sequential"),release4;if(exclusive){let previous=this.queueTail;this.queueTail=new Promise(resolve45=>{release4=resolve45}),await previous}this.scopes.set(toolCall.id,{recorder:scope.recorder,nextId:1,holdsQueue:scope.holdsQueue||exclusive});let outcome;try{outcome=await this.host.runToolCall(toolCall,callerId,options.signal,async partialResult=>{options.onUpdate?.(partialResult),await this.host.emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:name,args:toolCall.arguments,partialResult,parentToolCallId:callerId})})}finally{this.scopes.delete(toolCall.id),release4?.()}return scope.recorder.finish(record7,outcome.isError,textOf(outcome.result)),outcome.result.usage&&scope.recorder.addUsage(outcome.result.usage),await this.host.emit({type:"tool_execution_end",toolCallId:toolCall.id,toolName:name,result:outcome.result,isError:outcome.isError,parentToolCallId:callerId}),outcome}takeRecord(toolCallId){let scope=this.scopes.get(toolCallId);if(this.scopes.delete(toolCallId),!!scope)return{calls:scope.recorder.snapshot(),usage:scope.recorder.totalUsage}}clear(){this.scopes.clear()}};var DEFAULT_PROMPT_CACHE_SAFETY_BUFFER_SECONDS=30,PROMPT_CACHE_SAFE_WAIT_ENV="PI_PROMPT_CACHE_SAFE_WAIT_SECONDS";function toProviderEnv2(env){let resolved={};for(let[key,value2]of Object.entries(env))value2!==void 0&&(resolved[key]=value2);return resolved}function resolveBufferSeconds(configured){return configured===void 0||!Number.isFinite(configured)||configured<0?DEFAULT_PROMPT_CACHE_SAFETY_BUFFER_SECONDS:Math.trunc(configured)}function resolvePromptCacheSafeWaitSeconds(model,settings,env){if(settings?.cacheAwareTimeouts===!1||!model)return;let ttlSeconds=resolvePromptCacheTtlSeconds(model,toProviderEnv2(env));if(ttlSeconds===void 0)return;let safeWait=ttlSeconds-resolveBufferSeconds(settings?.safetyBufferSeconds);return safeWait>=1?safeWait:void 0}var PROMPT_STARTED_REASON="a prompt started composing its turn before the prefix was built",MAX_COMPOSITION_PASSES=2,CANCELLED=Symbol("prompt-cache-prefix-cancelled"),PromptCachePrefixBuilds=class{#inFlight=new Set;async build(sources,options={}){let controller=new AbortController,signal=options.signal===void 0?controller.signal:AbortSignal.any([options.signal,controller.signal]);this.#inFlight.add(controller);try{return await buildPromptCachePrefixRequest(sources,signal)}finally{this.#inFlight.delete(controller)}}cancelAll(){for(let controller of this.#inFlight)controller.abort(PROMPT_STARTED_REASON);this.#inFlight.clear()}};async function buildPromptCachePrefixRequest(sources,signal){if(await untilAborted2(sources.ready,signal)===CANCELLED)return cancelled(signal);let unsafe=sources.runner.getPreviewUnsafeBeforeAgentStartPaths();if(unsafe.length>0)return skipped(`before_agent_start handlers not registered previewSafe: ${unsafe.join(", ")}`);let systemPrompt=await untilAborted2(composeTurnSystemPrompt(sources,signal),signal);if(systemPrompt===CANCELLED)return cancelled(signal);let{agent,runner}=sources,state=agent.state,model=state.model;if(model===void 0)return skipped("no model selected");let options={},reasoning=loopReasoning(state.reasoningBaseline,state.thinkingLevel);reasoning!==void 0&&(options.reasoning=reasoning),state.thinkingSelection!==void 0&&(options.thinkingSelection=state.thinkingSelection),agent.thinkingBudgets!==void 0&&(options.thinkingBudgets=agent.thinkingBudgets),agent.sessionId!==void 0&&(options.sessionId=agent.sessionId);let serviceTier=sources.getServiceTier();serviceTier!==void 0&&(options.serviceTier=serviceTier),agent.onPayload!==void 0&&(options.onPayload=agent.onPayload),runner.hasHandlers("before_provider_headers")&&(options.transformHeaders=async headers=>await runner.emitBeforeProviderHeaders(headers));let prepared=await untilAborted2(sources.modelRuntime.prepareSimpleRequest(model,options),signal);if(prepared===CANCELLED)return cancelled(signal);let transcript=await buildProviderContext({systemPrompt,messages:[],tools:state.tools.slice(),...state.declaredTools!==void 0?{declaredTools:state.declaredTools.slice()}:{}},{convertToLlm:()=>[],model});return signal.aborted?cancelled(signal):{status:"ready",request:{model:prepared.model,context:toPrefixContext(transcript),options:prepared.options}}}function toPrefixContext(transcript){return{systemPrompt:getCurrentSystemPrompt(transcript.messages),messages:transcript.messages.filter(message=>message.role!=="system"),tools:getCurrentTools(transcript.messages),...transcript.activeToolNames===void 0?{}:{activeToolNames:transcript.activeToolNames}}}async function composeTurnSystemPrompt(sources,signal){let systemPrompt=sources.getBaseSystemPrompt();for(let pass=0;pass<MAX_COMPOSITION_PASSES&&!signal.aborted;pass+=1){let base=sources.getBaseSystemPrompt();if(systemPrompt=(await sources.runner.emitBeforeAgentStart("",void 0,base,sources.getBaseSystemPromptOptions(),{preview:!0,signal}))?.systemPrompt??base,sources.getBaseSystemPrompt()===base)break}return systemPrompt}async function untilAborted2(work,signal){if(signal.aborted)return CANCELLED;let onAbort,aborted=new Promise(resolve45=>{onAbort=()=>resolve45(CANCELLED),signal.addEventListener("abort",onAbort,{once:!0})});try{return await Promise.race([work,aborted])}finally{onAbort!==void 0&&signal.removeEventListener("abort",onAbort)}}function skipped(reason){return{status:"skipped",reason}}function cancelled(signal){return skipped(typeof signal.reason=="string"?signal.reason:"prefix build cancelled")}function loopReasoning(baseline,thinkingLevel){let level=baseline!==void 0&&isValidThinkingLevel(baseline)?baseline:thinkingLevel;return level==="off"?void 0:level}function reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs){if(!(streamRetryTimeoutMs===void 0||streamRetryTimeoutMs<=0))return streamStartTimeoutMs===void 0?streamRetryTimeoutMs:Math.max(streamRetryTimeoutMs,Math.ceil(streamStartTimeoutMs*1.1))}function createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs,timeoutMs,streamStartTimeoutMs}){return isProviderTimeoutError(message)?{options:{deferQueuedMessages:!0,...timeoutMs===void 0?{}:{timeoutMs},...streamStartTimeoutMs===void 0?{}:{streamStartTimeoutMs}},watchdogTimeoutMs:reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs)}:{options:{},watchdogTimeoutMs:void 0}}async function runBoundedRetryContinuation({continueRun,getActiveSignal,abortActive,timeoutMs,onStreamStarted}){let streamStarted=!1,timer,unsubscribe=timeoutMs===void 0?void 0:onStreamStarted?.(()=>{streamStarted=!0,clearTimeout(timer)});try{let continuation=continueRun(),ownedSignal=getActiveSignal();if(timeoutMs===void 0||ownedSignal===void 0||streamStarted){await continuation;return}timer=setTimeout(()=>{!streamStarted&&getActiveSignal()===ownedSignal&&abortActive()},timeoutMs),await continuation}finally{clearTimeout(timer),unsubscribe?.()}}async function checkSessionReloadVeto(runner,isPromptStartPending,isSessionStartDispatching=()=>!1){if(isPromptStartPending())return{cancelled:!0,reason:"A prompt is being admitted."};if(isSessionStartDispatching())return{cancelled:!0,reason:"A session is starting."};let result3=runner.hasHandlers("session_before_reload")?await runner.emit({type:"session_before_reload"}):void 0;return isPromptStartPending()?{cancelled:!0,reason:"A prompt is being admitted."}:isSessionStartDispatching()?{cancelled:!0,reason:"A session is starting."}:result3?.cancel!==!0?{cancelled:!1}:result3.reason===void 0?{cancelled:!0}:{cancelled:!0,reason:result3.reason}}function isHealthExhaustionFailure(errorMessage8){return isBillingErrorMessage(errorMessage8)||isQuotaExhaustionMessage(errorMessage8)}var CircuitProbes=class{constructor(circuits){this.circuits=circuits}isOpen(selector){return this.circuits?.isOpen(selector)??!1}governs(selector){return this.circuits?.governs(selector)??!1}admit(selector){let admission=this.circuits?.admit(selector)??{kind:"closed"};return admission.kind==="probe"&&this.token?.selector!==selector&&(this.release(),this.token=admission.token),admission.kind}holds(selector){return this.token?.selector===selector}get probing(){return this.token?.selector}noteFailure(selector,failure2){this.circuits?.noteFailure(selector,failure2),this.token?.selector===selector&&(this.token=void 0)}accept(selector){this.circuits?.close(selector),this.token?.selector===selector&&(this.token=void 0)}release(){this.token&&this.circuits?.release(this.token),this.token=void 0}releaseAll(){this.token=void 0,this.circuits?.releaseAll()}};function firstUsableCandidate(entries,current,filters){let isSpent=filters.isProviderSpent;if(!isSpent)return scanCandidates(entries,current,filters,()=>!1);let avoided=!1,elsewhere=scanCandidates(entries,current,filters,provider=>{let spent=isSpent(provider);return avoided||=spent,spent});return elsewhere||!avoided?elsewhere:scanCandidates(entries,current,filters,()=>!1)}function scanCandidates(entries,current,filters,avoidProvider){let probe;for(let raw of candidatesAfter(entries,formatSelector(current.model,current.thinkingLevel))){let selector=parseFallbackSelector(raw,filters.registry);if(!selector){filters.skip(raw,"unknown");continue}if(selector.provider===current.model.provider&&selector.id===current.model.id){filters.skip(raw,"self");continue}if(avoidProvider(selector.provider)){filters.skip(raw,"account-limit");continue}let base=baseSelector(selector);if(filters.tried.has(base)){filters.skip(raw,"tried");continue}if(filters.isSuppressed(base)){filters.skip(raw,"suppressed");continue}if(!filters.isAuthAvailable(selector.provider)){filters.skip(raw,"unauthenticated");continue}let model=filters.registry.find(selector.provider,selector.id);if(!model){filters.skip(raw,"unknown");continue}if(filters.isCircuitOpen(base)){filters.skip(raw,"circuit-open"),probe??={selector,model,circuitOpen:!0};continue}return{selector,model,circuitOpen:!1}}return probe}function pinAfterSwitch(prior,switch_){let originalSelector=prior?.originalSelector??switch_.from,billingHitsOriginal=switch_.reason==="billing"&&(switch_.from===originalSelector||switch_.limit==="account"&&originalSelector.startsWith(`${switch_.fromProvider}/`)),pinnedByRefusal=prior?.pinnedByRefusal===!0||switch_.reason==="refusal",pinnedByBilling=prior?.pinnedByBilling===!0||billingHitsOriginal;return{originalSelector,pinnedByRefusal,pinnedByBilling,pinned:pinnedByRefusal||pinnedByBilling}}var UnusableEntries=class{constructor(cooldowns){this.cooldowns=cooldowns}note(model,failure2){let scope=usageLimitScope(failure2.errorMessage);scope==="account"?this.cooldowns.note(accountKey(model.provider),failure2):(scope==="model"||isHealthExhaustionFailure(failure2.errorMessage))&&this.cooldowns.note(entryKey(model),failure2)}isProviderSpent(provider){return this.cooldowns.isSuppressed(accountKey(provider))}isUnusable(model){return this.isProviderSpent(model.provider)||this.cooldowns.isSuppressed(entryKey(model))}clear(model){this.cooldowns.clear(accountKey(model.provider)),this.cooldowns.clear(entryKey(model))}};function accountKey(provider){return`account:${provider}`}function entryKey(model){return`exhausted:${formatSelector(model)}`}var RetryFallbackController=class{constructor(deps){this.triedSelectors=new Set,this.deps=deps,this.probes=new CircuitProbes(deps.circuits),this.unusable=new UnusableEntries(deps.cooldowns)}get activeState(){return this.state}get exhaustedChainKey(){return this.lastExhaustedChainKey}resetTurn(){this.triedSelectors.clear(),this.lastExhaustedChainKey=void 0}clear(){this.state=void 0,this.canonicalCache=void 0,this.resetTurn()}canonicalChains(){let chains=this.deps.getSettings().chains,key=JSON.stringify(chains);if(this.canonicalCache?.key===key)return this.canonicalCache.chains;let canonical=canonicalizeFallbackChains(chains,this.deps.registry);return this.canonicalCache={key,chains:canonical},canonical}canTryFallback(){return this.nextCandidate(!1)!==void 0}hasConfiguredChain(){let current=this.deps.getCurrentSelector();if(!current)return!1;let chains=this.canonicalChains();return resolveChainKey(current.model,current.thinkingLevel,chains)!==void 0}async maybeRestorePrimary(revertPolicy){let state=this.state,current=this.deps.getCurrentSelector();if(!state||state.pinned||!current)return!1;let selector=parseFallbackSelector(state.originalSelector,this.deps.registry);if(!selector||!this.deps.isAuthAvailable(selector.provider))return!1;let model=this.deps.registry.find(selector.provider,selector.id);if(!model)return!1;let stranded=this.unusable.isUnusable(current.model)&&!this.unusable.isUnusable(model);if(!stranded&&!this.originalRecovered(state.originalSelector,revertPolicy))return!1;let thinking=current.thinkingLevel===state.lastAppliedThinkingLevel?state.originalThinkingLevel??current.thinkingLevel??"off":current.thinkingLevel??"off";await this.switchOrRelease(model,thinking,"fallback-revert");let from=formatSelector(current.model);this.state=void 0;let cause=stranded?{cause:"fallback-unusable"}:{},trigger=stranded?{trigger:"fallback-unusable"}:{};return this.deps.logger.info("fallback_reverted",{from,to:state.originalSelector,...trigger}),this.deps.emit({type:"retry_fallback_reverted",from,to:state.originalSelector,...cause}),!0}originalRecovered(originalSelector,revertPolicy){return revertPolicy!=="cooldown-expiry"?!1:!(this.probes.governs(originalSelector)?this.probes.isOpen(originalSelector):this.deps.cooldowns.isSuppressed(originalSelector))&&this.probes.admit(originalSelector)!=="open"}noteManualThinkingLevel(){this.state&&(this.state.lastAppliedThinkingLevel=void 0)}notifyCompactionApplied(){let state=this.state;if(!state)return!1;state.pinnedByRefusal=!1;let wasPinned=state.pinned;return state.pinned=state.pinnedByBilling,!wasPinned||state.pinned?!1:(this.deps.logger.info("refusal_pin_released",{chainKey:state.chainKey,originalSelector:state.originalSelector,trigger:"compaction"}),!0)}clearForManualModelChange(model){this.state&&this.deps.logger.info("fallback_cleared_manual",{selector:formatSelector(model)}),this.state=void 0,this.deps.cooldowns.clear(formatSelector(model)),this.unusable.clear(model),this.probes.release(),this.deps.circuits?.close(formatSelector(model))}noteHealthFailure(model,thinkingLevel,failure2){this.managedChainKey({model,thinkingLevel})&&(this.unusable.note(model,failure2),this.probes.noteFailure(formatSelector(model),failure2))}async rerouteAroundOpenCircuit(){let current=this.deps.getCurrentSelector();if(!this.deps.circuits||!current)return!1;let currentBase=formatSelector(current.model);if(this.probes.admit(currentBase)!=="open")return!1;let candidate=this.nextCandidate(!1,!0);return!candidate||candidate.circuitOpen?!1:(this.deps.logger.info("circuit_open_skip",{selector:currentBase}),await this.applyCandidate(current,candidate,"transient"),!0)}async tryFallback(reason,failure2){let current=this.deps.getCurrentSelector();current&&reason==="transient"&&this.noteHealthFailure(current.model,current.thinkingLevel,failure2);let limit=usageLimitScope(failure2.errorMessage);current&&this.unusable.note(current.model,failure2);let candidate=this.nextCandidate(!1,!0);if(!current||!candidate)return!1;let currentBase=formatSelector(current.model);return(reason==="transient"||reason==="hard-error"||reason==="billing")&&(this.deps.cooldowns.note(currentBase,failure2),this.deps.logger.info("cooldown_noted",{selector:currentBase,errorMessage:failure2.errorMessage})),await this.applyCandidate(current,candidate,reason,limit),!0}async applyCandidate(current,candidate,reason,limit){let thinking=this.selectThinking(candidate.selector,candidate.model,current.thinkingLevel);this.probes.admit(baseSelector(candidate.selector)),await this.switchOrRelease(candidate.model,thinking,"fallback"),this.triedSelectors.add(baseSelector(candidate.selector));let from=formatSelector(current.model),to=formatSelector(candidate.model),prior=this.state;this.state={chainKey:candidate.chainKey,originalThinkingLevel:prior?.originalThinkingLevel??current.thinkingLevel,lastAppliedThinkingLevel:thinking,...pinAfterSwitch(prior,{from,fromProvider:current.model.provider,reason,limit})};let scope=limit===void 0?{}:{limit};this.deps.logger.info("fallback_applied",{from,to,chainKey:candidate.chainKey,reason,...scope}),this.deps.emit({type:"retry_fallback_applied",from,to,chainKey:candidate.chainKey,reason,...scope})}managedChainKey(current){if(!this.deps.getSettings().modelFallback)return;let chains=this.canonicalChains(),chainKey=resolveChainKey(current.model,current.thinkingLevel,chains)??this.state?.chainKey;return chainKey&&chains[chainKey]?chainKey:void 0}nextCandidate(reserve=!0,logDecision=reserve){let current=this.deps.getCurrentSelector();if(!this.deps.getSettings().modelFallback||!current)return;let chainKey=this.managedChainKey(current),entries=chainKey?this.canonicalChains()[chainKey]:void 0;if(!chainKey||!entries){logDecision&&this.deps.logger.debug("no_chain",{selector:formatSelector(current.model)});return}let candidate=firstUsableCandidate(entries,current,{registry:this.deps.registry,tried:this.triedSelectors,isSuppressed:base=>this.deps.cooldowns.isSuppressed(base),isAuthAvailable:provider=>this.deps.isAuthAvailable(provider),isCircuitOpen:base=>this.deps.circuits?.isOpen(base)??!1,isProviderSpent:provider=>this.unusable.isProviderSpent(provider),skip:(raw,skipReason)=>this.skip(raw,skipReason)});if(candidate)return reserve&&this.triedSelectors.add(baseSelector(candidate.selector)),{chainKey,...candidate};this.lastExhaustedChainKey=chainKey,logDecision&&this.deps.logger.info("candidates_exhausted",{chainKey})}async switchOrRelease(model,thinking,reason){try{await this.deps.switchModel(model,thinking,reason)}catch(error2){throw this.probes.release(),error2}}selectThinking(selector,model,inherited){let requested=selector.thinkingLevel??inherited??"off";return clampThinkingLevel(model,requested)}skip(candidate,skipReason){this.deps.logger.debug("candidate_skipped",{candidate,skipReason})}};var SelectorCooldowns=class{constructor(now2,random=Math.random){this.expiresAtBySelector=new Map,this.now=now2,this.random=random}note(baseSelector2,failure2){this.expiresAtBySelector.set(baseSelector2,this.now()+this.durationFor(failure2))}isSuppressed(baseSelector2){let expiresAt=this.expiresAtBySelector.get(baseSelector2);return expiresAt===void 0?!1:this.now()<expiresAt?!0:(this.expiresAtBySelector.delete(baseSelector2),!1)}clear(baseSelector2){this.expiresAtBySelector.delete(baseSelector2)}clearAll(){this.expiresAtBySelector.clear()}durationFor({retryAfterMs:retryAfterMs3,errorMessage:errorMessage8}){if(retryAfterMs3!==void 0&&Number.isFinite(retryAfterMs3)&&retryAfterMs3>0)return retryAfterMs3;let message=stripProviderRequestIds(errorMessage8??"").toLowerCase();return/usage[- ]limit|quota|insufficient_quota|billing|credits[-_ ]required|credits are required/.test(message)?30*6e4:/rate[ -]?limit|429|too many requests/.test(message)?3e4:/overloaded|capacity/.test(message)?45e3+this.capacityJitterMs():/5xx|\b5\d\d\b|server|internal error/.test(message)?2e4:/"type"\s*:\s*"forbidden"[^}]*request not allowed|request not allowed[^}]*"type"\s*:\s*"forbidden"/.test(message)||/timed? out|timeout|econnreset|econnrefused|etimedout|socket hang up|socket connection was closed|network.?error|connection.?error|connection.?refused|connection.?lost|other side closed|fetch failed|getaddrinfo|enotfound|eai_again|upstream.?connect|reset before headers|terminated|websocket.?closed|websocket.?error|ended without|stream ended before message_stop|stream ended before a terminal response event|http2 request did not get a response/.test(message)?6e4:5*6e4}capacityJitterMs(){return Math.round(Math.min(1,Math.max(0,this.random()))*3e4)}};function classifyRateLimitedWait(hintMs,settings){return hintMs===void 0?"no-hint-fast-fallback":hintMs<=settings.hintedWaitCapMs?"tier1-in-turn":hintMs<settings.probeBackMaxMs?"tier2-fallback-probe-back":"tier3-fallback-only"}function probeBackSchedule(hintMs,nowMs){return{firstAtMs:nowMs+Math.ceil(hintMs/2),deadlineMs:nowMs+hintMs}}function nextInTurnDelayMs(state,hintMs,baseDelayMs,hintedWaitCapMs,nowMs){let exponentialFloorMs=baseDelayMs*2**(state.attempt-1);if(state.probePhase==="half-used"){let deadlineMs=hintMs!==void 0?nowMs+hintMs:state.hintDeadlineMs??nowMs,remaining=Math.max(0,deadlineMs-nowMs),delayMs=Math.max(remaining,exponentialFloorMs),newCumulative=state.cumulativeHintedWaitMs+delayMs;return{delayMs,probePhase:"done",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}if(state.probePhase==="idle"&&hintMs!==void 0){let delay4=Math.max(Math.ceil(hintMs/2),exponentialFloorMs),deadlineMs=nowMs+hintMs,newCumulative=state.cumulativeHintedWaitMs+delay4;return{delayMs:delay4,probePhase:"half-used",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}return{delayMs:Math.max(hintMs??0,exponentialFloorMs),probePhase:"done",hintDeadlineMs:state.hintDeadlineMs,cumulativeHintedWaitMs:state.cumulativeHintedWaitMs,demoteToProbeBack:!1}}function degradeWithoutFallback(tier,hintMs,attempt2,baseDelayMs,hintedWaitCapMs){return tier==="tier3-fallback-only"?{kind:"fail",hintMs:hintMs??0}:tier==="tier2-fallback-probe-back"?{kind:"in-turn",delayMs:Math.max(Math.min(hintMs??hintedWaitCapMs,hintedWaitCapMs),baseDelayMs*2**(attempt2-1))}:{kind:"in-turn",delayMs:baseDelayMs*2**(attempt2-1)}}import{chmodSync as chmodSync12,closeSync as closeSync6,mkdirSync as mkdirSync25,openSync as openSync6,renameSync as renameSync19,rmSync as rmSync16,statSync as statSync25,writeSync as writeSync4}from"node:fs";import{dirname as dirname48,join as join85}from"node:path";var DEFAULT_MAX_BYTES8=5*1024*1024,MAX_STRING_LENGTH2=200,BLOCKED_KEY2=/^(?:__proto__|constructor|prototype|headers?|env(?:ironment)?|authorization|credential(?:s)?|password|secret|token|api_?key|client_?secret)$/i,ALLOWED_DATA_KEY2=/^(?:selector|candidate|currentSelector|originalSelector|from|to|model|chainKey|reason|skipReason|classification|thinkingLevel|durationMs|retryAfterMs|error|errorMessage|warning|trigger)$/,SENSITIVE_TEXT3=/((?:authorization\s*[:=]\s*(?:bearer|basic)\s+)|(?:bearer\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\s&,"'}\]]+/gi;function createFallbackLogger(agentDir,options={}){let filePath=join85(agentDir,"logs","fallback.log"),maxBytes=validMaxBytes4(options.maxBytes),reportedWriteFailure2=!1;function log(level,event,data){try{let line=formatLine3(level,event,data);writeLine4(filePath,line,maxBytes)}catch(error2){reportedWriteFailure2||(reportedWriteFailure2=!0,console.error("Unable to write retry fallback debug log",error2))}}return{debug:(event,data)=>log("debug",event,data),info:(event,data)=>log("info",event,data),warn:(event,data)=>log("warn",event,data)}}function validMaxBytes4(value2){return typeof value2=="number"&&Number.isFinite(value2)&&value2>0?Math.floor(value2):DEFAULT_MAX_BYTES8}function formatLine3(level,event,data){let entry={ts:new Date().toISOString(),level,event:safeText3(event)};if(data!==void 0){for(let[key,value2]of safeEntries(data))if(ALLOWED_DATA_KEY2.test(key)&&!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(value2,new WeakSet);safeValue!==void 0&&(entry[key]=safeValue)}}return JSON.stringify(entry)}function writeLine4(filePath,line,maxBytes){mkdirSync25(dirname48(filePath),{recursive:!0,mode:448});let text2=`${line}
|
|
2546
2547
|
`;fileExceedsCap3(filePath,Buffer.byteLength(text2),maxBytes)&&(rmSync16(`${filePath}.1`,{force:!0}),renameSync19(filePath,`${filePath}.1`),chmodSync12(`${filePath}.1`,384));let descriptor=openSync6(filePath,"a",384);try{writeSync4(descriptor,text2)}finally{closeSync6(descriptor)}chmodSync12(filePath,384)}function fileExceedsCap3(filePath,incomingBytes,maxBytes){try{return statSync25(filePath).size+incomingBytes>maxBytes}catch(error2){if(isMissingFileError3(error2))return!1;throw error2}}function isMissingFileError3(error2){return typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT"}function serializeValue2(value2,seen){if(typeof value2=="string")return safeText3(value2);if(typeof value2=="bigint")return value2.toString();if(typeof value2=="number"||typeof value2=="boolean"||value2===null)return value2;if(typeof value2>"u")return;if(typeof value2=="function"||typeof value2=="symbol")return String(value2);if(seen.has(value2))return"[Circular]";if(seen.add(value2),Array.isArray(value2))return value2.map(item=>serializeValue2(item,seen)??null);let result3={};for(let[key,item]of safeEntries(value2))if(!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(item,seen);safeValue!==void 0&&(result3[key]=safeValue)}return result3}function safeEntries(value2){try{let entries=[];for(let key of Object.keys(value2))try{let item=Reflect.get(value2,key);entries.push([key,item])}catch{entries.push([key,"[Unreadable]"])}return entries}catch{return[["unserializable","[Unreadable]"]]}}function safeText3(value2){let redacted=value2.replace(SENSITIVE_TEXT3,"$1[redacted]");return redacted.length<=MAX_STRING_LENGTH2?redacted:`${redacted.slice(0,MAX_STRING_LENGTH2-3)}...`}var ProbeBackScheduler=class{constructor(opts){this._armed=!1,this._generation=0,this._secondProbeAnnounced=!1,this._now=opts.now,this._setTimeout=opts.setTimeout??((cb,d)=>setTimeout(cb,d)),this._clearTimeout=opts.clearTimeout??(h=>clearTimeout(h))}get active(){return this._armed}arm(input){let gen=++this._generation;if(this._armed&&(this._clearTimers(),this._abortInFlight("superseded"),this._disarm()),this._armed=!0,this._firstTimer={handle:void 0},this._deadlineTimer={handle:void 0},this._activeProbeIndex=void 0,this._secondProbeAnnounced=!1,gen!==this._generation||(input.emit({type:"retry_probe_scheduled",selector:input.selector,atMs:input.firstAtMs,probeIndex:1}),gen!==this._generation))return;let firstDelay=Math.max(0,input.firstAtMs-this._now());this._firstTimer&&(this._firstTimer.handle=this._setTimeout(()=>{this._runProbe(input,1,gen)},firstDelay));let deadlineDelay=Math.max(0,input.deadlineMs-this._now());gen===this._generation&&this._deadlineTimer&&(this._deadlineTimer.handle=this._setTimeout(()=>{this._runDeadlineProbe(input,gen)},deadlineDelay))}cancel(reason){this._generation++,this._clearTimers(),this._abortInFlight(reason),this._disarm()}_clearTimers(){this._firstTimer?.handle!==void 0&&(this._clearTimeout(this._firstTimer.handle),this._firstTimer.handle=void 0),this._deadlineTimer?.handle!==void 0&&(this._clearTimeout(this._deadlineTimer.handle),this._deadlineTimer.handle=void 0)}_abortInFlight(_reason){this._abortController&&(this._abortController.abort(),this._abortController=void 0),this._activeProbeIndex=void 0}_disarm(){this._armed=!1,this._firstTimer=void 0,this._deadlineTimer=void 0,this._abortController=void 0,this._activeProbeIndex=void 0,this._secondProbeAnnounced=!1}_finish(){this._clearTimers(),this._disarm()}_announceSecondProbe(input,generation2){generation2!==this._generation||this._secondProbeAnnounced||(this._secondProbeAnnounced=!0,input.emit({type:"retry_probe_scheduled",selector:input.selector,atMs:input.deadlineMs,probeIndex:2}))}_runDeadlineProbe(input,generation2){generation2!==this._generation||!this._armed||(this._deadlineTimer&&(this._deadlineTimer.handle=void 0),this._firstTimer?.handle!==void 0&&(this._clearTimeout(this._firstTimer.handle),this._firstTimer.handle=void 0),this._activeProbeIndex===1&&this._abortInFlight("superseded"),this._announceSecondProbe(input,generation2),generation2===this._generation&&this._runProbe(input,2,generation2))}async _runProbe(input,probeIndex,generation2){let gen=generation2;if(gen!==this._generation||!this._armed)return;if(probeIndex===1&&this._firstTimer?this._firstTimer.handle=void 0:this._deadlineTimer&&(this._deadlineTimer.handle=void 0),!input.authAvailable()){if(gen!==this._generation||(input.emit({type:"retry_probe_result",selector:input.selector,ok:!1,errorMessage:"auth-unavailable"}),gen!==this._generation))return;this._finish();return}if(gen!==this._generation||this._activeProbeIndex!==void 0)return;let abortController=new AbortController;this._abortController=abortController,this._activeProbeIndex=probeIndex;let success;try{success=await input.runProbe(abortController.signal)}catch{success=!1}if(!(gen!==this._generation||this._activeProbeIndex!==probeIndex||this._abortController!==abortController)){if(this._abortController=void 0,this._activeProbeIndex=void 0,success){if(gen!==this._generation||(input.onCleared(input.selector),gen!==this._generation)||(input.emit({type:"retry_probe_result",selector:input.selector,ok:!0}),gen!==this._generation))return;this._finish();return}if(probeIndex===1){this._announceSecondProbe(input,gen);return}gen===this._generation&&(input.emit({type:"retry_probe_result",selector:input.selector,ok:!1}),gen===this._generation&&this._finish())}}};function isAssistantEntry(entry){return entry.type==="message"&&entry.message.role==="assistant"}function requestDurationMs(recordedAt,startedAt){let endedAt=Date.parse(recordedAt);return Number.isFinite(endedAt)&&Number.isFinite(startedAt)&&endedAt>startedAt?endedAt-startedAt:0}function computeSessionFailureReport(entries){let requests=0,erroredRequests=0,abortedRequests=0,failedDurationMs=0,postFailureRequests=0,postFailureFullMissRequests=0,postFailureFullMissInputTokens=0,previousFailed=!1;for(let entry of entries){if(entry.type==="message"&&entry.message.role==="user"){previousFailed=!1;continue}if(!isAssistantEntry(entry))continue;let{message}=entry;requests++;let failed=message.stopReason==="error"||message.stopReason==="aborted";if(failed)message.stopReason==="error"?erroredRequests++:abortedRequests++,failedDurationMs+=requestDurationMs(entry.timestamp,message.timestamp);else if(previousFailed){postFailureRequests++;let uncachedTokens=message.usage.input+message.usage.cacheWrite;message.usage.cacheRead===0&&uncachedTokens>=2048&&(postFailureFullMissRequests++,postFailureFullMissInputTokens+=uncachedTokens)}previousFailed=failed}return{requests,erroredRequests,abortedRequests,failureShare:requests>0?(erroredRequests+abortedRequests)/requests:0,failedDurationMs,postFailureRequests,postFailureFullMissRequests,postFailureFullMissInputTokens}}var REASONING_MANDATORY_ERROR=/reasoning is mandatory/i;function initialTitleReasoning(model){if(!model.reasoning)return;let levels=getSupportedThinkingLevels(model);if(!levels.includes("off"))return asReasoningLevel(levels[0])}function mandatoryReasoningRetryLevel(model,sentReasoning,errorMessage8){if(!(sentReasoning!==void 0||errorMessage8===void 0)&&REASONING_MANDATORY_ERROR.test(errorMessage8))return asReasoningLevel(clampThinkingLevel(model,"low"))}function asReasoningLevel(level){return level===void 0||level==="off"?void 0:level}var TITLE_SYSTEM_PROMPT=`Generate a concise title for this coding-agent session.
|
|
2547
2548
|
|
|
2548
2549
|
Rules:
|
|
@@ -2550,7 +2551,7 @@ Rules:
|
|
|
2550
2551
|
- Prefer concrete nouns and verbs from the user's task.
|
|
2551
2552
|
- Do not include quotes, punctuation at the end, markdown, or explanations.
|
|
2552
2553
|
- If the input is only a greeting, acknowledgement, or too vague to title, return <title>none</title>.
|
|
2553
|
-
- 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(resolve45=>{let channel=new MessageChannel;channel.port1.onmessage=()=>{channel.port1.close(),channel.port2.close(),resolve45()},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(resolve45=>{resolveWork=resolve45}),!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,resolve45){let requested=streamedToolCallName(event);return requested===void 0?event:{...event,resolvedToolName:resolve45(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 ModelNotReadyError=class extends Error{constructor(message){super(message),this.name="ModelNotReadyError"}},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._unregisterMemoryReport=()=>{},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._providerRequiredNoticed=!1,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._shownThinkingClampWarningKeys=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._browserEngine=config.browserEngine,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,{context:()=>({sessionId:this.sessionManager.getSessionId(),provider:this.model?.provider,model:this.model?.id})}),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._startupThinkingClamp=getThinkingClampNotice(this.agent.state.thinkingSelection,this.agent.state.model),this._startupThinkingClamp&&this._shownThinkingClampWarningKeys.add(this._thinkingClampWarningKey(this._startupThinkingClamp)),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}this._unregisterMemoryReport=registerMemoryReportSession(this,{sessionId:()=>this.sessionId,sessionFile:()=>this.sessionManager.getSessionFile(),residentStore:()=>this.sessionManager.getResidentStore().size(),reporters:()=>this._extensionRunner.getMemoryReporters()})}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,convertToLlm(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,convertToLlm(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=convertToLlm(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??randomUUID13(),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,provider:message.provider,model:message.model})}}_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(resolve45=>{this._resolveIdleWait=resolve45})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve45=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve45()}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(resolve45=>{this._retryResolve=resolve45}),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._unregisterMemoryReport(),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 startupThinkingClamp(){return this._startupThinkingClamp}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()))}setBrowserEngine(engine){this._browserEngine=engine}get browserEngine(){return this._browserEngine}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-${randomUUID13()}`,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(`
|
|
2554
|
+
- 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(resolve45=>{let channel=new MessageChannel;channel.port1.onmessage=()=>{channel.port1.close(),channel.port2.close(),resolve45()},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(resolve45=>{resolveWork=resolve45}),!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,resolve45){let requested=streamedToolCallName(event);return requested===void 0?event:{...event,resolvedToolName:resolve45(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 ModelNotReadyError=class extends Error{constructor(message){super(message),this.name="ModelNotReadyError"}},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`The retried request never started streaming${retryTimeoutMs===void 0?"":` after ${Math.round(retryTimeoutMs/1e3)}s`}.`+(streamStartTimeoutMs===void 0?" (Its stream-start guard is off; to bound or extend this wait, set retry.provider.streamStartTimeoutMs, 0 disables.)":` (Stream-start guard: ${Math.round(streamStartTimeoutMs/1e3)}s; to allow longer, 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._unregisterMemoryReport=()=>{},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._sessionStartDispatching=!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._providerRequiredNoticed=!1,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._shownThinkingClampWarningKeys=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._browserEngine=config.browserEngine,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,{context:()=>({sessionId:this.sessionManager.getSessionId(),provider:this.model?.provider,model:this.model?.id})}),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._startupThinkingClamp=getThinkingClampNotice(this.agent.state.thinkingSelection,this.agent.state.model),this._startupThinkingClamp&&this._shownThinkingClampWarningKeys.add(this._thinkingClampWarningKey(this._startupThinkingClamp)),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}this._unregisterMemoryReport=registerMemoryReportSession(this,{sessionId:()=>this.sessionId,sessionFile:()=>this.sessionManager.getSessionFile(),residentStore:()=>this.sessionManager.getResidentStore().size(),reporters:()=>this._extensionRunner.getMemoryReporters()})}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,convertToLlm(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,convertToLlm(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=convertToLlm(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??randomUUID13(),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,provider:message.provider,model:message.model})}}_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(resolve45=>{this._resolveIdleWait=resolve45})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve45=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve45()}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(resolve45=>{this._retryResolve=resolve45}),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._unregisterMemoryReport(),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 startupThinkingClamp(){return this._startupThinkingClamp}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()))}setBrowserEngine(engine){this._browserEngine=engine}get browserEngine(){return this._browserEngine}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-${randomUUID13()}`,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(`
|
|
2554
2555
|
|
|
2555
2556
|
`):void 0};let basePrompt=loaderSystemPrompt??buildDynamicSystemPrompt(this._baseSystemPromptOptions),prompt=loaderAppendSystemPrompt.length>0?`${basePrompt}
|
|
2556
2557
|
|
|
@@ -2561,7 +2562,7 @@ ${loaderAppendSystemPrompt.join(`
|
|
|
2561
2562
|
${sentences.join(`
|
|
2562
2563
|
|
|
2563
2564
|
`)}`: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}this._flushPendingBashMessages(),await this._assertModelReadyForTurn(),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=readFileSync46(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._assertModelReadyForTurn(),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(resolve45=>{resolveBindingPromptReadiness=resolve45});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(`
|
|
2564
|
-
`),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,incoming=selection,requestedLevel=incoming?.requested!==void 0&&incoming.level===level?incoming.requested:level,effectiveSelection=clampThinkingSelection(selection,requestedLevel,effectiveLevel,this.model),selectionChanged=previousSelection?.level!==effectiveSelection?.level||previousSelection?.source!==effectiveSelection?.source||previousSelection?.legacyVariantId!==effectiveSelection?.legacyVariantId||previousSelection?.requested!==effectiveSelection?.requested,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(),this._emitThinkingClampWarningIfNeeded()}}_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}))}_emitThinkingClampWarningIfNeeded(){let notice2=getThinkingClampNotice(this.thinkingSelection,this.model);if(!notice2)return;let key=this._thinkingClampWarningKey(notice2);this._shownThinkingClampWarningKeys.has(key)||(this._shownThinkingClampWarningKeys.add(key),this._emit({type:"thinking_level_clamped",...notice2}))}_thinkingClampWarningKey(notice2){return`${notice2.provider}/${notice2.modelId}:${notice2.requestedLevel}`}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"})}requestedLevel??=model.defaultThinkingLevel;let fromGlobalDefault=!1;if(requestedLevel===void 0){let configuredDefault=this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"},fromGlobalDefault=!0)}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels2(model));return{level,selection:clampThinkingSelection(selection,fromGlobalDefault?level:requestedLevel,level,model)}}_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=randomUUID13(),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=randomUUID13(),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:randomUUID13();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=randomUUID13();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),aborted||this._resumeQueuedMessagesAfterCompaction()}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??randomUUID13(),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)&¤tMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState.status!=="running"||lifecycleState.operationId!==operationId||lifecycleState.startedRevision+compactionOwnedDiagnosticMessages.size!==this._messageRevision||!onlyPendingPersistenceAppends)return await this._rejectCompaction(request2,requestId,operationId,"stale-revision",!1);if(await this._wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model))return await this._rejectCompaction(request2,requestId,operationId,"would-overflow",!1);let latestConfigurationEffort=this.sessionManager.getBranch().findLast(entry=>entry.type==="configuration_update")?.reasoning.effort,compactionEntryId=this.sessionManager.appendCompaction(compactionResult.summary,compactionResult.firstKeptEntryId,compactionResult.tokensBefore,compactionResult.details,fromExtension,compactionResult.usage),savedEntry=this.sessionManager.getEntry(compactionEntryId);if(savedEntry?.type!=="compaction")throw new Error("Compaction entry was not saved");let modelAfterCompaction=this.model;latestConfigurationEffort!==void 0&&modelAfterCompaction!==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-${randomUUID13()}`,parentId:currentLeaf.id,timestamp:new Date().toISOString(),summary:compactionResult.summary,firstKeptEntryId:compactionResult.firstKeptEntryId,tokensBefore:compactionResult.tokensBefore,details:compactionResult.details,fromHook:fromExtension},simulatedMessages=buildSessionContext([...pathEntries,simulatedCompactionEntry],simulatedCompactionEntry.id).messages;(model.provider==="cursor"||model.provider==="cursor-cli-oauth")&&(simulatedMessages=admitCursorHistory({messages:simulatedMessages,budgetBytes:cursorAdmissionBudgetBytes(model.contextWindow)}).messages??simulatedMessages);let contextTokens=estimateMessagesTokens2(simulatedMessages),settings=this._getCompactionSettings(),reserveTokens=settings.reserveScalingEnabled===!1?settings.reserveTokens:resolveReserveTokens(model.contextWindow,settings.reserveTokens);return contextTokens>model.contextWindow-reserveTokens}_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 _assertModelReadyForTurn(){if(!this.model)throw new ModelNotReadyError(formatNoModelSelectedMessage());if(this._modelRuntime.hasConfiguredAuth(this.model.provider)||await this._modelRuntime.checkAuth(this.model.provider)!==void 0){this._providerRequiredNoticed=!1;return}throw this._modelRuntime.isUsingOAuth(this.model.provider)?new ModelNotReadyError(`Authentication failed for "${this.model.provider}". Credentials may have expired or network is unavailable. Run '/login ${this.model.provider}' to re-authenticate.`):new ModelNotReadyError(formatNoApiKeyFoundMessage(this.model.provider))}_noticeProviderRequired(notice2){this._providerRequiredNoticed||(this._providerRequiredNoticed=!0,this._emit({type:"provider_required",notice:notice2}))}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||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||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=randomUUID13();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=randomUUID13();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(resolve45=>{settle=resolve45}),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=>{if(err2 instanceof ModelNotReadyError){this._noticeProviderRequired(err2.message);return}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=>{if(err2 instanceof ModelNotReadyError){this._noticeProviderRequired(err2.message);return}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(),getBrowserEngine:()=>this._browserEngine,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=randomUUID13();(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(path15){return path15.startsWith("<builtin:")||path15.startsWith(BUILTIN_PATH_PREFIX)||/[\\/]senpi-codemode[\\/]/u.test(path15)}_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(resolve45=>{this._retryResolve=resolve45}));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}
|
|
2565
|
+
`),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,incoming=selection,requestedLevel=incoming?.requested!==void 0&&incoming.level===level?incoming.requested:level,effectiveSelection=clampThinkingSelection(selection,requestedLevel,effectiveLevel,this.model),selectionChanged=previousSelection?.level!==effectiveSelection?.level||previousSelection?.source!==effectiveSelection?.source||previousSelection?.legacyVariantId!==effectiveSelection?.legacyVariantId||previousSelection?.requested!==effectiveSelection?.requested,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(),this._emitThinkingClampWarningIfNeeded()}}_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}))}_emitThinkingClampWarningIfNeeded(){let notice2=getThinkingClampNotice(this.thinkingSelection,this.model);if(!notice2)return;let key=this._thinkingClampWarningKey(notice2);this._shownThinkingClampWarningKeys.has(key)||(this._shownThinkingClampWarningKeys.add(key),this._emit({type:"thinking_level_clamped",...notice2}))}_thinkingClampWarningKey(notice2){return`${notice2.provider}/${notice2.modelId}:${notice2.requestedLevel}`}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"})}requestedLevel??=model.defaultThinkingLevel;let fromGlobalDefault=!1;if(requestedLevel===void 0){let configuredDefault=this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"},fromGlobalDefault=!0)}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels2(model));return{level,selection:clampThinkingSelection(selection,fromGlobalDefault?level:requestedLevel,level,model)}}_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=randomUUID13(),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=randomUUID13(),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:randomUUID13();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=randomUUID13();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),aborted||this._resumeQueuedMessagesAfterCompaction()}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??randomUUID13(),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)&¤tMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState.status!=="running"||lifecycleState.operationId!==operationId||lifecycleState.startedRevision+compactionOwnedDiagnosticMessages.size!==this._messageRevision||!onlyPendingPersistenceAppends)return await this._rejectCompaction(request2,requestId,operationId,"stale-revision",!1);if(await this._wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model))return await this._rejectCompaction(request2,requestId,operationId,"would-overflow",!1);let latestConfigurationEffort=this.sessionManager.getBranch().findLast(entry=>entry.type==="configuration_update")?.reasoning.effort,compactionEntryId=this.sessionManager.appendCompaction(compactionResult.summary,compactionResult.firstKeptEntryId,compactionResult.tokensBefore,compactionResult.details,fromExtension,compactionResult.usage),savedEntry=this.sessionManager.getEntry(compactionEntryId);if(savedEntry?.type!=="compaction")throw new Error("Compaction entry was not saved");let modelAfterCompaction=this.model;latestConfigurationEffort!==void 0&&modelAfterCompaction!==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-${randomUUID13()}`,parentId:currentLeaf.id,timestamp:new Date().toISOString(),summary:compactionResult.summary,firstKeptEntryId:compactionResult.firstKeptEntryId,tokensBefore:compactionResult.tokensBefore,details:compactionResult.details,fromHook:fromExtension},simulatedMessages=buildSessionContext([...pathEntries,simulatedCompactionEntry],simulatedCompactionEntry.id).messages;(model.provider==="cursor"||model.provider==="cursor-cli-oauth")&&(simulatedMessages=admitCursorHistory({messages:simulatedMessages,budgetBytes:cursorAdmissionBudgetBytes(model.contextWindow)}).messages??simulatedMessages);let contextTokens=estimateMessagesTokens2(simulatedMessages),settings=this._getCompactionSettings(),reserveTokens=settings.reserveScalingEnabled===!1?settings.reserveTokens:resolveReserveTokens(model.contextWindow,settings.reserveTokens);return contextTokens>model.contextWindow-reserveTokens}_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 _assertModelReadyForTurn(){if(!this.model)throw new ModelNotReadyError(formatNoModelSelectedMessage());if(this._modelRuntime.hasConfiguredAuth(this.model.provider)||await this._modelRuntime.checkAuth(this.model.provider)!==void 0){this._providerRequiredNoticed=!1;return}throw this._modelRuntime.isUsingOAuth(this.model.provider)?new ModelNotReadyError(`Authentication failed for "${this.model.provider}". Credentials may have expired or network is unavailable. Run '/login ${this.model.provider}' to re-authenticate.`):new ModelNotReadyError(formatNoApiKeyFoundMessage(this.model.provider))}_noticeProviderRequired(notice2){this._providerRequiredNoticed||(this._providerRequiredNoticed=!0,this._emit({type:"provider_required",notice:notice2}))}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||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||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=randomUUID13();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,onStreamStarted:listener=>{let unsubscribe=this.agent.subscribe(event=>{event.type!=="message_start"||event.message.role!=="assistant"||(unsubscribe(),listener())});return unsubscribe}}),"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=randomUUID13();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(resolve45=>{settle=resolve45}),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=>{if(err2 instanceof ModelNotReadyError){this._noticeProviderRequired(err2.message);return}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=>{if(err2 instanceof ModelNotReadyError){this._noticeProviderRequired(err2.message);return}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(),getBrowserEngine:()=>this._browserEngine,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=randomUUID13();(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(path15){return path15.startsWith("<builtin:")||path15.startsWith(BUILTIN_PATH_PREFIX)||/[\\/]senpi-codemode[\\/]/u.test(path15)}_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();this._sessionStartDispatching=!0;try{await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")}finally{this._sessionStartDispatching=!1,settleSessionStart()}}return time("lifecycle","reload"),{cancelled:!1}}async checkReloadVeto(){return checkSessionReloadVeto(this._extensionRunner,()=>this._promptStartPending,()=>this._sessionStartDispatching)}_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(resolve45=>{this._retryResolve=resolve45}));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}
|
|
2565
2566
|
${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(path15){await rm10(path15,{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 continueFromLeaf(){if(this.isStreaming)throw new ContinueFromLeafError("streaming");if(this.agent.state.messages.length===0)throw new ContinueFromLeafError("nothing_to_continue");if(this.agent.state.messages[this.agent.state.messages.length-1]?.role!=="assistant")throw new ContinueFromLeafError("leaf_not_assistant");let turnClaim=new DeferredTurnClaim,admission=trackTurnAdmission({disposition:turnClaim.disposition,subscribe:listener=>this.subscribe(event=>{event.type==="agent_start"&&listener({type:"agent_start"})})}),run2=this.sendCustomMessage({customType:CONTINUE_FROM_LEAF_CUSTOM_TYPE,content:CONTINUE_FROM_LEAF_DIRECTIVE,display:!1},{triggerTurn:!0},turnClaim);try{await Promise.race([admission.promise,run2])}finally{admission.dispose()}run2.catch(()=>{})}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=dirname49(filePath);existsSync47(dir)||mkdirSync26(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 writeFileSync24(filePath,`${lines.join(`
|
|
2566
2567
|
`)}
|
|
2567
2568
|
`),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,totals2={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&&(totals2.missedTokens+=miss.missedTokens,totals2.missedCost+=miss.missedCost,totals2.missCount+=1,misses.set(entry.message,miss)),prev=asPreviousRequest(entry.message,prev?.reportedCache??!1)??prev}}return{prev,totals:totals2,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(`
|
|
@@ -2590,7 +2591,7 @@ ${codeSpan(styledWarning)}
|
|
|
2590
2591
|
`)}function getScopeAutocompleteTag(scope){switch(scope){case"user":return"u";case"project":return"p";case"temporary":return"t";case"system":return"s";default:return assertNever5(scope)}}function getDisplaySourceInfo(sourceInfo){let source2=sourceInfo?.source??"local",scope=sourceInfo?.scope??"project";return scope==="system"?{label:"system",color:"muted"}:source2==="local"?scope==="user"?{label:"user",color:"muted"}:scope==="project"?{label:"project",color:"muted"}:{label:"path",scopeLabel:"temp",color:"muted"}:source2==="cli"?{label:"path",scopeLabel:scope==="temporary"?"temp":void 0,color:"muted"}:{label:source2,scopeLabel:scope==="user"?"user":scope==="project"?"project":"temp",color:"accent"}}function assertNever5(value2){throw new Error(`Unexpected resource scope: ${String(value2)}`)}var LOGIN_CANCELLED_NOTICE="Login cancelled";function isLoginCancellation(error2){return error2==null||typeof error2=="object"&&error2.name==="AbortError"?!0:errorMessage7(error2)===LOGIN_CANCELLED_NOTICE}function describeLoginFailure(error2,providerName,method){if(isLoginCancellation(error2))return{level:"status",message:LOGIN_CANCELLED_NOTICE};let message=errorMessage7(error2);return error2 instanceof CredentialSynchronizationError?{level:"error",message:`${method==="oauth"?`Logged in to ${providerName}`:`Saved API key for ${providerName}`}, but local model state could not be synchronized: ${message}`}:{level:"error",message:`${method==="oauth"?`Failed to login to ${providerName}`:`Failed to save API key for ${providerName}`}: ${message}`}}function errorMessage7(error2){return error2 instanceof Error?error2.message:String(error2)}var envelope=external_exports.object({type:external_exports.literal("error").optional(),error:external_exports.object({type:external_exports.string(),message:external_exports.string()})}),networkFailure=/network error|service unavailable|connection (?:error|lost|reset)|fetch failed|ECONNRESET|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|socket hang up|overloaded/i,otherFailure=/auth|api.?key|permission|quota|credit|billing|rate.?limit|too many requests|429/i;function isNetworkProviderError(raw,envelopeOnly=!1){if(!raw||otherFailure.test(raw))return!1;if(!envelopeOnly)return networkFailure.test(raw);try{let parsed=envelope.safeParse(JSON.parse(raw));return parsed.success&&networkFailure.test(parsed.data.error.message)}catch(error2){if(error2 instanceof SyntaxError)return!1;throw error2}}function isRetryableProviderError(raw){return raw?isNetworkProviderError(raw)?!0:isRetryableErrorMessage(raw):!1}function isNetworkProviderMessage(message){return(message.stopReason==="error"||message.stopReason==="aborted")&&isNetworkProviderError(message.errorMessage)}var ProviderFailureNotice=class{constructor(){this.details=new Set,this.expanded=!1,this.summary="The model provider may be having trouble."}add(raw){this.details.add(raw)}setExpanded(expanded){this.expanded=expanded}setSummary(summary){this.summary=summary}render(width){let lines=[];if(this.summary&&lines.push(...new Text(theme.fg("warning",`${this.summary} (${keyText("app.tools.expand")} for details)`),1,0).render(width)),this.expanded)for(let raw of this.details)lines.push(...new Text(theme.fg("dim",sanitizeTuiErrorMessage(raw)),1,0).render(width));return lines}invalidate(){}},ProviderErrorPresentation=class{constructor(chat){this.pending=!1,this.retryAwaitingFinish=!1,this.chat=chat}record(raw,expanded=!1){this.pending=!0,this.retryAwaitingFinish=!0,this.notice||(this.notice=new ProviderFailureNotice,this.notice.setExpanded(expanded),this.chat.addChild(this.notice)),this.notice.add(raw)}retrying(raw,expanded){this.record(raw,expanded),this.notice?.setSummary(void 0)}clear(){this.pending=!1,this.retryAwaitingFinish=!1,this.notice?.setSummary(void 0)}clearTransient(){this.pending=!1,this.notice?.setSummary(void 0)}get hasActiveRetry(){return this.pending}get awaitingRetryFinish(){return this.retryAwaitingFinish}finish(raw,attempts){if(raw&&this.record(raw),!this.pending)return;this.pending=!1,this.retryAwaitingFinish=!1;let count=attempts===void 0?"":` after ${attempts} retries`;this.notice?.setSummary(`The model provider could not complete the request${count}. Try again or choose another model with /model.`)}newTurn(){this.finish(),this.notice=void 0}};function replayAssistantTools(message,host){let firstToolIndex=message.content.findIndex(block=>block.type==="toolCall");if(host.addMessage(firstToolIndex<0?message:{...message,content:message.content.slice(0,firstToolIndex+1)}),firstToolIndex<0)return;let index=firstToolIndex;for(;index<message.content.length;){let content=message.content[index];if(content.type!=="toolCall"){let start=index;for(;index<message.content.length&&message.content[index].type!=="toolCall";)index++;host.addMessage({...message,content:message.content.slice(start,index)});continue}index++;let component=host.createTool(content.name,content.id,content.arguments);if(component.setExpanded(host.expanded),host.addChild(component),message.stopReason==="aborted"||message.stopReason==="error"){let errorMessage8=message.stopReason==="aborted"?abortedMessageForRendering(message,0,void 0).errorMessage||"Provider request failed":message.errorMessage||"Error";component.updateResult({content:[{type:"text",text:errorMessage8}],isError:!0})}else host.pending.set(content.id,component)}}function sharedSessionDir(source2){return source2.usesDefaultSessionDir()?{}:{sessionDir:source2.getSessionDir()}}function currentScopeSessions(source2,onProgress,signal){let cwd=source2.getCwd();return withMovedSessions(SessionManager.list(cwd,source2.getSessionDir(),onProgress,signal),cwd,sharedSessionDir(source2))}async function allScopeSessions(source2,onProgress,signal){let sessions2=source2.usesDefaultSessionDir()?await SessionManager.listAll(onProgress,signal):await SessionManager.listAll(source2.getSessionDir(),onProgress,signal);return markMovedSessions(sessions2,source2.getCwd())}async function chooseResumePath(sessionPath,source2,ui){let cwd=source2.getCwd();try{return(await resolveResumeTarget({sessionPath,cwd,...sharedSessionDir(source2),confirm:sessionCwd=>ui.confirm(REBIND_PROMPT,`Session found in different project: ${sessionCwd}
|
|
2591
2592
|
This directory is the same git repository: ${cwd}
|
|
2592
2593
|
Choose No to open it where it is.`)})).path}catch(error2){if(!(error2 instanceof Error))throw error2;ui.showError(`Could not move session: ${error2.message}`);return}}var RISKY_MAIN_MODEL_WARNING="Not a recommended model. It can perform dangerous actions such as harming your computer and has not been tested. Please use a different model.",RISKY_MODEL_FAMILIES=["minimax","qwen"];function isRiskyMainModel(model){let searchableLabel=`${model.provider}/${model.id} ${model.name}`.toLowerCase();return RISKY_MODEL_FAMILIES.some(family=>searchableLabel.includes(family))}import{existsSync as existsSync49,mkdirSync as mkdirSync28,readFileSync as readFileSync51,realpathSync as realpathSync10,writeFileSync as writeFileSync25}from"node:fs";import{join as join87}from"node:path";var SKIP_RUNTIME_NOTICE_ENV_SUFFIX="SKIP_RUNTIME_NOTICE";function runtimePinEnvName(env){return env.OMO_NATIVE==="1"?"OMO_RUNTIME":RUNTIME_ENV_VAR}function runtimeNoticeSkipReason(gate){if(gate.versions.bun!==void 0)return"bun-runtime";if(gate.env[runtimePinEnvName(gate.env)]==="node")return"node-pinned";if(gate.hasInheritedInspectorOption)return"inspector";if(gate.skipRequested)return"skip-requested";if(gate.shownVersion===gate.engineVersion)return"already-shown"}function reinstallTarget(brand,packageName){if(brand===void 0)return{packageName,installSpec:packageName,ignoreScripts:!0};let update=brand.update;if(update===void 0)return;let installSpec=update.distTag==="latest"?update.packageName:`${update.packageName}@${update.distTag}`;return{packageName:update.packageName,installSpec,ignoreScripts:!1}}function uninstallCommand(method,packageName){switch(method){case"npm":return`npm uninstall -g ${packageName}`;case"pnpm":return`pnpm remove -g ${packageName}`;case"yarn":return`yarn global remove ${packageName}`;case"bun":case"bun-binary":case"unknown":return}}function bunReinstallCommand(method,target){let install=`bun add -g ${target.ignoreScripts?"--ignore-scripts ":""}${target.installSpec}`,uninstall=uninstallCommand(method,target.packageName);return uninstall===void 0?install:`${uninstall} && ${install}`}function installBunCommand(platform5){return platform5==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash"}function bunStep(input){switch(input.bun.kind){case"missing":return{text:`Install Bun: ${installBunCommand(input.platform)}`,tone:"accent"};case"outdated":return{text:`Upgrade Bun (found ${input.bun.version??"an unreadable version"}, needs ${MIN_BUN_VERSION}+): bun upgrade`,tone:"accent"};case"ready":return}}function reinstallStep(input,afterBunStep){let lead=afterBunStep?"Then reinstall":"Reinstall";return input.installMethod==="bun"||input.target===void 0?{text:`${afterBunStep?"Then restart":"Restart"} ${input.appCommand}.`,tone:"accent"}:{text:`${lead} with Bun: ${bunReinstallCommand(input.installMethod,input.target)}`,tone:"accent"}}function buildRuntimeNotice(input){let first=bunStep(input),extra=[...first===void 0?[]:[first],reinstallStep(input,first!==void 0),{text:`To stay on Node.js and hide this notice, set ${input.pinEnvName}=node.`}];return{title:"Running on Node.js",tone:"warning",why:`${input.appName} is running on Node.js ${input.nodeVersion}. It starts faster and every feature works on Bun ${MIN_BUN_VERSION}+.`,extra}}var RUNTIME_NOTICE_STATE_FILE="runtime-notice.json";function readShownVersion(agentDir){let parsed;try{parsed=JSON.parse(readFileSync51(join87(agentDir,RUNTIME_NOTICE_STATE_FILE),"utf8"))}catch{return}if(!(typeof parsed!="object"||parsed===null||!("shownVersion"in parsed)))return typeof parsed.shownVersion=="string"?parsed.shownVersion:void 0}function recordShownVersion(agentDir,version){try{mkdirSync28(agentDir,{recursive:!0}),writeFileSync25(join87(agentDir,RUNTIME_NOTICE_STATE_FILE),`${JSON.stringify({shownVersion:version})}
|
|
2593
|
-
`)}catch{}}function detectBunAvailability(options){let bunPath=findBunBinary(options);if(bunPath===void 0)return{kind:"missing"};let version=options.bunVersion(bunPath);return version!==void 0&&bunVersionSatisfies(version)?{kind:"ready",version}:{kind:"outdated",version}}function skipRequested(){let value2=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value2!==void 0&&value2!==""&&value2!=="0"}function maybeShowRuntimeNotice(show){let agentDir=getAgentDir();runtimeNoticeSkipReason({versions:process.versions,env:process.env,hasInheritedInspectorOption:hasInheritedInspectorOption(),skipRequested:skipRequested(),engineVersion:VERSION,shownVersion:readShownVersion(agentDir)})===void 0&&(show(buildRuntimeNotice({appName:APP_NAME,appCommand:APP_COMMAND,nodeVersion:process.version,platform:process.platform,installMethod:detectInstallMethod(),target:reinstallTarget(BRAND,PACKAGE_NAME),bun:detectBunAvailability(processBunRuntimeOptions(existsSync49,realpathSync10)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}var TuiSessionControlHost=class{constructor(context){this.editorRevision=0,this.hadDraft=!1,this.submitting=!1,this.openTickets=0,this.bufferedElsewhere=!1,this.context=context}async register(options){await this.disposeActive();let{registerSessionControlEndpoint}=await import("./session-control-endpoint-
|
|
2594
|
+
`)}catch{}}function detectBunAvailability(options){let bunPath=findBunBinary(options);if(bunPath===void 0)return{kind:"missing"};let version=options.bunVersion(bunPath);return version!==void 0&&bunVersionSatisfies(version)?{kind:"ready",version}:{kind:"outdated",version}}function skipRequested(){let value2=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value2!==void 0&&value2!==""&&value2!=="0"}function maybeShowRuntimeNotice(show){let agentDir=getAgentDir();runtimeNoticeSkipReason({versions:process.versions,env:process.env,hasInheritedInspectorOption:hasInheritedInspectorOption(),skipRequested:skipRequested(),engineVersion:VERSION,shownVersion:readShownVersion(agentDir)})===void 0&&(show(buildRuntimeNotice({appName:APP_NAME,appCommand:APP_COMMAND,nodeVersion:process.version,platform:process.platform,installMethod:detectInstallMethod(),target:reinstallTarget(BRAND,PACKAGE_NAME),bun:detectBunAvailability(processBunRuntimeOptions(existsSync49,realpathSync10)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}var TuiSessionControlHost=class{constructor(context){this.editorRevision=0,this.hadDraft=!1,this.submitting=!1,this.openTickets=0,this.bufferedElsewhere=!1,this.context=context}async register(options){await this.disposeActive();let{registerSessionControlEndpoint}=await import("./session-control-endpoint-NABTZHCZ.js"),outcome=await registerSessionControlEndpoint({...this.context(),editorRevision:()=>this.editorRevision},options);return"endpoint"in outcome&&(this.active=outcome.endpoint),outcome.registration}attachEditor(editor,hasDraft){let change=editor.onChange;editor.onChange=text2=>{change?.(text2),this.editorChanged(hasDraft())};let submit=editor.onSubmit;editor.onSubmit=(text2,...details)=>{this.submitting=!0,queueMicrotask(()=>{this.submitting=!1});let ticket=this.openTicket();this.handoff=ticket;try{submit?.(text2,...details)}finally{let claimed=this.handoff!==ticket;this.handoff=void 0,claimed||ticket.release()}}}claimHandoff(){let ticket=this.handoff;return this.handoff=void 0,ticket}submissionInFlight(){return this.openTickets>0||this.bufferedElsewhere}noteBufferedElsewhere(held){let released=this.bufferedElsewhere&&!held;this.bufferedElsewhere=held,released&&this.wakeIfUnheld()}questionsChanged(){this.active?.noteQuestions()}async disposeActive(){let active=this.active;this.active=void 0,await active?.dispose()}openTicket(){this.openTickets+=1;let released=!1;return{release:()=>{released||(released=!0,this.openTickets-=1,this.wakeIfUnheld())}}}wakeIfUnheld(){queueMicrotask(()=>{this.submissionInFlight()||this.active?.wake("submission")})}editorChanged(hasDraft){this.editorRevision+=1;let cleared=this.hadDraft&&!hasDraft;this.hadDraft=hasDraft,this.active?.noteState(),cleared&&queueMicrotask(()=>{this.submitting||this.active?.wake("draft_cleared")})}};function formatSessionFailureInfo(report){if(!report||report.erroredRequests+report.abortedRequests===0)return"";let label3=text2=>theme.fg("dim",text2),share=`${(report.failureShare*100).toFixed(1)}% failed`,info=`
|
|
2594
2595
|
${theme.bold("Failures")}
|
|
2595
2596
|
`;if(info+=`${label3("Requests:")} ${report.requests} ${label3(`(${report.erroredRequests} errored, ${report.abortedRequests} aborted, ${share})`)}
|
|
2596
2597
|
`,info+=`${label3("Time in failed requests:")} ${formatDuration3(report.failedDurationMs)}
|